@inf-monkeys-tech/monkeys-design 0.4.32 → 0.4.34

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 (57) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +226 -226
  3. package/dist/components/base/index.d.mts +2 -2
  4. package/dist/components/base/index.d.ts +2 -2
  5. package/dist/components/base/index.js +990 -28
  6. package/dist/components/base/index.js.map +1 -1
  7. package/dist/components/base/index.mjs +987 -30
  8. package/dist/components/base/index.mjs.map +1 -1
  9. package/dist/components/data-explorer/index.js.map +1 -1
  10. package/dist/components/data-explorer/index.mjs.map +1 -1
  11. package/dist/components/layout/index.js.map +1 -1
  12. package/dist/components/layout/index.mjs.map +1 -1
  13. package/dist/components/login/index.js.map +1 -1
  14. package/dist/components/login/index.mjs.map +1 -1
  15. package/dist/components/toolbar/index.js.map +1 -1
  16. package/dist/components/toolbar/index.mjs.map +1 -1
  17. package/dist/components/workbench/index.d.mts +193 -2
  18. package/dist/components/workbench/index.d.ts +193 -2
  19. package/dist/components/workbench/index.js +2164 -585
  20. package/dist/components/workbench/index.js.map +1 -1
  21. package/dist/components/workbench/index.mjs +2367 -813
  22. package/dist/components/workbench/index.mjs.map +1 -1
  23. package/dist/icons/oauth/index.js.map +1 -1
  24. package/dist/icons/oauth/index.mjs.map +1 -1
  25. package/dist/index.d.mts +3 -3
  26. package/dist/index.d.ts +3 -3
  27. package/dist/index.js +1958 -170
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.mjs +1950 -172
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/palette/index.js.map +1 -1
  32. package/dist/palette/index.mjs.map +1 -1
  33. package/dist/registry/index.js.map +1 -1
  34. package/dist/registry/index.mjs.map +1 -1
  35. package/dist/styles/artist-login.scss +374 -374
  36. package/dist/styles/global.scss +21 -21
  37. package/dist/styles/workflow-board.scss +440 -440
  38. package/dist/styles/workflow-nodes.css +340 -340
  39. package/dist/{theme-CvbotXXr.d.ts → theme-Clm5dVb0.d.mts} +10 -3
  40. package/dist/{theme-6RDum855.d.mts → theme-sIoU5-YC.d.ts} +10 -3
  41. package/dist/theme-system/index.d.mts +1 -1
  42. package/dist/theme-system/index.d.ts +1 -1
  43. package/dist/theme-system/index.js +842 -18
  44. package/dist/theme-system/index.js.map +1 -1
  45. package/dist/theme-system/index.mjs +843 -19
  46. package/dist/theme-system/index.mjs.map +1 -1
  47. package/dist/themes/artist/index.js.map +1 -1
  48. package/dist/themes/artist/index.mjs.map +1 -1
  49. package/dist/themes/bsd/index.js.map +1 -1
  50. package/dist/themes/bsd/index.mjs.map +1 -1
  51. package/dist/themes/concept/index.js.map +1 -1
  52. package/dist/themes/concept/index.mjs.map +1 -1
  53. package/dist/themes/default/index.js.map +1 -1
  54. package/dist/themes/default/index.mjs.map +1 -1
  55. package/dist/{types-BgEEUqSm.d.mts → types-Bn6PEDsX.d.mts} +163 -1
  56. package/dist/{types-BgEEUqSm.d.ts → types-Bn6PEDsX.d.ts} +163 -1
  57. package/package.json +139 -138
@@ -385,7 +385,41 @@ var baseSlots = {
385
385
  tableEmptyActions: "mt-4 flex flex-wrap items-center justify-center gap-2",
386
386
  tableLoadingRow: "border-b border-border/60",
387
387
  tableLoadingCell: "px-3 py-2",
388
- tableLoadingSkeleton: "h-4 w-full rounded-md bg-muted/70"
388
+ tableLoadingSkeleton: "h-4 w-full rounded-md bg-muted/70",
389
+ layoutRoot: cn(
390
+ "grid min-w-0 overflow-hidden grid-rows-[auto_minmax(0,1fr)_auto] gap-3 rounded-lg border border-border/70 bg-background p-3 text-foreground",
391
+ motionBase
392
+ ),
393
+ layoutRootFull: "h-full min-h-0",
394
+ layoutHeader: "min-w-0",
395
+ layoutBody: "grid min-h-0 min-w-0 overflow-hidden gap-3",
396
+ layoutSidebar: "min-h-0 min-w-0 overflow-hidden",
397
+ layoutMain: "min-h-0 min-w-0 overflow-hidden",
398
+ layoutAside: "min-h-0 min-w-0 overflow-hidden",
399
+ layoutFooter: "min-w-0",
400
+ layoutPane: cn(
401
+ "h-full max-h-full min-h-0 min-w-0 overflow-hidden rounded-lg bg-background text-foreground",
402
+ motionBase
403
+ ),
404
+ layoutPaneScrollable: "overflow-auto",
405
+ layoutPaneBordered: "border border-border/70",
406
+ layoutPaneMuted: "bg-muted/25",
407
+ layoutPaneSoft: "bg-background/95 shadow-sm",
408
+ layoutPaneTransparent: "bg-transparent shadow-none",
409
+ layoutSplitRoot: "grid min-h-0 min-w-0 overflow-hidden",
410
+ layoutSplitHorizontal: "grid-flow-col",
411
+ layoutSplitVertical: "grid-flow-row",
412
+ layoutSplitPane: "min-h-0 min-w-0 overflow-hidden",
413
+ layoutSplitPrimary: "",
414
+ layoutSplitSecondary: "",
415
+ layoutResizeHandle: cn(
416
+ "group/resize relative z-10 flex shrink-0 items-center justify-center bg-transparent text-muted-foreground hover:bg-border/60 active:bg-border/70 focus-visible:bg-border/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/30",
417
+ motionInteractive
418
+ ),
419
+ layoutResizeHandleHorizontal: "w-2 cursor-col-resize",
420
+ layoutResizeHandleVertical: "h-2 cursor-row-resize",
421
+ layoutResizeHandleDisabled: "cursor-default opacity-60",
422
+ layoutResizeHandleIndicator: "rounded-full bg-muted-foreground/45 group-hover/resize:bg-primary/70"
389
423
  };
