@optimum-intelligence/opti-ui 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +161 -2
  3. package/dist/components/accordion/Accordion.d.ts +17 -0
  4. package/dist/components/accordion/Accordion.js +204 -0
  5. package/dist/components/accordion/Accordion.js.map +1 -0
  6. package/dist/components/alert/Alert.d.ts +18 -0
  7. package/dist/components/alert/Alert.js +164 -0
  8. package/dist/components/alert/Alert.js.map +1 -0
  9. package/dist/components/app-shell/AppShell.d.ts +97 -0
  10. package/dist/components/app-shell/AppShell.js +689 -0
  11. package/dist/components/app-shell/AppShell.js.map +1 -0
  12. package/dist/components/avatar/Avatar.d.ts +21 -0
  13. package/dist/components/avatar/Avatar.js +190 -0
  14. package/dist/components/avatar/Avatar.js.map +1 -0
  15. package/dist/components/badge/Badge.d.ts +16 -0
  16. package/dist/components/badge/Badge.js +94 -0
  17. package/dist/components/badge/Badge.js.map +1 -0
  18. package/dist/components/breadcrumbs/Breadcrumbs.d.ts +18 -0
  19. package/dist/components/breadcrumbs/Breadcrumbs.js +154 -0
  20. package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
  21. package/dist/components/button/Button.d.ts +23 -0
  22. package/dist/components/button/Button.js +159 -0
  23. package/dist/components/button/Button.js.map +1 -0
  24. package/dist/components/calendar/Calendar.d.ts +59 -0
  25. package/dist/components/calendar/Calendar.js +709 -0
  26. package/dist/components/calendar/Calendar.js.map +1 -0
  27. package/dist/components/calendar/date-utils.d.ts +32 -0
  28. package/dist/components/calendar/date-utils.js +112 -0
  29. package/dist/components/calendar/date-utils.js.map +1 -0
  30. package/dist/components/card/Card.d.ts +42 -0
  31. package/dist/components/card/Card.js +82 -0
  32. package/dist/components/card/Card.js.map +1 -0
  33. package/dist/components/choice/Choice.d.ts +32 -0
  34. package/dist/components/choice/Choice.js +371 -0
  35. package/dist/components/choice/Choice.js.map +1 -0
  36. package/dist/components/collapsible/Collapsible.d.ts +15 -0
  37. package/dist/components/collapsible/Collapsible.js +155 -0
  38. package/dist/components/collapsible/Collapsible.js.map +1 -0
  39. package/dist/components/combobox/Combobox.d.ts +68 -0
  40. package/dist/components/combobox/Combobox.js +752 -0
  41. package/dist/components/combobox/Combobox.js.map +1 -0
  42. package/dist/components/command-palette/CommandPalette.d.ts +52 -0
  43. package/dist/components/command-palette/CommandPalette.js +328 -0
  44. package/dist/components/command-palette/CommandPalette.js.map +1 -0
  45. package/dist/components/data-table/DataTable.d.ts +111 -0
  46. package/dist/components/data-table/DataTable.js +444 -0
  47. package/dist/components/data-table/DataTable.js.map +1 -0
  48. package/dist/components/date-picker/DatePicker.d.ts +50 -0
  49. package/dist/components/date-picker/DatePicker.js +485 -0
  50. package/dist/components/date-picker/DatePicker.js.map +1 -0
  51. package/dist/components/date-picker/DateRangePicker.d.ts +39 -0
  52. package/dist/components/date-picker/DateRangePicker.js +339 -0
  53. package/dist/components/date-picker/DateRangePicker.js.map +1 -0
  54. package/dist/components/date-picker/PickerField.d.ts +38 -0
  55. package/dist/components/date-picker/PickerField.js +238 -0
  56. package/dist/components/date-picker/PickerField.js.map +1 -0
  57. package/dist/components/dialog/Dialog.d.ts +70 -0
  58. package/dist/components/dialog/Dialog.js +354 -0
  59. package/dist/components/dialog/Dialog.js.map +1 -0
  60. package/dist/components/drawer/Drawer.d.ts +39 -0
  61. package/dist/components/drawer/Drawer.js +225 -0
  62. package/dist/components/drawer/Drawer.js.map +1 -0
  63. package/dist/components/empty-state/EmptyState.d.ts +12 -0
  64. package/dist/components/empty-state/EmptyState.js +116 -0
  65. package/dist/components/empty-state/EmptyState.js.map +1 -0
  66. package/dist/components/field/Field.d.ts +36 -0
  67. package/dist/components/field/Field.js +337 -0
  68. package/dist/components/field/Field.js.map +1 -0
  69. package/dist/components/file-upload/FileUpload.d.ts +91 -0
  70. package/dist/components/file-upload/FileUpload.js +714 -0
  71. package/dist/components/file-upload/FileUpload.js.map +1 -0
  72. package/dist/components/input/Input.d.ts +49 -0
  73. package/dist/components/input/Input.js +538 -0
  74. package/dist/components/input/Input.js.map +1 -0
  75. package/dist/components/link/Link.d.ts +17 -0
  76. package/dist/components/link/Link.js +91 -0
  77. package/dist/components/link/Link.js.map +1 -0
  78. package/dist/components/menu/Menu.d.ts +79 -0
  79. package/dist/components/menu/Menu.js +615 -0
  80. package/dist/components/menu/Menu.js.map +1 -0
  81. package/dist/components/number-field/NumberField.d.ts +16 -0
  82. package/dist/components/number-field/NumberField.js +188 -0
  83. package/dist/components/number-field/NumberField.js.map +1 -0
  84. package/dist/components/pagination/Pagination.d.ts +34 -0
  85. package/dist/components/pagination/Pagination.js +244 -0
  86. package/dist/components/pagination/Pagination.js.map +1 -0
  87. package/dist/components/popover/Popover.d.ts +22 -0
  88. package/dist/components/popover/Popover.js +186 -0
  89. package/dist/components/popover/Popover.js.map +1 -0
  90. package/dist/components/preview-card/PreviewCard.d.ts +20 -0
  91. package/dist/components/preview-card/PreviewCard.js +114 -0
  92. package/dist/components/preview-card/PreviewCard.js.map +1 -0
  93. package/dist/components/progress/Progress.d.ts +20 -0
  94. package/dist/components/progress/Progress.js +169 -0
  95. package/dist/components/progress/Progress.js.map +1 -0
  96. package/dist/components/scroll-area/ScrollArea.d.ts +8 -0
  97. package/dist/components/scroll-area/ScrollArea.js +112 -0
  98. package/dist/components/scroll-area/ScrollArea.js.map +1 -0
  99. package/dist/components/search-input/SearchInput.d.ts +14 -0
  100. package/dist/components/search-input/SearchInput.js +114 -0
  101. package/dist/components/search-input/SearchInput.js.map +1 -0
  102. package/dist/components/select/Select.d.ts +66 -0
  103. package/dist/components/select/Select.js +601 -0
  104. package/dist/components/select/Select.js.map +1 -0
  105. package/dist/components/separator/Separator.d.ts +4 -0
  106. package/dist/components/separator/Separator.js +46 -0
  107. package/dist/components/separator/Separator.js.map +1 -0
  108. package/dist/components/skeleton/Skeleton.d.ts +16 -0
  109. package/dist/components/skeleton/Skeleton.js +135 -0
  110. package/dist/components/skeleton/Skeleton.js.map +1 -0
  111. package/dist/components/slider/Slider.d.ts +11 -0
  112. package/dist/components/slider/Slider.js +107 -0
  113. package/dist/components/slider/Slider.js.map +1 -0
  114. package/dist/components/spinner/Spinner.d.ts +9 -0
  115. package/dist/components/spinner/Spinner.js +78 -0
  116. package/dist/components/spinner/Spinner.js.map +1 -0
  117. package/dist/components/stack/Stack.d.ts +23 -0
  118. package/dist/components/stack/Stack.js +79 -0
  119. package/dist/components/stack/Stack.js.map +1 -0
  120. package/dist/components/stat-card/StatCard.d.ts +22 -0
  121. package/dist/components/stat-card/StatCard.js +153 -0
  122. package/dist/components/stat-card/StatCard.js.map +1 -0
  123. package/dist/components/stepper/Stepper.d.ts +30 -0
  124. package/dist/components/stepper/Stepper.js +131 -0
  125. package/dist/components/stepper/Stepper.js.map +1 -0
  126. package/dist/components/table/Table.d.ts +53 -0
  127. package/dist/components/table/Table.js +221 -0
  128. package/dist/components/table/Table.js.map +1 -0
  129. package/dist/components/tabs/Tabs.d.ts +19 -0
  130. package/dist/components/tabs/Tabs.js +183 -0
  131. package/dist/components/tabs/Tabs.js.map +1 -0
  132. package/dist/components/tag/Tag.d.ts +22 -0
  133. package/dist/components/tag/Tag.js +121 -0
  134. package/dist/components/tag/Tag.js.map +1 -0
  135. package/dist/components/toast/Toast.d.ts +34 -0
  136. package/dist/components/toast/Toast.js +187 -0
  137. package/dist/components/toast/Toast.js.map +1 -0
  138. package/dist/components/toggle/Toggle.d.ts +31 -0
  139. package/dist/components/toggle/Toggle.js +197 -0
  140. package/dist/components/toggle/Toggle.js.map +1 -0
  141. package/dist/components/toolbar/Toolbar.d.ts +21 -0
  142. package/dist/components/toolbar/Toolbar.js +239 -0
  143. package/dist/components/toolbar/Toolbar.js.map +1 -0
  144. package/dist/components/tooltip/Tooltip.d.ts +33 -0
  145. package/dist/components/tooltip/Tooltip.js +182 -0
  146. package/dist/components/tooltip/Tooltip.js.map +1 -0
  147. package/dist/components/typography/Typography.d.ts +32 -0
  148. package/dist/components/typography/Typography.js +183 -0
  149. package/dist/components/typography/Typography.js.map +1 -0
  150. package/dist/fonts.css +3 -0
  151. package/dist/icons/index.d.ts +125 -0
  152. package/dist/icons/index.js +174 -0
  153. package/dist/icons/index.js.map +1 -0
  154. package/dist/index.d.ts +53 -0
  155. package/dist/index.js +56 -0
  156. package/dist/opti-ui.css +5365 -0
  157. package/dist/theme/ThemeProvider.d.ts +22 -0
  158. package/dist/theme/ThemeProvider.js +115 -0
  159. package/dist/theme/ThemeProvider.js.map +1 -0
  160. package/dist/theme/index.d.ts +2 -0
  161. package/dist/utils/cx.d.ts +10 -0
  162. package/dist/utils/cx.js +18 -0
  163. package/dist/utils/cx.js.map +1 -0
  164. package/dist/utils/index.d.ts +2 -0
  165. package/dist/utils/portal.d.ts +8 -0
  166. package/dist/utils/portal.js +16 -0
  167. package/dist/utils/portal.js.map +1 -0
  168. package/dist/utils/primitive.d.ts +13 -0
  169. package/dist/utils/primitive.js +61 -0
  170. package/dist/utils/primitive.js.map +1 -0
  171. package/dist/utils/search.d.ts +4 -0
  172. package/dist/utils/search.js +15 -0
  173. package/dist/utils/search.js.map +1 -0
  174. package/package.json +71 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Combobox.js","names":["React","Combobox","BaseCombobox","withClass","usePortalContainer","CheckIcon","ChevronDownIcon","XIcon","Field","ControlSize","ComboboxInputGroupProps","InputGroup","Props","size","ComboboxInputGroup","t0","$","_c","className","props","ref","t1","undefined","t2","t3","ComboboxInput","ComboboxTrigger","children","ComboboxClear","ComboboxContentProps","Popup","side","Positioner","align","sideOffset","positionerProps","ComboboxContent","container","t4","t5","ComboboxList","ComboboxItem","Symbol","for","ComboboxEmpty","ComboboxChips","ComboboxChip","removeLabel","ComboboxGroupLabel","ComboboxOption","value","label","disabled","RootProps","Omit","Root","ComboboxProps","items","ReactNode","description","error","placeholder","emptyText","hideClear","inputProps","Input","ComboboxComponent","multiple","name","required","rootProps","t6","t7","map","_temp","length","t8","t9","t10","t11","t12","t13","_temp2","t14","t15","t16","t17","t18","item_0","item","Object","assign","Trigger","Clear","Value","Chips","Chip","Content","List","Item","Empty","Group","GroupLabel","Collection","useFilter","_c","BaseCombobox","Combobox"],"sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Combobox as BaseCombobox } from '@base-ui/react/combobox';\nimport { withClass } from '../../utils/cx';\nimport { usePortalContainer } from '../../utils/portal';\nimport { CheckIcon, ChevronDownIcon, XIcon } from '../../icons';\nimport { Field } from '../field/Field';\nimport type { ControlSize } from '../input/Input';\n\n// ─── Parts ───────────────────────────────────────────────────────────────────\n\nexport interface ComboboxInputGroupProps extends BaseCombobox.InputGroup.Props {\n size?: ControlSize;\n}\n\nfunction ComboboxInputGroup({ size = 'md', className, ref, ...props }: ComboboxInputGroupProps) {\n return (\n <BaseCombobox.InputGroup\n ref={ref}\n className={withClass('oui-combobox__group', className)}\n data-size={size}\n {...props}\n />\n );\n}\n\nfunction ComboboxInput({ className, ref, ...props }: BaseCombobox.Input.Props) {\n return <BaseCombobox.Input ref={ref} className={withClass('oui-combobox__input', className)} {...props} />;\n}\n\nfunction ComboboxTrigger({ className, children, ref, ...props }: BaseCombobox.Trigger.Props) {\n return (\n <BaseCombobox.Trigger\n ref={ref}\n aria-label=\"Open list\"\n className={withClass('oui-combobox__action', className)}\n {...props}\n >\n {children ?? <ChevronDownIcon />}\n </BaseCombobox.Trigger>\n );\n}\n\nfunction ComboboxClear({ className, children, ref, ...props }: BaseCombobox.Clear.Props) {\n return (\n <BaseCombobox.Clear\n ref={ref}\n aria-label=\"Clear selection\"\n className={withClass('oui-combobox__action', className)}\n {...props}\n >\n {children ?? <XIcon />}\n </BaseCombobox.Clear>\n );\n}\n\nexport interface ComboboxContentProps extends BaseCombobox.Popup.Props {\n side?: BaseCombobox.Positioner.Props['side'];\n align?: BaseCombobox.Positioner.Props['align'];\n sideOffset?: BaseCombobox.Positioner.Props['sideOffset'];\n positionerProps?: BaseCombobox.Positioner.Props;\n}\n\nfunction ComboboxContent({\n side,\n align,\n sideOffset = 6,\n positionerProps,\n className,\n ref,\n ...props\n}: ComboboxContentProps) {\n const container = usePortalContainer();\n return (\n <BaseCombobox.Portal container={container}>\n <BaseCombobox.Positioner\n className=\"oui-combobox__positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n {...positionerProps}\n >\n <BaseCombobox.Popup ref={ref} className={withClass('oui-combobox__popup', className)} {...props} />\n </BaseCombobox.Positioner>\n </BaseCombobox.Portal>\n );\n}\n\nfunction ComboboxList({ className, ref, ...props }: BaseCombobox.List.Props) {\n return <BaseCombobox.List ref={ref} className={withClass('oui-combobox__list', className)} {...props} />;\n}\n\nfunction ComboboxItem({ className, children, ref, ...props }: BaseCombobox.Item.Props) {\n return (\n <BaseCombobox.Item ref={ref} className={withClass('oui-combobox__item', className)} {...props}>\n <span className=\"oui-combobox__item-text\">{children}</span>\n <BaseCombobox.ItemIndicator className=\"oui-combobox__item-indicator\">\n <CheckIcon />\n </BaseCombobox.ItemIndicator>\n </BaseCombobox.Item>\n );\n}\n\nfunction ComboboxEmpty({ className, ref, ...props }: BaseCombobox.Empty.Props) {\n return <BaseCombobox.Empty ref={ref} className={withClass('oui-combobox__empty', className)} {...props} />;\n}\n\nfunction ComboboxChips({ className, ref, ...props }: BaseCombobox.Chips.Props) {\n return <BaseCombobox.Chips ref={ref} className={withClass('oui-combobox__chips', className)} {...props} />;\n}\n\nfunction ComboboxChip({\n className,\n children,\n removeLabel = 'Remove',\n ref,\n ...props\n}: BaseCombobox.Chip.Props & { removeLabel?: string }) {\n return (\n <BaseCombobox.Chip ref={ref} className={withClass('oui-combobox__chip', className)} {...props}>\n {children}\n <BaseCombobox.ChipRemove className=\"oui-combobox__chip-remove\" aria-label={removeLabel}>\n <XIcon />\n </BaseCombobox.ChipRemove>\n </BaseCombobox.Chip>\n );\n}\n\nfunction ComboboxGroupLabel({ className, ref, ...props }: BaseCombobox.GroupLabel.Props) {\n return <BaseCombobox.GroupLabel ref={ref} className={withClass('oui-select__group-label', className)} {...props} />;\n}\n\n// ─── Convenience component ───────────────────────────────────────────────────\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\ntype RootProps = Omit<BaseCombobox.Root.Props<ComboboxOption, boolean | undefined>, 'items' | 'children'>;\n\nexport interface ComboboxProps extends RootProps {\n items: ComboboxOption[];\n label?: React.ReactNode;\n description?: React.ReactNode;\n error?: React.ReactNode;\n placeholder?: string;\n /** Shown when the filter matches nothing. */\n emptyText?: React.ReactNode;\n size?: ControlSize;\n /** Hide the clear button. */\n hideClear?: boolean;\n inputProps?: BaseCombobox.Input.Props;\n}\n\nfunction ComboboxComponent({\n items,\n label,\n description,\n error,\n placeholder,\n emptyText = 'No results found.',\n size = 'md',\n hideClear,\n inputProps,\n name,\n disabled,\n required,\n multiple,\n ...rootProps\n}: ComboboxProps) {\n return (\n <Field.Root name={name} disabled={disabled} invalid={error ? true : undefined}>\n <BaseCombobox.Root\n items={items}\n multiple={multiple}\n disabled={disabled}\n required={required}\n {...(rootProps as BaseCombobox.Root.Props<ComboboxOption, boolean | undefined>)}\n >\n {label && <Field.Label required={required}>{label}</Field.Label>}\n <ComboboxInputGroup size={size} data-multiple={multiple || undefined}>\n {multiple ? (\n <BaseCombobox.Value>\n {(value: ComboboxOption[]) => (\n <ComboboxChips>\n {value.map((item) => (\n <ComboboxChip key={item.value} removeLabel={`Remove ${item.label}`}>\n {item.label}\n </ComboboxChip>\n ))}\n <ComboboxInput placeholder={value.length ? undefined : placeholder} {...inputProps} />\n </ComboboxChips>\n )}\n </BaseCombobox.Value>\n ) : (\n <ComboboxInput placeholder={placeholder} {...inputProps} />\n )}\n <span className=\"oui-combobox__actions\">\n {!hideClear && <ComboboxClear />}\n <ComboboxTrigger />\n </span>\n </ComboboxInputGroup>\n <ComboboxContent>\n <ComboboxEmpty>{emptyText}</ComboboxEmpty>\n <ComboboxList>\n {(item: ComboboxOption) => (\n <ComboboxItem key={item.value} value={item} disabled={item.disabled}>\n {item.label}\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </BaseCombobox.Root>\n {description && <Field.Description>{description}</Field.Description>}\n {error ? <Field.Error match>{error}</Field.Error> : <Field.Error />}\n </Field.Root>\n );\n}\n\n/**\n * Searchable select. `<Combobox items={…} />` covers single and `multiple`\n * (chips) selection; compose the parts for anything custom.\n */\nexport const Combobox = Object.assign(ComboboxComponent, {\n Root: BaseCombobox.Root,\n InputGroup: ComboboxInputGroup,\n Input: ComboboxInput,\n Trigger: ComboboxTrigger,\n Clear: ComboboxClear,\n Value: BaseCombobox.Value,\n Chips: ComboboxChips,\n Chip: ComboboxChip,\n Content: ComboboxContent,\n List: ComboboxList,\n Item: ComboboxItem,\n Empty: ComboboxEmpty,\n Group: BaseCombobox.Group,\n GroupLabel: ComboboxGroupLabel,\n Collection: BaseCombobox.Collection,\n useFilter: BaseCombobox.useFilter,\n});\n"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+ export interface CommandItem {
