@datum-cloud/datum-ui 3.7.1 → 3.10.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 (106) hide show
  1. package/dist/app-navigation/index.mjs +1 -1
  2. package/dist/{app-navigation-Bcx7hr9L.mjs → app-navigation-DyNZwlSG.mjs} +4 -4
  3. package/dist/assistant/index.mjs +9 -8
  4. package/dist/autocomplete/index.mjs +1 -1
  5. package/dist/{autocomplete-fSSmRLYK.mjs → autocomplete-CrCbO2VS.mjs} +12 -6
  6. package/dist/autosearch/index.mjs +3 -3
  7. package/dist/badge/index.mjs +182 -1
  8. package/dist/button/index.mjs +2 -2
  9. package/dist/{button-Dj6cKrWj.mjs → button-Cn4KagBO.mjs} +1 -1
  10. package/dist/{button-BU8TEbJ5.mjs → button-IK-Lnu_9.mjs} +1 -1
  11. package/dist/button-group/index.mjs +1 -1
  12. package/dist/{button-group-C3GKo-0p.mjs → button-group-DJ6X1SSj.mjs} +2 -2
  13. package/dist/{calendar-date-picker-BUwgVaI1.mjs → calendar-date-picker-BRKs56gR.mjs} +1 -1
  14. package/dist/card/index.mjs +1 -1
  15. package/dist/{card-save-bar-0XDpAJo_.mjs → card-save-bar-Te8jf-ie.mjs} +1 -1
  16. package/dist/checkbox/index.mjs +1 -1
  17. package/dist/checkbox-BAo5sbHk.mjs +84 -0
  18. package/dist/collapsible/index.mjs +1 -6
  19. package/dist/collapsible-B-KP3JZ-.mjs +104 -0
  20. package/dist/components/base/checkbox/checkbox.d.ts +11 -3
  21. package/dist/components/base/collapsible/collapsible.d.ts +28 -0
  22. package/dist/components/base/collapsible/index.d.ts +1 -1
  23. package/dist/components/base/radio-group/radio-group.d.ts +11 -5
  24. package/dist/components/base/spinner/index.d.ts +1 -1
  25. package/dist/components/base/spinner/spinner.d.ts +11 -0
  26. package/dist/components/base/switch/switch.d.ts +6 -1
  27. package/dist/components/base/typography/typography.d.ts +1 -1
  28. package/dist/components/features/_shared/copy-state-icon.d.ts +12 -0
  29. package/dist/components/features/_shared/index.d.ts +2 -0
  30. package/dist/components/features/_shared/motion-chip.d.ts +293 -0
  31. package/dist/components/features/logs/hooks/use-logs-url-state.d.ts +59 -0
  32. package/dist/components/features/logs/index.d.ts +4 -1
  33. package/dist/components/features/logs/utils/facet-counts.d.ts +50 -0
  34. package/dist/components/features/logs/utils/facets.d.ts +2 -0
  35. package/dist/components/features/logs/utils/index.d.ts +4 -0
  36. package/dist/components/features/logs/utils/url-state.d.ts +61 -0
  37. package/dist/components/icons/spinner.icon.d.ts +17 -3
  38. package/dist/copy-state-icon-DMvXXsZm.mjs +61 -0
  39. package/dist/data-table/index.mjs +1 -1
  40. package/dist/{data-table-s2YrE79S.mjs → data-table-DFUnUydN.mjs} +8 -8
  41. package/dist/date-picker/index.mjs +3 -3
  42. package/dist/date-time-picker/index.mjs +1 -1
  43. package/dist/{date-time-picker-CLdaGiGC.mjs → date-time-picker-BRMm2QSz.mjs} +1 -1
  44. package/dist/{date-time-range-picker-RZX4CS4b.mjs → date-time-range-picker-CqGGJTLS.mjs} +20 -9
  45. package/dist/dropzone/index.mjs +1 -1
  46. package/dist/{dropzone-Cer9E-VH.mjs → dropzone-qKYfSe7o.mjs} +1 -1
  47. package/dist/empty-content/index.mjs +1 -1
  48. package/dist/{empty-content-B2FZ9cyt.mjs → empty-content-CTMHak36.mjs} +1 -1
  49. package/dist/field-styles-D-FJatHt.mjs +31 -0
  50. package/dist/form/index.mjs +1 -1
  51. package/dist/form/stepper/index.mjs +1 -1
  52. package/dist/{form-C4XcxxjK.mjs → form-VdbSqDjL.mjs} +20 -13
  53. package/dist/grouped-table/index.mjs +1 -1
  54. package/dist/{grouped-table-32RO2v7U.mjs → grouped-table-B4HzLXq6.mjs} +3 -3
  55. package/dist/hooks/index.mjs +1 -1
  56. package/dist/hooks/use-breakpoint.d.ts +7 -2
  57. package/dist/icons/index.mjs +1 -1
  58. package/dist/index.mjs +37 -37
  59. package/dist/{layers-XEND2WKv.mjs → layers-BC1Ny49w.mjs} +11 -3
  60. package/dist/loader-overlay/index.mjs +1 -1
  61. package/dist/{loader-overlay-JvB8IQo3.mjs → loader-overlay-DP0pvHuG.mjs} +1 -1
  62. package/dist/logs/index.mjs +412 -115
  63. package/dist/map/index.mjs +1 -1
  64. package/dist/more-actions/index.mjs +1 -1
  65. package/dist/{more-actions-D9k1ILzT.mjs → more-actions-DXQiV-bN.mjs} +2 -2
  66. package/dist/motion-chip-BczV7spP.mjs +52 -0
  67. package/dist/multi-select/index.mjs +1 -1
  68. package/dist/{multi-select-BUgx6VZF.mjs → multi-select-DwcsJdHt.mjs} +82 -66
  69. package/dist/picker/index.mjs +2 -2
  70. package/dist/{picker-C0h30DHf.mjs → picker-BHPtncpv.mjs} +2 -2
  71. package/dist/radio-group/index.mjs +1 -1
  72. package/dist/radio-group-Boxi2hm0.mjs +83 -0
  73. package/dist/responsive-dropdown/index.mjs +1 -1
  74. package/dist/{responsive-dropdown-DsWgpE_i.mjs → responsive-dropdown-B9cDUeHt.mjs} +1 -1
  75. package/dist/responsive-popover/index.mjs +1 -1
  76. package/dist/{responsive-popover-DJYd8lOK.mjs → responsive-popover-B_pUxrZ1.mjs} +1 -1
  77. package/dist/rich-text-editor/index.mjs +1 -1
  78. package/dist/{rich-text-editor-ibngjhQV.mjs → rich-text-editor-CPd_6vdZ.mjs} +2 -2
  79. package/dist/select/index.mjs +1 -1
  80. package/dist/{select-DemYhwnG.mjs → select-B0Xlz-wD.mjs} +3 -2
  81. package/dist/{select-jgK6wyXj.mjs → select-CGsHf70u.mjs} +7 -2
  82. package/dist/spinner/index.mjs +1 -1
  83. package/dist/spinner-DSlDJdWl.mjs +23 -0
  84. package/dist/spinner.icon-BiUnMAxw.mjs +104 -0
  85. package/dist/switch/index.mjs +1 -1
  86. package/dist/switch-IduVwiPZ.mjs +114 -0
  87. package/dist/tabs/index.mjs +1 -1
  88. package/dist/tag-input/index.mjs +1 -1
  89. package/dist/{tag-input-DAMY703F.mjs → tag-input-a3ktkGrH.mjs} +39 -32
  90. package/dist/task-queue/index.mjs +1 -1
  91. package/dist/{task-queue-dropdown-BgQSGDwg.mjs → task-queue-dropdown-BflEFiMi.mjs} +4 -4
  92. package/dist/time-picker/index.mjs +1 -1
  93. package/dist/{time-picker-DgHjdcMZ.mjs → time-picker-BFwH-Vd3.mjs} +1 -1
  94. package/dist/{to-api-format-EZInfj0_.mjs → to-api-format-BiWOTFha.mjs} +4 -4
  95. package/dist/transfer/index.mjs +1 -1
  96. package/dist/{transfer-91lwTOhX.mjs → transfer-DGUeAQUL.mjs} +1 -1
  97. package/dist/{use-breakpoint-zY_JYINK.mjs → use-breakpoint-Ce5tS4cU.mjs} +11 -5
  98. package/dist/{use-option-picker-CBMU72LU.mjs → use-option-picker-DXY2SNnT.mjs} +2 -2
  99. package/dist/utils/field-styles.d.ts +21 -0
  100. package/package.json +1 -4
  101. package/dist/badge-D7A6GfWn.mjs +0 -182
  102. package/dist/checkbox-CNljVnKj.mjs +0 -28
  103. package/dist/radio-group-0RxTmRnF.mjs +0 -43
  104. package/dist/spinner-DjEpx6Q3.mjs +0 -13
  105. package/dist/spinner.icon-D0SKuGFG.mjs +0 -47
  106. package/dist/switch-CWvVN9ea.mjs +0 -33