390
424
  var densitySlots = {
391
425
  compact: {
@@ -459,7 +493,12 @@ var densitySlots = {
459
493
  tableCell: "px-2 py-1.5 text-xs",
460
494
  tableHeadLabel: "text-[11px]",
461
495
  tableHeadDescription: "text-[10px] leading-3",
462
- tableLoadingCell: "px-2 py-1.5"
496
+ tableLoadingCell: "px-2 py-1.5",
497
+ layoutRoot: "gap-2 p-2",
498
+ layoutBody: "gap-2",
499
+ layoutPane: "rounded-md text-xs",
500
+ layoutResizeHandleHorizontal: "w-1.5",
501
+ layoutResizeHandleVertical: "h-1.5"
463
502
  },
464
503
  default: {
465
504
  buttonBase: "h-9"
@@ -510,7 +549,12 @@ var densitySlots = {
510
549
  menuSubTrigger: "min-h-9 px-3 py-2",
511
550
  tableHead: "h-12 px-4 py-3",
512
551
  tableCell: "px-4 py-3",
513
- tableLoadingCell: "px-4 py-3"
552
+ tableLoadingCell: "px-4 py-3",
553
+ layoutRoot: "gap-4 p-4",
554
+ layoutBody: "gap-4",
555
+ layoutPane: "rounded-xl",
556
+ layoutResizeHandleHorizontal: "w-2.5",
557
+ layoutResizeHandleVertical: "h-2.5"
514
558
  }
515
559
  };
516
560
  var radiusSlots = {
@@ -554,7 +598,9 @@ var radiusSlots = {
554
598
  menuSubContent: "rounded-none",
555
599
  tableContainer: "rounded-none",
556
600
  tableEmptyIcon: "rounded-none",
557
- tableLoadingSkeleton: "rounded-none"
601
+ tableLoadingSkeleton: "rounded-none",
602
+ layoutRoot: "rounded-none",
603
+ layoutPane: "rounded-none"
558
604
  },
559
605
  sm: {
560
606
  buttonBase: "rounded-sm",
@@ -596,7 +642,9 @@ var radiusSlots = {
596
642
  menuSubContent: "rounded-sm",
597
643
  tableContainer: "rounded-sm",
598
644
  tableEmptyIcon: "rounded-sm",
599
- tableLoadingSkeleton: "rounded-sm"
645
+ tableLoadingSkeleton: "rounded-sm",
646
+ layoutRoot: "rounded-sm",
647
+ layoutPane: "rounded-sm"
600
648
  },
601
649
  md: {},
602
650
  lg: {
@@ -633,7 +681,9 @@ var radiusSlots = {
633
681
  menuSubContent: "rounded-lg",
634
682
  tableContainer: "rounded-xl",
635
683
  tableEmptyIcon: "rounded-xl",
636
- tableLoadingSkeleton: "rounded-lg"
684
+ tableLoadingSkeleton: "rounded-lg",
685
+ layoutRoot: "rounded-xl",
686
+ layoutPane: "rounded-xl"
637
687
  },
638
688
  xl: {
639
689
  buttonBase: "rounded-xl",
@@ -671,7 +721,9 @@ var radiusSlots = {
671
721
  menuSubContent: "rounded-xl",
672
722
  tableContainer: "rounded-2xl",
673
723
  tableEmptyIcon: "rounded-2xl",
674
- tableLoadingSkeleton: "rounded-xl"
724
+ tableLoadingSkeleton: "rounded-xl",
725
+ layoutRoot: "rounded-2xl",
726
+ layoutPane: "rounded-2xl"
675
727
  },
676
728
  full: {
677
729
  buttonBase: "rounded-full",
@@ -713,7 +765,9 @@ var radiusSlots = {
713
765
  menuSubContent: "rounded-2xl",
714
766
  tableContainer: "rounded-2xl",
715
767
  tableEmptyIcon: "rounded-full",
716
- tableLoadingSkeleton: "rounded-full"
768
+ tableLoadingSkeleton: "rounded-full",
769
+ layoutRoot: "rounded-2xl",
770
+ layoutPane: "rounded-2xl"
717
771
  }
718
772
  };
719
773
  var borderSlots = {
@@ -755,7 +809,10 @@ var borderSlots = {
755
809
  tableFooterBarAttached: "border-t border-transparent",
756
810
  tableRow: "border-transparent",
757
811
  tableEmptyRow: "border-transparent",
758
- tableLoadingRow: "border-transparent"
812
+ tableLoadingRow: "border-transparent",
813
+ layoutRoot: "border-transparent",
814
+ layoutPaneBordered: "border-transparent",
815
+ layoutResizeHandle: "bg-transparent hover:bg-transparent active:bg-transparent focus-visible:bg-transparent"
759
816
  },
760
817
  subtle: {
761
818
  buttonDefault: "border-border/60",
@@ -795,7 +852,9 @@ var borderSlots = {
795
852
  tableFooterBarAttached: "border-t border-border/60",
796
853
  tableRow: "border-border/50",
797
854
  tableEmptyRow: "border-border/50",
798
- tableLoadingRow: "border-border/50"
855
+ tableLoadingRow: "border-border/50",
856
+ layoutRoot: "border-border/60",
857
+ layoutPaneBordered: "border-border/60"
799
858
  },
800
859
  solid: {},
801
860
  strong: {
@@ -836,7 +895,10 @@ var borderSlots = {
836
895
  tableFooterBarAttached: "border-t border-foreground/20",
837
896
  tableRow: "border-foreground/15",
838
897
  tableEmptyRow: "border-foreground/15",
839
- tableLoadingRow: "border-foreground/15"
898
+ tableLoadingRow: "border-foreground/15",
899
+ layoutRoot: "border-foreground/20",
900
+ layoutPaneBordered: "border-foreground/20",
901
+ layoutResizeHandle: "hover:bg-foreground/15 active:bg-foreground/20 focus-visible:bg-foreground/15"
840
902
  }
841
903
  };
842
904
  var backgroundSlots = {
@@ -878,7 +940,11 @@ var backgroundSlots = {
878
940
  tableFooter: "bg-muted/35",
879
941
  tableFooterBar: "bg-muted/30 shadow-none",
880
942
  tableRowInteractive: "cursor-pointer hover:bg-muted/45",
881
- tableLoadingSkeleton: "bg-muted"
943
+ tableLoadingSkeleton: "bg-muted",
944
+ layoutRoot: "bg-card",
945
+ layoutPane: "bg-card",
946
+ layoutPaneMuted: "bg-muted/35",
947
+ layoutResizeHandle: "hover:bg-border/70 active:bg-border/80 focus-visible:bg-border/70"
882
948
  },
883
949
  soft: {
884
950
  buttonDefault: "bg-muted/30 hover:bg-muted/55",
@@ -914,7 +980,10 @@ var backgroundSlots = {
914
980
  tableFooter: "bg-muted/25",
915
981
  tableFooterBar: "bg-muted/25 shadow-none",
916
982
  tableRowInteractive: "cursor-pointer hover:bg-muted/35",
917
- tableLoadingSkeleton: "bg-muted/65"
983
+ tableLoadingSkeleton: "bg-muted/65",
984
+ layoutRoot: "bg-background/95 shadow-sm",
985
+ layoutPane: "bg-background/95 shadow-sm",
986
+ layoutPaneSoft: "bg-background/95 shadow-md"
918
987
  },
919
988
  glass: {
920
989
  buttonBase: "backdrop-blur-md",
@@ -975,7 +1044,13 @@ var backgroundSlots = {
975
1044
  tableRow: "border-white/10",
976
1045
  tableRowInteractive: "cursor-pointer hover:bg-white/[0.08]",
977
1046
  tableHeadLabel: "text-foreground",
978
- tableLoadingSkeleton: "bg-white/[0.16]"
1047
+ tableLoadingSkeleton: "bg-white/[0.16]",
1048
+ layoutRoot: "border-white/10 bg-white/[0.05] shadow-none backdrop-blur-md",
1049
+ layoutPane: "border-white/10 bg-white/[0.06] shadow-none backdrop-blur-md",
1050
+ layoutPaneMuted: "bg-white/[0.08]",
1051
+ layoutPaneSoft: "bg-white/[0.10] shadow-none backdrop-blur-md",
1052
+ layoutResizeHandle: "text-foreground/65 hover:bg-white/10 active:bg-white/15 focus-visible:bg-white/10",
1053
+ layoutResizeHandleIndicator: "bg-white/45 group-hover/resize:bg-white/75"
979
1054
  },
980
1055
  dark: {
981
1056
  buttonBase: "border-white/15 text-white shadow-lg backdrop-blur",
@@ -1104,7 +1179,13 @@ var backgroundSlots = {
1104
1179
  menuSubTrigger: "text-white focus:bg-white/[0.10] focus:text-white data-[highlighted]:bg-white/[0.10] data-[highlighted]:text-white data-[state=open]:bg-white/[0.12]",
1105
1180
  menuSubTriggerIcon: "text-white/55",
1106
1181
  menuSubContent: "border-white/10 bg-slate-950 text-white shadow-2xl",
1107
- tableLoadingSkeleton: "bg-white/[0.14]"
1182
+ tableLoadingSkeleton: "bg-white/[0.14]",
1183
+ layoutRoot: "border-white/10 bg-slate-950 text-white shadow-none",
1184
+ layoutPane: "border-white/10 bg-slate-950 text-white shadow-none",
1185
+ layoutPaneMuted: "bg-white/[0.06]",
1186
+ layoutPaneSoft: "bg-white/[0.08] shadow-none",
1187
+ layoutResizeHandle: "text-white/65 hover:bg-white/10 active:bg-white/15 focus-visible:bg-white/10",
1188
+ layoutResizeHandleIndicator: "bg-white/45 group-hover/resize:bg-white/75"
1108
1189
  }
1109
1190
  };
1110
1191
  var presetDefaults = {
@@ -2962,6 +3043,432 @@ var BaseInput = react.forwardRef(
2962
3043
  );
2963
3044
  }
2964
3045
  );
3046
+ var DEFAULT_SPLIT_SIZE = 50;
3047
+ var DEFAULT_MIN_SIZE = 20;
3048
+ var DEFAULT_MAX_SIZE = 80;
3049
+ var DEFAULT_KEYBOARD_STEP = 2.5;
3050
+ function toCssSize(value, fallback) {
3051
+ if (typeof value === "number") {
3052
+ if (!Number.isFinite(value) || value < 0) {
3053
+ throw new Error("BaseLayout size and gap props must be finite, non-negative numbers.");
3054
+ }
3055
+ return `${value}px`;
3056
+ }
3057
+ return value ?? fallback;
3058
+ }
3059
+ function assertPercent(name, value) {
3060
+ if (!Number.isFinite(value)) {
3061
+ throw new Error(`BaseLayoutSplit ${name} must be a finite number.`);
3062
+ }
3063
+ if (value < 0 || value > 100) {
3064
+ throw new Error(`BaseLayoutSplit ${name} must be between 0 and 100.`);
3065
+ }
3066
+ return value;
3067
+ }
3068
+ function clamp(value, min, max) {
3069
+ return Math.min(Math.max(value, min), max);
3070
+ }
3071
+ function resolveSplitBounds({
3072
+ minSize = DEFAULT_MIN_SIZE,
3073
+ maxSize = DEFAULT_MAX_SIZE,
3074
+ keyboardStep = DEFAULT_KEYBOARD_STEP
3075
+ }) {
3076
+ const min = assertPercent("minSize", minSize);
3077
+ const max = assertPercent("maxSize", maxSize);
3078
+ if (min > max) {
3079
+ throw new Error("BaseLayoutSplit minSize cannot be greater than maxSize.");
3080
+ }
3081
+ if (!Number.isFinite(keyboardStep) || keyboardStep <= 0) {
3082
+ throw new Error("BaseLayoutSplit keyboardStep must be a finite positive number.");
3083
+ }
3084
+ return { min, max, keyboardStep };
3085
+ }
3086
+ function resolveSplitSize(name, value, fallback, min, max) {
3087
+ return clamp(assertPercent(name, value ?? fallback), min, max);
3088
+ }
3089
+ function getSeparatorOrientation(orientation) {
3090
+ return orientation === "horizontal" ? "vertical" : "horizontal";
3091
+ }
3092
+ function BaseLayout({
3093
+ header,
3094
+ sidebar,
3095
+ aside,
3096
+ footer,
3097
+ children,
3098
+ sidebarSize,
3099
+ asideSize,
3100
+ gap,
3101
+ fullHeight,
3102
+ appearance,
3103
+ className,
3104
+ classNames,
3105
+ style,
3106
+ ...layoutProps
3107
+ }) {
3108
+ const theme = resolveBaseAppearance(appearance);
3109
+ const hasHeader = hasRenderableNode(header);
3110
+ const hasSidebar = hasRenderableNode(sidebar);
3111
+ const hasAside = hasRenderableNode(aside);
3112
+ const hasFooter = hasRenderableNode(footer);
3113
+ const bodyColumns = [
3114
+ hasSidebar ? "var(--base-layout-sidebar-size)" : void 0,
3115
+ "minmax(0, 1fr)",
3116
+ hasAside ? "var(--base-layout-aside-size)" : void 0
3117
+ ].filter(Boolean).join(" ");
3118
+ const layoutRows = [
3119
+ hasHeader ? "auto" : void 0,
3120
+ "minmax(0, 1fr)",
3121
+ hasFooter ? "auto" : void 0
3122
+ ].filter(Boolean).join(" ");
3123
+ const resolvedGap = gap !== void 0 ? toCssSize(gap, "0px") : void 0;
3124
+ const layoutStyle = {
3125
+ ...theme.styles.layout,
3126
+ "--base-layout-sidebar-size": toCssSize(sidebarSize, "16rem"),
3127
+ "--base-layout-aside-size": toCssSize(asideSize, "20rem"),
3128
+ gridTemplateRows: layoutRows,
3129
+ ...resolvedGap !== void 0 ? { gap: resolvedGap } : {},
3130
+ ...style
3131
+ };
3132
+ const bodyStyle = {
3133
+ ...theme.styles.layoutBody,
3134
+ gridTemplateColumns: bodyColumns,
3135
+ ...resolvedGap !== void 0 ? { gap: resolvedGap } : {}
3136
+ };
3137
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3138
+ "div",
3139
+ {
3140
+ ...layoutProps,
3141
+ className: cn(
3142
+ theme.slots.layoutRoot,
3143
+ fullHeight && theme.slots.layoutRootFull,
3144
+ classNames?.root,
3145
+ className
3146
+ ),
3147
+ style: layoutStyle,
3148
+ children: [
3149
+ hasHeader ? /* @__PURE__ */ jsxRuntime.jsx(
3150
+ "div",
3151
+ {
3152
+ className: cn(theme.slots.layoutHeader, classNames?.header),
3153
+ style: theme.styles.layoutHeader,
3154
+ children: header
3155
+ }
3156
+ ) : null,
3157
+ /* @__PURE__ */ jsxRuntime.jsxs(
3158
+ "div",
3159
+ {
3160
+ className: cn(theme.slots.layoutBody, classNames?.body),
3161
+ style: bodyStyle,
3162
+ children: [
3163
+ hasSidebar ? /* @__PURE__ */ jsxRuntime.jsx(
3164
+ "aside",
3165
+ {
3166
+ className: cn(theme.slots.layoutSidebar, classNames?.sidebar),
3167
+ style: theme.styles.layoutSidebar,
3168
+ children: sidebar
3169
+ }
3170
+ ) : null,
3171
+ /* @__PURE__ */ jsxRuntime.jsx(
3172
+ "main",
3173
+ {
3174
+ className: cn(theme.slots.layoutMain, classNames?.main),
3175
+ style: theme.styles.layoutMain,
3176
+ children
3177
+ }
3178
+ ),
3179
+ hasAside ? /* @__PURE__ */ jsxRuntime.jsx(
3180
+ "aside",
3181
+ {
3182
+ className: cn(theme.slots.layoutAside, classNames?.aside),
3183
+ style: theme.styles.layoutAside,
3184
+ children: aside
3185
+ }
3186
+ ) : null
3187
+ ]
3188
+ }
3189
+ ),
3190
+ hasFooter ? /* @__PURE__ */ jsxRuntime.jsx(
3191
+ "div",
3192
+ {
3193
+ className: cn(theme.slots.layoutFooter, classNames?.footer),
3194
+ style: theme.styles.layoutFooter,
3195
+ children: footer
3196
+ }
3197
+ ) : null
3198
+ ]
3199
+ }
3200
+ );
3201
+ }
3202
+ function BaseLayoutPane({
3203
+ as = "div",
3204
+ scrollable = false,
3205
+ bordered = true,
3206
+ surface = "default",
3207
+ children,
3208
+ appearance,
3209
+ className,
3210
+ classNames,
3211
+ style,
3212
+ ...paneProps
3213
+ }) {
3214
+ const theme = resolveBaseAppearance(appearance);
3215
+ const Component = as;
3216
+ return /* @__PURE__ */ jsxRuntime.jsx(
3217
+ Component,
3218
+ {
3219
+ ...paneProps,
3220
+ className: cn(
3221
+ theme.slots.layoutPane,
3222
+ scrollable && theme.slots.layoutPaneScrollable,
3223
+ bordered && theme.slots.layoutPaneBordered,
3224
+ surface === "muted" && theme.slots.layoutPaneMuted,
3225
+ surface === "soft" && theme.slots.layoutPaneSoft,
3226
+ surface === "transparent" && theme.slots.layoutPaneTransparent,
3227
+ classNames?.root,
3228
+ className
3229
+ ),
3230
+ style: {
3231
+ ...theme.styles.layoutPane,
3232
+ ...style
3233
+ },
3234
+ children
3235
+ }
3236
+ );
3237
+ }
3238
+ function BaseLayoutResizeHandle({
3239
+ orientation = "horizontal",
3240
+ resizable = false,
3241
+ disabled = false,
3242
+ size,
3243
+ minSize,
3244
+ maxSize,
3245
+ label = "Resize panels",
3246
+ appearance,
3247
+ className,
3248
+ classNames,
3249
+ style,
3250
+ tabIndex,
3251
+ ...handleProps
3252
+ }) {
3253
+ const theme = resolveBaseAppearance(appearance);
3254
+ const interactive = resizable && !disabled;
3255
+ const separatorOrientation = getSeparatorOrientation(orientation);
3256
+ return /* @__PURE__ */ jsxRuntime.jsx(
3257
+ "div",
3258
+ {
3259
+ ...handleProps,
3260
+ role: interactive ? "separator" : void 0,
3261
+ "aria-label": interactive ? label : void 0,
3262
+ "aria-orientation": interactive ? separatorOrientation : void 0,
3263
+ "aria-valuemin": interactive ? minSize : void 0,
3264
+ "aria-valuemax": interactive ? maxSize : void 0,
3265
+ "aria-valuenow": interactive ? size : void 0,
3266
+ "aria-disabled": interactive ? void 0 : true,
3267
+ tabIndex: interactive ? tabIndex ?? 0 : void 0,
3268
+ className: cn(
3269
+ theme.slots.layoutResizeHandle,
3270
+ orientation === "horizontal" ? theme.slots.layoutResizeHandleHorizontal : theme.slots.layoutResizeHandleVertical,
3271
+ !interactive && theme.slots.layoutResizeHandleDisabled,
3272
+ classNames?.root,
3273
+ className
3274
+ ),
3275
+ style: {
3276
+ ...theme.styles.layoutResizeHandle,
3277
+ ...style
3278
+ },
3279
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3280
+ "span",
3281
+ {
3282
+ "aria-hidden": "true",
3283
+ className: cn(
3284
+ theme.slots.layoutResizeHandleIndicator,
3285
+ orientation === "horizontal" ? "h-8 w-px" : "h-px w-8",
3286
+ classNames?.indicator
3287
+ )
3288
+ }
3289
+ )
3290
+ }
3291
+ );
3292
+ }
3293
+ function BaseLayoutSplit({
3294
+ orientation = "horizontal",
3295
+ primary,
3296
+ secondary,
3297
+ children,
3298
+ resizable = false,
3299
+ size,
3300
+ defaultSize,
3301
+ minSize,
3302
+ maxSize,
3303
+ gap,
3304
+ keyboardStep,
3305
+ resizeLabel,
3306
+ appearance,
3307
+ className,
3308
+ classNames,
3309
+ style,
3310
+ onSizeChange,
3311
+ ...splitProps
3312
+ }) {
3313
+ const theme = resolveBaseAppearance(appearance);
3314
+ const bounds = resolveSplitBounds({ minSize, maxSize, keyboardStep });
3315
+ const initialSize = resolveSplitSize(
3316
+ "defaultSize",
3317
+ defaultSize,
3318
+ DEFAULT_SPLIT_SIZE,
3319
+ bounds.min,
3320
+ bounds.max
3321
+ );
3322
+ const [uncontrolledSize, setUncontrolledSize] = react.useState(initialSize);
3323
+ const rootRef = react.useRef(null);
3324
+ const cleanupRef = react.useRef(null);
3325
+ const controlled = size !== void 0;
3326
+ const renderedSize = resolveSplitSize(
3327
+ "size",
3328
+ controlled ? size : uncontrolledSize,
3329
+ initialSize,
3330
+ bounds.min,
3331
+ bounds.max
3332
+ );
3333
+ const commitSize = react.useCallback(
3334
+ (nextSize) => {
3335
+ const clampedSize = clamp(nextSize, bounds.min, bounds.max);
3336
+ if (!controlled) {
3337
+ setUncontrolledSize(clampedSize);
3338
+ }
3339
+ onSizeChange?.(clampedSize);
3340
+ },
3341
+ [bounds.max, bounds.min, controlled, onSizeChange]
3342
+ );
3343
+ const updateFromPointer = react.useCallback(
3344
+ (event) => {
3345
+ const root = rootRef.current;
3346
+ if (!root) return;
3347
+ const rect = root.getBoundingClientRect();
3348
+ const total = orientation === "horizontal" ? rect.width : rect.height;
3349
+ if (total <= 0) return;
3350
+ const offset = orientation === "horizontal" ? event.clientX - rect.left : event.clientY - rect.top;
3351
+ commitSize(offset / total * 100);
3352
+ },
3353
+ [commitSize, orientation]
3354
+ );
3355
+ const stopResize = react.useCallback(() => {
3356
+ cleanupRef.current?.();
3357
+ cleanupRef.current = null;
3358
+ }, []);
3359
+ react.useEffect(() => stopResize, [stopResize]);
3360
+ const handlePointerDown = (event) => {
3361
+ if (!resizable) return;
3362
+ event.preventDefault();
3363
+ stopResize();
3364
+ updateFromPointer(event);
3365
+ const handleMove = (nextEvent) => {
3366
+ updateFromPointer(nextEvent);
3367
+ };
3368
+ const handleStop = () => {
3369
+ stopResize();
3370
+ };
3371
+ window.addEventListener("pointermove", handleMove);
3372
+ window.addEventListener("pointerup", handleStop, { once: true });
3373
+ window.addEventListener("pointercancel", handleStop, { once: true });
3374
+ cleanupRef.current = () => {
3375
+ window.removeEventListener("pointermove", handleMove);
3376
+ window.removeEventListener("pointerup", handleStop);
3377
+ window.removeEventListener("pointercancel", handleStop);
3378
+ };
3379
+ };
3380
+ const handleKeyDown = (event) => {
3381
+ if (!resizable) return;
3382
+ const step = event.shiftKey ? bounds.keyboardStep * 4 : bounds.keyboardStep;
3383
+ let nextSize;
3384
+ if (event.key === "Home") nextSize = bounds.min;
3385
+ if (event.key === "End") nextSize = bounds.max;
3386
+ if (orientation === "horizontal" && event.key === "ArrowLeft") {
3387
+ nextSize = renderedSize - step;
3388
+ }
3389
+ if (orientation === "horizontal" && event.key === "ArrowRight") {
3390
+ nextSize = renderedSize + step;
3391
+ }
3392
+ if (orientation === "vertical" && event.key === "ArrowUp") {
3393
+ nextSize = renderedSize - step;
3394
+ }
3395
+ if (orientation === "vertical" && event.key === "ArrowDown") {
3396
+ nextSize = renderedSize + step;
3397
+ }
3398
+ if (nextSize === void 0) return;
3399
+ event.preventDefault();
3400
+ commitSize(nextSize);
3401
+ };
3402
+ const resolvedGap = gap !== void 0 ? toCssSize(gap, "0px") : void 0;
3403
+ const resizeTrack = resolvedGap !== void 0 ? "var(--base-layout-split-gap)" : "auto";
3404
+ const resizeHandleStyle = resolvedGap !== void 0 ? orientation === "horizontal" ? { width: "var(--base-layout-split-gap)" } : { height: "var(--base-layout-split-gap)" } : void 0;
3405
+ const splitStyle = {
3406
+ ...theme.styles.layoutSplit,
3407
+ [orientation === "horizontal" ? "gridTemplateColumns" : "gridTemplateRows"]: resizable ? `${renderedSize}% ${resizeTrack} minmax(0, 1fr)` : `${renderedSize}% minmax(0, 1fr)`,
3408
+ ...resizable ? { gap: 0 } : {},
3409
+ ...resolvedGap !== void 0 ? {
3410
+ "--base-layout-split-gap": resolvedGap,
3411
+ ...resizable ? {} : { gap: resolvedGap }
3412
+ } : {},
3413
+ ...style
3414
+ };
3415
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3416
+ "div",
3417
+ {
3418
+ ...splitProps,
3419
+ ref: rootRef,
3420
+ className: cn(
3421
+ theme.slots.layoutSplitRoot,
3422
+ orientation === "horizontal" ? theme.slots.layoutSplitHorizontal : theme.slots.layoutSplitVertical,
3423
+ classNames?.root,
3424
+ className
3425
+ ),
3426
+ style: splitStyle,
3427
+ children: [
3428
+ /* @__PURE__ */ jsxRuntime.jsx(
3429
+ "div",
3430
+ {
3431
+ className: cn(
3432
+ theme.slots.layoutSplitPane,
3433
+ theme.slots.layoutSplitPrimary,
3434
+ classNames?.primary
3435
+ ),
3436
+ style: theme.styles.layoutSplitPane,
3437
+ children: hasRenderableNode(primary) ? primary : children
3438
+ }
3439
+ ),
3440
+ resizable ? /* @__PURE__ */ jsxRuntime.jsx(
3441
+ BaseLayoutResizeHandle,
3442
+ {
3443
+ orientation,
3444
+ resizable: true,
3445
+ size: renderedSize,
3446
+ minSize: bounds.min,
3447
+ maxSize: bounds.max,
3448
+ label: resizeLabel,
3449
+ appearance,
3450
+ className: classNames?.handle,
3451
+ style: resizeHandleStyle,
3452
+ onPointerDown: handlePointerDown,
3453
+ onKeyDown: handleKeyDown
3454
+ }
3455
+ ) : null,
3456
+ /* @__PURE__ */ jsxRuntime.jsx(
3457
+ "div",
3458
+ {
3459
+ className: cn(
3460
+ theme.slots.layoutSplitPane,
3461
+ theme.slots.layoutSplitSecondary,
3462
+ classNames?.secondary
3463
+ ),
3464
+ style: theme.styles.layoutSplitPane,
3465
+ children: secondary
3466
+ }
3467
+ )
3468
+ ]
3469
+ }
3470
+ );
3471
+ }
2965
3472
  function DefaultLoadingIcon({ className }) {
2966
3473
  return /* @__PURE__ */ jsxRuntime.jsxs(
2967
3474
  "svg",
@@ -3039,6 +3546,448 @@ function BaseLoadingState({
3039
3546
  }
3040
3547
  );
3041
3548
  }
3549
+ function normalizeValues(values) {
3550
+ const nextValues = [];
3551
+ const seen = /* @__PURE__ */ new Set();
3552
+ values?.forEach((value) => {
3553
+ if (seen.has(value)) return;
3554
+ seen.add(value);
3555
+ nextValues.push(value);
3556
+ });
3557
+ return nextValues;
3558
+ }
3559
+ function getNextEnabledIndex(options, currentIndex, direction) {
3560
+ if (!options.length) return -1;
3561
+ const startIndex = currentIndex >= 0 ? currentIndex : 0;
3562
+ for (let offset = 1; offset <= options.length; offset += 1) {
3563
+ const nextIndex = (startIndex + offset * direction + options.length) % options.length;
3564
+ if (!options[nextIndex]?.disabled) {
3565
+ return nextIndex;
3566
+ }
3567
+ }
3568
+ return -1;
3569
+ }
3570
+ function getFirstEnabledIndex(options) {
3571
+ return options.findIndex((option) => !option.disabled);
3572
+ }
3573
+ function getSafeTagCount(maxTagCount, total) {
3574
+ if (maxTagCount === void 0) return total;
3575
+ if (!Number.isFinite(maxTagCount)) return total;
3576
+ return Math.max(0, Math.min(total, Math.floor(maxTagCount)));
3577
+ }
3578
+ function getDefaultRemoveLabel(option) {
3579
+ return `Remove ${option.value}`;
3580
+ }
3581
+ var BaseMultiSelect = react.forwardRef(
3582
+ function BaseMultiSelect2({
3583
+ options,
3584
+ value,
3585
+ defaultValue,
3586
+ name,
3587
+ placeholder = "Select options",
3588
+ icon,
3589
+ invalid = false,
3590
+ disabled = false,
3591
+ required = false,
3592
+ openForPreview = false,
3593
+ maxTagCount,
3594
+ removeLabel = getDefaultRemoveLabel,
3595
+ emptyLabel = "No options",
3596
+ appearance,
3597
+ className,
3598
+ classNames,
3599
+ style,
3600
+ id,
3601
+ "aria-invalid": nativeAriaInvalid,
3602
+ "aria-label": nativeAriaLabel,
3603
+ "aria-labelledby": nativeAriaLabelledBy,
3604
+ onValueChange,
3605
+ ...rootProps
3606
+ }, ref) {
3607
+ const theme = resolveBaseAppearance(appearance);
3608
+ const generatedId = react.useId();
3609
+ const multiSelectId = id ?? generatedId;
3610
+ const controlId = `${multiSelectId}-control`;
3611
+ const listboxId = `${multiSelectId}-listbox`;
3612
+ const rootRef = react.useRef(null);
3613
+ const optionList = options ?? [];
3614
+ const forceOpen = openForPreview;
3615
+ const [uncontrolledOpen, setUncontrolledOpen] = react.useState(false);
3616
+ const open = forceOpen || uncontrolledOpen;
3617
+ const [uncontrolledValue, setUncontrolledValue] = react.useState(
3618
+ () => normalizeValues(defaultValue)
3619
+ );
3620
+ const [activeIndex, setActiveIndex] = react.useState(
3621
+ () => getFirstEnabledIndex(optionList)
3622
+ );
3623
+ const isControlled = value !== void 0;
3624
+ const selectedValues = react.useMemo(
3625
+ () => normalizeValues(isControlled ? value : uncontrolledValue),
3626
+ [isControlled, uncontrolledValue, value]
3627
+ );
3628
+ const selectedValueSet = react.useMemo(
3629
+ () => new Set(selectedValues),
3630
+ [selectedValues]
3631
+ );
3632
+ const optionByValue = react.useMemo(() => {
3633
+ const map = /* @__PURE__ */ new Map();
3634
+ optionList.forEach((option) => {
3635
+ if (!map.has(option.value)) {
3636
+ map.set(option.value, option);
3637
+ }
3638
+ });
3639
+ return map;
3640
+ }, [optionList]);
3641
+ const selectedOptions = react.useMemo(
3642
+ () => selectedValues.map((selectedValue) => optionByValue.get(selectedValue)).filter(
3643
+ (option) => option !== void 0
3644
+ ),
3645
+ [optionByValue, selectedValues]
3646
+ );
3647
+ const firstEnabledIndex = react.useMemo(
3648
+ () => getFirstEnabledIndex(optionList),
3649
+ [optionList]
3650
+ );
3651
+ const resolvedActiveIndex = activeIndex >= 0 && !optionList[activeIndex]?.disabled ? activeIndex : firstEnabledIndex;
3652
+ const visibleTagCount = getSafeTagCount(
3653
+ maxTagCount,
3654
+ selectedOptions.length
3655
+ );
3656
+ const visibleOptions = selectedOptions.slice(0, visibleTagCount);
3657
+ const overflowCount = selectedOptions.length - visibleOptions.length;
3658
+ const isPlaceholder = selectedOptions.length === 0;
3659
+ const setRootRef = (node) => {
3660
+ rootRef.current = node;
3661
+ if (typeof ref === "function") {
3662
+ ref(node);
3663
+ } else if (ref) {
3664
+ ref.current = node;
3665
+ }
3666
+ };
3667
+ const setOpen = (nextOpen) => {
3668
+ if (disabled || forceOpen) return;
3669
+ setUncontrolledOpen(nextOpen);
3670
+ if (nextOpen) {
3671
+ setActiveIndex(resolvedActiveIndex);
3672
+ }
3673
+ };
3674
+ react.useEffect(() => {
3675
+ if (!open || forceOpen) return void 0;
3676
+ const handlePointerDown = (event) => {
3677
+ if (!rootRef.current?.contains(event.target)) {
3678
+ setUncontrolledOpen(false);
3679
+ }
3680
+ };
3681
+ document.addEventListener("pointerdown", handlePointerDown);
3682
+ return () => {
3683
+ document.removeEventListener("pointerdown", handlePointerDown);
3684
+ };
3685
+ }, [forceOpen, open]);
3686
+ react.useEffect(() => {
3687
+ if (resolvedActiveIndex >= 0 && resolvedActiveIndex !== activeIndex) {
3688
+ setActiveIndex(resolvedActiveIndex);
3689
+ }
3690
+ }, [activeIndex, resolvedActiveIndex]);
3691
+ const commitValues = (nextValues) => {
3692
+ const normalizedValues = normalizeValues(nextValues);
3693
+ if (!isControlled) {
3694
+ setUncontrolledValue(normalizedValues);
3695
+ }
3696
+ onValueChange?.(normalizedValues);
3697
+ };
3698
+ const toggleOption = (option) => {
3699
+ if (!option || option.disabled || disabled) return;
3700
+ const nextValues = selectedValueSet.has(option.value) ? selectedValues.filter((selectedValue) => selectedValue !== option.value) : [...selectedValues, option.value];
3701
+ commitValues(nextValues);
3702
+ };
3703
+ const removeOption = (option) => {
3704
+ if (disabled) return;
3705
+ commitValues(
3706
+ selectedValues.filter((selectedValue) => selectedValue !== option.value)
3707
+ );
3708
+ };
3709
+ const focusOption = (direction) => {
3710
+ const nextIndex = getNextEnabledIndex(
3711
+ optionList,
3712
+ resolvedActiveIndex,
3713
+ direction
3714
+ );
3715
+ if (nextIndex >= 0) {
3716
+ setActiveIndex(nextIndex);
3717
+ }
3718
+ };
3719
+ const handleKeyDown = (event) => {
3720
+ if (disabled) return;
3721
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
3722
+ event.preventDefault();
3723
+ if (!open) {
3724
+ setOpen(true);
3725
+ setActiveIndex(firstEnabledIndex);
3726
+ return;
3727
+ }
3728
+ focusOption(event.key === "ArrowDown" ? 1 : -1);
3729
+ return;
3730
+ }
3731
+ if (event.key === "Home") {
3732
+ event.preventDefault();
3733
+ setOpen(true);
3734
+ setActiveIndex(firstEnabledIndex);
3735
+ return;
3736
+ }
3737
+ if (event.key === "End") {
3738
+ event.preventDefault();
3739
+ setOpen(true);
3740
+ for (let index = optionList.length - 1; index >= 0; index -= 1) {
3741
+ if (!optionList[index]?.disabled) {
3742
+ setActiveIndex(index);
3743
+ break;
3744
+ }
3745
+ }
3746
+ return;
3747
+ }
3748
+ if (event.key === "Enter" || event.key === " ") {
3749
+ event.preventDefault();
3750
+ if (!open) {
3751
+ setOpen(true);
3752
+ return;
3753
+ }
3754
+ toggleOption(optionList[resolvedActiveIndex]);
3755
+ return;
3756
+ }
3757
+ if (event.key === "Escape") {
3758
+ setOpen(false);
3759
+ }
3760
+ };
3761
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3762
+ "div",
3763
+ {
3764
+ ...rootProps,
3765
+ id,
3766
+ ref: setRootRef,
3767
+ className: cn(
3768
+ theme.slots.controlWrapper,
3769
+ "overflow-visible",
3770
+ open && "z-50",
3771
+ invalid && theme.slots.controlInvalid,
3772
+ disabled && theme.slots.controlDisabled,
3773
+ classNames?.root,
3774
+ className
3775
+ ),
3776
+ style: {
3777
+ ...theme.styles.control,
3778
+ ...invalid ? theme.styles.controlInvalid : void 0,
3779
+ ...disabled ? theme.styles.controlDisabled : void 0,
3780
+ ...style
3781
+ },
3782
+ children: [
3783
+ hasRenderableNode(icon) ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(theme.slots.controlIcon, classNames?.icon), children: icon }) : null,
3784
+ /* @__PURE__ */ jsxRuntime.jsx(
3785
+ "div",
3786
+ {
3787
+ id: controlId,
3788
+ role: "combobox",
3789
+ tabIndex: disabled ? -1 : 0,
3790
+ "aria-haspopup": "listbox",
3791
+ "aria-expanded": open,
3792
+ "aria-controls": listboxId,
3793
+ "aria-disabled": disabled || void 0,
3794
+ "aria-required": required || void 0,
3795
+ "aria-invalid": nativeAriaInvalid ?? (invalid || void 0),
3796
+ "aria-label": nativeAriaLabel,
3797
+ "aria-labelledby": nativeAriaLabelledBy,
3798
+ className: cn(
3799
+ theme.slots.controlBase,
3800
+ "flex min-h-9 cursor-pointer flex-wrap items-center gap-1.5 py-1.5 pr-9 text-left",
3801
+ disabled && "!cursor-not-allowed",
3802
+ classNames?.control
3803
+ ),
3804
+ onClick: () => setOpen(!open),
3805
+ onKeyDown: handleKeyDown,
3806
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
3807
+ "span",
3808
+ {
3809
+ className: cn(
3810
+ "flex min-w-0 flex-1 flex-wrap items-center gap-1.5",
3811
+ classNames?.tagList
3812
+ ),
3813
+ children: [
3814
+ visibleOptions.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
3815
+ "span",
3816
+ {
3817
+ className: cn(
3818
+ "inline-flex max-w-full items-center gap-1 rounded-full border border-border/70 bg-muted/65 px-2 py-0.5 text-xs font-medium text-foreground",
3819
+ classNames?.tag
3820
+ ),
3821
+ children: [
3822
+ /* @__PURE__ */ jsxRuntime.jsx(
3823
+ "span",
3824
+ {
3825
+ className: cn(
3826
+ "max-w-40 truncate",
3827
+ classNames?.tagLabel
3828
+ ),
3829
+ children: option.label
3830
+ }
3831
+ ),
3832
+ /* @__PURE__ */ jsxRuntime.jsx(
3833
+ "button",
3834
+ {
3835
+ type: "button",
3836
+ "aria-label": removeLabel(option),
3837
+ disabled,
3838
+ className: cn(
3839
+ "inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-muted-foreground hover:bg-background/80 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/30 disabled:!cursor-not-allowed",
3840
+ classNames?.tagRemove
3841
+ ),
3842
+ onClick: (event) => {
3843
+ event.preventDefault();
3844
+ event.stopPropagation();
3845
+ removeOption(option);
3846
+ },
3847
+ onMouseDown: (event) => {
3848
+ event.preventDefault();
3849
+ event.stopPropagation();
3850
+ },
3851
+ onKeyDown: (event) => event.stopPropagation(),
3852
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "x" })
3853
+ }
3854
+ )
3855
+ ]
3856
+ },
3857
+ option.value
3858
+ )),
3859
+ overflowCount > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
3860
+ "span",
3861
+ {
3862
+ className: cn(
3863
+ "inline-flex max-w-full items-center rounded-full border border-border/70 bg-muted/45 px-2 py-0.5 text-xs font-medium text-muted-foreground",
3864
+ classNames?.tag
3865
+ ),
3866
+ children: [
3867
+ "+",
3868
+ overflowCount
3869
+ ]
3870
+ }
3871
+ ) : null,
3872
+ isPlaceholder ? /* @__PURE__ */ jsxRuntime.jsx(
3873
+ "span",
3874
+ {
3875
+ className: cn(
3876
+ "min-w-0 truncate",
3877
+ theme.slots.selectPlaceholder,
3878
+ classNames?.placeholder
3879
+ ),
3880
+ children: placeholder
3881
+ }
3882
+ ) : null
3883
+ ]
3884
+ }
3885
+ )
3886
+ }
3887
+ ),
3888
+ /* @__PURE__ */ jsxRuntime.jsx(
3889
+ "span",
3890
+ {
3891
+ className: cn(
3892
+ theme.slots.selectChevron,
3893
+ open && "rotate-[225deg]",
3894
+ classNames?.chevron
3895
+ )
3896
+ }
3897
+ ),
3898
+ name ? selectedValues.map((selectedValue) => /* @__PURE__ */ jsxRuntime.jsx(
3899
+ "input",
3900
+ {
3901
+ type: "hidden",
3902
+ name,
3903
+ value: selectedValue,
3904
+ className: classNames?.hiddenInput
3905
+ },
3906
+ selectedValue
3907
+ )) : null,
3908
+ open ? /* @__PURE__ */ jsxRuntime.jsx(
3909
+ "div",
3910
+ {
3911
+ id: listboxId,
3912
+ role: "listbox",
3913
+ "aria-multiselectable": "true",
3914
+ "aria-labelledby": controlId,
3915
+ className: cn(theme.slots.selectMenu, classNames?.menu),
3916
+ style: theme.styles.selectMenu,
3917
+ children: optionList.length > 0 ? optionList.map((option, index) => {
3918
+ const selected = selectedValueSet.has(option.value);
3919
+ const active = index === resolvedActiveIndex;
3920
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3921
+ "button",
3922
+ {
3923
+ type: "button",
3924
+ role: "option",
3925
+ "aria-selected": selected,
3926
+ disabled: option.disabled,
3927
+ className: cn(
3928
+ theme.slots.selectOption,
3929
+ "gap-2",
3930
+ active && theme.slots.selectOptionActive,
3931
+ selected && theme.slots.selectOptionSelected,
3932
+ option.disabled && theme.slots.selectOptionDisabled,
3933
+ classNames?.option
3934
+ ),
3935
+ style: {
3936
+ ...theme.styles.selectOption,
3937
+ ...active ? theme.styles.selectOptionActive : void 0,
3938
+ ...selected ? theme.styles.selectOptionSelected : void 0
3939
+ },
3940
+ onMouseEnter: () => {
3941
+ if (!option.disabled) {
3942
+ setActiveIndex(index);
3943
+ }
3944
+ },
3945
+ onMouseDown: (event) => event.preventDefault(),
3946
+ onClick: () => toggleOption(option),
3947
+ children: [
3948
+ /* @__PURE__ */ jsxRuntime.jsx(
3949
+ "span",
3950
+ {
3951
+ "aria-hidden": "true",
3952
+ className: cn(
3953
+ "inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border border-border/70 text-[10px]",
3954
+ selected && "border-primary/40 bg-primary text-primary-foreground",
3955
+ classNames?.optionIndicator
3956
+ ),
3957
+ children: selected ? "\u2713" : null
3958
+ }
3959
+ ),
3960
+ /* @__PURE__ */ jsxRuntime.jsx(
3961
+ "span",
3962
+ {
3963
+ className: cn(
3964
+ "min-w-0 flex-1 truncate",
3965
+ classNames?.optionLabel
3966
+ ),
3967
+ children: option.label
3968
+ }
3969
+ )
3970
+ ]
3971
+ },
3972
+ option.value
3973
+ );
3974
+ }) : /* @__PURE__ */ jsxRuntime.jsx(
3975
+ "div",
3976
+ {
3977
+ className: cn(
3978
+ "px-2.5 py-2 text-sm text-muted-foreground",
3979
+ classNames?.empty
3980
+ ),
3981
+ children: emptyLabel
3982
+ }
3983
+ )
3984
+ }
3985
+ ) : null
3986
+ ]
3987
+ }
3988
+ );
3989
+ }
3990
+ );
3042
3991
  function BaseNotice({
3043
3992
  tone,
3044
3993
  icon,
@@ -3251,7 +4200,7 @@ function BasePagination({
3251
4200
  function toFiniteNumber(value, fallback) {
3252
4201
  return Number.isFinite(value) ? Number(value) : fallback;
3253
4202
  }
3254
- function clamp(value, min, max) {
4203
+ function clamp2(value, min, max) {
3255
4204
  return Math.min(Math.max(value, min), max);
3256
4205
  }
3257
4206
  function BaseProgress({
@@ -3269,7 +4218,7 @@ function BaseProgress({
3269
4218
  }) {
3270
4219
  const theme = resolveBaseAppearance(appearance);
3271
4220
  const safeMax = Math.max(toFiniteNumber(max, 100), 1);
3272
- const safeValue = clamp(toFiniteNumber(value, 0), 0, safeMax);
4221
+ const safeValue = clamp2(toFiniteNumber(value, 0), 0, safeMax);
3273
4222
  const percent = safeValue / safeMax * 100;
3274
4223
  const renderedValue = valueFormatter?.(safeValue, safeMax) ?? `${Math.round(percent)}%`;
3275
4224
  const hasLabelRow = hasRenderableNode(label) || showValue;
@@ -3440,7 +4389,7 @@ function getInitialValue2(options, defaultValue) {
3440
4389
  }
3441
4390
  return "";
3442
4391
  }
3443
- function getNextEnabledIndex(options, currentIndex, direction) {
4392
+ function getNextEnabledIndex2(options, currentIndex, direction) {
3444
4393
  if (!options.length) return -1;
3445
4394
  for (let offset = 1; offset <= options.length; offset += 1) {
3446
4395
  const nextIndex = (currentIndex + offset * direction + options.length) % options.length;
@@ -3542,7 +4491,7 @@ var BaseSelect = react.forwardRef(
3542
4491
  };
3543
4492
  const focusOption = (direction) => {
3544
4493
  const currentIndex = activeIndex >= 0 ? activeIndex : 0;
3545
- const nextIndex = getNextEnabledIndex(optionList, currentIndex, direction);
4494
+ const nextIndex = getNextEnabledIndex2(optionList, currentIndex, direction);
3546
4495
  if (nextIndex >= 0) {
3547
4496
  commitValue(optionList[nextIndex].value, optionList[nextIndex].disabled);
3548
4497
  }
@@ -4035,7 +4984,7 @@ function useBaseTableContext(appearance) {
4035
4984
  }
4036
4985
  };
4037
4986
  }
4038
- function toCssSize(value) {
4987
+ function toCssSize2(value) {
4039
4988
  if (value === void 0) return void 0;
4040
4989
  return typeof value === "number" ? `${value}px` : value;
4041
4990
  }
@@ -4248,7 +5197,7 @@ function BaseTableRow({
4248
5197
  }
4249
5198
  );
4250
5199
  }
4251
- function BaseTableHead({
5200
+ var BaseTableHead = react.forwardRef(function BaseTableHead2({
4252
5201
  columnId,
4253
5202
  align = "left",
4254
5203
  icon,
@@ -4276,10 +5225,18 @@ function BaseTableHead({
4276
5225
  onDragOver,
4277
5226
  onDrop,
4278
5227
  ...headProps
4279
- }) {
5228
+ }, forwardedRef) {
4280
5229
  const tableContext = useBaseTableContext(appearance);
4281
5230
  const { theme } = tableContext;
4282
5231
  const headRef = react.useRef(null);
5232
+ const setHeadRef = (node) => {
5233
+ headRef.current = node;
5234
+ if (typeof forwardedRef === "function") {
5235
+ forwardedRef(node);
5236
+ } else if (forwardedRef) {
5237
+ forwardedRef.current = node;
5238
+ }
5239
+ };
4283
5240
  const controlledWidth = columnId && tableContext.columnSizes?.[columnId] !== void 0 ? tableContext.columnSizes[columnId] : width;
4284
5241
  const canDrag = Boolean(
4285
5242
  columnId && draggable !== false && (draggable || tableContext.columnDragEnabled) && tableContext.columnOrder && tableContext.onColumnOrderChange
@@ -4434,7 +5391,7 @@ function BaseTableHead({
4434
5391
  "th",
4435
5392
  {
4436
5393
  ...headProps,
4437
- ref: headRef,
5394
+ ref: setHeadRef,
4438
5395
  scope: headProps.scope ?? "col",
4439
5396
  "aria-sort": ariaSort,
4440
5397
  className: cn(
@@ -4446,9 +5403,9 @@ function BaseTableHead({
4446
5403
  ),
4447
5404
  style: {
4448
5405
  ...theme.styles.tableHead,
4449
- width: toCssSize(controlledWidth),
4450
- minWidth: toCssSize(minWidth),
4451
- maxWidth: toCssSize(maxWidth),
5406
+ width: toCssSize2(controlledWidth),
5407
+ minWidth: toCssSize2(minWidth),
5408
+ maxWidth: toCssSize2(maxWidth),
4452
5409
  ...style
4453
5410
  },
4454
5411
  onDragOver: handleDragOver,
@@ -4469,7 +5426,7 @@ function BaseTableHead({
4469
5426
  ]
4470
5427
  }
4471
5428
  );
4472
- }
5429
+ });
4473
5430
  function BaseTableCell({
4474
5431
  align = "left",
4475
5432
  appearance,
@@ -4597,7 +5554,7 @@ function BaseTableLoading({
4597
5554
  classNames?.skeleton
4598
5555
  ),
4599
5556
  style: {
4600
- width: toCssSize(columnWidths[columnIndex])
5557
+ width: toCssSize2(columnWidths[columnIndex])
4601
5558
  }
4602
5559
  }
4603
5560
  )
@@ -4928,7 +5885,12 @@ exports.BaseDropdownMenu = BaseDropdownMenu;
4928
5885
  exports.BaseEmptyState = BaseEmptyState;
4929
5886
  exports.BaseField = BaseField;
4930
5887
  exports.BaseInput = BaseInput;
5888
+ exports.BaseLayout = BaseLayout;
5889
+ exports.BaseLayoutPane = BaseLayoutPane;
5890
+ exports.BaseLayoutResizeHandle = BaseLayoutResizeHandle;
5891
+ exports.BaseLayoutSplit = BaseLayoutSplit;
4931
5892
  exports.BaseLoadingState = BaseLoadingState;
5893
+ exports.BaseMultiSelect = BaseMultiSelect;
4932
5894
  exports.BaseNotice = BaseNotice;
4933
5895
  exports.BasePagination = BasePagination;
4934
5896
  exports.BasePanel = BasePanel;