@yoka-ui/ui 1.1.0 → 1.1.4

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.
Files changed (81) hide show
  1. package/@Docs-yoka/exports.generated.md +53 -4
  2. package/LICENSE +21 -0
  3. package/dist/es/assets/image/skills.zip +0 -0
  4. package/dist/es/business/AiChat/aichat-logo.svg +1 -0
  5. package/dist/es/business/AiChat/index.js +20 -45
  6. package/dist/es/business/AiChat/index.js.map +2 -2
  7. package/dist/es/business/AiChat/index.module.less +24 -0
  8. package/dist/es/business/AiChat/useAiChat.js +41 -24
  9. package/dist/es/business/AiChat/useAiChat.js.map +2 -2
  10. package/dist/es/business/Editor/index.d.ts +2 -2
  11. package/dist/es/business/Editor/index.js.map +2 -2
  12. package/dist/es/business/Empty/index.d.ts +1 -1
  13. package/dist/es/business/Empty/index.js.map +1 -1
  14. package/dist/es/business/ModCommonFilter/index.d.ts +1 -0
  15. package/dist/es/business/ModCommonFilter/index.js.map +2 -2
  16. package/dist/es/business/YkLoginModule/index.d.ts +1 -0
  17. package/dist/es/business/YkLoginModule/index.js.map +2 -2
  18. package/dist/es/business/YkPorjectSelect/index.d.ts +3 -3
  19. package/dist/es/business/YkPorjectSelect/index.js +37 -51
  20. package/dist/es/business/YkPorjectSelect/index.js.map +2 -2
  21. package/dist/es/business/YkSqlEdit/index.d.ts +1 -0
  22. package/dist/es/business/YkSqlEdit/index.js.map +2 -2
  23. package/dist/es/components/Clock/index.d.ts +2 -2
  24. package/dist/es/components/Clock/index.js.map +2 -2
  25. package/dist/es/components/DebounceInput/index.d.ts +2 -2
  26. package/dist/es/components/DebounceInput/index.js.map +2 -2
  27. package/dist/es/components/MultipleSelect/index.d.ts +2 -2
  28. package/dist/es/components/MultipleSelect/index.js.map +2 -2
  29. package/dist/es/components/RefreshButton/index.d.ts +2 -2
  30. package/dist/es/components/RefreshButton/index.js.map +2 -2
  31. package/dist/es/components/SearchWithHistory/index.d.ts +1 -1
  32. package/dist/es/components/SearchWithHistory/index.js.map +1 -1
  33. package/dist/es/components/TextWithInput/index.d.ts +2 -5
  34. package/dist/es/components/TextWithInput/index.js.map +2 -2
  35. package/dist/es/components/TextWithToolTip/index.d.ts +2 -2
  36. package/dist/es/components/TextWithToolTip/index.js.map +2 -2
  37. package/dist/es/components/TreeTransfer/index.d.ts +1 -0
  38. package/dist/es/components/TreeTransfer/index.js.map +2 -2
  39. package/dist/es/index.d.ts +29 -0
  40. package/dist/es/index.js.map +2 -2
  41. package/dist/es/index.less +1 -0
  42. package/dist/lib/assets/image/skills.zip +0 -0
  43. package/dist/lib/business/AiChat/aichat-logo.svg +1 -0
  44. package/dist/lib/business/AiChat/index.js +20 -45
  45. package/dist/lib/business/AiChat/index.js.map +3 -3
  46. package/dist/lib/business/AiChat/index.module.less +24 -0
  47. package/dist/lib/business/AiChat/useAiChat.js +40 -22
  48. package/dist/lib/business/AiChat/useAiChat.js.map +2 -2
  49. package/dist/lib/business/Editor/index.d.ts +2 -2
  50. package/dist/lib/business/Editor/index.js.map +2 -2
  51. package/dist/lib/business/Empty/index.d.ts +1 -1
  52. package/dist/lib/business/Empty/index.js.map +1 -1
  53. package/dist/lib/business/ModCommonFilter/index.d.ts +1 -0
  54. package/dist/lib/business/ModCommonFilter/index.js.map +2 -2
  55. package/dist/lib/business/YkLoginModule/index.d.ts +1 -0
  56. package/dist/lib/business/YkLoginModule/index.js.map +2 -2
  57. package/dist/lib/business/YkPorjectSelect/index.d.ts +3 -3
  58. package/dist/lib/business/YkPorjectSelect/index.js +33 -27
  59. package/dist/lib/business/YkPorjectSelect/index.js.map +2 -2
  60. package/dist/lib/business/YkSqlEdit/index.d.ts +1 -0
  61. package/dist/lib/business/YkSqlEdit/index.js.map +2 -2
  62. package/dist/lib/components/Clock/index.d.ts +2 -2
  63. package/dist/lib/components/Clock/index.js.map +2 -2
  64. package/dist/lib/components/DebounceInput/index.d.ts +2 -2
  65. package/dist/lib/components/DebounceInput/index.js.map +2 -2
  66. package/dist/lib/components/MultipleSelect/index.d.ts +2 -2
  67. package/dist/lib/components/MultipleSelect/index.js.map +2 -2
  68. package/dist/lib/components/RefreshButton/index.d.ts +2 -2
  69. package/dist/lib/components/RefreshButton/index.js.map +2 -2
  70. package/dist/lib/components/SearchWithHistory/index.d.ts +1 -1
  71. package/dist/lib/components/SearchWithHistory/index.js.map +1 -1
  72. package/dist/lib/components/TextWithInput/index.d.ts +2 -5
  73. package/dist/lib/components/TextWithInput/index.js.map +2 -2
  74. package/dist/lib/components/TextWithToolTip/index.d.ts +2 -2
  75. package/dist/lib/components/TextWithToolTip/index.js.map +2 -2
  76. package/dist/lib/components/TreeTransfer/index.d.ts +1 -0
  77. package/dist/lib/components/TreeTransfer/index.js.map +2 -2
  78. package/dist/lib/index.d.ts +29 -0
  79. package/dist/lib/index.js.map +2 -2
  80. package/dist/lib/index.less +1 -0
  81. package/package.json +7 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/TreeTransfer/index.tsx"],
