@datum-cloud/datum-ui 2.8.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/{calendar-date-picker-bpTUcGu_.mjs → calendar-date-picker-DW31tDSa.mjs} +1 -1
  2. package/dist/card/index.mjs +2 -2
  3. package/dist/card-save-bar-Dub71HRf.mjs +281 -0
  4. package/dist/components/base/card/card-save-bar.d.ts +29 -0
  5. package/dist/components/base/card/card.d.ts +83 -6
  6. package/dist/components/base/card/index.d.ts +1 -0
  7. package/dist/components/base/index.d.ts +1 -0
  8. package/dist/components/base/settings-nav/index.d.ts +2 -0
  9. package/dist/components/base/settings-nav/settings-nav-variants.d.ts +3 -0
  10. package/dist/components/base/settings-nav/settings-nav.d.ts +28 -0
  11. package/dist/components/base/tabs/tabs.d.ts +12 -4
  12. package/dist/data-table/index.mjs +1 -1
  13. package/dist/{data-table-BaWOHdZX.mjs → data-table-CW3-xqkg.mjs} +2 -2
  14. package/dist/date-picker/index.mjs +3 -3
  15. package/dist/date-time-picker/index.mjs +1 -1
  16. package/dist/{date-time-picker-Bd7qSZVr.mjs → date-time-picker-BVvWQXMt.mjs} +1 -1
  17. package/dist/{date-time-range-picker-DlFTh3DF.mjs → date-time-range-picker-BEulotVf.mjs} +1 -1
  18. package/dist/form/index.mjs +1 -1
  19. package/dist/{form-BGlPoZ1G.mjs → form-DB5MbJ2U.mjs} +5 -5
  20. package/dist/grouped-table/index.mjs +1 -1
  21. package/dist/{grouped-table-DWtEx18V.mjs → grouped-table-DKUsSHpe.mjs} +1 -1
  22. package/dist/index.mjs +13 -12
  23. package/dist/logs/index.mjs +1 -1
  24. package/dist/picker/index.mjs +2 -2
  25. package/dist/{picker-DbKukBkk.mjs → picker-Cke6cfsb.mjs} +1 -1
  26. package/dist/select/index.mjs +1 -1
  27. package/dist/{select-CQsG8Kju.mjs → select-D4pk9e2d.mjs} +1 -1
  28. package/dist/settings-nav/index.mjs +2 -0
  29. package/dist/settings-nav-BCL1lMTM.mjs +84 -0
  30. package/dist/tabs/index.mjs +75 -19
  31. package/dist/textarea/index.mjs +1 -1
  32. package/dist/{textarea-B6YhjFVC.mjs → textarea-DiSGxCBO.mjs} +1 -1
  33. package/dist/time-picker/index.mjs +1 -1
  34. package/dist/{time-picker-rVTkmbIG.mjs → time-picker-BzNSUazl.mjs} +1 -1
  35. package/dist/{to-api-format-Bm1VcKkS.mjs → to-api-format-W3qJE68W.mjs} +2 -2
  36. package/package.json +6 -1
  37. package/dist/card-Cphn2nA3.mjs +0 -59
@@ -1,5 +1,5 @@
1
1
  import { t as useDeprecationWarning } from "./use-deprecation-warning-DXrGc0jX.mjs";
2
- import { a as DateRangePicker } from "./picker-DbKukBkk.mjs";
2
+ import { a as DateRangePicker } from "./picker-Cke6cfsb.mjs";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/components/features/calendar-date-picker/calendar-date-picker.tsx
5
5
  /**
@@ -1,2 +1,2 @@
1
- import { a as CardDescription, i as CardContent, n as CardFooter, o as CardTitle, r as CardHeader, t as Card } from "../card-Cphn2nA3.mjs";
2
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
1
+ import { a as CardField, c as CardFooter, d as CardTitle, i as CardContent, l as CardHeader, n as Card, o as CardFieldLabel, r as CardAction, s as CardFieldValue, t as CardSaveBar, u as CardDescription } from "../card-save-bar-Dub71HRf.mjs";
2
+ export { Card, CardAction, CardContent, CardDescription, CardField, CardFieldLabel, CardFieldValue, CardFooter, CardHeader, CardSaveBar, CardTitle };
@@ -0,0 +1,281 @@
1
+ import { t as cn } from "./utils-Bu32wN-x.mjs";
2
+ import { t as Button } from "./button-DoMqfQLu.mjs";
3
+ import { cva } from "class-variance-authority";
4
+ import "react";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ //#region ../shadcn/ui/card.tsx
7
+ function CardTitle({ className, ...props }) {
8
+ return /* @__PURE__ */ jsx("div", {
9
+ "data-slot": "card-title",
10
+ className: cn("leading-none font-semibold", className),
11
+ ...props
12
+ });
13
+ }
14
+ function CardDescription({ className, ...props }) {
15
+ return /* @__PURE__ */ jsx("div", {
16
+ "data-slot": "card-description",
17
+ className: cn("text-muted-foreground text-sm", className),
18
+ ...props
19
+ });
20
+ }
21
+ //#endregion
22
+ //#region src/components/base/card/card.tsx
23
+ /**
24
+ * Datum Card
25
+ *
26
+ * Extends the shadcn Card with layout variants so consumers can build dense
27
+ * dashboard tiles, sectioned settings cards, and flush lists/tables without
28
+ * fighting the default padding with className overrides.
29
+ *
30
+ * Spacing model
31
+ * -------------
32
+ * The root publishes two CSS variables that every slot reads:
33
+ *
34
+ * --card-px horizontal inset shared by header, content, and footer
35
+ * --card-py vertical inset used by header/footer/content in sectioned cards
36
+ *
37
+ * Both are equal for a given `size` (1rem for `sm`, 1.5rem for `md`), so the
38
+ * card frame is uniform; `CardHeader size` only nudges the header's own inset.
39
+ *
40
+ * Consumers building their own rows inside a flush `CardContent` can use
41
+ * `px-(--card-px)` to line up with the card chrome regardless of `size`.
42
+ *
43
+ * Layouts
44
+ * -------
45
+ * - Stacked (default): the root carries vertical padding and a gap between
46
+ * slots; slots only carry horizontal padding. This is the historical
47
+ * behaviour and the default visuals are unchanged.
48
+ * - Sectioned (`sectioned`): the root carries no padding or gap; each slot
49
+ * owns its own vertical inset and slots are separated by dividers
50
+ * (`CardHeader bordered`, `CardFooter bordered`). Use for headers that sit
51
+ * above flush lists/tables, and for settings cards with a sticky footer.
52
+ */
53
+ const cardVariants = cva("group/card bg-card text-card-foreground border-card-border flex flex-col rounded-xl border", {
54
+ variants: {
55
+ size: {
56
+ sm: "[--card-px:1rem] [--card-py:1rem]",
57
+ md: "[--card-px:1.5rem] [--card-py:1.5rem]"
58
+ },
59
+ sectioned: {
60
+ true: "gap-0 py-0",
61
+ false: ""
62
+ }
63
+ },
64
+ compoundVariants: [{
65
+ size: "sm",
66
+ sectioned: false,
67
+ className: "gap-3 py-4"
68
+ }, {
69
+ size: "md",
70
+ sectioned: false,
71
+ className: "gap-4 py-6"
72
+ }],
73
+ defaultVariants: {
74
+ size: "md",
75
+ sectioned: false
76
+ }
77
+ });
78
+ function Card({ className, size, sectioned, ...props }) {
79
+ return /* @__PURE__ */ jsx("div", {
80
+ "data-slot": "card",
81
+ "data-size": size ?? "md",
82
+ "data-layout": sectioned ? "sectioned" : "stacked",
83
+ className: cn(cardVariants({
84
+ size,
85
+ sectioned
86
+ }), className),
87
+ ...props
88
+ });
89
+ }
90
+ const cardHeaderVariants = cva("@container/card-header group/card-header border-card-border grid auto-rows-min grid-rows-[auto_auto] content-center items-center px-(--card-px) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:items-start", {
91
+ variants: {
92
+ /**
93
+ * Header density. Controls the gap between title and description and,
94
+ * in sectioned cards, the header's minimum height (`lg` also grows the
95
+ * vertical inset). Stacked cards take their vertical spacing from the
96
+ * root.
97
+ */
98
+ size: {
99
+ sm: "has-data-[slot=card-description]:gap-1 group-data-[layout=sectioned]/card:min-h-12 group-data-[layout=sectioned]/card:py-(--card-py)",
100
+ md: "has-data-[slot=card-description]:gap-3 group-data-[layout=sectioned]/card:min-h-14 group-data-[layout=sectioned]/card:py-(--card-py)",
101
+ lg: "has-data-[slot=card-description]:gap-3 group-data-[layout=sectioned]/card:min-h-16 group-data-[layout=sectioned]/card:py-[calc(var(--card-py)*1.25)]"
102
+ },
103
+ /** Draw a divider under the header. Pairs with `sectioned` cards. */
104
+ bordered: {
105
+ true: "border-b",
106
+ false: ""
107
+ }
108
+ },
109
+ defaultVariants: {
110
+ size: "md",
111
+ bordered: false
112
+ }
113
+ });
114
+ function CardHeader({ className, size, bordered, ...props }) {
115
+ return /* @__PURE__ */ jsx("div", {
116
+ "data-slot": "card-header",
117
+ className: cn(cardHeaderVariants({
118
+ size,
119
+ bordered
120
+ }), className),
121
+ ...props
122
+ });
123
+ }
124
+ /**
125
+ * Trailing header action (button, link, badge). Renders in the header's
126
+ * second grid column. With a description it spans both rows and top-aligns;
127
+ * title-only it shares the title's row and centres against it.
128
+ */
129
+ function CardAction({ className, ...props }) {
130
+ return /* @__PURE__ */ jsx("div", {
131
+ "data-slot": "card-action",
132
+ className: cn("col-start-2 row-start-1 flex items-center gap-2 self-center justify-self-end", "group-has-data-[slot=card-description]/card-header:row-end-3 group-has-data-[slot=card-description]/card-header:self-start", className),
133
+ ...props
134
+ });
135
+ }
136
+ const cardContentVariants = cva("", {
137
+ variants: {
138
+ /**
139
+ * - `default`: inset to match the card chrome.
140
+ * - `x-none`: no horizontal inset — rows, tables, and dividers run to
141
+ * the card edge while the header stays inset.
142
+ * - `none`: no inset at all.
143
+ */
144
+ padding: {
145
+ "default": "px-(--card-px) group-data-[layout=sectioned]/card:py-(--card-py)",
146
+ "x-none": "px-0 group-data-[layout=sectioned]/card:py-(--card-py)",
147
+ "none": "p-0"
148
+ } },
149
+ defaultVariants: { padding: "default" }
150
+ });
151
+ function CardContent({ className, padding, ...props }) {
152
+ return /* @__PURE__ */ jsx("div", {
153
+ "data-slot": "card-content",
154
+ className: cn(cardContentVariants({ padding }), className),
155
+ ...props
156
+ });
157
+ }
158
+ const cardFooterVariants = cva("border-card-border", {
159
+ variants: {
160
+ padding: {
161
+ "default": "px-(--card-px) group-data-[layout=sectioned]/card:py-(--card-py)",
162
+ "x-none": "px-0 group-data-[layout=sectioned]/card:py-(--card-py)",
163
+ "none": "p-0"
164
+ },
165
+ /** Draw a divider above the footer. Pairs with `sectioned` cards. */
166
+ bordered: {
167
+ true: "border-t",
168
+ false: ""
169
+ }
170
+ },
171
+ defaultVariants: {
172
+ padding: "default",
173
+ bordered: false
174
+ }
175
+ });
176
+ function CardFooter({ className, padding, bordered, ...props }) {
177
+ return /* @__PURE__ */ jsx("div", {
178
+ "data-slot": "card-footer",
179
+ className: cn(cardFooterVariants({
180
+ padding,
181
+ bordered
182
+ }), className),
183
+ ...props
184
+ });
185
+ }
186
+ /**
187
+ * Label | value definition row for sectioned settings cards.
188
+ *
189
+ * Two equal columns from `sm` up (stacked below), so labels, values, inline
190
+ * inputs, and status chips share the same midline down a card and across
191
+ * neighbouring cards. Both columns are `minmax(0, 1fr)` so long mono values
192
+ * can truncate instead of pushing the value column out. Pair with
193
+ * `CardContent padding="none"`: the row insets itself with `mx-(--card-px)`
194
+ * (not padding) so the divider between rows runs only as wide as the content,
195
+ * while the card header's own divider still spans the full card.
196
+ * Compose a help control inside `CardFieldLabel`; keep Tooltip/icons in the
197
+ * consumer, not here.
198
+ */
199
+ function CardField({ className, ...props }) {
200
+ return /* @__PURE__ */ jsx("div", {
201
+ "data-slot": "card-field",
202
+ className: cn("border-card-border mx-(--card-px) grid grid-cols-1 items-start gap-1 border-b py-3.5 last:border-b-0 sm:grid-cols-2 sm:items-center sm:gap-x-6", className),
203
+ ...props
204
+ });
205
+ }
206
+ function CardFieldLabel({ className, ...props }) {
207
+ return /* @__PURE__ */ jsx("div", {
208
+ "data-slot": "card-field-label",
209
+ className: cn("flex min-w-0 items-center gap-1.5 text-sm font-medium", className),
210
+ ...props
211
+ });
212
+ }
213
+ function CardFieldValue({ className, ...props }) {
214
+ return /* @__PURE__ */ jsx("div", {
215
+ "data-slot": "card-field-value",
216
+ className: cn("min-w-0 text-sm", className),
217
+ ...props
218
+ });
219
+ }
220
+ //#endregion
221
+ //#region src/components/base/card/card-save-bar.tsx
222
+ function pluralize(count, noun) {
223
+ return `${count} ${noun}${count === 1 ? "" : "s"}`;
224
+ }
225
+ /**
226
+ * Save / cancel bar for inline-editable settings cards.
227
+ *
228
+ * Renders in a bordered `CardFooter` and owns the pattern every settings card
229
+ * repeats: a live status line ("2 unsaved changes · 1 error must be fixed"),
230
+ * a Cancel button, and a Save button that is disabled until something has
231
+ * changed and nothing is invalid. Buttons use the `xs` size to match the
232
+ * `CardAction` controls in the header of a `size="sm"` sectioned card.
233
+ */
234
+ function CardSaveBar({ changeCount, errorCount = 0, saving = false, onCancel, onSave, cancelLabel = "Cancel", saveLabel = "Save changes", children, className, ...props }) {
235
+ const status = children ?? (changeCount === 0 ? "No unsaved changes" : pluralize(changeCount, "unsaved change"));
236
+ return /* @__PURE__ */ jsxs(CardFooter, {
237
+ bordered: true,
238
+ "data-slot": "card-save-bar",
239
+ role: "status",
240
+ "aria-live": "polite",
241
+ className: cn("flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between", className),
242
+ ...props,
243
+ children: [/* @__PURE__ */ jsxs("p", {
244
+ className: "text-muted-foreground flex min-w-0 flex-wrap items-center gap-x-1.5 gap-y-0.5 text-sm",
245
+ children: [/* @__PURE__ */ jsx("span", {
246
+ className: "text-foreground font-medium",
247
+ children: status
248
+ }), errorCount > 0 ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
249
+ "aria-hidden": true,
250
+ children: "·"
251
+ }), /* @__PURE__ */ jsxs("span", {
252
+ className: "text-destructive",
253
+ children: [
254
+ pluralize(errorCount, "error"),
255
+ " ",
256
+ "must be fixed before saving"
257
+ ]
258
+ })] }) : null]
259
+ }), /* @__PURE__ */ jsxs("div", {
260
+ className: "flex shrink-0 items-center gap-2",
261
+ children: [/* @__PURE__ */ jsx(Button, {
262
+ type: "secondary",
263
+ theme: "outline",
264
+ size: "xs",
265
+ disabled: saving,
266
+ onClick: onCancel,
267
+ children: cancelLabel
268
+ }), /* @__PURE__ */ jsx(Button, {
269
+ type: "primary",
270
+ theme: "solid",
271
+ size: "xs",
272
+ disabled: changeCount === 0 || errorCount > 0 || saving,
273
+ loading: saving,
274
+ onClick: onSave,
275
+ children: saveLabel
276
+ })]
277
+ })]
278
+ });
279
+ }
280
+ //#endregion
281
+ export { CardField as a, CardFooter as c, CardTitle as d, CardContent as i, CardHeader as l, Card as n, CardFieldLabel as o, CardAction as r, CardFieldValue as s, CardSaveBar as t, CardDescription as u };
@@ -0,0 +1,29 @@
1
+ import * as React from 'react';
2
+ export interface CardSaveBarProps extends Omit<React.ComponentProps<'div'>, 'children'> {
3
+ /** Number of fields that differ from their saved value. */
4
+ changeCount: number;
5
+ /** Number of fields that currently fail validation. Save is blocked while > 0. */
6
+ errorCount?: number;
7
+ /** A save is in flight: Save shows a spinner and both buttons are disabled. */
8
+ saving?: boolean;
9
+ onCancel: () => void;
10
+ onSave: () => void;
11
+ cancelLabel?: string;
12
+ saveLabel?: string;
13
+ /**
14
+ * Replaces the generated "N unsaved changes" status. The error summary is
15
+ * still appended when `errorCount` is non-zero.
16
+ */
17
+ children?: React.ReactNode;
18
+ }
19
+ /**
20
+ * Save / cancel bar for inline-editable settings cards.
21
+ *
22
+ * Renders in a bordered `CardFooter` and owns the pattern every settings card
23
+ * repeats: a live status line ("2 unsaved changes · 1 error must be fixed"),
24
+ * a Cancel button, and a Save button that is disabled until something has
25
+ * changed and nothing is invalid. Buttons use the `xs` size to match the
26
+ * `CardAction` controls in the header of a `size="sm"` sectioned card.
27
+ */
28
+ declare function CardSaveBar({ changeCount, errorCount, saving, onCancel, onSave, cancelLabel, saveLabel, children, className, ...props }: CardSaveBarProps): React.JSX.Element;
29
+ export { CardSaveBar };
@@ -1,7 +1,84 @@
1
- import { CardContent, CardDescription, CardTitle } from '../../../_shadcn/ui/card';
1
+ import type { VariantProps } from 'class-variance-authority';
2
+ import { CardDescription, CardTitle } from '../../../_shadcn/ui/card';
2
3
  import * as React from 'react';
