@geomak/ui 5.9.0 → 5.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -707,6 +707,8 @@ interface TooltipProps {
707
707
  delayDuration?: number;
708
708
  /** Offset from trigger in px (default 8) */
709
709
  sideOffset?: number;
710
+ /** Extra classes merged onto the tooltip content bubble. */
711
+ className?: string;
710
712
  }
711
713
  /**
712
714
  * Tooltip powered by Radix Tooltip.
@@ -723,7 +725,7 @@ interface TooltipProps {
723
725
  * </Tooltip>
724
726
  * </TooltipProvider>
725
727
  */
726
- declare function Tooltip({ children, title, placement, delayDuration, sideOffset, }: TooltipProps): react_jsx_runtime.JSX.Element;
728
+ declare function Tooltip({ children, title, placement, delayDuration, sideOffset, className, }: TooltipProps): react_jsx_runtime.JSX.Element;
727
729
 
728
730
  declare const TooltipProvider: React__default.FC<TooltipPrimitive.TooltipProviderProps>;
729
731
 
@@ -779,6 +781,10 @@ interface TreeProps {
779
781
  onNodeClick: (payload: TreeItemClickPayload) => void;
780
782
  defaultExpandAll?: boolean;
781
783
  defaultExpandedKeys?: string[];
784
+ /** Extra classes merged onto the tree root. */
785
+ className?: string;
786
+ /** Inline style on the tree root. */
787
+ style?: React__default.CSSProperties;
782
788
  }
783
789
  /** ─────────────────── public component ─────────────────── */
784
790
  /**
@@ -795,7 +801,7 @@ interface TreeProps {
795
801
  * defaultExpandAll
796
802
  * />
797
803
  */
798
- declare function Tree({ nodes, onNodeClick, defaultExpandAll, defaultExpandedKeys, }: TreeProps): react_jsx_runtime.JSX.Element;
804
+ declare function Tree({ nodes, onNodeClick, defaultExpandAll, defaultExpandedKeys, className, style, }: TreeProps): react_jsx_runtime.JSX.Element;
799
805
 
800
806
  /** ─────────────────── types ─────────────────── */
801
807
  type NotificationType = 'info' | 'success' | 'warning' | 'danger';
@@ -873,6 +879,8 @@ interface LoadingSpinnerProps {
873
879
  * previous state. Ignored when `inline` is true.
874
880
  */
875
881
  backdropOpacity?: number;
882
+ /** Extra classes merged onto the spinner root. */
883
+ className?: string;
876
884
  }
877
885
  /**
878
886
  * Enterprise-grade loading indicator.
@@ -917,7 +925,7 @@ interface LoadingSpinnerProps {
917
925
  * />
918
926
  * ```
919
927
  */
920
- declare function LoadingSpinner({ prompt, size, inline, spinnerColor, textColor, backdropOpacity, }: LoadingSpinnerProps): react_jsx_runtime.JSX.Element;
928
+ declare function LoadingSpinner({ prompt, size, inline, spinnerColor, textColor, backdropOpacity, className, }: LoadingSpinnerProps): react_jsx_runtime.JSX.Element;
921
929
 