4
- "sourcesContent": ["/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n/**\n * TreeTransfer\n *\n * 树形表格穿梭框组件。支持:\n * - 树形结构展示,父子联动选择(checkStrictly: false)\n * - 前端分页 + 防抖搜索\n * - 左右穿梭操作(含多级树正确迁移)\n * - 自定义列配置和渲染\n * - 完整的 TypeScript 泛型支持\n *\n * @template T - 行数据的自定义业务类型\n *\n * @example\n * ```tsx\n * <TreeTransfer\n * leftDataSource={leftData}\n * rightDataSource={rightData}\n * leftTitle=\"待分配\"\n * rightTitle=\"已分配\"\n * onChange={({ leftData, rightData }) => { ... }}\n * />\n * ```\n */\n\nimport { LeftOutlined, RightOutlined } from '@ant-design/icons';\nimport { Button, Space, Spin } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport TreeTransferPanel from './components/TreeTransferPanel';\nimport { DEFAULT_PAGE_SIZE, type TreeTransferProps } from './types';\nimport {\n addNodesToTree,\n countParentNodes,\n extractTopLevelSelectedNodes,\n filterData,\n getAllDescendantKeys,\n removeNodesFromTree,\n sliceDataByPage,\n} from './utils';\nimport './index.less';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useDebounce\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 防抖 Hook\n *\n * 修复说明:\n * 原实现将 `callback` 放入 `useCallback` 的 deps,导致每次渲染(callback 为\n * 新引用)都重新创建防抖函数,使 timeout 重置,防抖完全失效。\n * 修复方案:将最新 callback 存入 ref,useCallback 仅依赖 delay,保证\n * 防抖函数引用稳定,timeout 不被意外清除。\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction useDebounce<T extends (...args: any[]) => any>(callback: T, delay: number): T {\n // 存储最新 callback,避免 stale closure\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n return useCallback(\n (...args: Parameters<T>) => {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => callbackRef.current(...args), delay);\n },\n [delay], // callback 通过 ref 读取,不需要放入 deps\n ) as T;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TreeTransfer\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 面板选择/分页状态(不含 dataSource,数据源来自 props + memo 计算)\n */\ninterface PanelState {\n selectedRowKeys: React.Key[];\n searchValue: string;\n currentPage: number;\n totalCount: number;\n}\n\nfunction TreeTransfer<T>({\n leftDataSource,\n rightDataSource,\n loading = false,\n leftTitle = '待分配项',\n rightTitle = '已分配项',\n pageSize = DEFAULT_PAGE_SIZE,\n columns,\n customRender,\n searchFields,\n searchPlaceholder,\n onChange,\n}: TreeTransferProps<T>) {\n // ── 面板状态(选择、搜索、分页) ─────────────────────────────────────────────\n // 注意:dataSource 不存储在 state 中;显示数据通过 memo 从 props 实时计算,\n // 避免 state 与 props 不同步的问题。\n const [leftPanel, setLeftPanel] = useState<PanelState>({\n selectedRowKeys: [],\n searchValue: '',\n currentPage: 1,\n totalCount: 0,\n });\n\n const [rightPanel, setRightPanel] = useState<PanelState>({\n selectedRowKeys: [],\n searchValue: '',\n currentPage: 1,\n totalCount: 0,\n });\n\n // ── 过滤后的完整数据(先 filter,再由 slice 分页) ──────────────────────────\n // 合并 filter + count,避免对同一搜索词调用两次 filterData(原来的问题)。\n\n const filteredLeft = useMemo(\n () => filterData<T>(leftDataSource, leftPanel.searchValue, searchFields),\n [leftDataSource, leftPanel.searchValue, searchFields],\n );\n\n const filteredRight = useMemo(\n () => filterData<T>(rightDataSource, rightPanel.searchValue, searchFields),\n [rightDataSource, rightPanel.searchValue, searchFields],\n );\n\n /** 当前页展示数据(供左侧面板渲染) */\n const filteredLeftData = useMemo(\n () => sliceDataByPage<T>(filteredLeft, leftPanel.currentPage, pageSize),\n [filteredLeft, leftPanel.currentPage, pageSize],\n );\n\n /** 当前页展示数据(供右侧面板渲染) */\n const filteredRightData = useMemo(\n () => sliceDataByPage<T>(filteredRight, rightPanel.currentPage, pageSize),\n [filteredRight, rightPanel.currentPage, pageSize],\n );\n\n /** 搜索后的顶层节点数(用于分页器 total) */\n const filteredLeftTotalCount = useMemo(() => countParentNodes(filteredLeft), [filteredLeft]);\n const filteredRightTotalCount = useMemo(() => countParentNodes(filteredRight), [filteredRight]);\n\n // ── 数据源变化时更新 totalCount,同时重置到第 1 页 ──────────────────────────\n useEffect(() => {\n setLeftPanel((prev) => ({\n ...prev,\n currentPage: 1,\n totalCount: countParentNodes(leftDataSource),\n }));\n }, [leftDataSource]);\n\n useEffect(() => {\n setRightPanel((prev) => ({\n ...prev,\n currentPage: 1,\n totalCount: countParentNodes(rightDataSource),\n }));\n }, [rightDataSource]);\n\n // ── 防抖搜索 ─────────────────────────────────────────────────────────────────\n\n const handleLeftSearchChange = useDebounce((value: string) => {\n setLeftPanel((prev) => ({ ...prev, searchValue: value, currentPage: 1 }));\n }, 300);\n\n const handleRightSearchChange = useDebounce((value: string) => {\n setRightPanel((prev) => ({ ...prev, searchValue: value, currentPage: 1 }));\n }, 300);\n\n // ── 分页 ─────────────────────────────────────────────────────────────────────\n\n const handleLeftPageChange = useCallback((page: number) => {\n setLeftPanel((prev) => ({ ...prev, currentPage: page }));\n }, []);\n\n const handleRightPageChange = useCallback((page: number) => {\n setRightPanel((prev) => ({ ...prev, currentPage: page }));\n }, []);\n\n // ── 穿梭操作 ─────────────────────────────────────────────────────────────────\n\n /**\n * 右移:将左侧选中项移到右侧\n *\n * 修复说明:\n * 原实现通过 `dataSource.filter(item => item.key === key)` 只查根节点,\n * 导致仅选中子节点时 nodesToAdd 为空,数据静默丢失。\n * 修复:使用 `extractTopLevelSelectedNodes` 递归提取选中的顶层节点(含 children)。\n */\n const handleMoveRight = useCallback(() => {\n if (leftPanel.selectedRowKeys.length === 0) return;\n\n const selectedSet = new Set(leftPanel.selectedRowKeys.map(String));\n // 提取选中的顶层节点(子节点随父一起携带)\n const nodesToAdd = extractTopLevelSelectedNodes<T>(selectedSet, leftDataSource);\n // 删除所有相关 key(含后代)\n const keysToRemove = new Set(getAllDescendantKeys(leftPanel.selectedRowKeys, leftDataSource));\n const newLeftData = removeNodesFromTree(leftDataSource, keysToRemove);\n const newRightData = addNodesToTree(rightDataSource, null, nodesToAdd);\n\n setLeftPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n setRightPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n\n onChange?.({\n leftSelected: [],\n rightSelected: [],\n leftData: newLeftData,\n rightData: newRightData,\n });\n }, [leftPanel.selectedRowKeys, leftDataSource, rightDataSource, onChange]);\n\n /**\n * 左移:将右侧选中项移到左侧\n */\n const handleMoveLeft = useCallback(() => {\n if (rightPanel.selectedRowKeys.length === 0) return;\n\n const selectedSet = new Set(rightPanel.selectedRowKeys.map(String));\n const nodesToAdd = extractTopLevelSelectedNodes<T>(selectedSet, rightDataSource);\n const keysToRemove = new Set(getAllDescendantKeys(rightPanel.selectedRowKeys, rightDataSource));\n const newRightData = removeNodesFromTree(rightDataSource, keysToRemove);\n const newLeftData = addNodesToTree(leftDataSource, null, nodesToAdd);\n\n setLeftPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n setRightPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n\n onChange?.({\n leftSelected: [],\n rightSelected: [],\n leftData: newLeftData,\n rightData: newRightData,\n });\n }, [rightPanel.selectedRowKeys, rightDataSource, leftDataSource, onChange]);\n\n // ── 渲染 ─────────────────────────────────────────────────────────────────────\n\n return (\n <div className='tree-transfer-wrapper'>\n <Spin spinning={loading}>\n <div className='tree-transfer-content'>\n {/* 左侧面板 */}\n <TreeTransferPanel<T>\n dataSource={filteredLeftData}\n selectedRowKeys={leftPanel.selectedRowKeys}\n onRowSelect={(_, keys) => setLeftPanel((prev) => ({ ...prev, selectedRowKeys: keys }))}\n searchValue={leftPanel.searchValue}\n setSearchValue={handleLeftSearchChange}\n totalCount={leftPanel.searchValue ? filteredLeftTotalCount : leftPanel.totalCount}\n title={leftTitle}\n showPagination={true}\n currentPage={leftPanel.currentPage}\n pageSize={pageSize}\n onPageChange={handleLeftPageChange}\n columns={columns}\n customRender={customRender}\n searchPlaceholder={searchPlaceholder}\n />\n\n {/* 中间操作按钮 */}\n <div className='tree-transfer-operations'>\n <Space direction='vertical' size={8}>\n <Button\n className='tree-transfer-operation-btn'\n type={leftPanel.selectedRowKeys.length > 0 ? 'primary' : 'default'}\n icon={<RightOutlined />}\n onClick={handleMoveRight}\n disabled={leftPanel.selectedRowKeys.length === 0}\n />\n <Button\n className='tree-transfer-operation-btn'\n type={rightPanel.selectedRowKeys.length > 0 ? 'primary' : 'default'}\n icon={<LeftOutlined />}\n onClick={handleMoveLeft}\n disabled={rightPanel.selectedRowKeys.length === 0}\n />\n </Space>\n </div>\n\n {/* 右侧面板 */}\n <TreeTransferPanel<T>\n dataSource={filteredRightData}\n selectedRowKeys={rightPanel.selectedRowKeys}\n onRowSelect={(_, keys) => setRightPanel((prev) => ({ ...prev, selectedRowKeys: keys }))}\n searchValue={rightPanel.searchValue}\n setSearchValue={handleRightSearchChange}\n totalCount={rightPanel.searchValue ? filteredRightTotalCount : rightPanel.totalCount}\n title={rightTitle}\n showPagination={true}\n currentPage={rightPanel.currentPage}\n pageSize={pageSize}\n onPageChange={handleRightPageChange}\n columns={columns}\n customRender={customRender}\n />\n </div>\n </Spin>\n </div>\n );\n}\n\nexport default TreeTransfer;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n/**\n * TreeTransfer\n *\n * 树形表格穿梭框组件。支持:\n * - 树形结构展示,父子联动选择(checkStrictly: false)\n * - 前端分页 + 防抖搜索\n * - 左右穿梭操作(含多级树正确迁移)\n * - 自定义列配置和渲染\n * - 完整的 TypeScript 泛型支持\n *\n * @template T - 行数据的自定义业务类型\n *\n * @example\n * ```tsx\n * <TreeTransfer\n * leftDataSource={leftData}\n * rightDataSource={rightData}\n * leftTitle=\"待分配\"\n * rightTitle=\"已分配\"\n * onChange={({ leftData, rightData }) => { ... }}\n * />\n * ```\n */\n\nimport { LeftOutlined, RightOutlined } from '@ant-design/icons';\nimport { Button, Space, Spin } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport TreeTransferPanel from './components/TreeTransferPanel';\nimport { DEFAULT_PAGE_SIZE, type TreeTransferProps } from './types';\n\nexport type { TreeTransferProps } from './types';\nimport {\n addNodesToTree,\n countParentNodes,\n extractTopLevelSelectedNodes,\n filterData,\n getAllDescendantKeys,\n removeNodesFromTree,\n sliceDataByPage,\n} from './utils';\nimport './index.less';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useDebounce\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 防抖 Hook\n *\n * 修复说明:\n * 原实现将 `callback` 放入 `useCallback` 的 deps,导致每次渲染(callback 为\n * 新引用)都重新创建防抖函数,使 timeout 重置,防抖完全失效。\n * 修复方案:将最新 callback 存入 ref,useCallback 仅依赖 delay,保证\n * 防抖函数引用稳定,timeout 不被意外清除。\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction useDebounce<T extends (...args: any[]) => any>(callback: T, delay: number): T {\n // 存储最新 callback,避免 stale closure\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n return useCallback(\n (...args: Parameters<T>) => {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => callbackRef.current(...args), delay);\n },\n [delay], // callback 通过 ref 读取,不需要放入 deps\n ) as T;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TreeTransfer\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 面板选择/分页状态(不含 dataSource,数据源来自 props + memo 计算)\n */\ninterface PanelState {\n selectedRowKeys: React.Key[];\n searchValue: string;\n currentPage: number;\n totalCount: number;\n}\n\nfunction TreeTransfer<T>({\n leftDataSource,\n rightDataSource,\n loading = false,\n leftTitle = '待分配项',\n rightTitle = '已分配项',\n pageSize = DEFAULT_PAGE_SIZE,\n columns,\n customRender,\n searchFields,\n searchPlaceholder,\n onChange,\n}: TreeTransferProps<T>) {\n // ── 面板状态(选择、搜索、分页) ─────────────────────────────────────────────\n // 注意:dataSource 不存储在 state 中;显示数据通过 memo 从 props 实时计算,\n // 避免 state 与 props 不同步的问题。\n const [leftPanel, setLeftPanel] = useState<PanelState>({\n selectedRowKeys: [],\n searchValue: '',\n currentPage: 1,\n totalCount: 0,\n });\n\n const [rightPanel, setRightPanel] = useState<PanelState>({\n selectedRowKeys: [],\n searchValue: '',\n currentPage: 1,\n totalCount: 0,\n });\n\n // ── 过滤后的完整数据(先 filter,再由 slice 分页) ──────────────────────────\n // 合并 filter + count,避免对同一搜索词调用两次 filterData(原来的问题)。\n\n const filteredLeft = useMemo(\n () => filterData<T>(leftDataSource, leftPanel.searchValue, searchFields),\n [leftDataSource, leftPanel.searchValue, searchFields],\n );\n\n const filteredRight = useMemo(\n () => filterData<T>(rightDataSource, rightPanel.searchValue, searchFields),\n [rightDataSource, rightPanel.searchValue, searchFields],\n );\n\n /** 当前页展示数据(供左侧面板渲染) */\n const filteredLeftData = useMemo(\n () => sliceDataByPage<T>(filteredLeft, leftPanel.currentPage, pageSize),\n [filteredLeft, leftPanel.currentPage, pageSize],\n );\n\n /** 当前页展示数据(供右侧面板渲染) */\n const filteredRightData = useMemo(\n () => sliceDataByPage<T>(filteredRight, rightPanel.currentPage, pageSize),\n [filteredRight, rightPanel.currentPage, pageSize],\n );\n\n /** 搜索后的顶层节点数(用于分页器 total) */\n const filteredLeftTotalCount = useMemo(() => countParentNodes(filteredLeft), [filteredLeft]);\n const filteredRightTotalCount = useMemo(() => countParentNodes(filteredRight), [filteredRight]);\n\n // ── 数据源变化时更新 totalCount,同时重置到第 1 页 ──────────────────────────\n useEffect(() => {\n setLeftPanel((prev) => ({\n ...prev,\n currentPage: 1,\n totalCount: countParentNodes(leftDataSource),\n }));\n }, [leftDataSource]);\n\n useEffect(() => {\n setRightPanel((prev) => ({\n ...prev,\n currentPage: 1,\n totalCount: countParentNodes(rightDataSource),\n }));\n }, [rightDataSource]);\n\n // ── 防抖搜索 ─────────────────────────────────────────────────────────────────\n\n const handleLeftSearchChange = useDebounce((value: string) => {\n setLeftPanel((prev) => ({ ...prev, searchValue: value, currentPage: 1 }));\n }, 300);\n\n const handleRightSearchChange = useDebounce((value: string) => {\n setRightPanel((prev) => ({ ...prev, searchValue: value, currentPage: 1 }));\n }, 300);\n\n // ── 分页 ─────────────────────────────────────────────────────────────────────\n\n const handleLeftPageChange = useCallback((page: number) => {\n setLeftPanel((prev) => ({ ...prev, currentPage: page }));\n }, []);\n\n const handleRightPageChange = useCallback((page: number) => {\n setRightPanel((prev) => ({ ...prev, currentPage: page }));\n }, []);\n\n // ── 穿梭操作 ─────────────────────────────────────────────────────────────────\n\n /**\n * 右移:将左侧选中项移到右侧\n *\n * 修复说明:\n * 原实现通过 `dataSource.filter(item => item.key === key)` 只查根节点,\n * 导致仅选中子节点时 nodesToAdd 为空,数据静默丢失。\n * 修复:使用 `extractTopLevelSelectedNodes` 递归提取选中的顶层节点(含 children)。\n */\n const handleMoveRight = useCallback(() => {\n if (leftPanel.selectedRowKeys.length === 0) return;\n\n const selectedSet = new Set(leftPanel.selectedRowKeys.map(String));\n // 提取选中的顶层节点(子节点随父一起携带)\n const nodesToAdd = extractTopLevelSelectedNodes<T>(selectedSet, leftDataSource);\n // 删除所有相关 key(含后代)\n const keysToRemove = new Set(getAllDescendantKeys(leftPanel.selectedRowKeys, leftDataSource));\n const newLeftData = removeNodesFromTree(leftDataSource, keysToRemove);\n const newRightData = addNodesToTree(rightDataSource, null, nodesToAdd);\n\n setLeftPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n setRightPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n\n onChange?.({\n leftSelected: [],\n rightSelected: [],\n leftData: newLeftData,\n rightData: newRightData,\n });\n }, [leftPanel.selectedRowKeys, leftDataSource, rightDataSource, onChange]);\n\n /**\n * 左移:将右侧选中项移到左侧\n */\n const handleMoveLeft = useCallback(() => {\n if (rightPanel.selectedRowKeys.length === 0) return;\n\n const selectedSet = new Set(rightPanel.selectedRowKeys.map(String));\n const nodesToAdd = extractTopLevelSelectedNodes<T>(selectedSet, rightDataSource);\n const keysToRemove = new Set(getAllDescendantKeys(rightPanel.selectedRowKeys, rightDataSource));\n const newRightData = removeNodesFromTree(rightDataSource, keysToRemove);\n const newLeftData = addNodesToTree(leftDataSource, null, nodesToAdd);\n\n setLeftPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n setRightPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n\n onChange?.({\n leftSelected: [],\n rightSelected: [],\n leftData: newLeftData,\n rightData: newRightData,\n });\n }, [rightPanel.selectedRowKeys, rightDataSource, leftDataSource, onChange]);\n\n // ── 渲染 ─────────────────────────────────────────────────────────────────────\n\n return (\n <div className='tree-transfer-wrapper'>\n <Spin spinning={loading}>\n <div className='tree-transfer-content'>\n {/* 左侧面板 */}\n <TreeTransferPanel<T>\n dataSource={filteredLeftData}\n selectedRowKeys={leftPanel.selectedRowKeys}\n onRowSelect={(_, keys) => setLeftPanel((prev) => ({ ...prev, selectedRowKeys: keys }))}\n searchValue={leftPanel.searchValue}\n setSearchValue={handleLeftSearchChange}\n totalCount={leftPanel.searchValue ? filteredLeftTotalCount : leftPanel.totalCount}\n title={leftTitle}\n showPagination={true}\n currentPage={leftPanel.currentPage}\n pageSize={pageSize}\n onPageChange={handleLeftPageChange}\n columns={columns}\n customRender={customRender}\n searchPlaceholder={searchPlaceholder}\n />\n\n {/* 中间操作按钮 */}\n <div className='tree-transfer-operations'>\n <Space direction='vertical' size={8}>\n <Button\n className='tree-transfer-operation-btn'\n type={leftPanel.selectedRowKeys.length > 0 ? 'primary' : 'default'}\n icon={<RightOutlined />}\n onClick={handleMoveRight}\n disabled={leftPanel.selectedRowKeys.length === 0}\n />\n <Button\n className='tree-transfer-operation-btn'\n type={rightPanel.selectedRowKeys.length > 0 ? 'primary' : 'default'}\n icon={<LeftOutlined />}\n onClick={handleMoveLeft}\n disabled={rightPanel.selectedRowKeys.length === 0}\n />\n </Space>\n </div>\n\n {/* 右侧面板 */}\n <TreeTransferPanel<T>\n dataSource={filteredRightData}\n selectedRowKeys={rightPanel.selectedRowKeys}\n onRowSelect={(_, keys) => setRightPanel((prev) => ({ ...prev, selectedRowKeys: keys }))}\n searchValue={rightPanel.searchValue}\n setSearchValue={handleRightSearchChange}\n totalCount={rightPanel.searchValue ? filteredRightTotalCount : rightPanel.totalCount}\n title={rightTitle}\n showPagination={true}\n currentPage={rightPanel.currentPage}\n pageSize={pageSize}\n onPageChange={handleRightPageChange}\n columns={columns}\n customRender={customRender}\n />\n </div>\n </Spin>\n </div>\n );\n}\n\nexport default TreeTransfer;\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "TreeTransferPanel"]
7
7
  }
