@almadar/ui 5.4.0 → 5.5.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.
@@ -2190,7 +2190,7 @@ var init_Overlay = __esm({
2190
2190
  };
2191
2191
  }
2192
2192
  });
2193
- var sizeClasses2, minWidthClasses, Modal;
2193
+ var sizeClasses2, minWidthClasses, lookStyles, Modal;
2194
2194
  var init_Modal = __esm({
2195
2195
  "components/molecules/Modal.tsx"() {
2196
2196
  "use client";
@@ -2215,6 +2215,12 @@ var init_Modal = __esm({
2215
2215
  xl: "min-w-[700px] max-sm:min-w-0",
2216
2216
  full: "min-w-0"
2217
2217
  };
2218
+ lookStyles = {
2219
+ "centered-card": "",
2220
+ "top-sheet": "top-0 rounded-t-none rounded-b-container max-w-full w-full",
2221
+ "side-drawer": "right-0 top-0 bottom-0 h-full rounded-l-container rounded-r-none w-[400px] max-w-full",
2222
+ "full-screen": "inset-0 rounded-none w-full h-full max-w-full"
2223
+ };
2218
2224
  Modal = ({
2219
2225
  isOpen = true,
2220
2226
  onClose = () => {
@@ -2228,7 +2234,8 @@ var init_Modal = __esm({
2228
2234
  closeOnEscape = true,
2229
2235
  className,
2230
2236
  closeEvent,
2231
- swipeDownToClose = true
2237
+ swipeDownToClose = true,
2238
+ look = "centered-card"
2232
2239
  }) => {
2233
2240
  const eventBus = useEventBus();
2234
2241
  const modalRef = React85.useRef(null);
@@ -2313,6 +2320,7 @@ var init_Modal = __esm({
2313
2320
  // Mobile: take the entire screen. Override desktop max-w cap,
2314
2321
  // full height, no rounded corners, no min-width.
2315
2322
  "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2323
+ lookStyles[look],
2316
2324
  className
2317
2325
  ),
2318
2326
  style: dragY > 0 ? {
@@ -3887,7 +3895,7 @@ var init_Checkbox = __esm({
3887
3895
  Checkbox.displayName = "Checkbox";
3888
3896
  }
3889
3897
  });
3890
- var variantStyles4, paddingStyles2, shadowStyles2, lookStyles, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3898
+ var variantStyles4, paddingStyles2, shadowStyles2, lookStyles2, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3891
3899
  var init_Card = __esm({
3892
3900
  "components/atoms/Card.tsx"() {
3893
3901
  init_cn();
@@ -3935,7 +3943,7 @@ var init_Card = __esm({
3935
3943
  md: "shadow",
3936
3944
  lg: "shadow-elevation-dialog"
3937
3945
  };
3938
- lookStyles = {
3946
+ lookStyles2 = {
3939
3947
  elevated: "",
3940
3948
  "flat-bordered": "shadow-none border-[length:var(--border-width)] border-border",
3941
3949
  "borderless-divider": "shadow-none border-0 border-b border-border rounded-none",
@@ -3965,7 +3973,7 @@ var init_Card = __esm({
3965
3973
  "transition-all duration-[var(--transition-normal)]",
3966
3974
  variantStyles4[variant],
3967
3975
  paddingStyles2[padding],
3968
- lookStyles[look],
3976
+ lookStyles2[look],
3969
3977
  shadow && shadowStyles2[shadow],
3970
3978
  className
3971
3979
  ),
@@ -16193,7 +16201,7 @@ var init_BookTableOfContents = __esm({
16193
16201
  BookTableOfContents.displayName = "BookTableOfContents";
16194
16202
  }
16195
16203
  });
16196
- var ICON_NAME_ALIASES, EmptyState;
16204
+ var ICON_NAME_ALIASES, lookStyles3, EmptyState;
16197
16205
  var init_EmptyState = __esm({
16198
16206
  "components/molecules/EmptyState.tsx"() {
16199
16207
  "use client";
@@ -16210,6 +16218,12 @@ var init_EmptyState = __esm({
16210
16218
  error: "x-circle",
16211
16219
  warning: "alert-circle"
16212
16220
  };
16221
+ lookStyles3 = {
16222
+ "icon-only": "",
16223
+ illustrated: "[&_svg]:w-32 [&_svg]:h-32",
16224
+ "text-only": "[&_svg]:hidden",
16225
+ mascot: "[&_svg]:w-24 [&_svg]:h-24 [&_svg]:rounded-pill"
16226
+ };
16213
16227
  EmptyState = ({
16214
16228
  icon,
16215
16229
  title,
@@ -16220,7 +16234,8 @@ var init_EmptyState = __esm({
16220
16234
  className,
16221
16235
  destructive,
16222
16236
  variant,
16223
- actionEvent
16237
+ actionEvent,
16238
+ look = "icon-only"
16224
16239
  }) => {
16225
16240
  const eventBus = useEventBus();
16226
16241
  const { t } = useTranslate();
@@ -16240,6 +16255,7 @@ var init_EmptyState = __esm({
16240
16255
  align: "center",
16241
16256
  className: cn(
16242
16257
  "justify-center py-12 text-center",
16258
+ lookStyles3[look],
16243
16259
  className
16244
16260
  ),
16245
16261
  children: [
@@ -17480,7 +17496,7 @@ function useSafeEventBus2() {
17480
17496
  } };
17481
17497
  }
17482
17498
  }
17483
- var log8, ButtonGroup;
17499
+ var log8, lookStyles4, ButtonGroup;
17484
17500
  var init_ButtonGroup = __esm({
17485
17501
  "components/molecules/ButtonGroup.tsx"() {
17486
17502
  "use client";
@@ -17488,6 +17504,13 @@ var init_ButtonGroup = __esm({
17488
17504
  init_atoms();
17489
17505
  init_useEventBus();
17490
17506
  log8 = logger.createLogger("almadar:ui:button-group");
17507
+ lookStyles4 = {
17508
+ "right-aligned-buttons": "",
17509
+ "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
17510
+ "inline-row": "gap-2 inline-flex",
17511
+ "dropdown-menu": "[&>button:not(:first-child)]:hidden",
17512
+ "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
17513
+ };
17491
17514
  ButtonGroup = ({
17492
17515
  children,
17493
17516
  primary,
@@ -17497,7 +17520,8 @@ var init_ButtonGroup = __esm({
17497
17520
  className,
17498
17521
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
17499
17522
  entity: _entity,
17500
- filters
17523
+ filters,
17524
+ look = "right-aligned-buttons"
17501
17525
  }) => {
17502
17526
  const eventBus = useSafeEventBus2();
17503
17527
  const variantClasses2 = {
@@ -17574,6 +17598,7 @@ var init_ButtonGroup = __esm({
17574
17598
  "inline-flex gap-2",
17575
17599
  variantClasses2[variant],
17576
17600
  orientationClasses[orientation],
17601
+ lookStyles4[look],
17577
17602
  className
17578
17603
  ),
17579
17604
  role: "group",
@@ -20038,7 +20063,7 @@ var init_CastleTemplate = __esm({
20038
20063
  CastleTemplate.displayName = "CastleTemplate";
20039
20064
  }
20040
20065
  });
20041
- var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, Chart;
20066
+ var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, LOOK_FROM_CHART_TYPE, Chart;
20042
20067
  var init_Chart = __esm({
20043
20068
  "components/organisms/Chart.tsx"() {
20044
20069
  "use client";
@@ -20068,7 +20093,7 @@ var init_Chart = __esm({
20068
20093
  if (Number.isNaN(parsed.getTime())) return raw;
20069
20094
  return monthFormatter.format(parsed);
20070
20095
  };
20071
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
20096
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
20072
20097
  const categories = React85.useMemo(() => {
20073
20098
  const set = [];
20074
20099
  const seen = /* @__PURE__ */ new Set();
@@ -20106,6 +20131,64 @@ var init_Chart = __esm({
20106
20131
  }
20107
20132
  return m;
20108
20133
  }, [series, stack, columnTotals]);
20134
+ if (horizontal) {
20135
+ return /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "xs", align: "stretch", className: "w-full", style: { minHeight: height }, children: categories.map((label, catIdx) => {
20136
+ const displayLabel = timeAxis ? formatTimeLabel(label) : label;
20137
+ const total = columnTotals?.[catIdx] ?? 1;
20138
+ return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "w-full", children: [
20139
+ /* @__PURE__ */ jsxRuntime.jsx(
20140
+ Typography,
20141
+ {
20142
+ variant: "caption",
20143
+ color: "secondary",
20144
+ className: "truncate text-right",
20145
+ style: { width: 80, flexShrink: 0 },
20146
+ children: displayLabel
20147
+ }
20148
+ ),
20149
+ /* @__PURE__ */ jsxRuntime.jsx(
20150
+ HStack,
20151
+ {
20152
+ gap: stack === "none" ? "xs" : "none",
20153
+ align: "center",
20154
+ className: "flex-1 min-w-0",
20155
+ style: { height: 24 },
20156
+ children: series.map((s, sIdx) => {
20157
+ const value = valueAt(s, label);
20158
+ const ratio = stack === "normalize" ? total === 0 ? 0 : value / total * 100 : value / maxValue * 100;
20159
+ const color = seriesColor(s, sIdx);
20160
+ return /* @__PURE__ */ jsxRuntime.jsx(
20161
+ Box,
20162
+ {
20163
+ className: "h-full rounded-r-sm transition-all duration-500 ease-out min-w-[2px] cursor-pointer hover:opacity-80",
20164
+ style: {
20165
+ width: `${ratio}%`,
20166
+ backgroundColor: color
20167
+ },
20168
+ onClick: () => onPointClick?.(
20169
+ { label, value, color },
20170
+ s.name
20171
+ ),
20172
+ title: `${s.name}: ${value}`
20173
+ },
20174
+ s.name
20175
+ );
20176
+ })
20177
+ }
20178
+ ),
20179
+ showValues && series.length === 1 && /* @__PURE__ */ jsxRuntime.jsx(
20180
+ Typography,
20181
+ {
20182
+ variant: "caption",
20183
+ color: "secondary",
20184
+ className: "tabular-nums",
20185
+ style: { width: 40, flexShrink: 0 },
20186
+ children: valueAt(series[0], label)
20187
+ }
20188
+ )
20189
+ ] }, label);
20190
+ }) });
20191
+ }
20109
20192
  return /* @__PURE__ */ jsxRuntime.jsx(
20110
20193
  HStack,
20111
20194
  {
@@ -20533,10 +20616,20 @@ var init_Chart = __esm({
20533
20616
  }
20534
20617
  );
20535
20618
  };
20619
+ LOOK_FROM_CHART_TYPE = {
20620
+ bar: "bar-vertical",
20621
+ line: "line",
20622
+ pie: "pie",
20623
+ area: "area",
20624
+ donut: "donut",
20625
+ scatter: "scatter",
20626
+ histogram: "histogram"
20627
+ };
20536
20628
  Chart = ({
20537
20629
  title,
20538
20630
  subtitle,
20539
- chartType = "bar",
20631
+ chartType,
20632
+ look,
20540
20633
  series,
20541
20634
  data: simpleData,
20542
20635
  scatterData,
@@ -20552,6 +20645,7 @@ var init_Chart = __esm({
20552
20645
  error,
20553
20646
  className
20554
20647
  }) => {
20648
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
20555
20649
  const eventBus = useEventBus();
20556
20650
  const { t } = useTranslate();
20557
20651
  const handleAction = React85.useCallback(
@@ -20580,7 +20674,7 @@ var init_Chart = __esm({
20580
20674
  return [];
20581
20675
  }, [simpleData, series]);
20582
20676
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
20583
- const hasContent = chartType === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20677
+ const hasContent = resolvedLook === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20584
20678
  if (isLoading) {
20585
20679
  return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading chart...", className });
20586
20680
  }
@@ -20615,7 +20709,18 @@ var init_Chart = __esm({
20615
20709
  )) })
20616
20710
  ] }),
20617
20711
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "w-full", children: [
20618
- chartType === "bar" && /* @__PURE__ */ jsxRuntime.jsx(
20712
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsxRuntime.jsx(
20713
+ BarChart,
20714
+ {
20715
+ series: normalizedSeries,
20716
+ height,
20717
+ showValues,
20718
+ stack,
20719
+ timeAxis,
20720
+ onPointClick: handlePointClick
20721
+ }
20722
+ ),
20723
+ resolvedLook === "bar-horizontal" && /* @__PURE__ */ jsxRuntime.jsx(
20619
20724
  BarChart,
20620
20725
  {
20621
20726
  series: normalizedSeries,
@@ -20623,10 +20728,11 @@ var init_Chart = __esm({
20623
20728
  showValues,
20624
20729
  stack,
20625
20730
  timeAxis,
20731
+ horizontal: true,
20626
20732
  onPointClick: handlePointClick
20627
20733
  }
20628
20734
  ),
20629
- chartType === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
20735
+ resolvedLook === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
20630
20736
  BarChart,
20631
20737
  {
20632
20738
  series: normalizedSeries,
@@ -20638,7 +20744,7 @@ var init_Chart = __esm({
20638
20744
  onPointClick: handlePointClick
20639
20745
  }
20640
20746
  ),
20641
- chartType === "line" && /* @__PURE__ */ jsxRuntime.jsx(
20747
+ resolvedLook === "line" && /* @__PURE__ */ jsxRuntime.jsx(
20642
20748
  LineChart,
20643
20749
  {
20644
20750
  series: normalizedSeries,
@@ -20648,7 +20754,7 @@ var init_Chart = __esm({
20648
20754
  onPointClick: handlePointClick
20649
20755
  }
20650
20756
  ),
20651
- chartType === "area" && /* @__PURE__ */ jsxRuntime.jsx(
20757
+ resolvedLook === "area" && /* @__PURE__ */ jsxRuntime.jsx(
20652
20758
  LineChart,
20653
20759
  {
20654
20760
  series: normalizedSeries,
@@ -20659,7 +20765,7 @@ var init_Chart = __esm({
20659
20765
  onPointClick: handlePointClick
20660
20766
  }
20661
20767
  ),
20662
- chartType === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
20768
+ resolvedLook === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
20663
20769
  PieChart,
20664
20770
  {
20665
20771
  data: firstSeriesData,
@@ -20668,7 +20774,7 @@ var init_Chart = __esm({
20668
20774
  onPointClick: handlePointClick
20669
20775
  }
20670
20776
  ),
20671
- chartType === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
20777
+ resolvedLook === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
20672
20778
  PieChart,
20673
20779
  {
20674
20780
  data: firstSeriesData,
@@ -20678,7 +20784,7 @@ var init_Chart = __esm({
20678
20784
  onPointClick: handlePointClick
20679
20785
  }
20680
20786
  ),
20681
- chartType === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
20787
+ resolvedLook === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
20682
20788
  ScatterChart,
20683
20789
  {
20684
20790
  data: scatterData ?? [],
@@ -24023,7 +24129,7 @@ var init_FormField = __esm({
24023
24129
  FormField.displayName = "FormField";
24024
24130
  }
24025
24131
  });
24026
- var resolveFilterType, FilterGroup;
24132
+ var resolveFilterType, lookStyles5, FilterGroup;
24027
24133
  var init_FilterGroup = __esm({
24028
24134
  "components/molecules/FilterGroup.tsx"() {
24029
24135
  "use client";
@@ -24037,6 +24143,13 @@ var init_FilterGroup = __esm({
24037
24143
  init_useEventBus();
24038
24144
  init_useQuerySingleton();
24039
24145
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24146
+ lookStyles5 = {
24147
+ toolbar: "",
24148
+ chips: "gap-2 [&>*]:rounded-pill [&>*]:px-3 [&>*]:py-1",
24149
+ pills: "gap-2 [&>*]:rounded-pill",
24150
+ "popover-trigger": "[&>*:not(:first-child)]:hidden",
24151
+ "inline-column-header": "hidden"
24152
+ };
24040
24153
  FilterGroup = ({
24041
24154
  entity,
24042
24155
  filters,
@@ -24046,7 +24159,8 @@ var init_FilterGroup = __esm({
24046
24159
  variant = "default",
24047
24160
  showIcon = true,
24048
24161
  query,
24049
- isLoading
24162
+ isLoading,
24163
+ look = "toolbar"
24050
24164
  }) => {
24051
24165
  const eventBus = useEventBus();
24052
24166
  const queryState = useQuerySingleton(query);
@@ -24101,63 +24215,71 @@ var init_FilterGroup = __esm({
24101
24215
  }, [onClearAll, queryState, eventBus, entity, query]);
24102
24216
  const activeFilterCount = Object.keys(selectedValues).length;
24103
24217
  if (variant === "pills") {
24104
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
24105
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24106
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24107
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24108
- filter.label,
24109
- ":"
24110
- ] }),
24111
- /* @__PURE__ */ jsxRuntime.jsxs(
24112
- HStack,
24113
- {
24114
- gap: "none",
24115
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24116
- children: [
24117
- /* @__PURE__ */ jsxRuntime.jsx(
24118
- "button",
24119
- {
24120
- type: "button",
24121
- onClick: () => handleFilterSelect(filter.field, null),
24122
- className: cn(
24123
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24124
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24125
- ),
24126
- children: "All"
24127
- }
24128
- ),
24129
- filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
24130
- "button",
24131
- {
24132
- type: "button",
24133
- onClick: () => handleFilterSelect(filter.field, option),
24134
- className: cn(
24135
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24136
- "border-l-[length:var(--border-width)] border-border",
24137
- selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24218
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24219
+ HStack,
24220
+ {
24221
+ gap: "md",
24222
+ align: "center",
24223
+ className: cn("flex-wrap", lookStyles5[look], className),
24224
+ children: [
24225
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24226
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24227
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24228
+ filter.label,
24229
+ ":"
24230
+ ] }),
24231
+ /* @__PURE__ */ jsxRuntime.jsxs(
24232
+ HStack,
24233
+ {
24234
+ gap: "none",
24235
+ className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24236
+ children: [
24237
+ /* @__PURE__ */ jsxRuntime.jsx(
24238
+ "button",
24239
+ {
24240
+ type: "button",
24241
+ onClick: () => handleFilterSelect(filter.field, null),
24242
+ className: cn(
24243
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24244
+ !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24245
+ ),
24246
+ children: "All"
24247
+ }
24138
24248
  ),
24139
- children: option
24140
- },
24141
- option
24142
- ))
24143
- ]
24144
- }
24145
- )
24146
- ] }, filter.field)),
24147
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
24148
- Button,
24149
- {
24150
- variant: "ghost",
24151
- size: "sm",
24152
- onClick: handleClearAll,
24153
- leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24154
- children: "Clear"
24155
- }
24156
- )
24157
- ] });
24249
+ filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
24250
+ "button",
24251
+ {
24252
+ type: "button",
24253
+ onClick: () => handleFilterSelect(filter.field, option),
24254
+ className: cn(
24255
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24256
+ "border-l-[length:var(--border-width)] border-border",
24257
+ selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24258
+ ),
24259
+ children: option
24260
+ },
24261
+ option
24262
+ ))
24263
+ ]
24264
+ }
24265
+ )
24266
+ ] }, filter.field)),
24267
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
24268
+ Button,
24269
+ {
24270
+ variant: "ghost",
24271
+ size: "sm",
24272
+ onClick: handleClearAll,
24273
+ leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24274
+ children: "Clear"
24275
+ }
24276
+ )
24277
+ ]
24278
+ }
24279
+ );
24158
24280
  }
24159
24281
  if (variant === "vertical") {
24160
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
24282
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles5[look], className), children: [
24161
24283
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24162
24284
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24163
24285
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -24240,92 +24362,100 @@ var init_FilterGroup = __esm({
24240
24362
  ] });
24241
24363
  }
24242
24364
  if (variant === "compact") {
24243
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
24244
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24245
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
24246
- Input,
24247
- {
24248
- type: "date",
24249
- value: selectedValues[filter.field] || "",
24250
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24251
- clearable: true,
24252
- onClear: () => handleFilterSelect(filter.field, null),
24253
- className: "text-sm"
24254
- }
24255
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24256
- /* @__PURE__ */ jsxRuntime.jsx(
24257
- Input,
24258
- {
24259
- type: "date",
24260
- value: selectedValues[`${filter.field}_from`] || "",
24261
- onChange: (e) => handleFilterSelect(
24262
- `${filter.field}_from`,
24263
- e.target.value || null
24264
- ),
24265
- className: "text-sm min-w-[100px]"
24266
- }
24267
- ),
24268
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
24269
- /* @__PURE__ */ jsxRuntime.jsx(
24270
- Input,
24271
- {
24272
- type: "date",
24273
- value: selectedValues[`${filter.field}_to`] || "",
24274
- onChange: (e) => handleFilterSelect(
24275
- `${filter.field}_to`,
24276
- e.target.value || null
24365
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24366
+ HStack,
24367
+ {
24368
+ gap: "sm",
24369
+ align: "center",
24370
+ className: cn("flex-wrap", lookStyles5[look], className),
24371
+ children: [
24372
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24373
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
24374
+ Input,
24375
+ {
24376
+ type: "date",
24377
+ value: selectedValues[filter.field] || "",
24378
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24379
+ clearable: true,
24380
+ onClear: () => handleFilterSelect(filter.field, null),
24381
+ className: "text-sm"
24382
+ }
24383
+ ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24384
+ /* @__PURE__ */ jsxRuntime.jsx(
24385
+ Input,
24386
+ {
24387
+ type: "date",
24388
+ value: selectedValues[`${filter.field}_from`] || "",
24389
+ onChange: (e) => handleFilterSelect(
24390
+ `${filter.field}_from`,
24391
+ e.target.value || null
24392
+ ),
24393
+ className: "text-sm min-w-[100px]"
24394
+ }
24277
24395
  ),
24278
- className: "text-sm min-w-[100px]"
24279
- }
24280
- )
24281
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
24282
- Input,
24283
- {
24284
- value: selectedValues[filter.field] || "",
24285
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24286
- placeholder: filter.label,
24287
- clearable: true,
24288
- onClear: () => handleFilterSelect(filter.field, null),
24289
- className: "text-sm"
24290
- }
24291
- ) : /* @__PURE__ */ jsxRuntime.jsx(
24292
- Select,
24293
- {
24294
- value: selectedValues[filter.field] || "all",
24295
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24296
- options: [
24297
- { value: "all", label: `All ${filter.label}` },
24298
- ...filter.options?.map((opt) => ({
24299
- value: opt,
24300
- label: opt
24301
- })) || []
24302
- ],
24303
- className: "text-sm"
24304
- }
24305
- ) }, filter.field)),
24306
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24307
- Object.entries(selectedValues).map(([field, value]) => {
24308
- const filterDef = filters.find((f3) => f3.field === field);
24309
- return /* @__PURE__ */ jsxRuntime.jsxs(
24310
- Badge,
24396
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
24397
+ /* @__PURE__ */ jsxRuntime.jsx(
24398
+ Input,
24399
+ {
24400
+ type: "date",
24401
+ value: selectedValues[`${filter.field}_to`] || "",
24402
+ onChange: (e) => handleFilterSelect(
24403
+ `${filter.field}_to`,
24404
+ e.target.value || null
24405
+ ),
24406
+ className: "text-sm min-w-[100px]"
24407
+ }
24408
+ )
24409
+ ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
24410
+ Input,
24311
24411
  {
24312
- variant: "primary",
24313
- size: "md",
24314
- className: "cursor-pointer",
24315
- onClick: () => handleFilterSelect(field, null),
24316
- children: [
24317
- filterDef?.label,
24318
- ": ",
24319
- value,
24320
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24321
- ]
24322
- },
24323
- field
24324
- );
24325
- }),
24326
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24327
- ] })
24328
- ] });
24412
+ value: selectedValues[filter.field] || "",
24413
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24414
+ placeholder: filter.label,
24415
+ clearable: true,
24416
+ onClear: () => handleFilterSelect(filter.field, null),
24417
+ className: "text-sm"
24418
+ }
24419
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
24420
+ Select,
24421
+ {
24422
+ value: selectedValues[filter.field] || "all",
24423
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24424
+ options: [
24425
+ { value: "all", label: `All ${filter.label}` },
24426
+ ...filter.options?.map((opt) => ({
24427
+ value: opt,
24428
+ label: opt
24429
+ })) || []
24430
+ ],
24431
+ className: "text-sm"
24432
+ }
24433
+ ) }, filter.field)),
24434
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24435
+ Object.entries(selectedValues).map(([field, value]) => {
24436
+ const filterDef = filters.find((f3) => f3.field === field);
24437
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24438
+ Badge,
24439
+ {
24440
+ variant: "primary",
24441
+ size: "md",
24442
+ className: "cursor-pointer",
24443
+ onClick: () => handleFilterSelect(field, null),
24444
+ children: [
24445
+ filterDef?.label,
24446
+ ": ",
24447
+ value,
24448
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24449
+ ]
24450
+ },
24451
+ field
24452
+ );
24453
+ }),
24454
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24455
+ ] })
24456
+ ]
24457
+ }
24458
+ );
24329
24459
  }
24330
24460
  return /* @__PURE__ */ jsxRuntime.jsx(
24331
24461
  "div",
@@ -24334,6 +24464,7 @@ var init_FilterGroup = __esm({
24334
24464
  "p-4 rounded-container",
24335
24465
  "bg-card",
24336
24466
  "border-[length:var(--border-width)] border-border",
24467
+ lookStyles5[look],
24337
24468
  className
24338
24469
  ),
24339
24470
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -28807,7 +28938,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
28807
28938
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
28808
28939
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
28809
28940
  }
28810
- var variantColor, StatDisplay;
28941
+ var lookStyles6, variantColor, StatDisplay;
28811
28942
  var init_StatDisplay = __esm({
28812
28943
  "components/molecules/StatDisplay.tsx"() {
28813
28944
  "use client";
@@ -28819,6 +28950,13 @@ var init_StatDisplay = __esm({
28819
28950
  init_Sparkline();
28820
28951
  init_Icon();
28821
28952
  init_useEventBus();
28953
+ lookStyles6 = {
28954
+ elevated: "",
28955
+ flat: "shadow-none border-[length:var(--border-width)] border-border",
28956
+ "progress-backed": "",
28957
+ gauge: "",
28958
+ sparkline: ""
28959
+ };
28822
28960
  variantColor = {
28823
28961
  default: "text-foreground",
28824
28962
  primary: "text-primary",
@@ -28846,6 +28984,7 @@ var init_StatDisplay = __esm({
28846
28984
  size = "md",
28847
28985
  variant = "default",
28848
28986
  compact = false,
28987
+ look = "elevated",
28849
28988
  className,
28850
28989
  isLoading = false,
28851
28990
  error = null
@@ -28898,7 +29037,7 @@ var init_StatDisplay = __esm({
28898
29037
  return /* @__PURE__ */ jsxRuntime.jsx(
28899
29038
  Card,
28900
29039
  {
28901
- className: cn(padSizes[size], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
29040
+ className: cn(padSizes[size], lookStyles6[look], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
28902
29041
  onClick: clickEvent ? handleClick : void 0,
28903
29042
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { align: "start", justify: "between", children: [
28904
29043
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -34342,7 +34481,8 @@ function DataTable({
34342
34481
  bulkActions,
34343
34482
  headerActions,
34344
34483
  showTotal = true,
34345
- className
34484
+ className,
34485
+ look = "dense"
34346
34486
  }) {
34347
34487
  const [openActionMenu, setOpenActionMenu] = React85.useState(
34348
34488
  null
@@ -34469,6 +34609,7 @@ function DataTable({
34469
34609
  {
34470
34610
  className: cn(
34471
34611
  "bg-card border-2 border-border rounded-none overflow-hidden",
34612
+ lookStyles7[look],
34472
34613
  className
34473
34614
  ),
34474
34615
  children: [
@@ -34695,6 +34836,7 @@ function DataTable({
34695
34836
  }
34696
34837
  );
34697
34838
  }
34839
+ var lookStyles7;
34698
34840
  var init_DataTable = __esm({
34699
34841
  "components/organisms/DataTable.tsx"() {
34700
34842
  "use client";
@@ -34708,6 +34850,13 @@ var init_DataTable = __esm({
34708
34850
  init_useEventBus();
34709
34851
  init_useTranslate();
34710
34852
  init_types3();
34853
+ lookStyles7 = {
34854
+ dense: "",
34855
+ spacious: "[&_tbody_tr_td]:py-5 [&_thead_tr_th]:py-4",
34856
+ striped: "[&_tbody_tr:nth-child(odd)]:bg-muted/30",
34857
+ borderless: "border-0 [&_thead]:border-b-0 [&_tbody_tr]:border-b-0 [&_tbody]:divide-y-0",
34858
+ "card-rows": "border-0 [&_tbody]:divide-y-0 [&_tbody_tr]:border-b-0 [&_tbody_tr]:shadow-elevation-card [&_tbody_tr]:rounded-container [&_tbody_tr]:bg-card [&_tbody]:[&_tr]:my-2"
34859
+ };
34711
34860
  DataTable.displayName = "DataTable";
34712
34861
  }
34713
34862
  });
@@ -37866,7 +38015,7 @@ var init_GraphCanvas = __esm({
37866
38015
  GraphCanvas.displayName = "GraphCanvas";
37867
38016
  }
37868
38017
  });
37869
- var Header;
38018
+ var lookStyles8, Header;
37870
38019
  var init_Header = __esm({
37871
38020
  "components/organisms/Header.tsx"() {
37872
38021
  "use client";
@@ -37879,6 +38028,13 @@ var init_Header = __esm({
37879
38028
  init_Typography();
37880
38029
  init_cn();
37881
38030
  init_useTranslate();
38031
+ lookStyles8 = {
38032
+ "compact-bar": "",
38033
+ hero: "py-section min-h-[200px] [&_h1]:text-display-1",
38034
+ breadcrumb: "py-2 text-sm [&_h1]:text-base [&_h1]:font-medium",
38035
+ contextual: "py-3 [&_h1]:text-lg",
38036
+ "editorial-banner": "py-12 [&_h1]:text-display-2 [&_h1]:font-display-bold border-b border-border"
38037
+ };
37882
38038
  Header = ({
37883
38039
  logo,
37884
38040
  logoSrc,
@@ -37896,6 +38052,7 @@ var init_Header = __esm({
37896
38052
  actions,
37897
38053
  sticky = true,
37898
38054
  variant = "mobile",
38055
+ look = "compact-bar",
37899
38056
  onLogoClick,
37900
38057
  className
37901
38058
  }) => {
@@ -37911,6 +38068,7 @@ var init_Header = __esm({
37911
38068
  "flex items-center px-4 justify-between bg-card",
37912
38069
  sticky && "sticky top-0 z-50",
37913
38070
  variant === "mobile" && "lg:hidden",
38071
+ lookStyles8[look],
37914
38072
  className
37915
38073
  ),
37916
38074
  children: [
@@ -44606,7 +44764,7 @@ var init_TeamOrganism = __esm({
44606
44764
  TeamOrganism.displayName = "TeamOrganism";
44607
44765
  }
44608
44766
  });
44609
- var STATUS_STYLES3, Timeline;
44767
+ var lookStyles9, STATUS_STYLES3, Timeline;
44610
44768
  var init_Timeline = __esm({
44611
44769
  "components/organisms/Timeline.tsx"() {
44612
44770
  "use client";
@@ -44617,6 +44775,12 @@ var init_Timeline = __esm({
44617
44775
  init_ErrorState();
44618
44776
  init_EmptyState();
44619
44777
  init_useTranslate();
44778
+ lookStyles9 = {
44779
+ "vertical-compact": "gap-1 [&>*]:py-1",
44780
+ "vertical-spacious": "",
44781
+ horizontal: "flex-row [&>*]:flex-row [&>*]:items-center",
44782
+ swimlane: "flex-row gap-6 [&>*]:flex-row [&>*]:items-center"
44783
+ };
44620
44784
  STATUS_STYLES3 = {
44621
44785
  complete: {
44622
44786
  dotColor: "text-success",
@@ -44647,7 +44811,8 @@ var init_Timeline = __esm({
44647
44811
  entity,
44648
44812
  isLoading = false,
44649
44813
  error,
44650
- className
44814
+ className,
44815
+ look = "vertical-spacious"
44651
44816
  }) => {
44652
44817
  const { t } = useTranslate();
44653
44818
  const entityData = Array.isArray(entity) ? entity : [];
@@ -44703,7 +44868,7 @@ var init_Timeline = __esm({
44703
44868
  }
44704
44869
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "md", children: [
44705
44870
  title && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h5", weight: "semibold", children: title }),
44706
- /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: "relative", children: items.map((item, idx) => {
44871
+ /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: cn("relative", lookStyles9[look]), children: items.map((item, idx) => {
44707
44872
  const status = item.status || "pending";
44708
44873
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
44709
44874
  const ItemIcon = item.icon || style.icon;