@duestel/ui 0.1.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.
- package/README.md +110 -0
- package/dist/components/accordion/Accordion.d.ts +34 -0
- package/dist/components/accordion/Accordion.js +54 -0
- package/dist/components/accordion/Accordion.js.map +1 -0
- package/dist/components/accordion/index.d.ts +1 -0
- package/dist/components/accordion/index.js +2 -0
- package/dist/components/alert-dialog/AlertDialog.d.ts +53 -0
- package/dist/components/alert-dialog/AlertDialog.js +69 -0
- package/dist/components/alert-dialog/AlertDialog.js.map +1 -0
- package/dist/components/alert-dialog/index.d.ts +1 -0
- package/dist/components/alert-dialog/index.js +2 -0
- package/dist/components/autocomplete/Autocomplete.d.ts +90 -0
- package/dist/components/autocomplete/Autocomplete.js +137 -0
- package/dist/components/autocomplete/Autocomplete.js.map +1 -0
- package/dist/components/autocomplete/index.d.ts +1 -0
- package/dist/components/autocomplete/index.js +2 -0
- package/dist/components/avatar/Avatar.d.ts +44 -0
- package/dist/components/avatar/Avatar.js +45 -0
- package/dist/components/avatar/Avatar.js.map +1 -0
- package/dist/components/avatar/index.d.ts +2 -0
- package/dist/components/avatar/index.js +2 -0
- package/dist/components/badge/Badge.d.ts +43 -0
- package/dist/components/badge/Badge.js +32 -0
- package/dist/components/badge/Badge.js.map +1 -0
- package/dist/components/badge/index.d.ts +2 -0
- package/dist/components/badge/index.js +2 -0
- package/dist/components/button/Button.d.ts +60 -0
- package/dist/components/button/Button.js +61 -0
- package/dist/components/button/Button.js.map +1 -0
- package/dist/components/button/index.d.ts +1 -0
- package/dist/components/button/index.js +2 -0
- package/dist/components/carousel/Carousel.d.ts +32 -0
- package/dist/components/carousel/Carousel.js +113 -0
- package/dist/components/carousel/Carousel.js.map +1 -0
- package/dist/components/carousel/index.d.ts +1 -0
- package/dist/components/carousel/index.js +2 -0
- package/dist/components/checkbox/Checkbox.d.ts +64 -0
- package/dist/components/checkbox/Checkbox.js +59 -0
- package/dist/components/checkbox/Checkbox.js.map +1 -0
- package/dist/components/checkbox/index.d.ts +1 -0
- package/dist/components/checkbox/index.js +2 -0
- package/dist/components/collapsible/Collapsible.d.ts +28 -0
- package/dist/components/collapsible/Collapsible.js +40 -0
- package/dist/components/collapsible/Collapsible.js.map +1 -0
- package/dist/components/collapsible/index.d.ts +1 -0
- package/dist/components/collapsible/index.js +2 -0
- package/dist/components/combobox/Combobox.d.ts +113 -0
- package/dist/components/combobox/Combobox.js +189 -0
- package/dist/components/combobox/Combobox.js.map +1 -0
- package/dist/components/combobox/index.d.ts +1 -0
- package/dist/components/combobox/index.js +2 -0
- package/dist/components/command/Command.d.ts +37 -0
- package/dist/components/command/Command.js +90 -0
- package/dist/components/command/Command.js.map +1 -0
- package/dist/components/command/index.d.ts +1 -0
- package/dist/components/command/index.js +2 -0
- package/dist/components/context-menu/ContextMenu.d.ts +76 -0
- package/dist/components/context-menu/ContextMenu.js +132 -0
- package/dist/components/context-menu/ContextMenu.js.map +1 -0
- package/dist/components/context-menu/index.d.ts +1 -0
- package/dist/components/context-menu/index.js +2 -0
- package/dist/components/data-table/DataTable.d.ts +32 -0
- package/dist/components/data-table/DataTable.js +102 -0
- package/dist/components/data-table/DataTable.js.map +1 -0
- package/dist/components/data-table/Table.d.ts +51 -0
- package/dist/components/data-table/Table.js +69 -0
- package/dist/components/data-table/Table.js.map +1 -0
- package/dist/components/data-table/index.d.ts +3 -0
- package/dist/components/data-table/index.js +3 -0
- package/dist/components/date-picker/DatePicker.d.ts +63 -0
- package/dist/components/date-picker/DatePicker.js +247 -0
- package/dist/components/date-picker/DatePicker.js.map +1 -0
- package/dist/components/date-picker/index.d.ts +2 -0
- package/dist/components/date-picker/index.js +2 -0
- package/dist/components/dialog/Dialog.d.ts +59 -0
- package/dist/components/dialog/Dialog.js +71 -0
- package/dist/components/dialog/Dialog.js.map +1 -0
- package/dist/components/dialog/index.d.ts +1 -0
- package/dist/components/dialog/index.js +2 -0
- package/dist/components/drawer/Drawer.d.ts +93 -0
- package/dist/components/drawer/Drawer.js +106 -0
- package/dist/components/drawer/Drawer.js.map +1 -0
- package/dist/components/drawer/index.d.ts +1 -0
- package/dist/components/drawer/index.js +2 -0
- package/dist/components/form/Field.d.ts +52 -0
- package/dist/components/form/Field.js +54 -0
- package/dist/components/form/Field.js.map +1 -0
- package/dist/components/form/Fieldset.d.ts +24 -0
- package/dist/components/form/Fieldset.js +24 -0
- package/dist/components/form/Fieldset.js.map +1 -0
- package/dist/components/form/Form.d.ts +18 -0
- package/dist/components/form/Form.js +14 -0
- package/dist/components/form/Form.js.map +1 -0
- package/dist/components/form/Input.d.ts +33 -0
- package/dist/components/form/Input.js +99 -0
- package/dist/components/form/Input.js.map +1 -0
- package/dist/components/form/app-form.d.ts +71 -0
- package/dist/components/form/app-form.js +95 -0
- package/dist/components/form/app-form.js.map +1 -0
- package/dist/components/form/index.d.ts +5 -0
- package/dist/components/form/index.js +6 -0
- package/dist/components/hotkeys/Kbd.d.ts +20 -0
- package/dist/components/hotkeys/Kbd.js +31 -0
- package/dist/components/hotkeys/Kbd.js.map +1 -0
- package/dist/components/hotkeys/hotkeys.d.ts +14 -0
- package/dist/components/hotkeys/hotkeys.js +2 -0
- package/dist/components/hotkeys/index.d.ts +2 -0
- package/dist/components/hotkeys/index.js +3 -0
- package/dist/components/menu/Menu.d.ts +84 -0
- package/dist/components/menu/Menu.js +142 -0
- package/dist/components/menu/Menu.js.map +1 -0
- package/dist/components/menu/index.d.ts +1 -0
- package/dist/components/menu/index.js +2 -0
- package/dist/components/menubar/Menubar.d.ts +87 -0
- package/dist/components/menubar/Menubar.js +142 -0
- package/dist/components/menubar/Menubar.js.map +1 -0
- package/dist/components/menubar/index.d.ts +1 -0
- package/dist/components/menubar/index.js +2 -0
- package/dist/components/meter/Meter.d.ts +33 -0
- package/dist/components/meter/Meter.js +45 -0
- package/dist/components/meter/Meter.js.map +1 -0
- package/dist/components/meter/index.d.ts +1 -0
- package/dist/components/meter/index.js +2 -0
- package/dist/components/navigation-menu/NavigationMenu.d.ts +81 -0
- package/dist/components/navigation-menu/NavigationMenu.js +112 -0
- package/dist/components/navigation-menu/NavigationMenu.js.map +1 -0
- package/dist/components/navigation-menu/index.d.ts +1 -0
- package/dist/components/navigation-menu/index.js +2 -0
- package/dist/components/number-field/NumberField.d.ts +53 -0
- package/dist/components/number-field/NumberField.js +72 -0
- package/dist/components/number-field/NumberField.js.map +1 -0
- package/dist/components/number-field/index.d.ts +1 -0
- package/dist/components/number-field/index.js +2 -0
- package/dist/components/otp-field/OtpField.d.ts +33 -0
- package/dist/components/otp-field/OtpField.js +31 -0
- package/dist/components/otp-field/OtpField.js.map +1 -0
- package/dist/components/otp-field/index.d.ts +1 -0
- package/dist/components/otp-field/index.js +2 -0
- package/dist/components/pagination/Pagination.d.ts +17 -0
- package/dist/components/pagination/Pagination.js +75 -0
- package/dist/components/pagination/Pagination.js.map +1 -0
- package/dist/components/pagination/index.d.ts +1 -0
- package/dist/components/pagination/index.js +2 -0
- package/dist/components/popover/Popover.d.ts +73 -0
- package/dist/components/popover/Popover.js +97 -0
- package/dist/components/popover/Popover.js.map +1 -0
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/index.js +2 -0
- package/dist/components/preview-card/PreviewCard.d.ts +60 -0
- package/dist/components/preview-card/PreviewCard.js +83 -0
- package/dist/components/preview-card/PreviewCard.js.map +1 -0
- package/dist/components/preview-card/index.d.ts +1 -0
- package/dist/components/preview-card/index.js +2 -0
- package/dist/components/progress/Progress.d.ts +36 -0
- package/dist/components/progress/Progress.js +45 -0
- package/dist/components/progress/Progress.js.map +1 -0
- package/dist/components/progress/index.d.ts +1 -0
- package/dist/components/progress/index.js +2 -0
- package/dist/components/radio/Radio.d.ts +39 -0
- package/dist/components/radio/Radio.js +39 -0
- package/dist/components/radio/Radio.js.map +1 -0
- package/dist/components/radio/index.d.ts +1 -0
- package/dist/components/radio/index.js +2 -0
- package/dist/components/resizable/Resizable.d.ts +35 -0
- package/dist/components/resizable/Resizable.js +38 -0
- package/dist/components/resizable/Resizable.js.map +1 -0
- package/dist/components/resizable/index.d.ts +1 -0
- package/dist/components/resizable/index.js +2 -0
- package/dist/components/scroll-area/ScrollArea.d.ts +37 -0
- package/dist/components/scroll-area/ScrollArea.js +52 -0
- package/dist/components/scroll-area/ScrollArea.js.map +1 -0
- package/dist/components/scroll-area/index.d.ts +1 -0
- package/dist/components/scroll-area/index.js +2 -0
- package/dist/components/select/Select.d.ts +94 -0
- package/dist/components/select/Select.js +151 -0
- package/dist/components/select/Select.js.map +1 -0
- package/dist/components/select/index.d.ts +1 -0
- package/dist/components/select/index.js +2 -0
- package/dist/components/separator/Separator.d.ts +29 -0
- package/dist/components/separator/Separator.js +20 -0
- package/dist/components/separator/Separator.js.map +1 -0
- package/dist/components/separator/index.d.ts +1 -0
- package/dist/components/separator/index.js +2 -0
- package/dist/components/slider/Slider.d.ts +53 -0
- package/dist/components/slider/Slider.js +70 -0
- package/dist/components/slider/Slider.js.map +1 -0
- package/dist/components/slider/index.d.ts +1 -0
- package/dist/components/slider/index.js +2 -0
- package/dist/components/switch/Switch.d.ts +28 -0
- package/dist/components/switch/Switch.js +31 -0
- package/dist/components/switch/Switch.js.map +1 -0
- package/dist/components/switch/index.d.ts +1 -0
- package/dist/components/switch/index.js +2 -0
- package/dist/components/tabs/Tabs.d.ts +41 -0
- package/dist/components/tabs/Tabs.js +45 -0
- package/dist/components/tabs/Tabs.js.map +1 -0
- package/dist/components/tabs/index.d.ts +1 -0
- package/dist/components/tabs/index.js +2 -0
- package/dist/components/toast/Toast.d.ts +70 -0
- package/dist/components/toast/Toast.js +95 -0
- package/dist/components/toast/Toast.js.map +1 -0
- package/dist/components/toast/index.d.ts +1 -0
- package/dist/components/toast/index.js +2 -0
- package/dist/components/toggle/Toggle.d.ts +38 -0
- package/dist/components/toggle/Toggle.js +30 -0
- package/dist/components/toggle/Toggle.js.map +1 -0
- package/dist/components/toggle/index.d.ts +1 -0
- package/dist/components/toggle/index.js +2 -0
- package/dist/components/toolbar/Toolbar.d.ts +50 -0
- package/dist/components/toolbar/Toolbar.js +59 -0
- package/dist/components/toolbar/Toolbar.js.map +1 -0
- package/dist/components/toolbar/index.d.ts +1 -0
- package/dist/components/toolbar/index.js +2 -0
- package/dist/components/tooltip/Tooltip.d.ts +58 -0
- package/dist/components/tooltip/Tooltip.js +57 -0
- package/dist/components/tooltip/Tooltip.js.map +1 -0
- package/dist/components/tooltip/index.d.ts +1 -0
- package/dist/components/tooltip/index.js +2 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.js +48 -0
- package/dist/lib/cn.d.ts +3 -0
- package/dist/lib/cn.js +29 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/theme.css +109 -0
- package/package.json +131 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { cn as e } from "../../lib/cn.js";
|
|
2
|
+
import { Search as t } from "lucide-react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { Command as i } from "cmdk";
|
|
5
|
+
//#region src/components/command/Command.tsx
|
|
6
|
+
var a = "flex w-full max-w-xl flex-col overflow-hidden rounded-large bg-surface-container text-on-surface";
|
|
7
|
+
function o({ className: t, ...r }) {
|
|
8
|
+
return /* @__PURE__ */ n(i, {
|
|
9
|
+
className: e(a, t),
|
|
10
|
+
...r
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function s({ className: a, ...o }) {
|
|
14
|
+
return /* @__PURE__ */ r("div", {
|
|
15
|
+
className: "flex h-14 shrink-0 items-center gap-3 border-b border-outline-variant px-4",
|
|
16
|
+
children: [/* @__PURE__ */ n(t, {
|
|
17
|
+
"aria-hidden": !0,
|
|
18
|
+
className: "size-5 shrink-0 text-on-surface-variant"
|
|
19
|
+
}), /* @__PURE__ */ n(i.Input, {
|
|
20
|
+
className: e("h-full w-full min-w-0 flex-1 bg-transparent text-body-large text-on-surface", "outline-none placeholder:text-on-surface-variant", "disabled:cursor-not-allowed disabled:opacity-[0.38]", a),
|
|
21
|
+
...o
|
|
22
|
+
})]
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function c({ className: t, ...r }) {
|
|
26
|
+
return /* @__PURE__ */ n(i.List, {
|
|
27
|
+
className: e("max-h-80 overflow-y-auto overscroll-contain py-2 outline-none", t),
|
|
28
|
+
...r
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function l({ className: t, ...r }) {
|
|
32
|
+
return /* @__PURE__ */ n(i.Empty, {
|
|
33
|
+
className: e("py-6 text-center text-body-medium text-on-surface-variant", t),
|
|
34
|
+
...r
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function u({ className: t, ...r }) {
|
|
38
|
+
return /* @__PURE__ */ n(i.Group, {
|
|
39
|
+
className: e("[&_[cmdk-group-heading]]:px-4 [&_[cmdk-group-heading]]:py-1", "[&_[cmdk-group-heading]]:text-label-small [&_[cmdk-group-heading]]:text-on-surface-variant", t),
|
|
40
|
+
...r
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function d({ className: t, ...r }) {
|
|
44
|
+
return /* @__PURE__ */ n(i.Item, {
|
|
45
|
+
className: e("flex min-h-12 cursor-pointer select-none items-center gap-3 px-4", "text-label-large text-on-surface outline-none transition-colors", "data-[selected=true]:bg-on-surface/[0.08]", "aria-disabled:cursor-not-allowed aria-disabled:opacity-[0.38]", t),
|
|
46
|
+
...r
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function f({ className: t, ...r }) {
|
|
50
|
+
return /* @__PURE__ */ n(i.Separator, {
|
|
51
|
+
className: e("my-2 h-px bg-outline-variant", t),
|
|
52
|
+
...r
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function p({ className: t, ...r }) {
|
|
56
|
+
return /* @__PURE__ */ n(i.Loading, {
|
|
57
|
+
className: e("px-4 py-2 text-body-small text-on-surface-variant", t),
|
|
58
|
+
...r
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function m({ className: t, ...r }) {
|
|
62
|
+
return /* @__PURE__ */ n("span", {
|
|
63
|
+
className: e("ml-auto rounded-extra-small bg-surface-container-high px-1.5 py-0.5", "text-label-small text-on-surface-variant", t),
|
|
64
|
+
...r
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function h({ className: t, overlayClassName: r, contentClassName: o, ...s }) {
|
|
68
|
+
return /* @__PURE__ */ n(i.Dialog, {
|
|
69
|
+
overlayClassName: e("fixed inset-0 z-40 bg-scrim", r),
|
|
70
|
+
contentClassName: e("fixed inset-x-0 top-[20vh] z-50 mx-auto w-full max-w-xl px-4", o),
|
|
71
|
+
className: e(a, "shadow-mm-3", t),
|
|
72
|
+
...s
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
var g = {
|
|
76
|
+
Root: o,
|
|
77
|
+
Input: s,
|
|
78
|
+
List: c,
|
|
79
|
+
Empty: l,
|
|
80
|
+
Group: u,
|
|
81
|
+
Item: d,
|
|
82
|
+
Separator: f,
|
|
83
|
+
Loading: p,
|
|
84
|
+
Shortcut: m,
|
|
85
|
+
Dialog: h
|
|
86
|
+
};
|
|
87
|
+
//#endregion
|
|
88
|
+
export { g as Command, h as CommandDialog, l as Empty, u as Group, s as Input, d as Item, c as List, p as Loading, o as Root, f as Separator, m as Shortcut };
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=Command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Command.js","names":[],"sources":["../../../src/components/command/Command.tsx"],"sourcesContent":["import { Command as CommandPrimitive } from 'cmdk'\nimport { Search } from 'lucide-react'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * Command — Material 3 styled wrapper over cmdk's headless command menu.\n * Behaviour/accessibility (filtering, keyboard navigation, combobox\n * semantics): cmdk (https://github.com/pacocoursey/cmdk).\n * Visuals: M3 search view + menu anatomy — surface-container, large corner,\n * 56dp search row with leading icon, 48dp label-large items with state\n * layers, label-small group subheaders.\n * Design refs: port/core/ui/components/search, dropdown (see CLAUDE.md).\n *\n * Compound API mirrors cmdk:\n * <Command.Root>\n * <Command.Input placeholder=\"Type a command…\" />\n * <Command.List>\n * <Command.Empty>No results found.</Command.Empty>\n * <Command.Group heading=\"Suggestions\">\n * <Command.Item value=\"calendar\" onSelect={…}>\n * <Calendar /> Open calendar <Command.Shortcut>⌘K</Command.Shortcut>\n * </Command.Item>\n * </Command.Group>\n * <Command.Separator />\n * </Command.List>\n * </Command.Root>\n *\n * For a modal palette, use <CommandDialog> (same children, minus Root).\n */\n\n/** Shared container look — applied by Root and reused by CommandDialog. */\nconst rootClasses =\n 'flex w-full max-w-xl flex-col overflow-hidden rounded-large bg-surface-container text-on-surface'\n\nfunction Root({\n className,\n ...props\n}: ComponentProps<typeof CommandPrimitive>) {\n return <CommandPrimitive className={cn(rootClasses, className)} {...props} />\n}\n\n/** Search row — M3 search view header: 56dp, leading icon, bare body-large input. */\nfunction Input({\n className,\n ...props\n}: ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div className=\"flex h-14 shrink-0 items-center gap-3 border-b border-outline-variant px-4\">\n <Search aria-hidden className=\"size-5 shrink-0 text-on-surface-variant\" />\n <CommandPrimitive.Input\n className={cn(\n 'h-full w-full min-w-0 flex-1 bg-transparent text-body-large text-on-surface',\n 'outline-none placeholder:text-on-surface-variant',\n 'disabled:cursor-not-allowed disabled:opacity-[0.38]',\n className,\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction List({\n className,\n ...props\n}: ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n className={cn(\n 'max-h-80 overflow-y-auto overscroll-contain py-2 outline-none',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Rendered by cmdk only when no item matches the query. */\nfunction Empty({\n className,\n ...props\n}: ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n className={cn(\n 'py-6 text-center text-body-medium text-on-surface-variant',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Group with optional `heading` — M3 list subheader: label-small, on-surface-variant. */\nfunction Group({\n className,\n ...props\n}: ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n className={cn(\n '[&_[cmdk-group-heading]]:px-4 [&_[cmdk-group-heading]]:py-1',\n '[&_[cmdk-group-heading]]:text-label-small [&_[cmdk-group-heading]]:text-on-surface-variant',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Command — M3 menu item: 48dp row, label-large, on-surface 8% selected layer. */\nfunction Item({\n className,\n ...props\n}: ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n className={cn(\n 'flex min-h-12 cursor-pointer select-none items-center gap-3 px-4',\n 'text-label-large text-on-surface outline-none transition-colors',\n 'data-[selected=true]:bg-on-surface/[0.08]',\n 'aria-disabled:cursor-not-allowed aria-disabled:opacity-[0.38]',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction Separator({\n className,\n ...props\n}: ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n className={cn('my-2 h-px bg-outline-variant', className)}\n {...props}\n />\n )\n}\n\n/** Render conditionally while resolving async items. */\nfunction Loading({\n className,\n ...props\n}: ComponentProps<typeof CommandPrimitive.Loading>) {\n return (\n <CommandPrimitive.Loading\n className={cn(\n 'px-4 py-2 text-body-small text-on-surface-variant',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Trailing keyboard-shortcut hint — not a cmdk part, just a styled span. */\nfunction Shortcut({ className, ...props }: ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n 'ml-auto rounded-extra-small bg-surface-container-high px-1.5 py-0.5',\n 'text-label-small text-on-surface-variant',\n className,\n )}\n {...props}\n />\n )\n}\n\n/**\n * Modal command palette — cmdk's Radix-based Dialog with M3 chrome:\n * full-screen scrim overlay, palette centered horizontally at ~20vh.\n * `className` styles the inner Command root; children are the usual\n * Input/List parts. Pass `label` for the accessible name.\n */\nfunction CommandDialog({\n className,\n overlayClassName,\n contentClassName,\n ...props\n}: ComponentProps<typeof CommandPrimitive.Dialog>) {\n return (\n <CommandPrimitive.Dialog\n overlayClassName={cn('fixed inset-0 z-40 bg-scrim', overlayClassName)}\n contentClassName={cn(\n 'fixed inset-x-0 top-[20vh] z-50 mx-auto w-full max-w-xl px-4',\n contentClassName,\n )}\n className={cn(rootClasses, 'shadow-mm-3', className)}\n {...props}\n />\n )\n}\n\nexport const Command = {\n Root,\n Input,\n List,\n Empty,\n Group,\n Item,\n Separator,\n Loading,\n Shortcut,\n Dialog: CommandDialog,\n}\nexport {\n Root,\n Input,\n List,\n Empty,\n Group,\n Item,\n Separator,\n Loading,\n Shortcut,\n CommandDialog,\n}\n"],"mappings":";;;;;AAiCA,IAAM,IACJ;AAEF,SAAS,EAAK,EACZ,cACA,GAAG,KACuC;CAC1C,OAAO,kBAAC,GAAD;EAAkB,WAAW,EAAG,GAAa,CAAS;EAAG,GAAI;CAAQ,CAAA;AAC9E;AAGA,SAAS,EAAM,EACb,cACA,GAAG,KAC6C;CAChD,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD;GAAQ,eAAA;GAAY,WAAU;EAA2C,CAAA,GACzE,kBAAC,EAAiB,OAAlB;GACE,WAAW,EACT,+EACA,oDACA,uDACA,CACF;GACA,GAAI;EACL,CAAA,CACE;;AAET;AAEA,SAAS,EAAK,EACZ,cACA,GAAG,KAC4C;CAC/C,OACE,kBAAC,EAAiB,MAAlB;EACE,WAAW,EACT,iEACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAM,EACb,cACA,GAAG,KAC6C;CAChD,OACE,kBAAC,EAAiB,OAAlB;EACE,WAAW,EACT,6DACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAM,EACb,cACA,GAAG,KAC6C;CAChD,OACE,kBAAC,EAAiB,OAAlB;EACE,WAAW,EACT,+DACA,8FACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAK,EACZ,cACA,GAAG,KAC4C;CAC/C,OACE,kBAAC,EAAiB,MAAlB;EACE,WAAW,EACT,oEACA,mEACA,6CACA,iEACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EACjB,cACA,GAAG,KACiD;CACpD,OACE,kBAAC,EAAiB,WAAlB;EACE,WAAW,EAAG,gCAAgC,CAAS;EACvD,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAQ,EACf,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,EAAiB,SAAlB;EACE,WAAW,EACT,qDACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAS,EAAE,cAAW,GAAG,KAAiC;CACjE,OACE,kBAAC,QAAD;EACE,WAAW,EACT,uEACA,4CACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAQA,SAAS,EAAc,EACrB,cACA,qBACA,qBACA,GAAG,KAC8C;CACjD,OACE,kBAAC,EAAiB,QAAlB;EACE,kBAAkB,EAAG,+BAA+B,CAAgB;EACpE,kBAAkB,EAChB,gEACA,CACF;EACA,WAAW,EAAG,GAAa,eAAe,CAAS;EACnD,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,IAAU;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,QAAQ;AACV"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Command, Root, Input, List, Empty, Group, Item, Separator, Loading, Shortcut, CommandDialog, } from './Command';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Command as e, CommandDialog as t, Empty as n, Group as r, Input as i, Item as a, List as o, Loading as s, Root as c, Separator as l, Shortcut as u } from "./Command.js";
|
|
2
|
+
export { e as Command, t as CommandDialog, n as Empty, r as Group, i as Input, a as Item, o as List, s as Loading, c as Root, l as Separator, u as Shortcut };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu';
|
|
2
|
+
import { ComponentProps } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* ContextMenu — Material 3 styled wrapper over Base UI's headless Context Menu.
|
|
5
|
+
* Behaviour/accessibility (right-click / long-press open, typeahead, roving
|
|
6
|
+
* focus, submenus): Base UI (https://base-ui.com/react/components/context-menu).
|
|
7
|
+
* Visuals: M3 menu anatomy — surface-container at elevation 2, small (8px)
|
|
8
|
+
* corner, 48px label-large items with leading/trailing slots, state layers.
|
|
9
|
+
* Design ref: port/core/ui/components/dropdown + overflow-menu (see CLAUDE.md).
|
|
10
|
+
*
|
|
11
|
+
* Compound API mirrors Base UI:
|
|
12
|
+
* <ContextMenu.Root>
|
|
13
|
+
* <ContextMenu.Trigger>Right-click me</ContextMenu.Trigger>
|
|
14
|
+
* <ContextMenu.Portal>
|
|
15
|
+
* <ContextMenu.Positioner>
|
|
16
|
+
* <ContextMenu.Popup>
|
|
17
|
+
* <ContextMenu.Item>Copy</ContextMenu.Item>
|
|
18
|
+
* <ContextMenu.Separator />
|
|
19
|
+
* <ContextMenu.SubmenuRoot>
|
|
20
|
+
* <ContextMenu.SubmenuTrigger>Share</ContextMenu.SubmenuTrigger>
|
|
21
|
+
* …
|
|
22
|
+
* </ContextMenu.SubmenuRoot>
|
|
23
|
+
* </ContextMenu.Popup>
|
|
24
|
+
* </ContextMenu.Positioner>
|
|
25
|
+
* </ContextMenu.Portal>
|
|
26
|
+
* </ContextMenu.Root>
|
|
27
|
+
*/
|
|
28
|
+
declare const Root: typeof BaseContextMenu.Root;
|
|
29
|
+
declare const Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').ContextMenuPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
|
|
30
|
+
declare const SubmenuRoot: typeof BaseContextMenu.SubmenuRoot;
|
|
31
|
+
/** Area that opens the menu on right click or long press. */
|
|
32
|
+
declare function Trigger({ className, ...props }: ComponentProps<typeof BaseContextMenu.Trigger>): import("react").JSX.Element;
|
|
33
|
+
/** Invisible click-capture layer behind the menu (context menus use no scrim). */
|
|
34
|
+
declare function Backdrop({ className, ...props }: ComponentProps<typeof BaseContextMenu.Backdrop>): import("react").JSX.Element;
|
|
35
|
+
declare function Positioner({ className, ...props }: ComponentProps<typeof BaseContextMenu.Positioner>): import("react").JSX.Element;
|
|
36
|
+
declare function Popup({ className, ...props }: ComponentProps<typeof BaseContextMenu.Popup>): import("react").JSX.Element;
|
|
37
|
+
/** Optional pointer toward the anchor — rarely used for menus; unstyled hook point. */
|
|
38
|
+
declare function Arrow({ className, ...props }: ComponentProps<typeof BaseContextMenu.Arrow>): import("react").JSX.Element;
|
|
39
|
+
declare function Group({ className, ...props }: ComponentProps<typeof BaseContextMenu.Group>): import("react").JSX.Element;
|
|
40
|
+
declare function GroupLabel({ className, ...props }: ComponentProps<typeof BaseContextMenu.GroupLabel>): import("react").JSX.Element;
|
|
41
|
+
declare function Item({ className, ...props }: ComponentProps<typeof BaseContextMenu.Item>): import("react").JSX.Element;
|
|
42
|
+
/** Menu item that renders an anchor element. */
|
|
43
|
+
declare function LinkItem({ className, ...props }: ComponentProps<typeof BaseContextMenu.LinkItem>): import("react").JSX.Element;
|
|
44
|
+
declare function CheckboxItem({ className, ...props }: ComponentProps<typeof BaseContextMenu.CheckboxItem>): import("react").JSX.Element;
|
|
45
|
+
/** Leading 20px slot for the check mark — pass `keepMounted` to hold alignment. */
|
|
46
|
+
declare function CheckboxItemIndicator({ className, ...props }: ComponentProps<typeof BaseContextMenu.CheckboxItemIndicator>): import("react").JSX.Element;
|
|
47
|
+
declare function RadioGroup({ className, ...props }: ComponentProps<typeof BaseContextMenu.RadioGroup>): import("react").JSX.Element;
|
|
48
|
+
declare function RadioItem({ className, ...props }: ComponentProps<typeof BaseContextMenu.RadioItem>): import("react").JSX.Element;
|
|
49
|
+
/** Leading 20px slot for the selected mark — pass `keepMounted` to hold alignment. */
|
|
50
|
+
declare function RadioItemIndicator({ className, ...props }: ComponentProps<typeof BaseContextMenu.RadioItemIndicator>): import("react").JSX.Element;
|
|
51
|
+
/** Item that opens a nested menu; renders a trailing chevron automatically. */
|
|
52
|
+
declare function SubmenuTrigger({ className, children, ...props }: ComponentProps<typeof BaseContextMenu.SubmenuTrigger>): import("react").JSX.Element;
|
|
53
|
+
/** M3 divider between menu sections. */
|
|
54
|
+
declare function Separator({ className, ...props }: ComponentProps<typeof BaseContextMenu.Separator>): import("react").JSX.Element;
|
|
55
|
+
export declare const ContextMenu: {
|
|
56
|
+
Root: typeof BaseContextMenu.Root;
|
|
57
|
+
Trigger: typeof Trigger;
|
|
58
|
+
Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').ContextMenuPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
|
|
59
|
+
Backdrop: typeof Backdrop;
|
|
60
|
+
Positioner: typeof Positioner;
|
|
61
|
+
Popup: typeof Popup;
|
|
62
|
+
Arrow: typeof Arrow;
|
|
63
|
+
Group: typeof Group;
|
|
64
|
+
GroupLabel: typeof GroupLabel;
|
|
65
|
+
Item: typeof Item;
|
|
66
|
+
LinkItem: typeof LinkItem;
|
|
67
|
+
CheckboxItem: typeof CheckboxItem;
|
|
68
|
+
CheckboxItemIndicator: typeof CheckboxItemIndicator;
|
|
69
|
+
RadioGroup: typeof RadioGroup;
|
|
70
|
+
RadioItem: typeof RadioItem;
|
|
71
|
+
RadioItemIndicator: typeof RadioItemIndicator;
|
|
72
|
+
SubmenuRoot: typeof BaseContextMenu.SubmenuRoot;
|
|
73
|
+
SubmenuTrigger: typeof SubmenuTrigger;
|
|
74
|
+
Separator: typeof Separator;
|
|
75
|
+
};
|
|
76
|
+
export { Root, Trigger, Portal, Backdrop, Positioner, Popup, Arrow, Group, GroupLabel, Item, LinkItem, CheckboxItem, CheckboxItemIndicator, RadioGroup, RadioItem, RadioItemIndicator, SubmenuRoot, SubmenuTrigger, Separator, };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { cn as e } from "../../lib/cn.js";
|
|
2
|
+
import { ChevronRight as t } from "lucide-react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { ContextMenu as i } from "@base-ui/react/context-menu";
|
|
5
|
+
//#region src/components/context-menu/ContextMenu.tsx
|
|
6
|
+
var a = i.Root, o = i.Portal, s = i.SubmenuRoot;
|
|
7
|
+
function c({ className: t, ...r }) {
|
|
8
|
+
return /* @__PURE__ */ n(i.Trigger, {
|
|
9
|
+
className: e("select-none", t),
|
|
10
|
+
...r
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function l({ className: t, ...r }) {
|
|
14
|
+
return /* @__PURE__ */ n(i.Backdrop, {
|
|
15
|
+
className: e("fixed inset-0 z-40", t),
|
|
16
|
+
...r
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function u({ className: t, ...r }) {
|
|
20
|
+
return /* @__PURE__ */ n(i.Positioner, {
|
|
21
|
+
className: e("z-50 outline-none", t),
|
|
22
|
+
...r
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function d({ className: t, ...r }) {
|
|
26
|
+
return /* @__PURE__ */ n(i.Popup, {
|
|
27
|
+
className: e("flex max-h-[310px] min-w-[112px] max-w-[280px] flex-col overflow-y-auto", "rounded-small bg-surface-container py-2 text-on-surface shadow-mm-2", "origin-(--transform-origin) transition-[opacity,transform] duration-150 ease-out focus:outline-none", "data-[starting-style]:scale-95 data-[starting-style]:opacity-0", "data-[ending-style]:scale-95 data-[ending-style]:opacity-0", t),
|
|
28
|
+
...r
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function f({ className: t, ...r }) {
|
|
32
|
+
return /* @__PURE__ */ n(i.Arrow, {
|
|
33
|
+
className: e(t),
|
|
34
|
+
...r
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function p({ className: t, ...r }) {
|
|
38
|
+
return /* @__PURE__ */ n(i.Group, {
|
|
39
|
+
className: e("flex flex-col", t),
|
|
40
|
+
...r
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function m({ className: t, ...r }) {
|
|
44
|
+
return /* @__PURE__ */ n(i.GroupLabel, {
|
|
45
|
+
className: e("px-3 py-2 text-label-small text-on-surface-variant", t),
|
|
46
|
+
...r
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
var h = e("flex h-12 cursor-pointer select-none items-center gap-3 pl-3 pr-6", "text-label-large text-on-surface outline-none transition-colors", "data-[highlighted]:bg-on-surface/[0.08]", "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-[0.38]");
|
|
50
|
+
function g({ className: t, ...r }) {
|
|
51
|
+
return /* @__PURE__ */ n(i.Item, {
|
|
52
|
+
className: e(h, t),
|
|
53
|
+
...r
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function _({ className: t, ...r }) {
|
|
57
|
+
return /* @__PURE__ */ n(i.LinkItem, {
|
|
58
|
+
className: e(h, "no-underline", t),
|
|
59
|
+
...r
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function v({ className: t, ...r }) {
|
|
63
|
+
return /* @__PURE__ */ n(i.CheckboxItem, {
|
|
64
|
+
className: e(h, t),
|
|
65
|
+
...r
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function y({ className: t, ...r }) {
|
|
69
|
+
return /* @__PURE__ */ n(i.CheckboxItemIndicator, {
|
|
70
|
+
className: e("flex size-5 shrink-0 items-center justify-center text-on-surface data-[unchecked]:invisible", t),
|
|
71
|
+
...r
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function b({ className: t, ...r }) {
|
|
75
|
+
return /* @__PURE__ */ n(i.RadioGroup, {
|
|
76
|
+
className: e("flex flex-col", t),
|
|
77
|
+
...r
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function x({ className: t, ...r }) {
|
|
81
|
+
return /* @__PURE__ */ n(i.RadioItem, {
|
|
82
|
+
className: e(h, t),
|
|
83
|
+
...r
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function S({ className: t, ...r }) {
|
|
87
|
+
return /* @__PURE__ */ n(i.RadioItemIndicator, {
|
|
88
|
+
className: e("flex size-5 shrink-0 items-center justify-center text-on-surface data-[unchecked]:invisible", t),
|
|
89
|
+
...r
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function C({ className: a, children: o, ...s }) {
|
|
93
|
+
return /* @__PURE__ */ r(i.SubmenuTrigger, {
|
|
94
|
+
className: e(h, "data-[popup-open]:bg-on-surface/[0.08]", a),
|
|
95
|
+
...s,
|
|
96
|
+
children: [o, /* @__PURE__ */ n(t, {
|
|
97
|
+
"aria-hidden": !0,
|
|
98
|
+
className: "ml-auto size-5 shrink-0 text-on-surface-variant"
|
|
99
|
+
})]
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function w({ className: t, ...r }) {
|
|
103
|
+
return /* @__PURE__ */ n(i.Separator, {
|
|
104
|
+
className: e("my-2 h-px shrink-0 bg-outline-variant", t),
|
|
105
|
+
...r
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
var T = {
|
|
109
|
+
Root: a,
|
|
110
|
+
Trigger: c,
|
|
111
|
+
Portal: o,
|
|
112
|
+
Backdrop: l,
|
|
113
|
+
Positioner: u,
|
|
114
|
+
Popup: d,
|
|
115
|
+
Arrow: f,
|
|
116
|
+
Group: p,
|
|
117
|
+
GroupLabel: m,
|
|
118
|
+
Item: g,
|
|
119
|
+
LinkItem: _,
|
|
120
|
+
CheckboxItem: v,
|
|
121
|
+
CheckboxItemIndicator: y,
|
|
122
|
+
RadioGroup: b,
|
|
123
|
+
RadioItem: x,
|
|
124
|
+
RadioItemIndicator: S,
|
|
125
|
+
SubmenuRoot: s,
|
|
126
|
+
SubmenuTrigger: C,
|
|
127
|
+
Separator: w
|
|
128
|
+
};
|
|
129
|
+
//#endregion
|
|
130
|
+
export { f as Arrow, l as Backdrop, v as CheckboxItem, y as CheckboxItemIndicator, T as ContextMenu, p as Group, m as GroupLabel, g as Item, _ as LinkItem, d as Popup, o as Portal, u as Positioner, b as RadioGroup, x as RadioItem, S as RadioItemIndicator, a as Root, w as Separator, s as SubmenuRoot, C as SubmenuTrigger, c as Trigger };
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=ContextMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.js","names":[],"sources":["../../../src/components/context-menu/ContextMenu.tsx"],"sourcesContent":["import { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * ContextMenu — Material 3 styled wrapper over Base UI's headless Context Menu.\n * Behaviour/accessibility (right-click / long-press open, typeahead, roving\n * focus, submenus): Base UI (https://base-ui.com/react/components/context-menu).\n * Visuals: M3 menu anatomy — surface-container at elevation 2, small (8px)\n * corner, 48px label-large items with leading/trailing slots, state layers.\n * Design ref: port/core/ui/components/dropdown + overflow-menu (see CLAUDE.md).\n *\n * Compound API mirrors Base UI:\n * <ContextMenu.Root>\n * <ContextMenu.Trigger>Right-click me</ContextMenu.Trigger>\n * <ContextMenu.Portal>\n * <ContextMenu.Positioner>\n * <ContextMenu.Popup>\n * <ContextMenu.Item>Copy</ContextMenu.Item>\n * <ContextMenu.Separator />\n * <ContextMenu.SubmenuRoot>\n * <ContextMenu.SubmenuTrigger>Share</ContextMenu.SubmenuTrigger>\n * …\n * </ContextMenu.SubmenuRoot>\n * </ContextMenu.Popup>\n * </ContextMenu.Positioner>\n * </ContextMenu.Portal>\n * </ContextMenu.Root>\n */\n\nconst Root = BaseContextMenu.Root\nconst Portal = BaseContextMenu.Portal\nconst SubmenuRoot = BaseContextMenu.SubmenuRoot\n\n/** Area that opens the menu on right click or long press. */\nfunction Trigger({ className, ...props }: ComponentProps<typeof BaseContextMenu.Trigger>) {\n return <BaseContextMenu.Trigger className={cn('select-none', className)} {...props} />\n}\n\n/** Invisible click-capture layer behind the menu (context menus use no scrim). */\nfunction Backdrop({ className, ...props }: ComponentProps<typeof BaseContextMenu.Backdrop>) {\n return <BaseContextMenu.Backdrop className={cn('fixed inset-0 z-40', className)} {...props} />\n}\n\nfunction Positioner({ className, ...props }: ComponentProps<typeof BaseContextMenu.Positioner>) {\n return (\n <BaseContextMenu.Positioner className={cn('z-50 outline-none', className)} {...props} />\n )\n}\n\nfunction Popup({ className, ...props }: ComponentProps<typeof BaseContextMenu.Popup>) {\n return (\n <BaseContextMenu.Popup\n className={cn(\n 'flex max-h-[310px] min-w-[112px] max-w-[280px] flex-col overflow-y-auto',\n 'rounded-small bg-surface-container py-2 text-on-surface shadow-mm-2',\n 'origin-(--transform-origin) transition-[opacity,transform] duration-150 ease-out focus:outline-none',\n 'data-[starting-style]:scale-95 data-[starting-style]:opacity-0',\n 'data-[ending-style]:scale-95 data-[ending-style]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Optional pointer toward the anchor — rarely used for menus; unstyled hook point. */\nfunction Arrow({ className, ...props }: ComponentProps<typeof BaseContextMenu.Arrow>) {\n return <BaseContextMenu.Arrow className={cn(className)} {...props} />\n}\n\nfunction Group({ className, ...props }: ComponentProps<typeof BaseContextMenu.Group>) {\n return <BaseContextMenu.Group className={cn('flex flex-col', className)} {...props} />\n}\n\nfunction GroupLabel({ className, ...props }: ComponentProps<typeof BaseContextMenu.GroupLabel>) {\n return (\n <BaseContextMenu.GroupLabel\n className={cn('px-3 py-2 text-label-small text-on-surface-variant', className)}\n {...props}\n />\n )\n}\n\n/** Shared M3 list-item recipe: 48px row, label-large, state layers. */\nconst itemClasses = cn(\n 'flex h-12 cursor-pointer select-none items-center gap-3 pl-3 pr-6',\n 'text-label-large text-on-surface outline-none transition-colors',\n 'data-[highlighted]:bg-on-surface/[0.08]',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-[0.38]',\n)\n\nfunction Item({ className, ...props }: ComponentProps<typeof BaseContextMenu.Item>) {\n return <BaseContextMenu.Item className={cn(itemClasses, className)} {...props} />\n}\n\n/** Menu item that renders an anchor element. */\nfunction LinkItem({ className, ...props }: ComponentProps<typeof BaseContextMenu.LinkItem>) {\n return (\n <BaseContextMenu.LinkItem\n className={cn(itemClasses, 'no-underline', className)}\n {...props}\n />\n )\n}\n\nfunction CheckboxItem({ className, ...props }: ComponentProps<typeof BaseContextMenu.CheckboxItem>) {\n return <BaseContextMenu.CheckboxItem className={cn(itemClasses, className)} {...props} />\n}\n\n/** Leading 20px slot for the check mark — pass `keepMounted` to hold alignment. */\nfunction CheckboxItemIndicator({\n className,\n ...props\n}: ComponentProps<typeof BaseContextMenu.CheckboxItemIndicator>) {\n return (\n <BaseContextMenu.CheckboxItemIndicator\n className={cn(\n 'flex size-5 shrink-0 items-center justify-center text-on-surface data-[unchecked]:invisible',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction RadioGroup({ className, ...props }: ComponentProps<typeof BaseContextMenu.RadioGroup>) {\n return <BaseContextMenu.RadioGroup className={cn('flex flex-col', className)} {...props} />\n}\n\nfunction RadioItem({ className, ...props }: ComponentProps<typeof BaseContextMenu.RadioItem>) {\n return <BaseContextMenu.RadioItem className={cn(itemClasses, className)} {...props} />\n}\n\n/** Leading 20px slot for the selected mark — pass `keepMounted` to hold alignment. */\nfunction RadioItemIndicator({\n className,\n ...props\n}: ComponentProps<typeof BaseContextMenu.RadioItemIndicator>) {\n return (\n <BaseContextMenu.RadioItemIndicator\n className={cn(\n 'flex size-5 shrink-0 items-center justify-center text-on-surface data-[unchecked]:invisible',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Item that opens a nested menu; renders a trailing chevron automatically. */\nfunction SubmenuTrigger({\n className,\n children,\n ...props\n}: ComponentProps<typeof BaseContextMenu.SubmenuTrigger>) {\n return (\n <BaseContextMenu.SubmenuTrigger\n className={cn(itemClasses, 'data-[popup-open]:bg-on-surface/[0.08]', className)}\n {...props}\n >\n {children}\n <ChevronRight aria-hidden className=\"ml-auto size-5 shrink-0 text-on-surface-variant\" />\n </BaseContextMenu.SubmenuTrigger>\n )\n}\n\n/** M3 divider between menu sections. */\nfunction Separator({ className, ...props }: ComponentProps<typeof BaseContextMenu.Separator>) {\n return (\n <BaseContextMenu.Separator\n className={cn('my-2 h-px shrink-0 bg-outline-variant', className)}\n {...props}\n />\n )\n}\n\nexport const ContextMenu = {\n Root,\n Trigger,\n Portal,\n Backdrop,\n Positioner,\n Popup,\n Arrow,\n Group,\n GroupLabel,\n Item,\n LinkItem,\n CheckboxItem,\n CheckboxItemIndicator,\n RadioGroup,\n RadioItem,\n RadioItemIndicator,\n SubmenuRoot,\n SubmenuTrigger,\n Separator,\n}\nexport {\n Root,\n Trigger,\n Portal,\n Backdrop,\n Positioner,\n Popup,\n Arrow,\n Group,\n GroupLabel,\n Item,\n LinkItem,\n CheckboxItem,\n CheckboxItemIndicator,\n RadioGroup,\n RadioItem,\n RadioItemIndicator,\n SubmenuRoot,\n SubmenuTrigger,\n Separator,\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ContextMenu, Root, Trigger, Portal, Backdrop, Positioner, Popup, Arrow, Group, GroupLabel, Item, LinkItem, CheckboxItem, CheckboxItemIndicator, RadioGroup, RadioItem, RadioItemIndicator, SubmenuRoot, SubmenuTrigger, Separator, } from './ContextMenu';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Arrow as e, Backdrop as t, CheckboxItem as n, CheckboxItemIndicator as r, ContextMenu as i, Group as a, GroupLabel as o, Item as s, LinkItem as c, Popup as l, Portal as u, Positioner as d, RadioGroup as f, RadioItem as p, RadioItemIndicator as m, Root as h, Separator as g, SubmenuRoot as _, SubmenuTrigger as v, Trigger as y } from "./ContextMenu.js";
|
|
2
|
+
export { e as Arrow, t as Backdrop, n as CheckboxItem, r as CheckboxItemIndicator, i as ContextMenu, a as Group, o as GroupLabel, s as Item, c as LinkItem, l as Popup, u as Portal, d as Positioner, f as RadioGroup, p as RadioItem, m as RadioItemIndicator, h as Root, g as Separator, _ as SubmenuRoot, v as SubmenuTrigger, y as Trigger };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ColumnDef } from '@tanstack/react-table';
|
|
2
|
+
/**
|
|
3
|
+
* DataTable — TanStack Table (https://tanstack.com/table) as the headless
|
|
4
|
+
* engine, the port Table family as the M3 skin. This is the recommended way
|
|
5
|
+
* to build data tables in this app; the bare Table parts remain for static
|
|
6
|
+
* layouts.
|
|
7
|
+
*
|
|
8
|
+
* const columns: Array<ColumnDef<Row>> = [
|
|
9
|
+
* { accessorKey: 'name', header: 'Name' },
|
|
10
|
+
* { accessorKey: 'role', header: 'Role', enableSorting: false },
|
|
11
|
+
* ]
|
|
12
|
+
* <DataTable columns={columns} data={rows} pageSize={10} enableRowSelection />
|
|
13
|
+
*
|
|
14
|
+
* Sorting: sortable headers toggle asc/desc with M3 arrow affordances and
|
|
15
|
+
* aria-sort. `pageSize` adds the table footer (range label + Pagination).
|
|
16
|
+
* `enableRowSelection` injects a leading port-checkbox column with a
|
|
17
|
+
* select-all parent; selected rows tint secondary-container.
|
|
18
|
+
*/
|
|
19
|
+
type DataTableProps<TData> = {
|
|
20
|
+
columns: Array<ColumnDef<TData, any>>;
|
|
21
|
+
data: Array<TData>;
|
|
22
|
+
/** Rows per page; enables the pagination footer when set. */
|
|
23
|
+
pageSize?: number;
|
|
24
|
+
/** Leading checkbox column with select-all. */
|
|
25
|
+
enableRowSelection?: boolean;
|
|
26
|
+
/** Notified with the selected row data when selection changes. */
|
|
27
|
+
onRowSelectionChange?: (rows: Array<TData>) => void;
|
|
28
|
+
className?: string;
|
|
29
|
+
};
|
|
30
|
+
declare function DataTable<TData>({ columns, data, pageSize, enableRowSelection, onRowSelectionChange, className, }: DataTableProps<TData>): import("react").JSX.Element;
|
|
31
|
+
export { DataTable };
|
|
32
|
+
export type { ColumnDef };
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { cn as e } from "../../lib/cn.js";
|
|
2
|
+
import { Checkbox as t } from "../checkbox/Checkbox.js";
|
|
3
|
+
import { Table as n } from "./Table.js";
|
|
4
|
+
import { Pagination as r } from "../pagination/Pagination.js";
|
|
5
|
+
import { ArrowDown as i, ArrowUp as a, ChevronsUpDown as o } from "lucide-react";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
import { useMemo as l, useState as u } from "react";
|
|
8
|
+
import { flexRender as d, getCoreRowModel as f, getPaginationRowModel as p, getSortedRowModel as m, useReactTable as h } from "@tanstack/react-table";
|
|
9
|
+
//#region src/components/data-table/DataTable.tsx
|
|
10
|
+
function g() {
|
|
11
|
+
return {
|
|
12
|
+
id: "select",
|
|
13
|
+
enableSorting: !1,
|
|
14
|
+
header: ({ table: e }) => /* @__PURE__ */ s(t, {
|
|
15
|
+
ariaLabel: "Select all rows",
|
|
16
|
+
checked: e.getIsAllRowsSelected(),
|
|
17
|
+
indeterminate: e.getIsSomeRowsSelected(),
|
|
18
|
+
onCheckedChange: () => e.toggleAllRowsSelected()
|
|
19
|
+
}),
|
|
20
|
+
cell: ({ row: e }) => /* @__PURE__ */ s(t, {
|
|
21
|
+
ariaLabel: "Select row",
|
|
22
|
+
checked: e.getIsSelected(),
|
|
23
|
+
disabled: !e.getCanSelect(),
|
|
24
|
+
onCheckedChange: (t) => e.toggleSelected(t === !0)
|
|
25
|
+
})
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function _({ columns: t, data: _, pageSize: v, enableRowSelection: y = !1, onRowSelectionChange: b, className: x }) {
|
|
29
|
+
let [S, C] = u([]), [w, T] = u({}), E = h({
|
|
30
|
+
data: _,
|
|
31
|
+
columns: l(() => y ? [g(), ...t] : t, [t, y]),
|
|
32
|
+
state: {
|
|
33
|
+
sorting: S,
|
|
34
|
+
rowSelection: w
|
|
35
|
+
},
|
|
36
|
+
onSortingChange: C,
|
|
37
|
+
onRowSelectionChange: (e) => {
|
|
38
|
+
T((t) => {
|
|
39
|
+
let n = typeof e == "function" ? e(t) : e;
|
|
40
|
+
return b && queueMicrotask(() => b(E.getSelectedRowModel().rows.map((e) => e.original))), n;
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
enableRowSelection: y,
|
|
44
|
+
getCoreRowModel: f(),
|
|
45
|
+
getSortedRowModel: m(),
|
|
46
|
+
...v ? {
|
|
47
|
+
getPaginationRowModel: p(),
|
|
48
|
+
initialState: { pagination: { pageSize: v } }
|
|
49
|
+
} : {}
|
|
50
|
+
}), { pageIndex: D } = E.getState().pagination, O = E.getPrePaginationRowModel().rows.length;
|
|
51
|
+
return /* @__PURE__ */ c("div", {
|
|
52
|
+
className: e("flex flex-col gap-2", x),
|
|
53
|
+
children: [/* @__PURE__ */ c(n, { children: [/* @__PURE__ */ s(n.Head, { children: E.getHeaderGroups().map((t) => /* @__PURE__ */ s(n.Row, {
|
|
54
|
+
className: "odd:bg-transparent",
|
|
55
|
+
children: t.headers.map((t) => {
|
|
56
|
+
let r = t.column.getIsSorted();
|
|
57
|
+
return /* @__PURE__ */ s(n.HeaderCell, {
|
|
58
|
+
"aria-sort": r === "asc" ? "ascending" : r === "desc" ? "descending" : void 0,
|
|
59
|
+
children: t.isPlaceholder ? null : t.column.getCanSort() ? /* @__PURE__ */ c("button", {
|
|
60
|
+
type: "button",
|
|
61
|
+
onClick: t.column.getToggleSortingHandler(),
|
|
62
|
+
className: e("flex cursor-pointer items-center gap-1 rounded-extra-small", "transition-colors hover:text-on-surface", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"),
|
|
63
|
+
children: [d(t.column.columnDef.header, t.getContext()), r === "asc" ? /* @__PURE__ */ s(a, {
|
|
64
|
+
"aria-hidden": !0,
|
|
65
|
+
className: "size-4 text-on-surface"
|
|
66
|
+
}) : r === "desc" ? /* @__PURE__ */ s(i, {
|
|
67
|
+
"aria-hidden": !0,
|
|
68
|
+
className: "size-4 text-on-surface"
|
|
69
|
+
}) : /* @__PURE__ */ s(o, {
|
|
70
|
+
"aria-hidden": !0,
|
|
71
|
+
className: "size-4 text-on-surface-variant"
|
|
72
|
+
})]
|
|
73
|
+
}) : d(t.column.columnDef.header, t.getContext())
|
|
74
|
+
}, t.id);
|
|
75
|
+
})
|
|
76
|
+
}, t.id)) }), /* @__PURE__ */ s(n.Body, { children: E.getRowModel().rows.map((e) => /* @__PURE__ */ s(n.Row, {
|
|
77
|
+
className: e.getIsSelected() ? "bg-secondary-container/40 odd:bg-secondary-container/40" : void 0,
|
|
78
|
+
children: e.getVisibleCells().map((e) => /* @__PURE__ */ s(n.Cell, { children: d(e.column.columnDef.cell, e.getContext()) }, e.id))
|
|
79
|
+
}, e.id)) })] }), v !== void 0 && O > 0 && /* @__PURE__ */ c("div", {
|
|
80
|
+
className: "flex items-center justify-between px-4",
|
|
81
|
+
children: [/* @__PURE__ */ c("span", {
|
|
82
|
+
className: "text-body-small text-on-surface-variant",
|
|
83
|
+
children: [
|
|
84
|
+
D * v + 1,
|
|
85
|
+
"–",
|
|
86
|
+
Math.min((D + 1) * v, O),
|
|
87
|
+
" of",
|
|
88
|
+
" ",
|
|
89
|
+
O
|
|
90
|
+
]
|
|
91
|
+
}), /* @__PURE__ */ s(r, {
|
|
92
|
+
count: E.getPageCount(),
|
|
93
|
+
page: D + 1,
|
|
94
|
+
onPageChange: (e) => E.setPageIndex(e - 1)
|
|
95
|
+
})]
|
|
96
|
+
})]
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
export { _ as DataTable };
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=DataTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.js","names":[],"sources":["../../../src/components/data-table/DataTable.tsx"],"sourcesContent":["import { useMemo, useState } from 'react'\nimport {\n flexRender,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { ArrowDown, ArrowUp, ChevronsUpDown } from 'lucide-react'\nimport { Checkbox } from '#/components/checkbox'\nimport { Pagination } from '#/components/pagination'\nimport { cn } from '#/lib/cn'\nimport { Table } from './Table'\n\nimport type { ColumnDef, RowSelectionState, SortingState } from '@tanstack/react-table'\n\n/**\n * DataTable — TanStack Table (https://tanstack.com/table) as the headless\n * engine, the port Table family as the M3 skin. This is the recommended way\n * to build data tables in this app; the bare Table parts remain for static\n * layouts.\n *\n * const columns: Array<ColumnDef<Row>> = [\n * { accessorKey: 'name', header: 'Name' },\n * { accessorKey: 'role', header: 'Role', enableSorting: false },\n * ]\n * <DataTable columns={columns} data={rows} pageSize={10} enableRowSelection />\n *\n * Sorting: sortable headers toggle asc/desc with M3 arrow affordances and\n * aria-sort. `pageSize` adds the table footer (range label + Pagination).\n * `enableRowSelection` injects a leading port-checkbox column with a\n * select-all parent; selected rows tint secondary-container.\n */\n\ntype DataTableProps<TData> = {\n columns: Array<ColumnDef<TData, any>>\n data: Array<TData>\n /** Rows per page; enables the pagination footer when set. */\n pageSize?: number\n /** Leading checkbox column with select-all. */\n enableRowSelection?: boolean\n /** Notified with the selected row data when selection changes. */\n onRowSelectionChange?: (rows: Array<TData>) => void\n className?: string\n}\n\nfunction selectionColumn<TData>(): ColumnDef<TData, unknown> {\n return {\n id: 'select',\n enableSorting: false,\n header: ({ table }) => (\n <Checkbox\n ariaLabel=\"Select all rows\"\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n ariaLabel=\"Select row\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={(checked) => row.toggleSelected(checked === true)}\n />\n ),\n }\n}\n\nfunction DataTable<TData>({\n columns,\n data,\n pageSize,\n enableRowSelection = false,\n onRowSelectionChange,\n className,\n}: DataTableProps<TData>) {\n const [sorting, setSorting] = useState<SortingState>([])\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n\n const allColumns = useMemo(\n () => (enableRowSelection ? [selectionColumn<TData>(), ...columns] : columns),\n [columns, enableRowSelection],\n )\n\n const table = useReactTable({\n data,\n columns: allColumns,\n state: { sorting, rowSelection },\n onSortingChange: setSorting,\n onRowSelectionChange: (updater) => {\n setRowSelection((prev) => {\n const next = typeof updater === 'function' ? updater(prev) : updater\n if (onRowSelectionChange) {\n queueMicrotask(() =>\n onRowSelectionChange(\n table\n .getSelectedRowModel()\n .rows.map((r) => r.original),\n ),\n )\n }\n return next\n })\n },\n enableRowSelection,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n ...(pageSize\n ? {\n getPaginationRowModel: getPaginationRowModel(),\n initialState: { pagination: { pageSize } },\n }\n : {}),\n })\n\n const { pageIndex } = table.getState().pagination\n const totalRows = table.getPrePaginationRowModel().rows.length\n\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n <Table>\n <Table.Head>\n {table.getHeaderGroups().map((headerGroup) => (\n <Table.Row key={headerGroup.id} className=\"odd:bg-transparent\">\n {headerGroup.headers.map((header) => {\n const sortDir = header.column.getIsSorted()\n return (\n <Table.HeaderCell\n key={header.id}\n aria-sort={\n sortDir === 'asc'\n ? 'ascending'\n : sortDir === 'desc'\n ? 'descending'\n : undefined\n }\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <button\n type=\"button\"\n onClick={header.column.getToggleSortingHandler()}\n className={cn(\n 'flex cursor-pointer items-center gap-1 rounded-extra-small',\n 'transition-colors hover:text-on-surface',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary',\n )}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sortDir === 'asc' ? (\n <ArrowUp aria-hidden className=\"size-4 text-on-surface\" />\n ) : sortDir === 'desc' ? (\n <ArrowDown aria-hidden className=\"size-4 text-on-surface\" />\n ) : (\n <ChevronsUpDown aria-hidden className=\"size-4 text-on-surface-variant\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </Table.HeaderCell>\n )\n })}\n </Table.Row>\n ))}\n </Table.Head>\n <Table.Body>\n {table.getRowModel().rows.map((row) => (\n <Table.Row\n key={row.id}\n className={\n row.getIsSelected()\n ? 'bg-secondary-container/40 odd:bg-secondary-container/40'\n : undefined\n }\n >\n {row.getVisibleCells().map((cell) => (\n <Table.Cell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Cell>\n ))}\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n\n {pageSize !== undefined && totalRows > 0 && (\n <div className=\"flex items-center justify-between px-4\">\n <span className=\"text-body-small text-on-surface-variant\">\n {pageIndex * pageSize + 1}–{Math.min((pageIndex + 1) * pageSize, totalRows)} of{' '}\n {totalRows}\n </span>\n <Pagination\n count={table.getPageCount()}\n page={pageIndex + 1}\n onPageChange={(page) => table.setPageIndex(page - 1)}\n />\n </div>\n )}\n </div>\n )\n}\n\nexport { DataTable }\nexport type { ColumnDef }\n"],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Table — ported from port/core/ui/components/data-table (see CLAUDE.md):
|
|
4
|
+
* auto-layout table in an overflow-auto shell, surface-container header
|
|
5
|
+
* (body-medium, 500), zebra body rows (odd rows surface-container/50),
|
|
6
|
+
* 16/12px cell padding, body-medium cells on body-small base.
|
|
7
|
+
*
|
|
8
|
+
* Compound API mirrors the port:
|
|
9
|
+
* <Table>
|
|
10
|
+
* <Table.Head>
|
|
11
|
+
* <Table.Row>
|
|
12
|
+
* <Table.HeaderCell>Name</Table.HeaderCell>
|
|
13
|
+
* </Table.Row>
|
|
14
|
+
* </Table.Head>
|
|
15
|
+
* <Table.Body>
|
|
16
|
+
* <Table.Row>
|
|
17
|
+
* <Table.Cell>…</Table.Cell>
|
|
18
|
+
* </Table.Row>
|
|
19
|
+
* </Table.Body>
|
|
20
|
+
* </Table>
|
|
21
|
+
*
|
|
22
|
+
* <TextContainer width="w-[300px]"> wraps long cell copy at a fixed width.
|
|
23
|
+
* Cells accept `data` as an alternative to children (port API).
|
|
24
|
+
*/
|
|
25
|
+
declare function TableRoot({ className, children, ...props }: ComponentProps<'table'>): import("react").JSX.Element;
|
|
26
|
+
declare function Head({ className, ...props }: ComponentProps<'thead'>): import("react").JSX.Element;
|
|
27
|
+
declare function Body({ className, ...props }: ComponentProps<'tbody'>): import("react").JSX.Element;
|
|
28
|
+
declare function Row({ className, ...props }: ComponentProps<'tr'>): import("react").JSX.Element;
|
|
29
|
+
type CellProps = ComponentProps<'th'> & {
|
|
30
|
+
/** Cell content, port API alternative to children. */
|
|
31
|
+
data?: ReactNode;
|
|
32
|
+
};
|
|
33
|
+
declare function HeaderCell({ className, children, data, ...props }: CellProps): import("react").JSX.Element;
|
|
34
|
+
declare function Cell({ className, children, data, ...props }: ComponentProps<'td'> & {
|
|
35
|
+
data?: ReactNode;
|
|
36
|
+
}): import("react").JSX.Element;
|
|
37
|
+
type TextContainerProps = ComponentProps<'div'> & {
|
|
38
|
+
/** Tailwind width class for the text column. @default 'w-[300px]' */
|
|
39
|
+
width?: string;
|
|
40
|
+
data?: ReactNode;
|
|
41
|
+
};
|
|
42
|
+
/** Fixed-width wrapper for long cell copy (port API). */
|
|
43
|
+
declare function TextContainer({ className, children, data, width, ...props }: TextContainerProps): import("react").JSX.Element;
|
|
44
|
+
export declare const Table: typeof TableRoot & {
|
|
45
|
+
Head: typeof Head;
|
|
46
|
+
Body: typeof Body;
|
|
47
|
+
Row: typeof Row;
|
|
48
|
+
HeaderCell: typeof HeaderCell;
|
|
49
|
+
Cell: typeof Cell;
|
|
50
|
+
};
|
|
51
|
+
export { TextContainer };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { cn as e } from "../../lib/cn.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/data-table/Table.tsx
|
|
4
|
+
function n({ className: n, children: r, ...i }) {
|
|
5
|
+
return /* @__PURE__ */ t("div", {
|
|
6
|
+
className: "overflow-auto",
|
|
7
|
+
children: /* @__PURE__ */ t("table", {
|
|
8
|
+
className: e("w-full table-auto overflow-clip text-body-small text-on-surface", n),
|
|
9
|
+
...i,
|
|
10
|
+
children: r
|
|
11
|
+
})
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function r({ className: n, ...r }) {
|
|
15
|
+
return /* @__PURE__ */ t("thead", {
|
|
16
|
+
className: e("bg-surface-container text-body-medium", n),
|
|
17
|
+
...r
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function i({ className: n, ...r }) {
|
|
21
|
+
return /* @__PURE__ */ t("tbody", {
|
|
22
|
+
className: e("text-body-medium", n),
|
|
23
|
+
...r
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function a({ className: n, ...r }) {
|
|
27
|
+
return /* @__PURE__ */ t("tr", {
|
|
28
|
+
className: e("overflow-hidden odd:bg-surface-container/50", n),
|
|
29
|
+
...r
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function o({ className: n, children: r, data: i, ...a }) {
|
|
33
|
+
return /* @__PURE__ */ t("th", {
|
|
34
|
+
className: e("min-w-max overflow-hidden px-4 py-3 text-left font-medium", n),
|
|
35
|
+
...a,
|
|
36
|
+
children: /* @__PURE__ */ t("div", {
|
|
37
|
+
className: "flex h-full w-full min-w-max flex-wrap",
|
|
38
|
+
children: r ?? i
|
|
39
|
+
})
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function s({ className: n, children: r, data: i, ...a }) {
|
|
43
|
+
return /* @__PURE__ */ t("td", {
|
|
44
|
+
className: e("min-w-max px-4 py-3 pr-8", n),
|
|
45
|
+
...a,
|
|
46
|
+
children: /* @__PURE__ */ t("span", {
|
|
47
|
+
className: "flex sm:min-w-max",
|
|
48
|
+
children: r ?? i
|
|
49
|
+
})
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function c({ className: n, children: r, data: i, width: a, ...o }) {
|
|
53
|
+
return /* @__PURE__ */ t("div", {
|
|
54
|
+
className: e("flex", a ?? "w-[300px]", n),
|
|
55
|
+
...o,
|
|
56
|
+
children: r ?? i
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
var l = Object.assign(n, {
|
|
60
|
+
Head: r,
|
|
61
|
+
Body: i,
|
|
62
|
+
Row: a,
|
|
63
|
+
HeaderCell: o,
|
|
64
|
+
Cell: s
|
|
65
|
+
});
|
|
66
|
+
//#endregion
|
|
67
|
+
export { l as Table, c as TextContainer };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=Table.js.map
|