@@ -1,49 +1,78 @@
1
1
  import 'antd/dist/reset.css';
2
2
  export { default as AiChat } from './business/AiChat';
3
+ export type { AiChatProps } from './business/AiChat';
3
4
  export { default as DrawerPageInfo } from './business/DrawerPageInfo';
5
+ export type { TipContentData, FeedbackParams, PropsType as DrawerPageInfoProps } from './business/DrawerPageInfo';
4
6
  export { default as Editor } from './business/Editor';
7
+ export type { EditorProps } from './business/Editor';
5
8
  export { default as Empty } from './business/Empty';
9
+ export type { EmptyProps } from './business/Empty';
6
10
  export { default as ModCommonFilter } from './business/ModCommonFilter';
11
+ export type { ModCommonFilterProps, ListItem, CategoryItem, TerminalItem } from './business/ModCommonFilter';
7
12
  export { default as YkLoginModule } from './business/YkLoginModule';
13
+ export type { LoginModuleProps, LoginType, LoginTabItem, QrcodeApi, SmsLoginFormApi } from './business/YkLoginModule';
14
+ export type { OptionItem, YkPorjectSelectProps } from './business/YkPorjectSelect';
8
15
  export { default as YkPorjectSelect } from './business/YkPorjectSelect';
9
16
  export { default as YkSqlEdit } from './business/YkSqlEdit';
