@creekjs/web-components 1.0.13 → 1.0.15

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 (78) hide show
  1. package/.turbo/turbo-father$colon$build.log +34 -34
  2. package/dist/creek-config-provider/index.js +13 -13
  3. package/dist/creek-config-provider/index.js.map +3 -3
  4. package/dist/creek-keep-alive/index.d.ts +0 -4
  5. package/dist/creek-keep-alive/index.js +13 -8
  6. package/dist/creek-keep-alive/index.js.map +2 -2
  7. package/dist/creek-layout/ActionRender/LayoutSettings.d.ts +2 -1
  8. package/dist/creek-layout/ActionRender/LayoutSettings.js +7 -6
  9. package/dist/creek-layout/ActionRender/LayoutSettings.js.map +2 -2
  10. package/dist/creek-layout/index.d.ts +1 -0
  11. package/dist/creek-layout/index.js +5 -4
  12. package/dist/creek-layout/index.js.map +2 -2
  13. package/dist/creek-layout/useLayoutSettingsStore.d.ts +2 -2
  14. package/dist/creek-layout/useLayoutSettingsStore.js +11 -4
  15. package/dist/creek-layout/useLayoutSettingsStore.js.map +2 -2
  16. package/dist/creek-table/SearchTable.js +18 -0
  17. package/dist/creek-table/SearchTable.js.map +2 -2
  18. package/dist/creek-table/components/EllipsisTooltip.js +6 -2
  19. package/dist/creek-table/components/EllipsisTooltip.js.map +2 -2
  20. package/dist/creek-table/hooks/useEllipsisColumns.js +3 -0
  21. package/dist/creek-table/hooks/useEllipsisColumns.js.map +2 -2
  22. package/dist/creek-table/hooks/useIndexColumn.js +1 -1
  23. package/dist/creek-table/hooks/useIndexColumn.js.map +1 -1
  24. package/package.json +1 -1
  25. package/src/creek-config-provider/index.tsx +16 -15
  26. package/src/creek-keep-alive/index.tsx +15 -12
  27. package/src/creek-layout/ActionRender/LayoutSettings.tsx +30 -20
  28. package/src/creek-layout/index.tsx +6 -4
  29. package/src/creek-layout/useLayoutSettingsStore.ts +12 -3
  30. package/src/creek-table/SearchTable.tsx +22 -1
  31. package/src/creek-table/components/EllipsisTooltip.tsx +6 -2
  32. package/src/creek-table/hooks/useEllipsisColumns.tsx +5 -0
  33. package/src/creek-table/hooks/useIndexColumn.tsx +1 -1
  34. package/dist/creek-config-provider/CreekConfigContext.d.ts.map +0 -1
  35. package/dist/creek-config-provider/CreekI18nProvider.d.ts.map +0 -1
  36. package/dist/creek-config-provider/index.d.ts.map +0 -1
  37. package/dist/creek-hooks/index.d.ts.map +0 -1
  38. package/dist/creek-hooks/useApp/DrawerHelper.d.ts.map +0 -1
  39. package/dist/creek-hooks/useApp/ModalHelper.d.ts.map +0 -1
  40. package/dist/creek-hooks/useApp/index.d.ts.map +0 -1
  41. package/dist/creek-hooks/useApp/types.d.ts.map +0 -1
  42. package/dist/creek-hooks/useViewportHeight.d.ts.map +0 -1
  43. package/dist/creek-icon/index.d.ts.map +0 -1
  44. package/dist/creek-keep-alive/index.d.ts.map +0 -1
  45. package/dist/creek-layout/ActionRender/FullScreen.d.ts.map +0 -1
  46. package/dist/creek-layout/ActionRender/LayoutSettings.d.ts.map +0 -1
  47. package/dist/creek-layout/ActionRender/UserInfo.d.ts.map +0 -1
  48. package/dist/creek-layout/ActionRender/index.d.ts.map +0 -1
  49. package/dist/creek-layout/CollapseButton.d.ts.map +0 -1
  50. package/dist/creek-layout/Exception/NotFound.d.ts.map +0 -1
  51. package/dist/creek-layout/Exception/NotFoundPage.d.ts.map +0 -1
  52. package/dist/creek-layout/Exception/index.d.ts.map +0 -1
  53. package/dist/creek-layout/index.d.ts.map +0 -1
  54. package/dist/creek-layout/useLayoutSettingsStore.d.ts.map +0 -1
  55. package/dist/creek-loading/index.d.ts.map +0 -1
  56. package/dist/creek-locale-button/index.d.ts.map +0 -1
  57. package/dist/creek-page-container/index.d.ts.map +0 -1
  58. package/dist/creek-style/index.d.ts.map +0 -1
  59. package/dist/creek-style/scrollbar.d.ts.map +0 -1
  60. package/dist/creek-table/SearchTable.d.ts.map +0 -1
  61. package/dist/creek-table/components/DensityIcon.d.ts.map +0 -1
  62. package/dist/creek-table/components/EllipsisTooltip.d.ts.map +0 -1
  63. package/dist/creek-table/components/index.d.ts.map +0 -1
  64. package/dist/creek-table/hooks/index.d.ts.map +0 -1
  65. package/dist/creek-table/hooks/useAdaptiveToolBar.d.ts.map +0 -1
  66. package/dist/creek-table/hooks/useAutoWidthColumns.d.ts.map +0 -1
  67. package/dist/creek-table/hooks/useElementDistance.d.ts.map +0 -1
  68. package/dist/creek-table/hooks/useEllipsisColumns.d.ts.map +0 -1
  69. package/dist/creek-table/hooks/useIndexColumn.d.ts.map +0 -1
  70. package/dist/creek-table/hooks/useResizableColumns.d.ts.map +0 -1
  71. package/dist/creek-table/hooks/useStatusColumns.d.ts.map +0 -1
  72. package/dist/creek-table/hooks/useTableOptions.d.ts.map +0 -1
  73. package/dist/creek-table/hooks/useTableScrollHeight.d.ts.map +0 -1
  74. package/dist/creek-table/index.d.ts.map +0 -1
  75. package/dist/creek-table/type.d.ts.map +0 -1
  76. package/dist/index.d.ts.map +0 -1
  77. package/dist/locales/en_US.d.ts.map +0 -1
  78. package/dist/locales/zh_CN.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/creek-table/SearchTable.tsx"],
