asterui 0.12.25 → 0.12.27

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 (167) hide show
  1. package/dist/components/Cascader.d.ts +2 -0
  2. package/dist/components/Descriptions.d.ts +35 -3
  3. package/dist/components/Empty.d.ts +10 -1
  4. package/dist/components/Image.d.ts +13 -1
  5. package/dist/components/List.d.ts +74 -8
  6. package/dist/components/Table.d.ts +64 -10
  7. package/dist/components/Tag.d.ts +16 -4
  8. package/dist/components/Timeline.d.ts +62 -7
  9. package/dist/components/Tree.d.ts +2 -0
  10. package/dist/index.d.ts +6 -8
  11. package/dist/index.js +151 -152
  12. package/dist/index.js.map +1 -1
  13. package/dist/index10.js +1 -1
  14. package/dist/index100.js +5 -32
  15. package/dist/index100.js.map +1 -1
  16. package/dist/index101.js +13 -5
  17. package/dist/index101.js.map +1 -1
  18. package/dist/index102.js +43 -11
  19. package/dist/index102.js.map +1 -1
  20. package/dist/index103.js +11 -44
  21. package/dist/index103.js.map +1 -1
  22. package/dist/index104.js +12 -10
  23. package/dist/index104.js.map +1 -1
  24. package/dist/index105.js +7 -14
  25. package/dist/index105.js.map +1 -1
  26. package/dist/index106.js +12 -7
  27. package/dist/index106.js.map +1 -1
  28. package/dist/index107.js +29 -11
  29. package/dist/index107.js.map +1 -1
  30. package/dist/index108.js +16 -29
  31. package/dist/index108.js.map +1 -1
  32. package/dist/index109.js +31 -16
  33. package/dist/index109.js.map +1 -1
  34. package/dist/index110.js +517 -30
  35. package/dist/index110.js.map +1 -1
  36. package/dist/index111.js +45 -515
  37. package/dist/index111.js.map +1 -1
  38. package/dist/index15.js.map +1 -1
  39. package/dist/index22.js +1 -1
  40. package/dist/index23.js +127 -93
  41. package/dist/index23.js.map +1 -1
  42. package/dist/index39.js +162 -115
  43. package/dist/index39.js.map +1 -1
  44. package/dist/index40.js +398 -40
  45. package/dist/index40.js.map +1 -1
  46. package/dist/index41.js +132 -389
  47. package/dist/index41.js.map +1 -1
  48. package/dist/index42.js +252 -91
  49. package/dist/index42.js.map +1 -1
  50. package/dist/index43.js +143 -247
  51. package/dist/index43.js.map +1 -1
  52. package/dist/index44.js +15 -154
  53. package/dist/index44.js.map +1 -1
  54. package/dist/index45.js +17 -15
  55. package/dist/index45.js.map +1 -1
  56. package/dist/index46.js +136 -16
  57. package/dist/index46.js.map +1 -1
  58. package/dist/index47.js +118 -133
  59. package/dist/index47.js.map +1 -1
  60. package/dist/index48.js +35 -13
  61. package/dist/index48.js.map +1 -1
  62. package/dist/index49.js +34 -35
  63. package/dist/index49.js.map +1 -1
  64. package/dist/index50.js +81 -34
  65. package/dist/index50.js.map +1 -1
  66. package/dist/index51.js +166 -71
  67. package/dist/index51.js.map +1 -1
  68. package/dist/index52.js +144 -167
  69. package/dist/index52.js.map +1 -1
  70. package/dist/index53.js +11 -152
  71. package/dist/index53.js.map +1 -1
  72. package/dist/index54.js +55 -10
  73. package/dist/index54.js.map +1 -1
  74. package/dist/index55.js +12 -55
  75. package/dist/index55.js.map +1 -1
  76. package/dist/index56.js +7 -14
  77. package/dist/index56.js.map +1 -1
  78. package/dist/index57.js +333 -6
  79. package/dist/index57.js.map +1 -1
  80. package/dist/index58.js +47 -334
  81. package/dist/index58.js.map +1 -1
  82. package/dist/index59.js +122 -47
  83. package/dist/index59.js.map +1 -1
  84. package/dist/index60.js +108 -120
  85. package/dist/index60.js.map +1 -1
  86. package/dist/index61.js +167 -107
  87. package/dist/index61.js.map +1 -1
  88. package/dist/index62.js +29 -167
  89. package/dist/index62.js.map +1 -1
  90. package/dist/index63.js +120 -30
  91. package/dist/index63.js.map +1 -1
  92. package/dist/index64.js +80 -116
  93. package/dist/index64.js.map +1 -1
  94. package/dist/index65.js +19 -85
  95. package/dist/index65.js.map +1 -1
  96. package/dist/index66.js +73 -19
  97. package/dist/index66.js.map +1 -1
  98. package/dist/index67.js +54 -71
  99. package/dist/index67.js.map +1 -1
  100. package/dist/index68.js +44 -56
  101. package/dist/index68.js.map +1 -1
  102. package/dist/index69.js +49 -42
  103. package/dist/index69.js.map +1 -1
  104. package/dist/index70.js +121 -50
  105. package/dist/index70.js.map +1 -1
  106. package/dist/index71.js +102 -118
  107. package/dist/index71.js.map +1 -1
  108. package/dist/index72.js +72 -105
  109. package/dist/index72.js.map +1 -1
  110. package/dist/index73.js +67 -73
  111. package/dist/index73.js.map +1 -1
  112. package/dist/index74.js +19 -66
  113. package/dist/index74.js.map +1 -1
  114. package/dist/index75.js +55 -18
  115. package/dist/index75.js.map +1 -1
  116. package/dist/index76.js +251 -55
  117. package/dist/index76.js.map +1 -1
  118. package/dist/index77.js +22 -254
  119. package/dist/index77.js.map +1 -1
  120. package/dist/index78.js +31 -22
  121. package/dist/index78.js.map +1 -1
  122. package/dist/index79.js +93 -30
  123. package/dist/index79.js.map +1 -1
  124. package/dist/index80.js +626 -86
  125. package/dist/index80.js.map +1 -1
  126. package/dist/index81.js +73 -322
  127. package/dist/index81.js.map +1 -1
  128. package/dist/index82.js +39 -79
  129. package/dist/index82.js.map +1 -1
  130. package/dist/index83.js +23 -40
  131. package/dist/index83.js.map +1 -1
  132. package/dist/index84.js +207 -23
  133. package/dist/index84.js.map +1 -1
  134. package/dist/index85.js +149 -122
  135. package/dist/index85.js.map +1 -1
  136. package/dist/index86.js +152 -147
  137. package/dist/index86.js.map +1 -1
  138. package/dist/index87.js +143 -156
  139. package/dist/index87.js.map +1 -1
  140. package/dist/index88.js +35 -65
  141. package/dist/index88.js.map +1 -1
  142. package/dist/index89.js +234 -35
  143. package/dist/index89.js.map +1 -1
  144. package/dist/index90.js +31 -231
  145. package/dist/index90.js.map +1 -1
  146. package/dist/index91.js +210 -34
  147. package/dist/index91.js.map +1 -1
  148. package/dist/index92.js +418 -187
  149. package/dist/index92.js.map +1 -1
  150. package/dist/index93.js +686 -376
  151. package/dist/index93.js.map +1 -1
  152. package/dist/index94.js +165 -738
  153. package/dist/index94.js.map +1 -1
  154. package/dist/index95.js +253 -173
  155. package/dist/index95.js.map +1 -1
  156. package/dist/index96.js +64 -256
  157. package/dist/index96.js.map +1 -1
  158. package/dist/index97.js +121 -61
  159. package/dist/index97.js.map +1 -1
  160. package/dist/index98.js +14 -126
  161. package/dist/index98.js.map +1 -1
  162. package/dist/index99.js +31 -12
  163. package/dist/index99.js.map +1 -1
  164. package/package.json +1 -1
  165. package/dist/components/Indicator.d.ts +0 -7
  166. package/dist/index112.js +0 -53
  167. package/dist/index112.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index80.js","sources":["../src/components/Steps.tsx"],"sourcesContent":["import React from 'react'\n\nexport type StepsDirection = 'horizontal' | 'vertical'\n\nexport interface StepItem {\n key?: string\n title: React.ReactNode\n description?: React.ReactNode\n icon?: React.ReactNode\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n disabled?: boolean\n}\n\nexport interface StepsProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onChange'> {\n /** Step items (compound pattern) */\n children?: React.ReactNode\n /** Step items (data-driven pattern) */\n items?: StepItem[]\n /** Current step index (0-based) */\n current?: number\n /** Layout direction */\n direction?: StepsDirection\n /** @deprecated Use direction=\"vertical\" instead */\n vertical?: boolean\n /** Callback when step is clicked */\n onChange?: (current: number) => void\n}\n\nexport interface StepProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'color' | 'title'> {\n /** Step title/label */\n children?: React.ReactNode\n /** Step title (alternative to children) */\n title?: React.ReactNode\n /** Step description */\n description?: React.ReactNode\n /** Step icon */\n icon?: React.ReactNode\n /** Step color */\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n /** Custom content for step indicator */\n dataContent?: string\n /** Whether step is disabled */\n disabled?: boolean\n /** Internal: step index */\n _index?: number\n /** Internal: whether step is clickable */\n _clickable?: boolean\n /** Internal: click handler */\n _onClick?: (index: number) => void\n}\n\nconst colorClasses: Record<string, string> = {\n neutral: 'step-neutral',\n primary: 'step-primary',\n secondary: 'step-secondary',\n accent: 'step-accent',\n info: 'step-info',\n success: 'step-success',\n warning: 'step-warning',\n error: 'step-error',\n}\n\nfunction StepsRoot({\n children,\n items,\n current,\n direction,\n vertical = false,\n onChange,\n className = '',\n ...rest\n}: StepsProps) {\n const isVertical = direction === 'vertical' || vertical\n\n const classes = ['steps', isVertical && 'steps-vertical', className]\n .filter(Boolean)\n .join(' ')\n\n // Render data-driven items if provided\n if (items && items.length > 0) {\n return (\n <ul className={classes} {...rest}>\n {items.map((item, index) => {\n const isCompleted = current !== undefined && index < current\n const isCurrent = current !== undefined && index === current\n const stepColor = item.color || ((isCompleted || isCurrent) ? 'primary' : undefined)\n\n return (\n <Step\n key={item.key ?? index}\n color={stepColor}\n icon={item.icon}\n title={item.title}\n description={item.description}\n disabled={item.disabled}\n _index={index}\n _clickable={!!onChange && !item.disabled}\n _onClick={onChange}\n aria-current={isCurrent ? 'step' : undefined}\n />\n )\n })}\n </ul>\n )\n }\n\n // For compound pattern, inject props into children if current is provided\n const processedChildren =\n current !== undefined\n ? React.Children.map(children, (child, index) => {\n if (React.isValidElement<StepProps>(child)) {\n const isCompleted = index < current\n const isCurrent = index === current\n const childColor = child.props.color || ((isCompleted || isCurrent) ? 'primary' : undefined)\n\n return React.cloneElement(child, {\n color: childColor,\n _index: index,\n _clickable: !!onChange && !child.props.disabled,\n _onClick: onChange,\n 'aria-current': isCurrent ? 'step' : undefined,\n } as Partial<StepProps>)\n }\n return child\n })\n : children\n\n return (\n <ul className={classes} {...rest}>\n {processedChildren}\n </ul>\n )\n}\n\nfunction Step({\n children,\n title,\n description,\n icon,\n color,\n dataContent,\n disabled = false,\n className = '',\n _index,\n _clickable,\n _onClick,\n ...rest\n}: StepProps) {\n const classes = ['step', color && colorClasses[color], disabled && 'step-disabled', className]\n .filter(Boolean)\n .join(' ')\n\n const handleClick = () => {\n if (_clickable && _onClick && _index !== undefined && !disabled) {\n _onClick(_index)\n }\n }\n\n const displayContent = title ?? children\n\n return (\n <li\n className={classes}\n data-content={dataContent}\n onClick={handleClick}\n style={_clickable && !disabled ? { cursor: 'pointer' } : undefined}\n {...rest}\n >\n {icon && <span className=\"step-icon\">{icon}</span>}\n {displayContent}\n {description && <span className=\"text-xs opacity-70 block\">{description}</span>}\n </li>\n )\n}\n\nexport const Steps = Object.assign(StepsRoot, {\n Step,\n})\n"],"names":["colorClasses","StepsRoot","children","items","current","direction","vertical","onChange","className","rest","classes","jsx","item","index","isCompleted","isCurrent","stepColor","Step","processedChildren","React","child","childColor","title","description","icon","color","dataContent","disabled","_index","_clickable","_onClick","jsxs","Steps"],"mappings":"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"}