17
+ export type { YkSqlEditProps, SqlDialectType } from './business/YkSqlEdit';
10
18
  export { default as Clock } from './components/Clock';
19
+ export type { ClockProps } from './components/Clock';
11
20
  export { default as DebounceInput } from './components/DebounceInput';
21
+ export type { DebounceInputProps } from './components/DebounceInput';
12
22
  export { default as MultipleSelect } from './components/MultipleSelect';
23
+ export type { MultipleSelectProps } from './components/MultipleSelect';
13
24
  export { default as NumericInput } from './components/NumericInput';
25
+ export type { NumericInputProps } from './components/NumericInput';
14
26
  export { default as RefreshButton } from './components/RefreshButton';
27
+ export type { RefreshButtonProps } from './components/RefreshButton';
15
28
  export { default as SearchWithHistory } from './components/SearchWithHistory';
29
+ export type { SearchWithHistoryProps } from './components/SearchWithHistory';
16
30
  export { default as TextWithInput } from './components/TextWithInput';
31
+ export type { TextWithInputProps } from './components/TextWithInput';
17
32
  export { default as TextWithToolTip } from './components/TextWithToolTip';
33
+ export type { TextWithTooltipProps } from './components/TextWithToolTip';
18
34
  export { default as TreeTransfer } from './components/TreeTransfer';