@@ -0,0 +1,114 @@
1
+ import { t as cn } from "./utils-CTIuhCOs.mjs";
2
+ import { n as EASE, t as DURATION } from "./motion-DOrRbLmy.mjs";
3
+ import { t as useControllableState } from "./use-controllable-state-DLeVgbAb.mjs";
4
+ import { CheckIcon, XIcon } from "lucide-react";
5
+ import * as React from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { motion, useReducedMotion } from "motion/react";
8
+ import * as SwitchPrimitive from "@radix-ui/react-switch";
9
+ // src/components/base/switch/switch.tsx
10
+ /** Thumb diameter in px (`size-5`). */
11
+ const THUMB = 20;
12
+ /** How far the thumb travels: the track's inner width (44 - 2px border) minus the thumb. */
13
+ const TRAVEL = 22;
14
+ /** How much the thumb widens while pressed, toward the side it will move to. */
15
+ const STRETCH = 4;
16
+ const THUMB_SPRING = {
17
+ type: "spring",
18
+ visualDuration: .22,
19
+ bounce: .15
20
+ };
21
+ const GLYPH_TRANSITION = {
22
+ duration: DURATION.fast,
23
+ ease: EASE.out
24
+ };
25
+ /**
26
+ * Switch renders the Radix primitive directly rather than wrapping the shadcn
27
+ * one, because its state glyphs go inside the thumb. Building it here keeps the
28
+ * shadcn base untouched, so that base can be regenerated from upstream without
29
+ * losing anything of ours.
30
+ *
31
+ * Motion drives the thumb: it slides on a light spring, stretches while the
32
+ * pointer is held down (so the press registers before the release toggles it),
33
+ * and the on/off glyphs cross-fade. Under reduced motion the thumb moves
34
+ * instantly and only the glyphs fade.
35
+ */
36
+ function Switch({ ref, className, checked: checkedProp, defaultChecked, onCheckedChange, onPointerDown, onPointerUp, onPointerLeave, onPointerCancel, ...props }) {
37
+ const [checked, setChecked] = useControllableState(checkedProp, defaultChecked ?? false, onCheckedChange);
38
+ const [pressed, setPressed] = React.useState(false);
39
+ const reduceMotion = Boolean(useReducedMotion());
40
+ const stretch = pressed && !reduceMotion && !props.disabled ? STRETCH : 0;
41
+ const x = checked ? TRAVEL - stretch : 0;
42
+ return /* @__PURE__ */ jsx(SwitchPrimitive.Root, {
43
+ ref,
44
+ "data-slot": "switch",
45
+ checked,
46
+ onCheckedChange: setChecked,
47
+ onPointerDown: (event) => {
48
+ onPointerDown?.(event);
49
+ if (event.button === 0) setPressed(true);
50
+ },
51
+ onPointerUp: (event) => {
52
+ onPointerUp?.(event);
53
+ setPressed(false);
54
+ },
55
+ onPointerLeave: (event) => {
56
+ onPointerLeave?.(event);
57
+ setPressed(false);
58
+ },
59
+ onPointerCancel: (event) => {
60
+ onPointerCancel?.(event);
61
+ setPressed(false);
62
+ },
63
+ className: cn("peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-6 w-11 shrink-0 items-center rounded-full border border-transparent shadow-xs outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", "transition-[background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-out", className),
64
+ ...props,
65
+ children: /* @__PURE__ */ jsx(SwitchPrimitive.Thumb, {
66
+ asChild: true,
67
+ children: /* @__PURE__ */ jsxs(motion.span, {
68
+ "data-slot": "switch-thumb",
69
+ initial: false,
70
+ animate: {
71
+ x,
72
+ width: THUMB + stretch
73
+ },
74
+ transition: reduceMotion ? { duration: 0 } : THUMB_SPRING,
75
+ className: cn("bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground text-muted-foreground dark:data-[state=unchecked]:text-background dark:data-[state=checked]:text-primary pointer-events-none relative flex h-5 items-center justify-center rounded-full ring-0"),
76
+ children: [/* @__PURE__ */ jsx(motion.span, {
77
+ "aria-hidden": true,
78
+ className: "absolute flex",
79
+ initial: false,
80
+ animate: checked ? {
81
+ opacity: 0,
82
+ scale: reduceMotion ? 1 : .5
83
+ } : {
84
+ opacity: 1,
85
+ scale: 1
86
+ },
87
+ transition: GLYPH_TRANSITION,
88
+ children: /* @__PURE__ */ jsx(XIcon, {
89
+ "aria-hidden": true,
90
+ className: "size-3"
91
+ })
92
+ }), /* @__PURE__ */ jsx(motion.span, {
93
+ "aria-hidden": true,
94
+ className: "absolute flex",
95
+ initial: false,
96
+ animate: checked ? {
97
+ opacity: 1,
98
+ scale: 1
99
+ } : {
100
+ opacity: 0,
101
+ scale: reduceMotion ? 1 : .5
102
+ },
103
+ transition: GLYPH_TRANSITION,
104
+ children: /* @__PURE__ */ jsx(CheckIcon, {
105
+ "aria-hidden": true,
106
+ className: "size-3"
107
+ })
108
+ })]
109
+ })
110
+ })
111
+ });
112
+ }
113
+ Switch.displayName = "Switch";
114
+ export { Switch as t };
@@ -2,8 +2,8 @@ import { t as cn } from "../utils-CTIuhCOs.mjs";
2
2
  import { cva } from "class-variance-authority";