1
+ {"version":3,"file":"index80.js","sources":["../src/components/Table.tsx"],"sourcesContent":["import React, { useState, forwardRef, useMemo, useCallback, useId } from 'react'\n\nexport interface FilterConfig {\n text: string\n value: string | number | boolean\n}\n\nexport type TableSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface ColumnType<T> {\n key: string\n title: React.ReactNode\n dataIndex?: keyof T & string\n render?: (value: T[keyof T] | undefined, record: T, index: number) => React.ReactNode\n width?: string | number\n align?: 'left' | 'center' | 'right'\n fixed?: 'left' | 'right'\n sorter?: boolean | ((a: T, b: T) => number)\n sortOrder?: 'ascend' | 'descend' | null\n filters?: FilterConfig[]\n filteredValue?: (string | number | boolean)[]\n onFilter?: (value: string | number | boolean, record: T) => boolean\n defaultSortOrder?: 'ascend' | 'descend'\n defaultFilteredValue?: (string | number | boolean)[]\n ellipsis?: boolean\n hidden?: boolean\n}\n\nexport interface RowSelection<T> {\n type?: 'checkbox' | 'radio'\n selectedRowKeys?: React.Key[]\n onChange?: (selectedRowKeys: React.Key[], selectedRows: T[]) => void\n getCheckboxProps?: (record: T) => { disabled?: boolean; name?: string }\n}\n\nexport interface ExpandableConfig<T> {\n expandedRowKeys?: React.Key[]\n defaultExpandedRowKeys?: React.Key[]\n expandedRowRender: (record: T, index: number, expanded: boolean) => React.ReactNode\n rowExpandable?: (record: T) => boolean\n onExpand?: (expanded: boolean, record: T) => void\n onExpandedRowsChange?: (expandedKeys: React.Key[]) => void\n expandRowByClick?: boolean\n expandIcon?: (props: { expanded: boolean; onExpand: () => void; record: T }) => React.ReactNode\n}\n\nexport interface PaginationConfig {\n current?: number\n pageSize?: number\n total?: number\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: (total: number, range: [number, number]) => React.ReactNode\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight'\n}\n\nexport interface ScrollConfig {\n x?: number | string\n y?: number | string\n}\n\nexport interface SorterResult<T> {\n column?: ColumnType<T>\n order?: 'ascend' | 'descend' | null\n field?: string\n}\n\nexport interface TableChangeExtra<T> {\n currentDataSource: T[]\n action: 'paginate' | 'sort' | 'filter'\n}\n\nexport interface TableProps<T> {\n columns: ColumnType<T>[]\n dataSource: T[]\n rowKey?: keyof T & string | ((record: T) => string)\n loading?: boolean\n size?: TableSize\n bordered?: boolean\n hoverable?: boolean\n striped?: boolean\n pinRows?: boolean\n pinCols?: boolean\n pagination?: false | PaginationConfig\n rowSelection?: RowSelection<T>\n expandable?: ExpandableConfig<T>\n scroll?: ScrollConfig\n className?: string\n onRow?: (record: T, index: number) => React.HTMLAttributes<HTMLTableRowElement>\n onChange?: (\n pagination: PaginationConfig,\n filters: Record<string, (string | number | boolean)[] | null>,\n sorter: SorterResult<T>,\n extra: TableChangeExtra<T>\n ) => void\n onSortChange?: (sorter: SorterResult<T>) => void\n onFilterChange?: (filters: Record<string, (string | number | boolean)[] | null>) => void\n locale?: {\n emptyText?: React.ReactNode\n filterConfirm?: string\n filterReset?: string\n selectAll?: string\n selectInvert?: string\n }\n 'data-testid'?: string\n 'aria-label'?: string\n}\n\nconst sizeClasses: Record<TableSize, string> = {\n xs: 'table-xs',\n sm: 'table-sm',\n md: '',\n lg: 'table-lg',\n xl: 'table-xl',\n}\n\nfunction FilterDropdown({\n filters,\n selectedValues,\n onChange,\n locale,\n testId,\n}: {\n filters: FilterConfig[]\n selectedValues: (string | number | boolean)[]\n onChange: (values: (string | number | boolean)[]) => void\n locale?: { filterConfirm?: string; filterReset?: string }\n testId: string\n}) {\n const [isOpen, setIsOpen] = useState(false)\n const dropdownId = useId()\n\n const handleToggle = (value: string | number | boolean) => {\n const newValues = selectedValues.includes(value)\n ? selectedValues.filter((v) => v !== value)\n : [...selectedValues, value]\n onChange(newValues)\n }\n\n const handleClear = () => {\n onChange([])\n setIsOpen(false)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n }\n }\n\n return (\n <div className=\"dropdown dropdown-end\" onKeyDown={handleKeyDown}>\n <button\n type=\"button\"\n className={`btn btn-ghost btn-xs ${selectedValues.length > 0 ? 'text-primary' : ''}`}\n onClick={() => setIsOpen(!isOpen)}\n aria-label=\"Filter column\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={dropdownId}\n data-testid={`${testId}-filter-button`}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\" />\n </svg>\n </button>\n {isOpen && (\n <div\n id={dropdownId}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n className=\"dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-content/10\"\n data-testid={`${testId}-filter-dropdown`}\n >\n <div className=\"space-y-2\">\n {filters.map((filter) => (\n <label\n key={String(filter.value)}\n className=\"flex items-center gap-2 cursor-pointer p-2 hover:bg-base-200 rounded\"\n role=\"option\"\n aria-selected={selectedValues.includes(filter.value)}\n >\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-xs checkbox-primary\"\n checked={selectedValues.includes(filter.value)}\n onChange={() => handleToggle(filter.value)}\n data-testid={`${testId}-filter-${String(filter.value)}`}\n />\n <span className=\"text-sm\">{filter.text}</span>\n </label>\n ))}\n </div>\n <div className=\"divider my-1\"></div>\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs w-full\"\n onClick={handleClear}\n data-testid={`${testId}-filter-reset`}\n >\n {locale?.filterReset ?? 'Clear'}\n </button>\n </div>\n )}\n </div>\n )\n}\n\nfunction DefaultExpandIcon({ expanded, onExpand }: { expanded: boolean; onExpand: () => void }) {\n return (\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-square\"\n onClick={(e) => {\n e.stopPropagation()\n onExpand()\n }}\n aria-label={expanded ? 'Collapse row' : 'Expand row'}\n aria-expanded={expanded}\n >\n <svg\n className={`w-4 h-4 transition-transform ${expanded ? 'rotate-90' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n )\n}\n\nfunction TableInner<T extends Record<string, unknown>>(\n {\n columns,\n dataSource,\n rowKey = 'id' as keyof T & string,\n loading = false,\n size = 'md',\n bordered = false,\n hoverable = true,\n striped = false,\n pinRows = false,\n pinCols = false,\n pagination,\n rowSelection,\n expandable,\n scroll,\n className = '',\n onRow,\n onChange,\n onSortChange,\n onFilterChange,\n locale,\n 'data-testid': testId,\n 'aria-label': ariaLabel,\n ...rest\n }: TableProps<T>,\n ref: React.ForwardedRef<HTMLTableElement>\n) {\n const baseTestId = testId ?? 'table'\n const defaultPageSize = 10\n\n // Pagination state\n const [currentPage, setCurrentPage] = useState(\n pagination !== false && pagination?.current ? pagination.current : 1\n )\n const [internalPageSize, setInternalPageSize] = useState(\n pagination !== false && pagination?.pageSize ? pagination.pageSize : defaultPageSize\n )\n const pageSize = pagination !== false && pagination?.pageSize !== undefined ? pagination.pageSize : internalPageSize\n\n // Sorting state\n const [sortState, setSortState] = useState<{\n columnKey: string | null\n order: 'ascend' | 'descend' | null\n }>(() => {\n // Check for controlled sort\n const controlledSortColumn = columns.find((col) => col.sortOrder !== undefined)\n if (controlledSortColumn) {\n return {\n columnKey: controlledSortColumn.key,\n order: controlledSortColumn.sortOrder ?? null,\n }\n }\n // Fallback to default\n const defaultSortColumn = columns.find((col) => col.defaultSortOrder)\n return {\n columnKey: defaultSortColumn?.key || null,\n order: defaultSortColumn?.defaultSortOrder || null,\n }\n })\n\n // Filtering state\n const [filterState, setFilterState] = useState<Record<string, (string | number | boolean)[]>>(() => {\n const initial: Record<string, (string | number | boolean)[]> = {}\n columns.forEach((col) => {\n // Check for controlled filter\n if (col.filteredValue !== undefined) {\n initial[col.key] = col.filteredValue\n } else if (col.defaultFilteredValue) {\n initial[col.key] = col.defaultFilteredValue\n }\n })\n return initial\n })\n\n // Row selection state\n const [selectedKeys, setSelectedKeys] = useState<React.Key[]>(\n rowSelection?.selectedRowKeys || []\n )\n\n // Expandable state\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>(\n expandable?.expandedRowKeys ?? expandable?.defaultExpandedRowKeys ?? []\n )\n\n // Sync controlled states\n const isControlledSort = columns.some((col) => col.sortOrder !== undefined)\n const isControlledFilter = columns.some((col) => col.filteredValue !== undefined)\n const isControlledExpand = expandable?.expandedRowKeys !== undefined\n const isControlledSelection = rowSelection?.selectedRowKeys !== undefined\n\n const effectiveSortState = useMemo(() => {\n if (isControlledSort) {\n const controlledCol = columns.find((col) => col.sortOrder !== undefined && col.sortOrder !== null)\n return {\n columnKey: controlledCol?.key ?? null,\n order: controlledCol?.sortOrder ?? null,\n }\n }\n return sortState\n }, [isControlledSort, columns, sortState])\n\n const effectiveFilterState = useMemo(() => {\n if (isControlledFilter) {\n const controlled: Record<string, (string | number | boolean)[]> = {}\n columns.forEach((col) => {\n if (col.filteredValue !== undefined) {\n controlled[col.key] = col.filteredValue\n }\n })\n return controlled\n }\n return filterState\n }, [isControlledFilter, columns, filterState])\n\n const effectiveSelectedKeys = isControlledSelection ? rowSelection!.selectedRowKeys! : selectedKeys\n const effectiveExpandedKeys = isControlledExpand ? expandable!.expandedRowKeys! : expandedKeys\n\n const isPaginationEnabled = pagination !== false\n\n // Visible columns (filter out hidden)\n const visibleColumns = useMemo(() => columns.filter((col) => !col.hidden), [columns])\n\n // Get row key helper\n const getRowKey = useCallback((record: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(record)\n }\n const keyValue = record[rowKey]\n return keyValue !== undefined ? String(keyValue) : String(index)\n }, [rowKey])\n\n // Apply filters\n const filteredData = useMemo(() => {\n let data = [...dataSource]\n Object.entries(effectiveFilterState).forEach(([columnKey, filterValues]) => {\n if (filterValues && filterValues.length > 0) {\n const column = columns.find((col) => col.key === columnKey)\n if (column?.onFilter) {\n data = data.filter((record) =>\n filterValues.some((value) => column.onFilter!(value, record))\n )\n }\n }\n })\n return data\n }, [dataSource, effectiveFilterState, columns])\n\n // Apply sorting\n const sortedData = useMemo(() => {\n if (!effectiveSortState.columnKey || !effectiveSortState.order) {\n return filteredData\n }\n const column = columns.find((col) => col.key === effectiveSortState.columnKey)\n if (!column?.sorter) {\n return filteredData\n }\n\n const sorted = [...filteredData]\n sorted.sort((a, b) => {\n let result = 0\n if (typeof column.sorter === 'function') {\n result = column.sorter(a, b)\n } else if (column.dataIndex) {\n const aVal = a[column.dataIndex]\n const bVal = b[column.dataIndex]\n if (aVal === undefined || aVal === null) return 1\n if (bVal === undefined || bVal === null) return -1\n if (aVal < bVal) result = -1\n if (aVal > bVal) result = 1\n }\n return effectiveSortState.order === 'ascend' ? result : -result\n })\n return sorted\n }, [filteredData, effectiveSortState, columns])\n\n const totalItems = pagination !== false && pagination?.total !== undefined ? pagination.total : sortedData.length\n const totalPages = Math.ceil(totalItems / pageSize)\n const startIndex = (currentPage - 1) * pageSize\n const endIndex = startIndex + pageSize\n const paginatedData = isPaginationEnabled ? sortedData.slice(startIndex, endIndex) : sortedData\n\n const handlePageChange = useCallback((page: number) => {\n setCurrentPage(page)\n if (pagination !== false && pagination?.onChange) {\n pagination.onChange(page, pageSize)\n }\n if (onChange) {\n const sorterResult: SorterResult<T> = {\n column: columns.find((col) => col.key === effectiveSortState.columnKey),\n order: effectiveSortState.order,\n field: effectiveSortState.columnKey ?? undefined,\n }\n onChange(\n { current: page, pageSize, total: totalItems },\n effectiveFilterState,\n sorterResult,\n { currentDataSource: sortedData, action: 'paginate' }\n )\n }\n }, [pagination, pageSize, onChange, columns, effectiveSortState, effectiveFilterState, sortedData, totalItems])\n\n const handlePageSizeChange = useCallback((newSize: number) => {\n setInternalPageSize(newSize)\n setCurrentPage(1)\n if (pagination !== false && pagination?.onShowSizeChange) {\n pagination.onShowSizeChange(1, newSize)\n }\n if (pagination !== false && pagination?.onChange) {\n pagination.onChange(1, newSize)\n }\n }, [pagination])\n\n const handleSort = useCallback((columnKey: string) => {\n const column = columns.find((col) => col.key === columnKey)\n let newOrder: 'ascend' | 'descend' | null = 'ascend'\n\n if (effectiveSortState.columnKey === columnKey) {\n if (effectiveSortState.order === 'ascend') newOrder = 'descend'\n else if (effectiveSortState.order === 'descend') newOrder = null\n }\n\n if (!isControlledSort) {\n setSortState({ columnKey: newOrder ? columnKey : null, order: newOrder })\n }\n setCurrentPage(1)\n\n const sorterResult: SorterResult<T> = {\n column,\n order: newOrder,\n field: columnKey,\n }\n\n onSortChange?.(sorterResult)\n\n if (onChange) {\n onChange(\n { current: 1, pageSize, total: totalItems },\n effectiveFilterState,\n sorterResult,\n { currentDataSource: sortedData, action: 'sort' }\n )\n }\n }, [columns, effectiveSortState, isControlledSort, pageSize, totalItems, effectiveFilterState, sortedData, onSortChange, onChange])\n\n const handleFilterChange = useCallback((columnKey: string, values: (string | number | boolean)[]) => {\n const newFilterState = {\n ...effectiveFilterState,\n [columnKey]: values,\n }\n\n if (!isControlledFilter) {\n setFilterState(newFilterState)\n }\n setCurrentPage(1)\n\n onFilterChange?.(newFilterState)\n\n if (onChange) {\n const sorterResult: SorterResult<T> = {\n column: columns.find((col) => col.key === effectiveSortState.columnKey),\n order: effectiveSortState.order,\n field: effectiveSortState.columnKey ?? undefined,\n }\n onChange(\n { current: 1, pageSize, total: totalItems },\n newFilterState,\n sorterResult,\n { currentDataSource: sortedData, action: 'filter' }\n )\n }\n }, [effectiveFilterState, isControlledFilter, columns, effectiveSortState, pageSize, totalItems, sortedData, onFilterChange, onChange])\n\n const handleSelectAll = useCallback((checked: boolean) => {\n const newSelectedKeys = checked\n ? paginatedData.map((record, index) => getRowKey(record, index))\n : []\n if (!isControlledSelection) {\n setSelectedKeys(newSelectedKeys)\n }\n if (rowSelection?.onChange) {\n const selectedRecords = checked ? paginatedData : []\n rowSelection.onChange(newSelectedKeys, selectedRecords)\n }\n }, [paginatedData, getRowKey, isControlledSelection, rowSelection])\n\n const handleSelectRow = useCallback((record: T, index: number, checked: boolean) => {\n const key = getRowKey(record, index)\n\n if (rowSelection?.type === 'radio') {\n const newSelectedKeys = checked ? [key] : []\n if (!isControlledSelection) {\n setSelectedKeys(newSelectedKeys)\n }\n if (rowSelection?.onChange) {\n rowSelection.onChange(newSelectedKeys, checked ? [record] : [])\n }\n return\n }\n\n const newSelectedKeys = checked\n ? [...effectiveSelectedKeys, key]\n : effectiveSelectedKeys.filter((k) => k !== key)\n\n if (!isControlledSelection) {\n setSelectedKeys(newSelectedKeys)\n }\n if (rowSelection?.onChange) {\n const selectedRecords = sortedData.filter((r, i) =>\n newSelectedKeys.includes(getRowKey(r, i))\n )\n rowSelection.onChange(newSelectedKeys, selectedRecords)\n }\n }, [getRowKey, rowSelection, isControlledSelection, effectiveSelectedKeys, sortedData])\n\n const handleExpand = useCallback((record: T, index: number) => {\n const key = getRowKey(record, index)\n const isExpanded = effectiveExpandedKeys.includes(key)\n const newExpandedKeys = isExpanded\n ? effectiveExpandedKeys.filter((k) => k !== key)\n : [...effectiveExpandedKeys, key]\n\n if (!isControlledExpand) {\n setExpandedKeys(newExpandedKeys)\n }\n expandable?.onExpand?.(!isExpanded, record)\n expandable?.onExpandedRowsChange?.(newExpandedKeys)\n }, [getRowKey, effectiveExpandedKeys, isControlledExpand, expandable])\n\n const getCellValue = useCallback((column: ColumnType<T>, record: T, index: number) => {\n if (column.render) {\n return column.render(\n column.dataIndex ? record[column.dataIndex] : undefined,\n record,\n index\n )\n }\n if (column.dataIndex) {\n const value = record[column.dataIndex]\n return value !== undefined && value !== null ? String(value) : ''\n }\n return ''\n }, [])\n\n const getAlignClass = (align?: 'left' | 'center' | 'right') => {\n if (align === 'center') return 'text-center'\n if (align === 'right') return 'text-right'\n return 'text-left'\n }\n\n // Calculate fixed column offsets\n const getFixedColumnStyle = useCallback((columnIndex: number, isHeader = false): { className: string; style?: React.CSSProperties } => {\n const column = visibleColumns[columnIndex]\n if (!column?.fixed) return { className: '' }\n\n const classes = ['sticky', 'bg-base-100']\n let offset = 0\n const style: React.CSSProperties = {\n boxSizing: 'border-box',\n }\n\n if (column.fixed === 'left') {\n for (let i = 0; i < columnIndex; i++) {\n if (visibleColumns[i].fixed === 'left' && visibleColumns[i].width) {\n const colWidth = visibleColumns[i].width!\n const width = typeof colWidth === 'number' ? colWidth : parseInt(String(colWidth))\n if (!isNaN(width)) offset += width\n }\n }\n if (offset === 0) {\n classes.push('left-0')\n } else {\n style.left = `${offset}px`\n }\n classes.push(isHeader ? 'z-30' : 'z-20')\n\n let lastLeftFixedIndex = -1\n for (let i = visibleColumns.length - 1; i >= 0; i--) {\n if (visibleColumns[i].fixed === 'left') {\n lastLeftFixedIndex = i\n break\n }\n }\n if (columnIndex === lastLeftFixedIndex) {\n style.boxShadow = '2px 0 4px rgba(0, 0, 0, 0.1)'\n }\n }\n\n if (column.fixed === 'right') {\n for (let i = columnIndex + 1; i < visibleColumns.length; i++) {\n if (visibleColumns[i].fixed === 'right' && visibleColumns[i].width) {\n const colWidth = visibleColumns[i].width!\n const width = typeof colWidth === 'number' ? colWidth : parseInt(String(colWidth))\n if (!isNaN(width)) offset += width\n }\n }\n if (offset === 0) {\n classes.push('right-0')\n } else {\n style.right = `${offset}px`\n }\n classes.push(isHeader ? 'z-30' : 'z-20')\n\n const isFirstRightFixed = columnIndex === visibleColumns.findIndex((col) => col.fixed === 'right')\n if (isFirstRightFixed) {\n style.boxShadow = '-2px 0 4px rgba(0, 0, 0, 0.1)'\n }\n }\n\n return {\n className: classes.filter(Boolean).join(' '),\n style: Object.keys(style).length > 0 ? style : undefined,\n }\n }, [visibleColumns])\n\n const tableClasses = [\n 'table',\n 'bg-base-100',\n sizeClasses[size],\n striped && 'table-zebra',\n pinRows && 'table-pin-rows',\n pinCols && 'table-pin-cols',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const hasFixedColumns = visibleColumns.some((col) => col.fixed)\n const hasExpandable = expandable !== undefined\n\n const wrapperStyle: React.CSSProperties = {}\n if (scroll?.x) {\n wrapperStyle.overflowX = 'auto'\n wrapperStyle.maxWidth = typeof scroll.x === 'number' ? `${scroll.x}px` : scroll.x\n }\n if (scroll?.y) {\n wrapperStyle.overflowY = 'auto'\n wrapperStyle.maxHeight = typeof scroll.y === 'number' ? `${scroll.y}px` : scroll.y\n }\n\n const wrapperClasses = [\n (!pinRows || hasFixedColumns || scroll?.x) && 'overflow-x-auto',\n bordered && 'rounded-box border border-base-content/5 bg-base-100',\n ]\n .filter(Boolean)\n .join(' ')\n\n if (loading) {\n return (\n <div className=\"flex justify-center items-center p-8\" data-testid={`${baseTestId}-loading`}>\n <span className=\"loading loading-spinner loading-lg\" aria-label=\"Loading\"></span>\n </div>\n )\n }\n\n const isAllSelected = paginatedData.length > 0 &&\n paginatedData.every((record, index) => effectiveSelectedKeys.includes(getRowKey(record, index)))\n const isSomeSelected = paginatedData.some((record, index) => effectiveSelectedKeys.includes(getRowKey(record, index)))\n\n const emptyText = locale?.emptyText ?? 'No data'\n\n // Calculate extra columns count (selection + expand)\n const extraColsCount = (rowSelection ? 1 : 0) + (hasExpandable ? 1 : 0)\n\n const renderPagination = () => {\n if (!isPaginationEnabled || totalPages <= 1) return null\n if (typeof pagination === 'boolean') return null\n\n const paginationConfig: PaginationConfig = pagination ?? {}\n const position = paginationConfig.position ?? 'bottomRight'\n const showSizeChanger = paginationConfig.showSizeChanger\n const showQuickJumper = paginationConfig.showQuickJumper\n const showTotal = paginationConfig.showTotal\n const pageSizeOptions = paginationConfig.pageSizeOptions ?? [10, 20, 50, 100]\n\n const justifyClass = position.includes('Left') ? 'justify-start' : position.includes('Center') ? 'justify-center' : 'justify-end'\n\n const paginationElement = (\n <div className={`flex items-center gap-4 ${justifyClass}`} data-testid={`${baseTestId}-pagination`}>\n {showTotal && (\n <span className=\"text-sm text-base-content/70\">\n {showTotal(totalItems, [startIndex + 1, Math.min(endIndex, totalItems)])}\n </span>\n )}\n\n {showSizeChanger && (\n <select\n className=\"select select-sm select-bordered\"\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n aria-label=\"Page size\"\n data-testid={`${baseTestId}-page-size`}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>{size} / page</option>\n ))}\n </select>\n )}\n\n <div className=\"join\">\n <button\n type=\"button\"\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(currentPage - 1)}\n disabled={currentPage === 1}\n aria-label=\"Previous page\"\n data-testid={`${baseTestId}-prev`}\n >\n «\n </button>\n {Array.from({ length: Math.min(totalPages, 7) }, (_, i) => {\n let page: number\n if (totalPages <= 7) {\n page = i + 1\n } else if (currentPage <= 4) {\n page = i + 1\n } else if (currentPage >= totalPages - 3) {\n page = totalPages - 6 + i\n } else {\n page = currentPage - 3 + i\n }\n return (\n <button\n key={page}\n type=\"button\"\n className={`join-item btn btn-sm ${currentPage === page ? 'btn-active' : ''}`}\n onClick={() => handlePageChange(page)}\n aria-label={`Page ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n data-testid={`${baseTestId}-page-${page}`}\n >\n {page}\n </button>\n )\n })}\n <button\n type=\"button\"\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n aria-label=\"Next page\"\n data-testid={`${baseTestId}-next`}\n >\n »\n </button>\n </div>\n\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">Go to</span>\n <input\n type=\"number\"\n className=\"input input-sm input-bordered w-16\"\n min={1}\n max={totalPages}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n const value = parseInt((e.target as HTMLInputElement).value)\n if (value >= 1 && value <= totalPages) {\n handlePageChange(value)\n }\n }\n }}\n aria-label=\"Go to page\"\n data-testid={`${baseTestId}-jumper`}\n />\n </div>\n )}\n </div>\n )\n\n return paginationElement\n }\n\n const paginationPosition = pagination && typeof pagination !== 'boolean' ? pagination.position : undefined\n const topPagination = isPaginationEnabled && paginationPosition?.startsWith('top') ? renderPagination() : null\n const bottomPagination = isPaginationEnabled && (!paginationPosition || paginationPosition.startsWith('bottom')) ? renderPagination() : null\n\n return (\n <div className=\"space-y-4\" data-testid={baseTestId} {...rest}>\n {topPagination}\n\n <div className={wrapperClasses} style={wrapperStyle}>\n <table\n ref={ref}\n className={tableClasses}\n style={{ borderCollapse: 'separate', borderSpacing: 0, tableLayout: 'fixed' }}\n role=\"grid\"\n aria-label={ariaLabel}\n aria-rowcount={sortedData.length}\n data-testid={`${baseTestId}-table`}\n >\n <thead>\n <tr role=\"row\">\n {hasExpandable && (\n <th style={{ width: 50 }} className=\"sticky left-0 z-20 bg-base-100\" role=\"columnheader\">\n <span className=\"sr-only\">Expand</span>\n </th>\n )}\n {rowSelection && (\n <th\n style={{ width: 50 }}\n className={`sticky ${hasExpandable ? '' : 'left-0'} z-20 bg-base-100`}\n role=\"columnheader\"\n >\n {rowSelection.type !== 'radio' && (\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm checkbox-primary\"\n checked={isAllSelected}\n ref={(el) => {\n if (el) el.indeterminate = isSomeSelected && !isAllSelected\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n aria-label={locale?.selectAll ?? 'Select all rows'}\n data-testid={`${baseTestId}-select-all`}\n />\n )}\n </th>\n )}\n {visibleColumns.map((column, columnIndex) => {\n const fixedStyle = getFixedColumnStyle(columnIndex, true)\n const isSorted = effectiveSortState.columnKey === column.key\n const sortOrder = isSorted ? effectiveSortState.order : null\n\n return (\n <th\n key={column.key}\n className={`${getAlignClass(column.align)} ${fixedStyle.className}`}\n style={{\n ...(column.width ? { width: column.width } : {}),\n ...fixedStyle.style,\n }}\n role=\"columnheader\"\n aria-sort={sortOrder === 'ascend' ? 'ascending' : sortOrder === 'descend' ? 'descending' : undefined}\n data-testid={`${baseTestId}-header-${column.key}`}\n >\n <div className=\"flex items-center gap-2\">\n <span\n className={column.sorter ? 'cursor-pointer select-none hover:text-primary' : ''}\n onClick={() => column.sorter && handleSort(column.key)}\n onKeyDown={(e) => {\n if (column.sorter && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n handleSort(column.key)\n }\n }}\n tabIndex={column.sorter ? 0 : undefined}\n role={column.sorter ? 'button' : undefined}\n aria-label={column.sorter ? `Sort by ${column.title}` : undefined}\n >\n {column.title}\n </span>\n {column.sorter && (\n <div className=\"flex flex-col\" aria-hidden=\"true\">\n <svg\n className={`w-3 h-3 ${sortOrder === 'ascend' ? 'text-primary' : 'text-base-content/30'}`}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M5.293 9.707a1 1 0 010-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 01-1.414 1.414L11 7.414V15a1 1 0 11-2 0V7.414L6.707 9.707a1 1 0 01-1.414 0z\" />\n </svg>\n <svg\n className={`w-3 h-3 -mt-1 ${sortOrder === 'descend' ? 'text-primary' : 'text-base-content/30'}`}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M14.707 10.293a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 111.414-1.414L9 12.586V5a1 1 0 012 0v7.586l2.293-2.293a1 1 0 011.414 0z\" />\n </svg>\n </div>\n )}\n {column.filters && (\n <FilterDropdown\n filters={column.filters}\n selectedValues={effectiveFilterState[column.key] || []}\n onChange={(values) => handleFilterChange(column.key, values)}\n locale={locale}\n testId={`${baseTestId}-${column.key}`}\n />\n )}\n </div>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {paginatedData.length === 0 ? (\n <tr role=\"row\">\n <td\n colSpan={visibleColumns.length + extraColsCount}\n className=\"text-center py-8 text-base-content/50\"\n role=\"gridcell\"\n data-testid={`${baseTestId}-empty`}\n >\n {emptyText}\n </td>\n </tr>\n ) : (\n paginatedData.map((record, index) => {\n const rowProps = onRow?.(record, index) || {}\n const key = getRowKey(record, index)\n const isSelected = effectiveSelectedKeys.includes(key)\n const isExpanded = effectiveExpandedKeys.includes(key)\n const isExpandable = expandable?.rowExpandable ? expandable.rowExpandable(record) : true\n const rowClasses = [\n hoverable && 'hover:bg-base-200',\n isSelected && 'bg-primary/10',\n ]\n .filter(Boolean)\n .join(' ')\n\n const checkboxProps = rowSelection?.getCheckboxProps?.(record) || {}\n\n const handleRowClick = (e: React.MouseEvent<HTMLTableRowElement>) => {\n rowProps.onClick?.(e)\n if (expandable?.expandRowByClick && isExpandable) {\n handleExpand(record, index)\n }\n }\n\n return (\n <React.Fragment key={key}>\n <tr\n className={rowClasses}\n role=\"row\"\n aria-selected={isSelected}\n data-testid={`${baseTestId}-row-${index}`}\n data-state={isSelected ? 'selected' : undefined}\n {...rowProps}\n onClick={handleRowClick}\n >\n {hasExpandable && (\n <td className=\"sticky left-0 z-10 bg-base-100\" role=\"gridcell\">\n {isExpandable && (\n expandable.expandIcon ? (\n expandable.expandIcon({\n expanded: isExpanded,\n onExpand: () => handleExpand(record, index),\n record,\n })\n ) : (\n <DefaultExpandIcon\n expanded={isExpanded}\n onExpand={() => handleExpand(record, index)}\n />\n )\n )}\n </td>\n )}\n {rowSelection && (\n <td\n className={`sticky ${hasExpandable ? '' : 'left-0'} z-10 bg-base-100`}\n role=\"gridcell\"\n >\n <input\n type={rowSelection.type === 'radio' ? 'radio' : 'checkbox'}\n className={rowSelection.type === 'radio' ? 'radio radio-sm radio-primary' : 'checkbox checkbox-sm checkbox-primary'}\n checked={isSelected}\n onChange={(e) => handleSelectRow(record, index, e.target.checked)}\n aria-label={`Select row ${index + 1}`}\n data-testid={`${baseTestId}-row-${index}-select`}\n {...checkboxProps}\n />\n </td>\n )}\n {visibleColumns.map((column, columnIndex) => {\n const fixedStyle = getFixedColumnStyle(columnIndex, false)\n const cellContent = getCellValue(column, record, index)\n\n return (\n <td\n key={column.key}\n className={`${getAlignClass(column.align)} ${fixedStyle.className} ${column.ellipsis ? 'truncate max-w-0' : ''}`}\n style={fixedStyle.style}\n role=\"gridcell\"\n title={column.ellipsis && typeof cellContent === 'string' ? cellContent : undefined}\n data-testid={`${baseTestId}-row-${index}-${column.key}`}\n >\n {cellContent}\n </td>\n )\n })}\n </tr>\n {hasExpandable && isExpanded && (\n <tr\n className=\"bg-base-200/50\"\n role=\"row\"\n data-testid={`${baseTestId}-row-${index}-expanded`}\n >\n <td\n colSpan={visibleColumns.length + extraColsCount}\n className=\"p-4\"\n role=\"gridcell\"\n >\n {expandable.expandedRowRender(record, index, isExpanded)}\n </td>\n </tr>\n )}\n </React.Fragment>\n )\n })\n )}\n </tbody>\n </table>\n </div>\n\n {bottomPagination}\n </div>\n )\n}\n\nexport const Table = forwardRef(TableInner) as <T extends Record<string, unknown>>(\n props: TableProps<T> & { ref?: React.ForwardedRef<HTMLTableElement> }\n) => React.ReactElement\n"],"names":["sizeClasses","FilterDropdown","filters","selectedValues","onChange","locale","testId","isOpen","setIsOpen","useState","dropdownId","useId","handleToggle","value","newValues","v","handleClear","jsxs","e","jsx","filter","DefaultExpandIcon","expanded","onExpand","TableInner","columns","dataSource","rowKey","loading","size","bordered","hoverable","striped","pinRows","pinCols","pagination","rowSelection","expandable","scroll","className","onRow","onSortChange","onFilterChange","ariaLabel","rest","ref","baseTestId","defaultPageSize","currentPage","setCurrentPage","internalPageSize","setInternalPageSize","pageSize","sortState","setSortState","controlledSortColumn","col","defaultSortColumn","filterState","setFilterState","initial","selectedKeys","setSelectedKeys","expandedKeys","setExpandedKeys","isControlledSort","isControlledFilter","isControlledExpand","isControlledSelection","effectiveSortState","useMemo","controlledCol","effectiveFilterState","controlled","effectiveSelectedKeys","effectiveExpandedKeys","isPaginationEnabled","visibleColumns","getRowKey","useCallback","record","index","keyValue","filteredData","data","columnKey","filterValues","column","sortedData","sorted","a","b","result","aVal","bVal","totalItems","totalPages","startIndex","endIndex","paginatedData","handlePageChange","page","sorterResult","handlePageSizeChange","newSize","handleSort","newOrder","handleFilterChange","values","newFilterState","handleSelectAll","checked","newSelectedKeys","selectedRecords","handleSelectRow","key","k","r","i","handleExpand","isExpanded","newExpandedKeys","getCellValue","getAlignClass","align","getFixedColumnStyle","columnIndex","isHeader","classes","offset","style","colWidth","width","lastLeftFixedIndex","tableClasses","hasFixedColumns","hasExpandable","wrapperStyle","wrapperClasses","isAllSelected","isSomeSelected","emptyText","extraColsCount","renderPagination","paginationConfig","position","showSizeChanger","showQuickJumper","showTotal","pageSizeOptions","justifyClass","_","paginationPosition","topPagination","bottomPagination","el","fixedStyle","sortOrder","rowProps","isSelected","isExpandable","rowClasses","checkboxProps","handleRowClick","React","cellContent","Table","forwardRef"],"mappings":"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"}
package/dist/index81.js CHANGED
@@ -1,332 +1,83 @@
1
- import { jsx as s, jsxs as f } from "react/jsx-runtime";
2
- import { useState as v } from "react";
3
- function te({
4
- filters: l,
5
- selectedValues: p,
6
- onChange: k
1
+ import { jsx as a, jsxs as c, Fragment as o } from "react/jsx-runtime";
2
+ import u, { useState as k } from "react";
3
+ const B = {
4
+ box: "tabs-box",
5
+ border: "tabs-border",
6
+ lift: "tabs-lift"
7
+ }, R = {
8
+ xs: "tabs-xs",
9
+ sm: "tabs-sm",
10
+ md: "tabs-md",
11
+ lg: "tabs-lg",
12
+ xl: "tabs-xl"
13
+ };
14
+ function _({
15
+ children: s,
16
+ items: e,
17
+ activeKey: n,
18
+ defaultActiveKey: y,
19
+ onChange: K,
20
+ variant: b,
21
+ size: r,
22
+ position: d = "top",
23
+ className: p = "",
24
+ ...C
7
25
  }) {
8
- const [w, m] = v(!1), I = (c) => {
9
- const S = p.includes(c) ? p.filter(($) => $ !== c) : [...p, c];
10
- k(S);
11
- }, P = () => {
12
- k([]), m(!1);
13
- };
14
- return /* @__PURE__ */ f("div", { className: "dropdown dropdown-end", children: [
15
- /* @__PURE__ */ s(
26
+ const g = u.Children.toArray(s).filter(
27
+ (t) => u.isValidElement(t) && t.type === x
28
+ ), l = e && e.length > 0 ? e.map((t) => ({
29
+ tabKey: t.key,
30
+ tab: t.label,
31
+ children: t.children,
32
+ disabled: t.disabled,
33
+ icon: t.icon
34
+ })) : g.map((t) => t.props), [j, A] = k(
35
+ y || l[0]?.tabKey || ""
36
+ ), f = n !== void 0 ? n : j, N = (t) => {
37
+ n === void 0 && A(t), K?.(t);
38
+ }, P = [
39
+ "tabs",
40
+ b && B[b],
41
+ r && R[r],
42
+ p
43
+ ].filter(Boolean).join(" "), m = l.find((t) => t.tabKey === f), h = /* @__PURE__ */ a("div", { role: "tablist", className: P, children: l.map((t) => {
44
+ const i = f === t.tabKey, T = [
45
+ "tab",
46
+ i && "tab-active",
47
+ t.disabled && "tab-disabled"
48
+ ].filter(Boolean).join(" ");
49
+ return /* @__PURE__ */ c(
16
50
  "button",
17
51
  {
18
- tabIndex: 0,
19
- className: `btn btn-ghost btn-xs ${p.length > 0 ? "text-primary" : ""}`,
20
- onClick: () => m(!w),
21
- children: /* @__PURE__ */ s("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ s("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" }) })
22
- }
23
- ),
24
- w && /* @__PURE__ */ f(
25
- "div",
26
- {
27
- tabIndex: 0,
28
- className: "dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-content/10",
52
+ role: "tab",
53
+ className: T,
54
+ onClick: () => !t.disabled && N(t.tabKey),
55
+ disabled: t.disabled,
56
+ "data-state": i ? "active" : "inactive",
57
+ "aria-selected": i,
29
58
  children: [
30
- /* @__PURE__ */ s("div", { className: "space-y-2", children: l.map((c) => /* @__PURE__ */ f("label", { className: "flex items-center gap-2 cursor-pointer p-2 hover:bg-base-200 rounded", children: [
31
- /* @__PURE__ */ s(
32
- "input",
33
- {
34
- type: "checkbox",
35
- className: "checkbox checkbox-xs",
36
- checked: p.includes(c.value),
37
- onChange: () => I(c.value)
38
- }
39
- ),
40
- /* @__PURE__ */ s("span", { className: "text-sm", children: c.text })
41
- ] }, String(c.value))) }),
42
- /* @__PURE__ */ s("div", { className: "divider my-1" }),
43
- /* @__PURE__ */ s(
44
- "button",
45
- {
46
- className: "btn btn-ghost btn-xs w-full",
47
- onClick: P,
48
- children: "Clear"
49
- }
50
- )
59
+ t.icon && /* @__PURE__ */ a("span", { className: "mr-1", children: t.icon }),
60
+ t.tab
51
61
  ]
52
- }
53
- )
54
- ] });
62
+ },
63
+ t.tabKey
64
+ );
65
+ }) }), v = m && /* @__PURE__ */ a("div", { className: d === "top" ? "mt-4" : "mb-4", role: "tabpanel", children: m.children });
66
+ return /* @__PURE__ */ a("div", { ...C, children: d === "top" ? /* @__PURE__ */ c(o, { children: [
67
+ h,
68
+ v
69
+ ] }) : /* @__PURE__ */ c(o, { children: [
70
+ v,
71
+ h
72
+ ] }) });
55
73
  }
56
- function ne({
57
- columns: l,
58
- dataSource: p,
59
- rowKey: k = "id",
60
- loading: w = !1,
61
- size: m = "md",
62
- bordered: I = !1,
63
- hoverable: P = !0,
64
- striped: c = !1,
65
- pinRows: S = !1,
66
- pinCols: $ = !1,
67
- pagination: h,
68
- rowSelection: o,
69
- className: E = "",
70
- onRow: W
71
- }) {
72
- const [N, K] = v(
73
- h !== !1 && h?.current ? h.current : 1
74
- ), j = h !== !1 && h?.pageSize ? h.pageSize : 10, [x, T] = v(() => {
75
- const e = l.find((t) => t.defaultSortOrder);
76
- return {
77
- columnKey: e?.key || null,
78
- order: e?.defaultSortOrder || null
79
- };
80
- }), [V, _] = v(() => {
81
- const e = {};
82
- return l.forEach((t) => {
83
- t.defaultFilteredValue && (e[t.key] = t.defaultFilteredValue);
84
- }), e;
85
- }), [z, O] = v(
86
- o?.selectedRowKeys || []
87
- ), R = h !== !1;
88
- let y = [...p];
89
- if (Object.entries(V).forEach(([e, t]) => {
90
- if (t.length > 0) {
91
- const n = l.find((r) => r.key === e);
92
- n?.onFilter && (y = y.filter(
93
- (r) => t.some((i) => n.onFilter(i, r))
94
- ));
95
- }
96
- }), x.columnKey && x.order) {
97
- const e = l.find((t) => t.key === x.columnKey);
98
- e?.sorter && y.sort((t, n) => {
99
- let r = 0;
100
- if (typeof e.sorter == "function")
101
- r = e.sorter(t, n);
102
- else if (e.dataIndex) {
103
- const i = t[e.dataIndex], d = n[e.dataIndex];
104
- i < d && (r = -1), i > d && (r = 1);
105
- }
106
- return x.order === "ascend" ? r : -r;
107
- });
108
- }
109
- const L = Math.ceil(y.length / j), A = (N - 1) * j, q = A + j, C = R ? y.slice(A, q) : y, B = (e) => {
110
- K(e), h !== !1 && h?.onChange && h.onChange(e, j);
111
- }, G = (e) => {
112
- T((t) => {
113
- if (t.columnKey === e) {
114
- if (t.order === "ascend") return { columnKey: e, order: "descend" };
115
- if (t.order === "descend") return { columnKey: null, order: null };
116
- }
117
- return { columnKey: e, order: "ascend" };
118
- }), K(1);
119
- }, J = (e, t) => {
120
- _((n) => ({
121
- ...n,
122
- [e]: t
123
- })), K(1);
124
- }, Q = (e) => {
125
- const t = e ? C.map((n, r) => F(n, r)) : [];
126
- if (O(t), o?.onChange) {
127
- const n = e ? C : [];
128
- o.onChange(t, n);
129
- }
130
- }, U = (e, t, n) => {
131
- const r = F(e, t), i = n ? [...z, r] : z.filter((d) => d !== r);
132
- if (O(i), o?.onChange) {
133
- const d = y.filter(
134
- (u, a) => i.includes(F(u, a))
135
- );
136
- o.onChange(i, d);
137
- }
138
- }, F = (e, t) => typeof k == "function" ? k(e) : e[k] ?? t.toString(), X = (e, t, n) => e.render ? e.render(
139
- e.dataIndex ? t[e.dataIndex] : void 0,
140
- t,
141
- n
142
- ) : e.dataIndex ? t[e.dataIndex] : "", M = (e) => e === "center" ? "text-center" : e === "right" ? "text-right" : "text-left", D = (e, t = !1) => {
143
- const n = l[e];
144
- if (!n.fixed) return { className: "" };
145
- const r = ["sticky", "bg-base-100"];
146
- let i = 0;
147
- const d = {
148
- boxSizing: "border-box"
149
- };
150
- if (n.fixed === "left") {
151
- for (let a = 0; a < e; a++)
152
- if (l[a].fixed === "left" && l[a].width) {
153
- const b = l[a].width, g = typeof b == "number" ? b : parseInt(String(b));
154
- isNaN(g) || (i += g);
155
- }
156
- i === 0 ? r.push("left-0") : d.left = `${i}px`, r.push(t ? "z-30" : "z-20");
157
- let u = -1;
158
- for (let a = l.length - 1; a >= 0; a--)
159
- if (l[a].fixed === "left") {
160
- u = a;
161
- break;
162
- }
163
- e === u && (d.boxShadow = "2px 0 4px rgba(0, 0, 0, 0.1)");
164
- }
165
- if (n.fixed === "right") {
166
- for (let a = e + 1; a < l.length; a++)
167
- if (l[a].fixed === "right" && l[a].width) {
168
- const b = l[a].width, g = typeof b == "number" ? b : parseInt(String(b));
169
- isNaN(g) || (i += g);
170
- }
171
- i === 0 ? r.push("right-0") : d.right = `${i}px`, r.push(t ? "z-30" : "z-20"), e === l.findIndex((a) => a.fixed === "right") && (d.boxShadow = "-2px 0 4px rgba(0, 0, 0, 0.1)");
172
- }
173
- return {
174
- className: r.filter(Boolean).join(" "),
175
- style: Object.keys(d).length > 0 ? d : void 0
176
- };
177
- }, Y = [
178
- "table",
179
- "bg-base-100",
180
- m === "xs" && "table-xs",
181
- m === "sm" && "table-sm",
182
- m === "lg" && "table-lg",
183
- c && "table-zebra",
184
- S && "table-pin-rows",
185
- $ && "table-pin-cols",
186
- E
187
- ].filter(Boolean).join(" "), Z = l.some((e) => e.fixed), H = [
188
- (!S || Z) && "overflow-x-auto",
189
- I && "rounded-box border border-base-content/5 bg-base-100"
190
- ].filter(Boolean).join(" ");
191
- if (w)
192
- return /* @__PURE__ */ s("div", { className: "flex justify-center items-center p-8", children: /* @__PURE__ */ s("span", { className: "loading loading-spinner loading-lg" }) });
193
- const ee = C.length > 0 && z.length === C.length;
194
- return /* @__PURE__ */ f("div", { className: "space-y-4", children: [
195
- /* @__PURE__ */ s("div", { className: H, children: /* @__PURE__ */ f("table", { className: Y, style: { borderCollapse: "separate", borderSpacing: 0, tableLayout: "fixed" }, children: [
196
- /* @__PURE__ */ s("thead", { children: /* @__PURE__ */ f("tr", { children: [
197
- o && /* @__PURE__ */ s("th", { style: { width: 50 }, className: "sticky left-0 z-20 bg-base-100", children: o.type !== "radio" && /* @__PURE__ */ s(
198
- "input",
199
- {
200
- type: "checkbox",
201
- className: "checkbox checkbox-sm",
202
- checked: ee,
203
- onChange: (e) => Q(e.target.checked)
204
- }
205
- ) }),
206
- l.map((e, t) => {
207
- const n = D(t, !0);
208
- return /* @__PURE__ */ s(
209
- "th",
210
- {
211
- className: `${M(e.align)} ${n.className}`,
212
- style: {
213
- ...e.width ? { width: e.width } : {},
214
- ...n.style
215
- },
216
- children: /* @__PURE__ */ f("div", { className: "flex items-center gap-2", children: [
217
- /* @__PURE__ */ s(
218
- "span",
219
- {
220
- className: e.sorter ? "cursor-pointer select-none" : "",
221
- onClick: () => e.sorter && G(e.key),
222
- children: e.title
223
- }
224
- ),
225
- e.sorter && /* @__PURE__ */ f("div", { className: "flex flex-col", children: [
226
- /* @__PURE__ */ s(
227
- "svg",
228
- {
229
- className: `w-3 h-3 ${x.columnKey === e.key && x.order === "ascend" ? "text-primary" : "text-base-content/30"}`,
230
- fill: "currentColor",
231
- viewBox: "0 0 20 20",
232
- children: /* @__PURE__ */ s("path", { d: "M5.293 9.707a1 1 0 010-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 01-1.414 1.414L11 7.414V15a1 1 0 11-2 0V7.414L6.707 9.707a1 1 0 01-1.414 0z" })
233
- }
234
- ),
235
- /* @__PURE__ */ s(
236
- "svg",
237
- {
238
- className: `w-3 h-3 -mt-1 ${x.columnKey === e.key && x.order === "descend" ? "text-primary" : "text-base-content/30"}`,
239
- fill: "currentColor",
240
- viewBox: "0 0 20 20",
241
- children: /* @__PURE__ */ s("path", { d: "M14.707 10.293a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 111.414-1.414L9 12.586V5a1 1 0 012 0v7.586l2.293-2.293a1 1 0 011.414 0z" })
242
- }
243
- )
244
- ] }),
245
- e.filters && /* @__PURE__ */ s(
246
- te,
247
- {
248
- filters: e.filters,
249
- selectedValues: V[e.key] || [],
250
- onChange: (r) => J(e.key, r)
251
- }
252
- )
253
- ] })
254
- },
255
- e.key
256
- );
257
- })
258
- ] }) }),
259
- /* @__PURE__ */ s("tbody", { children: C.map((e, t) => {
260
- const n = W?.(e, t) || {}, r = F(e, t), i = z.includes(r), d = [
261
- P && "hover:bg-base-300",
262
- i && "bg-primary/10"
263
- ].filter(Boolean).join(" "), u = o?.getCheckboxProps?.(e) || {};
264
- return /* @__PURE__ */ f(
265
- "tr",
266
- {
267
- className: d,
268
- ...n,
269
- children: [
270
- o && /* @__PURE__ */ s("td", { className: "sticky left-0 z-10 bg-base-100", children: /* @__PURE__ */ s(
271
- "input",
272
- {
273
- type: o.type === "radio" ? "radio" : "checkbox",
274
- className: o.type === "radio" ? "radio radio-sm" : "checkbox checkbox-sm",
275
- checked: i,
276
- onChange: (a) => U(e, t, a.target.checked),
277
- ...u
278
- }
279
- ) }),
280
- l.map((a, b) => {
281
- const g = D(b, !1);
282
- return /* @__PURE__ */ s(
283
- "td",
284
- {
285
- className: `${M(a.align)} ${g.className}`,
286
- style: g.style,
287
- children: X(a, e, t)
288
- },
289
- a.key
290
- );
291
- })
292
- ]
293
- },
294
- r
295
- );
296
- }) })
297
- ] }) }),
298
- R && L > 1 && /* @__PURE__ */ s("div", { className: "flex justify-end", children: /* @__PURE__ */ f("div", { className: "join", children: [
299
- /* @__PURE__ */ s(
300
- "button",
301
- {
302
- className: "join-item btn btn-sm",
303
- onClick: () => B(N - 1),
304
- disabled: N === 1,
305
- children: "«"
306
- }
307
- ),
308
- Array.from({ length: L }, (e, t) => t + 1).map((e) => /* @__PURE__ */ s(
309
- "button",
310
- {
311
- className: `join-item btn btn-sm ${N === e ? "btn-active" : ""}`,
312
- onClick: () => B(e),
313
- children: e
314
- },
315
- e
316
- )),
317
- /* @__PURE__ */ s(
318
- "button",
319
- {
320
- className: "join-item btn btn-sm",
321
- onClick: () => B(N + 1),
322
- disabled: N === L,
323
- children: "»"
324
- }
325
- )
326
- ] }) })
327
- ] });
74
+ function x({ children: s }) {
75
+ return /* @__PURE__ */ a(o, { children: s });
328
76
  }
77
+ const I = Object.assign(_, {
78
+ Panel: x
79
+ });
329
80
  export {
330
- ne as Table
81
+ I as Tabs
331
82
  };
332
83
  //# sourceMappingURL=index81.js.map