@rebasepro/ui 0.12.1-canary.gf5f1d39 → 0.13.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 (58) hide show
  1. package/dist/components/Button.d.ts +2 -1
  2. package/dist/components/Menubar.d.ts +9 -2
  3. package/dist/components/SearchBar.d.ts +1 -1
  4. package/dist/components/VirtualTable/VirtualTable.d.ts +12 -6
  5. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +1 -0
  6. package/dist/components/index.d.ts +0 -1
  7. package/dist/icons/GitHubIcon.d.ts +1 -1
  8. package/dist/icons/HandleIcon.d.ts +3 -1
  9. package/dist/index.css +29 -61
  10. package/dist/index.d.ts +2 -1
  11. package/dist/index.es.js +484 -298
  12. package/dist/index.es.js.map +1 -1
  13. package/dist/src/index.css +29 -61
  14. package/dist/src/theme.css +109 -0
  15. package/dist/styles.d.ts +28 -0
  16. package/dist/theme.css +109 -0
  17. package/dist/util/chip_colors.d.ts +29 -3
  18. package/dist/views/CollectionView/index.d.ts +0 -6
  19. package/dist/views/Kanban/BoardColumn.d.ts +1 -0
  20. package/dist/views/Kanban/BoardSortableList.d.ts +2 -1
  21. package/dist/views/Kanban/board_types.d.ts +10 -0
  22. package/dist/views/Kanban/placement.d.ts +26 -0
  23. package/dist/views/index.d.ts +0 -1
  24. package/package.json +31 -29
  25. package/src/components/BooleanSwitch.tsx +44 -17
  26. package/src/components/BooleanSwitchWithLabel.tsx +6 -6
  27. package/src/components/Button.tsx +9 -13
  28. package/src/components/Checkbox.tsx +16 -6
  29. package/src/components/Chip.tsx +5 -2
  30. package/src/components/ColorPicker.tsx +56 -43
  31. package/src/components/DateTimeField.tsx +18 -6
  32. package/src/components/DialogActions.tsx +3 -1
  33. package/src/components/IconButton.tsx +35 -6
  34. package/src/components/Menubar.tsx +19 -3
  35. package/src/components/MultiSelect.tsx +9 -5
  36. package/src/components/SearchBar.tsx +6 -4
  37. package/src/components/Select.tsx +6 -6
  38. package/src/components/TextField.tsx +17 -7
  39. package/src/components/VirtualTable/VirtualTable.performance.test.tsx +35 -341
  40. package/src/components/VirtualTable/VirtualTable.tsx +19 -1
  41. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +6 -1
  42. package/src/components/index.tsx +2 -1
  43. package/src/icons/GitHubIcon.tsx +11 -5
  44. package/src/icons/HandleIcon.tsx +15 -2
  45. package/src/index.css +29 -61
  46. package/src/index.ts +2 -1
  47. package/src/styles.ts +47 -0
  48. package/src/theme.css +109 -0
  49. package/src/util/chip_colors.ts +109 -67
  50. package/src/views/CollectionView/index.ts +6 -11
  51. package/src/views/Kanban/Board.tsx +80 -117
  52. package/src/views/Kanban/BoardColumn.tsx +3 -0
  53. package/src/views/Kanban/BoardSortableList.tsx +16 -4
  54. package/src/views/Kanban/board_types.ts +10 -0
  55. package/src/views/Kanban/placement.ts +62 -0
  56. package/src/views/index.ts +1 -1
  57. package/dist/views/TableView.d.ts +0 -6
  58. package/src/views/TableView.tsx +0 -7
