@datum-cloud/datum-ui 2.8.0 → 2.9.1

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 (36) 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-BZzNnKYj.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 +85 -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 +1 -0
  9. package/dist/components/base/settings-nav/settings-nav.d.ts +30 -0
  10. package/dist/components/base/tabs/tabs.d.ts +12 -4
  11. package/dist/data-table/index.mjs +1 -1
  12. package/dist/{data-table-BaWOHdZX.mjs → data-table-CW3-xqkg.mjs} +2 -2
  13. package/dist/date-picker/index.mjs +3 -3
  14. package/dist/date-time-picker/index.mjs +1 -1
  15. package/dist/{date-time-picker-Bd7qSZVr.mjs → date-time-picker-BVvWQXMt.mjs} +1 -1
  16. package/dist/{date-time-range-picker-DlFTh3DF.mjs → date-time-range-picker-BEulotVf.mjs} +1 -1
  17. package/dist/form/index.mjs +1 -1
  18. package/dist/{form-BGlPoZ1G.mjs → form-DB5MbJ2U.mjs} +5 -5
  19. package/dist/grouped-table/index.mjs +1 -1
  20. package/dist/{grouped-table-DWtEx18V.mjs → grouped-table-DKUsSHpe.mjs} +1 -1
  21. package/dist/index.mjs +13 -12
  22. package/dist/logs/index.mjs +1 -1
  23. package/dist/picker/index.mjs +2 -2
  24. package/dist/{picker-DbKukBkk.mjs → picker-Cke6cfsb.mjs} +1 -1
  25. package/dist/select/index.mjs +1 -1
  26. package/dist/{select-CQsG8Kju.mjs → select-D4pk9e2d.mjs} +1 -1
  27. package/dist/settings-nav/index.mjs +2 -0
  28. package/dist/settings-nav-C_AF6gld.mjs +94 -0
  29. package/dist/tabs/index.mjs +76 -19
  30. package/dist/textarea/index.mjs +1 -1
  31. package/dist/{textarea-B6YhjFVC.mjs → textarea-DiSGxCBO.mjs} +1 -1
  32. package/dist/time-picker/index.mjs +1 -1
  33. package/dist/{time-picker-rVTkmbIG.mjs → time-picker-BzNSUazl.mjs} +1 -1
  34. package/dist/{to-api-format-Bm1VcKkS.mjs → to-api-format-W3qJE68W.mjs} +2 -2
  35. package/package.json +6 -1
  36. 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-BZzNnKYj.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` is a separate density scale
39
+ * (`sm` | `md` | `lg`) for title/description gap and sectioned min-height —
40
+ * it does not change `--card-px` / `--card-py`.
41
+ *
42
+ * Consumers building their own rows inside a flush `CardContent` can use
43
+ * `px-(--card-px)` to line up with the card chrome regardless of `size`.
44
+ *
45
+ * Layouts
46
+ * -------
47
+ * - Stacked (default): the root carries vertical padding and a gap between
48
+ * slots; slots only carry horizontal padding. This is the historical
49
+ * behaviour and the default visuals are unchanged.
50
+ * - Sectioned (`sectioned`): the root carries no padding or gap; each slot
51
+ * owns its own vertical inset and slots are separated by dividers
52
+ * (`CardHeader bordered`, `CardFooter bordered`). Use for headers that sit
53
+ * above flush lists/tables, and for settings cards with a sticky footer.
54
+ */
55
+ const cardVariants = cva("group/card bg-card text-card-foreground border-card-border flex flex-col rounded-xl border", {
56
+ variants: {
57
+ size: {
58
+ sm: "[--card-px:1rem] [--card-py:1rem]",
59
+ md: "[--card-px:1.5rem] [--card-py:1.5rem]"
60
+ },
61
+ sectioned: {
62
+ true: "gap-0 py-0",
63
+ false: ""
64
+ }
65
+ },
66
+ compoundVariants: [{
67
+ size: "sm",
68
+ sectioned: false,
69
+ className: "gap-3 py-4"
70
+ }, {
71
+ size: "md",
72
+ sectioned: false,
73
+ className: "gap-4 py-6"
74
+ }],
75
+ defaultVariants: {
76
+ size: "md",
77
+ sectioned: false
78
+ }
79
+ });
80
+ function Card({ className, size, sectioned, ...props }) {
81
+ return /* @__PURE__ */ jsx("div", {
82
+ "data-slot": "card",
83
+ "data-size": size ?? "md",
84
+ "data-layout": sectioned ? "sectioned" : "stacked",
85
+ className: cn(cardVariants({
86
+ size,
87
+ sectioned
88
+ }), className),
89
+ ...props
90
+ });
91
+ }
92
+ 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", {
93
+ variants: {
94
+ /**
95
+ * Header density (not the card's inset `size`). Controls the gap
96
+ * between title and description and, in sectioned cards, the header's
97
+ * minimum height (`lg` also grows the vertical inset). Stacked cards
98
+ * take their vertical spacing from the root.
99
+ */
100
+ size: {
101
+ sm: "has-data-[slot=card-description]:gap-1 group-data-[layout=sectioned]/card:min-h-12 group-data-[layout=sectioned]/card:py-(--card-py)",
102
+ md: "has-data-[slot=card-description]:gap-3 group-data-[layout=sectioned]/card:min-h-14 group-data-[layout=sectioned]/card:py-(--card-py)",
103
+ 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)]"
104
+ },
105
+ /** Draw a divider under the header. Pairs with `sectioned` cards. */
106
+ bordered: {
107
+ true: "border-b",
108
+ false: ""
109
+ }
110
+ },
111
+ defaultVariants: {
112
+ size: "md",
113
+ bordered: false
114
+ }
115
+ });
116
+ function CardHeader({ className, size, bordered, ...props }) {
117
+ return /* @__PURE__ */ jsx("div", {
118
+ "data-slot": "card-header",
119
+ className: cn(cardHeaderVariants({
120
+ size,
121
+ bordered
122
+ }), className),
123
+ ...props
124
+ });
125
+ }
126
+ /**
127
+ * Trailing header action (button, link, badge). Renders in the header's
128
+ * second grid column. With a description it spans both rows and top-aligns;
129
+ * title-only it shares the title's row and centres against it.
130
+ */
131
+ function CardAction({ className, ...props }) {
132
+ return /* @__PURE__ */ jsx("div", {
133
+ "data-slot": "card-action",
134
+ 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),
135
+ ...props
136
+ });
137
+ }
138
+ /**
139
+ * Shared by CardContent and CardFooter.
140
+ * - `default`: inset to match the card chrome.
141
+ * - `x-none`: no horizontal inset — rows, tables, and dividers run to the
142
+ * card edge while the header stays inset.
143
+ * - `none`: no inset at all.
144
+ */
145
+ const cardPadding = {
146
+ "default": "px-(--card-px) group-data-[layout=sectioned]/card:py-(--card-py)",
147
+ "x-none": "px-0 group-data-[layout=sectioned]/card:py-(--card-py)",
148
+ "none": "p-0"
149
+ };
150
+ const cardContentVariants = cva("", {
151
+ variants: { padding: cardPadding },
152
+ defaultVariants: { padding: "default" }
153
+ });
154
+ function CardContent({ className, padding, ...props }) {
155
+ return /* @__PURE__ */ jsx("div", {
156
+ "data-slot": "card-content",
157
+ className: cn(cardContentVariants({ padding }), className),
158
+ ...props
159
+ });
160
+ }
161
+ const cardFooterVariants = cva("border-card-border", {
162
+ variants: {
163
+ padding: cardPadding,
164
+ /** Draw a divider above the footer. Pairs with `sectioned` cards. */
165
+ bordered: {
166
+ true: "border-t",
167
+ false: ""
168
+ }
169
+ },
170
+ defaultVariants: {
171
+ padding: "default",
172
+ bordered: false
173
+ }
174
+ });
175
+ function CardFooter({ className, padding, bordered, ...props }) {
176
+ return /* @__PURE__ */ jsx("div", {
177
+ "data-slot": "card-footer",
178
+ className: cn(cardFooterVariants({
179
+ padding,
180
+ bordered
181
+ }), className),
182
+ ...props
183
+ });
184
+ }
185
+ /**
186
+ * Label | value definition row for sectioned settings cards.
187
+ *
188
+ * Two equal columns from `sm` up (stacked below), so labels, values, inline
189
+ * inputs, and status chips share the same midline down a card and across
190
+ * neighbouring cards. Both columns are `minmax(0, 1fr)` so long mono values
191
+ * can truncate instead of pushing the value column out. Pair with
192
+ * `CardContent padding="none"`: the row insets itself with `mx-(--card-px)`
193
+ * (not padding) so the divider between rows runs only as wide as the content,
194
+ * while the card header's own divider still spans the full card.
195
+ * Compose a help control inside `CardFieldLabel`; keep Tooltip/icons in the
196
+ * consumer, not here.
197
+ */
198
+ function CardField({ className, ...props }) {
199
+ return /* @__PURE__ */ jsx("div", {
200
+ "data-slot": "card-field",
201
+ 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),
202
+ ...props
203
+ });
204
+ }
205
+ function CardFieldLabel({ className, ...props }) {
206
+ return /* @__PURE__ */ jsx("div", {
207
+ "data-slot": "card-field-label",
208
+ className: cn("flex min-w-0 items-center gap-1.5 text-sm font-medium", className),
209
+ ...props
210
+ });
211
+ }
212
+ function CardFieldValue({ className, ...props }) {
213
+ return /* @__PURE__ */ jsx("div", {
214
+ "data-slot": "card-field-value",
215
+ className: cn("min-w-0 text-sm", className),
216
+ ...props
217
+ });
218
+ }
219
+ //#endregion
220
+ //#region src/components/base/card/card-save-bar.tsx
221
+ function pluralize(count, noun) {
222
+ return `${count} ${noun}${count === 1 ? "" : "s"}`;
223
+ }
224
+ /**
225
+ * Save / cancel bar for inline-editable settings cards.
226
+ *
227
+ * Renders in a bordered `CardFooter` and owns the pattern every settings card
228
+ * repeats: a live status line ("2 unsaved changes · 1 error must be fixed"),
229
+ * a Cancel button, and a Save button that is disabled until something has
230
+ * changed and nothing is invalid. Buttons use the `xs` size to match the
231
+ * `CardAction` controls in the header of a `size="sm"` sectioned card.
232
+ */
233
+ function CardSaveBar({ changeCount, errorCount = 0, saving = false, onCancel, onSave, cancelLabel = "Cancel", saveLabel = "Save changes", children, className, ...props }) {
234
+ const status = children ?? (changeCount === 0 ? "No unsaved changes" : pluralize(changeCount, "unsaved change"));
235
+ return /* @__PURE__ */ jsxs(CardFooter, {
236
+ bordered: true,
237
+ "data-slot": "card-save-bar",
238
+ className: cn("flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between", className),
239
+ ...props,
240
+ children: [/* @__PURE__ */ jsxs("p", {
241
+ role: "status",
242
+ "aria-live": "polite",
243
+ "aria-atomic": "true",
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,86 @@
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` is a separate density scale
20
+ * (`sm` | `md` | `lg`) for title/description gap and sectioned min-height —
21
+ * it does not change `--card-px` / `--card-py`.
22
+ *
23
+ * Consumers building their own rows inside a flush `CardContent` can use
24
+ * `px-(--card-px)` to line up with the card chrome regardless of `size`.
25
+ *
26
+ * Layouts
27
+ * -------
28
+ * - Stacked (default): the root carries vertical padding and a gap between
29
+ * slots; slots only carry horizontal padding. This is the historical
30
+ * behaviour and the default visuals are unchanged.
31
+ * - Sectioned (`sectioned`): the root carries no padding or gap; each slot
32
+ * owns its own vertical inset and slots are separated by dividers
33
+ * (`CardHeader bordered`, `CardFooter bordered`). Use for headers that sit
34
+ * above flush lists/tables, and for settings cards with a sticky footer.
35
+ */
36
+ declare const cardVariants: (props?: ({
37
+ size?: "sm" | "md" | null | undefined;
38
+ sectioned?: boolean | null | undefined;
39
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
40
+ export interface CardProps extends React.ComponentProps<'div'>, VariantProps<typeof cardVariants> {
41
+ }
42
+ declare function Card({ className, size, sectioned, ...props }: CardProps): React.JSX.Element;
43
+ declare const cardHeaderVariants: (props?: ({
44
+ size?: "sm" | "md" | "lg" | null | undefined;
45
+ bordered?: boolean | null | undefined;
46
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
47
+ export interface CardHeaderProps extends React.ComponentProps<'div'>, VariantProps<typeof cardHeaderVariants> {
48
+ }
49
+ declare function CardHeader({ className, size, bordered, ...props }: CardHeaderProps): React.JSX.Element;
50
+ /**
51
+ * Trailing header action (button, link, badge). Renders in the header's
52
+ * second grid column. With a description it spans both rows and top-aligns;
53
+ * title-only it shares the title's row and centres against it.
54
+ */
55
+ declare function CardAction({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
56
+ declare const cardContentVariants: (props?: ({
57
+ padding?: "default" | "none" | "x-none" | null | undefined;
58
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
59
+ export interface CardContentProps extends React.ComponentProps<'div'>, VariantProps<typeof cardContentVariants> {
60
+ }
61
+ declare function CardContent({ className, padding, ...props }: CardContentProps): React.JSX.Element;
62
+ declare const cardFooterVariants: (props?: ({
63
+ padding?: "default" | "none" | "x-none" | null | undefined;
64
+ bordered?: boolean | null | undefined;
65
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
66
+ export interface CardFooterProps extends React.ComponentProps<'div'>, VariantProps<typeof cardFooterVariants> {
67
+ }
68
+ declare function CardFooter({ className, padding, bordered, ...props }: CardFooterProps): React.JSX.Element;
69
+ /**
70
+ * Label | value definition row for sectioned settings cards.
71
+ *
72
+ * Two equal columns from `sm` up (stacked below), so labels, values, inline
73
+ * inputs, and status chips share the same midline down a card and across
74
+ * neighbouring cards. Both columns are `minmax(0, 1fr)` so long mono values
75
+ * can truncate instead of pushing the value column out. Pair with
76
+ * `CardContent padding="none"`: the row insets itself with `mx-(--card-px)`
77
+ * (not padding) so the divider between rows runs only as wide as the content,
78
+ * while the card header's own divider still spans the full card.
79
+ * Compose a help control inside `CardFieldLabel`; keep Tooltip/icons in the
80
+ * consumer, not here.
81
+ */
82
+ declare function CardField({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
83
+ declare function CardFieldLabel({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
84
+ declare function CardFieldValue({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
85
+ export { CardDescription, CardTitle };
86
+ 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 @@
1
+ export { SettingsNav, SettingsNavItem, type SettingsNavItemProps, SettingsNavLabel } from './settings-nav';
@@ -0,0 +1,30 @@
1
+ import type { VariantProps } from 'class-variance-authority';
2
+ import * as React from 'react';
3
+ /**
4
+ * Compact inset settings navigation for configuration pages.
5
+ *
6
+ * Deliberately separate from `NavMenu` / sidebar primitives — those are bound
7
+ * to the app chrome context. SettingsNav is a page-local list: a SETTINGS
8
+ * eyebrow, icon items with an active fill, optional error dots, Soon badges,
9
+ * and a danger item for destructive sections.
10
+ */
11
+ declare const settingsNavItemVariants: (props?: ({
12
+ variant?: "default" | "danger" | null | undefined;
13
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
14
+ declare function SettingsNav({ className, ...props }: React.ComponentProps<'nav'>): React.JSX.Element;
15
+ declare function SettingsNavLabel({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
16
+ export interface SettingsNavItemProps extends React.AnchorHTMLAttributes<HTMLAnchorElement>, VariantProps<typeof settingsNavItemVariants> {
17
+ /** When true, renders via Radix Slot so a router `Link` can own the element. */
18
+ asChild?: boolean;
19
+ /** Leading icon (lucide or custom). Coloured by the active / danger state. */
20
+ icon?: React.ReactNode;
21
+ /** Marks the item as the current section. */
22
+ active?: boolean;
23
+ /** Small status dot (e.g. validation error on that section). */
24
+ indicator?: boolean;
25
+ /** Trailing badge content, typically "Soon". */
26
+ badge?: React.ReactNode;
27
+ disabled?: boolean;
28
+ }
29
+ declare function SettingsNavItem({ className, variant, asChild, icon, active, indicator, badge, disabled, children, href, onClick, ...props }: SettingsNavItemProps): React.JSX.Element;
30
+ 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-BZzNnKYj.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 { n as SettingsNavItem, r as SettingsNavLabel, t as SettingsNav } from "./settings-nav-C_AF6gld.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, 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 { n as SettingsNavItem, r as SettingsNavLabel, t as SettingsNav } from "../settings-nav-C_AF6gld.mjs";
2
+ export { SettingsNav, SettingsNavItem, SettingsNavLabel };
@@ -0,0 +1,94 @@
1
+ import { t as cn } from "./utils-Bu32wN-x.mjs";
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";
5
+ import { Slot } from "@radix-ui/react-slot";
6
+ //#region src/components/base/settings-nav/settings-nav.tsx
7
+ /**
8
+ * Compact inset settings navigation for configuration pages.
9
+ *
10
+ * Deliberately separate from `NavMenu` / sidebar primitives — those are bound
11
+ * to the app chrome context. SettingsNav is a page-local list: a SETTINGS
12
+ * eyebrow, icon items with an active fill, optional error dots, Soon badges,
13
+ * and a danger item for destructive sections.
14
+ */
15
+ 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-xs font-normal transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring aria-disabled:pointer-events-none aria-disabled:opacity-50", {
16
+ variants: { variant: {
17
+ default: "text-foreground hover:bg-primary/5 hover:text-primary data-[active=true]:bg-primary/10 data-[active=true]:text-primary",
18
+ danger: "text-destructive hover:bg-destructive/10 data-[active=true]:bg-destructive/10 data-[active=true]:text-destructive"
19
+ } },
20
+ defaultVariants: { variant: "default" }
21
+ });
22
+ function SettingsNav({ className, ...props }) {
23
+ return /* @__PURE__ */ jsx("nav", {
24
+ "data-slot": "settings-nav",
25
+ "aria-label": "Settings",
26
+ className: cn("flex w-full flex-col gap-1", className),
27
+ ...props
28
+ });
29
+ }
30
+ function SettingsNavLabel({ className, ...props }) {
31
+ return /* @__PURE__ */ jsx("div", {
32
+ "data-slot": "settings-nav-label",
33
+ className: cn("text-muted-foreground px-2.5 pt-1 pb-2 text-[11px] font-semibold tracking-wide uppercase", className),
34
+ ...props
35
+ });
36
+ }
37
+ function SettingsNavItem({ className, variant, asChild = false, icon, active = false, indicator = false, badge, disabled = false, children, href, onClick, ...props }) {
38
+ const handleClick = (event) => {
39
+ if (disabled) {
40
+ event.preventDefault();
41
+ return;
42
+ }
43
+ onClick?.(event);
44
+ };
45
+ const label = asChild && React.isValidElement(children) ? children.props.children : children;
46
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
47
+ icon ? /* @__PURE__ */ jsx("span", {
48
+ "data-slot": "settings-nav-item-icon",
49
+ className: "flex size-4 shrink-0 items-center justify-center text-muted-foreground transition-colors group-hover/settings-nav-item:text-primary group-data-[active=true]/settings-nav-item:text-primary group-data-[variant=danger]/settings-nav-item:!text-destructive [&_svg]:size-4",
50
+ "aria-hidden": "true",
51
+ children: icon
52
+ }) : null,
53
+ /* @__PURE__ */ jsx("span", {
54
+ className: "min-w-0 flex-1 truncate text-left",
55
+ children: label
56
+ }),
57
+ indicator ? /* @__PURE__ */ jsx("span", {
58
+ "data-slot": "settings-nav-item-indicator",
59
+ className: "bg-destructive size-1.5 shrink-0 rounded-full",
60
+ "aria-label": "Needs attention"
61
+ }) : null,
62
+ badge != null ? /* @__PURE__ */ jsx("span", {
63
+ "data-slot": "settings-nav-item-badge",
64
+ className: "bg-muted text-muted-foreground rounded-md px-1.5 py-0.5 text-[10px] font-semibold tracking-wide uppercase",
65
+ children: badge
66
+ }) : null
67
+ ] });
68
+ const itemClassName = cn(settingsNavItemVariants({ variant }), className);
69
+ const itemProps = {
70
+ "data-slot": "settings-nav-item",
71
+ "data-active": active || void 0,
72
+ "data-variant": variant ?? "default",
73
+ "aria-current": active ? "page" : void 0,
74
+ "aria-disabled": disabled || void 0,
75
+ "tabIndex": disabled ? -1 : void 0,
76
+ "onClick": handleClick,
77
+ "className": itemClassName,
78
+ ...props
79
+ };
80
+ if (asChild && React.isValidElement(children)) {
81
+ const slotted = React.cloneElement(children, void 0, content);
82
+ return /* @__PURE__ */ jsx(Slot, {
83
+ ...itemProps,
84
+ children: slotted
85
+ });
86
+ }
87
+ return /* @__PURE__ */ jsx("a", {
88
+ href: disabled ? void 0 : href,
89
+ ...itemProps,
90
+ children: content
91
+ });
92
+ }
93
+ //#endregion
94
+ export { SettingsNavItem as n, SettingsNavLabel as r, SettingsNav as t };
@@ -1,30 +1,87 @@
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
+ if (valueProp === void 0) setUncontrolled(next);
19
+ onValueChange?.(next);
20
+ }, [onValueChange, valueProp]);
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
+ "data-layout-id": `tabs-indicator-${indicatorId}`,
69
+ className: "bg-primary absolute inset-x-0 bottom-0 h-0.5",
70
+ transition: {
71
+ type: "spring",
72
+ stiffness: 380,
73
+ damping: 30
74
+ }
75
+ }) : null;
76
+ let content;
77
+ if (asChild && React.isValidElement(children)) content = React.cloneElement(children, void 0, children.props.children, indicator);
78
+ else content = /* @__PURE__ */ jsxs(Fragment$1, { children: [children, indicator] });
25
79
  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
80
+ value,
81
+ asChild,
82
+ className: cn(tabsTriggerVariants({ variant }), className),
83
+ ...props,
84
+ children: content
28
85
  });
29
86
  }
30
87
  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.1",
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 };