From 80bbf9f391479bb045cab5348f06e1b9f0ef9d6e Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Mon, 11 May 2026 10:46:52 +0900 Subject: [PATCH 01/36] link widget to widget3 --- lua/wikis/commons/Widget/Basic/Link.lua | 56 +++++++++++-------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/lua/wikis/commons/Widget/Basic/Link.lua b/lua/wikis/commons/Widget/Basic/Link.lua index a65ab99e377..d9c0c778440 100644 --- a/lua/wikis/commons/Widget/Basic/Link.lua +++ b/lua/wikis/commons/Widget/Basic/Link.lua @@ -7,51 +7,43 @@ local Lua = require('Module:Lua') -local Class = Lua.import('Module:Class') - -local HtmlWidgets = Lua.import('Module:Widget/Html/All') -local Fragment = HtmlWidgets.Fragment -local Widget = Lua.import('Module:Widget') +local Component = Lua.import('Module:Widget/Component') local WidgetUtil = Lua.import('Module:Widget/Util') ---@class LinkWidgetParameters ---@field children Renderable|Renderable[] ---@field link string ----@field linktype 'internal'|'external'|nil +---@field linktype? 'internal'|'external' ----@class LinkWidget: Widget ----@operator call(LinkWidgetParameters): LinkWidget -local Link = Class.new(Widget) +---@class LinkWidget +local Link = {} Link.defaultProps = { linktype = 'internal', } ----@return Widget? -function Link:render() - if not self.props.link then +---@param props LinkWidgetParameters +---@return Renderable[]? +function Link.render(props) + if not props.link then return end - if self.props.linktype == 'external' then - return Fragment{ - children = WidgetUtil.collect( - '[', - (self.props.link:gsub(' ', '%%20')), - ' ', - unpack(self.props.children), - ']' - ) - } + if props.linktype == 'external' then + return WidgetUtil.collect( + '[', + (props.link:gsub(' ', '%%20')), + ' ', + props.children, + ']' + ) end - return Fragment{ - children = WidgetUtil.collect( - '[[', - self.props.link, - '|', - unpack(self.props.children) or self.props.link, - ']]' - ) - } + return WidgetUtil.collect( + '[[', + props.link, + '|', + props.children or props.link, + ']]' + ) end -return Link +return Component.component(Link.render, Link.defaultProps) From d287fe09f597b1457b555ba56f3e1b31fdb3e198 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Mon, 11 May 2026 10:50:26 +0900 Subject: [PATCH 02/36] extract HtmlProps type --- lua/wikis/commons/Widget/Component.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lua/wikis/commons/Widget/Component.lua b/lua/wikis/commons/Widget/Component.lua index eb2a702a01e..7c6bfa10e04 100644 --- a/lua/wikis/commons/Widget/Component.lua +++ b/lua/wikis/commons/Widget/Component.lua @@ -9,22 +9,27 @@ ---@alias ContextDef {defaultValue: T} ---@alias ContextParam {def: ContextDef, value: T, children?: Renderable|Renderable[]} ----@alias HtmlParam {classes?: string[], css?: table, attributes?: table, children?: Renderable|Renderable[]} ---@alias ErrorParam {children?: Renderable|Renderable[], fallback?: fun(error: Error, context: Context?): Renderable} ---@class VNode

---@field renderFn string|fun(props: P, context?: Context?): Renderable ---@field props P +---@class HtmlProps +---@field classes? string[] +---@field css? table +---@field attributes? table +---@field children? Renderable|Renderable[] + ---@alias Context {props:{parent: Context?, def: ContextDef, value: T}} ---@alias ContextNode VNode> ----@alias HtmlNode VNode +---@alias HtmlNode VNode ---@alias ErrorBoundaryNode VNode ---@alias Component

fun(props?: P, context: Context?): VNode

