@veltra/desktop 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/batch-edit/batch-edit.js.map +1 -1
- package/dist/components/batch-edit/batch-edit.vue.d.ts +2 -2
- package/dist/components/batch-edit/style.js +2 -2
- package/dist/components/batch-edit/use-edit.js.map +1 -1
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/cascade/cascade.vue.d.ts +5 -5
- package/dist/components/cascade/use-select.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.vue.d.ts +2 -2
- package/dist/components/date-panel/date-panel.js.map +1 -1
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/expression-editor/internal/editor-runtime/create-runtime.js.map +1 -1
- package/dist/components/expression-editor/internal/features/commands/register-command-packs.js.map +1 -1
- package/dist/components/expression-editor/internal/features/insertion/insertion-service.js.map +1 -1
- package/dist/components/expression-editor/use-decorators.js.map +1 -1
- package/dist/components/expression-editor/use-expression-drag-drop.js.map +1 -1
- package/dist/components/file-picker/file-picker.js.map +1 -1
- package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
- package/dist/components/form/form-model.js +2 -1
- package/dist/components/form/form-model.js.map +1 -1
- package/dist/components/grid/grid.js.map +1 -1
- package/dist/components/grid/use-responsive.js.map +1 -1
- package/dist/components/input/input.vue.d.ts +2 -2
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/loading/directive.js.map +1 -1
- package/dist/components/menu/menu-item.js.map +1 -1
- package/dist/components/message/message2.js.map +1 -1
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-select/multi-select.vue.d.ts +3 -3
- package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +5 -5
- package/dist/components/notification/index.js.map +1 -1
- package/dist/components/number-input/number-input.js.map +1 -1
- package/dist/components/number-range-input/number-range-input.vue.d.ts +1 -1
- package/dist/components/palette/color-transform.js.map +1 -1
- package/dist/components/palette/palette-sv.js.map +1 -1
- package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
- package/dist/components/progress/progress.js +1 -1
- package/dist/components/progress/progress.js.map +1 -1
- package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
- package/dist/components/progress-nodes/progress-nodes.vue.d.ts +3 -3
- package/dist/components/radio-group/radio-group.vue.d.ts +2 -2
- package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +1 -1
- package/dist/components/rich-text-editor/toolbar.js.map +1 -1
- package/dist/components/scroll/scroll.js.map +1 -1
- package/dist/components/select/select.vue.d.ts +2 -2
- package/dist/components/slider/slider-thumb.js.map +1 -1
- package/dist/components/table/di.js.map +1 -1
- package/dist/components/table/style.js +1 -1
- package/dist/components/table/table-row.js +1 -2
- package/dist/components/table/table-row.js.map +1 -1
- package/dist/components/table/table.js +1 -2
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/table.vue.d.ts +2 -2
- package/dist/components/table/use-columns.js +4 -0
- package/dist/components/table/use-columns.js.map +1 -1
- package/dist/components/table/use-table.js +25 -0
- package/dist/components/table/use-table.js.map +1 -1
- package/dist/components/tabs/style2.css +3 -2
- package/dist/components/tabs/tabs-horizontal.js +2 -2
- package/dist/components/tabs/tabs-horizontal.js.map +1 -1
- package/dist/components/tabs/tabs-horizontal.vue.d.ts +14 -3
- package/dist/components/tabs/tabs-vertical.js +2 -2
- package/dist/components/tabs/tabs-vertical.js.map +1 -1
- package/dist/components/tabs/tabs-vertical.vue.d.ts +13 -3
- package/dist/components/tabs/tabs.vue.d.ts +2 -2
- package/dist/components/text/text.js.map +1 -1
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/textarea/textarea.vue.d.ts +3 -3
- package/dist/components/theme/theme.js.map +1 -1
- package/dist/components/tip/tip.vue.d.ts +1 -1
- package/dist/components/tree/tree-node2.js.map +1 -1
- package/dist/components/tree/tree.vue.d.ts +4 -4
- package/dist/components/tree/use-tree-nodes.js.map +1 -1
- package/dist/components/tree-select/tree-select.vue.d.ts +5 -5
- package/dist/components/watermark/watermark.vue.d.ts +1 -1
- package/package.json +11 -11
- package/src/components/progress/progress.vue +1 -1
- package/src/components/table/di.ts +51 -53
- package/src/components/table/table.vue +0 -1
- package/src/components/tabs/style.scss +7 -4
- package/src/components/tabs/tabs-horizontal.vue +10 -7
- package/src/components/tabs/tabs-vertical.vue +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-columns.js","names":["UButton","UIcon"],"sources":["../../../src/components/table/use-columns.ts"],"sourcesContent":["import { Forest, dfs, last } from '@cat-kit/core'\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { type BEM } from '@veltra/utils'\nimport { computed, createVNode, shallowRef, watch, type ComputedRef, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableProps } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { ColumnNode } from './node/col'\n\n/**\n * 定义表格列\n * @param columns 表格列\n */\nexport function defineTableColumns(\n columns: TableColumn[],\n commonProps?: Partial<Pick<TableColumn, 'align' | 'minWidth'>>\n): TableColumn[] {\n columns.forEach((col) => {\n dfs(col, (node) => {\n for (const key in commonProps) {\n if (node[key] !== undefined) continue\n node[key] = commonProps[key]\n }\n })\n })\n return columns\n}\n\nexport interface ColumnConfig {\n /** 表头 */\n headers: ComputedRef<ColumnNode[][]>\n\n /**\n * body列, 在body中使用\n */\n columns: ShallowRef<ColumnNode[]>\n\n /** 所有叶子列 */\n leafColumns: ShallowRef<ColumnNode[]>\n\n /** 第一列 */\n expandColumn: ShallowRef<ColumnNode | undefined>\n}\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n /** 创建复选框 */\n createCheckColumn: () => TableColumn\n createSelectColumn: () => TableColumn\n toggleAllTreeRowExpand: () => void\n}\n\nexport function useColumns(options: Options): ColumnConfig {\n const { props, createCheckColumn, createSelectColumn, toggleAllTreeRowExpand, cls } = options\n\n /** 前置列 */\n const preColumns = computed<TableColumn[]>(() => {\n const { selectable, checkable, showIndex } = props\n\n const columns: TableColumn[] = []\n\n if (selectable) {\n columns.push(createSelectColumn())\n } else if (checkable) {\n columns.push(createCheckColumn())\n }\n if (showIndex) {\n columns.push({\n key: '__index__',\n name: '#',\n resizable: false,\n width: 60,\n minWidth: 60,\n align: 'center',\n fixed: 'left',\n render({ row }) {\n return row.index + 1\n }\n })\n }\n\n return columns\n })\n\n const columnForest = shallowRef<Forest<TableColumn, any>>()\n\n const renderExpandAll = () =>\n createVNode(\n UButton,\n {\n text: true,\n title: '展开或收起全部',\n class: cls.e('expand-all'),\n type: 'primary',\n size: 'small',\n circle: true,\n onClick: (e) => {\n e.stopPropagation()\n toggleAllTreeRowExpand()\n }\n },\n () => [createVNode(UIcon, undefined, () => [createVNode(ArrowRight)])]\n )\n\n watch(\n [preColumns, () => props.columns, () => props.tree, () => props.expandable],\n ([preColumns, columns, tree, expandable]) => {\n /** 固定到左侧的列 */\n const fixedOnLeft: TableColumn[] = [...preColumns]\n /** 未固定的列 */\n const unfixed: TableColumn[] = []\n /** 固定到右侧的列 */\n const fixedOnRight: TableColumn[] = []\n\n columns?.forEach((column) => {\n if (!column.fixed || column.children) {\n column.fixed = undefined\n return unfixed.push(column)\n }\n if (column.fixed === 'left') {\n fixedOnLeft.push(column)\n } else {\n fixedOnRight.push(column)\n }\n })\n\n if (last(fixedOnLeft)) {\n last(fixedOnLeft)!.isLastFixed = true\n }\n if (fixedOnRight[0]) {\n fixedOnRight[0].isFirstFixed = true\n }\n\n const sortedColumns = [...fixedOnLeft, ...unfixed, ...fixedOnRight]\n // 操作时避免改变原数据\n const firstColumn = { ...sortedColumns[0] } as TableColumn\n sortedColumns[0] = firstColumn\n\n // 树形表格需要给第一列添加展开按钮\n // 因此要重新设置第一列的宽度和对齐方式\n if ((!!tree || expandable) && firstColumn) {\n firstColumn.align = 'left'\n firstColumn.width = firstColumn.width ? firstColumn.width + 60 : undefined\n\n const oldNameRender = firstColumn.nameRender\n\n firstColumn.nameRender = oldNameRender\n ? (ctx) => {\n const oldNodes = oldNameRender!(ctx)\n return [renderExpandAll(), ...(Array.isArray(oldNodes) ? oldNodes : [oldNodes])]\n }\n : () => {\n return [renderExpandAll(), firstColumn.name]\n }\n }\n\n const result = new Forest<TableColumn, any>({\n data: sortedColumns,\n createNode(data, index, depth, _f, parent) {\n return new ColumnNode(data, index, depth, parent)\n }\n })\n\n columnForest.value = result\n },\n { immediate: true }\n )\n\n const headers = computed(() => {\n const headers: ColumnNode[][] = []\n const forest = columnForest.value\n if (!forest) return headers\n\n // Forest.bfs 对每个根单独 BFS,按 depth 拼行会把后续根节点错放到深层,且根节点无 parent,\n // 回溯 leafs 时会读到 undefined。这里从所有根一次性层序遍历,与多列表头布局一致。\n const queue: ColumnNode[] = [...forest.roots]\n while (queue.length > 0) {\n const size = queue.length\n const layer: ColumnNode[] = []\n for (let i = 0; i < size; i++) {\n const node = queue.shift()!\n layer.push(node)\n const ch = node.children\n if (ch?.length) {\n for (const c of ch) {\n queue.push(c)\n }\n }\n }\n headers.push(layer)\n }\n\n // 从叶子节点开始回溯计算每个节点的累计叶子节点数量,叶子节点数量代表表头的宽度\n for (let i = headers.length - 1; i > 0; i--) {\n const header = headers[i]!\n\n header.forEach((node) => {\n const parent = node.parent\n if (!parent) return\n if (parent.leafs !== undefined) return\n parent.leafs = parent.children!.reduce((sum, node) => {\n return sum + (node.leafs ?? 1)\n }, 0)\n })\n }\n\n return headers\n })\n\n /** 除展开按钮之外的列 */\n const columns = shallowRef<ColumnNode[]>([])\n\n /** 所有叶子节点 */\n const leafColumns = shallowRef<ColumnNode[]>([])\n\n const expandColumn = shallowRef<ColumnNode>()\n\n // 监听列的变化\n watch(\n [columnForest, () => props.tree, () => props.expandable],\n ([forest, tree, expandable]) => {\n const _columns: ColumnNode[] = []\n\n forest?.dfs((node) => {\n if (node.isLeaf) {\n _columns.push(node)\n }\n })\n\n leafColumns.value = _columns\n\n if (tree || expandable) {\n expandColumn.value = _columns[0]\n columns.value = _columns.slice(1)\n } else {\n columns.value = _columns\n expandColumn.value = undefined\n }\n },\n { immediate: true }\n )\n\n return {\n /** 第一列 */\n expandColumn,\n /** 所有列 */\n leafColumns,\n /** 列 */\n columns,\n /** 表格头的分层展示 */\n headers\n }\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,mBACd,SACA,aACe;AACf,SAAQ,SAAS,QAAQ;AACvB,MAAI,MAAM,SAAS;AACjB,QAAK,MAAM,OAAO,aAAa;AAC7B,QAAI,KAAK,SAAS,KAAA,EAAW;AAC7B,SAAK,OAAO,YAAY;;IAE1B;GACF;AACF,QAAO;;AA4BT,SAAgB,WAAW,SAAgC;CACzD,MAAM,EAAE,OAAO,mBAAmB,oBAAoB,wBAAwB,QAAQ;;CAGtF,MAAM,aAAa,eAA8B;EAC/C,MAAM,EAAE,YAAY,WAAW,cAAc;EAE7C,MAAM,UAAyB,EAAE;AAEjC,MAAI,WACF,SAAQ,KAAK,oBAAoB,CAAC;WACzB,UACT,SAAQ,KAAK,mBAAmB,CAAC;AAEnC,MAAI,UACF,SAAQ,KAAK;GACX,KAAK;GACL,MAAM;GACN,WAAW;GACX,OAAO;GACP,UAAU;GACV,OAAO;GACP,OAAO;GACP,OAAO,EAAE,OAAO;AACd,WAAO,IAAI,QAAQ;;GAEtB,CAAC;AAGJ,SAAO;GACP;CAEF,MAAM,eAAe,YAAsC;CAE3D,MAAM,wBACJ,YACEA,aACA;EACE,MAAM;EACN,OAAO;EACP,OAAO,IAAI,EAAE,aAAa;EAC1B,MAAM;EACN,MAAM;EACN,QAAQ;EACR,UAAU,MAAM;AACd,KAAE,iBAAiB;AACnB,2BAAwB;;EAE3B,QACK,CAAC,YAAYC,WAAO,KAAA,SAAiB,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,CACvE;AAEH,OACE;EAAC;QAAkB,MAAM;QAAe,MAAM;QAAY,MAAM;EAAW,GAC1E,CAAC,YAAY,SAAS,MAAM,gBAAgB;;EAE3C,MAAM,cAA6B,CAAC,GAAG,WAAW;;EAElD,MAAM,UAAyB,EAAE;;EAEjC,MAAM,eAA8B,EAAE;AAEtC,WAAS,SAAS,WAAW;AAC3B,OAAI,CAAC,OAAO,SAAS,OAAO,UAAU;AACpC,WAAO,QAAQ,KAAA;AACf,WAAO,QAAQ,KAAK,OAAO;;AAE7B,OAAI,OAAO,UAAU,OACnB,aAAY,KAAK,OAAO;OAExB,cAAa,KAAK,OAAO;IAE3B;AAEF,MAAI,KAAK,YAAY,CACnB,MAAK,YAAY,CAAE,cAAc;AAEnC,MAAI,aAAa,GACf,cAAa,GAAG,eAAe;EAGjC,MAAM,gBAAgB;GAAC,GAAG;GAAa,GAAG;GAAS,GAAG;GAAa;EAEnE,MAAM,cAAc,EAAE,GAAG,cAAc,IAAI;AAC3C,gBAAc,KAAK;AAInB,OAAK,CAAC,CAAC,QAAQ,eAAe,aAAa;AACzC,eAAY,QAAQ;AACpB,eAAY,QAAQ,YAAY,QAAQ,YAAY,QAAQ,KAAK,KAAA;GAEjE,MAAM,gBAAgB,YAAY;AAElC,eAAY,aAAa,iBACpB,QAAQ;IACP,MAAM,WAAW,cAAe,IAAI;AACpC,WAAO,CAAC,iBAAiB,EAAE,GAAI,MAAM,QAAQ,SAAS,GAAG,WAAW,CAAC,SAAS,CAAE;aAE5E;AACJ,WAAO,CAAC,iBAAiB,EAAE,YAAY,KAAK;;;AAWpD,eAAa,
|
|
1
|
+
{"version":3,"file":"use-columns.js","names":["UButton","UIcon"],"sources":["../../../src/components/table/use-columns.ts"],"sourcesContent":["import { Forest, dfs, last } from '@cat-kit/core'\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { type BEM } from '@veltra/utils'\nimport { computed, createVNode, shallowRef, watch, type ComputedRef, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableProps } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { ColumnNode } from './node/col'\n\n/**\n * 定义表格列\n * @param columns 表格列\n */\nexport function defineTableColumns(\n columns: TableColumn[],\n commonProps?: Partial<Pick<TableColumn, 'align' | 'minWidth'>>\n): TableColumn[] {\n columns.forEach((col) => {\n dfs(col, (node) => {\n for (const key in commonProps) {\n if (node[key] !== undefined) continue\n node[key] = commonProps[key]\n }\n })\n })\n return columns\n}\n\nexport interface ColumnConfig {\n /** 表头 */\n headers: ComputedRef<ColumnNode[][]>\n\n /**\n * body列, 在body中使用\n */\n columns: ShallowRef<ColumnNode[]>\n\n /** 所有叶子列 */\n leafColumns: ShallowRef<ColumnNode[]>\n\n /** 第一列 */\n expandColumn: ShallowRef<ColumnNode | undefined>\n}\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n /** 创建复选框 */\n createCheckColumn: () => TableColumn\n createSelectColumn: () => TableColumn\n toggleAllTreeRowExpand: () => void\n}\n\nexport function useColumns(options: Options): ColumnConfig {\n const { props, createCheckColumn, createSelectColumn, toggleAllTreeRowExpand, cls } = options\n\n /** 前置列 */\n const preColumns = computed<TableColumn[]>(() => {\n const { selectable, checkable, showIndex } = props\n\n const columns: TableColumn[] = []\n\n if (selectable) {\n columns.push(createSelectColumn())\n } else if (checkable) {\n columns.push(createCheckColumn())\n }\n if (showIndex) {\n columns.push({\n key: '__index__',\n name: '#',\n resizable: false,\n width: 60,\n minWidth: 60,\n align: 'center',\n fixed: 'left',\n render({ row }) {\n return row.index + 1\n }\n })\n }\n\n return columns\n })\n\n const columnForest = shallowRef<Forest<TableColumn, any>>()\n\n const renderExpandAll = () =>\n createVNode(\n UButton,\n {\n text: true,\n title: '展开或收起全部',\n class: cls.e('expand-all'),\n type: 'primary',\n size: 'small',\n circle: true,\n onClick: (e) => {\n e.stopPropagation()\n toggleAllTreeRowExpand()\n }\n },\n () => [createVNode(UIcon, undefined, () => [createVNode(ArrowRight)])]\n )\n\n watch(\n [preColumns, () => props.columns, () => props.tree, () => props.expandable],\n ([preColumns, columns, tree, expandable]) => {\n /** 固定到左侧的列 */\n const fixedOnLeft: TableColumn[] = [...preColumns]\n /** 未固定的列 */\n const unfixed: TableColumn[] = []\n /** 固定到右侧的列 */\n const fixedOnRight: TableColumn[] = []\n\n columns?.forEach((column) => {\n if (!column.fixed || column.children) {\n column.fixed = undefined\n return unfixed.push(column)\n }\n if (column.fixed === 'left') {\n fixedOnLeft.push(column)\n } else {\n fixedOnRight.push(column)\n }\n })\n\n if (last(fixedOnLeft)) {\n last(fixedOnLeft)!.isLastFixed = true\n }\n if (fixedOnRight[0]) {\n fixedOnRight[0].isFirstFixed = true\n }\n\n const sortedColumns = [...fixedOnLeft, ...unfixed, ...fixedOnRight]\n // 操作时避免改变原数据\n const firstColumn = { ...sortedColumns[0] } as TableColumn\n sortedColumns[0] = firstColumn\n\n // 树形表格需要给第一列添加展开按钮\n // 因此要重新设置第一列的宽度和对齐方式\n if ((!!tree || expandable) && firstColumn) {\n firstColumn.align = 'left'\n firstColumn.width = firstColumn.width ? firstColumn.width + 60 : undefined\n\n const oldNameRender = firstColumn.nameRender\n\n firstColumn.nameRender = oldNameRender\n ? (ctx) => {\n const oldNodes = oldNameRender!(ctx)\n return [renderExpandAll(), ...(Array.isArray(oldNodes) ? oldNodes : [oldNodes])]\n }\n : () => {\n return [renderExpandAll(), firstColumn.name]\n }\n }\n\n const result = new Forest<TableColumn, any>({\n data: sortedColumns,\n createNode(data, index, depth, _f, parent) {\n return new ColumnNode(data, index, depth, parent)\n }\n })\n\n columnForest.value = result\n },\n { immediate: true }\n )\n\n const headers = computed(() => {\n const headers: ColumnNode[][] = []\n const forest = columnForest.value\n if (!forest) return headers\n\n // Forest.bfs 对每个根单独 BFS,按 depth 拼行会把后续根节点错放到深层,且根节点无 parent,\n // 回溯 leafs 时会读到 undefined。这里从所有根一次性层序遍历,与多列表头布局一致。\n const queue: ColumnNode[] = [...forest.roots]\n while (queue.length > 0) {\n const size = queue.length\n const layer: ColumnNode[] = []\n for (let i = 0; i < size; i++) {\n const node = queue.shift()!\n layer.push(node)\n const ch = node.children\n if (ch?.length) {\n for (const c of ch) {\n queue.push(c)\n }\n }\n }\n headers.push(layer)\n }\n\n // 从叶子节点开始回溯计算每个节点的累计叶子节点数量,叶子节点数量代表表头的宽度\n for (let i = headers.length - 1; i > 0; i--) {\n const header = headers[i]!\n\n header.forEach((node) => {\n const parent = node.parent\n if (!parent) return\n if (parent.leafs !== undefined) return\n parent.leafs = parent.children!.reduce((sum, node) => {\n return sum + (node.leafs ?? 1)\n }, 0)\n })\n }\n\n return headers\n })\n\n /** 除展开按钮之外的列 */\n const columns = shallowRef<ColumnNode[]>([])\n\n /** 所有叶子节点 */\n const leafColumns = shallowRef<ColumnNode[]>([])\n\n const expandColumn = shallowRef<ColumnNode>()\n\n // 监听列的变化\n watch(\n [columnForest, () => props.tree, () => props.expandable],\n ([forest, tree, expandable]) => {\n const _columns: ColumnNode[] = []\n\n forest?.dfs((node) => {\n if (node.isLeaf) {\n _columns.push(node)\n }\n })\n\n leafColumns.value = _columns\n\n if (tree || expandable) {\n expandColumn.value = _columns[0]\n columns.value = _columns.slice(1)\n } else {\n columns.value = _columns\n expandColumn.value = undefined\n }\n },\n { immediate: true }\n )\n\n return {\n /** 第一列 */\n expandColumn,\n /** 所有列 */\n leafColumns,\n /** 列 */\n columns,\n /** 表格头的分层展示 */\n headers\n }\n}\n"],"mappings":"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"}
|
|
@@ -78,11 +78,36 @@ function useTable(options) {
|
|
|
78
78
|
};
|
|
79
79
|
};
|
|
80
80
|
return {
|
|
81
|
+
/**
|
|
82
|
+
* 获取列插槽VNode
|
|
83
|
+
* @param ctx 列渲染上下文
|
|
84
|
+
*/
|
|
81
85
|
getColumnSlotsNode,
|
|
86
|
+
/**
|
|
87
|
+
* 获取表头插槽VNode
|
|
88
|
+
* @param ctx 表头渲染上下文
|
|
89
|
+
*/
|
|
82
90
|
getHeaderSlotsNode,
|
|
91
|
+
/**
|
|
92
|
+
* 获取展开行插槽VNode
|
|
93
|
+
* @param ctx 展开行渲染上下文
|
|
94
|
+
*/
|
|
83
95
|
getExpandRowSlotsNode,
|
|
96
|
+
/**
|
|
97
|
+
* 获取单元格类名
|
|
98
|
+
* @param column 列
|
|
99
|
+
*/
|
|
84
100
|
getCellClass,
|
|
101
|
+
/**
|
|
102
|
+
* 获取表头单元格类名
|
|
103
|
+
* @param column 列
|
|
104
|
+
*/
|
|
85
105
|
getHeaderCellClass,
|
|
106
|
+
/**
|
|
107
|
+
* 获取单元格上下文
|
|
108
|
+
* @param row 行
|
|
109
|
+
* @param column 列
|
|
110
|
+
*/
|
|
86
111
|
getCellCtx
|
|
87
112
|
};
|
|
88
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-table.js","names":[],"sources":["../../../src/components/table/use-table.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { bem, type BEM } from '@veltra/utils'\nimport { useSlots, watch, type Ref } from 'vue'\n\nimport type {\n TableColumnRenderContext,\n TableColumnSlotsScope,\n TableProps,\n TableRow,\n RenderReturn,\n TableRowSlotsScope\n} from '../../types'\nimport type { ColumnNode } from './node/col'\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n leftFixed: Ref<boolean>\n rightFixed: Ref<boolean>\n}\n\ninterface UseTableReturn {\n getColumnSlotsNode: (ctx: TableColumnSlotsScope | TableColumnRenderContext) => RenderReturn\n getHeaderSlotsNode: (ctx: { column: ColumnNode }) => RenderReturn\n getExpandRowSlotsNode: (ctx: TableRowSlotsScope) => RenderReturn\n getCellClass: (column: ColumnNode) => string\n getHeaderCellClass: (column: ColumnNode) => string\n getCellCtx: (\n row: TableRow,\n column: ColumnNode\n ) => TableColumnSlotsScope | TableColumnRenderContext\n}\n\nexport function useTable(options: Options): UseTableReturn {\n const { props, cls, leftFixed, rightFixed } = options\n\n const slots = useSlots()\n\n const getColumnSlotsNode = (\n ctx: TableColumnSlotsScope | TableColumnRenderContext\n ): RenderReturn => {\n const column = ctx.column.data\n\n const { render, key } = column\n\n if (render) return render(ctx)\n\n const slotsRender = props.slots?.[`column:${key}`] ?? slots[`column:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return ctx.val\n }\n\n const getHeaderSlotsNode = (ctx: { column: ColumnNode }): RenderReturn => {\n const column = ctx.column.data\n const { nameRender, key } = column\n\n if (nameRender) return nameRender(ctx)\n\n const slotsRender = props.slots?.[`header:${key}`] ?? slots[`header:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return column.name\n }\n\n const getExpandRowSlotsNode = (ctx: TableRowSlotsScope): RenderReturn => {\n const slotsRender = props.slots?.['row:expand'] ?? slots['row:expand']\n\n if (slotsRender) return slotsRender(ctx)\n return null\n }\n\n const cellCls = cls.e('cell')\n\n const getCommonClassName = (column: ColumnNode): string => {\n const classList: string[] = [cellCls]\n\n leftFixed.value && column.isLastFixed && classList.push(bem.is('last-fixed'))\n\n rightFixed.value && column.isFirstFixed && classList.push(bem.is('first-fixed'))\n\n if (column.fixed) {\n classList.push(bem.is('fixed-' + column.fixed))\n }\n return classList.join(' ')\n }\n\n /**\n * B1: 单元格类名按 ColumnNode 身份缓存。\n *\n * 对同一列,类名只取决于 (column.fixed, column.isLastFixed, column.isFirstFixed,\n * column.align, leftFixed, rightFixed)。其中前四个绑定在 ColumnNode 实例上,\n * 后两个在 leftFixed/rightFixed 变化时失效缓存即可。用 WeakMap 以 ColumnNode\n * 为键可避免字符串 key 的拼接/哈希开销,且列树重建时节点随 GC 自动释放。\n */\n let cellClassCache = new WeakMap<ColumnNode, string>()\n let headerCellClassCache = new WeakMap<ColumnNode, string>()\n\n watch([leftFixed, rightFixed], () => {\n cellClassCache = new WeakMap()\n headerCellClassCache = new WeakMap()\n })\n\n const getCellClass = (column: ColumnNode): string => {\n const cached = cellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.align)}`\n cellClassCache.set(column, result)\n return result\n }\n\n const getHeaderCellClass = (column: ColumnNode): string => {\n const cached = headerCellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.headerAlign)}`\n headerCellClassCache.set(column, result)\n return result\n }\n\n const getCellCtx = (\n row: TableRow,\n column: ColumnNode\n ): TableColumnSlotsScope | TableColumnRenderContext => {\n const rowData = row.data\n const val = column.key ? o(rowData).get(column.key) : undefined\n\n const ctx = {\n row,\n column,\n rowData,\n val,\n model: {\n modelValue: val,\n 'onUpdate:modelValue': (val: any) => {\n rowData[column.key] = val\n }\n }\n }\n\n return ctx\n }\n\n return {\n /**\n * 获取列插槽VNode\n * @param ctx 列渲染上下文\n */\n getColumnSlotsNode,\n /**\n * 获取表头插槽VNode\n * @param ctx 表头渲染上下文\n */\n getHeaderSlotsNode,\n /**\n * 获取展开行插槽VNode\n * @param ctx 展开行渲染上下文\n */\n getExpandRowSlotsNode,\n /**\n * 获取单元格类名\n * @param column 列\n */\n getCellClass,\n /**\n * 获取表头单元格类名\n * @param column 列\n */\n getHeaderCellClass,\n /**\n * 获取单元格上下文\n * @param row 行\n * @param column 列\n */\n getCellCtx\n }\n}\n"],"mappings":";;;;AAiCA,SAAgB,SAAS,SAAkC;CACzD,MAAM,EAAE,OAAO,KAAK,WAAW,eAAe;CAE9C,MAAM,QAAQ,UAAU;CAExB,MAAM,sBACJ,QACiB;EAGjB,MAAM,EAAE,QAAQ,QAFD,IAAI,OAAO;AAI1B,MAAI,OAAQ,QAAO,OAAO,IAAI;EAE9B,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;AAEtE,MAAI,YAAa,QAAO,YAAY,IAAI;AAExC,SAAO,IAAI;;CAGb,MAAM,sBAAsB,QAA8C;EACxE,MAAM,SAAS,IAAI,OAAO;EAC1B,MAAM,EAAE,YAAY,QAAQ;AAE5B,MAAI,WAAY,QAAO,WAAW,IAAI;EAEtC,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;AAEtE,MAAI,YAAa,QAAO,YAAY,IAAI;AAExC,SAAO,OAAO;;CAGhB,MAAM,yBAAyB,QAA0C;EACvE,MAAM,cAAc,MAAM,QAAQ,iBAAiB,MAAM;AAEzD,MAAI,YAAa,QAAO,YAAY,IAAI;AACxC,SAAO;;CAGT,MAAM,UAAU,IAAI,EAAE,OAAO;CAE7B,MAAM,sBAAsB,WAA+B;EACzD,MAAM,YAAsB,CAAC,QAAQ;AAErC,YAAU,SAAS,OAAO,eAAe,UAAU,KAAK,IAAI,GAAG,aAAa,CAAC;AAE7E,aAAW,SAAS,OAAO,gBAAgB,UAAU,KAAK,IAAI,GAAG,cAAc,CAAC;AAEhF,MAAI,OAAO,MACT,WAAU,KAAK,IAAI,GAAG,WAAW,OAAO,MAAM,CAAC;AAEjD,SAAO,UAAU,KAAK,IAAI;;;;;;;;;;CAW5B,IAAI,iCAAiB,IAAI,SAA6B;CACtD,IAAI,uCAAuB,IAAI,SAA6B;AAE5D,OAAM,CAAC,WAAW,WAAW,QAAQ;AACnC,mCAAiB,IAAI,SAAS;AAC9B,yCAAuB,IAAI,SAAS;GACpC;CAEF,MAAM,gBAAgB,WAA+B;EACnD,MAAM,SAAS,eAAe,IAAI,OAAO;AACzC,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,SAAS,mBAAmB,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,MAAM;AACpE,iBAAe,IAAI,QAAQ,OAAO;AAClC,SAAO;;CAGT,MAAM,sBAAsB,WAA+B;EACzD,MAAM,SAAS,qBAAqB,IAAI,OAAO;AAC/C,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,SAAS,mBAAmB,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,YAAY;AAC1E,uBAAqB,IAAI,QAAQ,OAAO;AACxC,SAAO;;CAGT,MAAM,cACJ,KACA,WACqD;EACrD,MAAM,UAAU,IAAI;EACpB,MAAM,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,OAAO,IAAI,GAAG,KAAA;AAetD,
|
|
1
|
+
{"version":3,"file":"use-table.js","names":[],"sources":["../../../src/components/table/use-table.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { bem, type BEM } from '@veltra/utils'\nimport { useSlots, watch, type Ref } from 'vue'\n\nimport type {\n TableColumnRenderContext,\n TableColumnSlotsScope,\n TableProps,\n TableRow,\n RenderReturn,\n TableRowSlotsScope\n} from '../../types'\nimport type { ColumnNode } from './node/col'\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n leftFixed: Ref<boolean>\n rightFixed: Ref<boolean>\n}\n\ninterface UseTableReturn {\n getColumnSlotsNode: (ctx: TableColumnSlotsScope | TableColumnRenderContext) => RenderReturn\n getHeaderSlotsNode: (ctx: { column: ColumnNode }) => RenderReturn\n getExpandRowSlotsNode: (ctx: TableRowSlotsScope) => RenderReturn\n getCellClass: (column: ColumnNode) => string\n getHeaderCellClass: (column: ColumnNode) => string\n getCellCtx: (\n row: TableRow,\n column: ColumnNode\n ) => TableColumnSlotsScope | TableColumnRenderContext\n}\n\nexport function useTable(options: Options): UseTableReturn {\n const { props, cls, leftFixed, rightFixed } = options\n\n const slots = useSlots()\n\n const getColumnSlotsNode = (\n ctx: TableColumnSlotsScope | TableColumnRenderContext\n ): RenderReturn => {\n const column = ctx.column.data\n\n const { render, key } = column\n\n if (render) return render(ctx)\n\n const slotsRender = props.slots?.[`column:${key}`] ?? slots[`column:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return ctx.val\n }\n\n const getHeaderSlotsNode = (ctx: { column: ColumnNode }): RenderReturn => {\n const column = ctx.column.data\n const { nameRender, key } = column\n\n if (nameRender) return nameRender(ctx)\n\n const slotsRender = props.slots?.[`header:${key}`] ?? slots[`header:${key}`]\n\n if (slotsRender) return slotsRender(ctx)\n\n return column.name\n }\n\n const getExpandRowSlotsNode = (ctx: TableRowSlotsScope): RenderReturn => {\n const slotsRender = props.slots?.['row:expand'] ?? slots['row:expand']\n\n if (slotsRender) return slotsRender(ctx)\n return null\n }\n\n const cellCls = cls.e('cell')\n\n const getCommonClassName = (column: ColumnNode): string => {\n const classList: string[] = [cellCls]\n\n leftFixed.value && column.isLastFixed && classList.push(bem.is('last-fixed'))\n\n rightFixed.value && column.isFirstFixed && classList.push(bem.is('first-fixed'))\n\n if (column.fixed) {\n classList.push(bem.is('fixed-' + column.fixed))\n }\n return classList.join(' ')\n }\n\n /**\n * B1: 单元格类名按 ColumnNode 身份缓存。\n *\n * 对同一列,类名只取决于 (column.fixed, column.isLastFixed, column.isFirstFixed,\n * column.align, leftFixed, rightFixed)。其中前四个绑定在 ColumnNode 实例上,\n * 后两个在 leftFixed/rightFixed 变化时失效缓存即可。用 WeakMap 以 ColumnNode\n * 为键可避免字符串 key 的拼接/哈希开销,且列树重建时节点随 GC 自动释放。\n */\n let cellClassCache = new WeakMap<ColumnNode, string>()\n let headerCellClassCache = new WeakMap<ColumnNode, string>()\n\n watch([leftFixed, rightFixed], () => {\n cellClassCache = new WeakMap()\n headerCellClassCache = new WeakMap()\n })\n\n const getCellClass = (column: ColumnNode): string => {\n const cached = cellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.align)}`\n cellClassCache.set(column, result)\n return result\n }\n\n const getHeaderCellClass = (column: ColumnNode): string => {\n const cached = headerCellClassCache.get(column)\n if (cached !== undefined) return cached\n const result = getCommonClassName(column) + ` ${bem.is(column.headerAlign)}`\n headerCellClassCache.set(column, result)\n return result\n }\n\n const getCellCtx = (\n row: TableRow,\n column: ColumnNode\n ): TableColumnSlotsScope | TableColumnRenderContext => {\n const rowData = row.data\n const val = column.key ? o(rowData).get(column.key) : undefined\n\n const ctx = {\n row,\n column,\n rowData,\n val,\n model: {\n modelValue: val,\n 'onUpdate:modelValue': (val: any) => {\n rowData[column.key] = val\n }\n }\n }\n\n return ctx\n }\n\n return {\n /**\n * 获取列插槽VNode\n * @param ctx 列渲染上下文\n */\n getColumnSlotsNode,\n /**\n * 获取表头插槽VNode\n * @param ctx 表头渲染上下文\n */\n getHeaderSlotsNode,\n /**\n * 获取展开行插槽VNode\n * @param ctx 展开行渲染上下文\n */\n getExpandRowSlotsNode,\n /**\n * 获取单元格类名\n * @param column 列\n */\n getCellClass,\n /**\n * 获取表头单元格类名\n * @param column 列\n */\n getHeaderCellClass,\n /**\n * 获取单元格上下文\n * @param row 行\n * @param column 列\n */\n getCellCtx\n }\n}\n"],"mappings":";;;;AAiCA,SAAgB,SAAS,SAAkC;CACzD,MAAM,EAAE,OAAO,KAAK,WAAW,eAAe;CAE9C,MAAM,QAAQ,UAAU;CAExB,MAAM,sBACJ,QACiB;EAGjB,MAAM,EAAE,QAAQ,QAFD,IAAI,OAAO;AAI1B,MAAI,OAAQ,QAAO,OAAO,IAAI;EAE9B,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;AAEtE,MAAI,YAAa,QAAO,YAAY,IAAI;AAExC,SAAO,IAAI;;CAGb,MAAM,sBAAsB,QAA8C;EACxE,MAAM,SAAS,IAAI,OAAO;EAC1B,MAAM,EAAE,YAAY,QAAQ;AAE5B,MAAI,WAAY,QAAO,WAAW,IAAI;EAEtC,MAAM,cAAc,MAAM,QAAQ,UAAU,UAAU,MAAM,UAAU;AAEtE,MAAI,YAAa,QAAO,YAAY,IAAI;AAExC,SAAO,OAAO;;CAGhB,MAAM,yBAAyB,QAA0C;EACvE,MAAM,cAAc,MAAM,QAAQ,iBAAiB,MAAM;AAEzD,MAAI,YAAa,QAAO,YAAY,IAAI;AACxC,SAAO;;CAGT,MAAM,UAAU,IAAI,EAAE,OAAO;CAE7B,MAAM,sBAAsB,WAA+B;EACzD,MAAM,YAAsB,CAAC,QAAQ;AAErC,YAAU,SAAS,OAAO,eAAe,UAAU,KAAK,IAAI,GAAG,aAAa,CAAC;AAE7E,aAAW,SAAS,OAAO,gBAAgB,UAAU,KAAK,IAAI,GAAG,cAAc,CAAC;AAEhF,MAAI,OAAO,MACT,WAAU,KAAK,IAAI,GAAG,WAAW,OAAO,MAAM,CAAC;AAEjD,SAAO,UAAU,KAAK,IAAI;;;;;;;;;;CAW5B,IAAI,iCAAiB,IAAI,SAA6B;CACtD,IAAI,uCAAuB,IAAI,SAA6B;AAE5D,OAAM,CAAC,WAAW,WAAW,QAAQ;AACnC,mCAAiB,IAAI,SAAS;AAC9B,yCAAuB,IAAI,SAAS;GACpC;CAEF,MAAM,gBAAgB,WAA+B;EACnD,MAAM,SAAS,eAAe,IAAI,OAAO;AACzC,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,SAAS,mBAAmB,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,MAAM;AACpE,iBAAe,IAAI,QAAQ,OAAO;AAClC,SAAO;;CAGT,MAAM,sBAAsB,WAA+B;EACzD,MAAM,SAAS,qBAAqB,IAAI,OAAO;AAC/C,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,SAAS,mBAAmB,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,YAAY;AAC1E,uBAAqB,IAAI,QAAQ,OAAO;AACxC,SAAO;;CAGT,MAAM,cACJ,KACA,WACqD;EACrD,MAAM,UAAU,IAAI;EACpB,MAAM,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,OAAO,IAAI,GAAG,KAAA;AAetD,SAAO;GAZL;GACA;GACA;GACA;GACA,OAAO;IACL,YAAY;IACZ,wBAAwB,QAAa;AACnC,aAAQ,OAAO,OAAO;;IAEzB;GAGO;;AAGZ,QAAO;;;;;EAKL;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;EAKA;;;;;;EAMA;EACD"}
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
}
|
|
65
65
|
.u-tabs-bar--vertical {
|
|
66
66
|
flex-direction: column;
|
|
67
|
+
padding-block: 4px;
|
|
67
68
|
}
|
|
68
69
|
.u-tabs-bar__viewport {
|
|
69
70
|
flex: 1 1 auto;
|
|
@@ -102,7 +103,7 @@
|
|
|
102
103
|
align-items: center;
|
|
103
104
|
justify-content: center;
|
|
104
105
|
gap: 0;
|
|
105
|
-
transition: color 0.
|
|
106
|
+
transition: color 0.22s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.22s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.22s cubic-bezier(0.4, 0, 0.2, 1);
|
|
106
107
|
}
|
|
107
108
|
.u-tabs-bar__item:not(.is-active):not(.is-disabled):hover {
|
|
108
109
|
color: var(--u-text-color-title);
|
|
@@ -112,7 +113,7 @@
|
|
|
112
113
|
cursor: not-allowed;
|
|
113
114
|
}
|
|
114
115
|
.u-tabs-bar__item.is-active {
|
|
115
|
-
color: var(--u-
|
|
116
|
+
color: var(--u-color-primary);
|
|
116
117
|
background-color: var(--u-bg-color-top);
|
|
117
118
|
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08), 0 1px 3px rgba(15, 23, 42, 0.06);
|
|
118
119
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _sfc_main$1 from "../icon/icon.js";
|
|
2
2
|
import { useTabsBar } from "./use-tabs-bar.js";
|
|
3
|
-
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderList, shallowRef, toDisplayString, unref, useModel, vShow, withCtx, withDirectives, withModifiers } from "vue";
|
|
3
|
+
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderList, renderSlot, shallowRef, toDisplayString, unref, useModel, vShow, withCtx, withDirectives, withModifiers } from "vue";
|
|
4
4
|
import { bem } from "@veltra/utils";
|
|
5
5
|
import { useFallbackProps } from "@veltra/compositions";
|
|
6
6
|
import { ArrowLeft, ArrowRight, Close } from "@veltra/icons/normal";
|
|
@@ -102,7 +102,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
102
102
|
unref(bem).is("disabled", item.disabled === true)
|
|
103
103
|
]),
|
|
104
104
|
onClick: withModifiers(($event) => handleClick(item, index), ["stop"])
|
|
105
|
-
}, [createElementVNode("span", { class: normalizeClass(unref(cls).e("item-label")) }, toDisplayString(item.name ?? item.key), 3), isItemClosable(item) ? (openBlock(), createElementBlock("span", {
|
|
105
|
+
}, [renderSlot(_ctx.$slots, `name:${item.key}`, { item }, () => [createElementVNode("span", { class: normalizeClass(unref(cls).e("item-label")) }, toDisplayString(item.name ?? item.key), 3)]), isItemClosable(item) ? (openBlock(), createElementBlock("span", {
|
|
106
106
|
key: 0,
|
|
107
107
|
role: "button",
|
|
108
108
|
tabindex: "0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon
|
|
1
|
+
{"version":3,"file":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot :name=\"`name:${item.key}`\" :item=\"item\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'TabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{\n [key: `name:${string}`]: (props: { item: TabItem }) => any\n}>()\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -3,27 +3,38 @@ import * as _$vue from "vue";
|
|
|
3
3
|
|
|
4
4
|
//#region src/components/tabs/tabs-horizontal.vue.d.ts
|
|
5
5
|
type __VLS_Props = TabsHorizontalProps;
|
|
6
|
+
type __VLS_Slots = {
|
|
7
|
+
[key: `name:${string}`]: (props: {
|
|
8
|
+
item: TabItem;
|
|
9
|
+
}) => any;
|
|
10
|
+
};
|
|
6
11
|
type __VLS_ModelProps = {
|
|
7
12
|
modelValue?: string;
|
|
8
13
|
};
|
|
9
14
|
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
10
|
-
declare const
|
|
15
|
+
declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {
|
|
11
16
|
"update:modelValue": (value: string | undefined) => any;
|
|
12
17
|
} & {
|
|
13
|
-
click: (item: TabItem, index: number) => any;
|
|
14
18
|
"update:modelValue": (value: string) => any;
|
|
15
19
|
close: (item: TabItem, index: number) => any;
|
|
20
|
+
click: (item: TabItem, index: number) => any;
|
|
16
21
|
}, string, _$vue.PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
17
|
-
onClick?: ((item: TabItem, index: number) => any) | undefined;
|
|
18
22
|
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
19
23
|
onClose?: ((item: TabItem, index: number) => any) | undefined;
|
|
24
|
+
onClick?: ((item: TabItem, index: number) => any) | undefined;
|
|
20
25
|
}>, {
|
|
21
26
|
block: boolean;
|
|
22
27
|
closable: boolean;
|
|
23
28
|
position: "top" | "bottom";
|
|
24
29
|
rounded: boolean;
|
|
25
30
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
31
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
26
32
|
declare const _default: typeof __VLS_export;
|
|
33
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
34
|
+
new (): {
|
|
35
|
+
$slots: S;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
27
38
|
//#endregion
|
|
28
39
|
export { _default };
|
|
29
40
|
//# sourceMappingURL=tabs-horizontal.vue.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _sfc_main$1 from "../icon/icon.js";
|
|
2
|
-
import { Fragment, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderList, toDisplayString, unref, useModel, withCtx, withModifiers } from "vue";
|
|
2
|
+
import { Fragment, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderList, renderSlot, toDisplayString, unref, useModel, withCtx, withModifiers } from "vue";
|
|
3
3
|
import { bem } from "@veltra/utils";
|
|
4
4
|
import { useFallbackProps } from "@veltra/compositions";
|
|
5
5
|
import { Close } from "@veltra/icons/normal";
|
|
@@ -68,7 +68,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
68
68
|
unref(bem).is("disabled", item.disabled === true)
|
|
69
69
|
]),
|
|
70
70
|
onClick: withModifiers(($event) => handleClick(item, index), ["stop"])
|
|
71
|
-
}, [createElementVNode("span", { class: normalizeClass(unref(cls).e("item-label")) }, toDisplayString(item.name ?? item.key), 3), isItemClosable(item) ? (openBlock(), createElementBlock("span", {
|
|
71
|
+
}, [renderSlot(_ctx.$slots, `name:${item.key}`, { item }, () => [createElementVNode("span", { class: normalizeClass(unref(cls).e("item-label")) }, toDisplayString(item.name ?? item.key), 3)]), isItemClosable(item) ? (openBlock(), createElementBlock("span", {
|
|
72
72
|
key: 0,
|
|
73
73
|
role: "button",
|
|
74
74
|
tabindex: "0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'TabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot :name=\"`name:${item.key}`\" :item=\"item\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'TabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,MAAM,EAAE,EACzC,MAAM,WACP,CAAA;EAED,MAAM,MAAM,IAAI,WAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,aAAC;EAElC,MAAM,kBAAkB,SAAkB;AACxC,OAAI,KAAK,SAAU,QAAO;AAC1B,UAAO,KAAK,YAAY,MAAM;;EAGhC,MAAM,eAAe,MAAe,UAAkB;AACpD,OAAI,KAAK,SAAU;AACnB,SAAM,QAAQ,KAAK;AACnB,QAAK,SAAS,MAAM,MAAK;;EAG3B,MAAM,eAAe,MAAe,UAAkB;AACpD,OAAI,KAAK,SAAU;AACnB,QAAK,SAAS,MAAM,MAAK;;;uBAzEzB,mBA+BM,OAAA,EA9BH,OAAK,eAAA;IAAG,MAAA,IAAG,CAAC;IAAG,MAAA,IAAG,CAAC,EAAC,WAAA;IAAc,MAAA,IAAG,CAAC,EAAE,QAAA,SAAQ;IAAG,MAAA,IAAG,CAAC,EAAE,MAAA,KAAI,CAAA;IAAG,MAAA,IAAG,CAAC,GAAE,WAAY,QAAA,QAAO;IAAA,CAAA,EAAA,EAAA,EAAA,UAAA,KAAA,EAE1F,mBA2BS,UAAA,MAAA,WAxBiB,QAAA,QAAhB,MAAM,UAAK;wBAHrB,mBA2BS,UAAA;KA1BP,MAAK;KACL,MAAK;KAEJ,KAAK,KAAK;KACV,OAAK,eAAA;MAAY,MAAA,IAAG,CAAC,EAAC,OAAA;MAAkB,MAAA,IAAG,CAAC,GAAE,UAAW,MAAA,UAAU,KAAK,IAAG;MAAW,MAAA,IAAG,CAAC,GAAE,YAAa,KAAK,aAAQ,KAAA;;KAKtH,SAAK,eAAA,WAAO,YAAY,MAAM,MAAK,EAAA,CAAA,OAAA,CAAA;QAEpC,WAEO,KAAA,QAAA,QAFc,KAAK,OAAG,EAAW,MAAI,QAErC,CADL,mBAAqE,QAAA,EAA9D,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,aAAA,CAAA,EAAA,EAAA,gBAAmB,KAAK,QAAQ,KAAK,IAAG,EAAA,EAAA,CAAA,CAAA,EAGrD,eAAe,KAAI,IAAA,WAAA,EAD3B,mBAWO,QAAA;;KATL,MAAK;KACL,UAAS;KACR,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,QAAA,CAAA;KACZ,cAAU,SAAW,KAAK,QAAQ,KAAK;KACvC,SAAK,eAAA,WAAO,YAAY,MAAM,MAAK,EAAA,CAAA,OAAA,CAAA;QAEpC,YAES,MAAA,YAAA,EAAA,MAAA;4BADE,CAAT,YAAS,MAAA,MAAA,CAAA,CAAA,CAAA"}
|
|
@@ -7,22 +7,32 @@ type __VLS_ModelProps = {
|
|
|
7
7
|
modelValue?: string;
|
|
8
8
|
};
|
|
9
9
|
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
10
|
-
declare
|
|
10
|
+
declare var __VLS_2: `name:${string}`, __VLS_3: {
|
|
11
|
+
item: TabItem;
|
|
12
|
+
};
|
|
13
|
+
type __VLS_Slots = {} & { [K in NonNullable<typeof __VLS_2>]?: (props: typeof __VLS_3) => any };
|
|
14
|
+
declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {
|
|
11
15
|
"update:modelValue": (value: string | undefined) => any;
|
|
12
16
|
} & {
|
|
13
|
-
click: (item: TabItem, index: number) => any;
|
|
14
17
|
"update:modelValue": (value: string) => any;
|
|
15
18
|
close: (item: TabItem, index: number) => any;
|
|
19
|
+
click: (item: TabItem, index: number) => any;
|
|
16
20
|
}, string, _$vue.PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
17
|
-
onClick?: ((item: TabItem, index: number) => any) | undefined;
|
|
18
21
|
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
19
22
|
onClose?: ((item: TabItem, index: number) => any) | undefined;
|
|
23
|
+
onClick?: ((item: TabItem, index: number) => any) | undefined;
|
|
20
24
|
}>, {
|
|
21
25
|
closable: boolean;
|
|
22
26
|
position: "left" | "right";
|
|
23
27
|
rounded: boolean;
|
|
24
28
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
29
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
25
30
|
declare const _default: typeof __VLS_export;
|
|
31
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
32
|
+
new (): {
|
|
33
|
+
$slots: S;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
26
36
|
//#endregion
|
|
27
37
|
export { _default };
|
|
28
38
|
//# sourceMappingURL=tabs-vertical.vue.d.ts.map
|
|
@@ -10,13 +10,13 @@ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
|
10
10
|
declare const __VLS_export: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {
|
|
11
11
|
"update:modelValue": (value: string | undefined) => any;
|
|
12
12
|
} & {
|
|
13
|
-
click: (item: TabItem, index: number) => any;
|
|
14
13
|
"update:modelValue": (value: string) => any;
|
|
15
14
|
close: (item: TabItem, index: number) => any;
|
|
15
|
+
click: (item: TabItem, index: number) => any;
|
|
16
16
|
}, string, _$vue.PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
17
|
-
onClick?: ((item: TabItem, index: number) => any) | undefined;
|
|
18
17
|
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
19
18
|
onClose?: ((item: TabItem, index: number) => any) | undefined;
|
|
19
|
+
onClick?: ((item: TabItem, index: number) => any) | undefined;
|
|
20
20
|
}>, {
|
|
21
21
|
block: boolean;
|
|
22
22
|
closable: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({\n name: 'Text'\n})\n\nconst props = withDefaults(defineProps<TextProps>(), {\n as: 'content'\n})\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = {\n fontSize: withUnit(props.fontSize, 'px')\n }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAiBA,MAAM,QAAQ;EAId,MAAM,MAAM,IAAI,OAAM;EAEtB,MAAM,YAAY,eAAe;AAC/B,UAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,GAAG;IAAE,IAAI,GAAG,QAAQ,MAAM,KAAK;IAAE,IAAI,GAAG,UAAU,MAAM,OAAO;IAAA;IAC5F;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAC3B,UAAU,SAAS,MAAM,UAAU,KAAI,EACzC;GACA,MAAM,EAAE,SAAS,cAAc;AAC/B,OAAI,QACF,OAAM,iBAAiB;AAEzB,OAAI,UACF,OAAM,iBAAiB;AAGzB,UAAO;IACR;EAED,MAAM,QAAQ,UAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,WAAU;AAC9B,OAAI,CAAC,OAAO,OAAQ,QAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,KAAK,CAAA;GAEzD,MAAM,EAAE,cAAc;AAEtB,OAAI,CAAC,UACH,QAAO;AAGT,UAAO,UAAU,QAAQ,OAAO,aAAa;AAC5B,uBACb,SAAS,UACT,MAAM,QAAQ,UAAU,GAAG,YAAY,CAAC,UAAS,
|
|
1
|
+
{"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({\n name: 'Text'\n})\n\nconst props = withDefaults(defineProps<TextProps>(), {\n as: 'content'\n})\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = {\n fontSize: withUnit(props.fontSize, 'px')\n }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAiBA,MAAM,QAAQ;EAId,MAAM,MAAM,IAAI,OAAM;EAEtB,MAAM,YAAY,eAAe;AAC/B,UAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,GAAG;IAAE,IAAI,GAAG,QAAQ,MAAM,KAAK;IAAE,IAAI,GAAG,UAAU,MAAM,OAAO;IAAA;IAC5F;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAC3B,UAAU,SAAS,MAAM,UAAU,KAAI,EACzC;GACA,MAAM,EAAE,SAAS,cAAc;AAC/B,OAAI,QACF,OAAM,iBAAiB;AAEzB,OAAI,UACF,OAAM,iBAAiB;AAGzB,UAAO;IACR;EAED,MAAM,QAAQ,UAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,WAAU;AAC9B,OAAI,CAAC,OAAO,OAAQ,QAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,KAAK,CAAA;GAEzD,MAAM,EAAE,cAAc;AAEtB,OAAI,CAAC,UACH,QAAO;AAGT,UAAO,UAAU,QAAQ,OAAO,aAAa;AAC5B,uBACb,SAAS,UACT,MAAM,QAAQ,UAAU,GAAG,YAAY,CAAC,UAAS,CAGnD,CAAO,SAAS,UAAU;AACxB,SAAI,MAAM,UACR,OAAM,KAAK,EAAE,QAAQ,MAAM,KAAK,CAAA;SAEhC,OAAM,KAAK,gBAAgB,MAAM,KAAK,CAAA;MAEzC;AAED,WAAO;MACN,EAAE,CAAW;;;uBAtEhB,mBAEI,KAAA;IAFA,OAAK,eAAE,UAAA,MAAS;IAAG,OAAK,eAAE,MAAA,MAAK;OACjC,YAAkD,MAAA,WAAA,EAAA;IAApC,SAAS,cAAY;IAAI,KAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n :class=\"textareaClass\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n >\n <textarea\n :class=\"cls.e('native')\"\n :placeholder=\"placeholder\"\n v-model=\"model\"\n :maxlength=\"maxlength\"\n :rows=\"rows\"\n :cols=\"cols\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @change=\"handleChange\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n ref=\"textareaRef\"\n />\n <span v-if=\"props.maxlength && props.showCount\" :class=\"cls.m('count')\">\n {{ initNum }}/{{ props.maxlength }}\n </span>\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"props.clearable && model! && hovered && !disabled && !readonly\"\n :class=\"cls.m('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n </Transition>\n </div>\n\n <span v-else style=\"white-space: pre-wrap\">\n {{ model || FORM_EMPTY_CONTENT }}\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFocus, useFormComponent, useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, ref, shallowRef, watch } from 'vue'\n\nimport type { TextareaProps, TextareaEmits, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { calcTextareaHeight } from './utils'\n\ndefineOptions({\n name: 'Textarea'\n})\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '请输入',\n resize: true,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n autosize: false\n})\n\nconst cls = bem('textarea')\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n disabled: false,\n readonly: false\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\nconst model = defineModel<string>()\n\nconst hovered = shallowRef(false)\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n focused ? emit('focus') : emit('blur')\n})\n\nconst textareaClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('resize-none', !props.resize),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value),\n cls.m('more')\n ]\n})\n\nconst handleInput = (e: Event) => {\n const value = (e.target as HTMLTextAreaElement).value\n if (value.length > props.maxlength!) {\n // 如果输入的字符数超过了最大长度,截取字符串到最大长度\n const truncatedValue = value.slice(0, props.maxlength)\n emit('update:modelValue', truncatedValue)\n } else {\n // 如果没有超过最大长度,则正常更新模型值\n emit('update:modelValue', value)\n }\n}\n\nconst initNum = computed(() => {\n if (!props.maxlength) return 0\n return props.maxlength - (model.value?.length ?? 0)\n})\n\nconst handleClear = () => {\n model.value = ''\n emit('clear')\n}\n\nconst handleChange = (e: Event) => {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nwatch(\n [model, textareaRef],\n ([model, textareaRef]) => {\n if (!textareaRef) return\n if (!props.autosize) return\n calcTextareaHeight(textareaRef)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuDA,MAAM,QAAQ;EASd,MAAM,MAAM,IAAI,WAAU;EAE1B,MAAM,EAAE,cAAc,kBAAiB;EAEvC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE;GAClF,MAAM;GACN,UAAU;GACV,UAAU;GACX,CAAA;EAED,MAAM,OAAO;EAEb,MAAM,cAAc,IAAgC,KAAI;EAExD,MAAM,QAAQ,SAAmB,SAAA,aAAC;EAElC,MAAM,UAAU,WAAW,MAAK;EAEhC,MAAM,EAAE,OAAO,YAAY,gBAAgB,UAAU,YAAY;AAC/D,aAAU,KAAK,QAAQ,GAAG,KAAK,OAAM;IACtC;EAED,MAAM,gBAAgB,eAAe;AACnC,UAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,MAAM;IACjB,IAAI,GAAG,eAAe,CAAC,MAAM,OAAO;IACpC,IAAI,GAAG,YAAY,SAAS,MAAM;IAClC,IAAI,GAAG,YAAY,SAAS,MAAM;IAClC,IAAI,GAAG,SAAS,MAAM,MAAM;IAC5B,IAAI,EAAE,OAAM;IACd;IACD;EAED,MAAM,eAAe,MAAa;GAChC,MAAM,QAAS,EAAE,OAA+B;AAChD,OAAI,MAAM,SAAS,MAAM,UAGvB,MAAK,qBADkB,MAAM,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n :class=\"textareaClass\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n >\n <textarea\n :class=\"cls.e('native')\"\n :placeholder=\"placeholder\"\n v-model=\"model\"\n :maxlength=\"maxlength\"\n :rows=\"rows\"\n :cols=\"cols\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @change=\"handleChange\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n ref=\"textareaRef\"\n />\n <span v-if=\"props.maxlength && props.showCount\" :class=\"cls.m('count')\">\n {{ initNum }}/{{ props.maxlength }}\n </span>\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"props.clearable && model! && hovered && !disabled && !readonly\"\n :class=\"cls.m('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n </Transition>\n </div>\n\n <span v-else style=\"white-space: pre-wrap\">\n {{ model || FORM_EMPTY_CONTENT }}\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFocus, useFormComponent, useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, ref, shallowRef, watch } from 'vue'\n\nimport type { TextareaProps, TextareaEmits, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { calcTextareaHeight } from './utils'\n\ndefineOptions({\n name: 'Textarea'\n})\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '请输入',\n resize: true,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n autosize: false\n})\n\nconst cls = bem('textarea')\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n disabled: false,\n readonly: false\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\nconst model = defineModel<string>()\n\nconst hovered = shallowRef(false)\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n focused ? emit('focus') : emit('blur')\n})\n\nconst textareaClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('resize-none', !props.resize),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value),\n cls.m('more')\n ]\n})\n\nconst handleInput = (e: Event) => {\n const value = (e.target as HTMLTextAreaElement).value\n if (value.length > props.maxlength!) {\n // 如果输入的字符数超过了最大长度,截取字符串到最大长度\n const truncatedValue = value.slice(0, props.maxlength)\n emit('update:modelValue', truncatedValue)\n } else {\n // 如果没有超过最大长度,则正常更新模型值\n emit('update:modelValue', value)\n }\n}\n\nconst initNum = computed(() => {\n if (!props.maxlength) return 0\n return props.maxlength - (model.value?.length ?? 0)\n})\n\nconst handleClear = () => {\n model.value = ''\n emit('clear')\n}\n\nconst handleChange = (e: Event) => {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nwatch(\n [model, textareaRef],\n ([model, textareaRef]) => {\n if (!textareaRef) return\n if (!props.autosize) return\n calcTextareaHeight(textareaRef)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":"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"}
|
|
@@ -11,22 +11,22 @@ declare const __VLS_export: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {},
|
|
|
11
11
|
"update:modelValue": (value: string | undefined) => any;
|
|
12
12
|
} & {
|
|
13
13
|
"update:modelValue": (value: string) => any;
|
|
14
|
-
clear: () => any;
|
|
15
14
|
change: (value: string) => any;
|
|
15
|
+
clear: () => any;
|
|
16
16
|
focus: () => any;
|
|
17
17
|
blur: () => any;
|
|
18
18
|
}, string, _$vue.PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
19
19
|
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
20
|
-
onClear?: (() => any) | undefined;
|
|
21
20
|
onChange?: ((value: string) => any) | undefined;
|
|
21
|
+
onClear?: (() => any) | undefined;
|
|
22
22
|
onFocus?: (() => any) | undefined;
|
|
23
23
|
onBlur?: (() => any) | undefined;
|
|
24
24
|
}>, {
|
|
25
25
|
disabled: boolean;
|
|
26
26
|
readonly: boolean;
|
|
27
|
+
resize: boolean;
|
|
27
28
|
placeholder: string;
|
|
28
29
|
clearable: boolean;
|
|
29
|
-
resize: boolean;
|
|
30
30
|
autosize: boolean;
|
|
31
31
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
32
32
|
declare const _default: typeof __VLS_export;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":[],"sources":["../../../src/components/theme/theme.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <div :class=\"cls.e('header')\">\n <div :class=\"cls.e('header-copy')\">\n <strong>主题变量配置</strong>\n </div>\n <div :class=\"cls.e('tags')\">\n <span :class=\"cls.e('tag')\">基线 {{ baselineLabel }}</span>\n <span :class=\"cls.e('tag')\">{{ changedFieldKeys.size }} 改动</span>\n </div>\n </div>\n\n <div :class=\"cls.e('toolbar')\">\n <u-input\n v-model=\"keyword\"\n :class=\"cls.e('search')\"\n placeholder=\"搜索变量名、中文标签或分组\"\n />\n\n <button\n type=\"button\"\n :class=\"[cls.e('toggle'), bem.is('active', changedOnly)]\"\n @click=\"changedOnly = !changedOnly\"\n >\n {{ changedOnly ? '查看全部' : '仅看改动' }}\n </button>\n </div>\n\n <div :class=\"cls.e('body')\">\n <div :class=\"cls.e('nav')\">\n <button\n v-for=\"section in sectionStates\"\n :key=\"section.key\"\n type=\"button\"\n :class=\"[\n cls.e('nav-item'),\n bem.is('active', activeSection === section.key),\n bem.is('disabled', !section.visibleFields.length)\n ]\"\n @click=\"activeSection = section.key\"\n >\n <span :class=\"cls.e('nav-main')\">{{ section.title }}</span>\n <span :class=\"cls.e('nav-meta')\">\n {{ section.visibleFields.length }}/{{ section.fields.length }}\n <template v-if=\"section.changedCount\"> · {{ section.changedCount }} 改动 </template>\n </span>\n </button>\n </div>\n\n <div :class=\"cls.e('panel')\">\n <div v-if=\"activeState\" :class=\"cls.e('panel-head')\">\n <div>\n <h4 :class=\"cls.e('panel-title')\">{{ activeState.title }}</h4>\n <p :class=\"cls.e('panel-desc')\">{{ activeState.description }}</p>\n </div>\n\n <div :class=\"cls.e('panel-count')\">{{ activeState.visibleFields.length }} 项</div>\n </div>\n\n <div v-if=\"activeState?.visibleFields.length\" :class=\"cls.e('list')\">\n <div\n v-for=\"field in activeState.visibleFields\"\n :key=\"field.key\"\n :class=\"[cls.e('item'), bem.is('changed', isFieldChanged(field))]\"\n >\n <div :class=\"cls.e('item-head')\">\n <div :class=\"cls.e('item-copy')\">\n <label :class=\"cls.e('item-label')\">{{ field.label }}</label>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">Theme</span>\n <code :class=\"cls.e('item-code')\">{{ getThemePath(field.path) }}</code>\n </div>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">CSS</span>\n <code :class=\"cls.e('item-code')\">{{ getCssVarName(field.path) }}</code>\n </div>\n </div>\n\n <span v-if=\"isFieldChanged(field)\" :class=\"cls.e('item-badge')\"> 已修改 </span>\n </div>\n\n <div v-if=\"field.kind === 'palette'\" :class=\"cls.e('palette-field')\">\n <template v-if=\"field.path[0] === 'color'\">\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"String(getFieldValue(field) ?? '')\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"例如:#1E88E5\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n </template>\n <template v-else>\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? ''\n : String(getFieldValue(field) ?? '')\n \"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"输入颜色或变量\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n <div :class=\"cls.e('palette-var')\">\n <span :class=\"cls.e('palette-var-label')\">或选择变量</span>\n <u-select\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? String(getFieldValue(field) ?? '')\n : ''\n \"\n :options=\"colorVarOptions\"\n clearable\n placeholder=\"选择预设变量\"\n @update:model-value=\"(value) => updateField(field, value ?? '')\"\n >\n <template #default=\"{ option }\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n :style=\"`width: 14px; height: 14px; border-radius: 4px; background: ${option.value}`\"\n />\n <span style=\"font-size: 13px\">{{ option.label }}</span>\n </div>\n </template>\n </u-select>\n </div>\n </template>\n </div>\n\n <component\n v-else\n :is=\"getFieldComponent(field)\"\n :model-value=\"getFieldValue(field)\"\n v-bind=\"getFieldProps(field)\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n\n <p v-if=\"field.hint || field.placeholder\" :class=\"cls.e('item-hint')\">\n {{ field.hint ?? field.placeholder }}\n </p>\n </div>\n </div>\n\n <div v-else :class=\"cls.e('empty')\">\n <strong>没有匹配项</strong>\n <p>换一个关键字,或关闭“仅看改动”后再继续筛选。</p>\n </div>\n </div>\n </div>\n\n <div :class=\"cls.e('actions')\">\n <div :class=\"cls.e('preset-group')\">\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('light')\">\n 浅色预设\n </button>\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('dark')\">\n 深色预设\n </button>\n </div>\n\n <u-button :class=\"cls.e('action-btn')\" @click=\"handleResetTheme\"> 重置 </u-button>\n <u-button :class=\"cls.e('action-btn')\" type=\"primary\" @click=\"handleExportTheme\">\n 导出\n </u-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n type Theme,\n UITheme,\n currentTheme,\n darkTheme,\n lightTheme,\n loadTheme\n} from '@veltra/styles/theme'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef, watch, watchEffect } from 'vue'\n\nimport type { ThemeProps, _ThemeExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { UNumberInput } from '../number-input'\nimport { UPalette } from '../palette'\nimport { USelect } from '../select'\nimport { THEME_SECTIONS } from './schema'\nimport type { ThemeField } from './schema'\n\ndefineOptions({\n name: 'UTheme'\n})\n\nconst props = defineProps<ThemeProps>()\n\nconst cls = bem('theme')\n\nconst keyword = shallowRef('')\nconst changedOnly = shallowRef(false)\nconst activeSection = shallowRef(THEME_SECTIONS[0]!.key)\n\nconst colorVarOptions = computed(() => {\n const options: { label: string; value: string }[] = []\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (field.kind === 'palette') {\n const varName = `var(${getCssVarName(field.path)})`\n options.push({\n label: `${field.label}`,\n value: varName\n })\n }\n })\n })\n return options\n})\n\nconst editorTheme = shallowRef<UITheme>()\nconst baselineTheme = shallowRef<Theme>(createThemeSnapshot(lightTheme.theme))\nconst baselineLabel = shallowRef('浅色预设')\n\nconst lightPreset = createThemeSnapshot(lightTheme.theme)\nconst darkPreset = createThemeSnapshot(darkTheme.theme)\n\nconst sourceTheme = computed(() => {\n return props.theme ?? currentTheme.value ?? lightTheme\n})\n\nwatch(\n sourceTheme,\n (theme) => {\n if (!props.theme && theme === editorTheme.value) return\n\n const nextTheme = props.theme ? theme : new UITheme(createThemeSnapshot(theme.theme))\n\n editorTheme.value = nextTheme\n baselineTheme.value = createThemeSnapshot(nextTheme.theme)\n baselineLabel.value =\n theme === darkTheme\n ? '深色预设'\n : theme === lightTheme\n ? '浅色预设'\n : props.theme\n ? '外部主题'\n : '当前主题'\n\n if (!props.theme && currentTheme.value !== nextTheme) {\n loadTheme(nextTheme)\n }\n },\n { immediate: true }\n)\n\nconst changedFieldKeys = computed(() => {\n const keys = new Set<string>()\n\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (\n getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path) !==\n getByPath(baselineTheme.value, field.path)\n ) {\n keys.add(field.key)\n }\n })\n })\n\n return keys\n})\n\nconst sectionStates = computed(() => {\n const normalizedKeyword = keyword.value.trim().toLowerCase()\n\n return THEME_SECTIONS.map((section) => {\n const sectionMatched = `${section.title} ${section.description}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n const visibleFields = section.fields.filter((field) => {\n const matchesKeyword =\n !normalizedKeyword ||\n sectionMatched ||\n `${field.label} ${field.key} ${getThemePath(field.path)} ${getCssVarName(field.path)}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n if (!matchesKeyword) return false\n\n if (changedOnly.value && !changedFieldKeys.value.has(field.key)) {\n return false\n }\n\n return true\n })\n\n const changedCount = section.fields.filter((field) => {\n return changedFieldKeys.value.has(field.key)\n }).length\n\n return {\n ...section,\n visibleFields,\n changedCount\n }\n })\n})\n\nwatchEffect(() => {\n const current = sectionStates.value.find((section) => {\n return section.key === activeSection.value && section.visibleFields.length\n })\n\n if (current) return\n\n activeSection.value =\n sectionStates.value.find((section) => section.visibleFields.length)?.key ??\n THEME_SECTIONS[0]!.key\n})\n\nconst activeState = computed(() => {\n return (\n sectionStates.value.find((section) => section.key === activeSection.value) ??\n sectionStates.value[0]\n )\n})\n\nfunction createThemeSnapshot(theme: Theme): Theme {\n return JSON.parse(JSON.stringify(theme)) as Theme\n}\n\nfunction getByPath(source: Record<string, any>, path: string[]) {\n return path.reduce((current, key) => current?.[key], source)\n}\n\nfunction setByPath(source: Record<string, any>, path: string[], value: any) {\n let current = source\n\n path.slice(0, -1).forEach((key) => {\n current = current[key]\n })\n\n current[path[path.length - 1]!] = value\n}\n\nfunction getCssVarName(path: string[]) {\n return `--u-${path.join('-')}`\n}\n\nfunction getThemePath(path: string[]) {\n return path.reduce((expression, key) => {\n if (/^[A-Za-z_$][\\w$]*$/.test(key)) {\n return `${expression}.${key}`\n }\n\n return `${expression}['${key}']`\n }, 'theme')\n}\n\nfunction getFieldComponent(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return UNumberInput\n case 'select':\n return USelect\n default:\n return UInput\n }\n}\n\nfunction getFieldValue(field: ThemeField) {\n return getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path)\n}\n\nfunction getFieldProps(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return {\n min: field.min,\n max: field.max,\n step: field.step,\n suffix: field.suffix\n }\n case 'select':\n return {\n options: field.options,\n clearable: false,\n placeholder: '请选择'\n }\n case 'input':\n return {\n placeholder: field.placeholder\n }\n default:\n return {}\n }\n}\n\nfunction updateField(field: ThemeField, value: string | number | undefined) {\n if (!editorTheme.value) return\n\n const normalizedValue =\n field.kind === 'number'\n ? typeof value === 'number'\n ? value\n : Number(value || 0)\n : String(value ?? '')\n\n setByPath(editorTheme.value.theme, field.path, normalizedValue)\n editorTheme.value.render()\n}\n\nfunction isFieldChanged(field: ThemeField) {\n return changedFieldKeys.value.has(field.key)\n}\n\nfunction applySnapshot(snapshot: Theme, label?: string) {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(snapshot))\n baselineTheme.value = createThemeSnapshot(editorTheme.value.theme)\n\n if (label) {\n baselineLabel.value = label\n }\n\n editorTheme.value.render()\n}\n\nfunction applyPreset(type: 'light' | 'dark') {\n applySnapshot(\n type === 'dark' ? darkPreset : lightPreset,\n type === 'dark' ? '深色预设' : '浅色预设'\n )\n}\n\nfunction handleResetTheme() {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(baselineTheme.value))\n editorTheme.value.render()\n}\n\nfunction handleExportTheme() {\n if (!editorTheme.value) return\n\n const themeConfig = JSON.stringify(createThemeSnapshot(editorTheme.value.theme), null, 2)\n const blob = new Blob([themeConfig], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'theme-config.json'\n a.click()\n URL.revokeObjectURL(url)\n}\n\ndefineExpose<_ThemeExposed>({\n reset: handleResetTheme,\n exportTheme: handleExportTheme,\n applyLightPreset: () => applyPreset('light'),\n applyDarkPreset: () => applyPreset('dark')\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAyMA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,QAAO;EAEvB,MAAM,UAAU,WAAW,GAAE;EAC7B,MAAM,cAAc,WAAW,MAAK;EACpC,MAAM,gBAAgB,WAAW,eAAe,GAAI,IAAG;EAEvD,MAAM,kBAAkB,eAAe;GACrC,MAAM,UAA8C,EAAC;AACrD,kBAAe,SAAS,YAAY;AAClC,YAAQ,OAAO,SAAS,UAAU;AAChC,SAAI,MAAM,SAAS,WAAW;MAC5B,MAAM,UAAU,OAAO,cAAc,MAAM,KAAK,CAAC;AACjD,cAAQ,KAAK;OACX,OAAO,GAAG,MAAM;OAChB,OAAO;OACR,CAAA;;MAEJ;KACF;AACD,UAAO;IACR;EAED,MAAM,cAAc,YAAoB;EACxC,MAAM,gBAAgB,WAAkB,oBAAoB,WAAW,MAAM,CAAA;EAC7E,MAAM,gBAAgB,WAAW,OAAM;EAEvC,MAAM,cAAc,oBAAoB,WAAW,MAAK;EACxD,MAAM,aAAa,oBAAoB,UAAU,MAAK;AAMtD,QAJoB,eAAe;AACjC,UAAO,MAAM,SAAS,aAAa,SAAS;IAC7C,GAIE,UAAU;AACT,OAAI,CAAC,MAAM,SAAS,UAAU,YAAY,MAAO;GAEjD,MAAM,YAAY,MAAM,QAAQ,QAAQ,IAAI,QAAQ,oBAAoB,MAAM,MAAM,CAAA;AAEpF,eAAY,QAAQ;AACpB,iBAAc,QAAQ,oBAAoB,UAAU,MAAK;AACzD,iBAAc,QACZ,UAAU,YACN,SACA,UAAU,aACR,SACA,MAAM,QACJ,SACA;AAEV,OAAI,CAAC,MAAM,SAAS,aAAa,UAAU,UACzC,WAAU,UAAS;KAGvB,EAAE,WAAW,MAAK,CACpB;EAEA,MAAM,mBAAmB,eAAe;GACtC,MAAM,uBAAO,IAAI,KAAY;AAE7B,kBAAe,SAAS,YAAY;AAClC,YAAQ,OAAO,SAAS,UAAU;AAChC,SACE,UAAU,YAAY,OAAO,SAAS,WAAW,OAAO,MAAM,KAAK,KACnE,UAAU,cAAc,OAAO,MAAM,KAAI,CAEzC,MAAK,IAAI,MAAM,IAAG;MAErB;KACF;AAED,UAAO;IACR;EAED,MAAM,gBAAgB,eAAe;GACnC,MAAM,oBAAoB,QAAQ,MAAM,MAAM,CAAC,aAAY;AAE3D,UAAO,eAAe,KAAK,YAAY;IACrC,MAAM,iBAAiB,GAAG,QAAQ,MAAM,GAAG,QAAQ,cAChD,aAAY,CACZ,SAAS,kBAAiB;IAE7B,MAAM,gBAAgB,QAAQ,OAAO,QAAQ,UAAU;AAQrD,SAAI,EANF,CAAC,qBACD,kBACA,GAAG,MAAM,MAAM,GAAG,MAAM,IAAI,GAAG,aAAa,MAAM,KAAK,CAAC,GAAG,cAAc,MAAM,KAAK,GACjF,aAAY,CACZ,SAAS,kBAAiB,EAEV,QAAO;AAE5B,SAAI,YAAY,SAAS,CAAC,iBAAiB,MAAM,IAAI,MAAM,IAAI,CAC7D,QAAO;AAGT,YAAO;MACR;IAED,MAAM,eAAe,QAAQ,OAAO,QAAQ,UAAU;AACpD,YAAO,iBAAiB,MAAM,IAAI,MAAM,IAAG;MAC3C,CAAC;AAEH,WAAO;KACL,GAAG;KACH;KACA;KACF;KACD;IACF;AAED,oBAAkB;AAKhB,OAJgB,cAAc,MAAM,MAAM,YAAY;AACpD,WAAO,QAAQ,QAAQ,cAAc,SAAS,QAAQ,cAAc;KACrE,CAEY;AAEb,iBAAc,QACZ,cAAc,MAAM,MAAM,YAAY,QAAQ,cAAc,OAAO,EAAE,OACrE,eAAe,GAAI;IACtB;EAED,MAAM,cAAc,eAAe;AACjC,UACE,cAAc,MAAM,MAAM,YAAY,QAAQ,QAAQ,cAAc,MAAM,IAC1E,cAAc,MAAM;IAEvB;EAED,SAAS,oBAAoB,OAAqB;AAChD,UAAO,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;;EAG1C,SAAS,UAAU,QAA6B,MAAgB;AAC9D,UAAO,KAAK,QAAQ,SAAS,QAAQ,UAAU,MAAM,OAAM;;EAG7D,SAAS,UAAU,QAA6B,MAAgB,OAAY;GAC1E,IAAI,UAAU;AAEd,QAAK,MAAM,GAAG,GAAG,CAAC,SAAS,QAAQ;AACjC,cAAU,QAAQ;KACnB;AAED,WAAQ,KAAK,KAAK,SAAS,MAAO;;EAGpC,SAAS,cAAc,MAAgB;AACrC,UAAO,OAAO,KAAK,KAAK,IAAI;;EAG9B,SAAS,aAAa,MAAgB;AACpC,UAAO,KAAK,QAAQ,YAAY,QAAQ;AACtC,QAAI,qBAAqB,KAAK,IAAI,CAChC,QAAO,GAAG,WAAW,GAAG;AAG1B,WAAO,GAAG,WAAW,IAAI,IAAI;MAC5B,QAAO;;EAGZ,SAAS,kBAAkB,OAAmB;AAC5C,WAAQ,MAAM,MAAd;IACE,KAAK,SACH,QAAO;IACT,KAAK,SACH,QAAO;IACT,QACE,QAAO;;;EAIb,SAAS,cAAc,OAAmB;AACxC,UAAO,UAAU,YAAY,OAAO,SAAS,WAAW,OAAO,MAAM,KAAI;;EAG3E,SAAS,cAAc,OAAmB;AACxC,WAAQ,MAAM,MAAd;IACE,KAAK,SACH,QAAO;KACL,KAAK,MAAM;KACX,KAAK,MAAM;KACX,MAAM,MAAM;KACZ,QAAQ,MAAM;KAChB;IACF,KAAK,SACH,QAAO;KACL,SAAS,MAAM;KACf,WAAW;KACX,aAAa;KACf;IACF,KAAK,QACH,QAAO,EACL,aAAa,MAAM,aACrB;IACF,QACE,QAAO,EAAC;;;EAId,SAAS,YAAY,OAAmB,OAAoC;AAC1E,OAAI,CAAC,YAAY,MAAO;GAExB,MAAM,kBACJ,MAAM,SAAS,WACX,OAAO,UAAU,WACf,QACA,OAAO,SAAS,EAAC,GACnB,OAAO,SAAS,GAAE;AAExB,aAAU,YAAY,MAAM,OAAO,MAAM,MAAM,gBAAe;AAC9D,eAAY,MAAM,QAAO;;EAG3B,SAAS,eAAe,OAAmB;AACzC,UAAO,iBAAiB,MAAM,IAAI,MAAM,IAAG;;EAG7C,SAAS,cAAc,UAAiB,OAAgB;AACtD,OAAI,CAAC,YAAY,MAAO;AAExB,UAAO,OAAO,YAAY,MAAM,OAAO,oBAAoB,SAAS,CAAA;AACpE,iBAAc,QAAQ,oBAAoB,YAAY,MAAM,MAAK;AAEjE,OAAI,MACF,eAAc,QAAQ;AAGxB,eAAY,MAAM,QAAO;;EAG3B,SAAS,YAAY,MAAwB;AAC3C,iBACE,SAAS,SAAS,aAAa,aAC/B,SAAS,SAAS,SAAS,OAC7B;;EAGF,SAAS,mBAAmB;AAC1B,OAAI,CAAC,YAAY,MAAO;AAExB,UAAO,OAAO,YAAY,MAAM,OAAO,oBAAoB,cAAc,MAAM,CAAA;AAC/E,eAAY,MAAM,QAAO;;EAG3B,SAAS,oBAAoB;AAC3B,OAAI,CAAC,YAAY,MAAO;GAExB,MAAM,cAAc,KAAK,UAAU,oBAAoB,YAAY,MAAM,MAAM,EAAE,MAAM,EAAC;GACxF,MAAM,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,oBAAoB,CAAA;GACjE,MAAM,MAAM,IAAI,gBAAgB,KAAI;GACpC,MAAM,IAAI,SAAS,cAAc,IAAG;AACpC,KAAE,OAAO;AACT,KAAE,WAAW;AACb,KAAE,OAAM;AACR,OAAI,gBAAgB,IAAG;;AAGzB,WAA4B;GAC1B,OAAO;GACP,aAAa;GACb,wBAAwB,YAAY,QAAQ;GAC5C,uBAAuB,YAAY,OAAM;GAC1C,CAAA;;uBAndC,mBA4KM,OAAA,EA5KA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,EAAA,EAAA;IAChB,mBAQM,OAAA,EARA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,SAAA,CAAA,EAAA,EAAA,CAChB,mBAEM,OAAA,EAFA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,cAAA,CAAA,EAAA,EAAA,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAChB,mBAAuB,UAAA,MAAf,UAAM,GAAA,CAAA,EAAA,EAAA,EAAA,EAEhB,mBAGM,OAAA,EAHA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,OAAA,CAAA,EAAA,EAAA,CAChB,mBAAyD,QAAA,EAAlD,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,MAAA,CAAA,EAAA,EAAS,QAAG,gBAAG,cAAA,MAAa,EAAA,EAAA,EAC/C,mBAAiE,QAAA,EAA1D,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,MAAA,CAAA,EAAA,EAAA,gBAAY,iBAAA,MAAiB,KAAI,GAAG,OAAG,EAAA,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA;IAI9D,mBAcM,OAAA,EAdA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,UAAA,CAAA,EAAA,EAAA,CAChB,YAIE,MAAA,cAAA,EAAA;iBAHS,QAAA;kEAAA,QAAO,QAAA;KACf,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,SAAA,CAAA;KACb,aAAY;0CAGd,mBAMS,UAAA;KALP,MAAK;KACJ,OAAK,eAAA,CAAG,MAAA,IAAG,CAAC,EAAC,SAAA,EAAY,MAAA,IAAG,CAAC,GAAE,UAAW,YAAA,MAAW,CAAA,CAAA;KACrD,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,YAAA,QAAW,CAAI,YAAA;uBAEpB,YAAA,QAAW,SAAA,OAAA,EAAA,EAAA,CAAA,EAAA,EAAA;IAIlB,mBAgIM,OAAA,EAhIA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,OAAA,CAAA,EAAA,EAAA,CAChB,mBAkBM,OAAA,EAlBA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,MAAA,CAAA,EAAA,EAAA,EAAA,UAAA,KAAA,EAChB,mBAgBS,UAAA,MAAA,WAfW,cAAA,QAAX,YAAO;yBADhB,mBAgBS,UAAA;MAdN,KAAK,QAAQ;MACd,MAAK;MACJ,OAAK,eAAA;OAAgB,MAAA,IAAG,CAAC,EAAC,WAAA;OAA0B,MAAA,IAAG,CAAC,GAAE,UAAW,cAAA,UAAkB,QAAQ,IAAG;OAAe,MAAA,IAAG,CAAC,GAAE,YAAA,CAAc,QAAQ,cAAc,OAAM;;MAKjK,UAAK,WAAE,cAAA,QAAgB,QAAQ;SAEhC,mBAA2D,QAAA,EAApD,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,WAAA,CAAA,EAAA,EAAA,gBAAiB,QAAQ,MAAK,EAAA,EAAA,EACjD,mBAGO,QAAA,EAHA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,WAAA,CAAA,EAAA,EAAA,CAAA,gBAAA,gBACd,QAAQ,cAAc,OAAM,GAAG,MAAC,gBAAG,QAAQ,OAAO,OAAM,GAAG,KAC9D,EAAA,EAAgB,QAAQ,gBAAA,WAAA,EAAxB,mBAAkF,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAA5C,QAAG,gBAAG,QAAQ,aAAY,GAAG,QAAI,EAAA,CAAA,EAAA,GAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,EAAA,EAAA,CAAA,EAAA,IAAA,WAAA;oBAK7E,mBA0GM,OAAA,EA1GA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,QAAA,CAAA,EAAA,EAAA,CACL,YAAA,SAAA,WAAA,EAAX,mBAOM,OAAA;;KAPmB,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,aAAA,CAAA;QACnC,mBAGM,OAAA,MAAA,CAFJ,mBAA8D,MAAA,EAAzD,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,cAAA,CAAA,EAAA,EAAA,gBAAoB,YAAA,MAAY,MAAK,EAAA,EAAA,EACtD,mBAAiE,KAAA,EAA7D,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,aAAA,CAAA,EAAA,EAAA,gBAAmB,YAAA,MAAY,YAAW,EAAA,EAAA,CAAA,CAAA,EAG5D,mBAAiF,OAAA,EAA3E,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,cAAA,CAAA,EAAA,EAAA,gBAAoB,YAAA,MAAY,cAAc,OAAM,GAAG,MAAE,EAAA,CAAA,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,EAGlE,YAAA,OAAa,cAAc,UAAA,WAAA,EAAtC,mBA0FM,OAAA;;KA1FyC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,OAAA,CAAA;0BACzD,mBAwFM,UAAA,MAAA,WAvFY,YAAA,MAAY,gBAArB,UAAK;yBADd,mBAwFM,OAAA;MAtFH,KAAK,MAAM;MACX,OAAK,eAAA,CAAG,MAAA,IAAG,CAAC,EAAC,OAAA,EAAU,MAAA,IAAG,CAAC,GAAE,WAAY,eAAe,MAAK,CAAA,CAAA,CAAA;;MAE9D,mBAcM,OAAA,EAdA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,YAAA,CAAA,EAAA,EAAA,CAChB,mBAUM,OAAA,EAVA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,YAAA,CAAA,EAAA,EAAA;OAChB,mBAA6D,SAAA,EAArD,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,aAAA,CAAA,EAAA,EAAA,gBAAmB,MAAM,MAAK,EAAA,EAAA;OAClD,mBAGM,OAAA,EAHA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,YAAA,CAAA,EAAA,EAAA,CAChB,mBAAoD,QAAA,EAA7C,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,kBAAA,CAAA,EAAA,EAAqB,SAAK,EAAA,EAC7C,mBAAuE,QAAA,EAAhE,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,YAAA,CAAA,EAAA,EAAA,gBAAkB,aAAa,MAAM,KAAI,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA;OAE9D,mBAGM,OAAA,EAHA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,YAAA,CAAA,EAAA,EAAA,CAChB,mBAAkD,QAAA,EAA3C,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,kBAAA,CAAA,EAAA,EAAqB,OAAG,EAAA,EAC3C,mBAAwE,QAAA,EAAjE,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,YAAA,CAAA,EAAA,EAAA,gBAAkB,cAAc,MAAM,KAAI,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA;aAIrD,eAAe,MAAK,IAAA,WAAA,EAAhC,mBAA4E,QAAA;;OAAxC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,aAAA,CAAA;SAAgB,SAAK,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,EAAA,EAAA;MAG5D,MAAM,SAAI,aAAA,WAAA,EAArB,mBAsDM,OAAA;;OAtDgC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,gBAAA,CAAA;UAChC,MAAM,KAAI,OAAA,WAAA,WAAA,EACxB,mBAUM,OAAA;;OAVA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,iBAAA,CAAA;UAChB,YAGE,MAAA,YAAA,EAAA;OAFC,eAAa,OAAO,cAAc,MAAK,IAAA,GAAA;OACvC,wBAAqB,UAAU,YAAY,OAAO,MAAK;2DAE1D,YAIE,MAAA,cAAA,EAAA;OAHC,eAAa,OAAO,cAAc,MAAK,IAAA,GAAA;OACxC,aAAY;OACX,wBAAqB,UAAU,YAAY,OAAO,MAAK;gFAI9D,mBAuCW,UAAA,EAAA,KAAA,GAAA,EAAA,CAtCT,mBAcM,OAAA,EAdA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,iBAAA,CAAA,EAAA,EAAA,CAChB,YAOE,MAAA,YAAA,EAAA;OANC,eAAoC,OAAO,cAAc,MAAK,IAAA,GAAA,CAAS,WAAU,MAAA,GAAA,KAA+D,OAAO,cAAc,MAAK,IAAA,GAAA;OAK1K,wBAAqB,UAAU,YAAY,OAAO,MAAK;2DAE1D,YAIE,MAAA,cAAA,EAAA;OAHC,eAAa,OAAO,cAAc,MAAK,IAAA,GAAA;OACxC,aAAY;OACX,wBAAqB,UAAU,YAAY,OAAO,MAAK;gEAG5D,mBAsBM,OAAA,EAtBA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,cAAA,CAAA,EAAA,EAAA,CAChB,mBAAsD,QAAA,EAA/C,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,oBAAA,CAAA,EAAA,EAAuB,SAAK,EAAA,EAC/C,YAmBW,MAAA,YAAA,EAAA;OAlBR,eAAoC,OAAO,cAAc,MAAK,IAAA,GAAA,CAAS,WAAU,MAAA,GAAkC,OAAO,cAAc,MAAK,IAAA,GAAA,GAAA;OAK7I,SAAS,gBAAA;OACV,WAAA;OACA,aAAY;OACX,wBAAqB,UAAU,YAAY,OAAO,SAAK,GAAA;;OAE7C,SAAO,SAMV,EANc,aAAM,CAC1B,mBAKM,OALN,YAKM,CAJJ,mBAEE,OAAA,EADC,OAAK,eAAA,8DAAgE,OAAO,QAAK,EAAA,EAAA,MAAA,EAAA,EAEpF,mBAAuD,QAAvD,YAAuD,gBAAtB,OAAO,MAAK,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;;;;;;2CAQzD,YAME,wBAJK,kBAAkB,MAAK,CAAA,EAF9B,WAME;;OAHC,eAAa,cAAc,MAAK;4BACzB,cAAc,MAAK,EAAA,EAC1B,wBAAqB,UAAU,YAAY,OAAO,MAAK,EAAA,CAAA,EAAA,MAAA,IAAA,CAAA,eAAA,sBAAA,CAAA;MAGjD,MAAM,QAAQ,MAAM,eAAA,WAAA,EAA7B,mBAEI,KAAA;;OAFuC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,YAAA,CAAA;yBAClD,MAAM,QAAQ,MAAM,YAAW,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA;;oCAKxC,mBAGM,OAAA;;KAHO,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,QAAA,CAAA;sCACvB,mBAAsB,UAAA,MAAd,SAAK,GAAA,EACb,mBAA8B,KAAA,MAA3B,2BAAuB,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA,EAAA,EAAA;IAKhC,mBAcM,OAAA,EAdA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,UAAA,CAAA,EAAA,EAAA;KAChB,mBAOM,OAAA,EAPA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,eAAA,CAAA,EAAA,EAAA,CAChB,mBAES,UAAA;MAFD,MAAK;MAAU,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,SAAA,CAAA;MAAa,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,YAAW,QAAA;QAAW,UAE7E,EAAA,EACA,mBAES,UAAA;MAFD,MAAK;MAAU,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,SAAA,CAAA;MAAa,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,YAAW,OAAA;QAAU,UAE5E,EAAA,CAAA,EAAA,EAAA;KAGF,YAAgF,MAAA,YAAA,EAAA;MAArE,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,aAAA,CAAA;MAAiB,SAAO;;6BAAsB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAJ,QAAI,GAAA,CAAA,EAAA,CAAA;;;KACrE,YAEW,MAAA,YAAA,EAAA;MAFA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,aAAA,CAAA;MAAgB,MAAK;MAAW,SAAO;;6BAE9D,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFiF,QAEjF,GAAA,CAAA,EAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"theme.js","names":[],"sources":["../../../src/components/theme/theme.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <div :class=\"cls.e('header')\">\n <div :class=\"cls.e('header-copy')\">\n <strong>主题变量配置</strong>\n </div>\n <div :class=\"cls.e('tags')\">\n <span :class=\"cls.e('tag')\">基线 {{ baselineLabel }}</span>\n <span :class=\"cls.e('tag')\">{{ changedFieldKeys.size }} 改动</span>\n </div>\n </div>\n\n <div :class=\"cls.e('toolbar')\">\n <u-input\n v-model=\"keyword\"\n :class=\"cls.e('search')\"\n placeholder=\"搜索变量名、中文标签或分组\"\n />\n\n <button\n type=\"button\"\n :class=\"[cls.e('toggle'), bem.is('active', changedOnly)]\"\n @click=\"changedOnly = !changedOnly\"\n >\n {{ changedOnly ? '查看全部' : '仅看改动' }}\n </button>\n </div>\n\n <div :class=\"cls.e('body')\">\n <div :class=\"cls.e('nav')\">\n <button\n v-for=\"section in sectionStates\"\n :key=\"section.key\"\n type=\"button\"\n :class=\"[\n cls.e('nav-item'),\n bem.is('active', activeSection === section.key),\n bem.is('disabled', !section.visibleFields.length)\n ]\"\n @click=\"activeSection = section.key\"\n >\n <span :class=\"cls.e('nav-main')\">{{ section.title }}</span>\n <span :class=\"cls.e('nav-meta')\">\n {{ section.visibleFields.length }}/{{ section.fields.length }}\n <template v-if=\"section.changedCount\"> · {{ section.changedCount }} 改动 </template>\n </span>\n </button>\n </div>\n\n <div :class=\"cls.e('panel')\">\n <div v-if=\"activeState\" :class=\"cls.e('panel-head')\">\n <div>\n <h4 :class=\"cls.e('panel-title')\">{{ activeState.title }}</h4>\n <p :class=\"cls.e('panel-desc')\">{{ activeState.description }}</p>\n </div>\n\n <div :class=\"cls.e('panel-count')\">{{ activeState.visibleFields.length }} 项</div>\n </div>\n\n <div v-if=\"activeState?.visibleFields.length\" :class=\"cls.e('list')\">\n <div\n v-for=\"field in activeState.visibleFields\"\n :key=\"field.key\"\n :class=\"[cls.e('item'), bem.is('changed', isFieldChanged(field))]\"\n >\n <div :class=\"cls.e('item-head')\">\n <div :class=\"cls.e('item-copy')\">\n <label :class=\"cls.e('item-label')\">{{ field.label }}</label>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">Theme</span>\n <code :class=\"cls.e('item-code')\">{{ getThemePath(field.path) }}</code>\n </div>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">CSS</span>\n <code :class=\"cls.e('item-code')\">{{ getCssVarName(field.path) }}</code>\n </div>\n </div>\n\n <span v-if=\"isFieldChanged(field)\" :class=\"cls.e('item-badge')\"> 已修改 </span>\n </div>\n\n <div v-if=\"field.kind === 'palette'\" :class=\"cls.e('palette-field')\">\n <template v-if=\"field.path[0] === 'color'\">\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"String(getFieldValue(field) ?? '')\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"例如:#1E88E5\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n </template>\n <template v-else>\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? ''\n : String(getFieldValue(field) ?? '')\n \"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"输入颜色或变量\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n <div :class=\"cls.e('palette-var')\">\n <span :class=\"cls.e('palette-var-label')\">或选择变量</span>\n <u-select\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? String(getFieldValue(field) ?? '')\n : ''\n \"\n :options=\"colorVarOptions\"\n clearable\n placeholder=\"选择预设变量\"\n @update:model-value=\"(value) => updateField(field, value ?? '')\"\n >\n <template #default=\"{ option }\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n :style=\"`width: 14px; height: 14px; border-radius: 4px; background: ${option.value}`\"\n />\n <span style=\"font-size: 13px\">{{ option.label }}</span>\n </div>\n </template>\n </u-select>\n </div>\n </template>\n </div>\n\n <component\n v-else\n :is=\"getFieldComponent(field)\"\n :model-value=\"getFieldValue(field)\"\n v-bind=\"getFieldProps(field)\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n\n <p v-if=\"field.hint || field.placeholder\" :class=\"cls.e('item-hint')\">\n {{ field.hint ?? field.placeholder }}\n </p>\n </div>\n </div>\n\n <div v-else :class=\"cls.e('empty')\">\n <strong>没有匹配项</strong>\n <p>换一个关键字,或关闭“仅看改动”后再继续筛选。</p>\n </div>\n </div>\n </div>\n\n <div :class=\"cls.e('actions')\">\n <div :class=\"cls.e('preset-group')\">\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('light')\">\n 浅色预设\n </button>\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('dark')\">\n 深色预设\n </button>\n </div>\n\n <u-button :class=\"cls.e('action-btn')\" @click=\"handleResetTheme\"> 重置 </u-button>\n <u-button :class=\"cls.e('action-btn')\" type=\"primary\" @click=\"handleExportTheme\">\n 导出\n </u-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n type Theme,\n UITheme,\n currentTheme,\n darkTheme,\n lightTheme,\n loadTheme\n} from '@veltra/styles/theme'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef, watch, watchEffect } from 'vue'\n\nimport type { ThemeProps, _ThemeExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { UNumberInput } from '../number-input'\nimport { UPalette } from '../palette'\nimport { USelect } from '../select'\nimport { THEME_SECTIONS } from './schema'\nimport type { ThemeField } from './schema'\n\ndefineOptions({\n name: 'UTheme'\n})\n\nconst props = defineProps<ThemeProps>()\n\nconst cls = bem('theme')\n\nconst keyword = shallowRef('')\nconst changedOnly = shallowRef(false)\nconst activeSection = shallowRef(THEME_SECTIONS[0]!.key)\n\nconst colorVarOptions = computed(() => {\n const options: { label: string; value: string }[] = []\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (field.kind === 'palette') {\n const varName = `var(${getCssVarName(field.path)})`\n options.push({\n label: `${field.label}`,\n value: varName\n })\n }\n })\n })\n return options\n})\n\nconst editorTheme = shallowRef<UITheme>()\nconst baselineTheme = shallowRef<Theme>(createThemeSnapshot(lightTheme.theme))\nconst baselineLabel = shallowRef('浅色预设')\n\nconst lightPreset = createThemeSnapshot(lightTheme.theme)\nconst darkPreset = createThemeSnapshot(darkTheme.theme)\n\nconst sourceTheme = computed(() => {\n return props.theme ?? currentTheme.value ?? lightTheme\n})\n\nwatch(\n sourceTheme,\n (theme) => {\n if (!props.theme && theme === editorTheme.value) return\n\n const nextTheme = props.theme ? theme : new UITheme(createThemeSnapshot(theme.theme))\n\n editorTheme.value = nextTheme\n baselineTheme.value = createThemeSnapshot(nextTheme.theme)\n baselineLabel.value =\n theme === darkTheme\n ? '深色预设'\n : theme === lightTheme\n ? '浅色预设'\n : props.theme\n ? '外部主题'\n : '当前主题'\n\n if (!props.theme && currentTheme.value !== nextTheme) {\n loadTheme(nextTheme)\n }\n },\n { immediate: true }\n)\n\nconst changedFieldKeys = computed(() => {\n const keys = new Set<string>()\n\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (\n getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path) !==\n getByPath(baselineTheme.value, field.path)\n ) {\n keys.add(field.key)\n }\n })\n })\n\n return keys\n})\n\nconst sectionStates = computed(() => {\n const normalizedKeyword = keyword.value.trim().toLowerCase()\n\n return THEME_SECTIONS.map((section) => {\n const sectionMatched = `${section.title} ${section.description}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n const visibleFields = section.fields.filter((field) => {\n const matchesKeyword =\n !normalizedKeyword ||\n sectionMatched ||\n `${field.label} ${field.key} ${getThemePath(field.path)} ${getCssVarName(field.path)}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n if (!matchesKeyword) return false\n\n if (changedOnly.value && !changedFieldKeys.value.has(field.key)) {\n return false\n }\n\n return true\n })\n\n const changedCount = section.fields.filter((field) => {\n return changedFieldKeys.value.has(field.key)\n }).length\n\n return {\n ...section,\n visibleFields,\n changedCount\n }\n })\n})\n\nwatchEffect(() => {\n const current = sectionStates.value.find((section) => {\n return section.key === activeSection.value && section.visibleFields.length\n })\n\n if (current) return\n\n activeSection.value =\n sectionStates.value.find((section) => section.visibleFields.length)?.key ??\n THEME_SECTIONS[0]!.key\n})\n\nconst activeState = computed(() => {\n return (\n sectionStates.value.find((section) => section.key === activeSection.value) ??\n sectionStates.value[0]\n )\n})\n\nfunction createThemeSnapshot(theme: Theme): Theme {\n return JSON.parse(JSON.stringify(theme)) as Theme\n}\n\nfunction getByPath(source: Record<string, any>, path: string[]) {\n return path.reduce((current, key) => current?.[key], source)\n}\n\nfunction setByPath(source: Record<string, any>, path: string[], value: any) {\n let current = source\n\n path.slice(0, -1).forEach((key) => {\n current = current[key]\n })\n\n current[path[path.length - 1]!] = value\n}\n\nfunction getCssVarName(path: string[]) {\n return `--u-${path.join('-')}`\n}\n\nfunction getThemePath(path: string[]) {\n return path.reduce((expression, key) => {\n if (/^[A-Za-z_$][\\w$]*$/.test(key)) {\n return `${expression}.${key}`\n }\n\n return `${expression}['${key}']`\n }, 'theme')\n}\n\nfunction getFieldComponent(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return UNumberInput\n case 'select':\n return USelect\n default:\n return UInput\n }\n}\n\nfunction getFieldValue(field: ThemeField) {\n return getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path)\n}\n\nfunction getFieldProps(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return {\n min: field.min,\n max: field.max,\n step: field.step,\n suffix: field.suffix\n }\n case 'select':\n return {\n options: field.options,\n clearable: false,\n placeholder: '请选择'\n }\n case 'input':\n return {\n placeholder: field.placeholder\n }\n default:\n return {}\n }\n}\n\nfunction updateField(field: ThemeField, value: string | number | undefined) {\n if (!editorTheme.value) return\n\n const normalizedValue =\n field.kind === 'number'\n ? typeof value === 'number'\n ? value\n : Number(value || 0)\n : String(value ?? '')\n\n setByPath(editorTheme.value.theme, field.path, normalizedValue)\n editorTheme.value.render()\n}\n\nfunction isFieldChanged(field: ThemeField) {\n return changedFieldKeys.value.has(field.key)\n}\n\nfunction applySnapshot(snapshot: Theme, label?: string) {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(snapshot))\n baselineTheme.value = createThemeSnapshot(editorTheme.value.theme)\n\n if (label) {\n baselineLabel.value = label\n }\n\n editorTheme.value.render()\n}\n\nfunction applyPreset(type: 'light' | 'dark') {\n applySnapshot(\n type === 'dark' ? darkPreset : lightPreset,\n type === 'dark' ? '深色预设' : '浅色预设'\n )\n}\n\nfunction handleResetTheme() {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(baselineTheme.value))\n editorTheme.value.render()\n}\n\nfunction handleExportTheme() {\n if (!editorTheme.value) return\n\n const themeConfig = JSON.stringify(createThemeSnapshot(editorTheme.value.theme), null, 2)\n const blob = new Blob([themeConfig], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'theme-config.json'\n a.click()\n URL.revokeObjectURL(url)\n}\n\ndefineExpose<_ThemeExposed>({\n reset: handleResetTheme,\n exportTheme: handleExportTheme,\n applyLightPreset: () => applyPreset('light'),\n applyDarkPreset: () => applyPreset('dark')\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -11,10 +11,10 @@ declare const __VLS_base: _$vue.DefineComponent<TipProps, {}, {}, {}, {}, _$vue.
|
|
|
11
11
|
}, string, _$vue.PublicProps, Readonly<TipProps> & Readonly<{
|
|
12
12
|
"onUpdate:visible"?: ((value: boolean) => any) | undefined;
|
|
13
13
|
}>, {
|
|
14
|
-
content: string;
|
|
15
14
|
trigger: "hover" | "click";
|
|
16
15
|
contentTag: string;
|
|
17
16
|
visible: boolean;
|
|
17
|
+
content: string;
|
|
18
18
|
direction: TipDirection;
|
|
19
19
|
alignment: TipAlign;
|
|
20
20
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-node2.js","names":["TreeNode","CoreTreeNode"],"sources":["../../../src/components/tree/tree-node.ts"],"sourcesContent":["import { TreeNode as CoreTreeNode, o } from '@cat-kit/core'\nimport { shallowReactive } from 'vue'\n\nexport class TreeNode<Val extends Record<string, any> = Record<string, any>> extends CoreTreeNode<\n Val,\n TreeNode<Val>\n> {\n declare parent?: TreeNode<Val>\n\n declare children?: TreeNode<Val>[]\n\n expanded = false\n loading = false\n loaded = false\n /** 多选是否选中 */\n checked = false\n disabled = false\n visible = true\n /** 子节点选中数量 */\n childrenCheckCount = 0\n\n get indeterminate(): boolean {\n if (!this.children) return false\n return (\n this.childrenCheckCount > 0\n // && this.childrenCheckCount < this.children.length\n )\n }\n\n labelKey: string\n valueKey: string\n\n constructor(params: {\n data: Val\n index: number\n depth: number\n parent?: TreeNode<Val>\n labelKey: string\n valueKey: string\n }) {\n const { data, index, depth, parent, labelKey, valueKey } = params\n super(data, index, depth, parent)\n this.labelKey = labelKey\n this.valueKey = valueKey\n\n return shallowReactive(this)\n }\n\n get label(): string {\n return String(o(this.data).get(this.labelKey))\n }\n\n get key(): string | number {\n return o(this.data).get(this.valueKey) as string | number\n }\n\n /**\n * 向上冒泡设置\n * @param setter 设置函数, 返回 false 则停止冒泡\n */\n bubbleSet(setter: (node: TreeNode<Val>) => boolean | void): void {\n const ret = setter(this)\n ret !== false && this.parent?.bubbleSet(setter)\n }\n}\n"],"mappings":";;;AAGA,IAAaA,aAAb,cAAqFC,SAGnF;CAKA,WAAW;CACX,UAAU;CACV,SAAS;;CAET,UAAU;CACV,WAAW;CACX,UAAU;;CAEV,qBAAqB;CAErB,IAAI,gBAAyB;AAC3B,MAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,SACE,KAAK,qBAAqB;;CAK9B;CACA;CAEA,YAAY,QAOT;EACD,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,aAAa;AAC3D,QAAM,MAAM,OAAO,OAAO,OAAO;AACjC,OAAK,WAAW;AAChB,OAAK,WAAW;AAEhB,SAAO,gBAAgB,KAAK;;CAG9B,IAAI,QAAgB;AAClB,SAAO,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;;CAGhD,IAAI,MAAuB;AACzB,SAAO,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS;;;;;;CAOxC,UAAU,QAAuD;AACnD,SAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"tree-node2.js","names":["TreeNode","CoreTreeNode"],"sources":["../../../src/components/tree/tree-node.ts"],"sourcesContent":["import { TreeNode as CoreTreeNode, o } from '@cat-kit/core'\nimport { shallowReactive } from 'vue'\n\nexport class TreeNode<Val extends Record<string, any> = Record<string, any>> extends CoreTreeNode<\n Val,\n TreeNode<Val>\n> {\n declare parent?: TreeNode<Val>\n\n declare children?: TreeNode<Val>[]\n\n expanded = false\n loading = false\n loaded = false\n /** 多选是否选中 */\n checked = false\n disabled = false\n visible = true\n /** 子节点选中数量 */\n childrenCheckCount = 0\n\n get indeterminate(): boolean {\n if (!this.children) return false\n return (\n this.childrenCheckCount > 0\n // && this.childrenCheckCount < this.children.length\n )\n }\n\n labelKey: string\n valueKey: string\n\n constructor(params: {\n data: Val\n index: number\n depth: number\n parent?: TreeNode<Val>\n labelKey: string\n valueKey: string\n }) {\n const { data, index, depth, parent, labelKey, valueKey } = params\n super(data, index, depth, parent)\n this.labelKey = labelKey\n this.valueKey = valueKey\n\n return shallowReactive(this)\n }\n\n get label(): string {\n return String(o(this.data).get(this.labelKey))\n }\n\n get key(): string | number {\n return o(this.data).get(this.valueKey) as string | number\n }\n\n /**\n * 向上冒泡设置\n * @param setter 设置函数, 返回 false 则停止冒泡\n */\n bubbleSet(setter: (node: TreeNode<Val>) => boolean | void): void {\n const ret = setter(this)\n ret !== false && this.parent?.bubbleSet(setter)\n }\n}\n"],"mappings":";;;AAGA,IAAaA,aAAb,cAAqFC,SAGnF;CAKA,WAAW;CACX,UAAU;CACV,SAAS;;CAET,UAAU;CACV,WAAW;CACX,UAAU;;CAEV,qBAAqB;CAErB,IAAI,gBAAyB;AAC3B,MAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,SACE,KAAK,qBAAqB;;CAK9B;CACA;CAEA,YAAY,QAOT;EACD,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,aAAa;AAC3D,QAAM,MAAM,OAAO,OAAO,OAAO;AACjC,OAAK,WAAW;AAChB,OAAK,WAAW;AAEhB,SAAO,gBAAgB,KAAK;;CAG9B,IAAI,QAAgB;AAClB,SAAO,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;;CAGhD,IAAI,MAAuB;AACzB,SAAO,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS;;;;;;CAOxC,UAAU,QAAuD;AACnD,SAAO,KAChB,KAAK,SAAS,KAAK,QAAQ,UAAU,OAAO"}
|