4
- "sourcesContent": ["import { ParamsType, ProTable } from '@ant-design/pro-components';\nimport { useSafeState } from 'ahooks';\nimport { createStyles } from 'antd-style';\nimport classnames from 'classnames';\nimport { useRef } from 'react';\n\nimport { GlobalScrollbarStyle } from '../creek-style';\nimport { useAutoWidthColumns, useEllipsisColumns, useIndexColumn, useResizableColumns, useTableOptions, useTableScrollHeight } from './hooks';\n\nimport { CreekTableProps } from './type';\n\nexport type SearchTableStyleOptions = {\n prefixCls?: string;\n scrollY?: number;\n tableContainerHeight?: number;\n tableHeight?: number;\n bordered?: boolean;\n hasHeaderTitle?: boolean;\n hasScroll?: boolean;\n};\n\nconst useStyles = createStyles(({ token }, options: SearchTableStyleOptions) => {\n const { prefixCls = 'ant', scrollY, tableHeight, bordered, hasHeaderTitle, tableContainerHeight, hasScroll } = options;\n return {\n 'creek-table-container': {\n overflow: 'hidden',\n position: 'relative',\n height: tableHeight ? `${tableHeight}px` : 'auto',\n backgroundColor: token.colorBgContainer,\n [`.${prefixCls}-table`]: {\n minHeight: `${tableContainerHeight}px`,\n },\n [`.${prefixCls}-table-container`]: {\n borderBottom: 'none',\n overflow: 'hidden'\n },\n \n [`.${prefixCls}-table-header`]: {\n borderRight: (bordered && hasScroll) ? `1px solid ${token.colorBorderSecondary}` : 'none',\n },\n [`.${prefixCls}-table-body`]: {\n overflowY: 'auto',\n maxHeight: `${scrollY}px`,\n borderRight: (bordered && hasScroll) ? `1px solid ${token.colorBorderSecondary}` : 'none',\n },\n // 兼容非 scroll.y 模式下的 table 容器\n [`.${prefixCls}-table-content`]: {\n overflowY: 'hidden',\n maxHeight: scrollY ? `${scrollY}px` : undefined,\n },\n\n [`.${prefixCls}-table-cell-scrollbar`]: {\n boxShadow: bordered ? 'none!important' : 'inherit',\n borderInlineEnd: bordered ? `none!important` : 'none',\n display: hasScroll ? 'table-cell' : 'none',\n width: hasScroll ? 'initial' : '0px!important',\n minWidth: hasScroll ? 'initial' : '0px!important',\n maxWidth: hasScroll ? 'initial' : '0px!important',\n padding: hasScroll ? 'initial' : '0px!important',\n margin: hasScroll ? 'initial' : '0px!important',\n },\n\n [`.${prefixCls}-pagination`]: {\n [`.${prefixCls}-pagination-total-text`]: {\n flex: 1,\n },\n },\n [`.${prefixCls}-pro-table-search`]: {\n marginBlockEnd: 0,\n borderBottom: `1px solid ${token.colorBorderSecondary}`,\n },\n\n [`.${prefixCls}-pro-query-filter-container`]: {\n [`.${prefixCls}-pro-query-filter`]: {\n padding: token.paddingXS,\n },\n },\n\n // 如果没有 headerTitle,toolbar 展示在 headerTitle 的区域\n [`.${prefixCls}-pro-table-list-toolbar-right`]: !hasHeaderTitle\n ? {\n flex: 1,\n }\n : {},\n [`.${prefixCls}-pro-table-list-toolbar-setting-items`]: !hasHeaderTitle\n ? {\n marginLeft: 'auto',\n }\n : {},\n },\n };\n});\n\n// 独立的 ProTable 组件\nexport const SearchProTable = <T extends ParamsType, U extends ParamsType, ValueType = 'text'>(props: CreekTableProps<T, U, ValueType>) => {\n const {\n columns,\n prefixCls = 'ant',\n className,\n optionsRender,\n tableViewRender,\n pagination,\n pageFixedBottom = true,\n pageFixedBottomConfig,\n resizable = true,\n bordered = true,\n options,\n size,\n headerTitle,\n showIndex = true,\n ...restProps\n } = props;\n\n const proTableRef = useRef<HTMLDivElement>(null);\n\n // 状态提升:管理列宽调整状态,以便 useAutoWidthColumns 能感知到\n const [resizedWidths, setResizedWidths] = useSafeState<Record<string, number>>({});\n\n // 使用自定义 Hook 管理 options 和 size\n const { finalOptions, tableSize, finalOptionsRender } = useTableOptions<T, U, ValueType>(options, size, optionsRender);\n\n const columnsWithIndex = useIndexColumn<T, ValueType>(columns, showIndex);\n\n // 处理 columns,默认开启 ellipsis\n const processedColumns = useEllipsisColumns(columnsWithIndex);\n\n const { columns: adaptiveColumns, totalWidth } = useAutoWidthColumns<T, ValueType>(processedColumns, proTableRef, resizedWidths, bordered, tableSize);\n\n const { columns: resizableColumns, components } = useResizableColumns<T, ValueType>(adaptiveColumns, resizable, resizedWidths, setResizedWidths, proTableRef);\n\n const { scrollY, tableHeight, tableContainerHeight, hasScroll } = useTableScrollHeight(prefixCls, proTableRef, pageFixedBottom, pageFixedBottomConfig?.bottomFix);\n\n const { styles } = useStyles({ scrollY, tableHeight, prefixCls, bordered, hasHeaderTitle: !!headerTitle, tableContainerHeight, hasScroll });\n\n\n return (\n <div ref={proTableRef}>\n <GlobalScrollbarStyle />\n {/* 自定义滚动条 */}\n <ProTable<T, U, ValueType>\n components={components}\n headerTitle={headerTitle}\n options={finalOptions}\n optionsRender={finalOptionsRender}\n size={tableSize}\n {...restProps}\n className={classnames(styles['creek-table-container'], className)}\n columns={resizableColumns}\n bordered={bordered}\n scroll={{\n y: hasScroll ? scrollY || restProps.scroll?.y : undefined,\n x: totalWidth ?? restProps.scroll?.x,\n }}\n toolbar={{\n ...restProps.toolbar,\n }}\n />\n </div>\n );\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ParamsType, ProTable } from '@ant-design/pro-components';\nimport { useSafeState } from 'ahooks';\nimport { createStyles } from 'antd-style';\nimport classnames from 'classnames';\nimport { useMemo, useRef } from 'react';\n\nimport { GlobalScrollbarStyle } from '../creek-style';\nimport { useAutoWidthColumns, useEllipsisColumns, useIndexColumn, useResizableColumns, useTableOptions, useTableScrollHeight } from './hooks';\n\nimport { CreekTableProps } from './type';\n\nexport type SearchTableStyleOptions = {\n prefixCls?: string;\n scrollY?: number;\n tableContainerHeight?: number;\n tableHeight?: number;\n bordered?: boolean;\n hasHeaderTitle?: boolean;\n hasScroll?: boolean;\n};\n\nconst useStyles = createStyles(({ token }, options: SearchTableStyleOptions) => {\n const { prefixCls = 'ant', scrollY, tableHeight, bordered, hasHeaderTitle, tableContainerHeight, hasScroll } = options;\n return {\n 'creek-table-container': {\n overflow: 'hidden',\n position: 'relative',\n height: tableHeight ? `${tableHeight}px` : 'auto',\n backgroundColor: token.colorBgContainer,\n [`.${prefixCls}-table`]: {\n minHeight: `${tableContainerHeight}px`,\n },\n [`.${prefixCls}-table-container`]: {\n borderBottom: 'none',\n overflow: 'hidden'\n },\n \n [`.${prefixCls}-table-header`]: {\n borderRight: (bordered && hasScroll) ? `1px solid ${token.colorBorderSecondary}` : 'none',\n },\n [`.${prefixCls}-table-body`]: {\n overflowY: 'auto',\n maxHeight: `${scrollY}px`,\n borderRight: (bordered && hasScroll) ? `1px solid ${token.colorBorderSecondary}` : 'none',\n },\n // 兼容非 scroll.y 模式下的 table 容器\n [`.${prefixCls}-table-content`]: {\n overflowY: 'hidden',\n maxHeight: scrollY ? `${scrollY}px` : undefined,\n },\n\n [`.${prefixCls}-table-cell-scrollbar`]: {\n boxShadow: bordered ? 'none!important' : 'inherit',\n borderInlineEnd: bordered ? `none!important` : 'none',\n display: hasScroll ? 'table-cell' : 'none',\n width: hasScroll ? 'initial' : '0px!important',\n minWidth: hasScroll ? 'initial' : '0px!important',\n maxWidth: hasScroll ? 'initial' : '0px!important',\n padding: hasScroll ? 'initial' : '0px!important',\n margin: hasScroll ? 'initial' : '0px!important',\n },\n\n [`.${prefixCls}-pagination`]: {\n [`.${prefixCls}-pagination-total-text`]: {\n flex: 1,\n },\n },\n [`.${prefixCls}-pro-table-search`]: {\n marginBlockEnd: 0,\n borderBottom: `1px solid ${token.colorBorderSecondary}`,\n },\n\n [`.${prefixCls}-pro-query-filter-container`]: {\n [`.${prefixCls}-pro-query-filter`]: {\n padding: token.paddingXS,\n },\n },\n\n // 树形数据展开图标样式\n [`.${prefixCls}-table-row-expand-icon`]: {\n marginInlineEnd: 4,\n flexShrink: 0,\n },\n\n // 如果没有 headerTitle,toolbar 展示在 headerTitle 的区域\n [`.${prefixCls}-pro-table-list-toolbar-right`]: !hasHeaderTitle\n ? {\n flex: 1,\n }\n : {},\n [`.${prefixCls}-pro-table-list-toolbar-setting-items`]: !hasHeaderTitle\n ? {\n marginLeft: 'auto',\n }\n : {},\n },\n };\n});\n\n// 独立的 ProTable 组件\nexport const SearchProTable = <T extends ParamsType, U extends ParamsType, ValueType = 'text'>(props: CreekTableProps<T, U, ValueType>) => {\n const {\n columns,\n prefixCls = 'ant',\n className,\n optionsRender,\n tableViewRender,\n pagination,\n pageFixedBottom = true,\n pageFixedBottomConfig,\n resizable = true,\n bordered = true,\n options,\n size,\n headerTitle,\n showIndex = true,\n expandable,\n ...restProps\n } = props;\n\n // 当序号列存在时,将树形展开控件从序号列(第一列 pos=0)移到第一个数据列(pos=1),\n // 避免序号列宽度不足以容纳树形缩进和展开图标导致显示异常\n // 即使 expandable 未提供,也预设 columnPos,因为 Ant Design Table 会自动检测 children 字段开启树形模式\n const finalExpandable = useMemo(() => {\n if (!showIndex) return expandable;\n if (!expandable) return { columnPos: 1 };\n if ((expandable as any).columnPos === undefined) {\n return { ...expandable, columnPos: 1 };\n }\n return expandable;\n }, [expandable, showIndex]);\n\n const proTableRef = useRef<HTMLDivElement>(null);\n\n // 状态提升:管理列宽调整状态,以便 useAutoWidthColumns 能感知到\n const [resizedWidths, setResizedWidths] = useSafeState<Record<string, number>>({});\n\n // 使用自定义 Hook 管理 options 和 size\n const { finalOptions, tableSize, finalOptionsRender } = useTableOptions<T, U, ValueType>(options, size, optionsRender);\n\n const columnsWithIndex = useIndexColumn<T, ValueType>(columns, showIndex);\n\n // 处理 columns,默认开启 ellipsis\n const processedColumns = useEllipsisColumns(columnsWithIndex);\n\n const { columns: adaptiveColumns, totalWidth } = useAutoWidthColumns<T, ValueType>(processedColumns, proTableRef, resizedWidths, bordered, tableSize);\n\n const { columns: resizableColumns, components } = useResizableColumns<T, ValueType>(adaptiveColumns, resizable, resizedWidths, setResizedWidths, proTableRef);\n\n const { scrollY, tableHeight, tableContainerHeight, hasScroll } = useTableScrollHeight(prefixCls, proTableRef, pageFixedBottom, pageFixedBottomConfig?.bottomFix);\n\n const { styles } = useStyles({ scrollY, tableHeight, prefixCls, bordered, hasHeaderTitle: !!headerTitle, tableContainerHeight, hasScroll });\n\n\n return (\n <div ref={proTableRef}>\n <GlobalScrollbarStyle />\n {/* 自定义滚动条 */}\n <ProTable<T, U, ValueType>\n components={components}\n headerTitle={headerTitle}\n options={finalOptions}\n optionsRender={finalOptionsRender}\n size={tableSize}\n {...restProps}\n pagination={pagination}\n expandable={finalExpandable}\n className={classnames(styles['creek-table-container'], className)}\n columns={resizableColumns}\n bordered={bordered}\n scroll={{\n y: hasScroll ? scrollY || restProps.scroll?.y : undefined,\n x: totalWidth ?? restProps.scroll?.x,\n }}\n toolbar={{\n ...restProps.toolbar,\n }}\n />\n </div>\n );\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["classnames"]
7
7
  }
