asterui 0.12.58 → 0.12.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Autocomplete.js +1 -1
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Button.js +1 -1
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Checkbox.js +1 -1
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/ColorPicker.js +1 -1
- package/dist/components/ColorPicker.js.map +1 -1
- package/dist/components/CopyButton.js +1 -1
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/Countdown.js +1 -1
- package/dist/components/Countdown.js.map +1 -1
- package/dist/components/DatePicker.js +1 -1
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dock.js +1 -1
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/Empty.js +1 -1
- package/dist/components/Empty.js.map +1 -1
- package/dist/components/FileInput.js +1 -1
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.js +1 -1
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/Form.js +1 -1
- package/dist/components/Form.js.map +1 -1
- package/dist/components/Input.js +1 -1
- package/dist/components/Input.js.map +1 -1
- package/dist/components/InputNumber.js +1 -1
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/List.js +1 -1
- package/dist/components/List.js.map +1 -1
- package/dist/components/Loading.js +1 -1
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Modal.js +1 -1
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/OTPInput.js +1 -1
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.js +1 -1
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Popconfirm.js +1 -1
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Radio.js +1 -1
- package/dist/components/Radio.js.map +1 -1
- package/dist/components/Range.js +1 -1
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.js +1 -1
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/RichTextEditor.js +1 -1
- package/dist/components/RichTextEditor.js.map +1 -1
- package/dist/components/Segmented.js +1 -1
- package/dist/components/Segmented.js.map +1 -1
- package/dist/components/Select.js +1 -1
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Table.d.ts +19 -0
- package/dist/components/Table.js +348 -310
- package/dist/components/Table.js.map +1 -1
- package/dist/components/Tabs.js +1 -1
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Textarea.js +1 -1
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.js +1 -1
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/TimePicker.js +1 -1
- package/dist/components/TimePicker.js.map +1 -1
- package/dist/components/Toggle.js +1 -1
- package/dist/components/Toggle.js.map +1 -1
- package/dist/hooks/useTheme.d.ts +1 -1
- package/dist/hooks/useTheme.js +1 -1
- package/dist/hooks/useTheme.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/providers/ConfigProvider.js.map +1 -0
- package/dist/providers/ThemeProvider.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/ConfigProvider.js.map +0 -1
- package/dist/components/ThemeProvider.js.map +0 -1
- /package/dist/{components → providers}/ConfigProvider.d.ts +0 -0
- /package/dist/{components → providers}/ConfigProvider.js +0 -0
- /package/dist/{components → providers}/ThemeProvider.d.ts +0 -0
- /package/dist/{components → providers}/ThemeProvider.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.js","sources":["../../src/components/Table.tsx"],"sourcesContent":["import React, { useState, forwardRef, useMemo, useCallback, useId } from 'react'\n\n// DaisyUI classes\nconst dTable = 'table'\nconst dTableXs = 'table-xs'\nconst dTableSm = 'table-sm'\nconst dTableLg = 'table-lg'\nconst dTableXl = 'table-xl'\nconst dTableZebra = 'table-zebra'\nconst dTablePinRows = 'table-pin-rows'\nconst dTablePinCols = 'table-pin-cols'\nconst dDropdown = 'dropdown'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownContent = 'dropdown-content'\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnSquare = 'btn-square'\nconst dBtnActive = 'btn-active'\nconst dMenu = 'menu'\nconst dCheckbox = 'checkbox'\nconst dCheckboxXs = 'checkbox-xs'\nconst dCheckboxPrimary = 'checkbox-primary'\nconst dRadio = 'radio'\nconst dRadioSm = 'radio-sm'\nconst dRadioPrimary = 'radio-primary'\nconst dDivider = 'divider'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingLg = 'loading-lg'\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dSelect = 'select'\nconst dSelectSm = 'select-sm'\nconst dSelectBordered = 'select-bordered'\nconst dInput = 'input'\nconst dInputSm = 'input-sm'\nconst dInputBordered = 'input-bordered'\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: dTableXs,\n sm: dTableSm,\n md: '',\n lg: dTableLg,\n xl: dTableXl,\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={`${dDropdown} ${dDropdownEnd}`} onKeyDown={handleKeyDown}>\n <button\n type=\"button\"\n className={`${dBtn} ${dBtnGhost} ${dBtnXs} ${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={`${dDropdownContent} z-[1] ${dMenu} 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={`${dCheckbox} ${dCheckboxXs} ${dCheckboxPrimary}`}\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={`${dDivider} my-1`}></div>\n <button\n type=\"button\"\n className={`${dBtn} ${dBtnGhost} ${dBtnXs} 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={`${dBtn} ${dBtnGhost} ${dBtnXs} ${dBtnSquare}`}\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 dTable,\n 'bg-base-100',\n sizeClasses[size],\n striped && dTableZebra,\n pinRows && dTablePinRows,\n pinCols && dTablePinCols,\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={`${dLoading} ${dLoadingSpinner} ${dLoadingLg}`} 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={`${dSelect} ${dSelectSm} ${dSelectBordered}`}\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={dJoin}>\n <button\n type=\"button\"\n className={`${dJoinItem} ${dBtn} ${dBtnSm}`}\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={`${dJoinItem} ${dBtn} ${dBtnSm} ${currentPage === page ? dBtnActive : ''}`}\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={`${dJoinItem} ${dBtn} ${dBtnSm}`}\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={`${dInput} ${dInputSm} ${dInputBordered} 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={`${dCheckbox} checkbox-sm ${dCheckboxPrimary}`}\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' ? `${dRadio} ${dRadioSm} ${dRadioPrimary}` : `${dCheckbox} checkbox-sm ${dCheckboxPrimary}`}\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":["dTable","dTableXs","dTableSm","dTableLg","dTableXl","dTableZebra","dTablePinRows","dTablePinCols","dDropdown","dDropdownEnd","dDropdownContent","dBtn","dBtnGhost","dBtnXs","dBtnSm","dBtnSquare","dBtnActive","dMenu","dCheckbox","dCheckboxXs","dCheckboxPrimary","dRadio","dRadioSm","dRadioPrimary","dDivider","dLoading","dLoadingSpinner","dLoadingLg","dJoin","dJoinItem","dSelect","dSelectSm","dSelectBordered","dInput","dInputSm","dInputBordered","sizeClasses","FilterDropdown","filters","selectedValues","onChange","locale","testId","isOpen","setIsOpen","useState","dropdownId","useId","handleToggle","value","newValues","v","handleClear","handleKeyDown","e","jsxs","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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"}
|
|
1
|
+
{"version":3,"file":"Table.js","sources":["../../src/components/Table.tsx"],"sourcesContent":["import React, { useState, forwardRef, useMemo, useCallback, useId } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dTable = 'table'\nconst dTableXs = 'table-xs'\nconst dTableSm = 'table-sm'\nconst dTableMd = 'table-md'\nconst dTableLg = 'table-lg'\nconst dTableXl = 'table-xl'\nconst dTableZebra = 'table-zebra'\nconst dTablePinRows = 'table-pin-rows'\nconst dTablePinCols = 'table-pin-cols'\nconst dDropdown = 'dropdown'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownContent = 'dropdown-content'\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnSquare = 'btn-square'\nconst dBtnActive = 'btn-active'\nconst dMenu = 'menu'\nconst dCheckbox = 'checkbox'\nconst dCheckboxXs = 'checkbox-xs'\nconst dCheckboxSm = 'checkbox-sm'\nconst dCheckboxMd = 'checkbox-md'\nconst dCheckboxLg = 'checkbox-lg'\nconst dCheckboxPrimary = 'checkbox-primary'\nconst dRadio = 'radio'\nconst dRadioXs = 'radio-xs'\nconst dRadioSm = 'radio-sm'\nconst dRadioMd = 'radio-md'\nconst dRadioLg = 'radio-lg'\nconst dRadioPrimary = 'radio-primary'\nconst dDivider = 'divider'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingLg = 'loading-lg'\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dSelect = 'select'\nconst dSelectSm = 'select-sm'\nconst dSelectBordered = 'select-bordered'\nconst dInput = 'input'\nconst dInputSm = 'input-sm'\nconst dInputBordered = 'input-bordered'\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 className?: string\n onCell?: (record: T, index: number) => React.TdHTMLAttributes<HTMLTableCellElement>\n onHeaderCell?: (column: ColumnType<T>) => React.ThHTMLAttributes<HTMLTableCellElement>\n}\n\nexport interface RowSelection<T> {\n type?: 'checkbox' | 'radio'\n selectedRowKeys?: React.Key[]\n onChange?: (selectedRowKeys: React.Key[], selectedRows: T[]) => void\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void\n getCheckboxProps?: (record: T) => { disabled?: boolean; name?: string }\n columnTitle?: React.ReactNode\n columnWidth?: string | number\n fixed?: boolean\n hideSelectAll?: boolean\n}\n\nexport interface ExpandableConfig<T> {\n expandedRowKeys?: React.Key[]\n defaultExpandedRowKeys?: React.Key[]\n defaultExpandAllRows?: boolean\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 columnTitle?: React.ReactNode\n columnWidth?: string | number\n expandedRowClassName?: string | ((record: T, index: number, expanded: boolean) => string)\n showExpandColumn?: boolean\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 showHeader?: boolean\n rowClassName?: string | ((record: T, index: number) => string)\n onRow?: (record: T, index: number) => React.HTMLAttributes<HTMLTableRowElement>\n onHeaderRow?: (columns: ColumnType<T>[]) => 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 title?: (currentPageData: T[]) => React.ReactNode\n footer?: (currentPageData: T[]) => React.ReactNode\n summary?: (currentPageData: T[]) => React.ReactNode\n 'data-testid'?: string\n 'aria-label'?: string\n}\n\nconst sizeClasses: Record<TableSize, string> = {\n xs: dTableXs,\n sm: dTableSm,\n md: dTableMd,\n lg: dTableLg,\n xl: dTableXl,\n}\n\nconst checkboxSizeClasses: Record<TableSize, string> = {\n xs: dCheckboxXs,\n sm: dCheckboxSm,\n md: dCheckboxMd,\n lg: dCheckboxLg,\n xl: dCheckboxLg, // DaisyUI max is lg\n}\n\nconst radioSizeClasses: Record<TableSize, string> = {\n xs: dRadioXs,\n sm: dRadioSm,\n md: dRadioMd,\n lg: dRadioLg,\n xl: dRadioLg, // DaisyUI max is lg\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={`${dDropdown} ${dDropdownEnd}`} onKeyDown={handleKeyDown}>\n <button\n type=\"button\"\n className={`${dBtn} ${dBtnGhost} ${dBtnXs} ${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={`${dDropdownContent} z-[1] ${dMenu} 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={`${dCheckbox} ${dCheckboxXs} ${dCheckboxPrimary}`}\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={`${dDivider} my-1`}></div>\n <button\n type=\"button\"\n className={`${dBtn} ${dBtnGhost} ${dBtnXs} 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={`${dBtn} ${dBtnGhost} ${dBtnXs} ${dBtnSquare}`}\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,\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 showHeader = true,\n rowClassName,\n onRow,\n onHeaderRow,\n onChange,\n onSortChange,\n onFilterChange,\n locale: localeProp,\n title,\n footer,\n summary,\n 'data-testid': testId,\n 'aria-label': ariaLabel,\n ...rest\n }: TableProps<T>,\n ref: React.ForwardedRef<HTMLTableElement>\n) {\n const { componentSize, locale: globalLocale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const locale = {\n emptyText: localeProp?.emptyText ?? globalLocale?.Table?.emptyText ?? 'No data',\n filterConfirm: localeProp?.filterConfirm ?? globalLocale?.Table?.filterConfirm ?? 'OK',\n filterReset: localeProp?.filterReset ?? globalLocale?.Table?.filterReset ?? 'Reset',\n selectAll: localeProp?.selectAll ?? globalLocale?.Table?.selectAll ?? 'Select all',\n selectInvert: localeProp?.selectInvert ?? globalLocale?.Table?.selectInvert ?? 'Invert selection',\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 if (expandable?.expandedRowKeys) return expandable.expandedRowKeys\n if (expandable?.defaultExpandedRowKeys) return expandable.defaultExpandedRowKeys\n if (expandable?.defaultExpandAllRows) {\n return dataSource.map((record, index) => {\n if (typeof rowKey === 'function') return rowKey(record)\n const keyValue = record[rowKey]\n return keyValue !== undefined ? String(keyValue) : String(index)\n })\n }\n return []\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, nativeEvent?: Event) => {\n const key = getRowKey(record, index)\n\n if (rowSelection?.type === 'radio') {\n const newSelectedKeys = checked ? [key] : []\n const selectedRecords = checked ? [record] : []\n if (!isControlledSelection) {\n setSelectedKeys(newSelectedKeys)\n }\n rowSelection?.onSelect?.(record, checked, selectedRecords, nativeEvent!)\n rowSelection?.onChange?.(newSelectedKeys, selectedRecords)\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 const selectedRecords = sortedData.filter((r, i) =>\n newSelectedKeys.includes(getRowKey(r, i))\n )\n rowSelection?.onSelect?.(record, checked, selectedRecords, nativeEvent!)\n rowSelection?.onChange?.(newSelectedKeys, selectedRecords)\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 dTable,\n 'bg-base-100',\n sizeClasses[effectiveSize],\n striped && dTableZebra,\n pinRows && dTablePinRows,\n pinCols && dTablePinCols,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const hasFixedColumns = visibleColumns.some((col) => col.fixed)\n const hasExpandable = expandable !== undefined\n const showExpandColumn = hasExpandable && (expandable?.showExpandColumn !== false)\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={`${dLoading} ${dLoadingSpinner} ${dLoadingLg}`} 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) + (showExpandColumn ? 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={`${dSelect} ${dSelectSm} ${dSelectBordered}`}\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={dJoin}>\n <button\n type=\"button\"\n className={`${dJoinItem} ${dBtn} ${dBtnSm}`}\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={`${dJoinItem} ${dBtn} ${dBtnSm} ${currentPage === page ? dBtnActive : ''}`}\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={`${dJoinItem} ${dBtn} ${dBtnSm}`}\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={`${dInput} ${dInputSm} ${dInputBordered} 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 {title && (\n <div className=\"text-lg font-semibold\" data-testid={`${baseTestId}-title`}>\n {title(paginatedData)}\n </div>\n )}\n\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 {showHeader && (\n <thead>\n <tr role=\"row\" {...(onHeaderRow?.(visibleColumns) || {})}>\n {showExpandColumn && (\n <th style={{ width: expandable?.columnWidth ?? 50 }} className=\"sticky left-0 z-20 bg-base-100\" role=\"columnheader\">\n {expandable?.columnTitle ?? <span className=\"sr-only\">Expand</span>}\n </th>\n )}\n {rowSelection && (\n <th\n style={{ width: rowSelection.columnWidth ?? 50 }}\n className={`${rowSelection.fixed !== false ? 'sticky' : ''} ${rowSelection.fixed !== false && !showExpandColumn ? 'left-0' : ''} z-20 bg-base-100`}\n role=\"columnheader\"\n >\n {rowSelection.columnTitle !== undefined ? (\n rowSelection.columnTitle\n ) : rowSelection.type !== 'radio' && !rowSelection.hideSelectAll ? (\n <input\n type=\"checkbox\"\n className={`${dCheckbox} ${checkboxSizeClasses[effectiveSize]} ${dCheckboxPrimary}`}\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 ) : null}\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 const headerCellProps = column.onHeaderCell?.(column) || {}\n return (\n <th\n key={column.key}\n {...headerCellProps}\n className={[getAlignClass(column.align), fixedStyle.className, column.className, headerCellProps.className].filter(Boolean).join(' ')}\n style={{\n ...(column.width ? { width: column.width } : {}),\n ...fixedStyle.style,\n ...headerCellProps.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 )}\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 customRowClassName = typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName\n const rowClasses = [\n hoverable && 'hover:bg-base-200',\n isSelected && 'bg-primary/10',\n customRowClassName,\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 {showExpandColumn && (\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={`${rowSelection.fixed !== false ? 'sticky' : ''} ${rowSelection.fixed !== false && !showExpandColumn ? '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' ? `${dRadio} ${radioSizeClasses[effectiveSize]} ${dRadioPrimary}` : `${dCheckbox} ${checkboxSizeClasses[effectiveSize]} ${dCheckboxPrimary}`}\n checked={isSelected}\n onChange={(e) => handleSelectRow(record, index, e.target.checked, e.nativeEvent)}\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 const cellProps = column.onCell?.(record, index) || {}\n\n return (\n <td\n key={column.key}\n {...cellProps}\n className={[getAlignClass(column.align), fixedStyle.className, column.ellipsis ? 'truncate max-w-0' : '', column.className, cellProps.className].filter(Boolean).join(' ')}\n style={{ ...fixedStyle.style, ...cellProps.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={[\n 'bg-base-200/50',\n typeof expandable!.expandedRowClassName === 'function'\n ? expandable!.expandedRowClassName(record, index, isExpanded)\n : expandable!.expandedRowClassName\n ].filter(Boolean).join(' ')}\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 {summary && (\n <tfoot data-testid={`${baseTestId}-summary`}>\n {summary(paginatedData)}\n </tfoot>\n )}\n </table>\n </div>\n\n {bottomPagination}\n\n {footer && (\n <div className=\"text-sm text-base-content/70\" data-testid={`${baseTestId}-footer`}>\n {footer(paginatedData)}\n </div>\n )}\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":["dTable","dTableXs","dTableSm","dTableMd","dTableLg","dTableXl","dTableZebra","dTablePinRows","dTablePinCols","dDropdown","dDropdownEnd","dDropdownContent","dBtn","dBtnGhost","dBtnXs","dBtnSm","dBtnSquare","dBtnActive","dMenu","dCheckbox","dCheckboxXs","dCheckboxSm","dCheckboxMd","dCheckboxLg","dCheckboxPrimary","dRadio","dRadioXs","dRadioSm","dRadioMd","dRadioLg","dRadioPrimary","dDivider","dLoading","dLoadingSpinner","dLoadingLg","dJoin","dJoinItem","dSelect","dSelectSm","dSelectBordered","dInput","dInputSm","dInputBordered","sizeClasses","checkboxSizeClasses","radioSizeClasses","FilterDropdown","filters","selectedValues","onChange","locale","testId","isOpen","setIsOpen","useState","dropdownId","useId","handleToggle","value","newValues","v","handleClear","handleKeyDown","e","jsxs","jsx","filter","DefaultExpandIcon","expanded","onExpand","TableInner","columns","dataSource","rowKey","loading","size","bordered","hoverable","striped","pinRows","pinCols","pagination","rowSelection","expandable","scroll","className","showHeader","rowClassName","onRow","onHeaderRow","onSortChange","onFilterChange","localeProp","title","footer","summary","ariaLabel","rest","ref","componentSize","globalLocale","useConfig","effectiveSize","baseTestId","defaultPageSize","currentPage","setCurrentPage","internalPageSize","setInternalPageSize","pageSize","sortState","setSortState","controlledSortColumn","col","defaultSortColumn","filterState","setFilterState","initial","selectedKeys","setSelectedKeys","expandedKeys","setExpandedKeys","record","index","keyValue","isControlledSort","isControlledFilter","isControlledExpand","isControlledSelection","effectiveSortState","useMemo","controlledCol","effectiveFilterState","controlled","effectiveSelectedKeys","effectiveExpandedKeys","isPaginationEnabled","visibleColumns","getRowKey","useCallback","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","nativeEvent","key","k","r","i","handleExpand","isExpanded","newExpandedKeys","getCellValue","getAlignClass","align","getFixedColumnStyle","columnIndex","isHeader","classes","offset","style","colWidth","width","lastLeftFixedIndex","tableClasses","hasFixedColumns","hasExpandable","showExpandColumn","wrapperStyle","wrapperClasses","isAllSelected","isSomeSelected","emptyText","extraColsCount","renderPagination","paginationConfig","position","showSizeChanger","showQuickJumper","showTotal","pageSizeOptions","justifyClass","_","paginationPosition","topPagination","bottomPagination","el","fixedStyle","sortOrder","headerCellProps","rowProps","isSelected","isExpandable","customRowClassName","rowClasses","checkboxProps","handleRowClick","React","cellContent","cellProps","Table","forwardRef"],"mappings":"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"}
|
package/dist/components/Tabs.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as s, jsxs as d, Fragment as b } from "react/jsx-runtime";
|
|
2
2
|
import h, { forwardRef as $, useState as X } from "react";
|
|
3
|
-
import { useConfig as w } from "
|
|
3
|
+
import { useConfig as w } from "../providers/ConfigProvider.js";
|
|
4
4
|
const D = "tabs", E = "tabs-box", F = "tabs-border", K = "tabs-lift", M = "tabs-xs", O = "tabs-sm", V = "tabs-md", q = "tabs-lg", G = "tabs-xl", H = "tab", I = "tab-active", J = "tab-disabled", Q = {
|
|
5
5
|
box: E,
|
|
6
6
|
border: F,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.js","sources":["../../src/components/Tabs.tsx"],"sourcesContent":["import React, { useState, forwardRef } from 'react'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"Tabs.js","sources":["../../src/components/Tabs.tsx"],"sourcesContent":["import React, { useState, forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dTabs = 'tabs'\nconst dTabsBox = 'tabs-box'\nconst dTabsBorder = 'tabs-border'\nconst dTabsLift = 'tabs-lift'\nconst dTabsXs = 'tabs-xs'\nconst dTabsSm = 'tabs-sm'\nconst dTabsMd = 'tabs-md'\nconst dTabsLg = 'tabs-lg'\nconst dTabsXl = 'tabs-xl'\nconst dTab = 'tab'\nconst dTabActive = 'tab-active'\nconst dTabDisabled = 'tab-disabled'\n\nexport type TabsVariant = 'box' | 'border' | 'lift'\nexport type TabsSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type TabsPosition = 'top' | 'bottom'\n\nexport interface TabItem {\n key: string\n label: React.ReactNode\n children?: React.ReactNode\n disabled?: boolean\n icon?: React.ReactNode\n}\n\nexport interface TabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Tab panels (compound pattern) */\n children?: React.ReactNode\n /** Tab items (data-driven pattern) */\n items?: TabItem[]\n /** Current active tab key (controlled) */\n activeKey?: string\n /** Default active tab key (uncontrolled) */\n defaultActiveKey?: string\n /** Callback when tab changes */\n onChange?: (key: string) => void\n /** Visual style variant */\n variant?: TabsVariant\n /** Tab size */\n size?: TabsSize\n /** Tab position relative to content */\n position?: TabsPosition\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface TabPanelProps {\n /** Tab button label */\n tab: React.ReactNode\n /** Disable the tab */\n disabled?: boolean\n /** Tab panel content */\n children?: React.ReactNode\n /** Tab icon */\n icon?: React.ReactNode\n}\n\nconst variantClasses: Record<TabsVariant, string> = {\n box: dTabsBox,\n border: dTabsBorder,\n lift: dTabsLift,\n}\n\nconst sizeClasses: Record<TabsSize, string> = {\n xs: dTabsXs,\n sm: dTabsSm,\n md: dTabsMd,\n lg: dTabsLg,\n xl: dTabsXl,\n}\n\ninterface InternalPanelProps extends TabPanelProps {\n _key: string\n}\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsProps>(function TabsRoot(\n {\n children,\n items,\n activeKey,\n defaultActiveKey,\n onChange,\n variant,\n size,\n position = 'top',\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? (componentSize as TabsSize | undefined)\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n // Get panels from children (compound pattern), extracting key from React element\n const panels = React.Children.toArray(children)\n .filter((child): child is React.ReactElement<TabPanelProps> =>\n React.isValidElement(child) && child.type === TabPanel\n )\n .map((child) => ({\n ...child.props,\n _key: child.key != null ? String(child.key) : '',\n }))\n\n // Convert items to panel-like structure if using data-driven pattern\n const effectivePanels: InternalPanelProps[] = items && items.length > 0\n ? items.map(item => ({\n _key: item.key,\n tab: item.label,\n children: item.children,\n disabled: item.disabled,\n icon: item.icon,\n }))\n : panels\n\n const [internalActiveKey, setInternalActiveKey] = useState(\n defaultActiveKey || effectivePanels[0]?._key || ''\n )\n const currentActiveKey = activeKey !== undefined ? activeKey : internalActiveKey\n\n const handleTabClick = (key: string) => {\n if (activeKey === undefined) {\n setInternalActiveKey(key)\n }\n onChange?.(key)\n }\n\n const classes = [\n dTabs,\n variant && variantClasses[variant],\n effectiveSize && sizeClasses[effectiveSize],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const activePanel = effectivePanels.find((panel) => panel._key === currentActiveKey)\n\n const tabList = (\n <div role=\"tablist\" className={classes} data-testid={getTestId('tablist')}>\n {effectivePanels.map((panel) => {\n const isActive = currentActiveKey === panel._key\n const tabClasses = [\n dTab,\n isActive && dTabActive,\n panel.disabled && dTabDisabled,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <button\n key={panel._key}\n role=\"tab\"\n className={tabClasses}\n onClick={() => !panel.disabled && handleTabClick(panel._key)}\n disabled={panel.disabled}\n data-state={isActive ? 'active' : 'inactive'}\n data-testid={getTestId(`tab-${panel._key}`)}\n aria-selected={isActive}\n >\n {panel.icon && <span className=\"mr-1\">{panel.icon}</span>}\n {panel.tab}\n </button>\n )\n })}\n </div>\n )\n\n const content = activePanel && (\n <div className={position === 'top' ? 'mt-4' : 'mb-4'} role=\"tabpanel\" data-testid={getTestId('tabpanel')}>\n {activePanel.children}\n </div>\n )\n\n return (\n <div ref={ref} data-testid={testId} {...rest}>\n {position === 'top' ? (\n <>\n {tabList}\n {content}\n </>\n ) : (\n <>\n {content}\n {tabList}\n </>\n )}\n </div>\n )\n})\n\nfunction TabPanel({ children }: TabPanelProps) {\n // This component is only used for type checking and is not rendered directly\n // The actual rendering is done in TabsRoot\n return <>{children}</>\n}\n\nexport const Tabs = Object.assign(TabsRoot, {\n Panel: TabPanel,\n})\n"],"names":["dTabs","dTabsBox","dTabsBorder","dTabsLift","dTabsXs","dTabsSm","dTabsMd","dTabsLg","dTabsXl","dTab","dTabActive","dTabDisabled","variantClasses","sizeClasses","TabsRoot","forwardRef","children","items","activeKey","defaultActiveKey","onChange","variant","size","position","testId","className","rest","ref","componentSize","useConfig","effectiveSize","getTestId","suffix","panels","React","child","TabPanel","effectivePanels","item","internalActiveKey","setInternalActiveKey","useState","currentActiveKey","handleTabClick","key","classes","activePanel","panel","tabList","jsx","isActive","tabClasses","jsxs","content","Fragment","Tabs"],"mappings":";;;AAIA,MAAMA,IAAQ,QACRC,IAAW,YACXC,IAAc,eACdC,IAAY,aACZC,IAAU,WACVC,IAAU,WACVC,IAAU,WACVC,IAAU,WACVC,IAAU,WACVC,IAAO,OACPC,IAAa,cACbC,IAAe,gBA8CfC,IAA8C;AAAA,EAClD,KAAKX;AAAA,EACL,QAAQC;AAAA,EACR,MAAMC;AACR,GAEMU,IAAwC;AAAA,EAC5C,IAAIT;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AACN,GAMMM,IAAWC,EAAsC,SACrD;AAAA,EACE,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,eAAeC;AAAA,EACf,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GACAC,GACA;AACA,QAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBR,KAASM,GAGzBG,IAAY,CAACC,MAAoBR,IAAS,GAAGA,CAAM,IAAIQ,CAAM,KAAK,QAElEC,IAASC,EAAM,SAAS,QAAQlB,CAAQ,EAC3C;AAAA,IAAO,CAACmB,MACPD,EAAM,eAAeC,CAAK,KAAKA,EAAM,SAASC;AAAA,EAAA,EAE/C,IAAI,CAACD,OAAW;AAAA,IACf,GAAGA,EAAM;AAAA,IACT,MAAMA,EAAM,OAAO,OAAO,OAAOA,EAAM,GAAG,IAAI;AAAA,EAAA,EAC9C,GAGEE,IAAwCpB,KAASA,EAAM,SAAS,IAClEA,EAAM,IAAI,CAAAqB,OAAS;AAAA,IACjB,MAAMA,EAAK;AAAA,IACX,KAAKA,EAAK;AAAA,IACV,UAAUA,EAAK;AAAA,IACf,UAAUA,EAAK;AAAA,IACf,MAAMA,EAAK;AAAA,EAAA,EACX,IACFL,GAEE,CAACM,GAAmBC,CAAoB,IAAIC;AAAA,IAChDtB,KAAoBkB,EAAgB,CAAC,GAAG,QAAQ;AAAA,EAAA,GAE5CK,IAAmBxB,MAAc,SAAYA,IAAYqB,GAEzDI,IAAiB,CAACC,MAAgB;AACtC,IAAI1B,MAAc,UAChBsB,EAAqBI,CAAG,GAE1BxB,IAAWwB,CAAG;AAAA,EAChB,GAEMC,IAAU;AAAA,IACd7C;AAAA,IACAqB,KAAWT,EAAeS,CAAO;AAAA,IACjCS,KAAiBjB,EAAYiB,CAAa;AAAA,IAC1CL;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELqB,IAAcT,EAAgB,KAAK,CAACU,MAAUA,EAAM,SAASL,CAAgB,GAE7EM,IACJ,gBAAAC,EAAC,OAAA,EAAI,MAAK,WAAU,WAAWJ,GAAS,eAAad,EAAU,SAAS,GACrE,UAAAM,EAAgB,IAAI,CAACU,MAAU;AAC9B,UAAMG,IAAWR,MAAqBK,EAAM,MACtCI,IAAa;AAAA,MACjB1C;AAAA,MACAyC,KAAYxC;AAAA,MACZqC,EAAM,YAAYpC;AAAA,IAAA,EAEjB,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACE,gBAAAyC;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAWD;AAAA,QACX,SAAS,MAAM,CAACJ,EAAM,YAAYJ,EAAeI,EAAM,IAAI;AAAA,QAC3D,UAAUA,EAAM;AAAA,QAChB,cAAYG,IAAW,WAAW;AAAA,QAClC,eAAanB,EAAU,OAAOgB,EAAM,IAAI,EAAE;AAAA,QAC1C,iBAAeG;AAAA,QAEd,UAAA;AAAA,UAAAH,EAAM,QAAQ,gBAAAE,EAAC,QAAA,EAAK,WAAU,QAAQ,YAAM,MAAK;AAAA,UACjDF,EAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAVFA,EAAM;AAAA,IAAA;AAAA,EAajB,CAAC,EAAA,CACH,GAGIM,IAAUP,KACd,gBAAAG,EAAC,OAAA,EAAI,WAAW1B,MAAa,QAAQ,SAAS,QAAQ,MAAK,YAAW,eAAaQ,EAAU,UAAU,GACpG,YAAY,UACf;AAGF,SACE,gBAAAkB,EAAC,SAAI,KAAAtB,GAAU,eAAaH,GAAS,GAAGE,GACrC,UAAAH,MAAa,QACZ,gBAAA6B,EAAAE,GAAA,EACG,UAAA;AAAA,IAAAN;AAAA,IACAK;AAAA,EAAA,EAAA,CACH,IAEA,gBAAAD,EAAAE,GAAA,EACG,UAAA;AAAA,IAAAD;AAAA,IACAL;AAAA,EAAA,EAAA,CACH,EAAA,CAEJ;AAEJ,CAAC;AAED,SAASZ,EAAS,EAAE,UAAApB,KAA2B;AAG7C,gCAAU,UAAAA,GAAS;AACrB;AAEO,MAAMuC,KAAO,OAAO,OAAOzC,GAAU;AAAA,EAC1C,OAAOsB;AACT,CAAC;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as m } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as T } from "react";
|
|
3
|
-
import { useConfig as f } from "
|
|
3
|
+
import { useConfig as f } from "../providers/ConfigProvider.js";
|
|
4
4
|
const u = "textarea", g = "textarea-bordered", p = "textarea-ghost", y = "textarea-xs", S = "textarea-sm", w = "textarea-md", C = "textarea-lg", z = "textarea-xl", N = "textarea-neutral", h = "textarea-primary", j = "textarea-secondary", B = "textarea-accent", X = "textarea-info", b = "textarea-success", v = "textarea-warning", A = "textarea-error", E = T(
|
|
5
5
|
({
|
|
6
6
|
size: t,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sources":["../../src/components/Textarea.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '
|
|
1
|
+
{"version":3,"file":"Textarea.js","sources":["../../src/components/Textarea.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dTextarea = 'textarea'\nconst dTextareaBordered = 'textarea-bordered'\nconst dTextareaGhost = 'textarea-ghost'\nconst dTextareaXs = 'textarea-xs'\nconst dTextareaSm = 'textarea-sm'\nconst dTextareaMd = 'textarea-md'\nconst dTextareaLg = 'textarea-lg'\nconst dTextareaXl = 'textarea-xl'\nconst dTextareaNeutral = 'textarea-neutral'\nconst dTextareaPrimary = 'textarea-primary'\nconst dTextareaSecondary = 'textarea-secondary'\nconst dTextareaAccent = 'textarea-accent'\nconst dTextareaInfo = 'textarea-info'\nconst dTextareaSuccess = 'textarea-success'\nconst dTextareaWarning = 'textarea-warning'\nconst dTextareaError = 'textarea-error'\n\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n ghost?: boolean\n bordered?: boolean\n className?: string\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n size,\n color,\n ghost = false,\n bordered = true,\n className = '',\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dTextareaXs,\n sm: dTextareaSm,\n md: dTextareaMd,\n lg: dTextareaLg,\n xl: dTextareaXl,\n }\n\n const colorClasses = {\n neutral: dTextareaNeutral,\n primary: dTextareaPrimary,\n secondary: dTextareaSecondary,\n accent: dTextareaAccent,\n info: dTextareaInfo,\n success: dTextareaSuccess,\n warning: dTextareaWarning,\n error: dTextareaError,\n }\n\n const textareaClasses = [\n dTextarea,\n 'w-full',\n bordered && dTextareaBordered,\n ghost && dTextareaGhost,\n effectiveSize && sizeClasses[effectiveSize],\n color && colorClasses[color],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return <textarea ref={ref} className={textareaClasses} {...props} />\n }\n)\n\nTextarea.displayName = 'Textarea'\n"],"names":["dTextarea","dTextareaBordered","dTextareaGhost","dTextareaXs","dTextareaSm","dTextareaMd","dTextareaLg","dTextareaXl","dTextareaNeutral","dTextareaPrimary","dTextareaSecondary","dTextareaAccent","dTextareaInfo","dTextareaSuccess","dTextareaWarning","dTextareaError","Textarea","forwardRef","size","color","ghost","bordered","className","props","ref","componentSize","useConfig","effectiveSize","sizeClasses","colorClasses","textareaClasses"],"mappings":";;;AAIA,MAAMA,IAAY,YACZC,IAAoB,qBACpBC,IAAiB,kBACjBC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAmB,oBACnBC,IAAmB,oBACnBC,IAAqB,sBACrBC,IAAkB,mBAClBC,IAAgB,iBAChBC,IAAmB,oBACnBC,IAAmB,oBACnBC,IAAiB,kBAUVC,IAAWC;AAAA,EACtB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,UAAAC,IAAW;AAAA,IACX,WAAAC,IAAY;AAAA,IACZ,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBT,KAAQO,KAAiB,MAEzCG,IAAc;AAAA,MAClB,IAAIzB;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,IAAA,GAGAsB,IAAe;AAAA,MACnB,SAASrB;AAAA,MACT,SAASC;AAAA,MACT,WAAWC;AAAA,MACX,QAAQC;AAAA,MACR,MAAMC;AAAA,MACN,SAASC;AAAA,MACT,SAASC;AAAA,MACT,OAAOC;AAAA,IAAA,GAGHe,IAAkB;AAAA,MACtB9B;AAAA,MACA;AAAA,MACAqB,KAAYpB;AAAA,MACZmB,KAASlB;AAAA,MACTyB,KAAiBC,EAAYD,CAAa;AAAA,MAC1CR,KAASU,EAAaV,CAAK;AAAA,MAC3BG;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,6BAAQ,YAAA,EAAS,KAAAE,GAAU,WAAWM,GAAkB,GAAGP,GAAO;AAAA,EACpE;AACF;AAEAP,EAAS,cAAc;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as r, jsxs as p } from "react/jsx-runtime";
|
|
2
2
|
import { useState as b, useEffect as f, useId as $ } from "react";
|
|
3
|
-
import { useConfig as S } from "
|
|
3
|
+
import { useConfig as S } from "../providers/ConfigProvider.js";
|
|
4
4
|
import { useTheme as v } from "../hooks/useTheme.js";
|
|
5
5
|
const C = "swap", D = "swap-rotate", M = "swap-off", Z = "swap-on", N = "dropdown", B = "dropdown-end", y = "dropdown-content", A = "btn", E = "btn-sm", I = "btn-block", O = "btn-ghost", z = "toggle", j = "toggle-xs", F = "toggle-sm", H = "toggle-md", L = "toggle-lg", V = "toggle-xl";
|
|
6
6
|
function i() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeController.js","sources":["../../src/components/ThemeController.tsx"],"sourcesContent":["import React, { useState, useEffect, useId } from 'react'\nimport { useConfig } from './ConfigProvider'\nimport { useTheme } from '../hooks/useTheme'\n\n// DaisyUI classes\nconst dSwap = 'swap'\nconst dSwapRotate = 'swap-rotate'\nconst dSwapOff = 'swap-off'\nconst dSwapOn = 'swap-on'\nconst dDropdown = 'dropdown'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownContent = 'dropdown-content'\nconst dBtn = 'btn'\nconst dBtnSm = 'btn-sm'\nconst dBtnBlock = 'btn-block'\nconst dBtnGhost = 'btn-ghost'\nconst dToggle = 'toggle'\nconst dToggleXs = 'toggle-xs'\nconst dToggleSm = 'toggle-sm'\nconst dToggleMd = 'toggle-md'\nconst dToggleLg = 'toggle-lg'\nconst dToggleXl = 'toggle-xl'\n\nexport interface ThemeControllerSwapProps {\n lightTheme?: string\n darkTheme?: string\n onChange?: (theme: string) => void\n className?: string\n}\n\nexport interface ThemeControllerDropdownProps {\n themes: string[]\n defaultTheme?: string\n onChange?: (theme: string) => void\n className?: string\n}\n\nexport interface ThemeControllerToggleProps {\n lightTheme?: string\n darkTheme?: string\n onChange?: (theme: string) => void\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n className?: string\n}\n\n// Get current theme from document\nfunction getCurrentTheme(): string | null {\n return document.documentElement.getAttribute('data-theme')\n}\n\n// Set theme directly on document (fallback when no ThemeProvider)\nfunction setThemeDirectly(theme: string) {\n document.documentElement.setAttribute('data-theme', theme)\n}\n\nfunction ThemeControllerSwap({\n lightTheme = 'light',\n darkTheme = 'dark',\n onChange,\n className = '',\n}: ThemeControllerSwapProps) {\n const { setTheme: contextSetTheme, isDark: contextIsDark } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n\n const [isDark, setIsDark] = useState(() => {\n if (contextIsDark !== undefined) return contextIsDark\n const current = getCurrentTheme()\n return current === darkTheme\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (contextIsDark !== undefined) {\n setIsDark(contextIsDark)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n setIsDark(current === darkTheme)\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [darkTheme, contextIsDark])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const theme = checked ? darkTheme : lightTheme\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <label className={`${dSwap} ${dSwapRotate} ${className}`}>\n <input\n type=\"checkbox\"\n checked={isDark}\n onChange={handleChange}\n />\n {/* sun icon */}\n <svg\n className={`${dSwapOff} h-8 w-8 fill-current`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z\" />\n </svg>\n {/* moon icon */}\n <svg\n className={`${dSwapOn} h-8 w-8 fill-current`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z\" />\n </svg>\n </label>\n )\n}\n\nfunction ThemeControllerDropdown({\n themes,\n defaultTheme,\n onChange,\n className = '',\n}: ThemeControllerDropdownProps) {\n const { setTheme: contextSetTheme, resolvedTheme } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n const radioName = useId()\n\n const [selectedTheme, setSelectedTheme] = useState(() => {\n if (resolvedTheme && themes.includes(resolvedTheme)) return resolvedTheme\n const current = getCurrentTheme()\n if (current && themes.includes(current)) return current\n return defaultTheme || themes[0] || 'light'\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (resolvedTheme && themes.includes(resolvedTheme)) {\n setSelectedTheme(resolvedTheme)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n if (current && themes.includes(current)) {\n setSelectedTheme(current)\n }\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [themes, resolvedTheme])\n\n const handleChange = (theme: string) => {\n setSelectedTheme(theme)\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <div className={`${dDropdown} ${dDropdownEnd} ${className}`}>\n <div tabIndex={0} role=\"button\" className={dBtn}>\n Theme\n <svg\n width=\"12px\"\n height=\"12px\"\n className=\"inline-block h-2 w-2 fill-current opacity-60\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 2048 2048\"\n >\n <path d=\"M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z\"></path>\n </svg>\n </div>\n <ul\n tabIndex={0}\n className={`${dDropdownContent} bg-base-300 rounded-box z-[1] w-52 p-2 shadow-2xl max-h-96 overflow-y-auto`}\n >\n {themes.map((theme) => (\n <li key={theme}>\n <input\n type=\"radio\"\n name={radioName}\n className={`${dBtn} ${dBtnSm} ${dBtnBlock} ${dBtnGhost} justify-start`}\n aria-label={theme}\n value={theme}\n checked={selectedTheme === theme}\n onChange={() => handleChange(theme)}\n />\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nconst sizeClasses: Record<string, string> = {\n xs: dToggleXs,\n sm: dToggleSm,\n md: dToggleMd,\n lg: dToggleLg,\n xl: dToggleXl,\n}\n\nfunction ThemeControllerToggle({\n lightTheme = 'light',\n darkTheme = 'dark',\n onChange,\n size,\n className = '',\n}: ThemeControllerToggleProps) {\n const { componentSize } = useConfig()\n const { setTheme: contextSetTheme, isDark: contextIsDark } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const [isDark, setIsDark] = useState(() => {\n if (contextIsDark !== undefined) return contextIsDark\n const current = getCurrentTheme()\n return current === darkTheme\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (contextIsDark !== undefined) {\n setIsDark(contextIsDark)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n setIsDark(current === darkTheme)\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [darkTheme, contextIsDark])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const theme = checked ? darkTheme : lightTheme\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <input\n type=\"checkbox\"\n className={`${dToggle} ${sizeClasses[effectiveSize]} ${className}`}\n checked={isDark}\n onChange={handleChange}\n aria-label=\"Toggle theme\"\n />\n )\n}\n\nexport const ThemeController = Object.assign(\n {},\n {\n Swap: ThemeControllerSwap,\n Dropdown: ThemeControllerDropdown,\n Toggle: ThemeControllerToggle,\n }\n)\n"],"names":["dSwap","dSwapRotate","dSwapOff","dSwapOn","dDropdown","dDropdownEnd","dDropdownContent","dBtn","dBtnSm","dBtnBlock","dBtnGhost","dToggle","dToggleXs","dToggleSm","dToggleMd","dToggleLg","dToggleXl","getCurrentTheme","setThemeDirectly","theme","ThemeControllerSwap","lightTheme","darkTheme","onChange","className","contextSetTheme","contextIsDark","useTheme","setTheme","isDark","setIsDark","useState","useEffect","observer","current","handleChange","e","jsxs","jsx","ThemeControllerDropdown","themes","defaultTheme","resolvedTheme","radioName","useId","selectedTheme","setSelectedTheme","sizeClasses","ThemeControllerToggle","size","componentSize","useConfig","effectiveSize","ThemeController"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThemeController.js","sources":["../../src/components/ThemeController.tsx"],"sourcesContent":["import React, { useState, useEffect, useId } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\nimport { useTheme } from '../hooks/useTheme'\n\n// DaisyUI classes\nconst dSwap = 'swap'\nconst dSwapRotate = 'swap-rotate'\nconst dSwapOff = 'swap-off'\nconst dSwapOn = 'swap-on'\nconst dDropdown = 'dropdown'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownContent = 'dropdown-content'\nconst dBtn = 'btn'\nconst dBtnSm = 'btn-sm'\nconst dBtnBlock = 'btn-block'\nconst dBtnGhost = 'btn-ghost'\nconst dToggle = 'toggle'\nconst dToggleXs = 'toggle-xs'\nconst dToggleSm = 'toggle-sm'\nconst dToggleMd = 'toggle-md'\nconst dToggleLg = 'toggle-lg'\nconst dToggleXl = 'toggle-xl'\n\nexport interface ThemeControllerSwapProps {\n lightTheme?: string\n darkTheme?: string\n onChange?: (theme: string) => void\n className?: string\n}\n\nexport interface ThemeControllerDropdownProps {\n themes: string[]\n defaultTheme?: string\n onChange?: (theme: string) => void\n className?: string\n}\n\nexport interface ThemeControllerToggleProps {\n lightTheme?: string\n darkTheme?: string\n onChange?: (theme: string) => void\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n className?: string\n}\n\n// Get current theme from document\nfunction getCurrentTheme(): string | null {\n return document.documentElement.getAttribute('data-theme')\n}\n\n// Set theme directly on document (fallback when no ThemeProvider)\nfunction setThemeDirectly(theme: string) {\n document.documentElement.setAttribute('data-theme', theme)\n}\n\nfunction ThemeControllerSwap({\n lightTheme = 'light',\n darkTheme = 'dark',\n onChange,\n className = '',\n}: ThemeControllerSwapProps) {\n const { setTheme: contextSetTheme, isDark: contextIsDark } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n\n const [isDark, setIsDark] = useState(() => {\n if (contextIsDark !== undefined) return contextIsDark\n const current = getCurrentTheme()\n return current === darkTheme\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (contextIsDark !== undefined) {\n setIsDark(contextIsDark)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n setIsDark(current === darkTheme)\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [darkTheme, contextIsDark])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const theme = checked ? darkTheme : lightTheme\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <label className={`${dSwap} ${dSwapRotate} ${className}`}>\n <input\n type=\"checkbox\"\n checked={isDark}\n onChange={handleChange}\n />\n {/* sun icon */}\n <svg\n className={`${dSwapOff} h-8 w-8 fill-current`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z\" />\n </svg>\n {/* moon icon */}\n <svg\n className={`${dSwapOn} h-8 w-8 fill-current`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z\" />\n </svg>\n </label>\n )\n}\n\nfunction ThemeControllerDropdown({\n themes,\n defaultTheme,\n onChange,\n className = '',\n}: ThemeControllerDropdownProps) {\n const { setTheme: contextSetTheme, resolvedTheme } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n const radioName = useId()\n\n const [selectedTheme, setSelectedTheme] = useState(() => {\n if (resolvedTheme && themes.includes(resolvedTheme)) return resolvedTheme\n const current = getCurrentTheme()\n if (current && themes.includes(current)) return current\n return defaultTheme || themes[0] || 'light'\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (resolvedTheme && themes.includes(resolvedTheme)) {\n setSelectedTheme(resolvedTheme)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n if (current && themes.includes(current)) {\n setSelectedTheme(current)\n }\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [themes, resolvedTheme])\n\n const handleChange = (theme: string) => {\n setSelectedTheme(theme)\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <div className={`${dDropdown} ${dDropdownEnd} ${className}`}>\n <div tabIndex={0} role=\"button\" className={dBtn}>\n Theme\n <svg\n width=\"12px\"\n height=\"12px\"\n className=\"inline-block h-2 w-2 fill-current opacity-60\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 2048 2048\"\n >\n <path d=\"M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z\"></path>\n </svg>\n </div>\n <ul\n tabIndex={0}\n className={`${dDropdownContent} bg-base-300 rounded-box z-[1] w-52 p-2 shadow-2xl max-h-96 overflow-y-auto`}\n >\n {themes.map((theme) => (\n <li key={theme}>\n <input\n type=\"radio\"\n name={radioName}\n className={`${dBtn} ${dBtnSm} ${dBtnBlock} ${dBtnGhost} justify-start`}\n aria-label={theme}\n value={theme}\n checked={selectedTheme === theme}\n onChange={() => handleChange(theme)}\n />\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nconst sizeClasses: Record<string, string> = {\n xs: dToggleXs,\n sm: dToggleSm,\n md: dToggleMd,\n lg: dToggleLg,\n xl: dToggleXl,\n}\n\nfunction ThemeControllerToggle({\n lightTheme = 'light',\n darkTheme = 'dark',\n onChange,\n size,\n className = '',\n}: ThemeControllerToggleProps) {\n const { componentSize } = useConfig()\n const { setTheme: contextSetTheme, isDark: contextIsDark } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const [isDark, setIsDark] = useState(() => {\n if (contextIsDark !== undefined) return contextIsDark\n const current = getCurrentTheme()\n return current === darkTheme\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (contextIsDark !== undefined) {\n setIsDark(contextIsDark)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n setIsDark(current === darkTheme)\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [darkTheme, contextIsDark])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const theme = checked ? darkTheme : lightTheme\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <input\n type=\"checkbox\"\n className={`${dToggle} ${sizeClasses[effectiveSize]} ${className}`}\n checked={isDark}\n onChange={handleChange}\n aria-label=\"Toggle theme\"\n />\n )\n}\n\nexport const ThemeController = Object.assign(\n {},\n {\n Swap: ThemeControllerSwap,\n Dropdown: ThemeControllerDropdown,\n Toggle: ThemeControllerToggle,\n }\n)\n"],"names":["dSwap","dSwapRotate","dSwapOff","dSwapOn","dDropdown","dDropdownEnd","dDropdownContent","dBtn","dBtnSm","dBtnBlock","dBtnGhost","dToggle","dToggleXs","dToggleSm","dToggleMd","dToggleLg","dToggleXl","getCurrentTheme","setThemeDirectly","theme","ThemeControllerSwap","lightTheme","darkTheme","onChange","className","contextSetTheme","contextIsDark","useTheme","setTheme","isDark","setIsDark","useState","useEffect","observer","current","handleChange","e","jsxs","jsx","ThemeControllerDropdown","themes","defaultTheme","resolvedTheme","radioName","useId","selectedTheme","setSelectedTheme","sizeClasses","ThemeControllerToggle","size","componentSize","useConfig","effectiveSize","ThemeController"],"mappings":";;;;AAKA,MAAMA,IAAQ,QACRC,IAAc,eACdC,IAAW,YACXC,IAAU,WACVC,IAAY,YACZC,IAAe,gBACfC,IAAmB,oBACnBC,IAAO,OACPC,IAAS,UACTC,IAAY,aACZC,IAAY,aACZC,IAAU,UACVC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY;AAyBlB,SAASC,IAAiC;AACxC,SAAO,SAAS,gBAAgB,aAAa,YAAY;AAC3D;AAGA,SAASC,EAAiBC,GAAe;AACvC,WAAS,gBAAgB,aAAa,cAAcA,CAAK;AAC3D;AAEA,SAASC,EAAoB;AAAA,EAC3B,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAA6B;AAC3B,QAAM,EAAE,UAAUC,GAAiB,QAAQC,EAAA,IAAkBC,EAAA,GACvDC,IAAWH,KAAmBP,GAE9B,CAACW,GAAQC,CAAS,IAAIC,EAAS,MAC/BL,MAAkB,SAAkBA,IACxBT,EAAA,MACGK,CACpB;AAGD,EAAAU,EAAU,MAAM;AACd,QAAIN,MAAkB,QAAW;AAC/B,MAAAI,EAAUJ,CAAa;AACvB;AAAA,IACF;AACA,UAAMO,IAAW,IAAI,iBAAiB,MAAM;AAC1C,YAAMC,IAAUjB,EAAA;AAChB,MAAAa,EAAUI,MAAYZ,CAAS;AAAA,IACjC,CAAC;AACD,WAAAW,EAAS,QAAQ,SAAS,iBAAiB,EAAE,YAAY,IAAM,iBAAiB,CAAC,YAAY,GAAG,GACzF,MAAMA,EAAS,WAAA;AAAA,EACxB,GAAG,CAACX,GAAWI,CAAa,CAAC;AAE7B,QAAMS,IAAe,CAACC,MAA2C;AAE/D,UAAMjB,IADUiB,EAAE,OAAO,UACDd,IAAYD;AACpC,IAAAO,EAAST,CAAK,GACdI,IAAWJ,CAAK;AAAA,EAClB;AAEA,SACE,gBAAAkB,EAAC,WAAM,WAAW,GAAGrC,CAAK,IAAIC,CAAW,IAAIuB,CAAS,IACpD,UAAA;AAAA,IAAA,gBAAAc;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAST;AAAA,QACT,UAAUM;AAAA,MAAA;AAAA,IAAA;AAAA,IAGZ,gBAAAG;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGpC,CAAQ;AAAA,QACtB,OAAM;AAAA,QACN,SAAQ;AAAA,QAER,UAAA,gBAAAoC,EAAC,QAAA,EAAK,GAAE,koBAAA,CAAkoB;AAAA,MAAA;AAAA,IAAA;AAAA,IAG5oB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGnC,CAAO;AAAA,QACrB,OAAM;AAAA,QACN,SAAQ;AAAA,QAER,UAAA,gBAAAmC,EAAC,QAAA,EAAK,GAAE,kSAAA,CAAkS;AAAA,MAAA;AAAA,IAAA;AAAA,EAC5S,GACF;AAEJ;AAEA,SAASC,EAAwB;AAAA,EAC/B,QAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAlB;AAAA,EACA,WAAAC,IAAY;AACd,GAAiC;AAC/B,QAAM,EAAE,UAAUC,GAAiB,eAAAiB,EAAA,IAAkBf,EAAA,GAC/CC,IAAWH,KAAmBP,GAC9ByB,IAAYC,EAAA,GAEZ,CAACC,GAAeC,CAAgB,IAAIf,EAAS,MAAM;AACvD,QAAIW,KAAiBF,EAAO,SAASE,CAAa,EAAG,QAAOA;AAC5D,UAAMR,IAAUjB,EAAA;AAChB,WAAIiB,KAAWM,EAAO,SAASN,CAAO,IAAUA,IACzCO,KAAgBD,EAAO,CAAC,KAAK;AAAA,EACtC,CAAC;AAGD,EAAAR,EAAU,MAAM;AACd,QAAIU,KAAiBF,EAAO,SAASE,CAAa,GAAG;AACnD,MAAAI,EAAiBJ,CAAa;AAC9B;AAAA,IACF;AACA,UAAMT,IAAW,IAAI,iBAAiB,MAAM;AAC1C,YAAMC,IAAUjB,EAAA;AAChB,MAAIiB,KAAWM,EAAO,SAASN,CAAO,KACpCY,EAAiBZ,CAAO;AAAA,IAE5B,CAAC;AACD,WAAAD,EAAS,QAAQ,SAAS,iBAAiB,EAAE,YAAY,IAAM,iBAAiB,CAAC,YAAY,GAAG,GACzF,MAAMA,EAAS,WAAA;AAAA,EACxB,GAAG,CAACO,GAAQE,CAAa,CAAC;AAE1B,QAAMP,IAAe,CAAChB,MAAkB;AACtC,IAAA2B,EAAiB3B,CAAK,GACtBS,EAAST,CAAK,GACdI,IAAWJ,CAAK;AAAA,EAClB;AAEA,SACE,gBAAAkB,EAAC,SAAI,WAAW,GAAGjC,CAAS,IAAIC,CAAY,IAAImB,CAAS,IACvD,UAAA;AAAA,IAAA,gBAAAa,EAAC,SAAI,UAAU,GAAG,MAAK,UAAS,WAAW9B,GAAM,UAAA;AAAA,MAAA;AAAA,MAE/C,gBAAA+B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UACN,SAAQ;AAAA,UAER,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,6DAAA,CAA6D;AAAA,QAAA;AAAA,MAAA;AAAA,IACvE,GACF;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,WAAW,GAAGhC,CAAgB;AAAA,QAE7B,UAAAkC,EAAO,IAAI,CAACrB,wBACV,MAAA,EACC,UAAA,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAMK;AAAA,YACN,WAAW,GAAGpC,CAAI,IAAIC,CAAM,IAAIC,CAAS,IAAIC,CAAS;AAAA,YACtD,cAAYS;AAAA,YACZ,OAAOA;AAAA,YACP,SAAS0B,MAAkB1B;AAAA,YAC3B,UAAU,MAAMgB,EAAahB,CAAK;AAAA,UAAA;AAAA,QAAA,EACpC,GATOA,CAUT,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;AAEA,MAAM4B,IAAsC;AAAA,EAC1C,IAAInC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AACN;AAEA,SAASgC,EAAsB;AAAA,EAC7B,YAAA3B,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,MAAA0B;AAAA,EACA,WAAAzB,IAAY;AACd,GAA+B;AAC7B,QAAM,EAAE,eAAA0B,EAAA,IAAkBC,EAAA,GACpB,EAAE,UAAU1B,GAAiB,QAAQC,EAAA,IAAkBC,EAAA,GACvDC,IAAWH,KAAmBP,GAC9BkC,IAAgBH,KAAQC,KAAiB,MAEzC,CAACrB,GAAQC,CAAS,IAAIC,EAAS,MAC/BL,MAAkB,SAAkBA,IACxBT,EAAA,MACGK,CACpB;AAGD,EAAAU,EAAU,MAAM;AACd,QAAIN,MAAkB,QAAW;AAC/B,MAAAI,EAAUJ,CAAa;AACvB;AAAA,IACF;AACA,UAAMO,IAAW,IAAI,iBAAiB,MAAM;AAC1C,YAAMC,IAAUjB,EAAA;AAChB,MAAAa,EAAUI,MAAYZ,CAAS;AAAA,IACjC,CAAC;AACD,WAAAW,EAAS,QAAQ,SAAS,iBAAiB,EAAE,YAAY,IAAM,iBAAiB,CAAC,YAAY,GAAG,GACzF,MAAMA,EAAS,WAAA;AAAA,EACxB,GAAG,CAACX,GAAWI,CAAa,CAAC;AAE7B,QAAMS,IAAe,CAACC,MAA2C;AAE/D,UAAMjB,IADUiB,EAAE,OAAO,UACDd,IAAYD;AACpC,IAAAO,EAAST,CAAK,GACdI,IAAWJ,CAAK;AAAA,EAClB;AAEA,SACE,gBAAAmB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,GAAG3B,CAAO,IAAIoC,EAAYK,CAAa,CAAC,IAAI5B,CAAS;AAAA,MAChE,SAASK;AAAA,MACT,UAAUM;AAAA,MACV,cAAW;AAAA,IAAA;AAAA,EAAA;AAGjB;AAEO,MAAMkB,IAAkB,OAAO;AAAA,EACpC,CAAA;AAAA,EACA;AAAA,IACE,MAAMjC;AAAA,IACN,UAAUmB;AAAA,IACV,QAAQS;AAAA,EAAA;AAEZ;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs as m, jsx as a } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as $e, useState as $, useRef as ne, useId as xe, useEffect as Y, useCallback as oe } from "react";
|
|
3
3
|
import { Input as Me } from "./Input.js";
|
|
4
|
-
import { useConfig as we } from "
|
|
4
|
+
import { useConfig as we } from "../providers/ConfigProvider.js";
|
|
5
5
|
const S = "btn", D = "btn-ghost", J = "btn-primary", ke = "btn-xs", E = "btn-sm", ye = "btn-circle", ve = "input-error", Ce = "input-warning";
|
|
6
6
|
function Ne(s, T = "24", x = !1) {
|
|
7
7
|
if (!s) return "";
|