35
+ export type { TreeTransferProps } from './components/TreeTransfer';
19
36
  export type { DateRangeValue, YkDateRangePickerProps, YkDateRangePickerRef, } from './components/YkDateRangePicker';
20
37
  export { default as YkDateRangePicker } from './components/YkDateRangePicker';
21
38
  export { default as YkRangeDateWithVS } from './components/YkRangeDateWithVS';
39
+ export type { YkRangeDateWithVSProps, YkRangeDateWithVSValue, YkRangeDateWithVSChange } from './components/YkRangeDateWithVS';
22
40
  export { default as YkRangeTimeWithRecent } from './components/YkRangeTimeWithRecent';
41
+ export type { YkRangeTimeWithRecentProps, YkRangeTimeWithRecentTimeType } from './components/YkRangeTimeWithRecent';
23
42
  export type { ArcCheckboxProps } from './creative/ArcCheckbox';
24
43
  export { default as ArcCheckbox } from './creative/ArcCheckbox';
25
44
  export { default as ButtonRadioWithInfo } from './creative/ButtonRadioWithInfo';
45
+ export type { ButtonRadioWithInfoProps, ButtonRadioWithInfoOption } from './creative/ButtonRadioWithInfo';
26
46
  export { default as ButtonWithProgress } from './creative/ButtonWithProgress';