@@ -41,12 +41,15 @@ var import_jsx_runtime = require("react/jsx-runtime");
41
41
  var useStyles = (0, import_antd_style.createStyles)(({ css, token }) => {
42
42
  return {
43
43
  text: css`
44
- width: 100%;
44
+ max-width: 100%;
45
45
  margin: 0;
46
46
  padding: 0;
47
- // Ensure the wrapper behaves like a block/inline-block that can have width
48
47
  display: block;
49
48
  overflow: hidden;
49
+ // flex: 1 确保在树形表格的 flex 单元格中填充剩余空间(展开图标/层级缩进之后)
50
+ // min-width: 0 允许收缩以配合 Typography.Text 的 ellipsis 截断
51
+ flex: 1;
52
+ min-width: 0;
50
53
  `,
51
54
  tooltipContent: css`
52
55
  max-width: 500px;
@@ -56,6 +59,7 @@ var useStyles = (0, import_antd_style.createStyles)(({ css, token }) => {
56
59
  tooltipText: css`
57
60
  word-break: break-all;
58
61
  white-space: pre-wrap;
62
+ color: #fff;
59
63
  `,
60
64
  copyIcon: css`
61
65
  cursor: pointer;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/creek-table/components/EllipsisTooltip.tsx"],
4
- "sourcesContent": ["import { CopyOutlined } from '@ant-design/icons';\nimport { ConfigProvider, Flex, Tooltip, Typography, message } from 'antd';\nimport { createStyles } from 'antd-style';\nimport React, { useContext, useEffect, useRef, useState } from 'react';\n\nimport { useT } from '@creekjs/i18n/react';\n\nconst useStyles = createStyles(({ css, token }) => {\n return {\n text: css`\n width: 100%;\n margin: 0;\n padding: 0;\n // Ensure the wrapper behaves like a block/inline-block that can have width\n display: block;\n overflow: hidden;\n `,\n tooltipContent: css`\n max-width: 500px;\n max-height: 300px;\n overflow-y: auto;\n `,\n tooltipText: css`\n word-break: break-all;\n white-space: pre-wrap;\n `,\n copyIcon: css`\n cursor: pointer;\n color: inherit;\n transition: color 0.2s;\n\n &:hover {\n color: ${token.colorPrimary};\n }\n `,\n };\n});\n\n/**\n * 使用 Antd Typography 组件实现省略提示\n * 修复了 findDOMNode 警告问题:通过显式使用 Tooltip 包裹 div 容器\n * 实现了智能提示:只有内容实际溢出时才显示 Tooltip\n */\nexport const EllipsisTooltip = ({ children }: { children: React.ReactNode }) => {\n const t = useT();\n\n const { styles } = useStyles();\n const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);\n const textRef = useRef<HTMLDivElement>(null);\n const [isEllipsis, setIsEllipsis] = useState(false);\n const isSimpleContent = typeof children === 'string' || typeof children === 'number';\n\n useEffect(() => {\n const checkEllipsis = () => {\n if (textRef.current) {\n const prefixCls = getPrefixCls('typography');\n // Typography.Text renders a span or div with .ant-typography\n const typographyEl = textRef.current.querySelector(`.${prefixCls}`);\n if (typographyEl) {\n // For simple ellipsis={true}, Antd uses CSS ellipsis.\n // We can detect if it's truncated by comparing scrollWidth and clientWidth\n // We add a small buffer (1px) for browser sub-pixel rendering differences\n setIsEllipsis(typographyEl.scrollWidth > typographyEl.clientWidth + 1);\n }\n }\n };\n\n // Initial check\n checkEllipsis();\n // Use ResizeObserver for more robust size change detection\n const observer = new ResizeObserver(checkEllipsis);\n if (textRef.current) {\n observer.observe(textRef.current);\n }\n\n return () => {\n observer.disconnect();\n };\n }, [children]);\n\n const text = String(children);\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n navigator.clipboard\n .writeText(text)\n .then(() => {\n message.success(t('creek-table.components.EllipsisTooltip.fuZhiChengGong', '复制成功'));\n })\n .catch(() => {\n message.error(t('creek-table.components.EllipsisTooltip.fuZhiShiBai', '复制失败'));\n });\n };\n\n // Memoize tooltip title content\n const tooltipTitle = React.useMemo(() => {\n if (!isSimpleContent) {\n return children;\n }\n return (\n <Flex align=\"center\" gap={8} className={styles.tooltipContent}>\n <span className={styles.tooltipText}>{children}</span>\n <CopyOutlined onClick={handleCopy} className={styles.copyIcon} title={t('creek-table.components.EllipsisTooltip.fuZhi', '复制')} />\n </Flex>\n );\n }, [children, isSimpleContent]);\n\n return (\n <Tooltip title={isEllipsis ? tooltipTitle : undefined} placement=\"topLeft\" mouseLeaveDelay={0.2} getPopupContainer={() => document.body}>\n <div ref={textRef} className={styles.text}>\n <Typography.Text ellipsis={true}>{children}</Typography.Text>\n </div>\n </Tooltip>\n );\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6B;AAC7B,kBAAmE;AACnE,wBAA6B;AAC7B,mBAA+D;AAE/D,IAAAA,gBAAqB;AAgGf;AA9FN,IAAM,gBAAY,gCAAa,CAAC,EAAE,KAAK,MAAM,MAAM;AACjD,SAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQN,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKhB,aAAa;AAAA;AAAA;AAAA;AAAA,IAIb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMG,MAAM;AAAA;AAAA;AAAA,EAGrB;AACF,CAAC;AAOM,IAAM,kBAAkB,CAAC,EAAE,SAAS,MAAqC;AAC9E,QAAM,QAAI,oBAAK;AAEf,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,EAAE,aAAa,QAAI,yBAAW,2BAAe,aAAa;AAChE,QAAM,cAAU,qBAAuB,IAAI;AAC3C,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,kBAAkB,OAAO,aAAa,YAAY,OAAO,aAAa;AAE5E,8BAAU,MAAM;AACd,UAAM,gBAAgB,MAAM;AAC1B,UAAI,QAAQ,SAAS;AACnB,cAAM,YAAY,aAAa,YAAY;AAE3C,cAAM,eAAe,QAAQ,QAAQ,cAAc,IAAI,WAAW;AAClE,YAAI,cAAc;AAIhB,wBAAc,aAAa,cAAc,aAAa,cAAc,CAAC;AAAA,QACvE;AAAA,MACF;AAAA,IACF;AAGA,kBAAc;AAEd,UAAM,WAAW,IAAI,eAAe,aAAa;AACjD,QAAI,QAAQ,SAAS;AACnB,eAAS,QAAQ,QAAQ,OAAO;AAAA,IAClC;AAEA,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,OAAO,OAAO,QAAQ;AAE5B,QAAM,aAAa,CAAC,MAAwB;AAC1C,MAAE,gBAAgB;AAClB,MAAE,eAAe;AACjB,cAAU,UACP,UAAU,IAAI,EACd,KAAK,MAAM;AACV,0BAAQ,QAAQ,EAAE,yDAAyD,MAAM,CAAC;AAAA,IACpF,CAAC,EACA,MAAM,MAAM;AACX,0BAAQ,MAAM,EAAE,sDAAsD,MAAM,CAAC;AAAA,IAC/E,CAAC;AAAA,EACL;AAGA,QAAM,eAAe,aAAAC,QAAM,QAAQ,MAAM;AACvC,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AACA,WACE,6CAAC,oBAAK,OAAM,UAAS,KAAK,GAAG,WAAW,OAAO,gBAC7C;AAAA,kDAAC,UAAK,WAAW,OAAO,aAAc,UAAS;AAAA,MAC/C,4CAAC,6BAAa,SAAS,YAAY,WAAW,OAAO,UAAU,OAAO,EAAE,gDAAgD,IAAI,GAAG;AAAA,OACjI;AAAA,EAEJ,GAAG,CAAC,UAAU,eAAe,CAAC;AAE9B,SACE,4CAAC,uBAAQ,OAAO,aAAa,eAAe,QAAW,WAAU,WAAU,iBAAiB,KAAK,mBAAmB,MAAM,SAAS,MACjI,sDAAC,SAAI,KAAK,SAAS,WAAW,OAAO,MACnC,sDAAC,uBAAW,MAAX,EAAgB,UAAU,MAAO,UAAS,GAC7C,GACF;AAEJ;",
4
+ "sourcesContent": ["import { CopyOutlined } from '@ant-design/icons';\nimport { ConfigProvider, Flex, Tooltip, Typography, message } from 'antd';\nimport { createStyles } from 'antd-style';\nimport React, { useContext, useEffect, useRef, useState } from 'react';\n\nimport { useT } from '@creekjs/i18n/react';\n\nconst useStyles = createStyles(({ css, token }) => {\n return {\n text: css`\n max-width: 100%;\n margin: 0;\n padding: 0;\n display: block;\n overflow: hidden;\n // flex: 1 确保在树形表格的 flex 单元格中填充剩余空间(展开图标/层级缩进之后)\n // min-width: 0 允许收缩以配合 Typography.Text 的 ellipsis 截断\n flex: 1;\n min-width: 0;\n `,\n tooltipContent: css`\n max-width: 500px;\n max-height: 300px;\n overflow-y: auto;\n `,\n tooltipText: css`\n word-break: break-all;\n white-space: pre-wrap;\n color: #fff;\n `,\n copyIcon: css`\n cursor: pointer;\n color: inherit;\n transition: color 0.2s;\n\n &:hover {\n color: ${token.colorPrimary};\n }\n `,\n };\n});\n\n/**\n * 使用 Antd Typography 组件实现省略提示\n * 修复了 findDOMNode 警告问题:通过显式使用 Tooltip 包裹 div 容器\n * 实现了智能提示:只有内容实际溢出时才显示 Tooltip\n */\nexport const EllipsisTooltip = ({ children }: { children: React.ReactNode }) => {\n const t = useT();\n\n const { styles } = useStyles();\n const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);\n const textRef = useRef<HTMLDivElement>(null);\n const [isEllipsis, setIsEllipsis] = useState(false);\n const isSimpleContent = typeof children === 'string' || typeof children === 'number';\n\n useEffect(() => {\n const checkEllipsis = () => {\n if (textRef.current) {\n const prefixCls = getPrefixCls('typography');\n // Typography.Text renders a span or div with .ant-typography\n const typographyEl = textRef.current.querySelector(`.${prefixCls}`);\n if (typographyEl) {\n // For simple ellipsis={true}, Antd uses CSS ellipsis.\n // We can detect if it's truncated by comparing scrollWidth and clientWidth\n // We add a small buffer (1px) for browser sub-pixel rendering differences\n setIsEllipsis(typographyEl.scrollWidth > typographyEl.clientWidth + 1);\n }\n }\n };\n\n // Initial check\n checkEllipsis();\n // Use ResizeObserver for more robust size change detection\n const observer = new ResizeObserver(checkEllipsis);\n if (textRef.current) {\n observer.observe(textRef.current);\n }\n\n return () => {\n observer.disconnect();\n };\n }, [children]);\n\n const text = String(children);\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n navigator.clipboard\n .writeText(text)\n .then(() => {\n message.success(t('creek-table.components.EllipsisTooltip.fuZhiChengGong', '复制成功'));\n })\n .catch(() => {\n message.error(t('creek-table.components.EllipsisTooltip.fuZhiShiBai', '复制失败'));\n });\n };\n\n // Memoize tooltip title content\n const tooltipTitle = React.useMemo(() => {\n if (!isSimpleContent) {\n return children;\n }\n return (\n <Flex align=\"center\" gap={8} className={styles.tooltipContent}>\n <span className={styles.tooltipText}>{children}</span>\n <CopyOutlined onClick={handleCopy} className={styles.copyIcon} title={t('creek-table.components.EllipsisTooltip.fuZhi', '复制')} />\n </Flex>\n );\n }, [children, isSimpleContent]);\n\n return (\n <Tooltip title={isEllipsis ? tooltipTitle : undefined} placement=\"topLeft\" mouseLeaveDelay={0.2} getPopupContainer={() => document.body}>\n <div ref={textRef} className={styles.text}>\n <Typography.Text ellipsis={true}>{children}</Typography.Text>\n </div>\n </Tooltip>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6B;AAC7B,kBAAmE;AACnE,wBAA6B;AAC7B,mBAA+D;AAE/D,IAAAA,gBAAqB;AAoGf;AAlGN,IAAM,gBAAY,gCAAa,CAAC,EAAE,KAAK,MAAM,MAAM;AACjD,SAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWN,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKhB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMG,MAAM;AAAA;AAAA;AAAA,EAGrB;AACF,CAAC;AAOM,IAAM,kBAAkB,CAAC,EAAE,SAAS,MAAqC;AAC9E,QAAM,QAAI,oBAAK;AAEf,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,EAAE,aAAa,QAAI,yBAAW,2BAAe,aAAa;AAChE,QAAM,cAAU,qBAAuB,IAAI;AAC3C,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,kBAAkB,OAAO,aAAa,YAAY,OAAO,aAAa;AAE5E,8BAAU,MAAM;AACd,UAAM,gBAAgB,MAAM;AAC1B,UAAI,QAAQ,SAAS;AACnB,cAAM,YAAY,aAAa,YAAY;AAE3C,cAAM,eAAe,QAAQ,QAAQ,cAAc,IAAI,WAAW;AAClE,YAAI,cAAc;AAIhB,wBAAc,aAAa,cAAc,aAAa,cAAc,CAAC;AAAA,QACvE;AAAA,MACF;AAAA,IACF;AAGA,kBAAc;AAEd,UAAM,WAAW,IAAI,eAAe,aAAa;AACjD,QAAI,QAAQ,SAAS;AACnB,eAAS,QAAQ,QAAQ,OAAO;AAAA,IAClC;AAEA,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,OAAO,OAAO,QAAQ;AAE5B,QAAM,aAAa,CAAC,MAAwB;AAC1C,MAAE,gBAAgB;AAClB,MAAE,eAAe;AACjB,cAAU,UACP,UAAU,IAAI,EACd,KAAK,MAAM;AACV,0BAAQ,QAAQ,EAAE,yDAAyD,MAAM,CAAC;AAAA,IACpF,CAAC,EACA,MAAM,MAAM;AACX,0BAAQ,MAAM,EAAE,sDAAsD,MAAM,CAAC;AAAA,IAC/E,CAAC;AAAA,EACL;AAGA,QAAM,eAAe,aAAAC,QAAM,QAAQ,MAAM;AACvC,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AACA,WACE,6CAAC,oBAAK,OAAM,UAAS,KAAK,GAAG,WAAW,OAAO,gBAC7C;AAAA,kDAAC,UAAK,WAAW,OAAO,aAAc,UAAS;AAAA,MAC/C,4CAAC,6BAAa,SAAS,YAAY,WAAW,OAAO,UAAU,OAAO,EAAE,gDAAgD,IAAI,GAAG;AAAA,OACjI;AAAA,EAEJ,GAAG,CAAC,UAAU,eAAe,CAAC;AAE9B,SACE,4CAAC,uBAAQ,OAAO,aAAa,eAAe,QAAW,WAAU,WAAU,iBAAiB,KAAK,mBAAmB,MAAM,SAAS,MACjI,sDAAC,SAAI,KAAK,SAAS,WAAW,OAAO,MACnC,sDAAC,uBAAW,MAAX,EAAgB,UAAU,MAAO,UAAS,GAC7C,GACF;AAEJ;",
6
6
  "names": ["import_react", "React"]
7
7
  }
@@ -31,6 +31,9 @@ var useEllipsisColumns = (columns) => {
31
31
  if (col.valueType === "option") {
32
32
  return col;
33
33
  }
34
+ if (col.disable) {
35
+ return col;
36
+ }
34
37
  return {
35
38
  ...col,
36
39
  // 关闭 Table 自带的 ellipsis title,因为我们要用自己的 Tooltip
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/creek-table/hooks/useEllipsisColumns.tsx"],
4
- "sourcesContent": ["import type { ParamsType, ProColumns } from '@ant-design/pro-components';\nimport React, { useMemo } from 'react';\nimport { EllipsisTooltip } from '../components';\n\n/**\n * 默认开启 ellipsis 的 Hook\n * 1. 如果用户未配置 ellipsis,默认开启,并使用 Tooltip 显示完整内容\n * 2. 如果是 option 列,默认不开启\n * 3. 尊重用户配置\n */\nexport const useEllipsisColumns = <T extends ParamsType, ValueType = 'text'>(\n columns: ProColumns<T, ValueType>[] | undefined,\n) => {\n const processedColumns = useMemo(() => {\n return columns?.map((col) => {\n // 对于操作列,默认不开启 ellipsis\n if (col.valueType === 'option') {\n return col;\n }\n // 其他列默认开启 ellipsis,并使用自定义渲染\n return {\n ...col,\n // 关闭 Table 自带的 ellipsis title,因为我们要用自己的 Tooltip\n // 但保留 ellipsis 属性以确保 Table 传递正确的样式给 cell(虽然我们的 EllipsisTooltip 也有样式)\n // 实际上,为了让 EllipsisTooltip 占据 100% 宽度并生效,最好让 Table cell 也保持一定的约束\n ellipsis: {\n showTitle: false,\n },\n render: (dom: React.ReactNode, entity: T, index: number, action: any, schema: any) => {\n const originalRenderResult = col.render ? (col.render(dom, entity, index, action, schema) as React.ReactNode) : dom;\n \n // 如果内容为空,直接返回\n if (originalRenderResult === null || originalRenderResult === undefined || originalRenderResult === '') {\n return originalRenderResult;\n }\n\n // 如果是简单的文本或数字,使用 EllipsisTooltip 包裹\n return (\n <EllipsisTooltip>{originalRenderResult}</EllipsisTooltip>\n );\n },\n } as ProColumns<T, ValueType>;\n });\n }, [columns]);\n\n return processedColumns;\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA+B;AAC/B,wBAAgC;AAoCpB;AA5BL,IAAM,qBAAqB,CAChC,YACG;AACH,QAAM,uBAAmB,sBAAQ,MAAM;AACrC,WAAO,mCAAS,IAAI,CAAC,QAAQ;AAE3B,UAAI,IAAI,cAAc,UAAU;AAC9B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL,GAAG;AAAA;AAAA;AAAA;AAAA,QAIH,UAAU;AAAA,UACR,WAAW;AAAA,QACb;AAAA,QACA,QAAQ,CAAC,KAAsB,QAAW,OAAe,QAAa,WAAgB;AACpF,gBAAM,uBAAuB,IAAI,SAAU,IAAI,OAAO,KAAK,QAAQ,OAAO,QAAQ,MAAM,IAAwB;AAGhH,cAAI,yBAAyB,QAAQ,yBAAyB,UAAa,yBAAyB,IAAI;AACtG,mBAAO;AAAA,UACT;AAGA,iBACE,4CAAC,qCAAiB,gCAAqB;AAAA,QAE3C;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO;AACT;",
4
+ "sourcesContent": ["import type { ParamsType, ProColumns } from '@ant-design/pro-components';\nimport React, { useMemo } from 'react';\nimport { EllipsisTooltip } from '../components';\n\n/**\n * 默认开启 ellipsis 的 Hook\n * 1. 如果用户未配置 ellipsis,默认开启,并使用 Tooltip 显示完整内容\n * 2. 如果是 option 列,默认不开启\n * 3. 尊重用户配置\n */\nexport const useEllipsisColumns = <T extends ParamsType, ValueType = 'text'>(\n columns: ProColumns<T, ValueType>[] | undefined,\n) => {\n const processedColumns = useMemo(() => {\n return columns?.map((col) => {\n // 对于操作列,默认不开启 ellipsis\n if (col.valueType === 'option') {\n return col;\n }\n // 对于 disable 的列(如序号列),不包裹 EllipsisTooltip\n // 避免 EllipsisTooltip 的 width:100% div 与展开图标争抢空间导致重叠\n if (col.disable) {\n return col;\n }\n // 其他列默认开启 ellipsis,并使用自定义渲染\n return {\n ...col,\n // 关闭 Table 自带的 ellipsis title,因为我们要用自己的 Tooltip\n // 但保留 ellipsis 属性以确保 Table 传递正确的样式给 cell(虽然我们的 EllipsisTooltip 也有样式)\n // 实际上,为了让 EllipsisTooltip 占据 100% 宽度并生效,最好让 Table cell 也保持一定的约束\n ellipsis: {\n showTitle: false,\n },\n render: (dom: React.ReactNode, entity: T, index: number, action: any, schema: any) => {\n const originalRenderResult = col.render ? (col.render(dom, entity, index, action, schema) as React.ReactNode) : dom;\n \n // 如果内容为空,直接返回\n if (originalRenderResult === null || originalRenderResult === undefined || originalRenderResult === '') {\n return originalRenderResult;\n }\n\n // 如果是简单的文本或数字,使用 EllipsisTooltip 包裹\n return (\n <EllipsisTooltip>{originalRenderResult}</EllipsisTooltip>\n );\n },\n } as ProColumns<T, ValueType>;\n });\n }, [columns]);\n\n return processedColumns;\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA+B;AAC/B,wBAAgC;AAyCpB;AAjCL,IAAM,qBAAqB,CAChC,YACG;AACH,QAAM,uBAAmB,sBAAQ,MAAM;AACrC,WAAO,mCAAS,IAAI,CAAC,QAAQ;AAE3B,UAAI,IAAI,cAAc,UAAU;AAC9B,eAAO;AAAA,MACT;AAGA,UAAI,IAAI,SAAS;AACf,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL,GAAG;AAAA;AAAA;AAAA;AAAA,QAIH,UAAU;AAAA,UACR,WAAW;AAAA,QACb;AAAA,QACA,QAAQ,CAAC,KAAsB,QAAW,OAAe,QAAa,WAAgB;AACpF,gBAAM,uBAAuB,IAAI,SAAU,IAAI,OAAO,KAAK,QAAQ,OAAO,QAAQ,MAAM,IAAwB;AAGhH,cAAI,yBAAyB,QAAQ,yBAAyB,UAAa,yBAAyB,IAAI;AACtG,mBAAO;AAAA,UACT;AAGA,iBACE,4CAAC,qCAAiB,gCAAqB;AAAA,QAE3C;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -33,7 +33,7 @@ var useIndexColumn = (columns = [], showIndex = true) => {
33
33
  const indexColumn = {
34
34
  title: t("creek-table.hooks.useIndexColumn.xuHao", "序号"),
35
35
  dataIndex: "index",
36
- width: 48,
36
+ width: 56,
37
37
  fixed: "left",
38
38
  disable: true,
39
39
  hideInSearch: true,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/creek-table/hooks/useIndexColumn.tsx"],
4
- "sourcesContent": ["import { ProColumns } from '@ant-design/pro-components';\nimport { useMemo } from 'react';\n\nimport { useT } from '@creekjs/i18n/react';\n\nexport const useIndexColumn = <T = any, ValueType = 'text'>(columns: ProColumns<T, ValueType>[] = [], showIndex: boolean = true) => {\n const t = useT();\n\n return useMemo(() => {\n if (!showIndex) {\n return columns;\n }\n const indexColumn: ProColumns<T, ValueType> = {\n title: t('creek-table.hooks.useIndexColumn.xuHao', '序号'),\n dataIndex: 'index',\n width: 48,\n fixed: 'left',\n disable: true,\n hideInSearch: true,\n render: (dom, entity, index, action, schema) => {\n const { current = 1, pageSize = 20 } = action?.pageInfo || {};\n return (current - 1) * pageSize + index + 1;\n },\n };\n return [indexColumn, ...columns];\n }, [columns, showIndex, t]);\n};\n"],
4
+ "sourcesContent": ["import { ProColumns } from '@ant-design/pro-components';\nimport { useMemo } from 'react';\n\nimport { useT } from '@creekjs/i18n/react';\n\nexport const useIndexColumn = <T = any, ValueType = 'text'>(columns: ProColumns<T, ValueType>[] = [], showIndex: boolean = true) => {\n const t = useT();\n\n return useMemo(() => {\n if (!showIndex) {\n return columns;\n }\n const indexColumn: ProColumns<T, ValueType> = {\n title: t('creek-table.hooks.useIndexColumn.xuHao', '序号'),\n dataIndex: 'index',\n width: 56,\n fixed: 'left',\n disable: true,\n hideInSearch: true,\n render: (dom, entity, index, action, schema) => {\n const { current = 1, pageSize = 20 } = action?.pageInfo || {};\n return (current - 1) * pageSize + index + 1;\n },\n };\n return [indexColumn, ...columns];\n }, [columns, showIndex, t]);\n};\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAwB;AAExB,IAAAA,gBAAqB;AAEd,IAAM,iBAAiB,CAA8B,UAAsC,CAAC,GAAG,YAAqB,SAAS;AAClI,QAAM,QAAI,oBAAK;AAEf,aAAO,sBAAQ,MAAM;AACnB,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AACA,UAAM,cAAwC;AAAA,MAC5C,OAAO,EAAE,0CAA0C,IAAI;AAAA,MACvD,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,MACd,QAAQ,CAAC,KAAK,QAAQ,OAAO,QAAQ,WAAW;AAC9C,cAAM,EAAE,UAAU,GAAG,WAAW,GAAG,KAAI,iCAAQ,aAAY,CAAC;AAC5D,gBAAQ,UAAU,KAAK,WAAW,QAAQ;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,CAAC,aAAa,GAAG,OAAO;AAAA,EACjC,GAAG,CAAC,SAAS,WAAW,CAAC,CAAC;AAC5B;",
6
6
  "names": ["import_react"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@creekjs/web-components",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "keywords": [],
@@ -2,7 +2,6 @@ import type { ConfigProviderProps } from 'antd';
2
2
  import { App, ConfigProvider } from 'antd';
3
3
  import enUS_antd from 'antd/locale/en_US';
4
4
  import zhCN_antd from 'antd/locale/zh_CN';
5
- import merge from 'lodash/merge';
6
5
 
7
6
  import { AppProvider } from '../creek-hooks';
8
7
  import { useLayoutSettingsStore } from '../creek-layout/useLayoutSettingsStore';
@@ -26,20 +25,22 @@ const InnerConfigProvider = (props: Omit<CreekConfigProviderProps, 'locale' | 'm
26
25
 
27
26
  const activeColorPrimary = settingsStore.colorPrimary || theme?.token?.colorPrimary;
28
27
 
29
- let finalTheme = merge(
30
- {},
31
- theme,
32
- activeColorPrimary
33
- ? {
34
- token: {
35
- colorPrimary: activeColorPrimary,
36
- colorLink: activeColorPrimary,
37
- colorLinkHover: activeColorPrimary,
38
- colorLinkActive: activeColorPrimary,
39
- },
40
- }
41
- : {},
42
- );
28
+ const colorPrimaryToken = activeColorPrimary
29
+ ? {
30
+ colorPrimary: activeColorPrimary,
31
+ colorLink: activeColorPrimary,
32
+ colorLinkHover: activeColorPrimary,
33
+ colorLinkActive: activeColorPrimary,
34
+ }
35
+ : {};
36
+
37
+ let finalTheme: ConfigProviderProps['theme'] = {
38
+ ...theme,
39
+ token: {
40
+ ...theme?.token,
41
+ ...colorPrimaryToken,
42
+ },
43
+ };
43
44
 
44
45
  return (
45
46
  <ConfigProvider locale={ANTD_LOCALE_MAP[locale] || zhCN_antd} theme={finalTheme} {...more}>
@@ -15,10 +15,6 @@ export interface CreekKeepAliveProps {
15
15
  * 自定义Tab标题获取方法
16
16
  */
17
17
  getTabTitle?: (pathname: string) => React.ReactNode;
18
- /**
19
- * 默认首页路径
20
- */
21
- homePath?: string;
22
18
  /**
23
19
  * Tabs的样式
24
20
  */
@@ -36,7 +32,7 @@ interface TabItem {
36
32
  }
37
33
 
38
34
  export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
39
- const { exclude = [], getTabTitle, homePath = '/', tabBarStyle, maxTabCount = 20 } = props;
35
+ const { exclude = [], getTabTitle, tabBarStyle, maxTabCount = 20 } = props;
40
36
 
41
37
  const t = useT();
42
38
  const outlet = useOutlet();
@@ -79,10 +75,17 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
79
75
  // 更新 Tab 列表
80
76
  setTabItems((prev) => {
81
77
  if (prev.find((i) => i.key === currentPath)) {
82
- return prev;
78
+ // 更新现有 tab 的 closable 状态(只有最后一个 tab 时不可关闭)
79
+ const updated = prev.map((i) => ({ ...i, closable: prev.length > 1 }));
80
+ return updated;
83
81
  }
84
82
  const title = getTabTitle?.(currentPath) || currentPath;
85
- const newItems = [...prev, { key: currentPath, label: title, closable: currentPath !== homePath }];
83
+ const newItems = [...prev, { key: currentPath, label: title, closable: prev.length > 0 }];
84
+
85
+ // 更新所有 tab 的 closable 状态:只有1个 tab 时全部不可关闭
86
+ if (newItems.length === 1) {
87
+ newItems[0].closable = false;
88
+ }
86
89
 
87
90
  // 超过最大数量限制
88
91
  if (newItems.length > maxTabCount) {
@@ -100,7 +103,7 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
100
103
  }
101
104
  return newItems;
102
105
  });
103
- }, [location.pathname, outlet, getTabTitle, homePath, maxTabCount]);
106
+ }, [location.pathname, outlet, getTabTitle, maxTabCount]);
104
107
 
105
108
  // 清理不需要缓存的页面
106
109
  useEffect(() => {
@@ -128,14 +131,14 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
128
131
  const nextIndex = targetIndex >= newTabItems.length ? newTabItems.length - 1 : targetIndex;
129
132
  const nextKey = newTabItems[nextIndex].key;
130
133
  navigate(nextKey);
131
- } else {
132
- navigate(homePath);
133
134
  }
134
135
  }
135
136
  });
136
137
 
137
138
  const closeOtherTabs = useMemoizedFn((currentKey: string) => {
138
- const newTabItems = tabItems.filter((item) => item.key === currentKey || item.key === homePath);
139
+ const currentTab = tabItems.find((item) => item.key === currentKey);
140
+ if (!currentTab) return;
141
+ const newTabItems = [{ ...currentTab, closable: false }];
139
142
  setTabItems(newTabItems);
140
143
 
141
144
  const keepKeys = newTabItems.map((i) => i.key);
@@ -182,7 +185,7 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
182
185
  {
183
186
  key: 'close',
184
187
  label: t('creek-keep-alive.index.guanBiDangQian', '关闭当前'),
185
- disabled: item.key === homePath,
188
+ disabled: tabItems.length <= 1,
186
189
  onClick: () => closeTab(item.key),
187
190
  },
188
191
  {
@@ -6,7 +6,7 @@ import { useT } from '@creekjs/i18n/react';
6
6
  import { useApp } from '../../creek-hooks';
7
7
  import { useLayoutSettingsStore } from '../useLayoutSettingsStore';
8
8
 
9
- const SettingsForm = ({ defaultShowFullScreen, defaultShowLocaleButton, defaultKeepAlive }: { defaultShowFullScreen?: boolean; defaultShowLocaleButton?: boolean; defaultKeepAlive?: boolean }) => {
9
+ const SettingsForm = ({ defaultShowFullScreen, defaultShowLocaleButton, defaultShowThemeColor, defaultKeepAlive }: { defaultShowFullScreen?: boolean; defaultShowLocaleButton?: boolean; defaultShowThemeColor?: boolean; defaultKeepAlive?: boolean }) => {
10
10
  const t = useT();
11
11
  const { colorPrimary, showFullScreen, showLocaleButton, keepAlive, setSettings } = useLayoutSettingsStore();
12
12
 
@@ -16,24 +16,32 @@ const SettingsForm = ({ defaultShowFullScreen, defaultShowLocaleButton, defaultK
16
16
 
17
17
  return (
18
18
  <Form layout="vertical">
19
- <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.themeColor', '主题色')}>
20
- <ColorPicker
21
- value={colorPrimary}
22
- onChange={(color, hex) => {
23
- setSettings({ colorPrimary: hex || undefined });
24
- }}
25
- allowClear
26
- />
27
- </Form.Item>
28
- <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.showFullScreen', '展示全屏按钮')}>
29
- <Switch checked={currentShowFullScreen} onChange={(checked) => setSettings({ showFullScreen: checked })} />
30
- </Form.Item>
31
- <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.showLocaleButton', '展示国际化按钮')}>
32
- <Switch checked={currentShowLocaleButton} onChange={(checked) => setSettings({ showLocaleButton: checked })} />
33
- </Form.Item>
34
- <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.keepAlive', '开启页面缓存 (Keep Alive)')}>
35
- <Switch checked={currentKeepAlive} onChange={(checked) => setSettings({ keepAlive: checked })} />
36
- </Form.Item>
19
+ {defaultShowThemeColor && (
20
+ <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.themeColor', '主题色')}>
21
+ <ColorPicker
22
+ value={colorPrimary}
23
+ onChange={(color, hex) => {
24
+ setSettings({ colorPrimary: hex || undefined });
25
+ }}
26
+ allowClear
27
+ />
28
+ </Form.Item>
29
+ )}
30
+ {defaultShowFullScreen && (
31
+ <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.showFullScreen', '展示全屏按钮')}>
32
+ <Switch checked={currentShowFullScreen} onChange={(checked) => setSettings({ showFullScreen: checked })} />
33
+ </Form.Item>
34
+ )}
35
+ {defaultShowLocaleButton && (
36
+ <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.showLocaleButton', '展示国际化按钮')}>
37
+ <Switch checked={currentShowLocaleButton} onChange={(checked) => setSettings({ showLocaleButton: checked })} />
38
+ </Form.Item>
39
+ )}
40
+ {defaultKeepAlive && (
41
+ <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.keepAlive', '开启页面缓存 (Keep Alive)')}>
42
+ <Switch checked={currentKeepAlive} onChange={(checked) => setSettings({ keepAlive: checked })} />
43
+ </Form.Item>
44
+ )}
37
45
  </Form>
38
46
  );
39
47
  };
@@ -41,10 +49,12 @@ const SettingsForm = ({ defaultShowFullScreen, defaultShowLocaleButton, defaultK
41
49
  export const LayoutSettings = ({
42
50
  defaultShowFullScreen,
43
51
  defaultShowLocaleButton,
52
+ defaultShowThemeColor,
44
53
  defaultKeepAlive,
45
54
  }: {
46
55
  defaultShowFullScreen?: boolean;
47
56
  defaultShowLocaleButton?: boolean;
57
+ defaultShowThemeColor?: boolean;
48
58
  defaultKeepAlive?: boolean;
49
59
  }) => {
50
60
  const t = useT();
@@ -55,7 +65,7 @@ export const LayoutSettings = ({
55
65
  title: t('creek-layout.ActionRender.LayoutSettings.title', '系统设置'),
56
66
  placement: 'right',
57
67
 
58
- content: <SettingsForm defaultShowFullScreen={defaultShowFullScreen} defaultShowLocaleButton={defaultShowLocaleButton} defaultKeepAlive={defaultKeepAlive} />,
68
+ content: <SettingsForm defaultShowFullScreen={defaultShowFullScreen} defaultShowLocaleButton={defaultShowLocaleButton} defaultShowThemeColor={defaultShowThemeColor} defaultKeepAlive={defaultKeepAlive} />,
59
69
  });
60
70
  };
61
71
 
@@ -23,6 +23,7 @@ export type LayoutProps = ProLayoutProps & {
23
23
  showFullScreen?: boolean;
24
24
  showLocaleButton?: boolean;
25
25
  showSettingsButton?: boolean;
26
+ showThemeColor?: boolean;
26
27
  initialInfo?: {
27
28
  initialState: any;
28
29
  loading: boolean;
@@ -49,6 +50,7 @@ export const CreekLayout = (props: LayoutProps) => {
49
50
  showFullScreen = false,
50
51
  showLocaleButton = false,
51
52
  showSettingsButton = false,
53
+ showThemeColor = true,
52
54
  keepAlive = false,
53
55
  extraActions = [],
54
56
  ...more
@@ -60,10 +62,10 @@ export const CreekLayout = (props: LayoutProps) => {
60
62
  const { collapsed } = useCollapsedStore();
61
63
  const settingsStore = useLayoutSettingsStore();
62
64
 
63
- const actualShowFullScreen = settingsStore.showFullScreen ?? showFullScreen;
64
- const actualShowLocaleButton = settingsStore.showLocaleButton ?? showLocaleButton;
65
+ const actualShowFullScreen = showFullScreen && (settingsStore.showFullScreen ?? true);
66
+ const actualShowLocaleButton = showLocaleButton && (settingsStore.showLocaleButton ?? true);
65
67
  const colorPrimary = settingsStore.colorPrimary || token.colorPrimary;
66
- const actualKeepAlive = settingsStore.keepAlive ?? keepAlive;
68
+ const actualKeepAlive = keepAlive && (settingsStore.keepAlive ?? true);
67
69
 
68
70
  const _userConfig = { ...userConfig, ...runtimeConfig };
69
71
 
@@ -129,7 +131,7 @@ export const CreekLayout = (props: LayoutProps) => {
129
131
  }
130
132
 
131
133
  if (showSettingsButton) {
132
- actions.push(<LayoutSettings key="settings" defaultShowFullScreen={showFullScreen} defaultShowLocaleButton={showLocaleButton} defaultKeepAlive={_.isBoolean(keepAlive) ? keepAlive : true} />);
134
+ actions.push(<LayoutSettings key="settings" defaultShowFullScreen={showFullScreen} defaultShowLocaleButton={showLocaleButton} defaultShowThemeColor={showThemeColor} defaultKeepAlive={_.isBoolean(keepAlive) ? keepAlive : true} />);
133
135
  }
134
136
 
135
137
  const keepAliveProps = _.isBoolean(keepAlive) ? {} : keepAlive;
@@ -13,13 +13,22 @@ export const useLayoutSettingsStore = create<LayoutSettingsStore>()(
13
13
  persist(
14
14
  (set) => ({
15
15
  colorPrimary: undefined,
16
- showFullScreen: false,
17
- showLocaleButton: false,
18
- keepAlive: false,
16
+ showFullScreen: undefined,
17
+ showLocaleButton: undefined,
18
+ keepAlive: undefined,
19
19
  setSettings: (settings) => set((state) => ({ ...state, ...settings })),
20
20
  }),
21
21
  {
22
22
  name: 'creek-layout-settings',
23
+ version: 2,
24
+ migrate: (persistedState: any, version: number) => {
25
+ if (version < 2) {
26
+ // 旧版本布尔默认值为 false,新版本改为 undefined
27
+ // 清除旧版本的布尔类型字段,让外层配置优先生效
28
+ return { ...persistedState, showFullScreen: undefined, showLocaleButton: undefined, keepAlive: undefined };
29
+ }
30
+ return persistedState;
31
+ },
23
32
  }
24
33
  )
25
34
  );
@@ -2,7 +2,7 @@ import { ParamsType, ProTable } from '@ant-design/pro-components';
2
2
  import { useSafeState } from 'ahooks';
3
3
  import { createStyles } from 'antd-style';
4
4
  import classnames from 'classnames';
5
- import { useRef } from 'react';
5
+ import { useMemo, useRef } from 'react';
6
6
 
7
7
  import { GlobalScrollbarStyle } from '../creek-style';
8
8
  import { useAutoWidthColumns, useEllipsisColumns, useIndexColumn, useResizableColumns, useTableOptions, useTableScrollHeight } from './hooks';
@@ -76,6 +76,12 @@ const useStyles = createStyles(({ token }, options: SearchTableStyleOptions) =>
76
76
  },
77
77
  },
78
78
 
79
+ // 树形数据展开图标样式
80
+ [`.${prefixCls}-table-row-expand-icon`]: {
81
+ marginInlineEnd: 4,
82
+ flexShrink: 0,
83
+ },
84
+
79
85
  // 如果没有 headerTitle,toolbar 展示在 headerTitle 的区域
80
86
  [`.${prefixCls}-pro-table-list-toolbar-right`]: !hasHeaderTitle
81
87
  ? {
@@ -108,9 +114,22 @@ export const SearchProTable = <T extends ParamsType, U extends ParamsType, Value
108
114
  size,
109
115
  headerTitle,
110
116
  showIndex = true,
117
+ expandable,
111
118
  ...restProps
112
119
  } = props;
113
120
 
121
+ // 当序号列存在时,将树形展开控件从序号列(第一列 pos=0)移到第一个数据列(pos=1),
122
+ // 避免序号列宽度不足以容纳树形缩进和展开图标导致显示异常
123
+ // 即使 expandable 未提供,也预设 columnPos,因为 Ant Design Table 会自动检测 children 字段开启树形模式
124
+ const finalExpandable = useMemo(() => {
125
+ if (!showIndex) return expandable;
126
+ if (!expandable) return { columnPos: 1 };
127
+ if ((expandable as any).columnPos === undefined) {
128
+ return { ...expandable, columnPos: 1 };
129
+ }
130
+ return expandable;
131
+ }, [expandable, showIndex]);
132
+
114
133
  const proTableRef = useRef<HTMLDivElement>(null);
115
134
 
116
135
  // 状态提升:管理列宽调整状态,以便 useAutoWidthColumns 能感知到
@@ -144,6 +163,8 @@ export const SearchProTable = <T extends ParamsType, U extends ParamsType, Value
144
163
  optionsRender={finalOptionsRender}
145
164
  size={tableSize}
146
165
  {...restProps}
166
+ pagination={pagination}
167
+ expandable={finalExpandable}
147
168
  className={classnames(styles['creek-table-container'], className)}
148
169
  columns={resizableColumns}
149
170
  bordered={bordered}
@@ -8,12 +8,15 @@ import { useT } from '@creekjs/i18n/react';
8
8
  const useStyles = createStyles(({ css, token }) => {
9
9
  return {
10
10
  text: css`
11
- width: 100%;
11
+ max-width: 100%;
12
12
  margin: 0;
13
13
  padding: 0;
14
- // Ensure the wrapper behaves like a block/inline-block that can have width
15
14
  display: block;
16
15
  overflow: hidden;
16
+ // flex: 1 确保在树形表格的 flex 单元格中填充剩余空间(展开图标/层级缩进之后)
17
+ // min-width: 0 允许收缩以配合 Typography.Text 的 ellipsis 截断
18
+ flex: 1;
19
+ min-width: 0;
17
20
  `,
18
21
  tooltipContent: css`
19
22
  max-width: 500px;
@@ -23,6 +26,7 @@ const useStyles = createStyles(({ css, token }) => {
23
26
  tooltipText: css`
24
27
  word-break: break-all;
25
28
  white-space: pre-wrap;
29
+ color: #fff;
26
30
  `,
27
31
  copyIcon: css`
28
32
  cursor: pointer;
@@ -17,6 +17,11 @@ export const useEllipsisColumns = <T extends ParamsType, ValueType = 'text'>(
17
17
  if (col.valueType === 'option') {
18
18
  return col;
19
19
  }
20
+ // 对于 disable 的列(如序号列),不包裹 EllipsisTooltip
21
+ // 避免 EllipsisTooltip 的 width:100% div 与展开图标争抢空间导致重叠
22
+ if (col.disable) {
23
+ return col;
24
+ }
20
25
  // 其他列默认开启 ellipsis,并使用自定义渲染
21
26
  return {
22
27
  ...col,
@@ -13,7 +13,7 @@ export const useIndexColumn = <T = any, ValueType = 'text'>(columns: ProColumns<
13
13
  const indexColumn: ProColumns<T, ValueType> = {
14
14
  title: t('creek-table.hooks.useIndexColumn.xuHao', '序号'),
15
15
  dataIndex: 'index',
16
- width: 48,
16
+ width: 56,
17
17
  fixed: 'left',
18
18
  disable: true,
19
19
  hideInSearch: true,
@@ -1 +0,0 @@
1
- {"version":3,"file":"CreekConfigContext.d.ts","sourceRoot":"","sources":["../../src/creek-config-provider/CreekConfigContext.tsx"],"names":[],"mappings":";AAEA,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,kDAA6C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CreekI18nProvider.d.ts","sourceRoot":"","sources":["../../src/creek-config-provider/CreekI18nProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAU3C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAOD,eAAO,MAAM,aAAa;;yBAEH,MAAM;EAC3B,CAAC;AAEH,eAAO,MAAM,YAAY;;yBAHF,MAAM;CAG8B,CAAC;AAE5D,eAAO,MAAM,iBAAiB,UAAW,sBAAsB,4CAqE9D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-config-provider/index.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAQhD,OAAO,EAAsB,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAc,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOzH,MAAM,MAAM,wBAAwB,GAAG,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG,sBAAsB,CAAC;AAE9H,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AAC1D,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAmCvC,eAAO,MAAM,mBAAmB;YAAW,wBAAwB;;CAQlE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DrawerHelper.d.ts","sourceRoot":"","sources":["../../../src/creek-hooks/useApp/DrawerHelper.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAwC,MAAM,SAAS,CAAC;AAE7E,UAAU,iBAAiB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA8BpD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModalHelper.d.ts","sourceRoot":"","sources":["../../../src/creek-hooks/useApp/ModalHelper.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,WAAW,EAAqB,MAAM,SAAS,CAAC;AAE1E,UAAU,gBAAgB;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA8BlD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/creek-hooks/useApp/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAI5E,OAAO,EAGL,gBAAgB,EAChB,eAAe,EAEf,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAsBjB,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CA6B/D,CAAC;AAEF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;CAiDlB,CAAC;AAEF,cAAc,SAAS,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/creek-hooks/useApp/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1G,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAG9D,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAChF,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5G,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useViewportHeight.d.ts","sourceRoot":"","sources":["../../src/creek-hooks/useViewportHeight.tsx"],"names":[],"mappings":";AAGA,UAAU,wBAAwB;IAChC,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yBAAyB;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,IAAI,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC;IAE5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,iBAAiB,aAAa,wBAAwB;IAuJ/D,wBAAwB;;IAExB,kBAAkB;;IAElB,kBAAkB;;IAElB,gBAAgB;;CAGnB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-icon/index.tsx"],"names":[],"mappings":"AAAA,OAAO,IAA8B,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAIrC,OAAO,EAAuB,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzF,KAAK,wBAAwB,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,wBAAwB,GAAG;IACtD,WAAW,CAAC,EAAE,wBAAwB,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,wBAAwB,CAAC,WAAW,CAAC,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,SAAS,UAAW,cAAc,mDAkB9C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-keep-alive/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9B;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IACpD;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAClC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAQD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAgMxD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"FullScreen.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/ActionRender/FullScreen.tsx"],"names":[],"mappings":"AAQA,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,8EAU7B,CAAC;AAEH,eAAO,MAAM,UAAU,+CAwBtB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LayoutSettings.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/ActionRender/LayoutSettings.tsx"],"names":[],"mappings":"AAwCA,eAAO,MAAM,cAAc;;;;6CA0B1B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"UserInfo.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/ActionRender/UserInfo.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAoB,aAAa,EAAS,MAAM,MAAM,CAAC;AAsB9D,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,QAAQ,UAAW,aAAa,4CAc5C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/ActionRender/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CollapseButton.d.ts","sourceRoot":"","sources":["../../src/creek-layout/CollapseButton.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAiBF,eAAO,MAAM,iBAAiB,mFAU5B,CAAC;AAEH,eAAO,MAAM,eAAe,UAAW,oBAAoB,4CAwB1D,CAAC"}