3
3
  import * as React from "react";
4
4
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
- import * as TabsPrimitive from "@radix-ui/react-tabs";
6
5
  import { motion } from "motion/react";
6
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
7
7
  // src/components/base/tabs/tabs.tsx
8
8
  const TabsContext = React.createContext({
9
9
  value: void 0,
@@ -1 +1 @@
1
- export { t as TagsInput } from "../tag-input-DAMY703F.mjs";
1
+ export { t as TagsInput } from "../tag-input-a3ktkGrH.mjs";
@@ -1,10 +1,11 @@
1
1
  import { t as cn } from "./utils-CTIuhCOs.mjs";
2
- import { t as Badge } from "./badge-D7A6GfWn.mjs";
3
2
  import { t as Input } from "./input-DsT5qkJn.mjs";
4
3
  import { t as Icon } from "./icon-wrapper-CIk2th6R.mjs";
4
+ import { n as useChipMotion, t as MotionBadge } from "./motion-chip-BczV7spP.mjs";
5
5
  import { X } from "lucide-react";
6
6
  import * as React from "react";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
+ import { AnimatePresence } from "motion/react";
8
9
  import { z } from "zod";
9
10
  // src/components/features/tag-input/parse.ts
10
11
  /**
@@ -94,37 +95,43 @@ function processPastedValues(rawValues, existing, { normalizer, validator, maxIt
94
95
  */
95
96
  function TagInputField({ value, placeholder, input }) {
96
97
  const { inputValue, activeIndex, setActiveIndex, disableInput, disableButton, removeValue, handleKeyDown, handlePaste, handleBlur, handleSelect, handleChange, mousePreventDefault } = input;
97
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [value.map((item, index) => /* @__PURE__ */ jsxs(Badge, {
98
- tabIndex: activeIndex !== -1 ? 0 : activeIndex,
99
- "aria-disabled": disableButton,
100
- "data-active": activeIndex === index,
101
- className: cn("data-[active='true']:ring-muted-foreground relative flex items-center gap-1 truncate rounded px-1 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 data-[active='true']:ring-2"),
102
- type: "secondary",
103
- children: [/* @__PURE__ */ jsx("span", {
104
- className: "text-xs",
105
- children: item
106
- }), /* @__PURE__ */ jsxs("button", {
107
- type: "button",
108
- "aria-label": `Remove ${item} option`,
109
- "aria-roledescription": "button to remove option",
110
- disabled: disableButton,
111
- onMouseDown: mousePreventDefault,
112
- onClick: () => removeValue(item),
113
- className: "disabled:cursor-not-allowed",
114
- children: [/* @__PURE__ */ jsxs("span", {
115
- className: "sr-only",
116
- children: [
117
- "Remove",
118
- item,
119
- " ",
120
- "option"
121
- ]
122
- }), /* @__PURE__ */ jsx(Icon, {
123
- icon: X,
124
- className: "hover:stroke-destructive h-4 w-4"
98
+ const chipMotion = useChipMotion();
99
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(AnimatePresence, {
100
+ initial: false,
101
+ mode: "popLayout",
102
+ children: value.map((item, index) => /* @__PURE__ */ jsxs(MotionBadge, {
103
+ ...chipMotion,
104
+ tabIndex: activeIndex !== -1 ? 0 : activeIndex,
105
+ "aria-disabled": disableButton,
106
+ "data-active": activeIndex === index,
107
+ className: cn("data-[active='true']:ring-muted-foreground relative flex items-center gap-1 truncate rounded px-1 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 data-[active='true']:ring-2"),
108
+ type: "secondary",
109
+ children: [/* @__PURE__ */ jsx("span", {
110
+ className: "text-xs",
111
+ children: item
112
+ }), /* @__PURE__ */ jsxs("button", {
113
+ type: "button",
114
+ "aria-label": `Remove ${item} option`,
115
+ "aria-roledescription": "button to remove option",
116
+ disabled: disableButton,
117
+ onMouseDown: mousePreventDefault,
118
+ onClick: () => removeValue(item),
119
+ className: "disabled:cursor-not-allowed",
120
+ children: [/* @__PURE__ */ jsxs("span", {
121
+ className: "sr-only",
122
+ children: [
123
+ "Remove",
124
+ item,
125
+ " ",
126
+ "option"
127
+ ]
128
+ }), /* @__PURE__ */ jsx(Icon, {
129
+ icon: X,
130
+ className: "hover:stroke-destructive h-4 w-4"
131
+ })]
125
132
  })]
126
- })]
127
- }, item)), /* @__PURE__ */ jsx(Input, {
133
+ }, item))
134
+ }), /* @__PURE__ */ jsx(Input, {
128
135
  tabIndex: 0,
129
136
  "aria-label": "input tag",
130
137
  disabled: disableInput,
@@ -408,7 +415,7 @@ function TagsInput({ ref, value, onValueChange, placeholder, maxItems, minItems,
408
415
  ...props,
409
416
  ref,
410
417
  dir,
411
- className: cn("border-input-border bg-input-background/50 text-input-foreground flex min-h-10 flex-wrap items-center gap-1 overflow-hidden rounded-lg border px-3 py-2 transition-all", activeIndex === -1 ? "focus-within:border-input-focus-border focus-within:shadow-(--input-focus-shadow) focus-within:ring-0 focus-within:ring-offset-0 focus-within:outline-hidden" : "focus-within:ring-0 focus-within:ring-offset-0 focus-within:outline-hidden", className),
418
+ className: cn("border-input-border bg-input-background/50 text-input-foreground relative flex min-h-10 flex-wrap items-center gap-1 overflow-hidden rounded-lg border px-3 py-2 transition-[border-color,box-shadow]", activeIndex === -1 ? "focus-within:border-input-focus-border focus-within:shadow-(--input-focus-shadow) focus-within:ring-0 focus-within:ring-offset-0 focus-within:outline-hidden" : "focus-within:ring-0 focus-within:ring-offset-0 focus-within:outline-hidden", className),
412
419
  suppressHydrationWarning: true,
413
420
  children: [(showValidationErrors && validationError || error) && /* @__PURE__ */ jsx("div", {
414
421
  className: "mb-1 w-full text-sm text-red-500",
@@ -1 +1 @@
1
- export { v as LocalTaskStorage, _ as RedisTaskStorage, i as TaskPanel, s as TaskPanelActions, o as TaskPanelCounter, c as TaskPanelHeader, a as TaskPanelItem, h as TaskQueue, t as TaskQueueDropdown, m as TaskQueueProvider, r as TaskQueueTrigger, n as TaskSummaryDialog, y as createOrgMetadata, b as createProjectMetadata, x as createUserMetadata, g as detectStorage, l as getContextLabel, u as matchesCurrentScope, d as useCurrentScope, p as useTaskQueue, f as useTasksWithLabels } from "../task-queue-dropdown-BgQSGDwg.mjs";
1
+ export { v as LocalTaskStorage, _ as RedisTaskStorage, i as TaskPanel, s as TaskPanelActions, o as TaskPanelCounter, c as TaskPanelHeader, a as TaskPanelItem, h as TaskQueue, t as TaskQueueDropdown, m as TaskQueueProvider, r as TaskQueueTrigger, n as TaskSummaryDialog, y as createOrgMetadata, b as createProjectMetadata, x as createUserMetadata, g as detectStorage, l as getContextLabel, u as matchesCurrentScope, d as useCurrentScope, p as useTaskQueue, f as useTasksWithLabels } from "../task-queue-dropdown-BflEFiMi.mjs";
@@ -1,10 +1,10 @@
1
1
  import { t as cn } from "./utils-CTIuhCOs.mjs";
2
- import { t as Badge } from "./badge-D7A6GfWn.mjs";
3
- import { t as SpinnerIcon } from "./spinner.icon-D0SKuGFG.mjs";
4
- import { t as Button } from "./button-Dj6cKrWj.mjs";
2
+ import { Badge } from "./badge/index.mjs";
3
+ import { t as SpinnerIcon } from "./spinner.icon-BiUnMAxw.mjs";
4
+ import { t as Button } from "./button-Cn4KagBO.mjs";
5
5
  import { t as Icon } from "./icon-wrapper-CIk2th6R.mjs";
6
6
  import { t as Dialog } from "./dialog-C8RXIQYm.mjs";
7
- import { t as ResponsiveDropdown } from "./responsive-dropdown-DsWgpE_i.mjs";
7
+ import { t as ResponsiveDropdown } from "./responsive-dropdown-B9cDUeHt.mjs";
8
8
  import { a as TooltipTrigger, n as Tooltip, r as TooltipContent, t as Tooltip$1 } from "./tooltip-OIySjJWW.mjs";
9
9
  import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "./table/index.mjs";
10
10
  import { Ban, CheckCircle2, CircleAlert, CircleCheck, CornerDownRightIcon, FileIcon, ListTodo, X, XCircle } from "lucide-react";
@@ -1 +1 @@
1
- export { t as TimePicker } from "../time-picker-DgHjdcMZ.mjs";
1
+ export { t as TimePicker } from "../time-picker-BFwH-Vd3.mjs";
@@ -1,5 +1,5 @@
1
1
  import { t as useDeprecationWarning } from "./use-deprecation-warning-BS1V4IS5.mjs";
2
- import { n as TimePicker$1 } from "./picker-C0h30DHf.mjs";
2
+ import { n as TimePicker$1 } from "./picker-BHPtncpv.mjs";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  // src/components/features/time-picker/time-picker.tsx
5
5
  const STEP_VALUES = [
@@ -1,10 +1,10 @@
1
1
  import { t as cn } from "./utils-CTIuhCOs.mjs";
2
- import { t as Button } from "./button-Dj6cKrWj.mjs";
2
+ import { t as Button } from "./button-Cn4KagBO.mjs";
3
3
  import { Calendar } from "./calendar/index.mjs";
4
4
  import { t as Input } from "./input-DsT5qkJn.mjs";
5
- import { t as ResponsivePopover } from "./responsive-popover-DJYd8lOK.mjs";
6
- import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-DemYhwnG.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-RZX4CS4b.mjs";
5
+ import { t as ResponsivePopover } from "./responsive-popover-B_pUxrZ1.mjs";
6
+ import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-B0Xlz-wD.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-CqGGJTLS.mjs";
8
8
  import { t as useDeprecationWarning } from "./use-deprecation-warning-BS1V4IS5.mjs";
9
9
  import { CalendarIcon, Globe } from "lucide-react";
10
10
  import { useCallback, useEffect, useId, useRef, useState } from "react";
@@ -1 +1 @@
1
- export { t as Transfer } from "../transfer-91lwTOhX.mjs";
1
+ export { t as Transfer } from "../transfer-DGUeAQUL.mjs";
@@ -1,5 +1,5 @@
1
1
  import { t as cn } from "./utils-CTIuhCOs.mjs";
2
- import { t as Button } from "./button-Dj6cKrWj.mjs";
2
+ import { t as Button } from "./button-Cn4KagBO.mjs";
3
3
  import { Search, X } from "lucide-react";
4
4
  import * as React from "react";
5
5
  import { useCallback, useEffect, useMemo, useState } from "react";
@@ -13,16 +13,22 @@ function getBreakpoint() {
13
13
  * Returns the current viewport breakpoint tier.
14
14
  *
15
15
  * Breakpoints: mobile <768px, tablet 768–1023px, desktop ≥1024px.
16
- * SSR-safe: defaults to 'desktop' on server; client corrects on mount.
16
+ *
17
+ * `initial` is the tier the server rendered with. Pass the viewport the server
18
+ * already knows about (for example a viewport client hint) so the hydration
19
+ * render matches; without one it defaults to 'desktop'. The client measures on
20
+ * mount and tracks resizes after that, so the first render stays deterministic
21
+ * on both sides.
17
22
  */
18
- function useBreakpoint() {
19
- const [breakpoint, setBreakpoint] = useState(getBreakpoint);
23
+ function useBreakpoint(initial = "desktop") {
24
+ const [breakpoint, setBreakpoint] = useState(initial);
20
25
  useEffect(() => {
21
- const mqTablet = window.matchMedia(`(min-width: ${TABLET_MIN}px)`);
22
- const mqDesktop = window.matchMedia(`(min-width: ${DESKTOP_MIN}px)`);
23
26
  const update = () => {
24
27
  setBreakpoint(getBreakpoint());
25
28
  };
29
+ update();
30
+ const mqTablet = window.matchMedia(`(min-width: ${TABLET_MIN}px)`);
31
+ const mqDesktop = window.matchMedia(`(min-width: ${DESKTOP_MIN}px)`);
26
32
  mqTablet.addEventListener("change", update);
27
33
  mqDesktop.addEventListener("change", update);
28
34
  return () => {
@@ -1,6 +1,6 @@
1
- import { a as CommandInput, i as CommandGroup, o as CommandItem, r as CommandEmpty, s as CommandList, t as Command } from "./command-B0be-zU5.mjs";
2
1
  import { t as useControllableState } from "./use-controllable-state-DLeVgbAb.mjs";
3
- import { t as LoaderOverlay } from "./loader-overlay-JvB8IQo3.mjs";
2
+ import { a as CommandInput, i as CommandGroup, o as CommandItem, r as CommandEmpty, s as CommandList, t as Command } from "./command-B0be-zU5.mjs";
3
+ import { t as LoaderOverlay } from "./loader-overlay-DP0pvHuG.mjs";
4
4
  import { CheckIcon } from "lucide-react";
5
5
  import { useCallback, useMemo, useRef, useState } from "react";
6
6
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared look for every input-like trigger: Select, Autocomplete, MultiSelect
3
+ * and the date/time pickers. They sit next to each other in toolbars and
4
+ * filter rows, so they must line up with `Input` and with each other:
5
+ *
6
+ * - 12px (`px-3`) inline padding, the same as `Input`
7
+ * - `text-sm`, regular weight for both the value and the placeholder
8
+ * - 8px (`gap-2`) between the leading icon, the value and trailing icons
9
+ * - trailing chevrons are 16px and muted, with no extra margin, so the
10
+ * chevron sits 12px from the right edge on every trigger
11
+ * - clear (X) icons are 14px: lucide's X fills more of its box than the
12
+ * chevron, so at 16px it looks heavier than the chevron beside it
13
+ *
14
+ * Internal: not part of the public `utils` entry.
15
+ */
16
+ /** Box, type and focus styles. Height is left to each component. */
17
+ export declare const fieldTriggerClassName: string;
18
+ /** Placeholder text inside a trigger. Same colour as `Input`'s placeholder. */
19
+ export declare const fieldPlaceholderClassName = "text-input-placeholder";
20
+ /** Leading icons and the trailing chevron. Clear icons use `size-3.5`. */
21
+ export declare const fieldIconClassName = "text-muted-foreground size-4 shrink-0";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@datum-cloud/datum-ui",
3
3
  "type": "module",
4
- "version": "3.7.1",
4
+ "version": "3.10.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "url": "https://github.com/datum-cloud/datum-ui"
@@ -559,9 +559,6 @@
559
559
  "monaco-editor": {
560
560
  "optional": true
561
561
  },
562
- "motion": {
563
- "optional": true
564
- },
565
562
  "nprogress": {
566
563
  "optional": true
567
564
  },
@@ -1,182 +0,0 @@
1
- import { t as cn } from "./utils-CTIuhCOs.mjs";
2
- import { cva } from "class-variance-authority";
3
- import "react";
4
- import { jsx } from "react/jsx-runtime";
5
- // src/components/base/badge/badge.tsx
6
- /**
7
- * Datum Badge Component
8
- * Similar to Button component but with badge-specific styling
9
- * Supports types: primary, secondary, tertiary, quaternary, warning, danger, success
10
- * Supports themes: solid, outline, light
11
- */
12
- const badgeVariants = cva("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-all focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2", {
13
- variants: {
14
- type: {
15
- primary: "",
16
- secondary: "",
17
- tertiary: "",
18
- quaternary: "",
19
- info: "",
20
- warning: "",
21
- danger: "",
22
- success: "",
23
- muted: ""
24
- },
25
- theme: {
26
- solid: "",
27
- outline: "border",
28
- light: "border-transparent"
29
- }
30
- },
31
- compoundVariants: [
32
- {
33
- type: "primary",
34
- theme: "solid",
35
- className: "border-transparent bg-[var(--color-badge-primary)] text-[var(--color-badge-primary-foreground)]"
36
- },
37
- {
38
- type: "primary",
39
- theme: "outline",
40
- className: "border-[var(--color-badge-primary)] text-[var(--color-badge-primary)] dark:border-[var(--color-badge-primary)] dark:text-[var(--color-badge-primary)]"
41
- },
42
- {
43
- type: "primary",
44
- theme: "light",
45
- className: "text-[var(--color-badge-primary)] bg-[var(--color-badge-primary)]/10 dark:text-[var(--color-badge-primary)] dark:bg-[var(--color-badge-primary)]/20"
46
- },
47
- {
48
- type: "secondary",
49
- theme: "solid",
50
- className: "border-transparent bg-[var(--color-badge-secondary)] text-[var(--color-badge-secondary-foreground)]"
51
- },
52
- {
53
- type: "secondary",
54
- theme: "outline",
55
- className: "border-[var(--color-badge-secondary)] text-[var(--color-badge-secondary)] dark:border-[var(--color-badge-secondary)] dark:text-[var(--color-badge-secondary)]"
56
- },
57
- {
58
- type: "secondary",
59
- theme: "light",
60
- className: "text-[var(--color-badge-secondary)] bg-[var(--color-badge-secondary)]/20 dark:text-[var(--color-badge-secondary)] dark:bg-[var(--color-badge-secondary)]/20"
61
- },
62
- {
63
- type: "tertiary",
64
- theme: "solid",
65
- className: "border-transparent bg-[var(--color-badge-tertiary)] text-[var(--color-badge-tertiary-foreground)]"
66
- },
67
- {
68
- type: "tertiary",
69
- theme: "outline",
70
- className: "border-[var(--color-badge-tertiary)] text-[var(--color-badge-tertiary)] dark:border-[var(--color-badge-tertiary)] dark:text-[var(--color-badge-tertiary)]"
71
- },
72
- {
73
- type: "tertiary",
74
- theme: "light",
75
- className: "text-[var(--color-badge-tertiary)] bg-[var(--color-badge-tertiary)]/20 dark:text-[var(--color-badge-tertiary)] dark:bg-[var(--color-badge-tertiary)]/20"
76
- },
77
- {
78
- type: "quaternary",
79
- theme: "solid",
80
- className: "border-transparent bg-[var(--color-badge-quaternary)] text-[var(--color-badge-quaternary-foreground)]"
81
- },
82
- {
83
- type: "quaternary",
84
- theme: "outline",
85
- className: "border-[var(--color-badge-quaternary)] text-[var(--color-badge-quaternary-foreground)] dark:border-[var(--color-badge-quaternary)] dark:text-[var(--color-badge-quaternary-foreground)]"
86
- },
87
- {
88
- type: "quaternary",
89
- theme: "light",
90
- className: "text-[var(--color-badge-quaternary-foreground)] bg-[var(--color-badge-quaternary)]/20 dark:text-[var(--color-badge-quaternary-foreground)] dark:bg-[var(--color-badge-quaternary)]/20"
91
- },
92
- {
93
- type: "info",
94
- theme: "solid",
95
- className: "border-transparent bg-[var(--color-badge-info)] text-[var(--color-badge-info-foreground)]"
96
- },
97
- {
98
- type: "info",
99
- theme: "outline",
100
- className: "border-[var(--color-badge-info)] text-[var(--color-badge-info)] dark:border-[var(--color-badge-info)] dark:text-[var(--color-badge-info)]"
101
- },
102
- {
103
- type: "info",
104
- theme: "light",
105
- className: "text-[var(--color-badge-info)] bg-[var(--color-badge-info)]/20 dark:text-[var(--color-badge-info)] dark:bg-[var(--color-badge-info)]/20"
106
- },
107
- {
108
- type: "warning",
109
- theme: "solid",
110
- className: "border-transparent bg-[var(--color-badge-warning)] text-[var(--color-badge-warning-foreground)]"
111
- },
112
- {
113
- type: "warning",
114
- theme: "outline",
115
- className: "border-[var(--color-badge-warning)] text-[var(--color-badge-warning)] dark:border-[var(--color-badge-warning)] dark:text-[var(--color-badge-warning)]"
116
- },
117
- {
118
- type: "warning",
119
- theme: "light",
120
- className: "text-[var(--color-badge-warning)] bg-[var(--color-badge-warning)]/20 dark:text-[var(--color-badge-warning)] dark:bg-[var(--color-badge-warning)]/20"
121
- },
122
- {
123
- type: "danger",
124
- theme: "solid",
125
- className: "border-transparent bg-[var(--color-badge-danger)] text-[var(--color-badge-danger-foreground)]"
126
- },
127
- {
128
- type: "danger",
129
- theme: "outline",
130
- className: "border-[var(--color-badge-danger)] text-[var(--color-badge-danger)] dark:border-[var(--color-badge-danger)] dark:text-[var(--color-badge-danger)]"
131
- },
132
- {
133
- type: "danger",
134
- theme: "light",
135
- className: "text-[var(--color-badge-danger)] bg-[var(--color-badge-danger)]/20 dark:text-[var(--color-badge-danger)] dark:bg-[var(--color-badge-danger)]/20"
136
- },
137
- {
138
- type: "success",
139
- theme: "solid",
140
- className: "border-transparent bg-[var(--color-badge-success)] text-[var(--color-badge-success-foreground)]"
141
- },
142
- {
143
- type: "success",
144
- theme: "outline",
145
- className: "border-[var(--color-badge-success)] text-[var(--color-badge-success)] dark:border-[var(--color-badge-success)] dark:text-[var(--color-badge-success)]"
146
- },
147
- {
148
- type: "success",
149
- theme: "light",
150
- className: "text-[var(--color-badge-success)] bg-[var(--color-badge-success)]/20 dark:text-[var(--color-badge-success)] dark:bg-[var(--color-badge-success)]/20"
151
- },
152
- {
153
- type: "muted",
154
- theme: "solid",
155
- className: "border-transparent text-[var(--color-badge-muted-foreground)] bg-[var(--color-badge-muted)] dark:border-[var(--color-badge-muted)]/20 dark:text-[var(--color-badge-muted)] dark:bg-[var(--color-badge-muted)]/20"
156
- },
157
- {
158
- type: "muted",
159
- theme: "outline",
160
- className: "border-[var(--color-badge-muted)] text-[var(--color-badge-muted)] dark:border-[var(--color-badge-muted)] dark:text-[var(--color-badge-muted)]"
161
- },
162
- {
163
- type: "muted",
164
- theme: "light",
165
- className: "text-[var(--muted-foreground)] bg-[var(--muted-foreground)]/15 dark:text-[var(--color-badge-muted)] dark:bg-[var(--color-badge-muted)]/20"
166
- }
167
- ],
168
- defaultVariants: {
169
- type: "muted",
170
- theme: "solid"
171
- }
172
- });
173
- function Badge({ className, type, theme, ...props }) {
174
- return /* @__PURE__ */ jsx("div", {
175
- className: cn(badgeVariants({
176
- type,
177
- theme
178
- }), className),
179
- ...props
180
- });
181
- }
182
- export { badgeVariants as n, Badge as t };
@@ -1,28 +0,0 @@
1
- import { t as cn } from "./utils-CTIuhCOs.mjs";
2
- import { CheckIcon } from "lucide-react";
3
- import "react";
4
- import { jsx } from "react/jsx-runtime";
5
- import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
6
- // ../shadcn/ui/checkbox.tsx
7
- function Checkbox$1({ className, ...props }) {
8
- return /* @__PURE__ */ jsx(CheckboxPrimitive.Root, {
9
- "data-slot": "checkbox",
10
- className: cn("peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
11
- ...props,
12
- children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, {
13
- "data-slot": "checkbox-indicator",
14
- className: "flex items-center justify-center text-current transition-none",
15
- children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5" })
16
- })
17
- });
18
- }
19
- // src/components/base/checkbox/checkbox.tsx
20
- function Checkbox({ ref, className, ...props }) {
21
- return /* @__PURE__ */ jsx(Checkbox$1, {
22
- ref,
23
- className: cn(className),
24
- ...props
25
- });
26
- }
27
- Checkbox.displayName = "Checkbox";
28
- export { Checkbox as t };
@@ -1,43 +0,0 @@
1
- import { t as cn } from "./utils-CTIuhCOs.mjs";
2
- import { CircleIcon } from "lucide-react";
3
- import "react";
4
- import { jsx } from "react/jsx-runtime";
5
- import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
6
- // ../shadcn/ui/radio-group.tsx
7
- function RadioGroup$1({ className, ...props }) {
8
- return /* @__PURE__ */ jsx(RadioGroupPrimitive.Root, {
9
- "data-slot": "radio-group",
10
- className: cn("grid gap-3", className),
11
- ...props
12
- });
13
- }
14
- function RadioGroupItem$1({ className, ...props }) {
15
- return /* @__PURE__ */ jsx(RadioGroupPrimitive.Item, {
16
- "data-slot": "radio-group-item",
17
- className: cn("border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
18
- ...props,
19
- children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, {
20
- "data-slot": "radio-group-indicator",
21
- className: "relative flex items-center justify-center",
22
- children: /* @__PURE__ */ jsx(CircleIcon, { className: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" })
23
- })
24
- });
25
- }
26
- // src/components/base/radio-group/radio-group.tsx
27
- function RadioGroup({ ref, className, ...props }) {
28
- return /* @__PURE__ */ jsx(RadioGroup$1, {
29
- ref,
30
- className: cn(className),
31
- ...props
32
- });
33
- }
34
- RadioGroup.displayName = "RadioGroup";
35
- function RadioGroupItem({ ref, className, ...props }) {
36
- return /* @__PURE__ */ jsx(RadioGroupItem$1, {
37
- ref,
38
- className: cn(className),
39
- ...props
40
- });
41
- }
42
- RadioGroupItem.displayName = "RadioGroupItem";
43
- export { RadioGroupItem as n, RadioGroup as t };
@@ -1,13 +0,0 @@
1
- import { t as cn } from "./utils-CTIuhCOs.mjs";
2
- import { Loader2Icon } from "lucide-react";
3
- import { jsx } from "react/jsx-runtime";
4
- // ../shadcn/ui/spinner.tsx
5
- function Spinner({ className, ...props }) {
6
- return /* @__PURE__ */ jsx(Loader2Icon, {
7
- role: "status",
8
- "aria-label": "Loading",
9
- className: cn("size-4 animate-spin", className),
10
- ...props
11
- });
12
- }
13
- export { Spinner as t };