3
+ id: string;
4
+ label: string;
5
+ /** Secondary text next to the label. */
6
+ description?: React.ReactNode;
7
+ /** Heading the item is listed under. Groups appear in first-seen order. */
8
+ group?: string;
9
+ icon?: React.ReactNode;
10
+ /** Extra search terms that are not displayed. */
11
+ keywords?: string;
12
+ /** Hint shown on the right, e.g. `<kbd>G</kbd>` or an arrow icon. */
13
+ shortcut?: React.ReactNode;
14
+ disabled?: boolean;
15
+ onSelect?: () => void;
16
+ }
17
+ export interface CommandPaletteProps<T extends CommandItem = CommandItem> {
18
+ items: T[];
19
+ /** Called for any chosen item, after the item's own `onSelect`. */
20
+ onSelect?: (item: T) => void;
21
+ open?: boolean;
22
+ defaultOpen?: boolean;
23
+ onOpenChange?: (open: boolean) => void;
24
+ search?: string;
25
+ defaultSearch?: string;
26
+ onSearchChange?: (search: string) => void;
27
+ /**
28
+ * Custom match function, or `false` when `items` are already filtered (server-side search).
29
+ * By default every term must occur in the label, keywords or group.
30
+ */
31
+ filter?: ((item: T, search: string) => boolean) | false;
32
+ /** Cap on rendered results. */
33
+ maxResults?: number;
34
+ /** Key that toggles the palette together with Ctrl / ⌘. `false` disables the shortcut. */
35
+ hotkey?: string | false;
36
+ /** Keep the palette open after choosing an item. */
37
+ keepOpenOnSelect?: boolean;
38
+ /** Accessible name of the dialog. */
39
+ title?: string;
40
+ placeholder?: string;
41
+ emptyText?: React.ReactNode;
42
+ /** Show a spinner in the search row while results load. */
43
+ loading?: boolean;
44
+ /** Content below the results (key hints, a retry button…). */
45
+ footer?: React.ReactNode;
46
+ className?: string;
47
+ }
48
+ /**
49
+ * Searchable command menu in a dialog (Ctrl / ⌘ + K) for navigation and quick
50
+ * actions. Keyboard: arrows move, Enter chooses, Esc closes.
51
+ */
52
+ export declare function CommandPalette<T extends CommandItem = CommandItem>({ items, onSelect, open: openProp, defaultOpen, onOpenChange, search: searchProp, defaultSearch, onSearchChange, filter, maxResults, hotkey, keepOpenOnSelect, title, placeholder, emptyText, loading, footer, className, }: CommandPaletteProps<T>): React.JSX.Element;
@@ -0,0 +1,328 @@
1
+ "use client";
2
+ import { usePortalContainer } from "../../utils/portal.js";
3
+ import { cx } from "../../utils/cx.js";
4
+ import { SearchIcon } from "../../icons/index.js";
5
+ import { Spinner } from "../spinner/Spinner.js";
6
+ import { matchesQuery } from "../../utils/search.js";
7
+ import { c } from "react/compiler-runtime";
8
+ import * as React from "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { Dialog } from "@base-ui/react/dialog";
11
+ //#region src/components/command-palette/CommandPalette.tsx
12
+ function useControlled(value, initial, onChange) {
13
+ const $ = c(5);
14
+ const [inner, setInner] = React.useState(initial);
15
+ let t0;
16
+ if ($[0] !== onChange) {
17
+ t0 = (next) => {
18
+ setInner(next);
19
+ onChange?.(next);
20
+ };
21
+ $[0] = onChange;
22
+ $[1] = t0;
23
+ } else t0 = $[1];
24
+ const set = t0;
25
+ const t1 = value === void 0 ? inner : value;
26
+ let t2;
27
+ if ($[2] !== set || $[3] !== t1) {
28
+ t2 = [t1, set];
29
+ $[2] = set;
30
+ $[3] = t1;
31
+ $[4] = t2;
32
+ } else t2 = $[4];
33
+ return t2;
34
+ }
35
+ /**
36
+ * Searchable command menu in a dialog (Ctrl / ⌘ + K) for navigation and quick
37
+ * actions. Keyboard: arrows move, Enter chooses, Esc closes.
38
+ */
39
+ function CommandPalette(t0) {
40
+ const $ = c(36);
41
+ const { items, onSelect, open: openProp, defaultOpen: t1, onOpenChange, search: searchProp, defaultSearch: t2, onSearchChange, filter, maxResults: t3, hotkey: t4, keepOpenOnSelect, title: t5, placeholder: t6, emptyText: t7, loading, footer, className } = t0;
42
+ const defaultOpen = t1 === void 0 ? false : t1;
43
+ const defaultSearch = t2 === void 0 ? "" : t2;
44
+ const maxResults = t3 === void 0 ? 50 : t3;
45
+ const hotkey = t4 === void 0 ? "k" : t4;
46
+ const title = t5 === void 0 ? "Command palette" : t5;
47
+ const placeholder = t6 === void 0 ? "Search…" : t6;
48
+ const emptyText = t7 === void 0 ? "No results found." : t7;
49
+ const [open, setOpen] = useControlled(openProp, defaultOpen, onOpenChange);
50
+ const [search, setSearch] = useControlled(searchProp, defaultSearch, onSearchChange);
51
+ const [active, setActive] = React.useState(0);
52
+ const container = usePortalContainer();
53
+ const inputRef = React.useRef(null);
54
+ const listRef = React.useRef(null);
55
+ const baseId = React.useId();
56
+ const toggle = React.useRef(_temp);
57
+ let t8;
58
+ if ($[0] !== open || $[1] !== setOpen) {
59
+ t8 = () => {
60
+ toggle.current = () => setOpen(!open);
61
+ };
62
+ $[0] = open;
63
+ $[1] = setOpen;
64
+ $[2] = t8;
65
+ } else t8 = $[2];
66
+ React.useEffect(t8);
67
+ let t10;
68
+ let t9;
69
+ if ($[3] !== hotkey) {
70
+ t9 = () => {
71
+ if (!hotkey) return;
72
+ const onKeyDown = (event) => {
73
+ if ((event.metaKey || event.ctrlKey) && !event.altKey && event.key.toLowerCase() === hotkey.toLowerCase()) {
74
+ event.preventDefault();
75
+ toggle.current();
76
+ }
77
+ };
78
+ window.addEventListener("keydown", onKeyDown);
79
+ return () => window.removeEventListener("keydown", onKeyDown);
80
+ };
81
+ t10 = [hotkey];
82
+ $[3] = hotkey;
83
+ $[4] = t10;
84
+ $[5] = t9;
85
+ } else {
86
+ t10 = $[4];
87
+ t9 = $[5];
88
+ }
89
+ React.useEffect(t9, t10);
90
+ const matched = filter === false ? items : items.filter((item) => filter ? filter(item, search) : matchesQuery(`${item.label} ${item.keywords ?? ""} ${item.group ?? ""}`, search));
91
+ const byGroup = /* @__PURE__ */ new Map();
92
+ for (const item_0 of matched.slice(0, maxResults)) {
93
+ const key = item_0.group ?? "";
94
+ byGroup.set(key, [...byGroup.get(key) ?? [], item_0]);
95
+ }
96
+ const groups = [...byGroup].map(_temp2);
97
+ const results = groups.flatMap(_temp3);
98
+ const activeIndex = Math.min(active, Math.max(0, results.length - 1));
99
+ let t11;
100
+ if ($[6] !== baseId) {
101
+ t11 = (index) => `${baseId}-option-${index}`;
102
+ $[6] = baseId;
103
+ $[7] = t11;
104
+ } else t11 = $[7];
105
+ const optionId = t11;
106
+ let t12;
107
+ if ($[8] !== keepOpenOnSelect || $[9] !== onSelect || $[10] !== setOpen) {
108
+ t12 = (item_1) => {
109
+ if (!item_1 || item_1.disabled) return;
110
+ item_1.onSelect?.();
111
+ onSelect?.(item_1);
112
+ if (!keepOpenOnSelect) setOpen(false);
113
+ };
114
+ $[8] = keepOpenOnSelect;
115
+ $[9] = onSelect;
116
+ $[10] = setOpen;
117
+ $[11] = t12;
118
+ } else t12 = $[11];
119
+ const choose = t12;
120
+ const move = (step) => {
121
+ if (!results.length) return;
122
+ let next = activeIndex;
123
+ for (let i = 0; i < results.length; i++) {
124
+ next = (next + step + results.length) % results.length;
125
+ if (!results[next].disabled) break;
126
+ }
127
+ setActive(next);
128
+ listRef.current?.querySelector(`[data-index="${next}"]`)?.scrollIntoView({ block: "nearest" });
129
+ };
130
+ const onKeyDown_0 = (event_0) => {
131
+ if (event_0.key === "ArrowDown" || event_0.key === "ArrowUp") {
132
+ event_0.preventDefault();
133
+ move(event_0.key === "ArrowDown" ? 1 : -1);
134
+ } else if (event_0.key === "Enter" && !event_0.nativeEvent.isComposing) {
135
+ event_0.preventDefault();
136
+ choose(results[activeIndex]);
137
+ }
138
+ };
139
+ let index_0 = -1;
140
+ let t13;
141
+ if ($[12] !== setOpen) {
142
+ t13 = (next_0) => setOpen(next_0);
143
+ $[12] = setOpen;
144
+ $[13] = t13;
145
+ } else t13 = $[13];
146
+ let t14;
147
+ if ($[14] !== search || $[15] !== setSearch) {
148
+ t14 = (next_1) => {
149
+ if (!next_1) {
150
+ setActive(0);
151
+ if (search) setSearch("");
152
+ }
153
+ };
154
+ $[14] = search;
155
+ $[15] = setSearch;
156
+ $[16] = t14;
157
+ } else t14 = $[16];
158
+ let t15;
159
+ if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
160
+ t15 = /* @__PURE__ */ jsx(Dialog.Backdrop, { className: "oui-dialog__backdrop" });
161
+ $[17] = t15;
162
+ } else t15 = $[17];
163
+ let t16;
164
+ if ($[18] !== className) {
165
+ t16 = cx("oui-command", className);
166
+ $[18] = className;
167
+ $[19] = t16;
168
+ } else t16 = $[19];
169
+ let t17;
170
+ if ($[20] === Symbol.for("react.memo_cache_sentinel")) {
171
+ t17 = /* @__PURE__ */ jsx(SearchIcon, {});
172
+ $[20] = t17;
173
+ } else t17 = $[20];
174
+ let t18;
175
+ if ($[21] !== setSearch) {
176
+ t18 = (event_1) => {
177
+ setSearch(event_1.target.value);
178
+ setActive(0);
179
+ };
180
+ $[21] = setSearch;
181
+ $[22] = t18;
182
+ } else t18 = $[22];
183
+ let t19;
184
+ if ($[23] !== loading) {
185
+ t19 = loading && /* @__PURE__ */ jsx(Spinner, { size: "1rem" });
186
+ $[23] = loading;
187
+ $[24] = t19;
188
+ } else t19 = $[24];
189
+ const t20 = `${baseId}-list`;
190
+ const t21 = "listbox";
191
+ const t22 = "oui-command__list";
192
+ const t23 = groups.map((group_0, groupIndex) => /* @__PURE__ */ jsxs("div", {
193
+ role: "group",
194
+ "aria-labelledby": group_0.heading ? `${baseId}-group-${groupIndex}` : void 0,
195
+ className: "oui-command__group",
196
+ children: [group_0.heading && /* @__PURE__ */ jsx("div", {
197
+ id: `${baseId}-group-${groupIndex}`,
198
+ className: "oui-command__group-label",
199
+ children: group_0.heading
200
+ }), group_0.items.map((item_2) => {
201
+ index_0 = index_0 + 1;
202
+ const itemIndex = index_0;
203
+ return /* @__PURE__ */ jsxs("div", {
204
+ id: optionId(itemIndex),
205
+ role: "option",
206
+ className: "oui-command__item",
207
+ "aria-selected": itemIndex === activeIndex,
208
+ "aria-disabled": item_2.disabled || void 0,
209
+ "data-index": itemIndex,
210
+ "data-highlighted": itemIndex === activeIndex ? "" : void 0,
211
+ "data-disabled": item_2.disabled ? "" : void 0,
212
+ onPointerMove: () => !item_2.disabled && itemIndex !== activeIndex && setActive(itemIndex),
213
+ onClick: () => choose(item_2),
214
+ children: [
215
+ item_2.icon && /* @__PURE__ */ jsx("span", {
216
+ className: "oui-command__item-icon",
217
+ children: item_2.icon
218
+ }),
219
+ /* @__PURE__ */ jsxs("span", {
220
+ className: "oui-command__item-text",
221
+ children: [/* @__PURE__ */ jsx("span", {
222
+ className: "oui-command__item-label",
223
+ children: item_2.label
224
+ }), item_2.description && /* @__PURE__ */ jsx("span", {
225
+ className: "oui-command__item-description",
226
+ children: item_2.description
227
+ })]
228
+ }),
229
+ item_2.shortcut && /* @__PURE__ */ jsx("span", {
230
+ className: "oui-command__item-shortcut",
231
+ children: item_2.shortcut
232
+ })
233
+ ]
234
+ }, item_2.id);
235
+ })]
236
+ }, group_0.heading));
237
+ let t24;
238
+ if ($[25] !== emptyText || $[26] !== results.length) {
239
+ t24 = !results.length && /* @__PURE__ */ jsx("div", {
240
+ className: "oui-command__empty",
241
+ children: emptyText
242
+ });
243
+ $[25] = emptyText;
244
+ $[26] = results.length;
245
+ $[27] = t24;
246
+ } else t24 = $[27];
247
+ let t25;
248
+ if ($[28] !== listRef || $[29] !== t20 || $[30] !== t23 || $[31] !== t24 || $[32] !== title) {
249
+ t25 = /* @__PURE__ */ jsxs("div", {
250
+ ref: listRef,
251
+ id: t20,
252
+ role: t21,
253
+ "aria-label": title,
254
+ className: t22,
255
+ children: [t23, t24]
256
+ });
257
+ $[28] = listRef;
258
+ $[29] = t20;
259
+ $[30] = t23;
260
+ $[31] = t24;
261
+ $[32] = title;
262
+ $[33] = t25;
263
+ } else t25 = $[33];
264
+ let t26;
265
+ if ($[34] !== footer) {
266
+ t26 = footer && /* @__PURE__ */ jsx("div", {
267
+ className: "oui-command__footer",
268
+ children: footer
269
+ });
270
+ $[34] = footer;
271
+ $[35] = t26;
272
+ } else t26 = $[35];
273
+ return /* @__PURE__ */ jsx(Dialog.Root, {
274
+ open,
275
+ onOpenChange: t13,
276
+ onOpenChangeComplete: t14,
277
+ children: /* @__PURE__ */ jsxs(Dialog.Portal, {
278
+ container,
279
+ children: [t15, /* @__PURE__ */ jsxs(Dialog.Popup, {
280
+ className: t16,
281
+ "aria-label": title,
282
+ initialFocus: inputRef,
283
+ children: [
284
+ /* @__PURE__ */ jsxs("div", {
285
+ className: "oui-command__search",
286
+ children: [
287
+ t17,
288
+ /* @__PURE__ */ jsx("input", {
289
+ ref: inputRef,
290
+ className: "oui-command__input",
291
+ role: "combobox",
292
+ "aria-expanded": true,
293
+ "aria-autocomplete": "list",
294
+ "aria-controls": `${baseId}-list`,
295
+ "aria-activedescendant": results.length ? optionId(activeIndex) : void 0,
296
+ "aria-label": placeholder,
297
+ placeholder,
298
+ autoComplete: "off",
299
+ spellCheck: false,
300
+ value: search,
301
+ onChange: t18,
302
+ onKeyDown: onKeyDown_0
303
+ }),
304
+ t19
305
+ ]
306
+ }),
307
+ t25,
308
+ t26
309
+ ]
310
+ })]
311
+ })
312
+ });
313
+ }
314
+ function _temp3(group) {
315
+ return group.items;
316
+ }
317
+ function _temp2(t0) {
318
+ const [heading, groupItems] = t0;
319
+ return {
320
+ heading,
321
+ items: groupItems
322
+ };
323
+ }
324
+ function _temp() {}
325
+ //#endregion
326
+ export { CommandPalette };
327
+
328
+ //# sourceMappingURL=CommandPalette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandPalette.js","names":["React","Dialog","BaseDialog","cx","usePortalContainer","matchesQuery","SearchIcon","Spinner","CommandItem","id","label","description","ReactNode","group","icon","keywords","shortcut","disabled","onSelect","CommandPaletteProps","items","T","item","open","defaultOpen","onOpenChange","search","defaultSearch","onSearchChange","filter","maxResults","hotkey","keepOpenOnSelect","title","placeholder","emptyText","loading","footer","className","useControlled","value","initial","onChange","$","_c","inner","setInner","useState","t0","next","set","t1","undefined","t2","const","CommandPalette","openProp","searchProp","t3","t4","t5","t6","t7","setOpen","setSearch","active","setActive","container","inputRef","useRef","listRef","baseId","useId","toggle","_temp","t8","current","useEffect","t10","t9","onKeyDown","event","metaKey","ctrlKey","altKey","key","toLowerCase","preventDefault","window","addEventListener","removeEventListener","matched","byGroup","Map","item_0","slice","get","groups","map","_temp2","results","flatMap","_temp3","activeIndex","Math","min","max","length","t11","index","optionId","t12","item_1","choose","move","step","i","querySelector","scrollIntoView","block","onKeyDown_0","event_0","nativeEvent","isComposing","index_0","t13","next_0","t14","next_1","t15","Symbol","for","t16","t17","t18","event_1","target","t19","t20","t21","t22","t23","group_0","groupIndex","heading","item_2","itemIndex","t24","t25","t26","groupItems","_c","BaseDialog"],"sources":["../../../src/components/command-palette/CommandPalette.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\nimport { cx } from '../../utils/cx';\nimport { usePortalContainer } from '../../utils/portal';\nimport { matchesQuery } from '../../utils/search';\nimport { SearchIcon } from '../../icons';\nimport { Spinner } from '../spinner/Spinner';\n\nexport interface CommandItem {\n id: string;\n label: string;\n /** Secondary text next to the label. */\n description?: React.ReactNode;\n /** Heading the item is listed under. Groups appear in first-seen order. */\n group?: string;\n icon?: React.ReactNode;\n /** Extra search terms that are not displayed. */\n keywords?: string;\n /** Hint shown on the right, e.g. `<kbd>G</kbd>` or an arrow icon. */\n shortcut?: React.ReactNode;\n disabled?: boolean;\n onSelect?: () => void;\n}\n\nexport interface CommandPaletteProps<T extends CommandItem = CommandItem> {\n items: T[];\n /** Called for any chosen item, after the item's own `onSelect`. */\n onSelect?: (item: T) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n search?: string;\n defaultSearch?: string;\n onSearchChange?: (search: string) => void;\n /**\n * Custom match function, or `false` when `items` are already filtered (server-side search).\n * By default every term must occur in the label, keywords or group.\n */\n filter?: ((item: T, search: string) => boolean) | false;\n /** Cap on rendered results. */\n maxResults?: number;\n /** Key that toggles the palette together with Ctrl / ⌘. `false` disables the shortcut. */\n hotkey?: string | false;\n /** Keep the palette open after choosing an item. */\n keepOpenOnSelect?: boolean;\n /** Accessible name of the dialog. */\n title?: string;\n placeholder?: string;\n emptyText?: React.ReactNode;\n /** Show a spinner in the search row while results load. */\n loading?: boolean;\n /** Content below the results (key hints, a retry button…). */\n footer?: React.ReactNode;\n className?: string;\n}\n\nfunction useControlled<V>(value: V | undefined, initial: V, onChange?: (value: V) => void) {\n const [inner, setInner] = React.useState(initial);\n const set = (next: V) => {\n setInner(next);\n onChange?.(next);\n };\n return [value === undefined ? inner : value, set] as const;\n}\n\n/**\n * Searchable command menu in a dialog (Ctrl / ⌘ + K) for navigation and quick\n * actions. Keyboard: arrows move, Enter chooses, Esc closes.\n */\nexport function CommandPalette<T extends CommandItem = CommandItem>({\n items,\n onSelect,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n search: searchProp,\n defaultSearch = '',\n onSearchChange,\n filter,\n maxResults = 50,\n hotkey = 'k',\n keepOpenOnSelect,\n title = 'Command palette',\n placeholder = 'Search…',\n emptyText = 'No results found.',\n loading,\n footer,\n className,\n}: CommandPaletteProps<T>) {\n const [open, setOpen] = useControlled(openProp, defaultOpen, onOpenChange);\n const [search, setSearch] = useControlled(searchProp, defaultSearch, onSearchChange);\n const [active, setActive] = React.useState(0);\n const container = usePortalContainer();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLDivElement>(null);\n const baseId = React.useId();\n\n // Latest state for the global shortcut without re-subscribing on every render.\n const toggle = React.useRef(() => {});\n React.useEffect(() => {\n toggle.current = () => setOpen(!open);\n });\n React.useEffect(() => {\n if (!hotkey) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && !event.altKey && event.key.toLowerCase() === hotkey.toLowerCase()) {\n event.preventDefault();\n toggle.current();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [hotkey]);\n\n // Grouped, in first-seen group order; `results` is the flat keyboard order.\n const matched =\n filter === false\n ? items\n : items.filter((item) =>\n filter ? filter(item, search) : matchesQuery(`${item.label} ${item.keywords ?? ''} ${item.group ?? ''}`, search),\n );\n const byGroup = new Map<string, T[]>();\n for (const item of matched.slice(0, maxResults)) {\n const key = item.group ?? '';\n byGroup.set(key, [...(byGroup.get(key) ?? []), item]);\n }\n const groups = [...byGroup].map(([heading, groupItems]) => ({ heading, items: groupItems }));\n const results = groups.flatMap((group) => group.items);\n\n const activeIndex = Math.min(active, Math.max(0, results.length - 1));\n const optionId = (index: number) => `${baseId}-option-${index}`;\n\n const choose = (item: T | undefined) => {\n if (!item || item.disabled) return;\n item.onSelect?.();\n onSelect?.(item);\n if (!keepOpenOnSelect) setOpen(false);\n };\n\n const move = (step: 1 | -1) => {\n if (!results.length) return;\n let next = activeIndex;\n for (let i = 0; i < results.length; i++) {\n next = (next + step + results.length) % results.length;\n if (!results[next].disabled) break;\n }\n setActive(next);\n listRef.current?.querySelector(`[data-index=\"${next}\"]`)?.scrollIntoView({ block: 'nearest' });\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n move(event.key === 'ArrowDown' ? 1 : -1);\n } else if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault();\n choose(results[activeIndex]);\n }\n };\n\n let index = -1;\n return (\n <BaseDialog.Root\n open={open}\n onOpenChange={(next) => setOpen(next)}\n onOpenChangeComplete={(next) => {\n // Start fresh next time, once the closing animation is done.\n if (!next) {\n setActive(0);\n if (search) setSearch('');\n }\n }}\n >\n <BaseDialog.Portal container={container}>\n <BaseDialog.Backdrop className=\"oui-dialog__backdrop\" />\n <BaseDialog.Popup className={cx('oui-command', className)} aria-label={title} initialFocus={inputRef}>\n <div className=\"oui-command__search\">\n <SearchIcon />\n <input\n ref={inputRef}\n className=\"oui-command__input\"\n role=\"combobox\"\n aria-expanded\n aria-autocomplete=\"list\"\n aria-controls={`${baseId}-list`}\n aria-activedescendant={results.length ? optionId(activeIndex) : undefined}\n aria-label={placeholder}\n placeholder={placeholder}\n autoComplete=\"off\"\n spellCheck={false}\n value={search}\n onChange={(event) => {\n setSearch(event.target.value);\n setActive(0);\n }}\n onKeyDown={onKeyDown}\n />\n {loading && <Spinner size=\"1rem\" />}\n </div>\n <div ref={listRef} id={`${baseId}-list`} role=\"listbox\" aria-label={title} className=\"oui-command__list\">\n {groups.map((group, groupIndex) => (\n <div\n key={group.heading}\n role=\"group\"\n aria-labelledby={group.heading ? `${baseId}-group-${groupIndex}` : undefined}\n className=\"oui-command__group\"\n >\n {group.heading && (\n <div id={`${baseId}-group-${groupIndex}`} className=\"oui-command__group-label\">\n {group.heading}\n </div>\n )}\n {group.items.map((item) => {\n index += 1;\n const itemIndex = index;\n return (\n <div\n key={item.id}\n id={optionId(itemIndex)}\n role=\"option\"\n className=\"oui-command__item\"\n aria-selected={itemIndex === activeIndex}\n aria-disabled={item.disabled || undefined}\n data-index={itemIndex}\n data-highlighted={itemIndex === activeIndex ? '' : undefined}\n data-disabled={item.disabled ? '' : undefined}\n onPointerMove={() => !item.disabled && itemIndex !== activeIndex && setActive(itemIndex)}\n onClick={() => choose(item)}\n >\n {item.icon && <span className=\"oui-command__item-icon\">{item.icon}</span>}\n <span className=\"oui-command__item-text\">\n <span className=\"oui-command__item-label\">{item.label}</span>\n {item.description && <span className=\"oui-command__item-description\">{item.description}</span>}\n </span>\n {item.shortcut && <span className=\"oui-command__item-shortcut\">{item.shortcut}</span>}\n </div>\n );\n })}\n </div>\n ))}\n {!results.length && <div className=\"oui-command__empty\">{emptyText}</div>}\n </div>\n {footer && <div className=\"oui-command__footer\">{footer}</div>}\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import * as React from 'react';
2
+ import { type PaginationLabels } from '../pagination/Pagination';
3
+ import { type TableProps } from '../table/Table';
4
+ export interface DataTableColumn<T> {
5
+ /** Unique key. Also the property read from the row when there is no `accessor`. */
6
+ id: string;
7
+ header: React.ReactNode;
8
+ /** Value used for sorting, searching and the default cell. Defaults to `row[id]`. */
9
+ accessor?: (row: T) => unknown;
10
+ /** Custom cell content. */
11
+ cell?: (row: T) => React.ReactNode;
12
+ /** Defaults to `true`, or `false` for columns that only define `cell` (actions, icons). */
13
+ sortable?: boolean;
14
+ /** Include this column in the built-in search. Same default as `sortable`. */
15
+ searchable?: boolean;
16
+ /** Custom ascending comparison. */
17
+ compare?: (a: T, b: T) => number;
18
+ align?: 'start' | 'center' | 'end';
19
+ /** Right-align with tabular figures. */
20
+ numeric?: boolean;
21
+ width?: number | string;
22
+ }
23
+ export interface DataTableSort {
24
+ id: string;
25
+ direction: 'asc' | 'desc';
26
+ }
27
+ export interface DataTableLabels extends PaginationLabels {
28
+ search: string;
29
+ clearSearch: string;
30
+ selectAll: string;
31
+ selectRow: (label: string) => string;
32
+ count: (count: number) => React.ReactNode;
33
+ selected: (count: number) => React.ReactNode;
34
+ emptyTitle: React.ReactNode;
35
+ emptyDescription: React.ReactNode;
36
+ noMatchTitle: React.ReactNode;
37
+ noMatchDescription: React.ReactNode;
38
+ loading: string;
39
+ errorTitle: React.ReactNode;
40
+ retry: string;
41
+ }
42
+ export interface DataTableToolbarContext<T> {
43
+ /** Rows after search and sorting, across all pages. In server mode: the current page. */
44
+ rows: T[];
45
+ /** Ids of the selected rows. */
46
+ selection: string[];
47
+ }
48
+ export interface DataTableProps<T> extends Pick<TableProps, 'density' | 'striped' | 'stickyHeader'> {
49
+ /** All rows, or in server mode the rows of the current page. */
50
+ data: T[];
51
+ columns: DataTableColumn<T>[];
52
+ /**
53
+ * `server` renders `data` as it is: search, sorting and pagination are left to
54
+ * the API, driven by the `search` / `sort` / `page` / `pageSize` callbacks.
55
+ */
56
+ mode?: 'client' | 'server';
57
+ /** Server mode: number of rows across all pages. */
58
+ total?: number;
59
+ /** Shows placeholder rows when there is no data yet, and dims the rows during a refetch. */
60
+ loading?: boolean;
61
+ /** Error message shown in place of the rows. */
62
+ error?: React.ReactNode;
63
+ /** Adds a retry button to the error message. */
64
+ onRetry?: () => void;
65
+ /** Stable id per row, needed for selection. Defaults to `row.id`, then the index. */
66
+ getRowId?: (row: T, index: number) => string;
67
+ /** Show the search box (default `true`). */
68
+ searchable?: boolean;
69
+ search?: string;
70
+ defaultSearch?: string;
71
+ onSearchChange?: (search: string) => void;
72
+ /** Replaces the built-in search, which matches every term against the searchable columns. */
73
+ filter?: (row: T, search: string) => boolean;
74
+ sort?: DataTableSort | null;
75
+ defaultSort?: DataTableSort | null;
76
+ onSortChange?: (sort: DataTableSort | null) => void;
77
+ /** Paginate rows (default `true`). */
78
+ paginated?: boolean;
79
+ page?: number;
80
+ onPageChange?: (page: number) => void;
81
+ pageSize?: number;
82
+ defaultPageSize?: number;
83
+ onPageSizeChange?: (pageSize: number) => void;
84
+ pageSizeOptions?: number[];
85
+ /**
86
+ * Selected row ids. Passing `onSelectionChange` adds the checkbox column.
87
+ * Select-all covers every filtered row, or in server mode the current page.
88
+ */
89
+ selection?: string[];
90
+ onSelectionChange?: (selection: string[]) => void;
91
+ /** Makes rows clickable and keyboard-activatable (Enter). */
92
+ onRowClick?: (row: T) => void;
93
+ /** Accessible name of a row, used by row selection and clickable rows. */
94
+ rowLabel?: (row: T) => string;
95
+ /** Extra toolbar content (filters, export…). A function receives the processed rows. */
96
+ toolbar?: React.ReactNode | ((context: DataTableToolbarContext<T>) => React.ReactNode);
97
+ /** Replaces the default empty state. */
98
+ empty?: React.ReactNode;
99
+ /** Override texts for localisation. */
100
+ labels?: Partial<DataTableLabels>;
101
+ className?: string;
102
+ tableProps?: Omit<TableProps, 'children'>;
103
+ }
104
+ /**
105
+ * Table with built-in search, sorting, pagination and row selection. Every
106
+ * piece of state works uncontrolled or controlled (`search` / `sort` / `page` /
107
+ * `selection`), e.g. to persist it in the URL. With `mode="server"` the same
108
+ * state drives an API instead: pass the fetched page as `data`, plus `total`
109
+ * and `loading`. For custom layouts compose `Table` and `Pagination`.
110
+ */
111
+ export declare function DataTable<T>({ data, columns, mode, total, loading, error, onRetry, getRowId, searchable, search: searchProp, defaultSearch, onSearchChange, filter, sort: sortProp, defaultSort, onSortChange, paginated, page: pageProp, onPageChange, pageSize: pageSizeProp, defaultPageSize, onPageSizeChange, pageSizeOptions, selection, onSelectionChange, onRowClick, rowLabel, toolbar, empty, labels, density, striped, stickyHeader, className, tableProps, }: DataTableProps<T>): React.JSX.Element;