3
- declare function Card({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
4
- declare function CardHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
5
- declare function CardFooter({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
6
- export { CardContent, CardDescription, CardFooter, CardTitle };
7
- export { Card, CardHeader };
4
+ /**
5
+ * Datum Card
6
+ *
7
+ * Extends the shadcn Card with layout variants so consumers can build dense
8
+ * dashboard tiles, sectioned settings cards, and flush lists/tables without
9
+ * fighting the default padding with className overrides.
10
+ *
11
+ * Spacing model
12
+ * -------------
13
+ * The root publishes two CSS variables that every slot reads:
14
+ *
15
+ * --card-px horizontal inset shared by header, content, and footer
16
+ * --card-py vertical inset used by header/footer/content in sectioned cards
17
+ *
18
+ * Both are equal for a given `size` (1rem for `sm`, 1.5rem for `md`), so the
19
+ * card frame is uniform; `CardHeader size` only nudges the header's own inset.
20
+ *
21
+ * Consumers building their own rows inside a flush `CardContent` can use
22
+ * `px-(--card-px)` to line up with the card chrome regardless of `size`.
23
+ *
24
+ * Layouts
25
+ * -------
26
+ * - Stacked (default): the root carries vertical padding and a gap between
27
+ * slots; slots only carry horizontal padding. This is the historical
28
+ * behaviour and the default visuals are unchanged.
29
+ * - Sectioned (`sectioned`): the root carries no padding or gap; each slot
30
+ * owns its own vertical inset and slots are separated by dividers
31
+ * (`CardHeader bordered`, `CardFooter bordered`). Use for headers that sit
32
+ * above flush lists/tables, and for settings cards with a sticky footer.
33
+ */
34
+ declare const cardVariants: (props?: ({
35
+ size?: "sm" | "md" | null | undefined;
36
+ sectioned?: boolean | null | undefined;
37
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
38
+ export interface CardProps extends React.ComponentProps<'div'>, VariantProps<typeof cardVariants> {
39
+ }
40
+ declare function Card({ className, size, sectioned, ...props }: CardProps): React.JSX.Element;
41
+ declare const cardHeaderVariants: (props?: ({
42
+ size?: "sm" | "md" | "lg" | null | undefined;
43
+ bordered?: boolean | null | undefined;
44
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
45
+ export interface CardHeaderProps extends React.ComponentProps<'div'>, VariantProps<typeof cardHeaderVariants> {
46
+ }
47
+ declare function CardHeader({ className, size, bordered, ...props }: CardHeaderProps): React.JSX.Element;
48
+ /**
49
+ * Trailing header action (button, link, badge). Renders in the header's
50
+ * second grid column. With a description it spans both rows and top-aligns;
51
+ * title-only it shares the title's row and centres against it.
52
+ */
53
+ declare function CardAction({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
54
+ declare const cardContentVariants: (props?: ({
55
+ padding?: "default" | "none" | "x-none" | null | undefined;
56
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
57
+ export interface CardContentProps extends React.ComponentProps<'div'>, VariantProps<typeof cardContentVariants> {
58
+ }
59
+ declare function CardContent({ className, padding, ...props }: CardContentProps): React.JSX.Element;
60
+ declare const cardFooterVariants: (props?: ({
61
+ padding?: "default" | "none" | "x-none" | null | undefined;
62
+ bordered?: boolean | null | undefined;
63
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
64
+ export interface CardFooterProps extends React.ComponentProps<'div'>, VariantProps<typeof cardFooterVariants> {
65
+ }
66
+ declare function CardFooter({ className, padding, bordered, ...props }: CardFooterProps): React.JSX.Element;
67
+ /**
68
+ * Label | value definition row for sectioned settings cards.
69
+ *
70
+ * Two equal columns from `sm` up (stacked below), so labels, values, inline
71
+ * inputs, and status chips share the same midline down a card and across
72
+ * neighbouring cards. Both columns are `minmax(0, 1fr)` so long mono values
73
+ * can truncate instead of pushing the value column out. Pair with
74
+ * `CardContent padding="none"`: the row insets itself with `mx-(--card-px)`
75
+ * (not padding) so the divider between rows runs only as wide as the content,
76
+ * while the card header's own divider still spans the full card.
77
+ * Compose a help control inside `CardFieldLabel`; keep Tooltip/icons in the
78
+ * consumer, not here.
79
+ */
80
+ declare function CardField({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
81
+ declare function CardFieldLabel({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
82
+ declare function CardFieldValue({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
83
+ export { CardDescription, CardTitle };
84
+ export { Card, CardAction, CardContent, CardField, CardFieldLabel, CardFieldValue, CardFooter, CardHeader };
@@ -1 +1,2 @@
1
1
  export * from './card';
2
+ export * from './card-save-bar';
@@ -30,6 +30,7 @@ export * from './responsive-dropdown';
30
30
  export * from './responsive-popover';
31
31
  export * from './select';
32
32
  export * from './separator';
33
+ export * from './settings-nav';
33
34
  export * from './sheet';
34
35
  export * from './sidebar';
35
36
  export * from './skeleton';
@@ -0,0 +1,2 @@
1
+ export { SettingsNav, SettingsNavItem, type SettingsNavItemProps, SettingsNavLabel } from './settings-nav';
2
+ export { settingsNavItemVariants } from './settings-nav-variants';
@@ -0,0 +1,3 @@
1
+ export declare const settingsNavItemVariants: (props?: ({
2
+ variant?: "default" | "danger" | null | undefined;
3
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
@@ -0,0 +1,28 @@
1
+ import type { VariantProps } from 'class-variance-authority';
2
+ import * as React from 'react';
3
+ import { settingsNavItemVariants } from './settings-nav-variants';
4
+ /**
5
+ * Compact inset settings navigation for configuration pages.
6
+ *
7
+ * Deliberately separate from `NavMenu` / sidebar primitives — those are bound
8
+ * to the app chrome context. SettingsNav is a page-local list: a SETTINGS
9
+ * eyebrow, icon items with an active fill, optional error dots, Soon badges,
10
+ * and a danger item for destructive sections.
11
+ */
12
+ declare function SettingsNav({ className, ...props }: React.ComponentProps<'nav'>): React.JSX.Element;
13
+ declare function SettingsNavLabel({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
14
+ export interface SettingsNavItemProps extends React.AnchorHTMLAttributes<HTMLAnchorElement>, VariantProps<typeof settingsNavItemVariants> {
15
+ /** When true, renders via Radix Slot so a router `Link` can own the element. */
16
+ asChild?: boolean;
17
+ /** Leading icon (lucide or custom). Coloured by the active / danger state. */
18
+ icon?: React.ReactNode;
19
+ /** Marks the item as the current section. */
20
+ active?: boolean;
21
+ /** Small status dot (e.g. validation error on that section). */
22
+ indicator?: boolean;
23
+ /** Trailing badge content, typically "Soon". */
24
+ badge?: React.ReactNode;
25
+ disabled?: boolean;
26
+ }
27
+ declare function SettingsNavItem({ className, variant, asChild, icon, active, indicator, badge, disabled, children, href, onClick, ...props }: SettingsNavItemProps): React.JSX.Element;
28
+ export { SettingsNav, SettingsNavItem, SettingsNavLabel };
@@ -1,14 +1,22 @@
1
+ import type { VariantProps } from 'class-variance-authority';
1
2
  import * as TabsPrimitive from '@radix-ui/react-tabs';
2
3
  import * as React from 'react';
3
4
  /**
4
5
  * Datum Tabs Component
5
6
  * Extends shadcn Tabs with:
6
7
  * - TabsLinkTrigger for router-agnostic link integration
8
+ * - A `line` variant (underline page tabs) with a sliding active indicator
7
9
  * - Dark mode customizations
8
10
  */
9
- declare function Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>): React.JSX.Element;
10
- declare function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>): React.JSX.Element;
11
- declare function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>): React.JSX.Element;
11
+ type TabsVariant = 'default' | 'line';
12
+ declare function Tabs({ className, value: valueProp, defaultValue, onValueChange, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>): React.JSX.Element;
13
+ declare const tabsListVariants: (props?: ({
14
+ variant?: "default" | "line" | null | undefined;
15
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
16
+ export interface TabsListProps extends React.ComponentProps<typeof TabsPrimitive.List>, VariantProps<typeof tabsListVariants> {
17
+ }
18
+ declare function TabsList({ className, variant, ...props }: TabsListProps): React.JSX.Element;
19
+ declare function TabsTrigger({ className, value, children, asChild, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>): React.JSX.Element;
12
20
  declare function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>): React.JSX.Element;
13
21
  interface TabsLinkTriggerProps extends React.ComponentProps<typeof TabsPrimitive.Trigger> {
14
22
  /** Destination URL — mapped to `href` for native `<a>`, `to` for router Links */
@@ -18,4 +26,4 @@ interface TabsLinkTriggerProps extends React.ComponentProps<typeof TabsPrimitive
18
26
  }
19
27
  declare function TabsLinkTrigger({ value, href, linkComponent: LinkComp, children, className, ...props }: TabsLinkTriggerProps): React.JSX.Element;
20
28
  export { Tabs, TabsContent, TabsLinkTrigger, TabsList, TabsTrigger };
21
- export type { TabsLinkTriggerProps };
29
+ export type { TabsLinkTriggerProps, TabsVariant };
@@ -1,2 +1,2 @@
1
- import { _ as useNuqsAdapter, a as useDataTablePagination, b as DEFAULT_PAGE_SIZE, c as useDataTableSelection, d as resolvePath, f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, i as useDataTableLoading, l as useDataTableSorting, m as DataTableRowActions, n as useDataTableFilters, o as useDataTableRows, p as dataTableFeatures, r as useDataTableInlineContents, s as useDataTableSearch, t as DataTable, u as createDataTableStore, v as DEFAULT_DEBOUNCE_MS, x as DEFAULT_PAGE_SIZES, y as DEFAULT_LOADING_ROWS } from "../data-table-BaWOHdZX.mjs";
1
+ import { _ as useNuqsAdapter, a as useDataTablePagination, b as DEFAULT_PAGE_SIZE, c as useDataTableSelection, d as resolvePath, f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, i as useDataTableLoading, l as useDataTableSorting, m as DataTableRowActions, n as useDataTableFilters, o as useDataTableRows, p as dataTableFeatures, r as useDataTableInlineContents, s as useDataTableSearch, t as DataTable, u as createDataTableStore, v as DEFAULT_DEBOUNCE_MS, x as DEFAULT_PAGE_SIZES, y as DEFAULT_LOADING_ROWS } from "../data-table-CW3-xqkg.mjs";
2
2
  export { DEFAULT_DEBOUNCE_MS, DEFAULT_LOADING_ROWS, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZES, DataTable, DataTableColumnHeader, DataTableRowActions, createDataTableStore, createSelectionColumn, dataTableFeatures, resolvePath, rowMatchesSearch, useDataTableFilters, useDataTableInlineContents, useDataTableLoading, useDataTablePagination, useDataTableRows, useDataTableSearch, useDataTableSelection, useDataTableSorting, useNuqsAdapter };
@@ -4,11 +4,11 @@ import { t as Button } from "./button-DoMqfQLu.mjs";
4
4
  import { t as Checkbox } from "./checkbox-C6P12fio.mjs";
5
5
  import { t as Input } from "./input-j4tbmYYz.mjs";
6
6
  import { t as ResponsiveDropdown } from "./responsive-dropdown-C_KKgLbH.mjs";
7
- import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-CQsG8Kju.mjs";
7
+ import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-D4pk9e2d.mjs";
8
8
  import { Skeleton } from "./skeleton/index.mjs";
9
9
  import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "./table/index.mjs";
10
10
  import { t as Autocomplete } from "./autocomplete-BxtzndxZ.mjs";
11
- import { t as CalendarDatePicker } from "./calendar-date-picker-bpTUcGu_.mjs";
11
+ import { t as CalendarDatePicker } from "./calendar-date-picker-DW31tDSa.mjs";
12
12
  import { t as ActionRow } from "./action-row-DTvs91_3.mjs";
13
13
  import { n as useDebouncedSearchInput } from "./use-debounced-search-input-yu_F0QBt.mjs";
14
14
  import { t as MultiSelect } from "./multi-select-CH8KERkt.mjs";
@@ -1,4 +1,4 @@
1
- import { M as getBrowserTimezone, N as getTimezoneOffset, j as formatTimezoneLabel } from "../date-time-range-picker-DlFTh3DF.mjs";
2
- import { t as CalendarDatePicker } from "../calendar-date-picker-bpTUcGu_.mjs";
3
- import { _ as getShortTimezoneDisplay, a as TimeRangePicker, b as utcToLocalInputString, c as getPresetByKey, d as TimezoneSelector, f as QuickRangesPanel, g as getDefaultTimezoneOptions, h as formatUtcForDisplay, i as formatTimeRangeDisplay, l as getPresetByShortcut, m as createTimezoneOption, n as formatDateForInput, o as DEFAULT_PRESETS, p as CustomRangePanel, r as formatSingleTimeDisplay, s as getDefaultPreset, t as toApiTimeRange, u as getPresetRange, v as localInputStringToUtc, x as zonedDateToUtcString, y as utcStringToZonedDate } from "../to-api-format-Bm1VcKkS.mjs";
1
+ import { M as getBrowserTimezone, N as getTimezoneOffset, j as formatTimezoneLabel } from "../date-time-range-picker-BEulotVf.mjs";
2
+ import { t as CalendarDatePicker } from "../calendar-date-picker-DW31tDSa.mjs";
3
+ import { _ as getShortTimezoneDisplay, a as TimeRangePicker, b as utcToLocalInputString, c as getPresetByKey, d as TimezoneSelector, f as QuickRangesPanel, g as getDefaultTimezoneOptions, h as formatUtcForDisplay, i as formatTimeRangeDisplay, l as getPresetByShortcut, m as createTimezoneOption, n as formatDateForInput, o as DEFAULT_PRESETS, p as CustomRangePanel, r as formatSingleTimeDisplay, s as getDefaultPreset, t as toApiTimeRange, u as getPresetRange, v as localInputStringToUtc, x as zonedDateToUtcString, y as utcStringToZonedDate } from "../to-api-format-W3qJE68W.mjs";
4
4
  export { CustomRangePanel as AbsoluteRangePanel, CustomRangePanel, CalendarDatePicker, DEFAULT_PRESETS, QuickRangesPanel, TimeRangePicker, TimezoneSelector, createTimezoneOption, formatDateForInput, formatSingleTimeDisplay, formatTimeRangeDisplay, formatTimezoneLabel, formatUtcForDisplay, getBrowserTimezone, getDefaultPreset, getDefaultTimezoneOptions, getPresetByKey, getPresetByShortcut, getPresetRange, getShortTimezoneDisplay, getTimezoneOffset, localInputStringToUtc, toApiTimeRange, utcStringToZonedDate, utcToLocalInputString, zonedDateToUtcString };
@@ -1,2 +1,2 @@
1
- import { t as DateTimePicker } from "../date-time-picker-Bd7qSZVr.mjs";
1
+ import { t as DateTimePicker } from "../date-time-picker-BVvWQXMt.mjs";
2
2
  export { DateTimePicker };
@@ -1,5 +1,5 @@
1
1
  import { t as useDeprecationWarning } from "./use-deprecation-warning-DXrGc0jX.mjs";
2
- import { r as DateTimePicker$1 } from "./picker-DbKukBkk.mjs";
2
+ import { r as DateTimePicker$1 } from "./picker-Cke6cfsb.mjs";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/components/features/date-time-picker/date-time-picker.tsx
5
5
  /**
@@ -1309,7 +1309,7 @@ function PickerTrigger({ placeholder = "Pick a date", clearable = false, disable
1309
1309
  if (state.open) actions.close();
1310
1310
  else actions.open();
1311
1311
  },
1312
- className: cn("w-full justify-between gap-2 font-normal", triggerClassName, className),
1312
+ className: cn("w-full justify-between gap-2 rounded-lg font-normal", triggerClassName, className),
1313
1313
  ...slotProps,
1314
1314
  children: [/* @__PURE__ */ jsxs("span", {
1315
1315
  className: "flex flex-1 items-center gap-2 truncate",
@@ -1,3 +1,3 @@
1
- import { A as FormCheckbox, C as FormDialog, D as FormCustom, E as FormDatePicker, M as FormAutosearch, N as FormAutocomplete, O as FormCopyBox, S as FormError, T as FormDateTimePicker, _ as FormRadioGroup, a as useField, b as FormFieldArray, c as useWatchAll, d as FormTextarea, f as FormSwitch, g as FormRoot, h as FormSelectItem, i as useFieldContext, j as FormButton, k as FormCombobox, l as FormTransfer, m as FormSelect, n as useFormState, o as FormWhen, p as FormSubmit, r as useFormContext, s as useWatch, t as Form, u as FormTimePicker, v as FormRadioItem, w as FormDescription, x as FormField, y as FormInput } from "../form-BGlPoZ1G.mjs";
1
+ import { A as FormCheckbox, C as FormDialog, D as FormCustom, E as FormDatePicker, M as FormAutosearch, N as FormAutocomplete, O as FormCopyBox, S as FormError, T as FormDateTimePicker, _ as FormRadioGroup, a as useField, b as FormFieldArray, c as useWatchAll, d as FormTextarea, f as FormSwitch, g as FormRoot, h as FormSelectItem, i as useFieldContext, j as FormButton, k as FormCombobox, l as FormTransfer, m as FormSelect, n as useFormState, o as FormWhen, p as FormSubmit, r as useFormContext, s as useWatch, t as Form, u as FormTimePicker, v as FormRadioItem, w as FormDescription, x as FormField, y as FormInput } from "../form-DB5MbJ2U.mjs";
2
2
  import { n as useAdapter, t as FormAdapterProvider } from "../adapter-context-h0jCVqGO.mjs";
3
3
  export { Form, FormAdapterProvider, FormAutocomplete, FormAutosearch, FormButton, FormCheckbox, FormCombobox, FormCopyBox, FormCustom, FormDatePicker, FormDateTimePicker, FormDescription, FormDialog, FormError, FormField, FormFieldArray, FormInput, FormRadioGroup, FormRadioItem, FormRoot, FormSelect, FormSelectItem, FormSubmit, FormSwitch, FormTextarea, FormTimePicker, FormTransfer, FormWhen, useAdapter, useField, useFieldContext, useFormContext, useFormState, useWatch, useWatchAll };
@@ -7,20 +7,20 @@ import { t as useControllableState } from "./use-controllable-state-Dna7u3r9.mjs
7
7
  import { t as Input } from "./input-j4tbmYYz.mjs";
8
8
  import { t as Label } from "./label-Bk6FXsju.mjs";
9
9
  import { n as RadioGroupItem, t as RadioGroup } from "./radio-group-LduBVTnh.mjs";
10
- import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-CQsG8Kju.mjs";
10
+ import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-D4pk9e2d.mjs";
11
11
  import { t as Tooltip } from "./tooltip-DhbN1BDK.mjs";
12
12
  import { t as Switch } from "./switch-BaR-Vna4.mjs";
13
- import { t as Textarea } from "./textarea-B6YhjFVC.mjs";
13
+ import { t as Textarea } from "./textarea-DiSGxCBO.mjs";
14
14
  import { t as Autocomplete } from "./autocomplete-BxtzndxZ.mjs";
15
15
  import { Autosearch } from "./autosearch/index.mjs";
16
- import { t as CalendarDatePicker } from "./calendar-date-picker-bpTUcGu_.mjs";
16
+ import { t as CalendarDatePicker } from "./calendar-date-picker-DW31tDSa.mjs";
17
17
  import { t as toast } from "./toast-BUPlDkN3.mjs";
18
- import { t as DateTimePicker } from "./date-time-picker-Bd7qSZVr.mjs";
18
+ import { t as DateTimePicker } from "./date-time-picker-BVvWQXMt.mjs";
19
19
  import { n as useFormContext$1, t as FormProvider } from "./form-context-DzB2a-dw.mjs";
20
20
  import { t as useCopyToClipboard } from "./use-copy-to-clipboard-DZDq_85T.mjs";
21
21
  import { n as useAdapter } from "./adapter-context-h0jCVqGO.mjs";
22
22
  import { InputWithAddons } from "./input-with-addons/index.mjs";
23
- import { t as TimePicker } from "./time-picker-rVTkmbIG.mjs";
23
+ import { t as TimePicker } from "./time-picker-BzNSUazl.mjs";
24
24
  import { t as Transfer } from "./transfer-DsshYgIk.mjs";
25
25
  import { CheckIcon, CircleHelp, CopyIcon } from "lucide-react";
26
26
  import * as React from "react";
@@ -1,2 +1,2 @@
1
- import { t as GroupedTable } from "../grouped-table-DWtEx18V.mjs";
1
+ import { t as GroupedTable } from "../grouped-table-DKUsSHpe.mjs";
2
2
  export { GroupedTable };
@@ -6,7 +6,7 @@ import { t as useControllableState } from "./use-controllable-state-Dna7u3r9.mjs
6
6
  import { Skeleton } from "./skeleton/index.mjs";
7
7
  import { TableBody, TableCell, TableHead, TableHeader, TableRow } from "./table/index.mjs";
8
8
  import { n as EASE } from "./motion-DvGRWdsm.mjs";
9
- import { f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, m as DataTableRowActions, p as dataTableFeatures } from "./data-table-BaWOHdZX.mjs";
9
+ import { f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, m as DataTableRowActions, p as dataTableFeatures } from "./data-table-CW3-xqkg.mjs";
10
10
  import { n as useDebouncedSearchInput } from "./use-debounced-search-input-yu_F0QBt.mjs";
11
11
  import { InputWithAddons } from "./input-with-addons/index.mjs";
12
12
  import { ChevronRight, Search, X } from "lucide-react";
package/dist/index.mjs CHANGED
@@ -10,7 +10,7 @@ import { t as Separator } from "./separator-vbPD_WFQ.mjs";
10
10
  import { i as buttonGroupVariants, n as ButtonGroupSeparator, r as ButtonGroupText, t as ButtonGroup } from "./button-group-DFrTH4L8.mjs";
11
11
  import { t as Icon } from "./icon-wrapper-DKfJlJd0.mjs";
12
12
  import { Calendar, CalendarDayButton } from "./calendar/index.mjs";
13
- import { a as CardDescription, i as CardContent, n as CardFooter, o as CardTitle, r as CardHeader, t as Card } from "./card-Cphn2nA3.mjs";
13
+ import { a as CardField, c as CardFooter, d as CardTitle, i as CardContent, l as CardHeader, n as Card, o as CardFieldLabel, r as CardAction, s as CardFieldValue, t as CardSaveBar, u as CardDescription } from "./card-save-bar-Dub71HRf.mjs";
14
14
  import { a as ChartTooltip, i as ChartStyle, n as ChartLegend, o as ChartTooltipContent, r as ChartLegendContent, t as ChartContainer } from "./chart-EgzTS28l.mjs";
15
15
  import { t as Checkbox } from "./checkbox-C6P12fio.mjs";
16
16
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./collapsible/index.mjs";
@@ -32,14 +32,15 @@ import { n as RadioGroupItem, t as RadioGroup } from "./radio-group-LduBVTnh.mjs
32
32
  import { t as useBreakpoint } from "./use-breakpoint-CwiUJSmk.mjs";
33
33
  import { t as ResponsiveDropdown } from "./responsive-dropdown-C_KKgLbH.mjs";
34
34
  import { t as ResponsivePopover } from "./responsive-popover-8VcjBM2d.mjs";
35
- import { a as SelectLabel, c as SelectSeparator, i as SelectItem, l as SelectTrigger, n as SelectContent, o as SelectScrollDownButton, r as SelectGroup, s as SelectScrollUpButton, t as Select, u as SelectValue } from "./select-CQsG8Kju.mjs";
35
+ import { a as SelectLabel, c as SelectSeparator, i as SelectItem, l as SelectTrigger, n as SelectContent, o as SelectScrollDownButton, r as SelectGroup, s as SelectScrollUpButton, t as Select, u as SelectValue } from "./select-D4pk9e2d.mjs";
36
+ import { i as settingsNavItemVariants, n as SettingsNavItem, r as SettingsNavLabel, t as SettingsNav } from "./settings-nav-BCL1lMTM.mjs";
36
37
  import { C as SidebarProvider, S as SidebarGroupLabel, _ as SidebarMenuSubButton, a as SidebarInput, b as SidebarGroupAction, c as SidebarSeparator, d as SidebarMenuAction, f as SidebarMenuBadge, g as SidebarMenuSub, h as SidebarMenuSkeleton, i as SidebarHeader, l as SidebarTrigger, m as SidebarMenuItem, n as SidebarContent, o as SidebarInset, p as SidebarMenuButton, r as SidebarFooter, s as SidebarRail, t as Sidebar, u as SidebarMenu, v as SidebarMenuSubItem, w as useSidebar, x as SidebarGroupContent, y as SidebarGroup } from "./sidebar-BeWEEu7P.mjs";
37
38
  import { t as Tooltip } from "./tooltip-DhbN1BDK.mjs";
38
39
  import { Skeleton } from "./skeleton/index.mjs";
39
40
  import { t as Switch } from "./switch-BaR-Vna4.mjs";
40
41
  import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "./table/index.mjs";
41
42
  import { Tabs, TabsContent, TabsLinkTrigger, TabsList, TabsTrigger } from "./tabs/index.mjs";
42
- import { t as Textarea } from "./textarea-B6YhjFVC.mjs";
43
+ import { t as Textarea } from "./textarea-DiSGxCBO.mjs";
43
44
  import { a as ListItem, c as Title, d as titleVariants, i as List, l as paragraphVariants, n as Code, o as Paragraph, r as Link, s as Text, t as Blockquote, u as textVariants } from "./typography-BXIBvq3-.mjs";
44
45
  import { t as VisuallyHidden } from "./visuallyhidden-D7L_qs8b.mjs";
45
46
  import { a as hasActiveDescendant, i as findItemByHref, n as NavMenu, o as isNavItemActive, r as NavMenuItem, s as normalizePath, t as AppNavigation } from "./app-navigation-DhPaPFnN.mjs";
@@ -48,29 +49,29 @@ import { t as LoaderOverlay } from "./loader-overlay-DD94azZX.mjs";
48
49
  import { t as Autocomplete } from "./autocomplete-BxtzndxZ.mjs";
49
50
  import { Autosearch, defaultAutosearchValue } from "./autosearch/index.mjs";
50
51
  import { n as avatarStackVariants, t as AvatarStack } from "./avatar-stack-BUcsjhA6.mjs";
51
- import { M as getBrowserTimezone, N as getTimezoneOffset, j as formatTimezoneLabel } from "./date-time-range-picker-DlFTh3DF.mjs";
52
- import { t as CalendarDatePicker } from "./calendar-date-picker-bpTUcGu_.mjs";
52
+ import { M as getBrowserTimezone, N as getTimezoneOffset, j as formatTimezoneLabel } from "./date-time-range-picker-BEulotVf.mjs";
53
+ import { t as CalendarDatePicker } from "./calendar-date-picker-DW31tDSa.mjs";
53
54
  import { i as ClientOnly, n as useTheme, r as ThemeScript, t as ThemeProvider } from "./themes-Ba2bajuF.mjs";
54
55
  import { a as formatJson, c as isValidYaml, d as CodeEditor, i as CodeEditorTabs, l as jsonToYaml, n as jsonSchema, o as formatYaml, r as yamlSchema, s as isValidJson, t as createCodeEditorSchema, u as yamlToJson } from "./types-agDpVXBG.mjs";
55
56
  import { t as toast } from "./toast-BUPlDkN3.mjs";
56
57
  import { n as Toaster, t as useToast } from "./use-toast-Bpq0yJIT.mjs";
57
- import { _ as useNuqsAdapter, a as useDataTablePagination, b as DEFAULT_PAGE_SIZE, c as useDataTableSelection, d as resolvePath, f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, i as useDataTableLoading, l as useDataTableSorting, m as DataTableRowActions, n as useDataTableFilters, o as useDataTableRows, p as dataTableFeatures, r as useDataTableInlineContents, s as useDataTableSearch, t as DataTable, u as createDataTableStore, v as DEFAULT_DEBOUNCE_MS, x as DEFAULT_PAGE_SIZES, y as DEFAULT_LOADING_ROWS } from "./data-table-BaWOHdZX.mjs";
58
+ import { _ as useNuqsAdapter, a as useDataTablePagination, b as DEFAULT_PAGE_SIZE, c as useDataTableSelection, d as resolvePath, f as rowMatchesSearch, g as createSelectionColumn, h as DataTableColumnHeader, i as useDataTableLoading, l as useDataTableSorting, m as DataTableRowActions, n as useDataTableFilters, o as useDataTableRows, p as dataTableFeatures, r as useDataTableInlineContents, s as useDataTableSearch, t as DataTable, u as createDataTableStore, v as DEFAULT_DEBOUNCE_MS, x as DEFAULT_PAGE_SIZES, y as DEFAULT_LOADING_ROWS } from "./data-table-CW3-xqkg.mjs";
58
59
  import { t as ActionRow } from "./action-row-DTvs91_3.mjs";
59
60
  import { n as useDebouncedSearchInput, t as DEFAULT_SEARCH_DEBOUNCE_MS } from "./use-debounced-search-input-yu_F0QBt.mjs";
60
61
  import { t as MultiSelect } from "./multi-select-CH8KERkt.mjs";
61
62
  import { a as formatRelativeDate, d as parseDate, i as formatCombinedDate, l as getTimestamp, n as DEFAULT_DATE_FORMAT, o as formatTimezoneDate, r as formatAbsoluteDate, s as formatUTCDate, t as DateTime, u as getTimezoneAbbreviation } from "./date-time-lZdefM4H.mjs";
62
- import { t as DateTimePicker } from "./date-time-picker-Bd7qSZVr.mjs";
63
+ import { t as DateTimePicker } from "./date-time-picker-BVvWQXMt.mjs";
63
64
  import { a as DropdownMenuItem, c as DropdownMenuRadioGroup, d as DropdownMenuShortcut, f as DropdownMenuSub, h as DropdownMenuTrigger, i as DropdownMenuGroup, l as DropdownMenuRadioItem, m as DropdownMenuSubTrigger, n as DropdownMenuCheckboxItem, o as DropdownMenuLabel, p as DropdownMenuSubContent, r as DropdownMenuContent, s as DropdownMenuPortal, t as DropdownMenu, u as DropdownMenuSeparator } from "./dropdown-Xvduih96.mjs";
64
65
  import { i as FileInputButton, n as DropzoneContent, r as DropzoneEmptyState, t as Dropzone } from "./dropzone-ihksfjN2.mjs";
65
66
  import { t as EmptyContent } from "./empty-content-CmuVcU0P.mjs";
66
- import { A as FormCheckbox, C as FormDialog, D as FormCustom, E as FormDatePicker, M as FormAutosearch, N as FormAutocomplete, O as FormCopyBox, S as FormError, T as FormDateTimePicker, _ as FormRadioGroup, a as useField, b as FormFieldArray, c as useWatchAll, d as FormTextarea, f as FormSwitch, g as FormRoot, h as FormSelectItem, i as useFieldContext, j as FormButton, k as FormCombobox, l as FormTransfer, m as FormSelect, n as useFormState, o as FormWhen, p as FormSubmit, r as useFormContext, s as useWatch, t as Form, u as FormTimePicker, v as FormRadioItem, w as FormDescription, x as FormField, y as FormInput } from "./form-BGlPoZ1G.mjs";
67
+ import { A as FormCheckbox, C as FormDialog, D as FormCustom, E as FormDatePicker, M as FormAutosearch, N as FormAutocomplete, O as FormCopyBox, S as FormError, T as FormDateTimePicker, _ as FormRadioGroup, a as useField, b as FormFieldArray, c as useWatchAll, d as FormTextarea, f as FormSwitch, g as FormRoot, h as FormSelectItem, i as useFieldContext, j as FormButton, k as FormCombobox, l as FormTransfer, m as FormSelect, n as useFormState, o as FormWhen, p as FormSubmit, r as useFormContext, s as useWatch, t as Form, u as FormTimePicker, v as FormRadioItem, w as FormDescription, x as FormField, y as FormInput } from "./form-DB5MbJ2U.mjs";
67
68
  import { t as useCopyToClipboard } from "./use-copy-to-clipboard-DZDq_85T.mjs";
68
69
  import { n as useAdapter, t as FormAdapterProvider } from "./adapter-context-h0jCVqGO.mjs";
69
70
  import { InputWithAddons } from "./input-with-addons/index.mjs";
70
- import { t as TimePicker } from "./time-picker-rVTkmbIG.mjs";
71
+ import { t as TimePicker } from "./time-picker-BzNSUazl.mjs";
71
72
  import { t as Transfer } from "./transfer-DsshYgIk.mjs";
72
73
  import { a as getResponsiveValue, c as GRID_COLUMNS, d as RESPONSIVE_MAP, i as getGutter, l as GRID_PREFIX, n as Row, o as registerMediaQuery, r as RowContext, s as GRID_BREAKPOINTS, t as Col, u as RESPONSIVE_ARRAY } from "./col-BYGWTB4j.mjs";
73
- import { t as GroupedTable } from "./grouped-table-DWtEx18V.mjs";
74
+ import { t as GroupedTable } from "./grouped-table-DKUsSHpe.mjs";
74
75
  import { t as InputNumber } from "./input-number-TXmW-X9o.mjs";
75
76
  import { a as logoStyles, i as LogoFlat, n as LogoStacked, r as LogoIcon, t as LogoText } from "./logo-text-Dpm5O6Kg.mjs";
76
77
  import { t as Logo } from "./logo-C3FxD7jb.mjs";
@@ -81,7 +82,7 @@ import { n as useRichTextEditor, r as RichTextContent, t as RichTextEditor } fro
81
82
  import { t as defineStepper } from "./stepper-dNvkipop.mjs";
82
83
  import { t as TagsInput } from "./tag-input-Ctxtcpwy.mjs";
83
84
  import { _ as RedisTaskStorage, a as TaskPanelItem, b as createProjectMetadata, c as TaskPanelHeader, d as useCurrentScope, f as useTasksWithLabels, g as detectStorage, h as TaskQueue, i as TaskPanel, l as getContextLabel, m as TaskQueueProvider, n as TaskSummaryDialog, o as TaskPanelCounter, p as useTaskQueue, r as TaskQueueTrigger, s as TaskPanelActions, t as TaskQueueDropdown, u as matchesCurrentScope, v as LocalTaskStorage, x as createUserMetadata, y as createOrgMetadata } from "./task-queue-dropdown-BJS3snfZ.mjs";
84
- import { _ as getShortTimezoneDisplay, a as TimeRangePicker, b as utcToLocalInputString, c as getPresetByKey, d as TimezoneSelector, f as QuickRangesPanel, g as getDefaultTimezoneOptions, h as formatUtcForDisplay, i as formatTimeRangeDisplay, l as getPresetByShortcut, m as createTimezoneOption, n as formatDateForInput, o as DEFAULT_PRESETS, p as CustomRangePanel, r as formatSingleTimeDisplay, s as getDefaultPreset, t as toApiTimeRange, u as getPresetRange, v as localInputStringToUtc, x as zonedDateToUtcString, y as utcStringToZonedDate } from "./to-api-format-Bm1VcKkS.mjs";
85
+ import { _ as getShortTimezoneDisplay, a as TimeRangePicker, b as utcToLocalInputString, c as getPresetByKey, d as TimezoneSelector, f as QuickRangesPanel, g as getDefaultTimezoneOptions, h as formatUtcForDisplay, i as formatTimeRangeDisplay, l as getPresetByShortcut, m as createTimezoneOption, n as formatDateForInput, o as DEFAULT_PRESETS, p as CustomRangePanel, r as formatSingleTimeDisplay, s as getDefaultPreset, t as toApiTimeRange, u as getPresetRange, v as localInputStringToUtc, x as zonedDateToUtcString, y as utcStringToZonedDate } from "./to-api-format-W3qJE68W.mjs";
85
86
  import { t as useDebounce } from "./hooks-CwZ6hyI1.mjs";
86
87
  import { n as toUTCTimestampStartOfDay, t as toUTCTimestampEndOfDay } from "./utils-CA4QEIJ8.mjs";
87
- export { CustomRangePanel as AbsoluteRangePanel, CustomRangePanel, ActionRow, Alert, AlertDescription, AlertTitle, AppNavigation, Autocomplete, Autosearch, Avatar, AvatarFallback, AvatarImage, AvatarStack, Badge, Blockquote, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDatePicker, CalendarDayButton, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, ClientOnly, CloseIcon, Code, CodeEditor, CodeEditorTabs, Col, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, DEFAULT_DATE_FORMAT, DEFAULT_DEBOUNCE_MS, DEFAULT_LOADING_ROWS, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZES, DEFAULT_PRESETS, DEFAULT_SEARCH_DEBOUNCE_MS, DURATION, DataTable, DataTableColumnHeader, DataTableRowActions, DateTime, DateTimePicker, Dialog, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Dropzone, DropzoneContent, DropzoneEmptyState, EASE, EmptyContent, FileInputButton, Form, FormAdapterProvider, FormAutocomplete, FormAutosearch, FormButton, FormCheckbox, FormCombobox, FormCopyBox, FormCustom, FormDatePicker, FormDateTimePicker, FormDescription, FormDialog, FormError, FormField, FormFieldArray, FormInput, FormRadioGroup, FormRadioItem, FormRoot, FormSelect, FormSelectItem, FormSubmit, FormSwitch, FormTextarea, FormTimePicker, FormTransfer, FormWhen, GRID_BREAKPOINTS, GRID_COLUMNS, GRID_PREFIX, GroupedTable, HoverCard, HoverCardContent, HoverCardTrigger, Icon, InSheetContext, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputNumber, InputWithAddons, Label, Link, LinkButton, List, ListItem, LoaderOverlay, LocalTaskStorage, Logo, LogoFlat, LogoIcon, LogoStacked, LogoText, Map, MapCircle, MapCircleMarker, MapControlContainer, MapDrawCircle, MapDrawControl, MapDrawDelete, MapDrawEdit, MapDrawMarker, MapDrawPolygon, MapDrawPolyline, MapDrawRectangle, MapDrawUndo, MapFeatureGroup, MapFullscreenControl, MapLayerGroup, MapLayers, MapLayersControl, MapLocateControl, MapMarker, MapMarkerClusterGroup, MapPolygon, MapPolyline, MapPopup, MapRectangle, MapSearchControl, MapTileLayer, MapTooltip, MapZoomControl, MobileSheet, MoreActions, MultiSelect, NavMenu, NavMenuItem, PageTitle, Paragraph, PlaceAutocomplete, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, QuickRangesPanel, RESPONSIVE_ARRAY, RESPONSIVE_MAP, RadioGroup, RadioGroupItem, RedisTaskStorage, ResponsiveDropdown, ResponsivePopover, ResponsiveSheetTrigger, RichTextContent, RichTextEditor, Row, RowContext, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Spinner, SpinnerIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsLinkTrigger, TabsList, TabsTrigger, TagsInput, TaskPanel, TaskPanelActions, TaskPanelCounter, TaskPanelHeader, TaskPanelItem, TaskQueue, TaskQueueDropdown, TaskQueueProvider, TaskQueueTrigger, TaskSummaryDialog, Text, Textarea, ThemeProvider, ThemeScript, TimePicker, TimeRangePicker, TimezoneSelector, Title, Toaster, Tooltip, Transfer, VisuallyHidden, avatarStackVariants, badgeVariants, buttonGroupVariants, buttonVariants, cn, configureProgress, createCodeEditorSchema, createDataTableStore, createOrgMetadata, createProjectMetadata, createSelectionColumn, createTimezoneOption, createUserMetadata, dataTableFeatures, defaultAutosearchValue, defineStepper, detectStorage, findItemByHref, formatAbsoluteDate, formatCombinedDate, formatDateForInput, formatJson, formatRelativeDate, formatSingleTimeDisplay, formatTimeRangeDisplay, formatTimezoneDate, formatTimezoneLabel, formatUTCDate, formatUtcForDisplay, formatYaml, getBrowserTimezone, getContextLabel, getDefaultPreset, getDefaultTimezoneOptions, getGutter, getPresetByKey, getPresetByShortcut, getPresetRange, getResponsiveValue, getShortTimezoneDisplay, getTimestamp, getTimezoneAbbreviation, getTimezoneOffset, hasActiveDescendant, isNavItemActive, isValidJson, isValidYaml, jsonSchema, jsonToYaml, localInputStringToUtc, logoStyles, matchesCurrentScope, normalizePath, paragraphVariants, parseDate, registerMediaQuery, resolvePath, rowMatchesSearch, startProgress, stopProgress, textVariants, titleVariants, toApiTimeRange, toUTCTimestampEndOfDay, toUTCTimestampStartOfDay, toast, useAdapter, useBreakpoint, useControllableState, useCopyToClipboard, useCurrentScope, useDataTableFilters, useDataTableInlineContents, useDataTableLoading, useDataTablePagination, useDataTableRows, useDataTableSearch, useDataTableSelection, useDataTableSorting, useDebounce, useDebouncedSearchInput, useField, useFieldContext, useFormContext, useFormState, useInSheet, useLeaflet, useNuqsAdapter, useRichTextEditor, useSidebar, useTaskQueue, useTasksWithLabels, useTheme, useToast, useWatch, useWatchAll, utcStringToZonedDate, utcToLocalInputString, yamlSchema, yamlToJson, zonedDateToUtcString };
88
+ export { CustomRangePanel as AbsoluteRangePanel, CustomRangePanel, ActionRow, Alert, AlertDescription, AlertTitle, AppNavigation, Autocomplete, Autosearch, Avatar, AvatarFallback, AvatarImage, AvatarStack, Badge, Blockquote, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDatePicker, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardField, CardFieldLabel, CardFieldValue, CardFooter, CardHeader, CardSaveBar, CardTitle, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, ClientOnly, CloseIcon, Code, CodeEditor, CodeEditorTabs, Col, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, DEFAULT_DATE_FORMAT, DEFAULT_DEBOUNCE_MS, DEFAULT_LOADING_ROWS, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZES, DEFAULT_PRESETS, DEFAULT_SEARCH_DEBOUNCE_MS, DURATION, DataTable, DataTableColumnHeader, DataTableRowActions, DateTime, DateTimePicker, Dialog, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Dropzone, DropzoneContent, DropzoneEmptyState, EASE, EmptyContent, FileInputButton, Form, FormAdapterProvider, FormAutocomplete, FormAutosearch, FormButton, FormCheckbox, FormCombobox, FormCopyBox, FormCustom, FormDatePicker, FormDateTimePicker, FormDescription, FormDialog, FormError, FormField, FormFieldArray, FormInput, FormRadioGroup, FormRadioItem, FormRoot, FormSelect, FormSelectItem, FormSubmit, FormSwitch, FormTextarea, FormTimePicker, FormTransfer, FormWhen, GRID_BREAKPOINTS, GRID_COLUMNS, GRID_PREFIX, GroupedTable, HoverCard, HoverCardContent, HoverCardTrigger, Icon, InSheetContext, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputNumber, InputWithAddons, Label, Link, LinkButton, List, ListItem, LoaderOverlay, LocalTaskStorage, Logo, LogoFlat, LogoIcon, LogoStacked, LogoText, Map, MapCircle, MapCircleMarker, MapControlContainer, MapDrawCircle, MapDrawControl, MapDrawDelete, MapDrawEdit, MapDrawMarker, MapDrawPolygon, MapDrawPolyline, MapDrawRectangle, MapDrawUndo, MapFeatureGroup, MapFullscreenControl, MapLayerGroup, MapLayers, MapLayersControl, MapLocateControl, MapMarker, MapMarkerClusterGroup, MapPolygon, MapPolyline, MapPopup, MapRectangle, MapSearchControl, MapTileLayer, MapTooltip, MapZoomControl, MobileSheet, MoreActions, MultiSelect, NavMenu, NavMenuItem, PageTitle, Paragraph, PlaceAutocomplete, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, QuickRangesPanel, RESPONSIVE_ARRAY, RESPONSIVE_MAP, RadioGroup, RadioGroupItem, RedisTaskStorage, ResponsiveDropdown, ResponsivePopover, ResponsiveSheetTrigger, RichTextContent, RichTextEditor, Row, RowContext, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, SettingsNav, SettingsNavItem, SettingsNavLabel, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Spinner, SpinnerIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsLinkTrigger, TabsList, TabsTrigger, TagsInput, TaskPanel, TaskPanelActions, TaskPanelCounter, TaskPanelHeader, TaskPanelItem, TaskQueue, TaskQueueDropdown, TaskQueueProvider, TaskQueueTrigger, TaskSummaryDialog, Text, Textarea, ThemeProvider, ThemeScript, TimePicker, TimeRangePicker, TimezoneSelector, Title, Toaster, Tooltip, Transfer, VisuallyHidden, avatarStackVariants, badgeVariants, buttonGroupVariants, buttonVariants, cn, configureProgress, createCodeEditorSchema, createDataTableStore, createOrgMetadata, createProjectMetadata, createSelectionColumn, createTimezoneOption, createUserMetadata, dataTableFeatures, defaultAutosearchValue, defineStepper, detectStorage, findItemByHref, formatAbsoluteDate, formatCombinedDate, formatDateForInput, formatJson, formatRelativeDate, formatSingleTimeDisplay, formatTimeRangeDisplay, formatTimezoneDate, formatTimezoneLabel, formatUTCDate, formatUtcForDisplay, formatYaml, getBrowserTimezone, getContextLabel, getDefaultPreset, getDefaultTimezoneOptions, getGutter, getPresetByKey, getPresetByShortcut, getPresetRange, getResponsiveValue, getShortTimezoneDisplay, getTimestamp, getTimezoneAbbreviation, getTimezoneOffset, hasActiveDescendant, isNavItemActive, isValidJson, isValidYaml, jsonSchema, jsonToYaml, localInputStringToUtc, logoStyles, matchesCurrentScope, normalizePath, paragraphVariants, parseDate, registerMediaQuery, resolvePath, rowMatchesSearch, settingsNavItemVariants, startProgress, stopProgress, textVariants, titleVariants, toApiTimeRange, toUTCTimestampEndOfDay, toUTCTimestampStartOfDay, toast, useAdapter, useBreakpoint, useControllableState, useCopyToClipboard, useCurrentScope, useDataTableFilters, useDataTableInlineContents, useDataTableLoading, useDataTablePagination, useDataTableRows, useDataTableSearch, useDataTableSelection, useDataTableSorting, useDebounce, useDebouncedSearchInput, useField, useFieldContext, useFormContext, useFormState, useInSheet, useLeaflet, useNuqsAdapter, useRichTextEditor, useSidebar, useTaskQueue, useTasksWithLabels, useTheme, useToast, useWatch, useWatchAll, utcStringToZonedDate, utcToLocalInputString, yamlSchema, yamlToJson, zonedDateToUtcString };
@@ -9,7 +9,7 @@ import { t as Sheet } from "../sheet-DHn6C_rs.mjs";
9
9
  import { t as useBreakpoint } from "../use-breakpoint-CwiUJSmk.mjs";
10
10
  import { Skeleton } from "../skeleton/index.mjs";
11
11
  import { TableBody, TableCell, TableHead, TableHeader, TableRow } from "../table/index.mjs";
12
- import { t as DateTimeRangePicker } from "../date-time-range-picker-DlFTh3DF.mjs";
12
+ import { t as DateTimeRangePicker } from "../date-time-range-picker-BEulotVf.mjs";
13
13
  import { c as getBrowserTimezone, t as DateTime, u as getTimezoneAbbreviation } from "../date-time-lZdefM4H.mjs";
14
14
  import { t as useCopyToClipboard } from "../use-copy-to-clipboard-DZDq_85T.mjs";
15
15
  import { Bot, ChevronDown, ChevronUp, Clock, Copy, Download, HelpCircle, Inbox, Monitor, RefreshCw, Search, SlidersHorizontal, Smartphone, Tablet, TriangleAlert, X } from "lucide-react";
@@ -1,3 +1,3 @@
1
- import { A as formatInTimezone, B as isDateBearingMode, C as PickerClear, D as PickerCalendar, E as PickerContent, F as zonedDateToIso, H as isTimeBearingMode, I as ALLOWED_STEPS, L as DATE_BEARING_MODES, M as getBrowserTimezone, N as getTimezoneOffset, O as PickerContext, P as isoToZonedDate, R as RANGE_MODES, S as PickerCancel, T as PickerReset, V as isRangeMode, _ as parseTimeString, a as PickerTimezoneIndicator, b as PickerPresets, d as DATE_PRESETS, f as getDefaultPresets, g as isValidTimeString, h as formatTimeLabel, i as PickerTrigger, j as formatTimezoneLabel, k as usePickerContext, l as usePresets, m as dateToYYYYMMDD, o as PickerTimeInput, p as usePickerState, r as formatPickerValue, s as useTimeSlots, t as DateTimeRangePicker, u as DATETIME_PRESETS, v as resolveCommit, w as PickerFooter, x as PickerApply, y as useKeyboardShortcuts, z as TIME_BEARING_MODES } from "../date-time-range-picker-DlFTh3DF.mjs";
2
- import { a as DateRangePicker, c as getDaysDifference, d as isSameDateRange, f as isSameStringRange, i as DateRangeTimePicker, l as isRangeValid, m as PickerTimezoneSelect, n as TimePicker, o as DatePicker, p as Picker, r as DateTimePicker, s as clampRange, t as TimeRangePicker, u as isSameDate } from "../picker-DbKukBkk.mjs";
1
+ import { A as formatInTimezone, B as isDateBearingMode, C as PickerClear, D as PickerCalendar, E as PickerContent, F as zonedDateToIso, H as isTimeBearingMode, I as ALLOWED_STEPS, L as DATE_BEARING_MODES, M as getBrowserTimezone, N as getTimezoneOffset, O as PickerContext, P as isoToZonedDate, R as RANGE_MODES, S as PickerCancel, T as PickerReset, V as isRangeMode, _ as parseTimeString, a as PickerTimezoneIndicator, b as PickerPresets, d as DATE_PRESETS, f as getDefaultPresets, g as isValidTimeString, h as formatTimeLabel, i as PickerTrigger, j as formatTimezoneLabel, k as usePickerContext, l as usePresets, m as dateToYYYYMMDD, o as PickerTimeInput, p as usePickerState, r as formatPickerValue, s as useTimeSlots, t as DateTimeRangePicker, u as DATETIME_PRESETS, v as resolveCommit, w as PickerFooter, x as PickerApply, y as useKeyboardShortcuts, z as TIME_BEARING_MODES } from "../date-time-range-picker-BEulotVf.mjs";
2
+ import { a as DateRangePicker, c as getDaysDifference, d as isSameDateRange, f as isSameStringRange, i as DateRangeTimePicker, l as isRangeValid, m as PickerTimezoneSelect, n as TimePicker, o as DatePicker, p as Picker, r as DateTimePicker, s as clampRange, t as TimeRangePicker, u as isSameDate } from "../picker-Cke6cfsb.mjs";
3
3
  export { ALLOWED_STEPS, DATETIME_PRESETS, DATE_BEARING_MODES, DATE_PRESETS, DatePicker, DateRangePicker, DateRangeTimePicker, DateTimePicker, DateTimeRangePicker, Picker, PickerApply, PickerCalendar, PickerCancel, PickerClear, PickerContent, PickerContext, PickerFooter, PickerPresets, PickerReset, PickerTimeInput, PickerTimezoneIndicator, PickerTimezoneSelect, PickerTrigger, RANGE_MODES, TIME_BEARING_MODES, TimePicker, TimeRangePicker, clampRange, dateToYYYYMMDD, formatInTimezone, formatPickerValue, formatTimeLabel, formatTimezoneLabel, getBrowserTimezone, getDaysDifference, getDefaultPresets, getTimezoneOffset, isDateBearingMode, isRangeMode, isRangeValid, isSameDate, isSameDateRange, isSameStringRange, isTimeBearingMode, isValidTimeString, isoToZonedDate, parseTimeString, resolveCommit, useKeyboardShortcuts, usePickerContext, usePickerState, usePresets, useTimeSlots, zonedDateToIso };
@@ -1,6 +1,6 @@
1
1
  import { t as cn } from "./utils-Bu32wN-x.mjs";
2
2
  import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-daE2Nn0Z.mjs";
3
- import { C as PickerClear, D as PickerCalendar, E as PickerContent, F as zonedDateToIso, H as isTimeBearingMode, P as isoToZonedDate, S as PickerCancel, T as PickerReset, _ as parseTimeString, a as PickerTimezoneIndicator, b as PickerPresets, c as Picker$1, i as PickerTrigger, k as usePickerContext, n as DefaultFooter, o as PickerTimeInput, r as formatPickerValue, w as PickerFooter, x as PickerApply } from "./date-time-range-picker-DlFTh3DF.mjs";
3
+ import { C as PickerClear, D as PickerCalendar, E as PickerContent, F as zonedDateToIso, H as isTimeBearingMode, P as isoToZonedDate, S as PickerCancel, T as PickerReset, _ as parseTimeString, a as PickerTimezoneIndicator, b as PickerPresets, c as Picker$1, i as PickerTrigger, k as usePickerContext, n as DefaultFooter, o as PickerTimeInput, r as formatPickerValue, w as PickerFooter, x as PickerApply } from "./date-time-range-picker-BEulotVf.mjs";
4
4
  import { Clock, Globe } from "lucide-react";
5
5
  import { useEffect, useState } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,2 +1,2 @@
1
- import { a as SelectLabel, c as SelectSeparator, i as SelectItem, l as SelectTrigger, n as SelectContent, o as SelectScrollDownButton, r as SelectGroup, s as SelectScrollUpButton, t as Select, u as SelectValue } from "../select-CQsG8Kju.mjs";
1
+ import { a as SelectLabel, c as SelectSeparator, i as SelectItem, l as SelectTrigger, n as SelectContent, o as SelectScrollDownButton, r as SelectGroup, s as SelectScrollUpButton, t as Select, u as SelectValue } from "../select-D4pk9e2d.mjs";
2
2
  export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };
@@ -16,7 +16,7 @@ SelectGroup.displayName = "SelectGroup";
16
16
  function SelectTrigger({ ref, className, ...props }) {
17
17
  return /* @__PURE__ */ jsx(SelectTrigger$1, {
18
18
  ref,
19
- className: cn("rounded-lg", "bg-input-background/50", "text-input-foreground", "border-input-border", "placeholder:text-input-placeholder", "focus-visible:ring-0 focus-visible:ring-offset-0", "focus-visible:border-input-focus-border", "focus-visible:shadow-(--input-focus-shadow)", "aria-invalid:border-destructive", className),
19
+ className: cn("rounded-lg", "bg-input-background/50", "text-input-foreground", "border-input-border", "placeholder:text-input-placeholder", "shadow-none", "focus-visible:ring-0 focus-visible:ring-offset-0", "focus-visible:border-input-focus-border", "focus-visible:shadow-(--input-focus-shadow)", "aria-invalid:border-destructive", className),
20
20
  ...props
21
21
  });
22
22
  }
@@ -0,0 +1,2 @@
1
+ import { i as settingsNavItemVariants, n as SettingsNavItem, r as SettingsNavLabel, t as SettingsNav } from "../settings-nav-BCL1lMTM.mjs";
2
+ export { SettingsNav, SettingsNavItem, SettingsNavLabel, settingsNavItemVariants };
@@ -0,0 +1,84 @@
1
+ import { t as cn } from "./utils-Bu32wN-x.mjs";
2
+ import { cva } from "class-variance-authority";
3
+ import "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Slot } from "@radix-ui/react-slot";
6
+ //#region src/components/base/settings-nav/settings-nav-variants.ts
7
+ const settingsNavItemVariants = cva("group/settings-nav-item relative flex w-full items-center gap-2.5 rounded-md px-2.5 py-1.5 text-sm font-normal transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50", {
8
+ variants: { variant: {
9
+ default: "text-foreground hover:bg-primary/5 hover:text-primary data-[active=true]:bg-primary/10 data-[active=true]:text-primary",
10
+ danger: "text-destructive hover:bg-destructive/10 data-[active=true]:bg-destructive/10 data-[active=true]:text-destructive"
11
+ } },
12
+ defaultVariants: { variant: "default" }
13
+ });
14
+ //#endregion
15
+ //#region src/components/base/settings-nav/settings-nav.tsx
16
+ /**
17
+ * Compact inset settings navigation for configuration pages.
18
+ *
19
+ * Deliberately separate from `NavMenu` / sidebar primitives — those are bound
20
+ * to the app chrome context. SettingsNav is a page-local list: a SETTINGS
21
+ * eyebrow, icon items with an active fill, optional error dots, Soon badges,
22
+ * and a danger item for destructive sections.
23
+ */
24
+ function SettingsNav({ className, ...props }) {
25
+ return /* @__PURE__ */ jsx("nav", {
26
+ "data-slot": "settings-nav",
27
+ "aria-label": "Settings",
28
+ className: cn("flex w-full flex-col gap-1", className),
29
+ ...props
30
+ });
31
+ }
32
+ function SettingsNavLabel({ className, ...props }) {
33
+ return /* @__PURE__ */ jsx("div", {
34
+ "data-slot": "settings-nav-label",
35
+ className: cn("text-muted-foreground px-2.5 pt-1 pb-2 text-[11px] font-semibold tracking-wide uppercase", className),
36
+ ...props
37
+ });
38
+ }
39
+ function SettingsNavItem({ className, variant, asChild = false, icon, active = false, indicator = false, badge, disabled = false, children, href, onClick, ...props }) {
40
+ const Comp = asChild ? Slot : "a";
41
+ const handleClick = (event) => {
42
+ if (disabled) {
43
+ event.preventDefault();
44
+ return;
45
+ }
46
+ onClick?.(event);
47
+ };
48
+ return /* @__PURE__ */ jsxs(Comp, {
49
+ "data-slot": "settings-nav-item",
50
+ "data-active": active || void 0,
51
+ "data-variant": variant ?? "default",
52
+ "aria-current": active ? "page" : void 0,
53
+ "aria-disabled": disabled || void 0,
54
+ tabIndex: disabled ? -1 : void 0,
55
+ href: disabled ? void 0 : href,
56
+ onClick: handleClick,
57
+ className: cn(settingsNavItemVariants({ variant }), className),
58
+ ...props,
59
+ children: [
60
+ icon ? /* @__PURE__ */ jsx("span", {
61
+ "data-slot": "settings-nav-item-icon",
62
+ className: cn("flex size-4 shrink-0 items-center justify-center [&_svg]:size-4", variant === "danger" ? "text-destructive" : "text-muted-foreground transition-colors group-hover/settings-nav-item:text-primary group-data-[active=true]/settings-nav-item:text-primary"),
63
+ "aria-hidden": "true",
64
+ children: icon
65
+ }) : null,
66
+ /* @__PURE__ */ jsx("span", {
67
+ className: "min-w-0 flex-1 truncate text-left",
68
+ children
69
+ }),
70
+ indicator ? /* @__PURE__ */ jsx("span", {
71
+ "data-slot": "settings-nav-item-indicator",
72
+ className: "bg-destructive size-1.5 shrink-0 rounded-full",
73
+ "aria-label": "Needs attention"
74
+ }) : null,
75
+ badge != null ? /* @__PURE__ */ jsx("span", {
76
+ "data-slot": "settings-nav-item-badge",
77
+ className: "bg-muted text-muted-foreground rounded-md px-1.5 py-0.5 text-[10px] font-semibold tracking-wide uppercase",
78
+ children: badge
79
+ }) : null
80
+ ]
81
+ });
82
+ }
83
+ //#endregion
84
+ export { settingsNavItemVariants as i, SettingsNavItem as n, SettingsNavLabel as r, SettingsNav as t };
@@ -1,30 +1,86 @@
1
1
  import { t as cn } from "../utils-Bu32wN-x.mjs";
2
- import "react";
3
- import { jsx } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import * as React from "react";
4
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
4
5
  import * as TabsPrimitive from "@radix-ui/react-tabs";
6
+ import { motion } from "motion/react";
5
7
  //#region src/components/base/tabs/tabs.tsx
6
- /**
7
- * Datum Tabs Component
8
- * Extends shadcn Tabs with:
9
- * - TabsLinkTrigger for router-agnostic link integration
10
- * - Dark mode customizations
11
- */
12
- function Tabs({ className, ...props }) {
13
- return /* @__PURE__ */ jsx(TabsPrimitive.Root, {
14
- className: cn("flex flex-col gap-2", className),
15
- ...props
8
+ const TabsContext = React.createContext({
9
+ value: void 0,
10
+ indicatorId: "tabs"
11
+ });
12
+ const TabsVariantContext = React.createContext("default");
13
+ function Tabs({ className, value: valueProp, defaultValue, onValueChange, ...props }) {
14
+ const [uncontrolled, setUncontrolled] = React.useState(defaultValue);
15
+ const value = valueProp ?? uncontrolled;
16
+ const indicatorId = React.useId();
17
+ const handleValueChange = React.useCallback((next) => {
18
+ setUncontrolled(next);
19
+ onValueChange?.(next);
20
+ }, [onValueChange]);
21
+ const ctx = React.useMemo(() => ({
22
+ value,
23
+ indicatorId
24
+ }), [value, indicatorId]);
25
+ return /* @__PURE__ */ jsx(TabsContext, {
26
+ value: ctx,
27
+ children: /* @__PURE__ */ jsx(TabsPrimitive.Root, {
28
+ className: cn("flex flex-col gap-2", className),
29
+ value: valueProp,
30
+ defaultValue,
31
+ onValueChange: handleValueChange,
32
+ ...props
33
+ })
16
34
  });
17
35
  }
18
- function TabsList({ className, ...props }) {
19
- return /* @__PURE__ */ jsx(TabsPrimitive.List, {
20
- className: cn("bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-1", className),
21
- ...props
36
+ const tabsListVariants = cva("inline-flex items-center", {
37
+ variants: { variant: {
38
+ default: "bg-muted text-muted-foreground h-9 w-fit justify-center rounded-lg p-1",
39
+ line: "text-foreground h-auto w-full justify-start gap-7 overflow-x-auto rounded-none bg-transparent p-0 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
40
+ } },
41
+ defaultVariants: { variant: "default" }
42
+ });
43
+ function TabsList({ className, variant, ...props }) {
44
+ const resolved = variant ?? "default";
45
+ return /* @__PURE__ */ jsx(TabsVariantContext, {
46
+ value: resolved,
47
+ children: /* @__PURE__ */ jsx(TabsPrimitive.List, {
48
+ "data-variant": resolved,
49
+ className: cn(tabsListVariants({ variant: resolved }), className),
50
+ ...props
51
+ })
22
52
  });
23
53
  }
24
- function TabsTrigger({ className, ...props }) {
54
+ const tabsTriggerVariants = cva("focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring inline-flex items-center justify-center gap-1.5 whitespace-nowrap font-medium transition-[color,box-shadow,transform,border-color] duration-[var(--duration-fast)] ease-out focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
55
+ variants: { variant: {
56
+ default: "data-[state=active]:bg-background dark:data-[state=active]:text-foreground data-[state=active]:text-foreground dark:hover:text-foreground flex-1 rounded-md px-2 py-1 text-sm active:scale-[0.98] disabled:active:scale-100 data-[state=active]:shadow-sm",
57
+ line: "text-foreground hover:text-primary data-[state=active]:text-primary relative flex-none rounded-none px-0 py-2.5 text-sm font-normal data-[state=active]:font-medium focus-visible:ring-0 focus-visible:outline-hidden"
58
+ } },
59
+ defaultVariants: { variant: "default" }
60
+ });
61
+ function TabsTrigger({ className, value, children, asChild, ...props }) {
62
+ const variant = React.use(TabsVariantContext);
63
+ const { value: activeValue, indicatorId } = React.use(TabsContext);
64
+ const indicator = variant === "line" && activeValue === value ? /* @__PURE__ */ jsx(motion.span, {
65
+ "aria-hidden": true,
66
+ "data-slot": "tabs-indicator",
67
+ layoutId: `tabs-indicator-${indicatorId}`,
68
+ className: "bg-primary absolute inset-x-0 bottom-0 h-0.5",
69
+ transition: {
70
+ type: "spring",
71
+ stiffness: 380,
72
+ damping: 30
73
+ }
74
+ }) : null;
75
+ let content;
76
+ if (asChild && React.isValidElement(children)) content = React.cloneElement(children, void 0, children.props.children, indicator);
77
+ else content = /* @__PURE__ */ jsxs(Fragment$1, { children: [children, indicator] });
25
78
  return /* @__PURE__ */ jsx(TabsPrimitive.Trigger, {
26
- className: cn("data-[state=active]:bg-background dark:data-[state=active]:text-foreground data-[state=active]:text-foreground dark:hover:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring inline-flex flex-1 items-center justify-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow,transform] duration-[var(--duration-fast)] ease-out active:scale-[0.98] disabled:active:scale-100 focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
27
- ...props
79
+ value,
80
+ asChild,
81
+ className: cn(tabsTriggerVariants({ variant }), className),
82
+ ...props,
83
+ children: content
28
84
  });
29
85
  }
30
86
  function TabsContent({ className, ...props }) {
@@ -1,2 +1,2 @@
1
- import { t as Textarea } from "../textarea-B6YhjFVC.mjs";
1
+ import { t as Textarea } from "../textarea-DiSGxCBO.mjs";
2
2
  export { Textarea };
@@ -6,7 +6,7 @@ import { jsx } from "react/jsx-runtime";
6
6
  function Textarea({ ref, className, ...props }) {
7
7
  return /* @__PURE__ */ jsx(Textarea$1, {
8
8
  ref,
9
- className: cn("rounded-lg", "bg-input-background/50", "text-input-foreground", "border-input-border", "placeholder:text-input-placeholder", "focus-visible:ring-0 focus-visible:ring-offset-0", "focus-visible:border-input-focus-border", "focus-visible:shadow-(--input-focus-shadow)", "aria-invalid:border-destructive", className),
9
+ className: cn("rounded-lg", "bg-input-background/50", "text-input-foreground", "border-input-border", "placeholder:text-input-placeholder", "shadow-none", "focus-visible:ring-0 focus-visible:ring-offset-0", "focus-visible:border-input-focus-border", "focus-visible:shadow-(--input-focus-shadow)", "aria-invalid:border-destructive", className),
10
10
  ...props
11
11
  });
12
12
  }
@@ -1,2 +1,2 @@
1
- import { t as TimePicker } from "../time-picker-rVTkmbIG.mjs";
1
+ import { t as TimePicker } from "../time-picker-BzNSUazl.mjs";
2
2
  export { TimePicker };
@@ -1,5 +1,5 @@
1
1
  import { t as useDeprecationWarning } from "./use-deprecation-warning-DXrGc0jX.mjs";
2
- import { n as TimePicker$1 } from "./picker-DbKukBkk.mjs";
2
+ import { n as TimePicker$1 } from "./picker-Cke6cfsb.mjs";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/components/features/time-picker/time-picker.tsx
5
5
  const STEP_VALUES = [
@@ -3,8 +3,8 @@ import { t as Button } from "./button-DoMqfQLu.mjs";
3
3
  import { Calendar } from "./calendar/index.mjs";
4
4
  import { t as Input } from "./input-j4tbmYYz.mjs";
5
5
  import { t as ResponsivePopover } from "./responsive-popover-8VcjBM2d.mjs";
6
- import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-CQsG8Kju.mjs";
7
- import { F as zonedDateToIso, M as getBrowserTimezone, N as getTimezoneOffset, P as isoToZonedDate, U as endOfDayInTz, W as startOfDayInTz, j as formatTimezoneLabel, t as DateTimeRangePicker } from "./date-time-range-picker-DlFTh3DF.mjs";
6
+ import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-D4pk9e2d.mjs";
7
+ import { F as zonedDateToIso, M as getBrowserTimezone, N as getTimezoneOffset, P as isoToZonedDate, U as endOfDayInTz, W as startOfDayInTz, j as formatTimezoneLabel, t as DateTimeRangePicker } from "./date-time-range-picker-BEulotVf.mjs";
8
8
  import { t as useDeprecationWarning } from "./use-deprecation-warning-DXrGc0jX.mjs";
9
9
  import { CalendarIcon, Globe } from "lucide-react";
10
10
  import { useCallback, useEffect, useId, useRef, useState } from "react";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@datum-cloud/datum-ui",
3
3
  "type": "module",
4
- "version": "2.8.0",
4
+ "version": "2.9.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "url": "https://github.com/datum-cloud/datum-ui"
@@ -173,6 +173,11 @@
173
173
  "types": "./dist/components/base/separator/index.d.ts",
174
174
  "default": "./dist/separator/index.mjs"
175
175
  },
176
+ "./settings-nav": {
177
+ "source": "./src/components/base/settings-nav/index.ts",
178
+ "types": "./dist/components/base/settings-nav/index.d.ts",
179
+ "default": "./dist/settings-nav/index.mjs"
180
+ },
176
181
  "./sheet": {
177
182
  "source": "./src/components/base/sheet/index.ts",
178
183
  "types": "./dist/components/base/sheet/index.d.ts",
@@ -1,59 +0,0 @@
1
- import { t as cn } from "./utils-Bu32wN-x.mjs";
2
- import "react";
3
- import { jsx } from "react/jsx-runtime";
4
- //#region ../shadcn/ui/card.tsx
5
- function CardTitle({ className, ...props }) {
6
- return /* @__PURE__ */ jsx("div", {
7
- "data-slot": "card-title",
8
- className: cn("leading-none font-semibold", className),
9
- ...props
10
- });
11
- }
12
- function CardDescription({ className, ...props }) {
13
- return /* @__PURE__ */ jsx("div", {
14
- "data-slot": "card-description",
15
- className: cn("text-muted-foreground text-sm", className),
16
- ...props
17
- });
18
- }
19
- function CardContent({ className, ...props }) {
20
- return /* @__PURE__ */ jsx("div", {
21
- "data-slot": "card-content",
22
- className: cn("px-6", className),
23
- ...props
24
- });
25
- }
26
- //#endregion
27
- //#region src/components/base/card/card.tsx
28
- /**
29
- * Datum Card Component
30
- * Extends shadcn Card with custom default className
31
- *
32
- * This component replaces the default className of shadcn Card without modifying
33
- * the original shadcn component. All sub-components (CardHeader, CardTitle, etc.)
34
- * are re-exported from shadcn as-is.
35
- */
36
- const DEFAULT_CARD_CLASSNAME = "bg-card text-card-foreground flex flex-col gap-4 rounded-xl border border-card-border py-6 shadow";
37
- function Card({ className, ...props }) {
38
- return /* @__PURE__ */ jsx("div", {
39
- "data-slot": "card",
40
- className: cn(DEFAULT_CARD_CLASSNAME, className),
41
- ...props
42
- });
43
- }
44
- function CardHeader({ className, ...props }) {
45
- return /* @__PURE__ */ jsx("div", {
46
- "data-slot": "card-header",
47
- className: cn("border-card-border flex flex-col gap-3 px-6", className),
48
- ...props
49
- });
50
- }
51
- function CardFooter({ className, ...props }) {
52
- return /* @__PURE__ */ jsx("div", {
53
- "data-slot": "card-footer",
54
- className: cn("border-card-border px-6", className),
55
- ...props
56
- });
57
- }
58
- //#endregion
59
- export { CardDescription as a, CardContent as i, CardFooter as n, CardTitle as o, CardHeader as r, Card as t };