47
+ export type { ButtonWithProgressProps } from './creative/ButtonWithProgress';
27
48
  export type { GlassSegmentedRadioProps, GlassSegmentOption, } from './creative/GlassSegmentedRadio';
28
49
  export { default as GlassSegmentedRadio } from './creative/GlassSegmentedRadio';
29
50
  export { default as FlexGrid } from './layout/FlexGrid';
51
+ export type { FlexGridProps, FlexGridColSpan } from './layout/FlexGrid';
30
52
  export { default as YkContainer } from './layout/YkContainer';
53
+ export type { YkContainerProps } from './layout/YkContainer';
31
54
  export { default as YkDrawer } from './layout/YkDrawer';
55
+ export type { YkDrawerProps, YkDrawerSize, YkDrawerPlacement } from './layout/YkDrawer';
32
56
  export { default as InputTheme } from './Themes/InputTheme';
33
57
  export { default as TableTheme } from './Themes/TableTheme';
34
58
  export { default as LabelSelect } from './ui/LabelSelect';
59
+ export type { LabelSelectProps, CustomOption } from './ui/LabelSelect';
35
60
  export { default as LogicOperator } from './ui/LogicOperator';
61
+ export type { LogicOperatorProps } from './ui/LogicOperator';
36
62
  export { default as YkButton } from './ui/YkButton';
63
+ export type { YkButtonProps } from './ui/YkButton';
37
64
  export { default as YkCard } from './ui/YkCard';
38
65
  export { default as YkCheckbox } from './ui/YkCheckbox';
39
66
  export { default as YkDescriptions } from './ui/YkDescriptions';
40
67
  export { default as YkPagination } from './ui/YkPagination';
41
68
  export { default as YkRadio } from './ui/YkRadio';
42
69
  export { default as YkRadioBtnSpecial } from './ui/YkRadioBtnSpecial';
70
+ export type { RadioBtnProps } from './ui/YkRadioBtnSpecial';
43
71
  export { default as YkSegmented } from './ui/YkSegmented';
44
72
  export { default as YkSelect } from './ui/YkSelect';
45
73
  export { default as YkSpin } from './ui/YkSpin';
46
74
  export { default as YkStatistic } from './ui/YkStatistic';
47
75
  export { default as YkSwitch } from './ui/YkSwitch';
48
76
  export { default as YkTabs } from './ui/YkTabs';