922
930
  interface FadingBaseProps {
923
931
  className?: string;
@@ -1039,6 +1047,8 @@ interface ScalableContainerProps {
1039
1047
  * Default `'top-right'` — matches the OS-window convention.
1040
1048
  */
1041
1049
  togglePosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
1050
+ /** Extra classes merged onto the container root. */
1051
+ className?: string;
1042
1052
  }
1043
1053
  /**
1044
1054
  * Container that smoothly expands to fill its parent on click and
@@ -1065,7 +1075,7 @@ interface ScalableContainerProps {
1065
1075
  * </ScalableContainer>
1066
1076
  * ```
1067
1077
  */
1068
- declare function ScalableContainer({ width, height, expandedWidth, expandedHeight, expanded, onExpandedChange, children, assignClassOnClick, expandIcon, collapseIcon, togglePosition, }: ScalableContainerProps): react_jsx_runtime.JSX.Element;
1078
+ declare function ScalableContainer({ width, height, expandedWidth, expandedHeight, expanded, onExpandedChange, children, assignClassOnClick, expandIcon, collapseIcon, togglePosition, className, }: ScalableContainerProps): react_jsx_runtime.JSX.Element;
1069
1079
 
1070
1080
  interface GridCardItem {
1071
1081
  key: string | number;
@@ -1106,6 +1116,8 @@ interface OpaqueGridCardProps {
1106
1116
  isRight?: boolean;
1107
1117
  buttonText?: string;
1108
1118
  onOpen?: (item: GridCardItem) => void;
1119
+ /** Extra classes merged onto the card root. */
1120
+ className?: string;
1109
1121
  }
1110
1122
  /**
1111
1123
  * Opaque carousel variant of GridCard (left or right edge of the carousel).
@@ -1116,29 +1128,33 @@ interface OpaqueGridCardProps {
1116
1128
  * @example
1117
1129
  * <OpaqueGridCard item={sideItem} isRight onOpen={({ to }) => navigate(to!)} />
1118
1130
  */
1119
- declare function OpaqueGridCard({ item, isRight, buttonText, onOpen, }: OpaqueGridCardProps): react_jsx_runtime.JSX.Element;
1131
+ declare function OpaqueGridCard({ item, isRight, buttonText, onOpen, className, }: OpaqueGridCardProps): react_jsx_runtime.JSX.Element;
1120
1132
 
1121
1133
  interface CatalogGridProps {
1122
1134
  items: GridCardItem[];
1123
1135
  buttonText?: string;
1124
1136
  onOpen?: (item: GridCardItem) => void;
1137
+ /** Extra classes merged onto the grid root. */
1138
+ className?: string;
1125
1139
  }
1126
1140
  /**
1127
1141
  * Wrapping flex grid of `GridCard` tiles.
1128
1142
  */
1129
- declare function CatalogGrid({ items, buttonText, onOpen }: CatalogGridProps): react_jsx_runtime.JSX.Element;
1143
+ declare function CatalogGrid({ items, buttonText, onOpen, className }: CatalogGridProps): react_jsx_runtime.JSX.Element;
1130
1144
 
1131
1145
  interface CatalogCarouselProps {
1132
1146
  items: GridCardItem[];
1133
1147
  buttonText?: string;
1134
1148
  onOpen?: (item: GridCardItem) => void;
1149
+ /** Extra classes merged onto the carousel root. */
1150
+ className?: string;
1135
1151
  }
1136
1152
  /**
1137
1153
  * Three-card carousel (previous → active (scaled) → next).
1138
1154
  *
1139
1155
  * Decoupled from ThemeContext — uses CSS `dark:` classes.
1140
1156
  */
1141
- declare function CatalogCarousel({ items, buttonText, onOpen }: CatalogCarouselProps): react_jsx_runtime.JSX.Element;
1157
+ declare function CatalogCarousel({ items, buttonText, onOpen, className }: CatalogCarouselProps): react_jsx_runtime.JSX.Element;
1142
1158
 
1143
1159
  interface CatalogProps {
1144
1160
  /** 'grid' | 'carousel' */
@@ -1146,6 +1162,8 @@ interface CatalogProps {
1146
1162
  items?: GridCardItem[];
1147
1163
  buttonText?: string;
1148
1164
  onOpen?: (item: GridCardItem) => void;
1165
+ /** Extra classes merged onto the catalog root. */
1166
+ className?: string;
1149
1167
  }
1150
1168
  /**
1151
1169
  * Switches between grid and carousel layouts for a list of application tiles.
@@ -1153,7 +1171,7 @@ interface CatalogProps {
1153
1171
  * @example
1154
1172
  * <Catalog display="carousel" items={apps} onOpen={({ to }) => navigate(to!)} />
1155
1173
  */
1156
- declare function Catalog({ display, items, buttonText, onOpen }: CatalogProps): react_jsx_runtime.JSX.Element;
1174
+ declare function Catalog({ display, items, buttonText, onOpen, className }: CatalogProps): react_jsx_runtime.JSX.Element;
1157
1175
 
1158
1176
  /**
1159
1177
  * A single action in the context menu.
@@ -1184,6 +1202,8 @@ interface ContextMenuProps {
1184
1202
  * component / div / image — anything you can right-click on.
1185
1203
  */
1186
1204
  children: React__default.ReactNode;
1205
+ /** Extra classes merged onto the menu content panel. */
1206
+ className?: string;
1187
1207
  }
1188
1208
  /**
1189
1209
  * Right-click context menu, built on `@radix-ui/react-context-menu`.
@@ -1222,7 +1242,7 @@ interface ContextMenuProps {
1222
1242
  * </ContextMenu>
1223
1243
  * ```
1224
1244
  */
1225
- declare function ContextMenu({ items, children }: ContextMenuProps): react_jsx_runtime.JSX.Element;
1245
+ declare function ContextMenu({ items, children, className }: ContextMenuProps): react_jsx_runtime.JSX.Element;
1226
1246
  /** @deprecated The Radix rewrite positions the menu automatically — no coordinates needed. */
1227
1247
  interface ContextMenuPosition {
1228
1248
  x: number;
@@ -1449,6 +1469,8 @@ interface ThemeSwitchProps {
1449
1469
  }) => void;
1450
1470
  /** Optional accessible label (defaults to "Toggle dark mode") */
1451
1471
  label?: string;
1472
+ /** Extra classes merged onto the root label. */
1473
+ className?: string;
1452
1474
  }
1453
1475
  /**
1454
1476
  * Theme (dark-mode) toggle switch powered by Radix Switch.
@@ -1460,7 +1482,7 @@ interface ThemeSwitchProps {
1460
1482
  * @example
1461
1483
  * <ThemeSwitch checked={isDark} onChange={({ target }) => setDark(target.checked)} />
1462
1484
  */
1463
- declare function ThemeSwitch({ checked, onChange, label }: ThemeSwitchProps): react_jsx_runtime.JSX.Element;
1485
+ declare function ThemeSwitch({ checked, onChange, label, className }: ThemeSwitchProps): react_jsx_runtime.JSX.Element;
1464
1486
 
1465
1487
  interface TopBarProps {
1466
1488
  /** Brand area — logo, wordmark, or app name. Rendered on the leading edge. */
@@ -2772,6 +2794,8 @@ interface DatePickerProps {
2772
2794
  clearable?: boolean;
2773
2795
  /** Size preset. Default `'md'`. */
2774
2796
  size?: FieldSize;
2797
+ /** Extra classes merged onto the component root. */
2798
+ className?: string;
2775
2799
  }
2776
2800
  type TemporalPickerProps = DatePickerProps;
2777
2801
  /**
@@ -2809,7 +2833,7 @@ type TemporalPickerProps = DatePickerProps;
2809
2833
  * />
2810
2834
  * ```
2811
2835
  */
2812
- declare function DatePicker({ value, onChange, label, placeholder, htmlFor, name: _name, layout, helperText, required, disabled, errorMessage, min, max, style, format, weekStartsOn, clearable, size, }: DatePickerProps): react_jsx_runtime.JSX.Element;
2836
+ declare function DatePicker({ value, onChange, label, placeholder, htmlFor, name: _name, layout, helperText, required, disabled, errorMessage, min, max, style, format, weekStartsOn, clearable, size, className, }: DatePickerProps): react_jsx_runtime.JSX.Element;
2813
2837
 
2814
2838
  interface TextAreaProps {
2815
2839
  /** Controlled value. */
package/dist/index.d.ts CHANGED
@@ -707,6 +707,8 @@ interface TooltipProps {
707
707
  delayDuration?: number;
708
708
  /** Offset from trigger in px (default 8) */
709
709
  sideOffset?: number;
710
+ /** Extra classes merged onto the tooltip content bubble. */
711
+ className?: string;
710
712
  }
711
713
  /**
712
714
  * Tooltip powered by Radix Tooltip.
@@ -723,7 +725,7 @@ interface TooltipProps {
723
725
  * </Tooltip>
724
726
  * </TooltipProvider>
725
727
  */
726
- declare function Tooltip({ children, title, placement, delayDuration, sideOffset, }: TooltipProps): react_jsx_runtime.JSX.Element;
728
+ declare function Tooltip({ children, title, placement, delayDuration, sideOffset, className, }: TooltipProps): react_jsx_runtime.JSX.Element;
727
729
 
728
730
  declare const TooltipProvider: React__default.FC<TooltipPrimitive.TooltipProviderProps>;
729
731
 
@@ -779,6 +781,10 @@ interface TreeProps {
779
781
  onNodeClick: (payload: TreeItemClickPayload) => void;
780
782
  defaultExpandAll?: boolean;
781
783
  defaultExpandedKeys?: string[];
784
+ /** Extra classes merged onto the tree root. */
785
+ className?: string;
786
+ /** Inline style on the tree root. */
787
+ style?: React__default.CSSProperties;
782
788
  }
783
789
  /** ─────────────────── public component ─────────────────── */
784
790
  /**
@@ -795,7 +801,7 @@ interface TreeProps {
795
801
  * defaultExpandAll
796
802
  * />
797
803
  */
798
- declare function Tree({ nodes, onNodeClick, defaultExpandAll, defaultExpandedKeys, }: TreeProps): react_jsx_runtime.JSX.Element;
804
+ declare function Tree({ nodes, onNodeClick, defaultExpandAll, defaultExpandedKeys, className, style, }: TreeProps): react_jsx_runtime.JSX.Element;
799
805
 
800
806
  /** ─────────────────── types ─────────────────── */
801
807
  type NotificationType = 'info' | 'success' | 'warning' | 'danger';
@@ -873,6 +879,8 @@ interface LoadingSpinnerProps {
873
879
  * previous state. Ignored when `inline` is true.
874
880
  */
875
881
  backdropOpacity?: number;
882
+ /** Extra classes merged onto the spinner root. */
883
+ className?: string;
876
884
  }
877
885
  /**
878
886
  * Enterprise-grade loading indicator.
@@ -917,7 +925,7 @@ interface LoadingSpinnerProps {
917
925
  * />
918
926
  * ```
919
927
  */
920
- declare function LoadingSpinner({ prompt, size, inline, spinnerColor, textColor, backdropOpacity, }: LoadingSpinnerProps): react_jsx_runtime.JSX.Element;
928
+ declare function LoadingSpinner({ prompt, size, inline, spinnerColor, textColor, backdropOpacity, className, }: LoadingSpinnerProps): react_jsx_runtime.JSX.Element;
921
929
 
922
930
  interface FadingBaseProps {
923
931
  className?: string;
@@ -1039,6 +1047,8 @@ interface ScalableContainerProps {
1039
1047
  * Default `'top-right'` — matches the OS-window convention.
1040
1048
  */
1041
1049
  togglePosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
1050
+ /** Extra classes merged onto the container root. */
1051
+ className?: string;
1042
1052
  }
1043
1053
  /**
1044
1054
  * Container that smoothly expands to fill its parent on click and
@@ -1065,7 +1075,7 @@ interface ScalableContainerProps {
1065
1075
  * </ScalableContainer>
1066
1076
  * ```
1067
1077
  */
1068
- declare function ScalableContainer({ width, height, expandedWidth, expandedHeight, expanded, onExpandedChange, children, assignClassOnClick, expandIcon, collapseIcon, togglePosition, }: ScalableContainerProps): react_jsx_runtime.JSX.Element;
1078
+ declare function ScalableContainer({ width, height, expandedWidth, expandedHeight, expanded, onExpandedChange, children, assignClassOnClick, expandIcon, collapseIcon, togglePosition, className, }: ScalableContainerProps): react_jsx_runtime.JSX.Element;
1069
1079
 
1070
1080
  interface GridCardItem {
1071
1081
  key: string | number;
@@ -1106,6 +1116,8 @@ interface OpaqueGridCardProps {
1106
1116
  isRight?: boolean;
1107
1117
  buttonText?: string;
1108
1118
  onOpen?: (item: GridCardItem) => void;
1119
+ /** Extra classes merged onto the card root. */
1120
+ className?: string;
1109
1121
  }
1110
1122
  /**
1111
1123
  * Opaque carousel variant of GridCard (left or right edge of the carousel).
@@ -1116,29 +1128,33 @@ interface OpaqueGridCardProps {
1116
1128
  * @example
1117
1129
  * <OpaqueGridCard item={sideItem} isRight onOpen={({ to }) => navigate(to!)} />
1118
1130
  */
1119
- declare function OpaqueGridCard({ item, isRight, buttonText, onOpen, }: OpaqueGridCardProps): react_jsx_runtime.JSX.Element;
1131
+ declare function OpaqueGridCard({ item, isRight, buttonText, onOpen, className, }: OpaqueGridCardProps): react_jsx_runtime.JSX.Element;
1120
1132
 
1121
1133
  interface CatalogGridProps {
1122
1134
  items: GridCardItem[];
1123
1135
  buttonText?: string;
1124
1136
  onOpen?: (item: GridCardItem) => void;
1137
+ /** Extra classes merged onto the grid root. */
1138
+ className?: string;
1125
1139
  }
1126
1140
  /**
1127
1141
  * Wrapping flex grid of `GridCard` tiles.
1128
1142
  */
1129
- declare function CatalogGrid({ items, buttonText, onOpen }: CatalogGridProps): react_jsx_runtime.JSX.Element;
1143
+ declare function CatalogGrid({ items, buttonText, onOpen, className }: CatalogGridProps): react_jsx_runtime.JSX.Element;
1130
1144
 
1131
1145
  interface CatalogCarouselProps {
1132
1146
  items: GridCardItem[];
1133
1147
  buttonText?: string;
1134
1148
  onOpen?: (item: GridCardItem) => void;
1149
+ /** Extra classes merged onto the carousel root. */
1150
+ className?: string;
1135
1151
  }
1136
1152
  /**
1137
1153
  * Three-card carousel (previous → active (scaled) → next).
1138
1154
  *
1139
1155
  * Decoupled from ThemeContext — uses CSS `dark:` classes.
1140
1156
  */
1141
- declare function CatalogCarousel({ items, buttonText, onOpen }: CatalogCarouselProps): react_jsx_runtime.JSX.Element;
1157
+ declare function CatalogCarousel({ items, buttonText, onOpen, className }: CatalogCarouselProps): react_jsx_runtime.JSX.Element;
1142
1158
 
1143
1159
  interface CatalogProps {
1144
1160
  /** 'grid' | 'carousel' */
@@ -1146,6 +1162,8 @@ interface CatalogProps {
1146
1162
  items?: GridCardItem[];
1147
1163
  buttonText?: string;
1148
1164
  onOpen?: (item: GridCardItem) => void;
1165
+ /** Extra classes merged onto the catalog root. */
1166
+ className?: string;
1149
1167
  }
1150
1168
  /**
1151
1169
  * Switches between grid and carousel layouts for a list of application tiles.
@@ -1153,7 +1171,7 @@ interface CatalogProps {
1153
1171
  * @example
1154
1172
  * <Catalog display="carousel" items={apps} onOpen={({ to }) => navigate(to!)} />
1155
1173
  */
1156
- declare function Catalog({ display, items, buttonText, onOpen }: CatalogProps): react_jsx_runtime.JSX.Element;
1174
+ declare function Catalog({ display, items, buttonText, onOpen, className }: CatalogProps): react_jsx_runtime.JSX.Element;
1157
1175
 
1158
1176
  /**
1159
1177
  * A single action in the context menu.
@@ -1184,6 +1202,8 @@ interface ContextMenuProps {
1184
1202
  * component / div / image — anything you can right-click on.
1185
1203
  */
1186
1204
  children: React__default.ReactNode;
1205
+ /** Extra classes merged onto the menu content panel. */
1206
+ className?: string;
1187
1207
  }
1188
1208
  /**
1189
1209
  * Right-click context menu, built on `@radix-ui/react-context-menu`.
@@ -1222,7 +1242,7 @@ interface ContextMenuProps {
1222
1242
  * </ContextMenu>
1223
1243
  * ```
1224
1244
  */
1225
- declare function ContextMenu({ items, children }: ContextMenuProps): react_jsx_runtime.JSX.Element;
1245
+ declare function ContextMenu({ items, children, className }: ContextMenuProps): react_jsx_runtime.JSX.Element;
1226
1246
  /** @deprecated The Radix rewrite positions the menu automatically — no coordinates needed. */
1227
1247
  interface ContextMenuPosition {
1228
1248
  x: number;
@@ -1449,6 +1469,8 @@ interface ThemeSwitchProps {
1449
1469
  }) => void;
1450
1470
  /** Optional accessible label (defaults to "Toggle dark mode") */
1451
1471
  label?: string;
1472
+ /** Extra classes merged onto the root label. */
1473
+ className?: string;
1452
1474
  }
1453
1475
  /**
1454
1476
  * Theme (dark-mode) toggle switch powered by Radix Switch.
@@ -1460,7 +1482,7 @@ interface ThemeSwitchProps {
1460
1482
  * @example
1461
1483
  * <ThemeSwitch checked={isDark} onChange={({ target }) => setDark(target.checked)} />
1462
1484
  */
1463
- declare function ThemeSwitch({ checked, onChange, label }: ThemeSwitchProps): react_jsx_runtime.JSX.Element;
1485
+ declare function ThemeSwitch({ checked, onChange, label, className }: ThemeSwitchProps): react_jsx_runtime.JSX.Element;
1464
1486
 
1465
1487
  interface TopBarProps {
1466
1488
  /** Brand area — logo, wordmark, or app name. Rendered on the leading edge. */
@@ -2772,6 +2794,8 @@ interface DatePickerProps {
2772
2794
  clearable?: boolean;
2773
2795
  /** Size preset. Default `'md'`. */
2774
2796
  size?: FieldSize;
2797
+ /** Extra classes merged onto the component root. */
2798
+ className?: string;
2775
2799
  }
2776
2800
  type TemporalPickerProps = DatePickerProps;
2777
2801
  /**
@@ -2809,7 +2833,7 @@ type TemporalPickerProps = DatePickerProps;
2809
2833
  * />
2810
2834
  * ```
2811
2835
  */
2812
- declare function DatePicker({ value, onChange, label, placeholder, htmlFor, name: _name, layout, helperText, required, disabled, errorMessage, min, max, style, format, weekStartsOn, clearable, size, }: DatePickerProps): react_jsx_runtime.JSX.Element;
2836
+ declare function DatePicker({ value, onChange, label, placeholder, htmlFor, name: _name, layout, helperText, required, disabled, errorMessage, min, max, style, format, weekStartsOn, clearable, size, className, }: DatePickerProps): react_jsx_runtime.JSX.Element;
2813
2837
 
2814
2838
  interface TextAreaProps {
2815
2839
  /** Controlled value. */
package/dist/index.js CHANGED
@@ -883,7 +883,8 @@ function Tooltip({
883
883
  title,
884
884
  placement = "top",
885
885
  delayDuration = 300,
886
- sideOffset = 8
886
+ sideOffset = 8,
887
+ className = ""
887
888
  }) {
888
889
  return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { delayDuration, children: /* @__PURE__ */ jsxs(TooltipPrimitive.Root, { children: [
889
890
  /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: "inline-flex", children }) }),
@@ -903,8 +904,9 @@ function Tooltip({
903
904
  // Out animation (always the same — just fade)
904
905
  "data-[state=closed]:animate-tooltip-out",
905
906
  // In animation — direction-aware
906
- ANIMATION[placement]
907
- ].join(" "),
907
+ ANIMATION[placement],
908
+ className
909
+ ].filter(Boolean).join(" "),
908
910
  children: [
909
911
  title,
910
912
  /* @__PURE__ */ jsx(
@@ -1137,9 +1139,11 @@ function Tree({
1137
1139
  nodes,
1138
1140
  onNodeClick,
1139
1141
  defaultExpandAll = false,
1140
- defaultExpandedKeys = []
1142
+ defaultExpandedKeys = [],
1143
+ className = "",
1144
+ style
1141
1145
  }) {
1142
- return /* @__PURE__ */ jsx("div", { className: "p-1 w-full", children: nodes.map((item) => /* @__PURE__ */ jsx(
1146
+ return /* @__PURE__ */ jsx("div", { className: `p-1 w-full ${className}`.trim(), style, children: nodes.map((item) => /* @__PURE__ */ jsx(
1143
1147
  TreeNodeItem,
1144
1148
  {
1145
1149
  item,
@@ -1406,7 +1410,8 @@ function LoadingSpinner({
1406
1410
  inline = false,
1407
1411
  spinnerColor,
1408
1412
  textColor,
1409
- backdropOpacity = 0.8
1413
+ backdropOpacity = 0.8,
1414
+ className = ""
1410
1415
  }) {
1411
1416
  const reduced = useReducedMotion();
1412
1417
  const letters = prompt ? Array.from(prompt) : [];
@@ -1441,7 +1446,7 @@ function LoadingSpinner({
1441
1446
  role: "status",
1442
1447
  "aria-live": "polite",
1443
1448
  "aria-label": prompt ?? "Loading",
1444
- className: "flex flex-col items-center justify-center gap-3",
1449
+ className: `flex flex-col items-center justify-center gap-3 ${className}`.trim(),
1445
1450
  children: content
1446
1451
  }
1447
1452
  );
@@ -1452,7 +1457,7 @@ function LoadingSpinner({
1452
1457
  role: "status",
1453
1458
  "aria-live": "polite",
1454
1459
  "aria-label": prompt ?? "Loading",
1455
- className: "fixed inset-0 z-[8000000] flex flex-col items-center justify-center gap-6 bg-background backdrop-blur-sm",
1460
+ className: `fixed inset-0 z-[8000000] flex flex-col items-center justify-center gap-6 bg-background backdrop-blur-sm ${className}`.trim(),
1456
1461
  style: { opacity: backdropOpacity },
1457
1462
  children: content
1458
1463
  }
@@ -1561,7 +1566,8 @@ function ScalableContainer({
1561
1566
  assignClassOnClick,
1562
1567
  expandIcon,
1563
1568
  collapseIcon,
1564
- togglePosition = "top-right"
1569
+ togglePosition = "top-right",
1570
+ className = ""
1565
1571
  }) {
1566
1572
  const containerRef = useRef(null);
1567
1573
  const [internalScaled, setInternalScaled] = useState(false);
@@ -1596,8 +1602,9 @@ function ScalableContainer({
1596
1602
  // OS-window aesthetic: subtle elevation at rest, lifted shadow
1597
1603
  // when expanded. No background colour change.
1598
1604
  isScaled ? "shadow-2xl" : "shadow-md",
1599
- "transition-shadow duration-300"
1600
- ].join(" "),
1605
+ "transition-shadow duration-300",
1606
+ className
1607
+ ].filter(Boolean).join(" "),
1601
1608
  children: [
1602
1609
  /* @__PURE__ */ jsx(Tooltip, { placement: "bottom", title: isScaled ? "Collapse" : "Expand", children: /* @__PURE__ */ jsx(
1603
1610
  "button",
@@ -1649,12 +1656,13 @@ function OpaqueGridCard({
1649
1656
  item,
1650
1657
  isRight = false,
1651
1658
  buttonText = "Open Application",
1652
- onOpen
1659
+ onOpen,
1660
+ className = ""
1653
1661
  }) {
1654
1662
  return /* @__PURE__ */ jsxs(
1655
1663
  "div",
1656
1664
  {
1657
- className: `flex flex-col w-[200px] h-[250px] rounded-lg items-center p-2 ${!isRight ? "opaque-carousel-card-left dark:opaque-carousel-card-dark-left" : "opaque-carousel-card-right dark:opaque-carousel-card-dark-right"}`,
1665
+ className: `flex flex-col w-[200px] h-[250px] rounded-lg items-center p-2 ${!isRight ? "opaque-carousel-card-left dark:opaque-carousel-card-dark-left" : "opaque-carousel-card-right dark:opaque-carousel-card-dark-right"} ${className}`.trim(),
1658
1666
  children: [
1659
1667
  /* @__PURE__ */ jsx(
1660
1668
  "div",
@@ -1696,10 +1704,10 @@ function OpaqueGridCard({
1696
1704
  }
1697
1705
  );
1698
1706
  }
1699
- function CatalogGrid({ items, buttonText, onOpen }) {
1700
- return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: items.map((item) => /* @__PURE__ */ jsx(GridCard, { item, buttonText, onOpen }, item.key)) });
1707
+ function CatalogGrid({ items, buttonText, onOpen, className = "" }) {
1708
+ return /* @__PURE__ */ jsx("div", { className: `flex flex-wrap gap-2 ${className}`.trim(), children: items.map((item) => /* @__PURE__ */ jsx(GridCard, { item, buttonText, onOpen }, item.key)) });
1701
1709
  }
1702
- function CatalogCarousel({ items, buttonText, onOpen }) {
1710
+ function CatalogCarousel({ items, buttonText, onOpen, className = "" }) {
1703
1711
  const [activeIndex, setActiveIndex] = useState(0);
1704
1712
  const [indexPool, setIndexPool] = useState([]);
1705
1713
  const cardRefs = useRef([]);
@@ -1736,7 +1744,7 @@ function CatalogCarousel({ items, buttonText, onOpen }) {
1736
1744
  }, [activeIndex, getIndexes, items.length]);
1737
1745
  const nextApp = () => setActiveIndex((prev) => prev + 1 === items.length ? 0 : prev + 1);
1738
1746
  const previousApp = () => setActiveIndex((prev) => prev - 1 === -1 ? items.length - 1 : prev - 1);
1739
- return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-full h-full", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-10", children: [
1747
+ return /* @__PURE__ */ jsx("div", { className: `flex items-center justify-center w-full h-full ${className}`.trim(), children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-10", children: [
1740
1748
  /* @__PURE__ */ jsx(
1741
1749
  "button",
1742
1750
  {
@@ -1786,16 +1794,16 @@ function CatalogCarousel({ items, buttonText, onOpen }) {
1786
1794
  )
1787
1795
  ] }) });
1788
1796
  }
1789
- function Catalog({ display: display2 = "grid", items = [], buttonText, onOpen }) {
1790
- return /* @__PURE__ */ jsx("div", { className: "w-full h-full", children: display2 === "grid" ? /* @__PURE__ */ jsx(CatalogGrid, { items, buttonText, onOpen }) : /* @__PURE__ */ jsx(CatalogCarousel, { items, buttonText, onOpen }) });
1797
+ function Catalog({ display: display2 = "grid", items = [], buttonText, onOpen, className = "" }) {
1798
+ return /* @__PURE__ */ jsx("div", { className: `w-full h-full ${className}`.trim(), children: display2 === "grid" ? /* @__PURE__ */ jsx(CatalogGrid, { items, buttonText, onOpen }) : /* @__PURE__ */ jsx(CatalogCarousel, { items, buttonText, onOpen }) });
1791
1799
  }
1792
- function ContextMenu({ items, children }) {
1800
+ function ContextMenu({ items, children, className = "" }) {
1793
1801
  return /* @__PURE__ */ jsxs(ContextMenuPrimitive.Root, { children: [
1794
1802
  /* @__PURE__ */ jsx(ContextMenuPrimitive.Trigger, { asChild: true, children }),
1795
1803
  /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
1796
1804
  ContextMenuPrimitive.Content,
1797
1805
  {
1798
- className: CONTENT_CLASSNAME,
1806
+ className: `${CONTENT_CLASSNAME} ${className}`.trim(),
1799
1807
  collisionPadding: 8,
1800
1808
  children: items.map((item) => renderItem(item))
1801
1809
  }
@@ -2980,9 +2988,9 @@ function TableSkeletonBody({
2980
2988
  i
2981
2989
  )) });
2982
2990
  }
2983
- function ThemeSwitch({ checked, onChange, label = "Toggle dark mode" }) {
2991
+ function ThemeSwitch({ checked, onChange, label = "Toggle dark mode", className = "" }) {
2984
2992
  const id = useId();
2985
- return /* @__PURE__ */ jsx("label", { htmlFor: id, className: "flex items-center gap-2 cursor-pointer select-none", children: /* @__PURE__ */ jsx(
2993
+ return /* @__PURE__ */ jsx("label", { htmlFor: id, className: `flex items-center gap-2 cursor-pointer select-none ${className}`.trim(), children: /* @__PURE__ */ jsx(
2986
2994
  SwitchPrimitive.Root,
2987
2995
  {
2988
2996
  id,
@@ -4604,7 +4612,8 @@ function DatePicker({
4604
4612
  format = defaultFormat,
4605
4613
  weekStartsOn = 0,
4606
4614
  clearable = true,
4607
- size = "md"
4615
+ size = "md",
4616
+ className = ""
4608
4617
  }) {
4609
4618
  const errorId = useId();
4610
4619
  const hasError = errorMessage != null;
@@ -4685,7 +4694,7 @@ function DatePicker({
4685
4694
  }
4686
4695
  };
4687
4696
  const displayValue = value ? format(value) : "";
4688
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
4697
+ return /* @__PURE__ */ jsxs("div", { className: `flex flex-col gap-1 ${className}`.trim(), children: [
4689
4698
  /* @__PURE__ */ jsxs("div", { className: `flex ${layout === "vertical" ? "flex-col gap-1.5" : "flex-row items-start gap-3"}`, children: [
4690
4699
  /* @__PURE__ */ jsx(
4691
4700
  FieldLabel,