package/dist/index.es.js CHANGED
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import * as React$1 from "react";
3
3
  import React, { Children, createContext, createRef, forwardRef, memo, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
4
+ import * as Collapsible from "@radix-ui/react-collapsible";
4
5
  import { clsx } from "clsx";
5
6
  import { twMerge } from "tailwind-merge";
6
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
- import * as Collapsible from "@radix-ui/react-collapsible";
8
8
  import { AlertCircleIcon, AlertCircleIcon as AlertCircleIcon$1, AlertTriangleIcon, AlignLeftIcon, AppWindow, ArrowDownIcon, ArrowDownToLineIcon, ArrowLeftIcon, ArrowLeftIcon as ArrowLeftIcon$1, ArrowRightFromLineIcon, ArrowRightIcon, ArrowRightLeftIcon, ArrowRightToLineIcon, ArrowUpDownIcon, ArrowUpIcon, ArrowUpIcon as ArrowUpIcon$1, ArrowUpToLineIcon, BoldIcon, BookOpenIcon, CalendarIcon, CalendarIcon as CalendarIcon$1, CheckCircle2Icon, CheckCircleIcon, CheckIcon, CheckIcon as CheckIcon$1, CheckSquareIcon, ChevronDownIcon, ChevronDownIcon as ChevronDownIcon$1, ChevronLeftIcon, ChevronLeftIcon as ChevronLeftIcon$1, ChevronRightIcon, ChevronRightIcon as ChevronRightIcon$1, ChevronUpIcon, ChevronUpIcon as ChevronUpIcon$1, ChevronsLeftIcon, ChevronsRightIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, CircleUserIcon, CodeIcon, ColumnsIcon, CopyIcon, DatabaseIcon, DollarSignIcon, DownloadIcon, ExternalLinkIcon, EyeIcon, EyeOffIcon, FileIcon, FileSearchIcon, FileTextIcon, FilterIcon, FilterIcon as FilterIcon$1, FilterXIcon, FlagIcon, FolderIcon, FolderKanbanIcon, FolderPlusIcon, FolderUpIcon, FunctionSquareIcon, GitBranchIcon, GlobeIcon, HashIcon, Heading1Icon, Heading2Icon, Heading3Icon, HelpCircleIcon, HistoryIcon, HomeIcon, ImageIcon, ImageIcon as ImageIcon$1, ImageOffIcon, InfoIcon, ItalicIcon, Kanban, KanbanIcon, KeyIcon, KeyRoundIcon, LanguagesIcon, LayoutGrid, LayoutGridIcon, LayoutList, Link2Icon, LinkIcon, ListIcon, ListOrderedIcon, ListPlusIcon, ListTodoIcon, LoaderIcon, LockIcon, LogOutIcon, MailIcon, Maximize2Icon, MenuIcon, MessageCircleIcon, MinusCircleIcon, MinusIcon, MinusIcon as MinusIcon$1, MoonIcon, MoreVerticalIcon, Music2Icon, PanelLeftIcon, PauseIcon, PenLineIcon, PencilIcon, PhoneIcon, PinIcon, PlayIcon, PlusIcon, QuoteIcon, RefreshCcwIcon, RefreshCwIcon, RefreshCwIcon as RefreshCwIcon$1, RepeatIcon, Rows3Icon, SaveIcon, SearchIcon, SearchIcon as SearchIcon$1, SendIcon, Settings2, SettingsIcon, ShieldAlertIcon, ShieldIcon, ShoppingCartIcon, SlidersHorizontalIcon, SquareIcon, StarIcon, StickyNoteIcon, StrikethroughIcon, SunIcon, SunMoonIcon, Table2, TableIcon, TagIcon, TerminalIcon, TextIcon, Trash2Icon, TrendingUpIcon, TypeIcon, UnderlineIcon, UndoIcon, Unlink2Icon, UploadCloudIcon, UploadIcon, UserCheckIcon, UserIcon, UserPlus, UsersIcon, VideoIcon, VoteIcon, Wand2Icon, WrenchIcon, XCircleIcon, XIcon, XIcon as XIcon$1, icons as lucideIcons } from "lucide-react";
9
9
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
10
10
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
@@ -28,10 +28,50 @@ import * as TabsPrimitive from "@radix-ui/react-tabs";
28
28
  import { FixedSizeList } from "react-window";
29
29
  import useMeasure from "react-use-measure";
30
30
  import { SortableContext, arrayMove, horizontalListSortingStrategy, useSortable, verticalListSortingStrategy } from "@dnd-kit/sortable";
31
- import { DndContext, DragOverlay, PointerSensor, closestCenter, useDroppable, useSensor, useSensors } from "@dnd-kit/core";
31
+ import { DndContext, DragOverlay, PointerSensor, closestCenter, closestCorners, useDroppable, useSensor, useSensors } from "@dnd-kit/core";
32
32
  import * as Portal from "@radix-ui/react-portal";
33
33
  import { Slot } from "@radix-ui/react-slot";
34
34
  import { CSS } from "@dnd-kit/utilities";
35
+ //#region src/styles.ts
36
+ var CONTROL_HEIGHT = {
37
+ smallest: 28,
38
+ small: 32,
39
+ medium: 40,
40
+ large: 48,
41
+ xl: 56,
42
+ "2xl": 64
43
+ };
44
+ /** Tailwind min-height class per control size. Keep in sync with CONTROL_HEIGHT. */
45
+ var controlHeightMixin = {
46
+ smallest: "min-h-[28px]",
47
+ small: "min-h-[32px]",
48
+ medium: "min-h-[40px]",
49
+ large: "min-h-[48px]",
50
+ xl: "min-h-[56px]",
51
+ "2xl": "min-h-[64px]"
52
+ };
53
+ /** Horizontal padding paired with each size, so gutters scale with height. */
54
+ var controlPaddingMixin = {
55
+ smallest: "px-2",
56
+ small: "px-2",
57
+ medium: "px-3",
58
+ large: "px-4",
59
+ xl: "px-6",
60
+ "2xl": "px-10"
61
+ };
62
+ var focusedDisabled = "focus-visible:ring-0 focus-visible:ring-offset-0";
63
+ var focusedInvisibleMixin = "focus:bg-opacity-70 focus:bg-surface-accent-100 focus:dark:bg-white/[0.07] focus:bg-surface-accent-100/70";
64
+ var focusedClasses = "z-30 outline-hidden outline-none ring-2 ring-primary ring-opacity-50 ring-primary/50 ring-offset-0 ring-offset-transparent ";
65
+ var fieldBackgroundMixin = "bg-surface-accent-200/50 dark:bg-white/[0.055]";
66
+ var fieldBackgroundInvisibleMixin = "bg-surface-accent-200/0 dark:bg-white/0";
67
+ var fieldBackgroundDisabledMixin = "bg-surface-accent-200/50 dark:bg-white/[0.03]";
68
+ var fieldBackgroundHoverMixin = "hover:bg-surface-accent-200/70 hover:dark:bg-white/[0.09]";
69
+ var defaultBorderMixin = "border-surface-200 dark:border-surface-700/60 ";
70
+ var paperMixin = "bg-white rounded-lg dark:bg-surface-900 border border-surface-200 dark:border-surface-700";
71
+ var cardMixin = "bg-white dark:bg-surface-900 rounded-lg border border-surface-200 dark:border-surface-700";
72
+ var cardClickableMixin = "hover:bg-primary/5 dark:hover:bg-primary/5 cursor-pointer transition-colors duration-150";
73
+ var cardSelectedMixin = "bg-primary-bg/30 dark:bg-primary-bg/10 ring-1 ring-primary/75";
74
+ //#endregion
35
75
  //#region src/util/cls.ts
36
76
  function cls(...classes) {
37
77
  return twMerge(clsx(classes));
@@ -70,129 +110,200 @@ function hashString(str) {
70
110
  }
71
111
  //#endregion
72
112
  //#region src/util/chip_colors.ts
73
- var CHIP_COLORS = {
113
+ var CHIP_HUES = [
114
+ "blue",
115
+ "cyan",
116
+ "teal",
117
+ "green",
118
+ "yellow",
119
+ "orange",
120
+ "red",
121
+ "pink",
122
+ "purple",
123
+ "gray",
124
+ "indigo",
125
+ "violet",
126
+ "fuchsia",
127
+ "rose",
128
+ "emerald"
129
+ ];
130
+ var HUE_STOPS = {
74
131
  blue: {
75
- color: "#cfdfff",
76
- text: "#102046",
77
- darkColor: "#2750ae",
78
- darkText: "#cfdfff"
132
+ pale: "#cfdfff",
133
+ mid: "#9cc7ff",
134
+ solid: "#2d7ff9",
135
+ deep: "#2750ae",
136
+ text: "#102046"
137
+ },
138
+ cyan: {
139
+ pale: "#d0f0fd",
140
+ mid: "#77d1f3",
141
+ solid: "#18bfff",
142
+ deep: "#0b76b7",
143
+ text: "#04283f"
79
144
  },
80
145
  teal: {
81
- color: "#c2f5e9",
146
+ pale: "#c2f5e9",
147
+ mid: "#72ddc3",
148
+ solid: "#20d9d2",
149
+ deep: "#06a09b",
82
150
  text: "#012524",
83
- darkColor: "#06a09b",
84
- darkText: "#daf3e9"
85
- },
86
- yellow: {
87
- color: "#ffeab6",
88
- text: "#3b2501",
89
- darkColor: "#b87503",
90
- darkText: "#ffeab6"
91
- },
92
- pink: {
93
- color: "#ffdaf6",
94
- text: "#400832",
95
- darkColor: "#b2158b",
96
- darkText: "#ffdaf6"
151
+ onDeep: "#daf3e9"
97
152
  },
98
- purple: {
99
- color: "#ede2fe",
100
- text: "#280b42",
101
- darkColor: "#6b1cb0",
102
- darkText: "#ede2fe"
153
+ green: {
154
+ pale: "#d1f7c4",
155
+ mid: "#93e088",
156
+ solid: "#20c933",
157
+ deep: "#338a17",
158
+ text: "#0b1d05"
103
159
  },
104
- cyan: {
105
- color: "#d0f0fd",
106
- text: "#04283f",
107
- darkColor: "#0b76b7",
108
- darkText: "#d0f0fd"
160
+ yellow: {
161
+ pale: "#ffeab6",
162
+ mid: "#ffd66e",
163
+ solid: "#fcb400",
164
+ deep: "#b87503",
165
+ text: "#3b2501"
109
166
  },
110
167
  orange: {
111
- color: "#fee2d5",
112
- text: "#6b2613",
113
- darkColor: "#d74d26",
114
- darkText: "#fee2d5"
115
- },
116
- green: {
117
- color: "#d1f7c4",
118
- text: "#0b1d05",
119
- darkColor: "#338a17",
120
- darkText: "#d1f7c4"
168
+ pale: "#fee2d5",
169
+ mid: "#ffa981",
170
+ solid: "#ff6f2c",
171
+ deep: "#d74d26",
172
+ text: "#6b2613"
121
173
  },
122
174
  red: {
123
- color: "#ffdce5",
124
- text: "#4c0c1c",
125
- darkColor: "#ba1e45",
126
- darkText: "#ffdce5"
175
+ pale: "#ffdce5",
176
+ mid: "#ff9eb7",
177
+ solid: "#f82b60",
178
+ deep: "#ba1e45",
179
+ text: "#4c0c1c"
180
+ },
181
+ pink: {
182
+ pale: "#ffdaf6",
183
+ mid: "#f99de2",
184
+ solid: "#ff08c2",
185
+ deep: "#b2158b",
186
+ text: "#400832"
187
+ },
188
+ purple: {
189
+ pale: "#ede2fe",
190
+ mid: "#cdb0ff",
191
+ solid: "#8b46ff",
192
+ deep: "#6b1cb0",
193
+ text: "#280b42"
127
194
  },
128
195
  gray: {
129
- color: "#eee",
130
- text: "#040404",
131
- darkColor: "#444",
132
- darkText: "#eee"
196
+ pale: "#eeeeee",
197
+ mid: "#cccccc",
198
+ solid: "#666666",
199
+ deep: "#444444",
200
+ text: "#040404"
133
201
  },
134
202
  indigo: {
135
- color: "#e0e7ff",
136
- text: "#312e81",
137
- darkColor: "#4f46e5",
138
- darkText: "#e0e7ff"
203
+ pale: "#e0e7ff",
204
+ mid: "#a5b4fc",
205
+ solid: "#6366f1",
206
+ deep: "#4f46e5",
207
+ text: "#312e81"
139
208
  },
140
209
  violet: {
141
- color: "#ede9fe",
142
- text: "#4c1d95",
143
- darkColor: "#7c3aed",
144
- darkText: "#ede9fe"
210
+ pale: "#ede9fe",
211
+ mid: "#c4b5fd",
212
+ solid: "#8b5cf6",
213
+ deep: "#7c3aed",
214
+ text: "#4c1d95"
145
215
  },
146
216
  fuchsia: {
147
- color: "#fae8ff",
148
- text: "#701a75",
149
- darkColor: "#c026d3",
150
- darkText: "#fae8ff"
217
+ pale: "#fae8ff",
218
+ mid: "#f0abfc",
219
+ solid: "#d946ef",
220
+ deep: "#c026d3",
221
+ text: "#701a75"
151
222
  },
152
223
  rose: {
153
- color: "#ffe4e6",
154
- text: "#881337",
155
- darkColor: "#e11d48",
156
- darkText: "#ffe4e6"
224
+ pale: "#ffe4e6",
225
+ mid: "#fda4af",
226
+ solid: "#f43f5e",
227
+ deep: "#e11d48",
228
+ text: "#881337"
157
229
  },
158
230
  emerald: {
159
- color: "#d1fae5",
160
- text: "#064e3b",
161
- darkColor: "#059669",
162
- darkText: "#d1fae5"
231
+ pale: "#d1fae5",
232
+ mid: "#6ee7b7",
233
+ solid: "#10b981",
234
+ deep: "#059669",
235
+ text: "#064e3b"
163
236
  }
164
237
  };
238
+ function tone(stops, chipTone) {
239
+ const onDeep = stops.onDeep ?? stops.pale;
240
+ switch (chipTone) {
241
+ case "Light": return {
242
+ color: stops.mid,
243
+ text: stops.text,
244
+ darkColor: stops.solid,
245
+ darkText: "#fff"
246
+ };
247
+ case "Dark": return {
248
+ color: stops.solid,
249
+ text: "#fff",
250
+ darkColor: stops.solid,
251
+ darkText: "#fff"
252
+ };
253
+ case "Darker": return {
254
+ color: stops.deep,
255
+ text: onDeep,
256
+ darkColor: stops.deep,
257
+ darkText: onDeep
258
+ };
259
+ default: return {
260
+ color: stops.pale,
261
+ text: stops.text,
262
+ darkColor: stops.deep,
263
+ darkText: onDeep
264
+ };
265
+ }
266
+ }
267
+ var CHIP_TONES = [
268
+ "Lighter",
269
+ "Light",
270
+ "Dark",
271
+ "Darker"
272
+ ];
273
+ function buildChipColors() {
274
+ const colors = {};
275
+ for (const hue of CHIP_HUES) {
276
+ const stops = HUE_STOPS[hue];
277
+ for (const chipTone of CHIP_TONES) colors[`${hue}${chipTone}`] = tone(stops, chipTone);
278
+ colors[hue] = tone(stops, "Lighter");
279
+ }
280
+ return colors;
281
+ }
282
+ /**
283
+ * Every chip scheme, keyed by hue and tone.
284
+ *
285
+ * This table used to hold four tones per hue and was flattened to one, which
286
+ * left `blueDark`, `redDarker` and friends resolving to `undefined` — a chip
287
+ * with a colour in its config rendering with no colour at all — and left seeded
288
+ * chips picking from ten schemes, so a five-value enum routinely drew the same
289
+ * background three times. The tones are generated from {@link HUE_STOPS} now,
290
+ * so a new hue brings its whole family with it.
291
+ */
292
+ var CHIP_COLORS = buildChipColors();
293
+ /**
294
+ * The keys a seeded chip may be assigned, in a stable order.
295
+ *
296
+ * The bare-hue aliases are excluded: they are the same scheme as `<hue>Lighter`
297
+ * and would make the palest tone twice as likely as any other.
298
+ */
299
+ var CHIP_SEED_KEYS = CHIP_HUES.flatMap((hue) => CHIP_TONES.map((chipTone) => `${hue}${chipTone}`));
165
300
  function getColorSchemeForKey(key) {
166
- return CHIP_COLORS[key];
301
+ return CHIP_COLORS[key] ?? getColorSchemeForSeed(String(key));
167
302
  }
168
303
  function getColorSchemeForSeed(seed) {
169
- const hash = hashString(seed);
170
- const colorKeys = Object.keys(CHIP_COLORS);
171
- return CHIP_COLORS[colorKeys[hash % colorKeys.length]];
304
+ return CHIP_COLORS[CHIP_SEED_KEYS[hashString(seed) % CHIP_SEED_KEYS.length]];
172
305
  }
173
306
  //#endregion
174
- //#region src/components/common/SelectInputLabel.tsx
175
- function SelectInputLabel({ children, error }) {
176
- return /* @__PURE__ */ jsx("div", {
177
- className: cls("text-sm font-medium ml-3.5 mb-1", error ? "text-red-600 dark:text-red-500" : "text-surface-accent-500 dark:text-surface-accent-300"),
178
- children
179
- });
180
- }
181
- //#endregion
182
- //#region src/styles.ts
183
- var focusedDisabled = "focus-visible:ring-0 focus-visible:ring-offset-0";
184
- var focusedInvisibleMixin = "focus:bg-opacity-70 focus:bg-surface-accent-100 focus:dark:bg-white/[0.07] focus:bg-surface-accent-100/70";
185
- var focusedClasses = "z-30 outline-hidden outline-none ring-2 ring-primary ring-opacity-50 ring-primary/50 ring-offset-0 ring-offset-transparent ";
186
- var fieldBackgroundMixin = "bg-surface-accent-200/50 dark:bg-white/[0.055]";
187
- var fieldBackgroundInvisibleMixin = "bg-surface-accent-200/0 dark:bg-white/0";
188
- var fieldBackgroundDisabledMixin = "bg-surface-accent-200/50 dark:bg-white/[0.03]";
189
- var fieldBackgroundHoverMixin = "hover:bg-surface-accent-200/70 hover:dark:bg-white/[0.09]";
190
- var defaultBorderMixin = "border-surface-200 dark:border-surface-700/60 ";
191
- var paperMixin = "bg-white rounded-lg dark:bg-surface-900 border border-surface-200 dark:border-surface-700";
192
- var cardMixin = "bg-white dark:bg-surface-900 rounded-lg border border-surface-200 dark:border-surface-700";
193
- var cardClickableMixin = "hover:bg-primary/5 dark:hover:bg-primary/5 cursor-pointer transition-colors duration-150";
194
- var cardSelectedMixin = "bg-primary-bg/30 dark:bg-primary-bg/10 ring-1 ring-primary/75";
195
- //#endregion
196
307
  //#region src/hooks/PortalContainerContext.tsx
197
308
  var PortalContainerContext = createContext(void 0);
198
309
  /**
@@ -2438,23 +2549,31 @@ var colorClassesMapping = {
2438
2549
  };
2439
2550
  //#endregion
2440
2551
  //#region src/icons/GitHubIcon.tsx
2441
- function GitHubIcon(props) {
2552
+ function GitHubIcon({ size = 24, color, className, onClick, style }) {
2553
+ const px = typeof size === "number" ? size : iconSize[size];
2442
2554
  return /* @__PURE__ */ jsx("svg", {
2443
2555
  xmlns: "http://www.w3.org/2000/svg",
2444
- className: props.className,
2556
+ className: cls(color ? colorClassesMapping[color] : "", className),
2557
+ onClick,
2558
+ style,
2445
2559
  fill: "currentColor",
2446
- width: props.size ?? 24,
2447
- height: props.size ?? 24,
2560
+ width: px,
2561
+ height: px,
2448
2562
  viewBox: "0 0 24 24",
2449
2563
  children: /* @__PURE__ */ jsx("path", { d: "M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" })
2450
2564
  });
2451
2565
  }
2452
2566
  //#endregion
2453
2567
  //#region src/icons/HandleIcon.tsx
2454
- function HandleIcon() {
2568
+ function HandleIcon({ size = 24, color, className, onClick, style }) {
2569
+ const px = typeof size === "number" ? size : iconSize[size];
2455
2570
  return /* @__PURE__ */ jsxs("svg", {
2456
- width: "24",
2457
- height: "24",
2571
+ xmlns: "http://www.w3.org/2000/svg",
2572
+ className: cls(color ? colorClassesMapping[color] : "", className),
2573
+ onClick,
2574
+ style,
2575
+ width: px,
2576
+ height: px,
2458
2577
  viewBox: "0 0 100 100",
2459
2578
  fill: "none",
2460
2579
  children: [
@@ -2597,6 +2716,52 @@ var AvatarInner = ({ src, alt, children, className, style, outerClassName, hover
2597
2716
  var Avatar = React.forwardRef(AvatarInner);
2598
2717
  //#endregion
2599
2718
  //#region src/components/BooleanSwitch.tsx
2719
+ /**
2720
+ * Switch geometry, one row per size: track w x h, knob k, and the knob's
2721
+ * off/on x-offsets. `on` is always `w - k - inset` so the knob is inset by the
2722
+ * same amount at both ends and vertically centred.
2723
+ *
2724
+ * This is a table rather than inline `cls({...})` conditions on purpose. The
2725
+ * offsets used to be computed object keys — `[value ? "translate-x-[24px]" :
2726
+ * "translate-x-[3px]"]: size === "large"` — and `large` and `medium` both
2727
+ * produced the key `translate-x-[3px]` when off. The later literal overwrote
2728
+ * the earlier, so the off-state class was silently dropped for `large` and the
2729
+ * knob sat flush against the edge.
2730
+ */
2731
+ var SWITCH_GEOMETRY = {
2732
+ smallest: {
2733
+ track: "w-[34px] h-[18px] min-w-[34px] min-h-[18px]",
2734
+ knob: "w-[16px] h-[16px]",
2735
+ off: "translate-x-[1px]",
2736
+ on: "translate-x-[17px]",
2737
+ bar: "w-[16px] h-[6px]",
2738
+ barX: "translate-x-[9px]"
2739
+ },
2740
+ small: {
2741
+ track: "w-[38px] h-[22px] min-w-[38px] min-h-[22px]",
2742
+ knob: "w-[18px] h-[18px]",
2743
+ off: "translate-x-[2px]",
2744
+ on: "translate-x-[18px]",
2745
+ bar: "w-[18px] h-[8px]",
2746
+ barX: "translate-x-[10px]"
2747
+ },
2748
+ medium: {
2749
+ track: "w-[44px] h-[26px] min-w-[44px] min-h-[26px]",
2750
+ knob: "w-[20px] h-[20px]",
2751
+ off: "translate-x-[3px]",
2752
+ on: "translate-x-[21px]",
2753
+ bar: "w-[20px] h-[10px]",
2754
+ barX: "translate-x-[12px]"
2755
+ },
2756
+ large: {
2757
+ track: "w-[48px] h-[28px] min-w-[48px] min-h-[28px]",
2758
+ knob: "w-[22px] h-[22px]",
2759
+ off: "translate-x-[3px]",
2760
+ on: "translate-x-[23px]",
2761
+ bar: "w-[22px] h-[11px]",
2762
+ barX: "translate-x-[13px]"
2763
+ }
2764
+ };
2600
2765
  var BooleanSwitch = React.forwardRef(function BooleanSwitch({ value, allowIndeterminate, className, onValueChange, disabled = false, size = "medium", ...props }, ref) {
2601
2766
  return /* @__PURE__ */ jsxs("button", {
2602
2767
  type: "button",
@@ -2612,23 +2777,9 @@ var BooleanSwitch = React.forwardRef(function BooleanSwitch({ value, allowIndete
2612
2777
  else onValueChange?.(null);
2613
2778
  else onValueChange?.(!value);
2614
2779
  },
2615
- className: cls(size === "smallest" ? "w-[34px] h-[18px] min-w-[34px] min-h-[18px]" : size === "small" ? "w-[38px] h-[22px] min-w-[38px] min-h-[22px]" : "w-[44px] h-[26px] min-w-[44px] min-h-[26px]", "outline-none outline-hidden rounded-full relative shadow-sm", value ? disabled ? "bg-white bg-opacity-54 bg-white/54 dark:bg-surface-accent-950 border-surface-accent-100 dark:border-surface-accent-700 ring-1 ring-surface-accent-200 dark:ring-surface-accent-700" : "ring-secondary ring-1 bg-secondary dark:bg-secondary" : "bg-white bg-opacity-54 bg-white/54 dark:bg-surface-accent-900 ring-1 ring-surface-accent-200 dark:ring-surface-accent-700", className),
2780
+ className: cls(SWITCH_GEOMETRY[size].track, "outline-none outline-hidden rounded-full relative shadow-sm", value ? disabled ? "bg-white bg-opacity-54 bg-white/54 dark:bg-surface-accent-950 border-surface-accent-100 dark:border-surface-accent-700 ring-1 ring-surface-accent-200 dark:ring-surface-accent-700" : "ring-secondary ring-1 bg-secondary dark:bg-secondary" : "bg-white bg-opacity-54 bg-white/54 dark:bg-surface-accent-900 ring-1 ring-surface-accent-200 dark:ring-surface-accent-700", className),
2616
2781
  ...props,
2617
- children: [allowIndeterminate && (value === null || value === void 0) && /* @__PURE__ */ jsx("div", { className: cls("block rounded-full transition-transform duration-100 ease-out transform will-change-auto shadow-sm", disabled ? "bg-surface-accent-400 dark:bg-surface-accent-600" : "bg-surface-accent-400 dark:bg-surface-accent-600", {
2618
- "w-[21px] h-[10px]": size === "medium" || size === "large",
2619
- "w-[19px] h-[8px]": size === "small",
2620
- "w-[16px] h-[6px]": size === "smallest",
2621
- "translate-x-[10px]": size === "medium" || size === "large",
2622
- "translate-x-[9px]": size === "small",
2623
- "translate-x-[8px]": size === "smallest"
2624
- }) }, "knob"), !(allowIndeterminate && (value === null || value === void 0)) && /* @__PURE__ */ jsx("div", { className: cls("block rounded-full transition-transform duration-100 ease-out transform will-change-auto shadow-sm", disabled ? "bg-surface-accent-300 dark:bg-surface-accent-700" : value ? "bg-white shadow" : "bg-surface-accent-600 dark:bg-surface-accent-400", {
2625
- "w-[21px] h-[21px]": size === "medium" || size === "large",
2626
- "w-[19px] h-[19px]": size === "small",
2627
- "w-[16px] h-[16px]": size === "smallest",
2628
- [value ? "translate-x-[19px]" : "translate-x-[3px]"]: size === "medium" || size === "large",
2629
- [value ? "translate-x-[17px]" : "translate-x-[2px]"]: size === "small",
2630
- [value ? "translate-x-[16px]" : "translate-x-[1px]"]: size === "smallest"
2631
- }) }, "knob")]
2782
+ children: [allowIndeterminate && (value === null || value === void 0) && /* @__PURE__ */ jsx("div", { className: cls("block rounded-full transition-transform duration-100 ease-out transform will-change-auto shadow-sm", disabled ? "bg-surface-accent-400 dark:bg-surface-accent-600" : "bg-surface-accent-400 dark:bg-surface-accent-600", SWITCH_GEOMETRY[size].bar, SWITCH_GEOMETRY[size].barX) }, "knob"), !(allowIndeterminate && (value === null || value === void 0)) && /* @__PURE__ */ jsx("div", { className: cls("block rounded-full transition-transform duration-100 ease-out transform will-change-auto shadow-sm", disabled ? "bg-surface-accent-300 dark:bg-surface-accent-700" : value ? "bg-white shadow" : "bg-surface-accent-600 dark:bg-surface-accent-400", SWITCH_GEOMETRY[size].knob, value ? SWITCH_GEOMETRY[size].on : SWITCH_GEOMETRY[size].off) }, "knob")]
2632
2783
  });
2633
2784
  });
2634
2785
  //#endregion
@@ -2657,12 +2808,7 @@ var BooleanSwitchWithLabel = function BooleanSwitchWithLabel({ value, position =
2657
2808
  "aria-disabled": disabled || void 0,
2658
2809
  "aria-labelledby": label ? switchLabelId : void 0,
2659
2810
  tabIndex: -1,
2660
- className: cls(!invisible && "bg-surface-accent-200/50 dark:bg-white/[0.055]", !invisible && (disabled ? "bg-surface-accent-200/50 dark:bg-white/[0.03]" : "hover:bg-surface-accent-200/70 hover:dark:bg-white/[0.09]"), disabled ? "cursor-default" : "cursor-pointer", "rounded-lg max-w-full justify-between box-border relative inline-flex items-center", !invisible && focus && !disabled ? focusedClasses : "", error ? "text-red-500 dark:text-red-600" : focus && !disabled ? "text-primary" : !disabled ? "text-text-primary dark:text-text-primary-dark" : "text-text-secondary dark:text-text-secondary-dark", {
2661
- "min-h-[28px]": size === "smallest",
2662
- "min-h-[32px]": size === "small",
2663
- "min-h-[44px]": size === "medium",
2664
- "min-h-[64px]": size === "large"
2665
- }, size === "small" || size === "smallest" ? "pl-2" : "pl-4", size === "small" || size === "smallest" ? "pr-4" : "pr-6", position === "end" ? "flex-row-reverse" : "flex-row", fullWidth ? "w-full" : "", className),
2811
+ className: cls(!invisible && "bg-surface-accent-200/50 dark:bg-white/[0.055]", !invisible && (disabled ? "bg-surface-accent-200/50 dark:bg-white/[0.03]" : "hover:bg-surface-accent-200/70 hover:dark:bg-white/[0.09]"), disabled ? "cursor-default" : "cursor-pointer", "rounded-lg max-w-full justify-between box-border relative inline-flex items-center", !invisible && focus && !disabled ? focusedClasses : "", error ? "text-red-500 dark:text-red-600" : focus && !disabled ? "text-primary" : !disabled ? "text-text-primary dark:text-text-primary-dark" : "text-text-secondary dark:text-text-secondary-dark", controlHeightMixin[size], size === "small" || size === "smallest" ? "pl-2" : "pl-4", size === "small" || size === "smallest" ? "pr-4" : "pr-6", position === "end" ? "flex-row-reverse" : "flex-row", fullWidth ? "w-full" : "", className),
2666
2812
  onClick: disabled ? void 0 : (e) => {
2667
2813
  if (props.allowIndeterminate) {
2668
2814
  const onChange = onValueChange;
@@ -2694,17 +2840,17 @@ var ButtonInner = React.memo(React.forwardRef(({ children, className, variant =
2694
2840
  "w-fit": !fullWidth,
2695
2841
  "border border-primary bg-primary focus:ring-primary text-white hover:text-white hover:brightness-105": variant === "filled" && color === "primary" && !disabled,
2696
2842
  "border border-secondary bg-secondary focus:ring-secondary text-white hover:text-white hover:brightness-105": variant === "filled" && color === "secondary" && !disabled,
2697
- "border border-red-500 bg-red-500 hover:bg-red-600 focus:ring-red-500 text-white hover:text-white": variant === "filled" && color === "error" && !disabled,
2843
+ "border border-red-600 bg-red-600 hover:bg-red-700 focus:ring-red-600 text-white hover:text-white": variant === "filled" && color === "error" && !disabled,
2698
2844
  "border border-surface-accent-200 bg-surface-accent-200 hover:bg-surface-accent-300 focus:ring-surface-accent-400 text-text-primary hover:text-text-primary dark:border-surface-accent-700 dark:bg-surface-accent-700 dark:hover:bg-surface-accent-600 dark:text-text-primary-dark hover:dark:text-text-primary-dark": variant === "filled" && color === "text" && !disabled,
2699
2845
  "border border-transparent bg-surface-100 hover:bg-surface-accent-200 text-text-primary dark:bg-surface-700 dark:hover:bg-surface-accent-700 dark:text-text-primary-dark hover:text-text-primary dark:text-text-primary-dark hover:dark:text-text-primary-dark": variant === "filled" && color === "neutral" && !disabled,
2700
2846
  "border border-transparent text-primary hover:text-primary hover:bg-surface-accent-200 hover:bg-opacity-75 hover:bg-surface-accent-200/75 dark:hover:bg-surface-accent-800": variant === "text" && color === "primary" && !disabled,
2701
2847
  "border border-transparent text-secondary hover:text-secondary hover:bg-surface-accent-200 hover:bg-opacity-75 hover:bg-surface-accent-200/75 dark:hover:bg-surface-accent-800": variant === "text" && color === "secondary" && !disabled,
2702
- "border border-transparent text-red-500 hover:text-red-500 hover:bg-red-500 hover:bg-opacity-10 hover:bg-red-500/10": variant === "text" && color === "error" && !disabled,
2848
+ "border border-transparent text-red-600 hover:text-red-600 hover:bg-red-600 hover:bg-opacity-10 hover:bg-red-600/10": variant === "text" && color === "error" && !disabled,
2703
2849
  "border border-transparent text-text-primary hover:text-text-primary dark:text-text-primary-dark hover:dark:text-text-primary-dark hover:bg-surface-accent-200 hover:bg-opacity-75 hover:bg-surface-accent-200/75 dark:hover:bg-surface-accent-800": variant === "text" && color === "text" && !disabled,
2704
2850
  "border border-transparent text-text-primary hover:text-text-primary hover:bg-surface-accent-200 hover:bg-opacity-75 hover:bg-surface-accent-200/75 dark:text-text-primary-dark dark:hover:text-text-primary-dark dark:hover:bg-surface-accent-800": variant === "text" && color === "neutral" && !disabled,
2705
2851
  "border border-primary text-primary hover:text-primary hover:bg-primary-bg hover:bg-primary/10": variant === "outlined" && color === "primary" && !disabled,
2706
2852
  "border border-secondary text-secondary hover:text-secondary hover:bg-secondary-bg": variant === "outlined" && color === "secondary" && !disabled,
2707
- "border border-red-500 text-red-500 hover:text-red-500 hover:bg-red-500 hover:text-white": variant === "outlined" && color === "error" && !disabled,
2853
+ "border border-red-500 text-red-600 hover:text-white hover:bg-red-600": variant === "outlined" && color === "error" && !disabled,
2708
2854
  "border border-surface-accent-400 text-text-primary hover:text-text-primary dark:text-text-primary-dark dark:border-surface-accent-600 hover:bg-surface-accent-200 hover:bg-opacity-75 hover:bg-surface-accent-200/75 dark:hover:bg-surface-accent-800": variant === "outlined" && color === "text" && !disabled,
2709
2855
  "border border-surface-300 text-text-primary hover:bg-surface-accent-200 hover:bg-opacity-75 hover:bg-surface-accent-200/75 dark:border-surface-600 dark:text-text-primary-dark dark:hover:bg-surface-accent-800": variant === "outlined" && color === "neutral" && !disabled,
2710
2856
  "text-text-disabled dark:text-text-disabled-dark": disabled,
@@ -2712,13 +2858,7 @@ var ButtonInner = React.memo(React.forwardRef(({ children, className, variant =
2712
2858
  "border border-surface-500 opacity-50": variant === "outlined" && disabled,
2713
2859
  "border border-transparent bg-surface-300 dark:bg-surface-500 opacity-40 bg-surface-300/40 dark:bg-surface-500/40": variant === "filled" && disabled
2714
2860
  });
2715
- const sizeClasses = cls({
2716
- "py-1 px-2": size === "small",
2717
- "py-2 px-4": size === "medium",
2718
- "py-2.5 px-5": size === "large",
2719
- "py-3 px-6": size === "xl",
2720
- "py-4 px-10": size === "2xl"
2721
- });
2861
+ const sizeClasses = cls("py-0", controlHeightMixin[size], controlPaddingMixin[size]);
2722
2862
  const iconColorClass = (color === "neutral" || color === "text") && !disabled ? "[&>svg]:text-surface-accent-500 dark:[&>svg]:text-surface-accent-300" : "";
2723
2863
  if (Component) return /* @__PURE__ */ jsxs(Component, {
2724
2864
  ref,
@@ -3037,16 +3177,16 @@ var ErrorBoundary = class extends React.Component {
3037
3177
  //#endregion
3038
3178
  //#region src/components/Checkbox.tsx
3039
3179
  var sizeClasses$2 = {
3040
- large: "w-6 h-6 rounded-md flex items-center justify-center",
3041
- medium: "w-5 h-5 rounded-md flex items-center justify-center",
3042
- small: "w-4 h-4 rounded-md flex items-center justify-center",
3043
- smallest: "w-4 h-4 rounded-md flex items-center justify-center"
3180
+ large: "w-6 h-6 rounded flex items-center justify-center",
3181
+ medium: "w-5 h-5 rounded flex items-center justify-center",
3182
+ small: "w-4 h-4 rounded-sm flex items-center justify-center",
3183
+ smallest: "w-4 h-4 rounded-sm flex items-center justify-center"
3044
3184
  };
3045
3185
  var outerSizeClasses = {
3046
3186
  medium: "w-10 h-10",
3047
3187
  small: "w-8 h-8",
3048
3188
  large: "w-12 h-12 ",
3049
- smallest: "w-8 h-8"
3189
+ smallest: "w-7 h-7"
3050
3190
  };
3051
3191
  var paddingClasses = {
3052
3192
  medium: "p-2",
@@ -3072,7 +3212,7 @@ var Checkbox = React.memo(({ id, checked, indeterminate = false, padding = true,
3072
3212
  children: /* @__PURE__ */ jsx("div", {
3073
3213
  className: cls(padding ? paddingClasses[size] : "", outerSizeClasses[size], "inline-flex items-center justify-center text-sm font-medium focus:outline-none transition-colors ease-in-out duration-150", onCheckedChange ? "rounded-full hover:bg-surface-accent-200 hover:bg-opacity-75 hover:bg-surface-accent-200/75 dark:hover:bg-surface-accent-700 dark:hover:bg-opacity-75 dark:hover:bg-surface-accent-700/75" : "", onCheckedChange ? "cursor-pointer" : "cursor-default"),
3074
3214
  children: /* @__PURE__ */ jsx("div", {
3075
- className: cls("border-2 relative transition-colors ease-in-out duration-150", sizeClasses$2[size], disabled ? indeterminate || isChecked ? "bg-surface-accent-400 dark:bg-surface-accent-600" : "bg-surface-accent-400 dark:bg-surface-accent-600" : indeterminate || isChecked ? colorClasses$2[color] : "bg-white dark:bg-surface-900", indeterminate || isChecked ? "text-surface-accent-100 dark:text-surface-accent-900" : "", disabled ? "border-transparent" : indeterminate || isChecked ? "border-transparent" : "border-surface-accent-800 dark:border-surface-accent-500"),
3215
+ className: cls("border-2 shrink-0 relative transition-colors ease-in-out duration-150", sizeClasses$2[size], disabled ? indeterminate || isChecked ? "bg-surface-accent-400 dark:bg-surface-accent-600" : "bg-surface-accent-400 dark:bg-surface-accent-600" : indeterminate || isChecked ? colorClasses$2[color] : "bg-white dark:bg-surface-900", indeterminate || isChecked ? "text-surface-accent-100 dark:text-surface-accent-900" : "", disabled ? "border-transparent" : indeterminate || isChecked ? "border-transparent" : "border-surface-accent-800 dark:border-surface-accent-500"),
3076
3216
  children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, {
3077
3217
  asChild: true,
3078
3218
  children: indeterminate ? /* @__PURE__ */ jsx(MinusIcon$1, {
@@ -3093,8 +3233,8 @@ Checkbox.displayName = "Checkbox";
3093
3233
  var sizeClassNames = {
3094
3234
  smallest: "px-1.5 py-px text-[10px]",
3095
3235
  small: "px-2 py-0.5 text-xs",
3096
- medium: "px-2.5 py-0.5 text-xs",
3097
- large: "px-3 py-1 text-xs"
3236
+ medium: "px-2.5 py-1 text-xs",
3237
+ large: "px-3 py-1.5 text-sm"
3098
3238
  };
3099
3239
  /**
3100
3240
  * Detect if the app is currently in dark mode by checking the
@@ -3272,8 +3412,15 @@ var BASE_COLORS = [
3272
3412
  "cyan",
3273
3413
  "gray"
3274
3414
  ];
3275
- function getColorDisplayName(colorKey) {
3276
- return `${colorKey.charAt(0).toUpperCase()}${colorKey.slice(1)}`;
3415
+ var TONES = [
3416
+ "Lighter",
3417
+ "Light",
3418
+ "Dark",
3419
+ "Darker"
3420
+ ];
3421
+ function getColorDisplayName(hue, tone) {
3422
+ const hueName = `${hue.charAt(0).toUpperCase()}${hue.slice(1)}`;
3423
+ return tone === "Lighter" ? hueName : `${hueName} ${tone.toLowerCase()}`;
3277
3424
  }
3278
3425
  /**
3279
3426
  * A color picker component that displays a grid of predefined CHIP_COLORS.
@@ -3298,13 +3445,13 @@ function ColorPicker({ value, onChange, size = "medium", allowClear = true, disa
3298
3445
  className: "text-surface-accent-700 dark:text-surface-accent-300",
3299
3446
  children: "Auto (based on ID)"
3300
3447
  })]
3301
- }), /* @__PURE__ */ jsx("div", {
3448
+ }), TONES.map((tone) => /* @__PURE__ */ jsx("div", {
3302
3449
  className: "flex flex-wrap gap-1.5",
3303
3450
  children: BASE_COLORS.map((base) => {
3304
- const colorKey = base;
3451
+ const colorKey = tone === "Lighter" ? base : `${base}${tone}`;
3305
3452
  const colorScheme = CHIP_COLORS[colorKey];
3306
3453
  const isSelected = value === colorKey;
3307
- const displayName = getColorDisplayName(colorKey);
3454
+ const displayName = getColorDisplayName(base, tone);
3308
3455
  return /* @__PURE__ */ jsx(Tooltip, {
3309
3456
  title: displayName,
3310
3457
  delayDuration: 300,
@@ -3323,28 +3470,40 @@ function ColorPicker({ value, onChange, size = "medium", allowClear = true, disa
3323
3470
  })
3324
3471
  }, colorKey);
3325
3472
  })
3326
- })]
3473
+ }, tone))]
3327
3474
  });
3328
3475
  }
3329
3476
  //#endregion
3330
3477
  //#region src/components/IconButton.tsx
3331
3478
  var buttonClasses = "hover:bg-surface-accent-200 hover:bg-opacity-75 hover:bg-surface-accent-200/75 dark:hover:bg-surface-accent-800 hover:scale-[1.04] active:scale-95 transition-transform";
3332
- var baseClasses = "inline-flex items-center justify-center p-2 text-sm font-medium focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 transition-colors ease-in-out duration-150";
3479
+ var baseClasses = "inline-flex items-center justify-center text-sm font-medium focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 transition-colors ease-in-out duration-150 [&>svg]:shrink-0";
3333
3480
  var colorClasses$1 = "text-surface-accent-500 visited:text-surface-accent-500 dark:text-surface-accent-300 dark:visited:text-surface-accent-300";
3334
3481
  var sizeClasses$1 = {
3335
- medium: "w-10 !h-10 min-w-10 min-h-10",
3336
- small: "w-8 !h-8 min-w-8 min-h-8",
3337
- smallest: "w-7 !h-7 min-w-7 min-h-7",
3338
- large: "w-12 !h-12 min-w-12 min-h-12"
3482
+ medium: "w-10 !h-10 min-w-10 min-h-10 p-2",
3483
+ small: "w-8 !h-8 min-w-8 min-h-8 p-2",
3484
+ smallest: "w-7 !h-7 min-w-7 min-h-7 p-2",
3485
+ large: "w-12 !h-12 min-w-12 min-h-12 p-2"
3339
3486
  };
3340
3487
  var shapeClasses = {
3341
3488
  circular: "rounded-full",
3342
3489
  square: "rounded-md"
3343
3490
  };
3491
+ /** Icon size used when the caller doesn't set one on the child. */
3492
+ var defaultIconSize = {
3493
+ smallest: 16,
3494
+ small: 18,
3495
+ medium: 20,
3496
+ large: 24
3497
+ };
3344
3498
  var IconButtonInner = ({ children, className, size = "medium", variant = "ghost", shape = "circular", disabled, toggled, component, ...props }, ref) => {
3345
3499
  const bgClasses = variant === "ghost" ? "bg-transparent" : "bg-surface-accent-200 bg-opacity-50 bg-surface-accent-200/50 dark:bg-surface-900 dark:bg-opacity-50 dark:bg-surface-900/50";
3346
3500
  const Component = component || "button";
3347
3501
  const isNativeButton = Component === "button";
3502
+ const sizedChildren = React.Children.map(children, (child) => {
3503
+ if (!React.isValidElement(child)) return child;
3504
+ if (child.props.size !== void 0) return child;
3505
+ return React.cloneElement(child, { size: defaultIconSize[size] });
3506
+ });
3348
3507
  return /* @__PURE__ */ jsx(Component, {
3349
3508
  type: isNativeButton ? "button" : void 0,
3350
3509
  role: isNativeButton ? void 0 : "button",
@@ -3353,7 +3512,7 @@ var IconButtonInner = ({ children, className, size = "medium", variant = "ghost"
3353
3512
  tabIndex: disabled ? -1 : void 0,
3354
3513
  ...props,
3355
3514
  className: cls(disabled ? "opacity-50 pointer-events-none" : "cursor-pointer", toggled ? "outline outline-2 outline-primary" : "", "text-inherit dark:text-inherit", colorClasses$1, bgClasses, baseClasses, buttonClasses, shapeClasses[shape], sizeClasses$1[size], className),
3356
- children
3515
+ children: sizedChildren
3357
3516
  });
3358
3517
  };
3359
3518
  var IconButton = React.forwardRef(IconButtonInner);
@@ -3384,6 +3543,7 @@ var DateTimeField = ({ value, label, onChange, disabled, clearable, mode = "date
3384
3543
  const [internalValue, setInternalValue] = useState("");
3385
3544
  const [isTyping, setIsTyping] = useState(false);
3386
3545
  const invalidValue = value !== void 0 && value !== null && (!(value instanceof Date) || isNaN(value.getTime()));
3546
+ const adornmentSize = size === "large" ? "medium" : size === "medium" ? "small" : "smallest";
3387
3547
  useInjectStyles("DateTimeField", inputStyles);
3388
3548
  const handleClear = (e) => {
3389
3549
  e.preventDefault();
@@ -3455,7 +3615,8 @@ var DateTimeField = ({ value, label, onChange, disabled, clearable, mode = "date
3455
3615
  let resultDate;
3456
3616
  if (!timezone) resultDate = new Date(year, month - 1, day, hours, minutes);
3457
3617
  else {
3458
- const offsetMinutes = getTimezoneOffsetMinutes(new Date(Date.UTC(year, month - 1, day, hours, minutes)), timezone);
3618
+ const refUtcDate = new Date(Date.UTC(year, month - 1, day, hours, minutes));
3619
+ const offsetMinutes = getTimezoneOffsetMinutes(refUtcDate, timezone);
3459
3620
  resultDate = /* @__PURE__ */ new Date(Date.UTC(year, month - 1, day, hours, minutes) - offsetMinutes * 6e4);
3460
3621
  }
3461
3622
  if (isNaN(resultDate.getTime())) throw new Error("Invalid date");
@@ -3479,8 +3640,8 @@ var DateTimeField = ({ value, label, onChange, disabled, clearable, mode = "date
3479
3640
  className: cls("rounded-lg relative max-w-full", !invisible && "bg-surface-accent-200/50 dark:bg-white/[0.055]", disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin, {
3480
3641
  "min-h-[28px]": size === "smallest",
3481
3642
  "min-h-[32px]": size === "small",
3482
- "min-h-[44px]": size === "medium",
3483
- "min-h-[64px]": size === "large"
3643
+ "min-h-[40px]": size === "medium",
3644
+ "min-h-[48px]": size === "large"
3484
3645
  }, className),
3485
3646
  style,
3486
3647
  onClick: () => {
@@ -3488,7 +3649,7 @@ var DateTimeField = ({ value, label, onChange, disabled, clearable, mode = "date
3488
3649
  },
3489
3650
  children: [
3490
3651
  label && /* @__PURE__ */ jsx(InputLabel, {
3491
- className: cls("absolute top-1 pointer-events-none", !error ? focused ? "text-primary" : "text-text-secondary dark:text-text-secondary-dark" : "text-red-500 dark:text-red-500", disabled ? "opacity-50" : ""),
3652
+ className: cls("absolute top-1 pointer-events-none", !error ? focused ? "text-primary" : "text-text-secondary dark:text-text-secondary-dark" : "text-red-600 dark:text-red-500", disabled ? "opacity-50" : ""),
3492
3653
  shrink: true,
3493
3654
  children: label
3494
3655
  }),
@@ -3503,11 +3664,17 @@ var DateTimeField = ({ value, label, onChange, disabled, clearable, mode = "date
3503
3664
  className: cls("w-full outline-hidden bg-transparent leading-normal text-base px-3", clearable ? "pr-14" : "pr-12", "rounded-lg", {
3504
3665
  "min-h-[28px]": size === "smallest",
3505
3666
  "min-h-[32px]": size === "small",
3506
- "min-h-[44px]": size === "medium",
3507
- "min-h-[64px]": size === "large"
3508
- }, label ? "pt-8 pb-2" : "py-2", inputClassName, disabled && "border border-transparent outline-hidden opacity-50 dark:opacity-50 text-surface-accent-600 dark:text-surface-accent-500")
3667
+ "min-h-[40px]": size === "medium",
3668
+ "min-h-[48px]": size === "large"
3669
+ }, label ? "pt-8 pb-2" : {
3670
+ smallest: "py-0.5",
3671
+ small: "py-1",
3672
+ medium: "py-2",
3673
+ large: "py-3"
3674
+ }[size], inputClassName, disabled && "border border-transparent outline-hidden opacity-50 dark:opacity-50 text-surface-accent-600 dark:text-surface-accent-500")
3509
3675
  }),
3510
3676
  /* @__PURE__ */ jsx(IconButton, {
3677
+ size: adornmentSize,
3511
3678
  onClick: (e) => {
3512
3679
  e.stopPropagation();
3513
3680
  inputRef.current?.showPicker();
@@ -3516,6 +3683,7 @@ var DateTimeField = ({ value, label, onChange, disabled, clearable, mode = "date
3516
3683
  children: /* @__PURE__ */ jsx(CalendarIcon$1, {})
3517
3684
  }),
3518
3685
  clearable && value && /* @__PURE__ */ jsx(IconButton, {
3686
+ size: adornmentSize,
3519
3687
  onClick: handleClear,
3520
3688
  className: "absolute right-14 top-1/2 transform -translate-y-1/2 text-surface-accent-400 ",
3521
3689
  children: /* @__PURE__ */ jsx(XIcon$1, {})
@@ -3618,7 +3786,7 @@ var Dialog = ({ open, onOpenChange, children, className, containerClassName, ful
3618
3786
  //#region src/components/DialogActions.tsx
3619
3787
  function DialogActions({ children, position = "sticky", translucent = true, className }) {
3620
3788
  return /* @__PURE__ */ jsx("div", {
3621
- className: cls(defaultBorderMixin, "pt-2 pb-4 px-4 border-t flex flex-row items-center justify-end bottom-0 right-0 left-0 text-right z-2 gap-2", position, "bg-white bg-opacity-60 bg-white/60 dark:bg-surface-800 dark:bg-opacity-60 dark:bg-surface-800/60", translucent ? "backdrop-blur-sm" : "", className),
3789
+ className: cls(defaultBorderMixin, "pt-2 pb-4 px-4 border-t flex flex-row items-center justify-end shrink-0 bottom-0 right-0 left-0 text-right z-2 gap-2", position, "bg-white bg-opacity-60 bg-white/60 dark:bg-surface-800 dark:bg-opacity-60 dark:bg-surface-800/60", translucent ? "backdrop-blur-sm" : "", className),
3622
3790
  children
3623
3791
  });
3624
3792
  }
@@ -3902,15 +4070,21 @@ var MenuItem = React.memo(({ children, dense = false, disabled = false, onClick,
3902
4070
  MenuItem.displayName = "MenuItem";
3903
4071
  //#endregion
3904
4072
  //#region src/components/Menubar.tsx
3905
- function Menubar({ children, onSelect, className }) {
4073
+ function Menubar({ children, onSelect, value, defaultValue, onValueChange, className }) {
3906
4074
  return /* @__PURE__ */ jsx(MenubarPrimitive.Root, {
3907
4075
  onSelect,
4076
+ value,
4077
+ defaultValue,
4078
+ onValueChange,
3908
4079
  className: cls("z-10 flex bg-white dark:bg-surface-900 p-[3px] rounded-lg shadow-sm", className),
3909
4080
  children
3910
4081
  });
3911
4082
  }
3912
- function MenubarMenu({ children }) {
3913
- return /* @__PURE__ */ jsx(MenubarPrimitive.Menu, { children });
4083
+ function MenubarMenu({ children, value }) {
4084
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Menu, {
4085
+ value,
4086
+ children
4087
+ });
3914
4088
  }
3915
4089
  function MenubarTrigger({ children, onSelect, className }) {
3916
4090
  return /* @__PURE__ */ jsx(MenubarPrimitive.Trigger, {
@@ -4041,6 +4215,14 @@ function Separator({ orientation, decorative, className }) {
4041
4215
  });
4042
4216
  }
4043
4217
  //#endregion
4218
+ //#region src/components/common/SelectInputLabel.tsx
4219
+ function SelectInputLabel({ children, error }) {
4220
+ return /* @__PURE__ */ jsx("div", {
4221
+ className: cls("text-sm font-medium ml-3.5 mb-1", error ? "text-red-600 dark:text-red-500" : "text-surface-accent-500 dark:text-surface-accent-300"),
4222
+ children
4223
+ });
4224
+ }
4225
+ //#endregion
4044
4226
  //#region src/components/MultiSelect.tsx
4045
4227
  var MultiSelectContext = React$1.createContext(null);
4046
4228
  var MultiSelect = React$1.forwardRef(({ value, size = "large", label, error, onValueChange, invisible, disabled, placeholder, modalPopover = true, includeClear = true, includeSelectAll = true, useChips = true, className, inputClassName, inputRef, children, renderValues, open, onOpenChange, portalContainer }, ref) => {
@@ -4092,7 +4274,8 @@ var MultiSelect = React$1.forwardRef(({ value, size = "large", label, error, onV
4092
4274
  }
4093
4275
  };
4094
4276
  const toggleOption = (value) => {
4095
- updateValues(selectedValues.some((v) => String(v) === String(value)) ? selectedValues.filter((v) => String(v) !== String(value)) : [...selectedValues, value]);
4277
+ const newSelectedValues = selectedValues.some((v) => String(v) === String(value)) ? selectedValues.filter((v) => String(v) !== String(value)) : [...selectedValues, value];
4278
+ updateValues(newSelectedValues);
4096
4279
  };
4097
4280
  const handleClear = () => {
4098
4281
  updateValues([]);
@@ -4132,11 +4315,12 @@ var MultiSelect = React$1.forwardRef(({ value, size = "large", label, error, onV
4132
4315
  className: cls({
4133
4316
  "min-h-[28px]": size === "smallest",
4134
4317
  "min-h-[32px]": size === "small",
4135
- "min-h-[44px]": size === "medium",
4136
- "min-h-[64px]": size === "large"
4318
+ "min-h-[40px]": size === "medium",
4319
+ "min-h-[48px]": size === "large"
4137
4320
  }, {
4138
- "py-1": size === "small" || size === "smallest",
4139
- "py-2": size === "medium" || size === "large"
4321
+ "py-0": size === "smallest",
4322
+ "py-0.5": size === "small",
4323
+ "py-1": size === "medium" || size === "large"
4140
4324
  }, {
4141
4325
  "px-2": size === "small" || size === "smallest",
4142
4326
  "px-4": size === "medium" || size === "large"
@@ -4149,7 +4333,7 @@ var MultiSelect = React$1.forwardRef(({ value, size = "large", label, error, onV
4149
4333
  const optionChildren = optionsMap.get(String(value));
4150
4334
  if (!useChips) return optionChildren;
4151
4335
  return /* @__PURE__ */ jsxs(Chip, {
4152
- size: "medium",
4336
+ size: size === "smallest" || size === "small" ? "smallest" : "small",
4153
4337
  className: cls("flex flex-row items-center p-1"),
4154
4338
  children: [optionChildren, /* @__PURE__ */ jsx(XIcon$1, {
4155
4339
  size: iconSize.smallest,
@@ -4409,9 +4593,14 @@ function SearchBar({ onClick, onTextSearch, placeholder = "Search", expandable =
4409
4593
  setSearchText("");
4410
4594
  onTextSearch(void 0);
4411
4595
  }, [onTextSearch]);
4412
- const heightClass = size === "smallest" ? "h-8" : size === "small" ? "h-[36px]" : "h-[44px]";
4413
- const iconPaddingClass = size === "smallest" ? "px-2" : size === "small" ? "px-2" : "px-4";
4414
- const inputPaddingClass = size === "smallest" ? "pl-8" : size === "small" ? "pl-8" : "pl-12";
4596
+ const heightClass = {
4597
+ smallest: "h-[28px]",
4598
+ small: "h-[32px]",
4599
+ medium: "h-[40px]",
4600
+ large: "h-[48px]"
4601
+ }[size];
4602
+ const iconPaddingClass = size === "smallest" || size === "small" ? "px-2" : size === "medium" ? "px-3" : "px-4";
4603
+ const inputPaddingClass = size === "smallest" || size === "small" ? "pl-8" : size === "medium" ? "pl-10" : "pl-12";
4415
4604
  return /* @__PURE__ */ jsxs("div", {
4416
4605
  role: "search",
4417
4606
  "aria-label": "Search",
@@ -4513,8 +4702,8 @@ var Select = forwardRef(({ inputRef, open, name, fullWidth = false, id, onOpenCh
4513
4702
  className: cls("select-none rounded-lg text-sm", invisible ? fieldBackgroundInvisibleMixin : fieldBackgroundMixin, disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin, "relative flex items-center", className, {
4514
4703
  "min-h-[28px]": size === "smallest",
4515
4704
  "min-h-[32px]": size === "small",
4516
- "min-h-[44px]": size === "medium",
4517
- "min-h-[64px]": size === "large",
4705
+ "min-h-[40px]": size === "medium",
4706
+ "min-h-[48px]": size === "large",
4518
4707
  "w-fit": !fullWidth,
4519
4708
  "w-full": fullWidth
4520
4709
  }),
@@ -4532,8 +4721,8 @@ var Select = forwardRef(({ inputRef, open, name, fullWidth = false, id, onOpenCh
4532
4721
  } : "", "outline-hidden focus:outline-hidden", "outline-none focus:outline-none", "select-none rounded-lg text-sm", error ? "text-red-500 dark:text-red-600" : "focus:text-text-primary dark:focus:text-text-primary-dark", error ? "border border-red-500 dark:border-red-600" : "", disabled ? "text-surface-accent-600 dark:text-surface-accent-400" : "text-surface-accent-800 dark:text-white", "relative flex flex-row items-center", {
4533
4722
  "min-h-[28px]": size === "smallest",
4534
4723
  "min-h-[32px]": size === "small",
4535
- "min-h-[44px]": size === "medium",
4536
- "min-h-[64px]": size === "large",
4724
+ "min-h-[40px]": size === "medium",
4725
+ "min-h-[48px]": size === "large",
4537
4726
  "w-full": fullWidth,
4538
4727
  "w-fit": !fullWidth
4539
4728
  }, inputClassName),
@@ -4542,8 +4731,8 @@ var Select = forwardRef(({ inputRef, open, name, fullWidth = false, id, onOpenCh
4542
4731
  className: cls("flex-grow max-w-full flex flex-row gap-2 items-center", "overflow-visible", {
4543
4732
  "min-h-[28px]": size === "smallest",
4544
4733
  "min-h-[32px]": size === "small",
4545
- "min-h-[44px]": size === "medium",
4546
- "min-h-[64px]": size === "large"
4734
+ "min-h-[40px]": size === "medium",
4735
+ "min-h-[48px]": size === "large"
4547
4736
  }),
4548
4737
  children: /* @__PURE__ */ jsx(SelectPrimitive.Value, {
4549
4738
  onClick: (e) => {
@@ -4928,9 +5117,14 @@ var TextField = forwardRef(({ value, onChange, label, type = "text", multiline =
4928
5117
  className: cls("w-full outline-none bg-transparent leading-normal px-3", "rounded-lg", "focused:text-text-primary focused:dark:text-text-primary-dark", invisible ? focusedInvisibleMixin : "", disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin, {
4929
5118
  "min-h-[28px]": size === "smallest",
4930
5119
  "min-h-[32px]": size === "small",
4931
- "min-h-[44px]": size === "medium",
4932
- "min-h-[64px]": size === "large"
4933
- }, label ? size === "large" ? "pt-8 pb-2" : "pt-4 pb-2" : size === "smallest" ? "py-0.5" : size === "small" ? "py-1" : "py-2", endAdornment ? "pr-12" : "pr-3", disabled && "outline-none opacity-65 dark:opacity-60 text-surface-accent-800 dark:text-white", inputClassName),
5120
+ "min-h-[40px]": size === "medium",
5121
+ "min-h-[48px]": size === "large"
5122
+ }, label ? {
5123
+ smallest: "pt-4 pb-1",
5124
+ small: "pt-5 pb-1",
5125
+ medium: "pt-6 pb-2",
5126
+ large: "pt-8 pb-2"
5127
+ }[size] : size === "smallest" ? "py-0.5" : size === "small" ? "py-1" : "py-2", endAdornment ? "pr-12" : "pr-3", disabled && "outline-none opacity-65 dark:opacity-60 text-surface-accent-800 dark:text-white", inputClassName),
4934
5128
  placeholder: focused || hasValue || !label ? placeholder : void 0,
4935
5129
  autoFocus,
4936
5130
  onFocus: () => setFocused(true),
@@ -4944,8 +5138,8 @@ var TextField = forwardRef(({ value, onChange, label, type = "text", multiline =
4944
5138
  className: cls("rounded-lg relative max-w-full", invisible ? fieldBackgroundInvisibleMixin : fieldBackgroundMixin, disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin, error ? "border border-red-500 dark:border-red-600" : "", {
4945
5139
  "min-h-[28px]": size === "smallest",
4946
5140
  "min-h-[32px]": size === "small",
4947
- "min-h-[44px]": size === "medium",
4948
- "min-h-[64px]": size === "large"
5141
+ "min-h-[40px]": size === "medium",
5142
+ "min-h-[48px]": size === "large"
4949
5143
  }, className),
4950
5144
  style,
4951
5145
  children: [
@@ -5676,6 +5870,7 @@ var VirtualTableHeaderRow = ({ columns, currentSort, onColumnSort, onFilterUpdat
5676
5870
  const columnFilter = column && filter && filter[column.key] ? filter[column.key] : void 0;
5677
5871
  const filterForThisProperty = columnFilter ? Array.isArray(columnFilter[0]) ? columnFilter[0] : columnFilter : void 0;
5678
5872
  const isDraggable = !column.frozen && !!onColumnsOrderChange;
5873
+ const isDragging = draggingColumnId === column.key;
5679
5874
  return /* @__PURE__ */ jsx(ErrorBoundary, { children: /* @__PURE__ */ jsx(SortableColumnHeader, {
5680
5875
  column,
5681
5876
  columnIndex,
@@ -5688,7 +5883,7 @@ var VirtualTableHeaderRow = ({ columns, currentSort, onColumnSort, onFilterUpdat
5688
5883
  onColumnSort,
5689
5884
  onClickResizeColumn,
5690
5885
  createFilterField,
5691
- isDragging: draggingColumnId === column.key,
5886
+ isDragging,
5692
5887
  isDraggable
5693
5888
  }) }, "header_" + column.key);
5694
5889
  }), AddColumnComponent && /* @__PURE__ */ jsx(AddColumnComponent, {})]
@@ -5792,12 +5987,18 @@ var innerElementType = forwardRef(({ children, ...rest }, ref) => {
5792
5987
  } });
5793
5988
  });
5794
5989
  /**
5795
- * This is a Table component that allows displaying arbitrary data, not
5796
- * necessarily related to entities or properties. It is the component
5797
- * that powers the entity collections but has a generic API, so it
5798
- * can be reused.
5990
+ * `React.memo` is not generic-preserving: it takes the props type as its own
5991
+ * type argument, so annotating the call with
5992
+ * `VirtualTableProps<Record<string, unknown>>` pinned `T` at the boundary and
5993
+ * discarded the `<T>` the inner function declares. The exported component was
5994
+ * therefore not generic at all — every consumer got `Record<string, unknown>`,
5995
+ * `columns` and `cellRenderer` were unrelated to `data`, and a caller writing
5996
+ * `<VirtualTable<Post> …>` was told the component expects no type arguments.
5799
5997
  *
5800
- * @group Components
5998
+ * Re-asserting the call signature is the standard way to carry a type parameter
5999
+ * across `memo`; it is the only cast here, and it restores the generic the
6000
+ * implementation always had. Runtime behaviour is unchanged — this is the same
6001
+ * memoized component under a type that describes it.
5801
6002
  */
5802
6003
  var VirtualTable = React.memo(function VirtualTable({ data, onResetPagination, onEndReached, endOffset = 600, rowHeight = 54, headerHeight = 48, columns: columnsProp, onRowClick, onColumnResize, onColumnResizeEnd, filter: filterInput, checkFilterCombination, onFilterUpdate, sortBy, error, emptyComponent, onSortByUpdate, onScroll: onScrollProp, loading, cellRenderer, hoverRow, createFilterField, rowClassName, style, className, endAdornment, AddColumnComponent, initialScroll = 0, onColumnsOrderChange, extraData }) {
5803
6004
  const sortByProperty = sortBy ? sortBy[0] : void 0;
@@ -6303,11 +6504,12 @@ function VirtualTableSwitch(props) {
6303
6504
  //#endregion
6304
6505
  //#region src/components/VirtualTable/fields/VirtualTableDateField.tsx
6305
6506
  function VirtualTableDateField(props) {
6306
- const { disabled, error, mode, timezone, internalValue, updateValue, locale } = props;
6507
+ const { disabled, error, mode, timezone, internalValue, updateValue, small = false, locale } = props;
6307
6508
  return /* @__PURE__ */ jsx(DateTimeField, {
6308
6509
  value: internalValue ?? void 0,
6309
6510
  onChange: (dateValue) => updateValue(dateValue ?? null),
6310
6511
  invisible: true,
6512
+ size: small ? "small" : "medium",
6311
6513
  inputClassName: cls("w-full h-full", focusedDisabled),
6312
6514
  className: cls("w-full h-full", focusedDisabled),
6313
6515
  mode,
@@ -6332,7 +6534,10 @@ function VirtualTableSelect(props) {
6332
6534
  });
6333
6535
  if (isNumber) updateValue(newValue);
6334
6536
  else updateValue(newValue);
6335
- } else updateValue(typeof options.find((o) => String(o.value) === updatedValue)?.value === "number" ? parseFloat(updatedValue) : updatedValue || null);
6537
+ } else {
6538
+ const opt = options.find((o) => String(o.value) === updatedValue);
6539
+ updateValue(typeof opt?.value === "number" ? parseFloat(updatedValue) : updatedValue || null);
6540
+ }
6336
6541
  }, [
6337
6542
  multiple,
6338
6543
  updateValue,
@@ -6766,7 +6971,7 @@ function CardView({ data, dataLoading = false, noMoreToLoad = false, dataLoading
6766
6971
  }
6767
6972
  //#endregion
6768
6973
  //#region src/views/Kanban/BoardSortableList.tsx
6769
- function BoardSortableList({ columnId, items, ItemComponent, isDragging, isDragOverColumn, loading = false, hasMore = false, onLoadMore }) {
6974
+ function BoardSortableList({ columnId, items, ItemComponent, isDragging, isDragOverColumn, loading = false, hasMore = false, error, onLoadMore }) {
6770
6975
  const { setNodeRef } = useDroppable({
6771
6976
  id: columnId,
6772
6977
  data: { type: "ITEM-LIST" }
@@ -6799,16 +7004,16 @@ function BoardSortableList({ columnId, items, ItemComponent, isDragging, isDragO
6799
7004
  }, [hasMore, onLoadMore]);
6800
7005
  return /* @__PURE__ */ jsx("div", {
6801
7006
  ref: setNodeRef,
6802
- className: useMemo(() => cls("flex flex-col p-2 transition-opacity duration-100 transition-bg ease-linear w-full overflow-y-auto no-scrollbar flex-1 rounded-md", isDragging && isDragOverColumn ? "bg-surface-accent-200 dark:bg-surface-900" : isDragging ? "bg-surface-50 dark:bg-surface-900 hover:bg-surface-accent-100 dark:hover:bg-surface-800" : "bg-surface-50 dark:bg-surface-900"), [isDragging, isDragOverColumn]),
7007
+ className: useMemo(() => cls("flex flex-col p-2 transition-opacity duration-100 transition-bg ease-linear w-full overflow-y-auto flex-1 min-h-0 rounded-md", isDragging && isDragOverColumn ? "bg-surface-accent-200 dark:bg-surface-900" : isDragging ? "bg-surface-50 dark:bg-surface-900 hover:bg-surface-accent-100 dark:hover:bg-surface-800" : "bg-surface-50 dark:bg-surface-900"), [isDragging, isDragOverColumn]),
6803
7008
  style: { minHeight: 80 },
6804
7009
  children: /* @__PURE__ */ jsx(SortableContext, {
6805
7010
  items: items.map((i) => i.id),
6806
7011
  strategy: verticalListSortingStrategy,
6807
7012
  children: items.length === 0 && !loading ? /* @__PURE__ */ jsx("div", {
6808
- className: "flex-1 flex items-center justify-center",
7013
+ className: "flex-1 flex items-center justify-center px-3 text-center",
6809
7014
  children: /* @__PURE__ */ jsx("span", {
6810
- className: "text-xs text-surface-400 dark:text-surface-500",
6811
- children: "No items"
7015
+ className: cls("text-xs", error ? "text-red-600 dark:text-red-400" : "text-surface-400 dark:text-surface-500"),
7016
+ children: error ? "Could not load this column" : "No items"
6812
7017
  })
6813
7018
  }) : /* @__PURE__ */ jsxs(Fragment, { children: [items.map((item, index) => /* @__PURE__ */ jsx(SortableItem, {
6814
7019
  item,
@@ -6873,7 +7078,7 @@ function BoardColumnTitle({ children, className, color, ...props }) {
6873
7078
  }
6874
7079
  //#endregion
6875
7080
  //#region src/views/Kanban/BoardColumn.tsx
6876
- var BoardColumn = memo(function BoardColumn({ id, title, items, ItemComponent, isDragging, isDragOverColumn, allowReorder = false, loading = false, hasMore = false, onLoadMore, onAddItem, totalCount, color, style }) {
7081
+ var BoardColumn = memo(function BoardColumn({ id, title, items, ItemComponent, isDragging, isDragOverColumn, allowReorder = false, loading = false, hasMore = false, error, onLoadMore, onAddItem, totalCount, color, style }) {
6877
7082
  const { setNodeRef, attributes, listeners, isDragging: isColumnBeingDragged, transform, transition } = useSortable({
6878
7083
  id,
6879
7084
  data: { type: "COLUMN" },
@@ -6932,35 +7137,53 @@ var BoardColumn = memo(function BoardColumn({ id, title, items, ItemComponent, i
6932
7137
  isDragOverColumn,
6933
7138
  loading,
6934
7139
  hasMore,
7140
+ error,
6935
7141
  onLoadMore
6936
7142
  })
6937
7143
  })]
6938
7144
  });
6939
7145
  });
6940
7146
  //#endregion
7147
+ //#region src/views/Kanban/placement.ts
7148
+ /**
7149
+ * Where a dropped card ends up in its destination column.
7150
+ *
7151
+ * Pulled out of the drop handler because it is the part that was wrong twice:
7152
+ * once appending a card that had been dropped into the middle of a column, and
7153
+ * once refusing to place a card at all when it was released over an empty
7154
+ * column rather than over another card. It is pure, so it can be checked
7155
+ * without driving a pointer.
7156
+ */
7157
+ function placeDroppedCard({ targetItems, movedItem, overId, changedColumn }) {
7158
+ const indexInTarget = targetItems.findIndex((i) => i.id === movedItem.id);
7159
+ const overIndex = targetItems.findIndex((i) => i.id === overId);
7160
+ if (indexInTarget === -1) {
7161
+ const placed = [...targetItems];
7162
+ placed.splice(overIndex === -1 ? targetItems.length : overIndex, 0, movedItem);
7163
+ return placed;
7164
+ }
7165
+ if (overIndex !== -1) return arrayMove(targetItems, indexInTarget, overIndex);
7166
+ if (changedColumn) return targetItems;
7167
+ return arrayMove(targetItems, indexInTarget, targetItems.length - 1);
7168
+ }
7169
+ //#endregion
6941
7170
  //#region src/views/Kanban/Board.tsx
6942
7171
  function Board({ data, columns: columnsProp, columnLabels, columnColors, className, assignColumn, allowColumnReorder = false, onColumnReorder, onItemsReorder, ItemComponent, columnLoadingState, onLoadMoreColumn, onAddItemToColumn, AddColumnComponent }) {
6943
7172
  const [activeItem, setActiveItem] = useState(null);
6944
- const [activeColumn, setActiveColumn] = useState(null);
6945
7173
  const [isDragging, setIsDragging] = useState(false);
6946
7174
  const [dragOverColumnId, setDragOverColumnId] = useState(null);
6947
- const grabOffsetRef = useRef({
6948
- x: 0,
6949
- y: 0
6950
- });
6951
- const [overlayPos, setOverlayPos] = useState(null);
6952
- const handleMouseMove = useCallback((e) => {
6953
- setOverlayPos({
6954
- x: e.clientX - grabOffsetRef.current.x,
6955
- y: e.clientY - grabOffsetRef.current.y
6956
- });
6957
- }, []);
6958
- useEffect(() => {
6959
- return () => {
6960
- window.removeEventListener("mousemove", handleMouseMove);
6961
- window.removeEventListener("pointermove", handleMouseMove);
6962
- };
6963
- }, [handleMouseMove]);
7175
+ /**
7176
+ * Which column the card was picked up from.
7177
+ *
7178
+ * `handleDragOver` moves the card between columns in `itemMapState` while
7179
+ * the pointer is still down — that is what makes the gap open up under the
7180
+ * cursor. So by the time the drop is handled, looking the card up by id
7181
+ * finds it in its *destination*, and the board was reporting the move as
7182
+ * source === target: a cross-column drop looked like a plain reorder and
7183
+ * the column property was never written. The card snapped back on the next
7184
+ * fetch.
7185
+ */
7186
+ const dragSourceColumnRef = useRef(null);
6964
7187
  const [itemMapState, setItemMapState] = useState(() => {
6965
7188
  const dataColumnMap = data.reduce((prev, item) => ({
6966
7189
  ...prev,
@@ -7023,27 +7246,9 @@ function Board({ data, columns: columnsProp, columnLabels, columnColors, classNa
7023
7246
  setIsDragging(true);
7024
7247
  setDragOverColumnId(null);
7025
7248
  const { active } = event;
7026
- const activatorEvt = event.activatorEvent;
7027
- if (activatorEvt) {
7028
- const target = activatorEvt.target;
7029
- const rect = (target.closest("[role='button']") ?? target).getBoundingClientRect();
7030
- grabOffsetRef.current = {
7031
- x: activatorEvt.clientX - rect.left,
7032
- y: activatorEvt.clientY - rect.top
7033
- };
7034
- setOverlayPos({
7035
- x: rect.left,
7036
- y: rect.top
7037
- });
7038
- }
7039
- window.addEventListener("mousemove", handleMouseMove);
7040
- window.addEventListener("pointermove", handleMouseMove);
7041
- if (active.data.current?.type === "COLUMN") {
7042
- const columnId = active.id;
7043
- const column = columnsProp.find((col) => String(col) === columnId);
7044
- if (column) setActiveColumn(column);
7045
- } else if (active.data.current?.type === "ITEM") {
7249
+ if (active.data.current?.type === "ITEM") {
7046
7250
  const columnId = findColumnByItemId(active.id);
7251
+ dragSourceColumnRef.current = columnId ?? null;
7047
7252
  if (columnId) {
7048
7253
  const item = itemMapState[columnId]?.find((i) => i.id === active.id);
7049
7254
  setActiveItem(item || null);
@@ -7065,15 +7270,15 @@ function Board({ data, columns: columnsProp, columnLabels, columnColors, classNa
7065
7270
  setDragOverColumnId(currentHoveredColumnId);
7066
7271
  if (active.data.current?.type !== "ITEM") return;
7067
7272
  const activeId = active.id;
7068
- const activeColumn = findColumnByItemId(activeId);
7273
+ const activeItemColumn = findColumnByItemId(activeId);
7069
7274
  let overColumnForMove = findColumnByItemId(overId);
7070
7275
  if (!overColumnForMove && overDataType === "ITEM-LIST") overColumnForMove = overId;
7071
7276
  if (!overColumnForMove && columnsProp.includes(overId)) overColumnForMove = overId;
7072
- if (!activeColumn || !overColumnForMove) return;
7073
- if (activeColumn === overColumnForMove) return;
7277
+ if (!activeItemColumn || !overColumnForMove) return;
7278
+ if (activeItemColumn === overColumnForMove) return;
7074
7279
  if (itemMapState[overColumnForMove]?.some((i) => i.id === activeId)) return;
7075
7280
  setItemMapState((currentMap) => {
7076
- const activeItems = [...currentMap[activeColumn] || []];
7281
+ const activeItems = [...currentMap[activeItemColumn] || []];
7077
7282
  const overItems = [...currentMap[overColumnForMove] || []];
7078
7283
  const activeIndex = activeItems.findIndex((i) => i.id === activeId);
7079
7284
  if (activeIndex === -1) return currentMap;
@@ -7089,20 +7294,24 @@ function Board({ data, columns: columnsProp, columnLabels, columnColors, classNa
7089
7294
  const newItemMap = { ...currentMap };
7090
7295
  const [moved] = activeItems.splice(activeIndex, 1);
7091
7296
  overItems.splice(overIndex, 0, moved);
7092
- newItemMap[activeColumn] = activeItems;
7297
+ newItemMap[activeItemColumn] = activeItems;
7093
7298
  newItemMap[overColumnForMove] = overItems;
7094
7299
  return newItemMap;
7095
7300
  });
7096
7301
  };
7302
+ const handleDragCancel = () => {
7303
+ setIsDragging(false);
7304
+ setActiveItem(null);
7305
+ setDragOverColumnId(null);
7306
+ dragSourceColumnRef.current = null;
7307
+ };
7097
7308
  const handleDragEnd = (event) => {
7098
7309
  const { active, over } = event;
7099
- window.removeEventListener("mousemove", handleMouseMove);
7100
- window.removeEventListener("pointermove", handleMouseMove);
7101
- setOverlayPos(null);
7310
+ const sourceColumn = dragSourceColumnRef.current;
7102
7311
  setIsDragging(false);
7103
7312
  setActiveItem(null);
7104
- setActiveColumn(null);
7105
7313
  setDragOverColumnId(null);
7314
+ dragSourceColumnRef.current = null;
7106
7315
  if (!over) return;
7107
7316
  const activeId = active.id;
7108
7317
  const overId = over.id;
@@ -7117,51 +7326,35 @@ function Board({ data, columns: columnsProp, columnLabels, columnColors, classNa
7117
7326
  }
7118
7327
  return;
7119
7328
  }
7120
- const activeCol = findColumnByItemId(activeId);
7121
- let overCol = findColumnByItemId(overId);
7122
- if (!overCol) {
7123
- if (over.data.current?.type === "ITEM-LIST" || columnsProp.includes(overId)) overCol = overId;
7124
- }
7125
- if (!activeCol || !overCol) return;
7126
- const isSameColumn = activeCol === overCol;
7127
- const activeItems = itemMapState[activeCol] || [];
7128
- const overItems = itemMapState[overCol] || [];
7129
- const activeIndex = activeItems.findIndex((i) => i.id === activeId);
7130
- let overIndex;
7131
- if (over.id === overCol) overIndex = overItems.length;
7132
- else overIndex = overItems.findIndex((i) => i.id === overId);
7133
- if (activeIndex === -1 || overIndex === -1) return;
7134
- let finalItems = [];
7135
- if (isSameColumn) finalItems = arrayMove(activeItems, activeIndex, overIndex);
7136
- else {
7137
- const newActiveItems = [...activeItems];
7138
- const newOverItems = [...overItems];
7139
- const [moved] = newActiveItems.splice(activeIndex, 1);
7140
- newOverItems.splice(overIndex, 0, moved);
7141
- finalItems = [...newActiveItems, ...newOverItems];
7329
+ const currentCol = findColumnByItemId(activeId);
7330
+ let targetCol = findColumnByItemId(overId);
7331
+ if (!targetCol) {
7332
+ if (over.data.current?.type === "ITEM-LIST" || columnsProp.includes(overId)) targetCol = overId;
7142
7333
  }
7143
- const fullFlattenedList = [];
7144
- columnsProp.forEach((col) => {
7145
- if (col === activeCol) if (isSameColumn) fullFlattenedList.push(...finalItems);
7146
- else fullFlattenedList.push(...activeItems.filter((i) => i.id !== activeId));
7147
- else if (col === overCol) {
7148
- const newOverItems = [...overItems];
7149
- const [moved] = [...activeItems].splice(activeIndex, 1);
7150
- newOverItems.splice(overIndex, 0, moved);
7151
- fullFlattenedList.push(...newOverItems);
7152
- } else fullFlattenedList.push(...itemMapState[col] || []);
7334
+ targetCol = targetCol ?? currentCol;
7335
+ if (!currentCol || !targetCol) return;
7336
+ const targetItems = itemMapState[targetCol] || [];
7337
+ const movedItem = (itemMapState[currentCol] || []).find((i) => i.id === activeId);
7338
+ if (!movedItem) return;
7339
+ const finalTargetItems = placeDroppedCard({
7340
+ targetItems,
7341
+ movedItem,
7342
+ overId,
7343
+ changedColumn: (sourceColumn ?? currentCol) !== targetCol
7153
7344
  });
7154
- onItemsReorder?.(fullFlattenedList, {
7345
+ onItemsReorder?.(finalTargetItems, {
7155
7346
  itemId: activeId,
7156
- sourceColumn: activeCol,
7157
- targetColumn: overCol
7347
+ sourceColumn: sourceColumn ?? currentCol,
7348
+ targetColumn: targetCol
7158
7349
  });
7159
7350
  };
7160
7351
  return /* @__PURE__ */ jsxs(DndContext, {
7161
7352
  sensors,
7353
+ collisionDetection: closestCorners,
7162
7354
  onDragStart: handleDragStart,
7163
7355
  onDragOver: handleDragOver,
7164
7356
  onDragEnd: handleDragEnd,
7357
+ onDragCancel: handleDragCancel,
7165
7358
  children: [/* @__PURE__ */ jsxs("div", {
7166
7359
  className: cls("flex flex-row h-full w-full overflow-x-auto p-4 select-none items-start", className),
7167
7360
  children: [/* @__PURE__ */ jsx(SortableContext, {
@@ -7180,6 +7373,7 @@ function Board({ data, columns: columnsProp, columnLabels, columnColors, classNa
7180
7373
  allowReorder: allowColumnReorder,
7181
7374
  loading: loadingState?.loading,
7182
7375
  hasMore: loadingState?.hasMore,
7376
+ error: loadingState?.error,
7183
7377
  totalCount: loadingState?.totalCount,
7184
7378
  color: columnColors?.[col],
7185
7379
  onLoadMore: onLoadMoreColumn ? () => onLoadMoreColumn(col) : void 0,
@@ -7189,19 +7383,11 @@ function Board({ data, columns: columnsProp, columnLabels, columnColors, classNa
7189
7383
  }), AddColumnComponent]
7190
7384
  }), typeof document !== "undefined" && createPortal(/* @__PURE__ */ jsx(DragOverlay, {
7191
7385
  dropAnimation: null,
7192
- children: isDragging && activeItem && /* @__PURE__ */ jsx("div", {
7193
- style: {
7194
- position: "fixed",
7195
- left: overlayPos?.x ?? 0,
7196
- top: overlayPos?.y ?? 0,
7197
- pointerEvents: "none",
7198
- zIndex: 9999
7199
- },
7200
- children: /* @__PURE__ */ jsx(ItemComponent, {
7201
- item: activeItem,
7202
- isDragging: true,
7203
- isClone: true
7204
- })
7386
+ zIndex: 9999,
7387
+ children: activeItem && /* @__PURE__ */ jsx(ItemComponent, {
7388
+ item: activeItem,
7389
+ isDragging: true,
7390
+ isClone: true
7205
7391
  })
7206
7392
  }), document.body)]
7207
7393
  });
@@ -7670,7 +7856,7 @@ var SIZE_TO_ROW_HEIGHT = {
7670
7856
  l: 64,
7671
7857
  xl: 80
7672
7858
  };
7673
- var SORTABLE_TYPES = new Set([
7859
+ var SORTABLE_TYPES = /* @__PURE__ */ new Set([
7674
7860
  "string",
7675
7861
  "number",
7676
7862
  "date"
@@ -7809,7 +7995,7 @@ function resolveTitlePropertyKey(order, properties, idProperty, titleProperty) {
7809
7995
  PLAIN_TEXT: 60,
7810
7996
  NAMED: 100
7811
7997
  };
7812
- const titleLikeKeys = new Set([
7998
+ const titleLikeKeys = /* @__PURE__ */ new Set([
7813
7999
  "name",
7814
8000
  "fullname",
7815
8001
  "displayname",
@@ -8461,6 +8647,6 @@ function CollectionView({ dataController, properties, propertiesOrder, displayed
8461
8647
  });
8462
8648
  }
8463
8649
  //#endregion
8464
- export { Alert, AlertCircleIcon, AlertTriangleIcon, AlignLeftIcon, AppWindow, ArrowDownIcon, ArrowDownToLineIcon, ArrowLeftIcon, ArrowRightFromLineIcon, ArrowRightIcon, ArrowRightLeftIcon, ArrowRightToLineIcon, ArrowUpDownIcon, ArrowUpIcon, ArrowUpToLineIcon, Autocomplete, AutocompleteItem, Avatar, Badge, BoldIcon, BookOpenIcon, BooleanSwitch, BooleanSwitchWithLabel, Button, CHIP_COLORS, CalendarIcon, Card, CardView, CenteredView, CheckCircle2Icon, CheckCircleIcon, CheckIcon, CheckSquareIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsLeftIcon, ChevronsRightIcon, ChevronsUpDownIcon, Chip, CircleDotIcon, CircleIcon, CircleUserIcon, CircularProgress, CircularProgressCenter, CodeIcon, Collapse, CollectionCardView, CollectionKanbanView, CollectionListView, CollectionTableView, CollectionView, CollectionViewToolbar, ColorPicker, ColumnsIcon, Container, CopyIcon, DatabaseIcon, DateTimeField, DebouncedTextField, DefaultCellRenderer, Dialog, DialogActions, DialogContent, DialogTitle, DollarSignIcon, DownloadIcon, ErrorBoundary, ExpandablePanel, ExternalLinkIcon, EyeIcon, EyeOffIcon, FileIcon, FileSearchIcon, FileTextIcon, FileUpload, FilterChip, FilterIcon, FilterXIcon, FlagIcon, FolderIcon, FolderKanbanIcon, FolderPlusIcon, FolderUpIcon, FunctionSquareIcon, GitBranchIcon, GitHubIcon, GlobeIcon, HandleIcon, HashIcon, Heading1Icon, Heading2Icon, Heading3Icon, HelpCircleIcon, HistoryIcon, HomeIcon, IconButton, ImageIcon, ImageOffIcon, InfoIcon, InfoLabel, InputLabel, ItalicIcon, KanbanIcon, KanbanView, KeyIcon, KeyRoundIcon, Label, LanguagesIcon, LayoutGridIcon, Link2Icon, LinkIcon, ListIcon, ListOrderedIcon, ListPlusIcon, ListTodoIcon, ListView, LoaderIcon, LoadingButton, LockIcon, LogOutIcon, MailIcon, Markdown, Maximize2Icon, Menu, MenuIcon, MenuItem, Menubar, MenubarCheckboxItem, MenubarContent, MenubarItem, MenubarItemIndicator, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarSubTriggerIndicator, MenubarTrigger, MessageCircleIcon, MinusCircleIcon, MinusIcon, MoonIcon, MoreVerticalIcon, MultiSelect, MultiSelectContext, MultiSelectItem, Music2Icon, PanelLeftIcon, Paper, PauseIcon, PenLineIcon, PencilIcon, PhoneIcon, PinIcon, PlayIcon, PlusIcon, Popover, PopoverPrimitive, Portal, PortalContainerProvider, QuoteIcon, RadioGroup, RadioGroupItem, RefreshCcwIcon, RefreshCwIcon, RepeatIcon, ResizablePanels, Rows3Icon, SaveIcon, SearchBar, SearchIcon, Select, SelectGroup, SelectInputLabel, SelectItem, SendIcon, Separator, SettingsIcon, Sheet, ShieldIcon, ShoppingCartIcon, Skeleton, Slider, SlidersHorizontalIcon, Slot, SquareIcon, StarIcon, StickyNoteIcon, StrikethroughIcon, SunIcon, SunMoonIcon, Tab, Table, TableBody, TableCell, TableHeader, TableIcon, TableRow, VirtualTable as TableView, VirtualTable, Tabs, TagIcon, TerminalIcon, TextField, TextIcon, TextareaAutosize, ToggleButtonGroup, Tooltip, Trash2Icon, TrendingUpIcon, TypeIcon, Typography, UnderlineIcon, UndoIcon, Unlink2Icon, UploadCloudIcon, UploadIcon, UserCheckIcon, UserIcon, UserPlus, UsersIcon, VideoIcon, VirtualTableDateField, VirtualTableInput, VirtualTableNumberInput, VirtualTableSelect, VirtualTableSelectionProvider, VirtualTableSwitch, VoteIcon, Wand2Icon, WrenchIcon, XCircleIcon, XIcon, cardClickableMixin, cardMixin, cardSelectedMixin, cls, colorClassesMapping, coolIconKeys, createVirtualTableSelectionStore, debounce, defaultBorderMixin, fieldBackgroundDisabledMixin, fieldBackgroundHoverMixin, fieldBackgroundInvisibleMixin, fieldBackgroundMixin, focusedClasses, focusedDisabled, focusedInvisibleMixin, getColorSchemeForKey, getColorSchemeForSeed, iconKeys, iconSize, lucideIcons, paperMixin, useAutoComplete, useDebounceCallback, useDebounceValue, useDebouncedCallback, useInjectStyles, useOutsideAlerter, usePortalContainer, useVirtualTableCellSelected, useVirtualTableSelection };
8650
+ export { Alert, AlertCircleIcon, AlertTriangleIcon, AlignLeftIcon, AppWindow, ArrowDownIcon, ArrowDownToLineIcon, ArrowLeftIcon, ArrowRightFromLineIcon, ArrowRightIcon, ArrowRightLeftIcon, ArrowRightToLineIcon, ArrowUpDownIcon, ArrowUpIcon, ArrowUpToLineIcon, Autocomplete, AutocompleteItem, Avatar, Badge, BoldIcon, BookOpenIcon, BooleanSwitch, BooleanSwitchWithLabel, Button, CHIP_COLORS, CHIP_HUES, CHIP_SEED_KEYS, CONTROL_HEIGHT, CalendarIcon, Card, CardView, CenteredView, CheckCircle2Icon, CheckCircleIcon, CheckIcon, CheckSquareIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsLeftIcon, ChevronsRightIcon, ChevronsUpDownIcon, Chip, CircleDotIcon, CircleIcon, CircleUserIcon, CircularProgress, CircularProgressCenter, CodeIcon, Collapse, CollectionView, ColorPicker, ColumnsIcon, Container, CopyIcon, DatabaseIcon, DateTimeField, DebouncedTextField, Dialog, DialogActions, DialogContent, DialogTitle, DollarSignIcon, DownloadIcon, ErrorBoundary, ExpandablePanel, ExternalLinkIcon, EyeIcon, EyeOffIcon, FileIcon, FileSearchIcon, FileTextIcon, FileUpload, FilterChip, FilterIcon, FilterXIcon, FlagIcon, FolderIcon, FolderKanbanIcon, FolderPlusIcon, FolderUpIcon, FunctionSquareIcon, GitBranchIcon, GitHubIcon, GlobeIcon, HandleIcon, HashIcon, Heading1Icon, Heading2Icon, Heading3Icon, HelpCircleIcon, HistoryIcon, HomeIcon, IconButton, ImageIcon, ImageOffIcon, InfoIcon, InfoLabel, InputLabel, ItalicIcon, KanbanIcon, KanbanView, KeyIcon, KeyRoundIcon, Label, LanguagesIcon, LayoutGridIcon, Link2Icon, LinkIcon, ListIcon, ListOrderedIcon, ListPlusIcon, ListTodoIcon, ListView, LoaderIcon, LoadingButton, LockIcon, LogOutIcon, MailIcon, Markdown, Maximize2Icon, Menu, MenuIcon, MenuItem, Menubar, MenubarCheckboxItem, MenubarContent, MenubarItem, MenubarItemIndicator, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarSubTriggerIndicator, MenubarTrigger, MessageCircleIcon, MinusCircleIcon, MinusIcon, MoonIcon, MoreVerticalIcon, MultiSelect, MultiSelectContext, MultiSelectItem, Music2Icon, PanelLeftIcon, Paper, PauseIcon, PenLineIcon, PencilIcon, PhoneIcon, PinIcon, PlayIcon, PlusIcon, Popover, PopoverPrimitive, Portal, PortalContainerProvider, QuoteIcon, RadioGroup, RadioGroupItem, RefreshCcwIcon, RefreshCwIcon, RepeatIcon, ResizablePanels, Rows3Icon, SaveIcon, SearchBar, SearchIcon, Select, SelectGroup, SelectItem, SendIcon, Separator, SettingsIcon, Sheet, ShieldIcon, ShoppingCartIcon, Skeleton, Slider, SlidersHorizontalIcon, Slot, SquareIcon, StarIcon, StickyNoteIcon, StrikethroughIcon, SunIcon, SunMoonIcon, Tab, Table, TableBody, TableCell, TableHeader, TableIcon, TableRow, Tabs, TagIcon, TerminalIcon, TextField, TextIcon, TextareaAutosize, ToggleButtonGroup, Tooltip, Trash2Icon, TrendingUpIcon, TypeIcon, Typography, UnderlineIcon, UndoIcon, Unlink2Icon, UploadCloudIcon, UploadIcon, UserCheckIcon, UserIcon, UserPlus, UsersIcon, VideoIcon, VirtualTable, VirtualTableDateField, VirtualTableInput, VirtualTableNumberInput, VirtualTableSelect, VirtualTableSelectionProvider, VirtualTableSwitch, VoteIcon, Wand2Icon, WrenchIcon, XCircleIcon, XIcon, cardClickableMixin, cardMixin, cardSelectedMixin, cls, colorClassesMapping, controlHeightMixin, controlPaddingMixin, coolIconKeys, createVirtualTableSelectionStore, debounce, defaultBorderMixin, fieldBackgroundDisabledMixin, fieldBackgroundHoverMixin, fieldBackgroundInvisibleMixin, fieldBackgroundMixin, focusedClasses, focusedDisabled, focusedInvisibleMixin, getColorSchemeForKey, getColorSchemeForSeed, iconKeys, iconSize, lucideIcons, paperMixin, useAutoComplete, useDebounceCallback, useDebounceValue, useDebouncedCallback, useInjectStyles, useOutsideAlerter, usePortalContainer, useVirtualTableCellSelected, useVirtualTableSelection };
8465
8651
 
8466
8652
  //# sourceMappingURL=index.es.js.map