@multicomma/arkcn 0.1.0 → 0.1.2
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/README.md +7 -0
- package/cli/commands.mjs +12 -5
- package/cli/project.mjs +62 -16
- package/cli/registry.mjs +1 -0
- package/package.json +42 -32
- package/registry/index.json +1578 -156
- package/registry/items/accordion.json +11 -1
- package/registry/items/activity-feed.json +18 -2
- package/registry/items/alert-dialog.json +18 -1
- package/registry/items/alert.json +7 -1
- package/registry/items/angle-slider.json +13 -1
- package/registry/items/app-shell.json +58 -2
- package/registry/items/aspect-ratio.json +3 -0
- package/registry/items/attachment.json +12 -1
- package/registry/items/avatar.json +11 -1
- package/registry/items/badge.json +5 -1
- package/registry/items/breadcrumb.json +10 -1
- package/registry/items/bubble.json +7 -1
- package/registry/items/button-group.json +8 -2
- package/registry/items/button.json +5 -1
- package/registry/items/calendar.json +5 -1
- package/registry/items/canvas.json +20 -3
- package/registry/items/card.json +10 -1
- package/registry/items/carousel.json +9 -1
- package/registry/items/cascader.json +24 -3
- package/registry/items/chart.json +9 -1
- package/registry/items/chat.json +44 -3
- package/registry/items/checkbox.json +13 -1
- package/registry/items/clipboard.json +12 -1
- package/registry/items/collapsible.json +8 -0
- package/registry/items/color-picker.json +34 -1
- package/registry/items/combobox.json +31 -1
- package/registry/items/command.json +20 -1
- package/registry/items/comment-thread.json +36 -4
- package/registry/items/context-menu.json +28 -1
- package/registry/items/data-grid.json +21 -4
- package/registry/items/data-table.json +35 -3
- package/registry/items/date-input.json +12 -1
- package/registry/items/dialog.json +16 -1
- package/registry/items/direction.json +4 -0
- package/registry/items/drawer.json +21 -1
- package/registry/items/dropdown-menu.json +27 -1
- package/registry/items/editable.json +14 -1
- package/registry/items/empty.json +9 -1
- package/registry/items/field.json +14 -2
- package/registry/items/file-upload.json +18 -1
- package/registry/items/floating-panel.json +18 -1
- package/registry/items/floating-toolbar.json +4 -1
- package/registry/items/format.json +7 -0
- package/registry/items/gantt.json +28 -3
- package/registry/items/{use-mobile.json → hooks/use-mobile.json} +4 -1
- package/registry/items/hotkeys.json +11 -1
- package/registry/items/hover-card.json +11 -1
- package/registry/items/image-cropper.json +11 -1
- package/registry/items/input-group.json +10 -2
- package/registry/items/input-otp.json +7 -1
- package/registry/items/input.json +4 -1
- package/registry/items/item.json +14 -2
- package/registry/items/json-tree-view.json +6 -1
- package/registry/items/kanban.json +29 -3
- package/registry/items/kbd.json +5 -1
- package/registry/items/label.json +4 -1
- package/registry/items/{controllable.json → lib/controllable.json} +4 -1
- package/registry/items/{data-table-adapter.json → lib/data-table-adapter.json} +2 -1
- package/registry/items/{drag-preview.json → lib/drag-preview.json} +4 -1
- package/registry/items/{form.json → lib/form.json} +4 -1
- package/registry/items/{history.json → lib/history.json} +4 -1
- package/registry/items/{row-layout.json → lib/row-layout.json} +6 -1
- package/registry/items/lib/table.json +19 -0
- package/registry/items/{time.json → lib/time.json} +5 -1
- package/registry/items/{utils.json → lib/utils.json} +4 -1
- package/registry/items/live-region.json +5 -1
- package/registry/items/marker.json +7 -1
- package/registry/items/marquee.json +10 -1
- package/registry/items/menubar.json +26 -2
- package/registry/items/message.json +9 -1
- package/registry/items/navigation-menu.json +17 -1
- package/registry/items/node-graph.json +33 -2
- package/registry/items/number-input.json +14 -1
- package/registry/items/pagination.json +10 -1
- package/registry/items/password-input.json +11 -1
- package/registry/items/popconfirm.json +14 -2
- package/registry/items/popover.json +17 -1
- package/registry/items/progress.json +15 -1
- package/registry/items/qr-code.json +10 -1
- package/registry/items/query-builder.json +32 -3
- package/registry/items/radio-group.json +13 -1
- package/registry/items/rating-group.json +11 -1
- package/registry/items/resizable.json +6 -1
- package/registry/items/rich-text-editor.json +19 -2
- package/registry/items/scheduler.json +35 -3
- package/registry/items/scroll-area.json +11 -1
- package/registry/items/segment-group.json +13 -1
- package/registry/items/select.json +26 -1
- package/registry/items/separator.json +4 -1
- package/registry/items/sheet.json +16 -1
- package/registry/items/sidebar.json +29 -3
- package/registry/items/signature-pad.json +12 -1
- package/registry/items/skeleton.json +4 -1
- package/registry/items/slider.json +17 -1
- package/registry/items/sonner.json +3 -0
- package/registry/items/spinner.json +4 -1
- package/registry/items/steps.json +17 -1
- package/registry/items/swap.json +6 -1
- package/registry/items/switch.json +11 -1
- package/registry/items/table.json +15 -5
- package/registry/items/tabs.json +11 -1
- package/registry/items/tags-input.json +17 -1
- package/registry/items/textarea.json +4 -1
- package/registry/items/timer.json +11 -1
- package/registry/items/toc.json +13 -1
- package/registry/items/toggle-group.json +8 -2
- package/registry/items/toggle.json +8 -1
- package/registry/items/tooltip.json +12 -1
- package/registry/items/tour.json +20 -1
- package/registry/items/transfer-list.json +21 -3
- package/registry/items/tree-select.json +22 -3
- package/registry/items/tree-view.json +24 -1
- package/registry/items/virtual-list.json +10 -1
|
@@ -2,13 +2,29 @@
|
|
|
2
2
|
"name": "steps",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "Steps",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Steps",
|
|
8
|
+
"StepsCompletedContent",
|
|
9
|
+
"StepsContent",
|
|
10
|
+
"StepsContext",
|
|
11
|
+
"StepsIndicator",
|
|
12
|
+
"StepsItem",
|
|
13
|
+
"StepsItemContext",
|
|
14
|
+
"StepsList",
|
|
15
|
+
"StepsNextTrigger",
|
|
16
|
+
"StepsPrevTrigger",
|
|
17
|
+
"StepsProgress",
|
|
18
|
+
"StepsSeparator",
|
|
19
|
+
"StepsTrigger"
|
|
20
|
+
],
|
|
5
21
|
"dependencies": {
|
|
6
22
|
"@ark-ui/react": "^5.39.1",
|
|
7
23
|
"lucide-react": "^1.41.0"
|
|
8
24
|
},
|
|
9
25
|
"registryDependencies": [
|
|
10
26
|
"button",
|
|
11
|
-
"utils"
|
|
27
|
+
"lib/utils"
|
|
12
28
|
],
|
|
13
29
|
"files": [
|
|
14
30
|
{
|
package/registry/items/swap.json
CHANGED
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
"name": "swap",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "Swap",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Swap",
|
|
8
|
+
"SwapIndicator"
|
|
9
|
+
],
|
|
5
10
|
"dependencies": {
|
|
6
11
|
"@ark-ui/react": "^5.39.1"
|
|
7
12
|
},
|
|
8
13
|
"registryDependencies": [
|
|
9
|
-
"utils"
|
|
14
|
+
"lib/utils"
|
|
10
15
|
],
|
|
11
16
|
"files": [
|
|
12
17
|
{
|
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
"name": "switch",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "`id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working.",
|
|
5
|
+
"ark": "Switch",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Switch",
|
|
8
|
+
"SwitchContext",
|
|
9
|
+
"SwitchControl",
|
|
10
|
+
"SwitchHiddenInput",
|
|
11
|
+
"SwitchLabel",
|
|
12
|
+
"SwitchRoot",
|
|
13
|
+
"SwitchThumb"
|
|
14
|
+
],
|
|
5
15
|
"dependencies": {
|
|
6
16
|
"@ark-ui/react": "^5.39.1"
|
|
7
17
|
},
|
|
8
18
|
"registryDependencies": [
|
|
9
|
-
"utils"
|
|
19
|
+
"lib/utils"
|
|
10
20
|
],
|
|
11
21
|
"files": [
|
|
12
22
|
{
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "table",
|
|
3
|
-
"type": "
|
|
4
|
-
"description": "
|
|
3
|
+
"type": "ui",
|
|
4
|
+
"description": "`src/lib/table.ts` is a dependency-free headless table engine (columns, sorting, global + column filters with faceted counts, pagination, row selection, visibility).",
|
|
5
|
+
"exports": [
|
|
6
|
+
"Table",
|
|
7
|
+
"TableHeader",
|
|
8
|
+
"TableBody",
|
|
9
|
+
"TableFooter",
|
|
10
|
+
"TableHead",
|
|
11
|
+
"TableRow",
|
|
12
|
+
"TableCell",
|
|
13
|
+
"TableCaption"
|
|
14
|
+
],
|
|
5
15
|
"dependencies": {},
|
|
6
16
|
"registryDependencies": [
|
|
7
|
-
"
|
|
17
|
+
"lib/utils"
|
|
8
18
|
],
|
|
9
19
|
"files": [
|
|
10
20
|
{
|
|
11
|
-
"path": "
|
|
12
|
-
"content": "import * as React from \"react\"\nimport { useControllable } from \"@/lib/controllable\"\n\n/**\n * A small headless table engine: column definitions, sorting, global and\n * per-column filtering with faceted counts, pagination, row selection, and\n * column visibility. No external dependencies.\n */\n\n/* ------------------------------- Definitions ------------------------------- */\n\nexport type SortingState = { id: string; desc: boolean }[]\nexport type ColumnFiltersState = { id: string; value: unknown }[]\nexport type PaginationState = { pageIndex: number; pageSize: number }\nexport type RowSelectionState = Record<string, boolean>\nexport type VisibilityState = Record<string, boolean>\n\nexport type TableState = {\n sorting: SortingState\n columnFilters: ColumnFiltersState\n globalFilter: string\n pagination: PaginationState\n rowSelection: RowSelectionState\n columnVisibility: VisibilityState\n}\n\nexport type Updater<T> = T | ((previous: T) => T)\nexport type OnChange<T> = (updater: Updater<T>) => void\n\nexport type FilterFn<TData> = (row: Row<TData>, columnId: string, filterValue: unknown) => boolean\n\nexport type SortingFn<TData> = (a: Row<TData>, b: Row<TData>, columnId: string) => number\n\nexport type ColumnDef<TData, TValue = unknown> = {\n /** Required when no `accessorKey` is given. */\n id?: string\n /** Read the value from this property of the row. */\n accessorKey?: keyof TData & string\n /** Compute the value from the row. */\n accessorFn?: (row: TData, index: number) => TValue\n /** Human label (view options, headers); falls back to the column id. */\n label?: string\n enableSorting?: boolean\n enableHiding?: boolean\n enableGlobalFilter?: boolean\n filterFn?: FilterFn<TData>\n sortingFn?: SortingFn<TData>\n}\n\n/* ---------------------------------- Runtime -------------------------------- */\n\nexport interface Column<TData, TValue = unknown> {\n id: string\n label?: string\n columnDef: ColumnDef<TData, TValue>\n accessorFn?: (row: TData, index: number) => TValue\n getCanSort: () => boolean\n getIsSorted: () => false | \"asc\" | \"desc\"\n toggleSorting: (desc?: boolean) => void\n clearSorting: () => void\n getCanHide: () => boolean\n getIsVisible: () => boolean\n toggleVisibility: (visible?: boolean) => void\n getCanFilter: () => boolean\n getFilterValue: () => unknown\n setFilterValue: (value: unknown) => void\n getFacetedUniqueValues: () => Map<unknown, number>\n}\n\nexport interface Row<TData> {\n id: string\n index: number\n original: TData\n getValue: <TValue = unknown>(columnId: string) => TValue\n getIsSelected: () => boolean\n getCanSelect: () => boolean\n toggleSelected: (selected?: boolean) => void\n}\n\nexport interface RowModel<TData> {\n rows: Row<TData>[]\n}\n\nexport interface Table<TData> {\n options: TableOptions<TData>\n getState: () => TableState\n getAllColumns: () => Column<TData>[]\n getVisibleColumns: () => Column<TData>[]\n getColumn: (id: string) => Column<TData> | undefined\n /** All rows before filtering. */\n getCoreRowModel: () => RowModel<TData>\n /** Rows after global and column filters. */\n getFilteredRowModel: () => RowModel<TData>\n /** Filtered and sorted rows. */\n getSortedRowModel: () => RowModel<TData>\n /** The current page of sorted, filtered rows. */\n getRowModel: () => RowModel<TData>\n getFilteredSelectedRowModel: () => RowModel<TData>\n getSelectedRowModel: () => RowModel<TData>\n // sorting\n setSorting: OnChange<SortingState>\n resetSorting: () => void\n // filtering\n setGlobalFilter: (value: string) => void\n setColumnFilters: OnChange<ColumnFiltersState>\n resetColumnFilters: () => void\n // pagination\n setPagination: OnChange<PaginationState>\n setPageIndex: (index: number) => void\n setPageSize: (size: number) => void\n getPageCount: () => number\n getCanPreviousPage: () => boolean\n getCanNextPage: () => boolean\n previousPage: () => void\n nextPage: () => void\n // selection\n setRowSelection: OnChange<RowSelectionState>\n resetRowSelection: () => void\n getIsAllPageRowsSelected: () => boolean\n getIsSomePageRowsSelected: () => boolean\n toggleAllPageRowsSelected: (selected?: boolean) => void\n getIsAllRowsSelected: () => boolean\n toggleAllRowsSelected: (selected?: boolean) => void\n // visibility\n setColumnVisibility: OnChange<VisibilityState>\n resetColumnVisibility: () => void\n}\n\nexport type TableOptions<TData> = {\n data: TData[]\n columns: ColumnDef<TData, any>[] // eslint-disable-line @typescript-eslint/no-explicit-any\n getRowId?: (row: TData, index: number) => string\n enableRowSelection?: boolean | ((row: Row<TData>) => boolean)\n /** Runs against every row when `globalFilter` is set. Defaults to a case-insensitive `includes` over globally filterable columns. */\n globalFilterFn?: FilterFn<TData>\n /** Uncontrolled initial values. */\n initialState?: Partial<TableState>\n /** Controlled values; pair each with its `on*Change` handler. */\n state?: Partial<TableState>\n onSortingChange?: OnChange<SortingState>\n onColumnFiltersChange?: OnChange<ColumnFiltersState>\n onGlobalFilterChange?: OnChange<string>\n onPaginationChange?: OnChange<PaginationState>\n onRowSelectionChange?: OnChange<RowSelectionState>\n onColumnVisibilityChange?: OnChange<VisibilityState>\n /** Keep the page index inside the page count as filters change. Defaults to true. */\n autoResetPageIndex?: boolean\n}\n\n/* ----------------------------------- Helpers -------------------------------- */\n\nfunction defaultCompare(a: unknown, b: unknown) {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n if (typeof a === \"number\" && typeof b === \"number\") return a - b\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime()\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: \"base\" })\n}\n\nfunction defaultColumnFilter<TData>(row: Row<TData>, columnId: string, filterValue: unknown) {\n const value = row.getValue(columnId)\n if (Array.isArray(filterValue)) return filterValue.includes(value)\n if (filterValue == null || filterValue === \"\") return true\n return String(value ?? \"\")\n .toLowerCase()\n .includes(String(filterValue).toLowerCase())\n}\n\n/* ------------------------------------ Hook ---------------------------------- */\n\nexport function useTable<TData>(options: TableOptions<TData>): Table<TData> {\n const {\n data,\n columns: columnDefs,\n getRowId,\n enableRowSelection = true,\n globalFilterFn,\n initialState,\n state: controlled,\n autoResetPageIndex = true,\n } = options\n\n const [sorting, setSorting] = useControllable(\n controlled?.sorting,\n initialState?.sorting ?? [],\n options.onSortingChange\n )\n const [columnFilters, setColumnFilters] = useControllable(\n controlled?.columnFilters,\n initialState?.columnFilters ?? [],\n options.onColumnFiltersChange\n )\n const [globalFilter, setGlobalFilterState] = useControllable(\n controlled?.globalFilter,\n initialState?.globalFilter ?? \"\",\n options.onGlobalFilterChange\n )\n const [pagination, setPagination] = useControllable(\n controlled?.pagination,\n initialState?.pagination ?? { pageIndex: 0, pageSize: 10 },\n options.onPaginationChange\n )\n const [rowSelection, setRowSelection] = useControllable(\n controlled?.rowSelection,\n initialState?.rowSelection ?? {},\n options.onRowSelectionChange\n )\n const [columnVisibility, setColumnVisibility] = useControllable(\n controlled?.columnVisibility,\n initialState?.columnVisibility ?? {},\n options.onColumnVisibilityChange\n )\n\n const state: TableState = React.useMemo(\n () => ({ sorting, columnFilters, globalFilter, pagination, rowSelection, columnVisibility }),\n [sorting, columnFilters, globalFilter, pagination, rowSelection, columnVisibility]\n )\n\n // Keep a mutable reference so column and row methods always see fresh state\n // without rebuilding every object on each render.\n const tableRef = React.useRef<Table<TData>>(null!)\n\n /* Columns */\n const columns = React.useMemo<Column<TData>[]>(() => {\n return columnDefs.map((def) => {\n const id = def.id ?? def.accessorKey\n if (!id) throw new Error(\"Every column needs an `id` or an `accessorKey`.\")\n const accessorFn =\n def.accessorFn ??\n (def.accessorKey ? (row: TData) => (row as Record<string, unknown>)[def.accessorKey as string] : undefined)\n const column: Column<TData> = {\n id,\n columnDef: def,\n\n label: def.label,\n accessorFn: accessorFn as Column<TData>[\"accessorFn\"],\n getCanSort: () => (def.enableSorting ?? true) && !!accessorFn,\n getIsSorted: () => {\n const entry = tableRef.current.getState().sorting.find((s) => s.id === id)\n return entry ? (entry.desc ? \"desc\" : \"asc\") : false\n },\n toggleSorting: (desc) => {\n tableRef.current.setSorting((prev) => {\n const current = prev.find((s) => s.id === id)\n const nextDesc = desc ?? (current ? !current.desc : false)\n return [{ id, desc: nextDesc }]\n })\n },\n clearSorting: () => tableRef.current.setSorting((prev) => prev.filter((s) => s.id !== id)),\n getCanHide: () => def.enableHiding ?? true,\n getIsVisible: () => tableRef.current.getState().columnVisibility[id] !== false,\n toggleVisibility: (visible) => {\n tableRef.current.setColumnVisibility((prev) => ({\n ...prev,\n [id]: visible ?? prev[id] === false,\n }))\n },\n getCanFilter: () => !!accessorFn,\n getFilterValue: () => tableRef.current.getState().columnFilters.find((f) => f.id === id)?.value,\n setFilterValue: (value) => {\n tableRef.current.setColumnFilters((prev) => {\n const rest = prev.filter((f) => f.id !== id)\n const isEmpty =\n value === undefined || value === null || value === \"\" || (Array.isArray(value) && value.length === 0)\n return isEmpty ? rest : [...rest, { id, value }]\n })\n },\n getFacetedUniqueValues: () => facetsRef.current.get(id) ?? new Map(),\n }\n return column\n })\n }, [columnDefs])\n\n const columnById = React.useMemo(() => new Map(columns.map((c) => [c.id, c])), [columns])\n\n /* Rows */\n const coreRows = React.useMemo<Row<TData>[]>(() => {\n return data.map((original, index) => {\n const id = getRowId ? getRowId(original, index) : String(index)\n const valueCache = new Map<string, unknown>()\n const row: Row<TData> = {\n id,\n index,\n original,\n getValue: <TValue>(columnId: string) => {\n if (valueCache.has(columnId)) return valueCache.get(columnId) as TValue\n const column = columnById.get(columnId)\n const value = column?.accessorFn ? column.accessorFn(original, index) : undefined\n valueCache.set(columnId, value)\n return value as TValue\n },\n getIsSelected: () => !!tableRef.current.getState().rowSelection[id],\n getCanSelect: () => (typeof enableRowSelection === \"function\" ? enableRowSelection(row) : enableRowSelection),\n toggleSelected: (selected) => {\n if (!row.getCanSelect()) return\n tableRef.current.setRowSelection((prev) => {\n const next = { ...prev }\n const value = selected ?? !prev[id]\n if (value) next[id] = true\n else delete next[id]\n return next\n })\n },\n }\n return row\n })\n }, [data, getRowId, columnById, enableRowSelection])\n\n /* Filtering */\n const globallyFilteredRows = React.useMemo(() => {\n if (!globalFilter) return coreRows\n const fn: FilterFn<TData> =\n globalFilterFn ??\n ((row, _id, value) => {\n const search = String(value).toLowerCase()\n return columns.some((column) => {\n if (!column.accessorFn || column.columnDef.enableGlobalFilter === false) return false\n return String(row.getValue(column.id) ?? \"\")\n .toLowerCase()\n .includes(search)\n })\n })\n return coreRows.filter((row) => fn(row, \"__global__\", globalFilter))\n }, [coreRows, globalFilter, globalFilterFn, columns])\n\n const filteredRows = React.useMemo(() => {\n let rows = globallyFilteredRows\n for (const filter of columnFilters) {\n const column = columnById.get(filter.id)\n if (!column) continue\n const fn = column.columnDef.filterFn ?? defaultColumnFilter\n rows = rows.filter((row) => fn(row, filter.id, filter.value))\n }\n return rows\n }, [globallyFilteredRows, columnFilters, columnById])\n\n /* Facets: unique value counts per column, over rows filtered by everything except that column. */\n const facetsRef = React.useRef(new Map<string, Map<unknown, number>>())\n facetsRef.current = React.useMemo(() => {\n const result = new Map<string, Map<unknown, number>>()\n for (const column of columns) {\n if (!column.accessorFn) continue\n let rows = globallyFilteredRows\n for (const filter of columnFilters) {\n if (filter.id === column.id) continue\n const other = columnById.get(filter.id)\n if (!other) continue\n const fn = other.columnDef.filterFn ?? defaultColumnFilter\n rows = rows.filter((row) => fn(row, filter.id, filter.value))\n }\n const counts = new Map<unknown, number>()\n for (const row of rows) {\n const value = row.getValue(column.id)\n counts.set(value, (counts.get(value) ?? 0) + 1)\n }\n result.set(column.id, counts)\n }\n return result\n }, [columns, globallyFilteredRows, columnFilters, columnById])\n\n /* Sorting */\n const sortedRows = React.useMemo(() => {\n if (sorting.length === 0) return filteredRows\n const rows = [...filteredRows]\n rows.sort((a, b) => {\n for (const { id, desc } of sorting) {\n const column = columnById.get(id)\n if (!column) continue\n const compare = column.columnDef.sortingFn\n ? column.columnDef.sortingFn(a, b, id)\n : defaultCompare(a.getValue(id), b.getValue(id))\n if (compare !== 0) return desc ? -compare : compare\n }\n return a.index - b.index\n })\n return rows\n }, [filteredRows, sorting, columnById])\n\n /* Pagination */\n const pageCount = Math.max(1, Math.ceil(sortedRows.length / pagination.pageSize))\n const pageRows = React.useMemo(() => {\n const start = pagination.pageIndex * pagination.pageSize\n return sortedRows.slice(start, start + pagination.pageSize)\n }, [sortedRows, pagination])\n\n React.useEffect(() => {\n if (!autoResetPageIndex) return\n if (pagination.pageIndex > pageCount - 1) {\n setPagination((prev) => ({ ...prev, pageIndex: Math.max(0, pageCount - 1) }))\n }\n }, [autoResetPageIndex, pageCount, pagination.pageIndex, setPagination])\n\n /* Table */\n const table = React.useMemo<Table<TData>>(() => {\n const t: Table<TData> = {\n options,\n getState: () => state,\n getAllColumns: () => columns,\n getVisibleColumns: () => columns.filter((c) => c.getIsVisible()),\n getColumn: (id) => columnById.get(id),\n getCoreRowModel: () => ({ rows: coreRows }),\n getFilteredRowModel: () => ({ rows: filteredRows }),\n getSortedRowModel: () => ({ rows: sortedRows }),\n getRowModel: () => ({ rows: pageRows }),\n getFilteredSelectedRowModel: () => ({\n rows: filteredRows.filter((r) => r.getIsSelected()),\n }),\n getSelectedRowModel: () => ({ rows: coreRows.filter((r) => r.getIsSelected()) }),\n setSorting,\n resetSorting: () => setSorting([]),\n setGlobalFilter: (value) => {\n setGlobalFilterState(value)\n if (autoResetPageIndex) setPagination((p) => ({ ...p, pageIndex: 0 }))\n },\n setColumnFilters: (updater) => {\n setColumnFilters(updater)\n if (autoResetPageIndex) setPagination((p) => ({ ...p, pageIndex: 0 }))\n },\n resetColumnFilters: () => setColumnFilters([]),\n setPagination,\n setPageIndex: (index) => setPagination((p) => ({ ...p, pageIndex: Math.min(Math.max(0, index), pageCount - 1) })),\n setPageSize: (size) =>\n setPagination((p) => ({ pageSize: size, pageIndex: Math.floor((p.pageIndex * p.pageSize) / size) })),\n getPageCount: () => pageCount,\n getCanPreviousPage: () => pagination.pageIndex > 0,\n getCanNextPage: () => pagination.pageIndex < pageCount - 1,\n previousPage: () => t.setPageIndex(pagination.pageIndex - 1),\n nextPage: () => t.setPageIndex(pagination.pageIndex + 1),\n setRowSelection,\n resetRowSelection: () => setRowSelection({}),\n getIsAllPageRowsSelected: () =>\n pageRows.length > 0 && pageRows.every((r) => !r.getCanSelect() || r.getIsSelected()),\n getIsSomePageRowsSelected: () => pageRows.some((r) => r.getIsSelected()) && !t.getIsAllPageRowsSelected(),\n toggleAllPageRowsSelected: (selected) => {\n const value = selected ?? !t.getIsAllPageRowsSelected()\n setRowSelection((prev) => {\n const next = { ...prev }\n for (const row of pageRows) {\n if (!row.getCanSelect()) continue\n if (value) next[row.id] = true\n else delete next[row.id]\n }\n return next\n })\n },\n getIsAllRowsSelected: () =>\n filteredRows.length > 0 && filteredRows.every((r) => !r.getCanSelect() || r.getIsSelected()),\n toggleAllRowsSelected: (selected) => {\n const value = selected ?? !t.getIsAllRowsSelected()\n setRowSelection(() => {\n const next: RowSelectionState = {}\n if (value) for (const row of filteredRows) if (row.getCanSelect()) next[row.id] = true\n return next\n })\n },\n setColumnVisibility,\n resetColumnVisibility: () => setColumnVisibility({}),\n }\n return t\n }, [\n options,\n state,\n columns,\n columnById,\n coreRows,\n filteredRows,\n sortedRows,\n pageRows,\n pageCount,\n pagination,\n autoResetPageIndex,\n setSorting,\n setGlobalFilterState,\n setColumnFilters,\n setPagination,\n setRowSelection,\n setColumnVisibility,\n ])\n\n tableRef.current = table\n return table\n}\n"
|
|
21
|
+
"path": "components/ui/table.tsx",
|
|
22
|
+
"content": "import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table data-slot=\"table\" className={cn(\"w-full caption-bottom text-sm\", className)} {...props} />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return <thead data-slot=\"table-header\" className={cn(\"[&_tr]:border-b\", className)} {...props} />\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return <tbody data-slot=\"table-body\" className={cn(\"[&_tr:last-child]:border-0\", className)} {...props} />\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground has-[[role=checkbox]]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\"p-2 align-middle whitespace-nowrap has-[[role=checkbox]]:pr-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<\"caption\">) {\n return (\n <caption data-slot=\"table-caption\" className={cn(\"mt-4 text-sm text-muted-foreground\", className)} {...props} />\n )\n}\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }\n"
|
|
13
23
|
}
|
|
14
24
|
],
|
|
15
25
|
"docs": "## Data table\n`src/lib/table.ts` is a dependency-free headless table engine (columns, sorting, global +\ncolumn filters with faceted counts, pagination, row selection, visibility). Column config is\ndata only: `{ id | accessorKey | accessorFn, label, enableSorting, enableHiding, filterFn,\nsortingFn }`. No render functions and no markup in column definitions.\n`src/components/ui/data-table.tsx` builds compositional parts on the source-agnostic\n`DataTableInstance` contract in `src/lib/data-table-adapter.ts`: toolbar, search, faceted\nfilter, reset, view options, `DataTableTable` > `DataTableHeader` (one `DataTableHead\ncolumn=\"id\"` per column; sortable columns get the sort/hide menu with `children` as the title)\n+ `DataTableBody` (`children` is `(row) => cells`; wrap in `DataTableRow` or return a fragment\nof `DataTableCell column=\"id\"` cells), `DataTableEmpty`, select-all/select-row cells, row\nactions, pagination pieces, bulk actions. Heads and cells keyed by a hidden column render\nnothing, so visibility toggles need no extra wiring. The toolkit must not know about specific\ntable libraries (no TanStack). `src/demo/tasks/` and `src/demo/users/` are the reference\nconsumers: `columns.tsx` is pure config, `*-table.tsx` composes the markup."
|
package/registry/items/tabs.json
CHANGED
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
"name": "tabs",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "Tabs",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Tabs",
|
|
8
|
+
"TabsContent",
|
|
9
|
+
"TabsContext",
|
|
10
|
+
"TabsIndicator",
|
|
11
|
+
"TabsList",
|
|
12
|
+
"TabsTrigger",
|
|
13
|
+
"tabsListVariants"
|
|
14
|
+
],
|
|
5
15
|
"dependencies": {
|
|
6
16
|
"@ark-ui/react": "^5.39.1",
|
|
7
17
|
"class-variance-authority": "^0.7.1"
|
|
8
18
|
},
|
|
9
19
|
"registryDependencies": [
|
|
10
|
-
"utils"
|
|
20
|
+
"lib/utils"
|
|
11
21
|
],
|
|
12
22
|
"files": [
|
|
13
23
|
{
|
|
@@ -2,12 +2,28 @@
|
|
|
2
2
|
"name": "tags-input",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "TagsInput",
|
|
6
|
+
"exports": [
|
|
7
|
+
"TagsInput",
|
|
8
|
+
"TagsInputClearTrigger",
|
|
9
|
+
"TagsInputContext",
|
|
10
|
+
"TagsInputControl",
|
|
11
|
+
"TagsInputHiddenInput",
|
|
12
|
+
"TagsInputInput",
|
|
13
|
+
"TagsInputItem",
|
|
14
|
+
"TagsInputItemContext",
|
|
15
|
+
"TagsInputItemDeleteTrigger",
|
|
16
|
+
"TagsInputItemInput",
|
|
17
|
+
"TagsInputItemPreview",
|
|
18
|
+
"TagsInputItemText",
|
|
19
|
+
"TagsInputLabel"
|
|
20
|
+
],
|
|
5
21
|
"dependencies": {
|
|
6
22
|
"@ark-ui/react": "^5.39.1",
|
|
7
23
|
"lucide-react": "^1.41.0"
|
|
8
24
|
},
|
|
9
25
|
"registryDependencies": [
|
|
10
|
-
"utils"
|
|
26
|
+
"lib/utils"
|
|
11
27
|
],
|
|
12
28
|
"files": [
|
|
13
29
|
{
|
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
"name": "timer",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "Timer",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Timer",
|
|
8
|
+
"TimerActionTrigger",
|
|
9
|
+
"TimerArea",
|
|
10
|
+
"TimerContext",
|
|
11
|
+
"TimerControl",
|
|
12
|
+
"TimerItem",
|
|
13
|
+
"TimerSeparator"
|
|
14
|
+
],
|
|
5
15
|
"dependencies": {
|
|
6
16
|
"@ark-ui/react": "^5.39.1"
|
|
7
17
|
},
|
|
8
18
|
"registryDependencies": [
|
|
9
19
|
"button",
|
|
10
|
-
"utils"
|
|
20
|
+
"lib/utils"
|
|
11
21
|
],
|
|
12
22
|
"files": [
|
|
13
23
|
{
|
package/registry/items/toc.json
CHANGED
|
@@ -2,11 +2,23 @@
|
|
|
2
2
|
"name": "toc",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "Toc",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Toc",
|
|
8
|
+
"TocContent",
|
|
9
|
+
"TocContext",
|
|
10
|
+
"TocIndicator",
|
|
11
|
+
"TocItem",
|
|
12
|
+
"TocLink",
|
|
13
|
+
"TocList",
|
|
14
|
+
"TocNav",
|
|
15
|
+
"TocTitle"
|
|
16
|
+
],
|
|
5
17
|
"dependencies": {
|
|
6
18
|
"@ark-ui/react": "^5.39.1"
|
|
7
19
|
},
|
|
8
20
|
"registryDependencies": [
|
|
9
|
-
"utils"
|
|
21
|
+
"lib/utils"
|
|
10
22
|
],
|
|
11
23
|
"files": [
|
|
12
24
|
{
|
|
@@ -2,13 +2,19 @@
|
|
|
2
2
|
"name": "toggle-group",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "ToggleGroup",
|
|
6
|
+
"exports": [
|
|
7
|
+
"ToggleGroup",
|
|
8
|
+
"ToggleGroupContext",
|
|
9
|
+
"ToggleGroupItem"
|
|
10
|
+
],
|
|
5
11
|
"dependencies": {
|
|
6
12
|
"@ark-ui/react": "^5.39.1",
|
|
7
13
|
"class-variance-authority": "^0.7.1"
|
|
8
14
|
},
|
|
9
15
|
"registryDependencies": [
|
|
10
|
-
"
|
|
11
|
-
"
|
|
16
|
+
"lib/utils",
|
|
17
|
+
"toggle"
|
|
12
18
|
],
|
|
13
19
|
"files": [
|
|
14
20
|
{
|
|
@@ -2,12 +2,19 @@
|
|
|
2
2
|
"name": "toggle",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "Toggle",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Toggle",
|
|
8
|
+
"ToggleContext",
|
|
9
|
+
"ToggleIndicator",
|
|
10
|
+
"toggleVariants"
|
|
11
|
+
],
|
|
5
12
|
"dependencies": {
|
|
6
13
|
"@ark-ui/react": "^5.39.1",
|
|
7
14
|
"class-variance-authority": "^0.7.1"
|
|
8
15
|
},
|
|
9
16
|
"registryDependencies": [
|
|
10
|
-
"utils"
|
|
17
|
+
"lib/utils"
|
|
11
18
|
],
|
|
12
19
|
"files": [
|
|
13
20
|
{
|
|
@@ -2,11 +2,22 @@
|
|
|
2
2
|
"name": "tooltip",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "Portal",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Tooltip",
|
|
8
|
+
"TooltipArrow",
|
|
9
|
+
"TooltipContent",
|
|
10
|
+
"TooltipContext",
|
|
11
|
+
"TooltipPortal",
|
|
12
|
+
"TooltipPositioner",
|
|
13
|
+
"TooltipProvider",
|
|
14
|
+
"TooltipTrigger"
|
|
15
|
+
],
|
|
5
16
|
"dependencies": {
|
|
6
17
|
"@ark-ui/react": "^5.39.1"
|
|
7
18
|
},
|
|
8
19
|
"registryDependencies": [
|
|
9
|
-
"utils"
|
|
20
|
+
"lib/utils"
|
|
10
21
|
],
|
|
11
22
|
"files": [
|
|
12
23
|
{
|
package/registry/items/tour.json
CHANGED
|
@@ -2,13 +2,32 @@
|
|
|
2
2
|
"name": "tour",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "Tour",
|
|
6
|
+
"exports": [
|
|
7
|
+
"Tour",
|
|
8
|
+
"TourActionTrigger",
|
|
9
|
+
"TourActions",
|
|
10
|
+
"TourArrow",
|
|
11
|
+
"TourBackdrop",
|
|
12
|
+
"TourCloseTrigger",
|
|
13
|
+
"TourContent",
|
|
14
|
+
"TourContext",
|
|
15
|
+
"TourControl",
|
|
16
|
+
"TourDescription",
|
|
17
|
+
"TourPortal",
|
|
18
|
+
"TourPositioner",
|
|
19
|
+
"TourProgressText",
|
|
20
|
+
"TourSpotlight",
|
|
21
|
+
"TourTitle",
|
|
22
|
+
"useTour"
|
|
23
|
+
],
|
|
5
24
|
"dependencies": {
|
|
6
25
|
"@ark-ui/react": "^5.39.1",
|
|
7
26
|
"lucide-react": "^1.41.0"
|
|
8
27
|
},
|
|
9
28
|
"registryDependencies": [
|
|
10
29
|
"button",
|
|
11
|
-
"utils"
|
|
30
|
+
"lib/utils"
|
|
12
31
|
],
|
|
13
32
|
"files": [
|
|
14
33
|
{
|
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
"name": "transfer-list",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "`src/components/ui/transfer-list.tsx` moves items between two lists.",
|
|
5
|
+
"exports": [
|
|
6
|
+
"TransferList",
|
|
7
|
+
"TransferListControls",
|
|
8
|
+
"TransferListEmpty",
|
|
9
|
+
"TransferListItem",
|
|
10
|
+
"TransferListItemIndicator",
|
|
11
|
+
"TransferListItemText",
|
|
12
|
+
"TransferListItems",
|
|
13
|
+
"TransferListMoveAllTrigger",
|
|
14
|
+
"TransferListMoveTrigger",
|
|
15
|
+
"TransferListPanel",
|
|
16
|
+
"TransferListPanelCount",
|
|
17
|
+
"TransferListPanelHeader",
|
|
18
|
+
"TransferListPanelTitle",
|
|
19
|
+
"TransferListSearch",
|
|
20
|
+
"TransferListSelectAll",
|
|
21
|
+
"useTransferList"
|
|
22
|
+
],
|
|
5
23
|
"dependencies": {
|
|
6
24
|
"@ark-ui/react": "^5.39.1",
|
|
7
25
|
"lucide-react": "^1.41.0"
|
|
@@ -9,10 +27,10 @@
|
|
|
9
27
|
"registryDependencies": [
|
|
10
28
|
"button",
|
|
11
29
|
"checkbox",
|
|
12
|
-
"controllable",
|
|
13
30
|
"input-group",
|
|
14
|
-
"
|
|
15
|
-
"utils"
|
|
31
|
+
"lib/controllable",
|
|
32
|
+
"lib/utils",
|
|
33
|
+
"live-region"
|
|
16
34
|
],
|
|
17
35
|
"files": [
|
|
18
36
|
{
|
|
@@ -2,17 +2,36 @@
|
|
|
2
2
|
"name": "tree-select",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "Both live on Ark's `TreeCollection` (`createTreeCollection`, re-exported) and a Popover, and own only the open state, the search query, and the value (`value`/`defaultValue`/`onValueChange`, always a `string[]`); the trigger is a focusable ",
|
|
5
|
+
"ark": "Popover",
|
|
6
|
+
"exports": [
|
|
7
|
+
"TreeSelect",
|
|
8
|
+
"TreeSelectChip",
|
|
9
|
+
"TreeSelectChips",
|
|
10
|
+
"TreeSelectClearTrigger",
|
|
11
|
+
"TreeSelectContent",
|
|
12
|
+
"TreeSelectEmpty",
|
|
13
|
+
"TreeSelectHiddenInput",
|
|
14
|
+
"TreeSelectIndicator",
|
|
15
|
+
"TreeSelectNode",
|
|
16
|
+
"TreeSelectSearch",
|
|
17
|
+
"TreeSelectTree",
|
|
18
|
+
"TreeSelectTrigger",
|
|
19
|
+
"TreeSelectValue",
|
|
20
|
+
"collapseValues",
|
|
21
|
+
"createTreeCollection",
|
|
22
|
+
"useTreeSelect"
|
|
23
|
+
],
|
|
5
24
|
"dependencies": {
|
|
6
25
|
"@ark-ui/react": "^5.39.1",
|
|
7
26
|
"lucide-react": "^1.41.0"
|
|
8
27
|
},
|
|
9
28
|
"registryDependencies": [
|
|
10
29
|
"button",
|
|
11
|
-
"controllable",
|
|
12
30
|
"input-group",
|
|
31
|
+
"lib/controllable",
|
|
32
|
+
"lib/utils",
|
|
13
33
|
"popover",
|
|
14
|
-
"tree-view"
|
|
15
|
-
"utils"
|
|
34
|
+
"tree-view"
|
|
16
35
|
],
|
|
17
36
|
"files": [
|
|
18
37
|
{
|
|
@@ -2,12 +2,35 @@
|
|
|
2
2
|
"name": "tree-view",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "",
|
|
5
|
+
"ark": "TreeView",
|
|
6
|
+
"exports": [
|
|
7
|
+
"TreeView",
|
|
8
|
+
"TreeViewBranch",
|
|
9
|
+
"TreeViewBranchContent",
|
|
10
|
+
"TreeViewBranchControl",
|
|
11
|
+
"TreeViewBranchIndentGuide",
|
|
12
|
+
"TreeViewBranchIndicator",
|
|
13
|
+
"TreeViewBranchText",
|
|
14
|
+
"TreeViewBranchTrigger",
|
|
15
|
+
"TreeViewContext",
|
|
16
|
+
"TreeViewItem",
|
|
17
|
+
"TreeViewItemIndicator",
|
|
18
|
+
"TreeViewItemText",
|
|
19
|
+
"TreeViewLabel",
|
|
20
|
+
"TreeViewNodeCheckbox",
|
|
21
|
+
"TreeViewNodeCheckboxIndicator",
|
|
22
|
+
"TreeViewNodeContext",
|
|
23
|
+
"TreeViewNodeProvider",
|
|
24
|
+
"TreeViewNodeRenameInput",
|
|
25
|
+
"TreeViewTree",
|
|
26
|
+
"createTreeCollection"
|
|
27
|
+
],
|
|
5
28
|
"dependencies": {
|
|
6
29
|
"@ark-ui/react": "^5.39.1",
|
|
7
30
|
"lucide-react": "^1.41.0"
|
|
8
31
|
},
|
|
9
32
|
"registryDependencies": [
|
|
10
|
-
"utils"
|
|
33
|
+
"lib/utils"
|
|
11
34
|
],
|
|
12
35
|
"files": [
|
|
13
36
|
{
|
|
@@ -2,9 +2,18 @@
|
|
|
2
2
|
"name": "virtual-list",
|
|
3
3
|
"type": "ui",
|
|
4
4
|
"description": "-------------------------------- context --------------------------------",
|
|
5
|
+
"exports": [
|
|
6
|
+
"VirtualList",
|
|
7
|
+
"VirtualListContent",
|
|
8
|
+
"VirtualListEmpty",
|
|
9
|
+
"VirtualListItem",
|
|
10
|
+
"VirtualListItems",
|
|
11
|
+
"VirtualListViewport",
|
|
12
|
+
"useVirtualList"
|
|
13
|
+
],
|
|
5
14
|
"dependencies": {},
|
|
6
15
|
"registryDependencies": [
|
|
7
|
-
"utils"
|
|
16
|
+
"lib/utils"
|
|
8
17
|
],
|
|
9
18
|
"files": [
|
|
10
19
|
{
|