@alexgorbatchev/shadcn 0.0.46 → 0.0.48
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 +12 -4
- package/dist/{chunk-p1eqxz4v.js → chunk-a6mes7w0.js} +80 -80
- package/dist/{chunk-8wc2z7te.js → chunk-cfnkbp0y.js} +103 -75
- package/dist/{chunk-8rtm4y46.js → chunk-pj01ybcm.js} +6 -6
- package/dist/{chunk-0qgd06td.js → chunk-svr3r7pj.js} +754 -718
- package/dist/components/ActionsMenu.d.ts +21 -0
- package/dist/components/ConfirmationDialog.d.ts +3 -2
- package/dist/components/ContextMenu.d.ts +3 -16
- package/dist/components/DropdownMenu.d.ts +4 -23
- package/dist/components/FormDialog.d.ts +23 -0
- package/dist/components/InlineEdit.d.ts +4 -2
- package/dist/components/MenuParts.d.ts +24 -0
- package/dist/components/MenuPopup.d.ts +6 -0
- package/dist/components/Menubar.d.ts +4 -6
- package/dist/components/assistant-ui/elements/RegenerateMenu.js +2 -2
- package/dist/components/assistant-ui/index.js +2 -2
- package/dist/components/data-grid/index.js +2 -2
- package/dist/components/json-render/catalog.d.ts +1 -1
- package/dist/components/json-render/index.js +20 -20
- package/dist/components/tree/index.js +2218 -15
- package/dist/index.d.ts +4 -0
- package/dist/index.js +70 -58
- package/dist/menu/types.d.ts +3 -0
- package/dist/prototype.js +3 -2
- package/llms/components/forms/InlineEdit.md +34 -1
- package/llms/components/navigation/ActionsMenu.md +143 -0
- package/llms/components/overlays/ConfirmationDialog.md +31 -1
- package/llms/components/overlays/FormDialog.md +102 -0
- package/llms/setup.md +12 -4
- package/llms.txt +2 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@ Import shared controls and providers from `@alexgorbatchev/shadcn`. Import the f
|
|
|
71
71
|
| `/file-upload` | FileUpload selection and validation | `bun add react-dropzone@^20.1.4` |
|
|
72
72
|
| `/color-picker` | ColorPicker | `bun add react-colorful@^5.8.1` |
|
|
73
73
|
| `/image-crop` | ImageCrop and native export helpers | `bun add react-image-crop@^11.1.2` |
|
|
74
|
-
| `/tree` | Tree, native hooks and features | `bun add @headless-tree/core@^1.8.0 @headless-tree/react@^1.8.0
|
|
74
|
+
| `/tree` | Tree, native hooks and features | `bun add @headless-tree/core@^1.8.0 @headless-tree/react@^1.8.0`; patched runtimes are bundled |
|
|
75
75
|
| `/editor` | RichTextEditor, native Tiptap hooks and StarterKit | `bun add @tiptap/core@^3.32.0 @tiptap/react@^3.32.0 @tiptap/pm@^3.32.0 @tiptap/starter-kit@^3.32.0` |
|
|
76
76
|
| `/event-calendar` | EventCalendar, EventForm and native calendar APIs | `bun add date-fns@^4.4.0`; TypeScript: `bun add -d @types/react-big-calendar@^1.16.3` |
|
|
77
77
|
| `/gantt` | Gantt and Roadmap | `bun add date-fns@^4.4.0 @date-fns/tz@^1.5.0` |
|
|
@@ -86,7 +86,7 @@ import { ChartContainer, type ChartConfig } from "@alexgorbatchev/shadcn/chart";
|
|
|
86
86
|
import { Carousel, CarouselContent, CarouselItem } from "@alexgorbatchev/shadcn/carousel";
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
-
A production install of this package adds no third-party packages: every library is an optional peer that consumers install themselves, or is bundled into the package. Core peers are listed under Installation; feature peers are listed per entry point above. The patched `sonner`, `input-otp`,
|
|
89
|
+
A production install of this package adds no third-party packages: every library is an optional peer that consumers install themselves, or is bundled into the package. Core peers are listed under Installation; feature peers are listed per entry point above. The patched `sonner`, `input-otp`, `@shadcn/react`, and Headless Tree runtimes, and the calendar with its patched `uncontrollable` wrapper, are bundled so consumers receive the fixes even when their package manager does not apply Bun patches. Install their upstream peers for the types the declarations reference; the tree runtime stays behind `/tree` and the calendar runtime behind `/event-calendar`. Import tree hooks and features from this package's `/tree` entry point so they use the bundled native implementation. Install `@base-ui/utils` at the exact version `@base-ui/react` requires, so the portal components share Base UI's own ref merging without a second copy. Shared providers work across entry points.
|
|
90
90
|
|
|
91
91
|
The optional assistant-ui catalog provides presentational families under `/assistant-ui/<family>` and runtime adapters under `/assistant-ui/native/<family>`. For example, import `ApprovalCard` from `@alexgorbatchev/shadcn/assistant-ui/approval-card`. Add `@alexgorbatchev/shadcn/assistant-ui.css` to your stylesheet. Native threads require an actual assistant-ui runtime and the selected family's optional peers. See the [assistant-ui reference](./docs/internal/assistant-ui.md) for imports, dependency-bearing styles, source inventory, and the SelectionToolbar isolation limitation.
|
|
92
92
|
|
|
@@ -360,7 +360,7 @@ Compose `QuestionnaireItem`, `QuestionnaireTitle`, and answer controls inside `Q
|
|
|
360
360
|
|
|
361
361
|
# Inline editing and ratings
|
|
362
362
|
|
|
363
|
-
`InlineEdit` mounts an edit session with a controlled `value`, `onValueChange`, `onCommit`, and `onCancel`. Mount it in place of the displayed label. Its input focuses and selects its text by default; `shouldSelectOnMount={false}` preserves the initial caret. Enter or blur commits once, Escape cancels without committing, and asynchronous saves disable the input until completion. Rejected saves display
|
|
363
|
+
`InlineEdit` mounts an edit session with a controlled `value`, `onValueChange`, `onCommit`, and `onCancel`. Mount it in place of the displayed label. Its input focuses and selects its text by default; `shouldSelectOnMount={false}` preserves the initial caret. Enter or blur commits once, Escape cancels without committing, and asynchronous saves disable the input until completion. Set `hasChanges={false}` to cancel an unchanged edit before calling `onCommit`; the caller owns normalization and comparison. It defaults to true, so creation sessions can commit their initial value. Rejected saves display a generic error and allow retry; `renderError` can map the unknown failure to application-authored guidance.
|
|
364
364
|
|
|
365
365
|
`VirtualTable` renders a bounded, dynamically measured set of native table rows using TanStack Virtual. Supply `items`, stable `getItemKey`, `header`, `label`, and `renderRow`; spread the supplied measurement props onto each native row. Optional `columns` accepts a `TableColumnGroup`; responsive columns keep their widths aligned with cells that share their `visibleFrom`. `maxHeight` defaults to `65vh`, `estimateRowHeight` to 80 pixels, and `overscan` to five rows. `retainedKeys` keeps editing rows mounted; the focused row is retained automatically. Filtering and selection belong to the consumer.
|
|
366
366
|
|
|
@@ -370,17 +370,25 @@ Column `meta.filter` offers a column in `DataGridFilters`, hidden columns includ
|
|
|
370
370
|
|
|
371
371
|
Import `DataGridSelectHeader` and `DataGridSelectCell` from `@alexgorbatchev/shadcn/data-grid`. Pass the current `useTable` result as `table` to both controls, and pass `row` and an accessible `label` to each cell. The header selects selectable filtered rows across all pages and preserves selections hidden by filters. It shows a mixed state when some of those rows are selected and disables itself when none are selectable. Its default label is "Select all filtered rows"; provide `label` to name the scope in your application. Cells follow native row selection rules, including disabled rows and partially selected parents. The controls observe selection changes without requiring the parent table selector to include selection state.
|
|
372
372
|
|
|
373
|
+
`ActionsMenu` shares one `items` definition between a dropdown action and an optional context menu. Supply an accessible `label`; the default trigger is a ghost icon button. `size="sm"` displays the label, and `variant`, `disabled`, and `trigger` customize the action. Supplying `contextTarget` composes the native context trigger with that element and adds its popup. Compose items with `MenuItem`, `MenuLinkItem`, checkbox/radio parts, groups, labels, separators, shortcuts, and submenu parts; dropdown and context menus share these implementations. `MenuLinkItem` retains its native anchor and menu keyboard semantics.
|
|
374
|
+
|
|
375
|
+
For nested layouts, compose `ActionsMenuTrigger`, `ActionsMenuContextTarget`, and `ActionsMenuContextContent` explicitly inside `ActionsMenu`. The dropdown trigger owns its local native dropdown root and popup; the context target and content share an independent context root. A tree row can use `TreeItem render={<ActionsMenuContextTarget />}` and put the trigger in its action slot. For a table row, render the context target as the actual `tr`, then place the dropdown trigger and context content inside a `td`: native popup portals insert focus guards at their declaration, which must remain valid table children.
|
|
376
|
+
|
|
373
377
|
`TreeItem linkProps` places the registered tree item, roving focus, and native drag handlers on an anchor. Pass `href` and anchor events directly, or compose a router link through `linkProps.render`. The outer `render` and `ref` remain available for row overlays; disclosure and `endEnhancer` controls remain siblings of the link. Enter and modified clicks retain native link behavior, while tree arrows retain navigation and expansion behavior. Optional `dropHint={{ content, open, side }}` displays caller-controlled drag feedback without adding a focus target.
|
|
374
378
|
|
|
379
|
+
Embedded actions, links, menus, editable fields, and media controls retain their own keyboard behavior. Registered anchor and button rows still participate in tree navigation; rename and search inputs retain their completion and cancellation shortcuts.
|
|
380
|
+
|
|
375
381
|
`PageHeader` accepts an optional `eyebrow` above its single page title. It accepts any React content without introducing another heading. Breadcrumbs, description, actions, and density remain independent slots; long action content wraps within narrow layouts.
|
|
376
382
|
|
|
377
383
|
`StarRating` takes a controlled numeric `value` from 0 to 5, `onValueChange`, and an accessible `label`. Its native radio buttons support keyboard selection and an Unrated option to clear the rating. Set `disabled` while saving. `Avatar shape="square"` displays square artwork with matching image, fallback, and border corners.
|
|
378
384
|
|
|
379
385
|
`DialogContent size="wide"` uses a desktop maximum width of 576px; `size="narrow"` uses 192px, and the default uses 384px. Dialogs remain bounded by the viewport. `FieldGroup columns={2}` arranges fields in two columns on desktop and one on mobile.
|
|
380
386
|
|
|
387
|
+
`FormDialog` supplies a controlled dialog with a fixed heading and footer around a scrolling body. Supply `open`, `onOpenChange`, `title`, and children; `description`, `size`, and `density` are optional. With `onSubmit`, the body and actions use a native form: the caller handles `preventDefault`, validation, submission, and pending state. `submitLabel` adds the stock submit button, with optional `submitVariant` and `submitDisabled`; `primaryAction` supplies a custom action instead. Without `onSubmit`, custom actions can request consent without introducing a form. Without a primary action, `cancelLabel="Done"` gives a close-only footer. `isBusy` blocks native dismissal and disables the stock actions; callers disable their own inputs and custom actions. Pass already-rendered safe guidance through `error`.
|
|
388
|
+
|
|
381
389
|
`ImagePicker` displays a 256px square preview with upload and unset buttons. Supply the existing `src`, a staged `file` (`undefined` for the existing image, `null` for removal), and `onFileChange`/`onClear` callbacks. It accepts PNG, JPEG, and GIF files and releases local preview URLs when they change or unmount. The consumer owns saving and removal confirmation.
|
|
382
390
|
|
|
383
|
-
`ConfirmationDialog` uses an alert dialog with Cancel and a destructive confirmation button. Supply `open`, `onOpenChange`, `title`, `description`, `confirmLabel`, and `onConfirm`. It waits for asynchronous work, keeps the dialog open on failure, and prevents cancellation while that work is pending.
|
|
391
|
+
`ConfirmationDialog` uses an alert dialog with Cancel and a destructive confirmation button. Supply `open`, `onOpenChange`, `title`, `description`, `confirmLabel`, and `onConfirm`. It waits for asynchronous work, keeps the dialog open on failure, and prevents cancellation while that work is pending. Its body scrolls within the viewport while the heading and actions stay visible. Failures display generic guidance by default; `renderError` maps unknown failures to application-authored messages.
|
|
384
392
|
|
|
385
393
|
# Split views
|
|
386
394
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn2
|
|
3
|
+
} from "./chunk-cp2m7y7v.js";
|
|
1
4
|
import {
|
|
2
5
|
useDensity
|
|
3
6
|
} from "./chunk-e6hk39ev.js";
|
|
@@ -6,9 +9,6 @@ import {
|
|
|
6
9
|
usePortalNode,
|
|
7
10
|
PortalProvider2
|
|
8
11
|
} from "./chunk-x90xmrba.js";
|
|
9
|
-
import {
|
|
10
|
-
cn2
|
|
11
|
-
} from "./chunk-cp2m7y7v.js";
|
|
12
12
|
import {
|
|
13
13
|
Button2
|
|
14
14
|
} from "./chunk-38301e40.js";
|
|
@@ -22,53 +22,94 @@ import {
|
|
|
22
22
|
useAnalyticsCallback
|
|
23
23
|
} from "./chunk-5mydsjp3.js";
|
|
24
24
|
|
|
25
|
+
// src/components/ScrollArea.tsx
|
|
26
|
+
import { ScrollArea as ScrollAreaPrimitive } from "@base-ui/react/scroll-area";
|
|
27
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
28
|
+
function ScrollArea2({
|
|
29
|
+
density,
|
|
30
|
+
className,
|
|
31
|
+
children,
|
|
32
|
+
scrollbars = /* @__PURE__ */ jsx(ScrollBar2, {}),
|
|
33
|
+
...props
|
|
34
|
+
}) {
|
|
35
|
+
return /* @__PURE__ */ jsxs(ScrollAreaPrimitive.Root, {
|
|
36
|
+
"data-density": density,
|
|
37
|
+
"data-slot": "scroll-area",
|
|
38
|
+
className: (state) => cn2("relative flex min-h-0 flex-col", typeof className === "function" ? className(state) : className),
|
|
39
|
+
...props,
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, {
|
|
42
|
+
"data-slot": "scroll-area-viewport",
|
|
43
|
+
className: "size-full min-h-0 flex-1 rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-1",
|
|
44
|
+
children
|
|
45
|
+
}),
|
|
46
|
+
scrollbars,
|
|
47
|
+
/* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
|
|
48
|
+
]
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function ScrollBar2({ density, className, orientation = "vertical", ...props }) {
|
|
52
|
+
return /* @__PURE__ */ jsx(ScrollAreaPrimitive.Scrollbar, {
|
|
53
|
+
"data-density": density,
|
|
54
|
+
"data-slot": "scroll-area-scrollbar",
|
|
55
|
+
"data-orientation": orientation,
|
|
56
|
+
orientation,
|
|
57
|
+
className: (state) => cn2("flex touch-none p-px transition-colors select-none data-[orientation=horizontal]:h-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:border-t data-[orientation=horizontal]:border-t-transparent data-[orientation=vertical]:w-2.5 data-[orientation=vertical]:border-s data-[orientation=vertical]:border-s-transparent", typeof className === "function" ? className(state) : className),
|
|
58
|
+
...props,
|
|
59
|
+
children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.Thumb, {
|
|
60
|
+
"data-slot": "scroll-area-thumb",
|
|
61
|
+
className: "relative flex-1 rounded-full bg-border"
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
25
66
|
// src/components/Combobox.tsx
|
|
26
67
|
import { useDirection } from "@base-ui/react/direction-provider";
|
|
27
68
|
import { Combobox as ComboboxPrimitive } from "@base-ui/react/combobox";
|
|
28
69
|
import { ChevronDownIcon, XIcon, CheckIcon } from "lucide-react";
|
|
29
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
70
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
30
71
|
function Combobox2({
|
|
31
72
|
analytics,
|
|
32
73
|
...props
|
|
33
74
|
}) {
|
|
34
75
|
const onValueChange = useAnalyticsCallback("Combobox", analytics, { name: "ui.change-request" }, props.onValueChange);
|
|
35
76
|
const onOpenChange = useAnalyticsCallback("Combobox", analytics, (open, _details) => ({ name: "ui.open-request", open }), props.onOpenChange);
|
|
36
|
-
return /* @__PURE__ */
|
|
77
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Root, {
|
|
37
78
|
...props,
|
|
38
79
|
onValueChange,
|
|
39
80
|
onOpenChange
|
|
40
81
|
});
|
|
41
82
|
}
|
|
42
83
|
function ComboboxValue2({ ...props }) {
|
|
43
|
-
return /* @__PURE__ */
|
|
84
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Value, {
|
|
44
85
|
...props
|
|
45
86
|
});
|
|
46
87
|
}
|
|
47
88
|
function ComboboxTrigger2({ density, className, children, ...props }) {
|
|
48
|
-
return /* @__PURE__ */
|
|
89
|
+
return /* @__PURE__ */ jsxs2(ComboboxPrimitive.Trigger, {
|
|
49
90
|
"data-density": density,
|
|
50
91
|
"data-slot": "combobox-trigger",
|
|
51
92
|
className: (state) => cn2("[&_svg:not([class*='size-'])]:size-4", typeof className === "function" ? className(state) : className),
|
|
52
93
|
...props,
|
|
53
94
|
children: [
|
|
54
95
|
children,
|
|
55
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ jsx2(ChevronDownIcon, {
|
|
56
97
|
className: "pointer-events-none size-4 text-muted-foreground"
|
|
57
98
|
})
|
|
58
99
|
]
|
|
59
100
|
});
|
|
60
101
|
}
|
|
61
102
|
function ComboboxClear({ density, className, ...props }) {
|
|
62
|
-
return /* @__PURE__ */
|
|
103
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Clear, {
|
|
63
104
|
"data-density": density,
|
|
64
105
|
"data-slot": "combobox-clear",
|
|
65
|
-
render: /* @__PURE__ */
|
|
106
|
+
render: /* @__PURE__ */ jsx2(InputGroupButton2, {
|
|
66
107
|
variant: "ghost",
|
|
67
108
|
size: "icon-xs"
|
|
68
109
|
}),
|
|
69
110
|
className: (state) => cn2(typeof className === "function" ? className(state) : className),
|
|
70
111
|
...props,
|
|
71
|
-
children: /* @__PURE__ */
|
|
112
|
+
children: /* @__PURE__ */ jsx2(XIcon, {
|
|
72
113
|
className: "pointer-events-none"
|
|
73
114
|
})
|
|
74
115
|
});
|
|
@@ -85,30 +126,30 @@ function ComboboxInput2({
|
|
|
85
126
|
clearLabel = "Clear selection",
|
|
86
127
|
...props
|
|
87
128
|
}) {
|
|
88
|
-
return /* @__PURE__ */
|
|
129
|
+
return /* @__PURE__ */ jsxs2(InputGroup2, {
|
|
89
130
|
density,
|
|
90
131
|
className: cn2("w-auto", frameClassName),
|
|
91
132
|
children: [
|
|
92
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ jsx2(ComboboxPrimitive.Input, {
|
|
93
134
|
disabled,
|
|
94
135
|
className,
|
|
95
|
-
render: /* @__PURE__ */
|
|
136
|
+
render: /* @__PURE__ */ jsx2(InputGroupInput2, {}),
|
|
96
137
|
...props
|
|
97
138
|
}),
|
|
98
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ jsxs2(InputGroupAddon2, {
|
|
99
140
|
align: "inline-end",
|
|
100
141
|
children: [
|
|
101
|
-
showTrigger && /* @__PURE__ */
|
|
142
|
+
showTrigger && /* @__PURE__ */ jsx2(InputGroupButton2, {
|
|
102
143
|
size: "icon-xs",
|
|
103
144
|
variant: "ghost",
|
|
104
|
-
render: /* @__PURE__ */
|
|
145
|
+
render: /* @__PURE__ */ jsx2(ComboboxTrigger2, {}),
|
|
105
146
|
"aria-label": triggerLabel,
|
|
106
147
|
"data-density": density,
|
|
107
148
|
"data-slot": "input-group-button",
|
|
108
149
|
className: "group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent",
|
|
109
150
|
disabled
|
|
110
151
|
}),
|
|
111
|
-
showClear && /* @__PURE__ */
|
|
152
|
+
showClear && /* @__PURE__ */ jsx2(ComboboxClear, {
|
|
112
153
|
disabled,
|
|
113
154
|
"aria-label": clearLabel
|
|
114
155
|
})
|
|
@@ -132,19 +173,19 @@ function ComboboxContent2({
|
|
|
132
173
|
const direction = useDirection();
|
|
133
174
|
const container = usePortalContainer2();
|
|
134
175
|
const portal = usePortalNode();
|
|
135
|
-
return /* @__PURE__ */
|
|
176
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Portal, {
|
|
136
177
|
container,
|
|
137
178
|
ref: portal.ref,
|
|
138
|
-
children: /* @__PURE__ */
|
|
179
|
+
children: /* @__PURE__ */ jsx2(PortalProvider2, {
|
|
139
180
|
container: portal.node,
|
|
140
|
-
children: /* @__PURE__ */
|
|
181
|
+
children: /* @__PURE__ */ jsx2(ComboboxPrimitive.Positioner, {
|
|
141
182
|
side,
|
|
142
183
|
sideOffset,
|
|
143
184
|
align,
|
|
144
185
|
alignOffset,
|
|
145
186
|
anchor,
|
|
146
187
|
className: "isolate ",
|
|
147
|
-
children: /* @__PURE__ */
|
|
188
|
+
children: /* @__PURE__ */ jsx2(ComboboxPrimitive.Popup, {
|
|
148
189
|
dir: direction,
|
|
149
190
|
"data-density": resolvedDensity,
|
|
150
191
|
"data-slot": "combobox-content",
|
|
@@ -157,7 +198,7 @@ function ComboboxContent2({
|
|
|
157
198
|
});
|
|
158
199
|
}
|
|
159
200
|
function ComboboxList2({ density, className, ...props }) {
|
|
160
|
-
return /* @__PURE__ */
|
|
201
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.List, {
|
|
161
202
|
"data-density": density,
|
|
162
203
|
"data-slot": "combobox-list",
|
|
163
204
|
className: (state) => cn2("no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0", typeof className === "function" ? className(state) : className),
|
|
@@ -165,18 +206,18 @@ function ComboboxList2({ density, className, ...props }) {
|
|
|
165
206
|
});
|
|
166
207
|
}
|
|
167
208
|
function ComboboxItem2({ density, className, children, ...props }) {
|
|
168
|
-
return /* @__PURE__ */
|
|
209
|
+
return /* @__PURE__ */ jsxs2(ComboboxPrimitive.Item, {
|
|
169
210
|
"data-density": density,
|
|
170
211
|
"data-slot": "combobox-item",
|
|
171
212
|
className: (state) => cn2("relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", typeof className === "function" ? className(state) : className),
|
|
172
213
|
...props,
|
|
173
214
|
children: [
|
|
174
215
|
children,
|
|
175
|
-
/* @__PURE__ */
|
|
176
|
-
render: /* @__PURE__ */
|
|
216
|
+
/* @__PURE__ */ jsx2(ComboboxPrimitive.ItemIndicator, {
|
|
217
|
+
render: /* @__PURE__ */ jsx2("span", {
|
|
177
218
|
className: "pointer-events-none absolute end-2 flex size-4 items-center justify-center"
|
|
178
219
|
}),
|
|
179
|
-
children: /* @__PURE__ */
|
|
220
|
+
children: /* @__PURE__ */ jsx2(CheckIcon, {
|
|
180
221
|
className: "pointer-events-none"
|
|
181
222
|
})
|
|
182
223
|
})
|
|
@@ -184,7 +225,7 @@ function ComboboxItem2({ density, className, children, ...props }) {
|
|
|
184
225
|
});
|
|
185
226
|
}
|
|
186
227
|
function ComboboxGroup2({ density, className, ...props }) {
|
|
187
|
-
return /* @__PURE__ */
|
|
228
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Group, {
|
|
188
229
|
"data-density": density,
|
|
189
230
|
"data-slot": "combobox-group",
|
|
190
231
|
className: (state) => cn2(typeof className === "function" ? className(state) : className),
|
|
@@ -192,7 +233,7 @@ function ComboboxGroup2({ density, className, ...props }) {
|
|
|
192
233
|
});
|
|
193
234
|
}
|
|
194
235
|
function ComboboxLabel2({ density, className, ...props }) {
|
|
195
|
-
return /* @__PURE__ */
|
|
236
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.GroupLabel, {
|
|
196
237
|
"data-density": density,
|
|
197
238
|
"data-slot": "combobox-label",
|
|
198
239
|
className: (state) => cn2("px-2 py-1.5 text-xs text-muted-foreground", typeof className === "function" ? className(state) : className),
|
|
@@ -200,12 +241,12 @@ function ComboboxLabel2({ density, className, ...props }) {
|
|
|
200
241
|
});
|
|
201
242
|
}
|
|
202
243
|
function ComboboxCollection2({ ...props }) {
|
|
203
|
-
return /* @__PURE__ */
|
|
244
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Collection, {
|
|
204
245
|
...props
|
|
205
246
|
});
|
|
206
247
|
}
|
|
207
248
|
function ComboboxEmpty2({ density, className, ...props }) {
|
|
208
|
-
return /* @__PURE__ */
|
|
249
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Empty, {
|
|
209
250
|
"data-density": density,
|
|
210
251
|
"data-slot": "combobox-empty",
|
|
211
252
|
className: (state) => cn2("flex w-full justify-center py-2 empty:p-0 text-center text-sm text-muted-foreground", typeof className === "function" ? className(state) : className),
|
|
@@ -213,7 +254,7 @@ function ComboboxEmpty2({ density, className, ...props }) {
|
|
|
213
254
|
});
|
|
214
255
|
}
|
|
215
256
|
function ComboboxSeparator2({ density, className, ...props }) {
|
|
216
|
-
return /* @__PURE__ */
|
|
257
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Separator, {
|
|
217
258
|
"data-density": density,
|
|
218
259
|
"data-slot": "combobox-separator",
|
|
219
260
|
className: (state) => cn2("-mx-1 my-1 h-px bg-border", typeof className === "function" ? className(state) : className),
|
|
@@ -221,7 +262,7 @@ function ComboboxSeparator2({ density, className, ...props }) {
|
|
|
221
262
|
});
|
|
222
263
|
}
|
|
223
264
|
function ComboboxChips2({ density, className, ...props }) {
|
|
224
|
-
return /* @__PURE__ */
|
|
265
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Chips, {
|
|
225
266
|
"data-density": density,
|
|
226
267
|
"data-slot": "combobox-chips",
|
|
227
268
|
className: (state) => cn2("flex min-h-control flex-wrap items-center gap-1 rounded-sm border border-input bg-transparent bg-clip-padding px-control-x py-px text-sm transition-colors focus-within:border-ring focus-within:ring-1 focus-within:ring-ring has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive has-data-[slot=combobox-chip]:px-1", typeof className === "function" ? className(state) : className),
|
|
@@ -236,22 +277,22 @@ function ComboboxChip2({
|
|
|
236
277
|
removeLabel = "Remove item",
|
|
237
278
|
...props
|
|
238
279
|
}) {
|
|
239
|
-
return /* @__PURE__ */
|
|
280
|
+
return /* @__PURE__ */ jsxs2(ComboboxPrimitive.Chip, {
|
|
240
281
|
"data-density": density,
|
|
241
282
|
"data-slot": "combobox-chip",
|
|
242
283
|
className: (state) => cn2("flex h-tag w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pe-0", typeof className === "function" ? className(state) : className),
|
|
243
284
|
...props,
|
|
244
285
|
children: [
|
|
245
286
|
children,
|
|
246
|
-
showRemove && /* @__PURE__ */
|
|
247
|
-
render: /* @__PURE__ */
|
|
287
|
+
showRemove && /* @__PURE__ */ jsx2(ComboboxPrimitive.ChipRemove, {
|
|
288
|
+
render: /* @__PURE__ */ jsx2(Button2, {
|
|
248
289
|
variant: "ghost",
|
|
249
290
|
size: "icon-xs"
|
|
250
291
|
}),
|
|
251
292
|
className: "size-tag -ms-1 opacity-50 hover:opacity-100",
|
|
252
293
|
"data-slot": "combobox-chip-remove",
|
|
253
294
|
"aria-label": removeLabel,
|
|
254
|
-
children: /* @__PURE__ */
|
|
295
|
+
children: /* @__PURE__ */ jsx2(XIcon, {
|
|
255
296
|
className: "pointer-events-none"
|
|
256
297
|
})
|
|
257
298
|
})
|
|
@@ -259,7 +300,7 @@ function ComboboxChip2({
|
|
|
259
300
|
});
|
|
260
301
|
}
|
|
261
302
|
function ComboboxChipsInput2({ density, className, ...props }) {
|
|
262
|
-
return /* @__PURE__ */
|
|
303
|
+
return /* @__PURE__ */ jsx2(ComboboxPrimitive.Input, {
|
|
263
304
|
"data-density": density,
|
|
264
305
|
"data-slot": "combobox-chip-input",
|
|
265
306
|
className: (state) => cn2("h-tag min-w-16 flex-1 py-0 text-sm leading-none outline-none", typeof className === "function" ? className(state) : className),
|
|
@@ -273,47 +314,6 @@ function useComboboxAnchor2() {
|
|
|
273
314
|
return useRef(null);
|
|
274
315
|
}
|
|
275
316
|
|
|
276
|
-
// src/components/ScrollArea.tsx
|
|
277
|
-
import { ScrollArea as ScrollAreaPrimitive } from "@base-ui/react/scroll-area";
|
|
278
|
-
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
279
|
-
function ScrollArea2({
|
|
280
|
-
density,
|
|
281
|
-
className,
|
|
282
|
-
children,
|
|
283
|
-
scrollbars = /* @__PURE__ */ jsx2(ScrollBar2, {}),
|
|
284
|
-
...props
|
|
285
|
-
}) {
|
|
286
|
-
return /* @__PURE__ */ jsxs2(ScrollAreaPrimitive.Root, {
|
|
287
|
-
"data-density": density,
|
|
288
|
-
"data-slot": "scroll-area",
|
|
289
|
-
className: (state) => cn2("relative flex min-h-0 flex-col", typeof className === "function" ? className(state) : className),
|
|
290
|
-
...props,
|
|
291
|
-
children: [
|
|
292
|
-
/* @__PURE__ */ jsx2(ScrollAreaPrimitive.Viewport, {
|
|
293
|
-
"data-slot": "scroll-area-viewport",
|
|
294
|
-
className: "size-full min-h-0 flex-1 rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-1",
|
|
295
|
-
children
|
|
296
|
-
}),
|
|
297
|
-
scrollbars,
|
|
298
|
-
/* @__PURE__ */ jsx2(ScrollAreaPrimitive.Corner, {})
|
|
299
|
-
]
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
function ScrollBar2({ density, className, orientation = "vertical", ...props }) {
|
|
303
|
-
return /* @__PURE__ */ jsx2(ScrollAreaPrimitive.Scrollbar, {
|
|
304
|
-
"data-density": density,
|
|
305
|
-
"data-slot": "scroll-area-scrollbar",
|
|
306
|
-
"data-orientation": orientation,
|
|
307
|
-
orientation,
|
|
308
|
-
className: (state) => cn2("flex touch-none p-px transition-colors select-none data-[orientation=horizontal]:h-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:border-t data-[orientation=horizontal]:border-t-transparent data-[orientation=vertical]:w-2.5 data-[orientation=vertical]:border-s data-[orientation=vertical]:border-s-transparent", typeof className === "function" ? className(state) : className),
|
|
309
|
-
...props,
|
|
310
|
-
children: /* @__PURE__ */ jsx2(ScrollAreaPrimitive.Thumb, {
|
|
311
|
-
"data-slot": "scroll-area-thumb",
|
|
312
|
-
className: "relative flex-1 rounded-full bg-border"
|
|
313
|
-
})
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
|
|
317
317
|
// src/components/NumberField.tsx
|
|
318
318
|
import { NumberField as NumberFieldPrimitive } from "@base-ui/react/number-field";
|
|
319
319
|
import { MinusIcon, PlusIcon, MoveHorizontalIcon } from "lucide-react";
|
|
@@ -413,4 +413,4 @@ function NumberFieldScrubAreaCursor2({
|
|
|
413
413
|
});
|
|
414
414
|
}
|
|
415
415
|
|
|
416
|
-
export { Combobox2, ComboboxValue2, ComboboxTrigger2, ComboboxInput2, ComboboxContent2, ComboboxList2, ComboboxItem2, ComboboxGroup2, ComboboxLabel2, ComboboxCollection2, ComboboxEmpty2, ComboboxSeparator2, ComboboxChips2, ComboboxChip2, ComboboxChipsInput2, useComboboxAnchor2,
|
|
416
|
+
export { ScrollArea2, ScrollBar2, Combobox2, ComboboxValue2, ComboboxTrigger2, ComboboxInput2, ComboboxContent2, ComboboxList2, ComboboxItem2, ComboboxGroup2, ComboboxLabel2, ComboboxCollection2, ComboboxEmpty2, ComboboxSeparator2, ComboboxChips2, ComboboxChip2, ComboboxChipsInput2, useComboboxAnchor2, NumberField2, NumberFieldGroup2, NumberFieldInput2, NumberFieldDecrement2, NumberFieldIncrement2, NumberFieldScrubArea2, NumberFieldScrubAreaCursor2 };
|