77
+ export type { YkTabsProps, YkTabItem } from './ui/YkTabs';
49
78
  export { default as YkTooltip } from './ui/YkTooltip';
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.tsx"],
4
- "sourcesContent": ["// Auto-inject Ant Design styles per project_specification_memory #6eafc28d\nimport 'antd/dist/reset.css';\n\n// Export business components\nexport { default as AiChat } from './business/AiChat';\nexport { default as DrawerPageInfo } from './business/DrawerPageInfo';\nexport { default as Editor } from './business/Editor';\nexport { default as Empty } from './business/Empty';\nexport { default as ModCommonFilter } from './business/ModCommonFilter';\nexport { default as YkLoginModule } from './business/YkLoginModule';\nexport { default as YkPorjectSelect } from './business/YkPorjectSelect';\nexport { default as YkSqlEdit } from './business/YkSqlEdit';\n// Export common components\nexport { default as Clock } from './components/Clock';\nexport { default as DebounceInput } from './components/DebounceInput';\nexport { default as MultipleSelect } from './components/MultipleSelect';\nexport { default as NumericInput } from './components/NumericInput';\nexport { default as RefreshButton } from './components/RefreshButton';\nexport { default as SearchWithHistory } from './components/SearchWithHistory';\nexport { default as TextWithInput } from './components/TextWithInput';\nexport { default as TextWithToolTip } from './components/TextWithToolTip';\nexport { default as TreeTransfer } from './components/TreeTransfer';\nexport type {\n DateRangeValue,\n YkDateRangePickerProps,\n YkDateRangePickerRef,\n} from './components/YkDateRangePicker';\nexport { default as YkDateRangePicker } from './components/YkDateRangePicker';\nexport { default as YkRangeDateWithVS } from './components/YkRangeDateWithVS';\nexport { default as YkRangeTimeWithRecent } from './components/YkRangeTimeWithRecent';\n// Export creative components\nexport type { ArcCheckboxProps } from './creative/ArcCheckbox';\nexport { default as ArcCheckbox } from './creative/ArcCheckbox';\nexport { default as ButtonRadioWithInfo } from './creative/ButtonRadioWithInfo';\nexport { default as ButtonWithProgress } from './creative/ButtonWithProgress';\nexport type {\n GlassSegmentedRadioProps,\n GlassSegmentOption,\n} from './creative/GlassSegmentedRadio';\nexport { default as GlassSegmentedRadio } from './creative/GlassSegmentedRadio';\n// Export layout\nexport { default as FlexGrid } from './layout/FlexGrid';\nexport { default as YkContainer } from './layout/YkContainer';\nexport { default as YkDrawer } from './layout/YkDrawer';\n// Export theme components\nexport { default as InputTheme } from './Themes/InputTheme';\nexport { default as TableTheme } from './Themes/TableTheme';\n// Export all UI components\nexport { default as LabelSelect } from './ui/LabelSelect';\nexport { default as LogicOperator } from './ui/LogicOperator';\nexport { default as YkButton } from './ui/YkButton';\nexport { default as YkCard } from './ui/YkCard';\nexport { default as YkCheckbox } from './ui/YkCheckbox';\nexport { default as YkDescriptions } from './ui/YkDescriptions';\nexport { default as YkPagination } from './ui/YkPagination';\nexport { default as YkRadio } from './ui/YkRadio';\nexport { default as YkRadioBtnSpecial } from './ui/YkRadioBtnSpecial';\nexport { default as YkSegmented } from './ui/YkSegmented';\nexport { default as YkSelect } from './ui/YkSelect';\nexport { default as YkSpin } from './ui/YkSpin';\nexport { default as YkStatistic } from './ui/YkStatistic';\nexport { default as YkSwitch } from './ui/YkSwitch';\nexport { default as YkTabs } from './ui/YkTabs';\nexport { default as YkTooltip } from './ui/YkTooltip';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAO;AAGP,oBAAkC;AAClC,4BAA0C;AAC1C,oBAAkC;AAClC,mBAAiC;AACjC,6BAA2C;AAC3C,2BAAyC;AACzC,6BAA2C;AAC3C,uBAAqC;AAErC,mBAAiC;AACjC,2BAAyC;AACzC,4BAA0C;AAC1C,0BAAwC;AACxC,2BAAyC;AACzC,+BAA6C;AAC7C,2BAAyC;AACzC,6BAA2C;AAC3C,0BAAwC;AAMxC,+BAA6C;AAC7C,+BAA6C;AAC7C,mCAAiD;AAGjD,yBAAuC;AACvC,iCAA+C;AAC/C,gCAA8C;AAK9C,iCAA+C;AAE/C,sBAAoC;AACpC,yBAAuC;AACvC,sBAAoC;AAEpC,wBAAsC;AACtC,wBAAsC;AAEtC,yBAAuC;AACvC,2BAAyC;AACzC,sBAAoC;AACpC,oBAAkC;AAClC,wBAAsC;AACtC,4BAA0C;AAC1C,0BAAwC;AACxC,qBAAmC;AACnC,+BAA6C;AAC7C,yBAAuC;AACvC,sBAAoC;AACpC,oBAAkC;AAClC,yBAAuC;AACvC,sBAAoC;AACpC,oBAAkC;AAClC,uBAAqC;",
4
+ "sourcesContent": ["// Auto-inject Ant Design styles per project_specification_memory #6eafc28d\nimport 'antd/dist/reset.css';\n\n// Export business components\nexport { default as AiChat } from './business/AiChat';\nexport type { AiChatProps } from './business/AiChat';\nexport { default as DrawerPageInfo } from './business/DrawerPageInfo';\nexport type { TipContentData, FeedbackParams, PropsType as DrawerPageInfoProps } from './business/DrawerPageInfo';\nexport { default as Editor } from './business/Editor';\nexport type { EditorProps } from './business/Editor';\nexport { default as Empty } from './business/Empty';\nexport type { EmptyProps } from './business/Empty';\nexport { default as ModCommonFilter } from './business/ModCommonFilter';\nexport type { ModCommonFilterProps, ListItem, CategoryItem, TerminalItem } from './business/ModCommonFilter';\nexport { default as YkLoginModule } from './business/YkLoginModule';\nexport type { LoginModuleProps, LoginType, LoginTabItem, QrcodeApi, SmsLoginFormApi } from './business/YkLoginModule';\nexport type { OptionItem, YkPorjectSelectProps } from './business/YkPorjectSelect';\nexport { default as YkPorjectSelect } from './business/YkPorjectSelect';\nexport { default as YkSqlEdit } from './business/YkSqlEdit';\nexport type { YkSqlEditProps, SqlDialectType } from './business/YkSqlEdit';\n// Export common components\nexport { default as Clock } from './components/Clock';\nexport type { ClockProps } from './components/Clock';\nexport { default as DebounceInput } from './components/DebounceInput';\nexport type { DebounceInputProps } from './components/DebounceInput';\nexport { default as MultipleSelect } from './components/MultipleSelect';\nexport type { MultipleSelectProps } from './components/MultipleSelect';\nexport { default as NumericInput } from './components/NumericInput';\nexport type { NumericInputProps } from './components/NumericInput';\nexport { default as RefreshButton } from './components/RefreshButton';\nexport type { RefreshButtonProps } from './components/RefreshButton';\nexport { default as SearchWithHistory } from './components/SearchWithHistory';\nexport type { SearchWithHistoryProps } from './components/SearchWithHistory';\nexport { default as TextWithInput } from './components/TextWithInput';\nexport type { TextWithInputProps } from './components/TextWithInput';\nexport { default as TextWithToolTip } from './components/TextWithToolTip';\nexport type { TextWithTooltipProps } from './components/TextWithToolTip';\nexport { default as TreeTransfer } from './components/TreeTransfer';\nexport type { TreeTransferProps } from './components/TreeTransfer';\nexport type {\n DateRangeValue,\n YkDateRangePickerProps,\n YkDateRangePickerRef,\n} from './components/YkDateRangePicker';\nexport { default as YkDateRangePicker } from './components/YkDateRangePicker';\nexport { default as YkRangeDateWithVS } from './components/YkRangeDateWithVS';\nexport type { YkRangeDateWithVSProps, YkRangeDateWithVSValue, YkRangeDateWithVSChange } from './components/YkRangeDateWithVS';\nexport { default as YkRangeTimeWithRecent } from './components/YkRangeTimeWithRecent';\nexport type { YkRangeTimeWithRecentProps, YkRangeTimeWithRecentTimeType } from './components/YkRangeTimeWithRecent';\n// Export creative components\nexport type { ArcCheckboxProps } from './creative/ArcCheckbox';\nexport { default as ArcCheckbox } from './creative/ArcCheckbox';\nexport { default as ButtonRadioWithInfo } from './creative/ButtonRadioWithInfo';\nexport type { ButtonRadioWithInfoProps, ButtonRadioWithInfoOption } from './creative/ButtonRadioWithInfo';\nexport { default as ButtonWithProgress } from './creative/ButtonWithProgress';\nexport type { ButtonWithProgressProps } from './creative/ButtonWithProgress';\nexport type {\n GlassSegmentedRadioProps,\n GlassSegmentOption,\n} from './creative/GlassSegmentedRadio';\nexport { default as GlassSegmentedRadio } from './creative/GlassSegmentedRadio';\n// Export layout\nexport { default as FlexGrid } from './layout/FlexGrid';\nexport type { FlexGridProps, FlexGridColSpan } from './layout/FlexGrid';\nexport { default as YkContainer } from './layout/YkContainer';\nexport type { YkContainerProps } from './layout/YkContainer';\nexport { default as YkDrawer } from './layout/YkDrawer';\nexport type { YkDrawerProps, YkDrawerSize, YkDrawerPlacement } from './layout/YkDrawer';\n// Export theme components\nexport { default as InputTheme } from './Themes/InputTheme';\nexport { default as TableTheme } from './Themes/TableTheme';\n// Export all UI components\nexport { default as LabelSelect } from './ui/LabelSelect';\nexport type { LabelSelectProps, CustomOption } from './ui/LabelSelect';\nexport { default as LogicOperator } from './ui/LogicOperator';\nexport type { LogicOperatorProps } from './ui/LogicOperator';\nexport { default as YkButton } from './ui/YkButton';\nexport type { YkButtonProps } from './ui/YkButton';\nexport { default as YkCard } from './ui/YkCard';\nexport { default as YkCheckbox } from './ui/YkCheckbox';\nexport { default as YkDescriptions } from './ui/YkDescriptions';\nexport { default as YkPagination } from './ui/YkPagination';\nexport { default as YkRadio } from './ui/YkRadio';\nexport { default as YkRadioBtnSpecial } from './ui/YkRadioBtnSpecial';\nexport type { RadioBtnProps } from './ui/YkRadioBtnSpecial';\nexport { default as YkSegmented } from './ui/YkSegmented';\nexport { default as YkSelect } from './ui/YkSelect';\nexport { default as YkSpin } from './ui/YkSpin';\nexport { default as YkStatistic } from './ui/YkStatistic';\nexport { default as YkSwitch } from './ui/YkSwitch';\nexport { default as YkTabs } from './ui/YkTabs';\nexport type { YkTabsProps, YkTabItem } from './ui/YkTabs';\nexport { default as YkTooltip } from './ui/YkTooltip';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAO;AAGP,oBAAkC;AAElC,4BAA0C;AAE1C,oBAAkC;AAElC,mBAAiC;AAEjC,6BAA2C;AAE3C,2BAAyC;AAGzC,6BAA2C;AAC3C,uBAAqC;AAGrC,mBAAiC;AAEjC,2BAAyC;AAEzC,4BAA0C;AAE1C,0BAAwC;AAExC,2BAAyC;AAEzC,+BAA6C;AAE7C,2BAAyC;AAEzC,6BAA2C;AAE3C,0BAAwC;AAOxC,+BAA6C;AAC7C,+BAA6C;AAE7C,mCAAiD;AAIjD,yBAAuC;AACvC,iCAA+C;AAE/C,gCAA8C;AAM9C,iCAA+C;AAE/C,sBAAoC;AAEpC,yBAAuC;AAEvC,sBAAoC;AAGpC,wBAAsC;AACtC,wBAAsC;AAEtC,yBAAuC;AAEvC,2BAAyC;AAEzC,sBAAoC;AAEpC,oBAAkC;AAClC,wBAAsC;AACtC,4BAA0C;AAC1C,0BAAwC;AACxC,qBAAmC;AACnC,+BAA6C;AAE7C,yBAAuC;AACvC,sBAAoC;AACpC,oBAAkC;AAClC,yBAAuC;AACvC,sBAAoC;AACpC,oBAAkC;AAElC,uBAAqC;",
6
6
  "names": []
7
7
  }
@@ -8,6 +8,7 @@
8
8
  @import "../../src/assets/less/ant-reset.less";
9
9
  @import "../../src/assets/less/index.less";
10
10
  @import "../../src/assets/less/variables.less";
11
+ @import "../../src/business/AiChat/index.module.less";
11
12
  @import "../../src/business/DrawerPageInfo/index.module.less";
12
13
  @import "../../src/business/Editor/index.less";
13
14
  @import "../../src/business/ModCommonFilter/components/FilterButton/index.module.less";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoka-ui/ui",
3
- "version": "1.1.0",
3
+ "version": "1.1.4",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "homepage": "",
@@ -38,7 +38,7 @@
38
38
  "commit": "cz",
39
39
  "dev": "pnpm storybook",
40
40
  "generate:yoka-llms": "node scripts/generate-yoka-llms.cjs",
41
- "prepublishOnly": "npm run clean && npm run build:lib",
41
+ "prepublishOnly": "node scripts/sync-skills.cjs && npm run clean && npm run build:lib",
42
42
  "lint:ts": "tsc --noEmit",
43
43
  "lint": "pnpm run lint:ts && pnpm run biome:lint",
44
44
  "lint:fix": "biome format --write .",
@@ -105,7 +105,6 @@
105
105
  "@storybook/addon-a11y": "10.3.5",
106
106
  "@storybook/addon-docs": "10.3.5",
107
107
  "@storybook/addon-webpack5-compiler-swc": "4.0.3",
108
- "@storybook/react": "10.3.5",
109
108
  "@storybook/react-webpack5": "10.3.5",
110
109
  "@storybook/test-runner": "0.24.3",
111
110
  "@testing-library/jest-dom": "^6.9.1",
@@ -149,6 +148,11 @@
149
148
  "npx @biomejs/biome check --write"
150
149
  ]
151
150
  },
151
+ "pnpm": {
152
+ "onlyBuiltDependencies": [
153
+ "esbuild"
154
+ ]
155
+ },
152
156
  "publishConfig": {
153
157
  "access": "public"
154
158
  }