---@alias ContextComponent Component> ----@alias HtmlComponent Component +---@alias HtmlComponent Component ---@alias ErrorBoundaryComponent Component local Lua = require('Module:Lua') From 75364b5a0730502d6af3588497f318aeb0363446 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Mon, 11 May 2026 10:52:52 +0900 Subject: [PATCH 03/36] copytoclipboard widget to widget3 --- .../commons/Widget/Basic/CopyToClipboard.lua | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/lua/wikis/commons/Widget/Basic/CopyToClipboard.lua b/lua/wikis/commons/Widget/Basic/CopyToClipboard.lua index e07d8c16e84..78196823694 100644 --- a/lua/wikis/commons/Widget/Basic/CopyToClipboard.lua +++ b/lua/wikis/commons/Widget/Basic/CopyToClipboard.lua @@ -7,39 +7,32 @@ local Lua = require('Module:Lua') -local Class = Lua.import('Module:Class') - -local Widget = Lua.import('Module:Widget') -local HtmlWidgets = Lua.import('Module:Widget/Html/All') -local Span = HtmlWidgets.Span +local Component = Lua.import('Module:Widget/Component') +local Html = Lua.import('Module:Widget/Html') +local Span = Html.Span ---@class CopyToClipboardProps ---@field children Renderable|Renderable[]? ---@field textToCopy string? text to be copied to clipboard ---@field successText string? ----@class CopyToClipboardWidget: Widget ----@operator call(CopyToClipboardProps): CopyToClipboardWidget ----@field props CopyToClipboardProps -local CopyToClipboard = Class.new(Widget) - ----@return Widget -function CopyToClipboard:render() - local props = self.props +---@param props CopyToClipboardProps +---@return HtmlNode +local function CopyToClipboard(props) return Span{ classes = {'copy-to-clipboard'}, attributes = {['data-copied-text'] = props.successText}, children = { Span{ classes = {'copy-this'}, - children = self.props.textToCopy, + children = props.textToCopy, }, Span{ classes = {'see-this'}, - children = self.props.children, + children = props.children, } } } end -return CopyToClipboard +return Component.component(CopyToClipboard) From 34a560db90b85cdaaa4b4e4d8dee396741ba7f04 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Mon, 11 May 2026 10:56:29 +0900 Subject: [PATCH 04/36] button to widget3 --- lua/wikis/commons/Widget/Basic/Button.lua | 63 +++++++++++------------ 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/lua/wikis/commons/Widget/Basic/Button.lua b/lua/wikis/commons/Widget/Basic/Button.lua index e12a02018ec..d6a4f76d74c 100644 --- a/lua/wikis/commons/Widget/Basic/Button.lua +++ b/lua/wikis/commons/Widget/Basic/Button.lua @@ -8,16 +8,15 @@ local Lua = require('Module:Lua') local Array = Lua.import('Module:Array') -local Class = Lua.import('Module:Class') local Logic = Lua.import('Module:Logic') local Table = Lua.import('Module:Table') -local Widget = Lua.import('Module:Widget') -local HtmlWidgets = Lua.import('Module:Widget/Html/All') +local Component = Lua.import('Module:Widget/Component') +local Html = Lua.import('Module:Widget/Html') local Link = Lua.import('Module:Widget/Basic/Link') -local Div = HtmlWidgets.Div +local Div = Html.Div ----@class ButtonWidgetParameters +---@class ButtonWidgetParameters: HtmlProps ---@field title string? ---@field link string? ---@field linktype 'internal'|'external'|nil @@ -26,9 +25,8 @@ local Div = HtmlWidgets.Div ---@field grow boolean? ---@field aligncontent 'left'|'right'|nil ----@class ButtonWidget: Widget ----@operator call(ButtonWidgetParameters): ButtonWidget -local Button = Class.new(Widget) +---@class ButtonWidget +local Button = {} Button.defaultProps = { linktype = 'internal', variant = 'primary', @@ -37,68 +35,69 @@ Button.defaultProps = { aligncontent = nil, } ----@return Widget -function Button:render() +---@param props ButtonWidgetParameters +---@return HtmlNode +function Button.render(props) --- MW Parser does not allowed the