@almadar/ui 5.4.0 → 5.5.1

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.
@@ -1906,7 +1906,7 @@ var init_Overlay = __esm({
1906
1906
  };
1907
1907
  }
1908
1908
  });
1909
- var sizeClasses2, minWidthClasses, Modal;
1909
+ var sizeClasses2, minWidthClasses, lookStyles, Modal;
1910
1910
  var init_Modal = __esm({
1911
1911
  "components/molecules/Modal.tsx"() {
1912
1912
  "use client";
@@ -1931,6 +1931,12 @@ var init_Modal = __esm({
1931
1931
  xl: "min-w-[700px] max-sm:min-w-0",
1932
1932
  full: "min-w-0"
1933
1933
  };
1934
+ lookStyles = {
1935
+ "centered-card": "",
1936
+ "top-sheet": "top-0 rounded-t-none rounded-b-container max-w-full w-full",
1937
+ "side-drawer": "right-0 top-0 bottom-0 h-full rounded-l-container rounded-r-none w-[400px] max-w-full",
1938
+ "full-screen": "inset-0 rounded-none w-full h-full max-w-full"
1939
+ };
1934
1940
  Modal = ({
1935
1941
  isOpen = true,
1936
1942
  onClose = () => {
@@ -1944,7 +1950,8 @@ var init_Modal = __esm({
1944
1950
  closeOnEscape = true,
1945
1951
  className,
1946
1952
  closeEvent,
1947
- swipeDownToClose = true
1953
+ swipeDownToClose = true,
1954
+ look = "centered-card"
1948
1955
  }) => {
1949
1956
  const eventBus = useEventBus();
1950
1957
  const modalRef = useRef(null);
@@ -2029,6 +2036,7 @@ var init_Modal = __esm({
2029
2036
  // Mobile: take the entire screen. Override desktop max-w cap,
2030
2037
  // full height, no rounded corners, no min-width.
2031
2038
  "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2039
+ lookStyles[look],
2032
2040
  className
2033
2041
  ),
2034
2042
  style: dragY > 0 ? {
@@ -3603,7 +3611,7 @@ var init_Checkbox = __esm({
3603
3611
  Checkbox.displayName = "Checkbox";
3604
3612
  }
3605
3613
  });
3606
- var variantStyles4, paddingStyles2, shadowStyles2, lookStyles, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3614
+ var variantStyles4, paddingStyles2, shadowStyles2, lookStyles2, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3607
3615
  var init_Card = __esm({
3608
3616
  "components/atoms/Card.tsx"() {
3609
3617
  init_cn();
@@ -3651,7 +3659,7 @@ var init_Card = __esm({
3651
3659
  md: "shadow",
3652
3660
  lg: "shadow-elevation-dialog"
3653
3661
  };
3654
- lookStyles = {
3662
+ lookStyles2 = {
3655
3663
  elevated: "",
3656
3664
  "flat-bordered": "shadow-none border-[length:var(--border-width)] border-border",
3657
3665
  "borderless-divider": "shadow-none border-0 border-b border-border rounded-none",
@@ -3681,7 +3689,7 @@ var init_Card = __esm({
3681
3689
  "transition-all duration-[var(--transition-normal)]",
3682
3690
  variantStyles4[variant],
3683
3691
  paddingStyles2[padding],
3684
- lookStyles[look],
3692
+ lookStyles2[look],
3685
3693
  shadow && shadowStyles2[shadow],
3686
3694
  className
3687
3695
  ),
@@ -16294,7 +16302,7 @@ var init_BookTableOfContents = __esm({
16294
16302
  BookTableOfContents.displayName = "BookTableOfContents";
16295
16303
  }
16296
16304
  });
16297
- var ICON_NAME_ALIASES, EmptyState;
16305
+ var ICON_NAME_ALIASES, lookStyles3, EmptyState;
16298
16306
  var init_EmptyState = __esm({
16299
16307
  "components/molecules/EmptyState.tsx"() {
16300
16308
  "use client";
@@ -16311,6 +16319,12 @@ var init_EmptyState = __esm({
16311
16319
  error: "x-circle",
16312
16320
  warning: "alert-circle"
16313
16321
  };
16322
+ lookStyles3 = {
16323
+ "icon-only": "",
16324
+ illustrated: "[&_svg]:w-32 [&_svg]:h-32",
16325
+ "text-only": "[&_svg]:hidden",
16326
+ mascot: "[&_svg]:w-24 [&_svg]:h-24 [&_svg]:rounded-pill"
16327
+ };
16314
16328
  EmptyState = ({
16315
16329
  icon,
16316
16330
  title,
@@ -16321,7 +16335,8 @@ var init_EmptyState = __esm({
16321
16335
  className,
16322
16336
  destructive,
16323
16337
  variant,
16324
- actionEvent
16338
+ actionEvent,
16339
+ look = "icon-only"
16325
16340
  }) => {
16326
16341
  const eventBus = useEventBus();
16327
16342
  const { t } = useTranslate();
@@ -16341,6 +16356,7 @@ var init_EmptyState = __esm({
16341
16356
  align: "center",
16342
16357
  className: cn(
16343
16358
  "justify-center py-12 text-center",
16359
+ lookStyles3[look],
16344
16360
  className
16345
16361
  ),
16346
16362
  children: [
@@ -17581,7 +17597,7 @@ function useSafeEventBus2() {
17581
17597
  } };
17582
17598
  }
17583
17599
  }
17584
- var log9, ButtonGroup;
17600
+ var log9, lookStyles4, ButtonGroup;
17585
17601
  var init_ButtonGroup = __esm({
17586
17602
  "components/molecules/ButtonGroup.tsx"() {
17587
17603
  "use client";
@@ -17589,6 +17605,13 @@ var init_ButtonGroup = __esm({
17589
17605
  init_atoms();
17590
17606
  init_useEventBus();
17591
17607
  log9 = createLogger("almadar:ui:button-group");
17608
+ lookStyles4 = {
17609
+ "right-aligned-buttons": "",
17610
+ "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
17611
+ "inline-row": "gap-2 inline-flex",
17612
+ "dropdown-menu": "[&>button:not(:first-child)]:hidden",
17613
+ "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
17614
+ };
17592
17615
  ButtonGroup = ({
17593
17616
  children,
17594
17617
  primary,
@@ -17598,7 +17621,8 @@ var init_ButtonGroup = __esm({
17598
17621
  className,
17599
17622
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
17600
17623
  entity: _entity,
17601
- filters
17624
+ filters,
17625
+ look = "right-aligned-buttons"
17602
17626
  }) => {
17603
17627
  const eventBus = useSafeEventBus2();
17604
17628
  const variantClasses2 = {
@@ -17675,6 +17699,7 @@ var init_ButtonGroup = __esm({
17675
17699
  "inline-flex gap-2",
17676
17700
  variantClasses2[variant],
17677
17701
  orientationClasses[orientation],
17702
+ lookStyles4[look],
17678
17703
  className
17679
17704
  ),
17680
17705
  role: "group",
@@ -20206,7 +20231,7 @@ var init_CastleTemplate = __esm({
20206
20231
  CastleTemplate.displayName = "CastleTemplate";
20207
20232
  }
20208
20233
  });
20209
- var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, Chart;
20234
+ var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, LOOK_FROM_CHART_TYPE, Chart;
20210
20235
  var init_Chart = __esm({
20211
20236
  "components/organisms/Chart.tsx"() {
20212
20237
  "use client";
@@ -20236,7 +20261,7 @@ var init_Chart = __esm({
20236
20261
  if (Number.isNaN(parsed.getTime())) return raw;
20237
20262
  return monthFormatter.format(parsed);
20238
20263
  };
20239
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
20264
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
20240
20265
  const categories = useMemo(() => {
20241
20266
  const set = [];
20242
20267
  const seen = /* @__PURE__ */ new Set();
@@ -20274,6 +20299,64 @@ var init_Chart = __esm({
20274
20299
  }
20275
20300
  return m;
20276
20301
  }, [series, stack, columnTotals]);
20302
+ if (horizontal) {
20303
+ return /* @__PURE__ */ jsx(VStack, { gap: "xs", align: "stretch", className: "w-full", style: { minHeight: height }, children: categories.map((label, catIdx) => {
20304
+ const displayLabel = timeAxis ? formatTimeLabel(label) : label;
20305
+ const total = columnTotals?.[catIdx] ?? 1;
20306
+ return /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "w-full", children: [
20307
+ /* @__PURE__ */ jsx(
20308
+ Typography,
20309
+ {
20310
+ variant: "caption",
20311
+ color: "secondary",
20312
+ className: "truncate text-right",
20313
+ style: { width: 80, flexShrink: 0 },
20314
+ children: displayLabel
20315
+ }
20316
+ ),
20317
+ /* @__PURE__ */ jsx(
20318
+ HStack,
20319
+ {
20320
+ gap: stack === "none" ? "xs" : "none",
20321
+ align: "center",
20322
+ className: "flex-1 min-w-0",
20323
+ style: { height: 24 },
20324
+ children: series.map((s, sIdx) => {
20325
+ const value = valueAt(s, label);
20326
+ const ratio = stack === "normalize" ? total === 0 ? 0 : value / total * 100 : value / maxValue * 100;
20327
+ const color = seriesColor(s, sIdx);
20328
+ return /* @__PURE__ */ jsx(
20329
+ Box,
20330
+ {
20331
+ className: "h-full rounded-r-sm transition-all duration-500 ease-out min-w-[2px] cursor-pointer hover:opacity-80",
20332
+ style: {
20333
+ width: `${ratio}%`,
20334
+ backgroundColor: color
20335
+ },
20336
+ onClick: () => onPointClick?.(
20337
+ { label, value, color },
20338
+ s.name
20339
+ ),
20340
+ title: `${s.name}: ${value}`
20341
+ },
20342
+ s.name
20343
+ );
20344
+ })
20345
+ }
20346
+ ),
20347
+ showValues && series.length === 1 && /* @__PURE__ */ jsx(
20348
+ Typography,
20349
+ {
20350
+ variant: "caption",
20351
+ color: "secondary",
20352
+ className: "tabular-nums",
20353
+ style: { width: 40, flexShrink: 0 },
20354
+ children: valueAt(series[0], label)
20355
+ }
20356
+ )
20357
+ ] }, label);
20358
+ }) });
20359
+ }
20277
20360
  return /* @__PURE__ */ jsx(
20278
20361
  HStack,
20279
20362
  {
@@ -20701,10 +20784,20 @@ var init_Chart = __esm({
20701
20784
  }
20702
20785
  );
20703
20786
  };
20787
+ LOOK_FROM_CHART_TYPE = {
20788
+ bar: "bar-vertical",
20789
+ line: "line",
20790
+ pie: "pie",
20791
+ area: "area",
20792
+ donut: "donut",
20793
+ scatter: "scatter",
20794
+ histogram: "histogram"
20795
+ };
20704
20796
  Chart = ({
20705
20797
  title,
20706
20798
  subtitle,
20707
- chartType = "bar",
20799
+ chartType,
20800
+ look,
20708
20801
  series,
20709
20802
  data: simpleData,
20710
20803
  scatterData,
@@ -20720,6 +20813,7 @@ var init_Chart = __esm({
20720
20813
  error,
20721
20814
  className
20722
20815
  }) => {
20816
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
20723
20817
  const eventBus = useEventBus();
20724
20818
  const { t } = useTranslate();
20725
20819
  const handleAction = useCallback(
@@ -20748,7 +20842,7 @@ var init_Chart = __esm({
20748
20842
  return [];
20749
20843
  }, [simpleData, series]);
20750
20844
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
20751
- const hasContent = chartType === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20845
+ const hasContent = resolvedLook === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20752
20846
  if (isLoading) {
20753
20847
  return /* @__PURE__ */ jsx(LoadingState, { message: "Loading chart...", className });
20754
20848
  }
@@ -20783,7 +20877,18 @@ var init_Chart = __esm({
20783
20877
  )) })
20784
20878
  ] }),
20785
20879
  /* @__PURE__ */ jsxs(Box, { className: "w-full", children: [
20786
- chartType === "bar" && /* @__PURE__ */ jsx(
20880
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsx(
20881
+ BarChart,
20882
+ {
20883
+ series: normalizedSeries,
20884
+ height,
20885
+ showValues,
20886
+ stack,
20887
+ timeAxis,
20888
+ onPointClick: handlePointClick
20889
+ }
20890
+ ),
20891
+ resolvedLook === "bar-horizontal" && /* @__PURE__ */ jsx(
20787
20892
  BarChart,
20788
20893
  {
20789
20894
  series: normalizedSeries,
@@ -20791,10 +20896,11 @@ var init_Chart = __esm({
20791
20896
  showValues,
20792
20897
  stack,
20793
20898
  timeAxis,
20899
+ horizontal: true,
20794
20900
  onPointClick: handlePointClick
20795
20901
  }
20796
20902
  ),
20797
- chartType === "histogram" && /* @__PURE__ */ jsx(
20903
+ resolvedLook === "histogram" && /* @__PURE__ */ jsx(
20798
20904
  BarChart,
20799
20905
  {
20800
20906
  series: normalizedSeries,
@@ -20806,7 +20912,7 @@ var init_Chart = __esm({
20806
20912
  onPointClick: handlePointClick
20807
20913
  }
20808
20914
  ),
20809
- chartType === "line" && /* @__PURE__ */ jsx(
20915
+ resolvedLook === "line" && /* @__PURE__ */ jsx(
20810
20916
  LineChart,
20811
20917
  {
20812
20918
  series: normalizedSeries,
@@ -20816,7 +20922,7 @@ var init_Chart = __esm({
20816
20922
  onPointClick: handlePointClick
20817
20923
  }
20818
20924
  ),
20819
- chartType === "area" && /* @__PURE__ */ jsx(
20925
+ resolvedLook === "area" && /* @__PURE__ */ jsx(
20820
20926
  LineChart,
20821
20927
  {
20822
20928
  series: normalizedSeries,
@@ -20827,7 +20933,7 @@ var init_Chart = __esm({
20827
20933
  onPointClick: handlePointClick
20828
20934
  }
20829
20935
  ),
20830
- chartType === "pie" && /* @__PURE__ */ jsx(
20936
+ resolvedLook === "pie" && /* @__PURE__ */ jsx(
20831
20937
  PieChart,
20832
20938
  {
20833
20939
  data: firstSeriesData,
@@ -20836,7 +20942,7 @@ var init_Chart = __esm({
20836
20942
  onPointClick: handlePointClick
20837
20943
  }
20838
20944
  ),
20839
- chartType === "donut" && /* @__PURE__ */ jsx(
20945
+ resolvedLook === "donut" && /* @__PURE__ */ jsx(
20840
20946
  PieChart,
20841
20947
  {
20842
20948
  data: firstSeriesData,
@@ -20846,7 +20952,7 @@ var init_Chart = __esm({
20846
20952
  onPointClick: handlePointClick
20847
20953
  }
20848
20954
  ),
20849
- chartType === "scatter" && /* @__PURE__ */ jsx(
20955
+ resolvedLook === "scatter" && /* @__PURE__ */ jsx(
20850
20956
  ScatterChart,
20851
20957
  {
20852
20958
  data: scatterData ?? [],
@@ -24269,7 +24375,7 @@ var init_useQuerySingleton = __esm({
24269
24375
  queryStores = /* @__PURE__ */ new Map();
24270
24376
  }
24271
24377
  });
24272
- var resolveFilterType, FilterGroup;
24378
+ var resolveFilterType, lookStyles5, FilterGroup;
24273
24379
  var init_FilterGroup = __esm({
24274
24380
  "components/molecules/FilterGroup.tsx"() {
24275
24381
  "use client";
@@ -24283,6 +24389,13 @@ var init_FilterGroup = __esm({
24283
24389
  init_useEventBus();
24284
24390
  init_useQuerySingleton();
24285
24391
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24392
+ lookStyles5 = {
24393
+ toolbar: "",
24394
+ chips: "gap-2 [&>*]:rounded-pill [&>*]:px-3 [&>*]:py-1",
24395
+ pills: "gap-2 [&>*]:rounded-pill",
24396
+ "popover-trigger": "[&>*:not(:first-child)]:hidden",
24397
+ "inline-column-header": "hidden"
24398
+ };
24286
24399
  FilterGroup = ({
24287
24400
  entity,
24288
24401
  filters,
@@ -24292,7 +24405,8 @@ var init_FilterGroup = __esm({
24292
24405
  variant = "default",
24293
24406
  showIcon = true,
24294
24407
  query,
24295
- isLoading
24408
+ isLoading,
24409
+ look = "toolbar"
24296
24410
  }) => {
24297
24411
  const eventBus = useEventBus();
24298
24412
  const queryState = useQuerySingleton(query);
@@ -24347,63 +24461,71 @@ var init_FilterGroup = __esm({
24347
24461
  }, [onClearAll, queryState, eventBus, entity, query]);
24348
24462
  const activeFilterCount = Object.keys(selectedValues).length;
24349
24463
  if (variant === "pills") {
24350
- return /* @__PURE__ */ jsxs(HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
24351
- showIcon && /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24352
- filters.map((filter) => /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24353
- /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24354
- filter.label,
24355
- ":"
24356
- ] }),
24357
- /* @__PURE__ */ jsxs(
24358
- HStack,
24359
- {
24360
- gap: "none",
24361
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24362
- children: [
24363
- /* @__PURE__ */ jsx(
24364
- "button",
24365
- {
24366
- type: "button",
24367
- onClick: () => handleFilterSelect(filter.field, null),
24368
- className: cn(
24369
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24370
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24371
- ),
24372
- children: "All"
24373
- }
24374
- ),
24375
- filter.options?.map((option) => /* @__PURE__ */ jsx(
24376
- "button",
24377
- {
24378
- type: "button",
24379
- onClick: () => handleFilterSelect(filter.field, option),
24380
- className: cn(
24381
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24382
- "border-l-[length:var(--border-width)] border-border",
24383
- selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24464
+ return /* @__PURE__ */ jsxs(
24465
+ HStack,
24466
+ {
24467
+ gap: "md",
24468
+ align: "center",
24469
+ className: cn("flex-wrap", lookStyles5[look], className),
24470
+ children: [
24471
+ showIcon && /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24472
+ filters.map((filter) => /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24473
+ /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24474
+ filter.label,
24475
+ ":"
24476
+ ] }),
24477
+ /* @__PURE__ */ jsxs(
24478
+ HStack,
24479
+ {
24480
+ gap: "none",
24481
+ className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24482
+ children: [
24483
+ /* @__PURE__ */ jsx(
24484
+ "button",
24485
+ {
24486
+ type: "button",
24487
+ onClick: () => handleFilterSelect(filter.field, null),
24488
+ className: cn(
24489
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24490
+ !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24491
+ ),
24492
+ children: "All"
24493
+ }
24384
24494
  ),
24385
- children: option
24386
- },
24387
- option
24388
- ))
24389
- ]
24390
- }
24391
- )
24392
- ] }, filter.field)),
24393
- activeFilterCount > 0 && /* @__PURE__ */ jsx(
24394
- Button,
24395
- {
24396
- variant: "ghost",
24397
- size: "sm",
24398
- onClick: handleClearAll,
24399
- leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24400
- children: "Clear"
24401
- }
24402
- )
24403
- ] });
24495
+ filter.options?.map((option) => /* @__PURE__ */ jsx(
24496
+ "button",
24497
+ {
24498
+ type: "button",
24499
+ onClick: () => handleFilterSelect(filter.field, option),
24500
+ className: cn(
24501
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24502
+ "border-l-[length:var(--border-width)] border-border",
24503
+ selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24504
+ ),
24505
+ children: option
24506
+ },
24507
+ option
24508
+ ))
24509
+ ]
24510
+ }
24511
+ )
24512
+ ] }, filter.field)),
24513
+ activeFilterCount > 0 && /* @__PURE__ */ jsx(
24514
+ Button,
24515
+ {
24516
+ variant: "ghost",
24517
+ size: "sm",
24518
+ onClick: handleClearAll,
24519
+ leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24520
+ children: "Clear"
24521
+ }
24522
+ )
24523
+ ]
24524
+ }
24525
+ );
24404
24526
  }
24405
24527
  if (variant === "vertical") {
24406
- return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
24528
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", lookStyles5[look], className), children: [
24407
24529
  showIcon && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24408
24530
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24409
24531
  /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -24486,92 +24608,100 @@ var init_FilterGroup = __esm({
24486
24608
  ] });
24487
24609
  }
24488
24610
  if (variant === "compact") {
24489
- return /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
24490
- showIcon && /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24491
- filters.map((filter) => /* @__PURE__ */ jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsx(
24492
- Input,
24493
- {
24494
- type: "date",
24495
- value: selectedValues[filter.field] || "",
24496
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24497
- clearable: true,
24498
- onClear: () => handleFilterSelect(filter.field, null),
24499
- className: "text-sm"
24500
- }
24501
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24502
- /* @__PURE__ */ jsx(
24503
- Input,
24504
- {
24505
- type: "date",
24506
- value: selectedValues[`${filter.field}_from`] || "",
24507
- onChange: (e) => handleFilterSelect(
24508
- `${filter.field}_from`,
24509
- e.target.value || null
24510
- ),
24511
- className: "text-sm min-w-[100px]"
24512
- }
24513
- ),
24514
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
24515
- /* @__PURE__ */ jsx(
24516
- Input,
24517
- {
24518
- type: "date",
24519
- value: selectedValues[`${filter.field}_to`] || "",
24520
- onChange: (e) => handleFilterSelect(
24521
- `${filter.field}_to`,
24522
- e.target.value || null
24611
+ return /* @__PURE__ */ jsxs(
24612
+ HStack,
24613
+ {
24614
+ gap: "sm",
24615
+ align: "center",
24616
+ className: cn("flex-wrap", lookStyles5[look], className),
24617
+ children: [
24618
+ showIcon && /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24619
+ filters.map((filter) => /* @__PURE__ */ jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsx(
24620
+ Input,
24621
+ {
24622
+ type: "date",
24623
+ value: selectedValues[filter.field] || "",
24624
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24625
+ clearable: true,
24626
+ onClear: () => handleFilterSelect(filter.field, null),
24627
+ className: "text-sm"
24628
+ }
24629
+ ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24630
+ /* @__PURE__ */ jsx(
24631
+ Input,
24632
+ {
24633
+ type: "date",
24634
+ value: selectedValues[`${filter.field}_from`] || "",
24635
+ onChange: (e) => handleFilterSelect(
24636
+ `${filter.field}_from`,
24637
+ e.target.value || null
24638
+ ),
24639
+ className: "text-sm min-w-[100px]"
24640
+ }
24523
24641
  ),
24524
- className: "text-sm min-w-[100px]"
24525
- }
24526
- )
24527
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
24528
- Input,
24529
- {
24530
- value: selectedValues[filter.field] || "",
24531
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24532
- placeholder: filter.label,
24533
- clearable: true,
24534
- onClear: () => handleFilterSelect(filter.field, null),
24535
- className: "text-sm"
24536
- }
24537
- ) : /* @__PURE__ */ jsx(
24538
- Select,
24539
- {
24540
- value: selectedValues[filter.field] || "all",
24541
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24542
- options: [
24543
- { value: "all", label: `All ${filter.label}` },
24544
- ...filter.options?.map((opt) => ({
24545
- value: opt,
24546
- label: opt
24547
- })) || []
24548
- ],
24549
- className: "text-sm"
24550
- }
24551
- ) }, filter.field)),
24552
- activeFilterCount > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
24553
- Object.entries(selectedValues).map(([field, value]) => {
24554
- const filterDef = filters.find((f3) => f3.field === field);
24555
- return /* @__PURE__ */ jsxs(
24556
- Badge,
24642
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
24643
+ /* @__PURE__ */ jsx(
24644
+ Input,
24645
+ {
24646
+ type: "date",
24647
+ value: selectedValues[`${filter.field}_to`] || "",
24648
+ onChange: (e) => handleFilterSelect(
24649
+ `${filter.field}_to`,
24650
+ e.target.value || null
24651
+ ),
24652
+ className: "text-sm min-w-[100px]"
24653
+ }
24654
+ )
24655
+ ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
24656
+ Input,
24557
24657
  {
24558
- variant: "primary",
24559
- size: "md",
24560
- className: "cursor-pointer",
24561
- onClick: () => handleFilterSelect(field, null),
24562
- children: [
24563
- filterDef?.label,
24564
- ": ",
24565
- value,
24566
- /* @__PURE__ */ jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24567
- ]
24568
- },
24569
- field
24570
- );
24571
- }),
24572
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24573
- ] })
24574
- ] });
24658
+ value: selectedValues[filter.field] || "",
24659
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24660
+ placeholder: filter.label,
24661
+ clearable: true,
24662
+ onClear: () => handleFilterSelect(filter.field, null),
24663
+ className: "text-sm"
24664
+ }
24665
+ ) : /* @__PURE__ */ jsx(
24666
+ Select,
24667
+ {
24668
+ value: selectedValues[filter.field] || "all",
24669
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24670
+ options: [
24671
+ { value: "all", label: `All ${filter.label}` },
24672
+ ...filter.options?.map((opt) => ({
24673
+ value: opt,
24674
+ label: opt
24675
+ })) || []
24676
+ ],
24677
+ className: "text-sm"
24678
+ }
24679
+ ) }, filter.field)),
24680
+ activeFilterCount > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
24681
+ Object.entries(selectedValues).map(([field, value]) => {
24682
+ const filterDef = filters.find((f3) => f3.field === field);
24683
+ return /* @__PURE__ */ jsxs(
24684
+ Badge,
24685
+ {
24686
+ variant: "primary",
24687
+ size: "md",
24688
+ className: "cursor-pointer",
24689
+ onClick: () => handleFilterSelect(field, null),
24690
+ children: [
24691
+ filterDef?.label,
24692
+ ": ",
24693
+ value,
24694
+ /* @__PURE__ */ jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24695
+ ]
24696
+ },
24697
+ field
24698
+ );
24699
+ }),
24700
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24701
+ ] })
24702
+ ]
24703
+ }
24704
+ );
24575
24705
  }
24576
24706
  return /* @__PURE__ */ jsx(
24577
24707
  "div",
@@ -24580,6 +24710,7 @@ var init_FilterGroup = __esm({
24580
24710
  "p-4 rounded-container",
24581
24711
  "bg-card",
24582
24712
  "border-[length:var(--border-width)] border-border",
24713
+ lookStyles5[look],
24583
24714
  className
24584
24715
  ),
24585
24716
  children: /* @__PURE__ */ jsxs(HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -29053,7 +29184,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
29053
29184
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
29054
29185
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
29055
29186
  }
29056
- var variantColor, StatDisplay;
29187
+ var lookStyles6, variantColor, StatDisplay;
29057
29188
  var init_StatDisplay = __esm({
29058
29189
  "components/molecules/StatDisplay.tsx"() {
29059
29190
  "use client";
@@ -29065,6 +29196,13 @@ var init_StatDisplay = __esm({
29065
29196
  init_Sparkline();
29066
29197
  init_Icon();
29067
29198
  init_useEventBus();
29199
+ lookStyles6 = {
29200
+ elevated: "",
29201
+ flat: "shadow-none border-[length:var(--border-width)] border-border",
29202
+ "progress-backed": "",
29203
+ gauge: "",
29204
+ sparkline: ""
29205
+ };
29068
29206
  variantColor = {
29069
29207
  default: "text-foreground",
29070
29208
  primary: "text-primary",
@@ -29092,6 +29230,7 @@ var init_StatDisplay = __esm({
29092
29230
  size = "md",
29093
29231
  variant = "default",
29094
29232
  compact = false,
29233
+ look = "elevated",
29095
29234
  className,
29096
29235
  isLoading = false,
29097
29236
  error = null
@@ -29144,7 +29283,7 @@ var init_StatDisplay = __esm({
29144
29283
  return /* @__PURE__ */ jsx(
29145
29284
  Card,
29146
29285
  {
29147
- className: cn(padSizes[size], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
29286
+ className: cn(padSizes[size], lookStyles6[look], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
29148
29287
  onClick: clickEvent ? handleClick : void 0,
29149
29288
  children: /* @__PURE__ */ jsxs(HStack, { align: "start", justify: "between", children: [
29150
29289
  /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -34726,7 +34865,8 @@ function DataTable({
34726
34865
  bulkActions,
34727
34866
  headerActions,
34728
34867
  showTotal = true,
34729
- className
34868
+ className,
34869
+ look = "dense"
34730
34870
  }) {
34731
34871
  const [openActionMenu, setOpenActionMenu] = useState(
34732
34872
  null
@@ -34853,6 +34993,7 @@ function DataTable({
34853
34993
  {
34854
34994
  className: cn(
34855
34995
  "bg-card border-2 border-border rounded-none overflow-hidden",
34996
+ lookStyles7[look],
34856
34997
  className
34857
34998
  ),
34858
34999
  children: [
@@ -35079,6 +35220,7 @@ function DataTable({
35079
35220
  }
35080
35221
  );
35081
35222
  }
35223
+ var lookStyles7;
35082
35224
  var init_DataTable = __esm({
35083
35225
  "components/organisms/DataTable.tsx"() {
35084
35226
  "use client";
@@ -35092,6 +35234,13 @@ var init_DataTable = __esm({
35092
35234
  init_useEventBus();
35093
35235
  init_useTranslate();
35094
35236
  init_types3();
35237
+ lookStyles7 = {
35238
+ dense: "",
35239
+ spacious: "[&_tbody_tr_td]:py-5 [&_thead_tr_th]:py-4",
35240
+ striped: "[&_tbody_tr:nth-child(odd)]:bg-muted/30",
35241
+ borderless: "border-0 [&_thead]:border-b-0 [&_tbody_tr]:border-b-0 [&_tbody]:divide-y-0",
35242
+ "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"
35243
+ };
35095
35244
  DataTable.displayName = "DataTable";
35096
35245
  }
35097
35246
  });
@@ -38250,7 +38399,7 @@ var init_GraphCanvas = __esm({
38250
38399
  GraphCanvas.displayName = "GraphCanvas";
38251
38400
  }
38252
38401
  });
38253
- var Header;
38402
+ var lookStyles8, Header;
38254
38403
  var init_Header = __esm({
38255
38404
  "components/organisms/Header.tsx"() {
38256
38405
  "use client";
@@ -38263,6 +38412,13 @@ var init_Header = __esm({
38263
38412
  init_Typography();
38264
38413
  init_cn();
38265
38414
  init_useTranslate();
38415
+ lookStyles8 = {
38416
+ "compact-bar": "",
38417
+ hero: "py-section min-h-[200px] [&_h1]:text-display-1",
38418
+ breadcrumb: "py-2 text-sm [&_h1]:text-base [&_h1]:font-medium",
38419
+ contextual: "py-3 [&_h1]:text-lg",
38420
+ "editorial-banner": "py-12 [&_h1]:text-display-2 [&_h1]:font-display-bold border-b border-border"
38421
+ };
38266
38422
  Header = ({
38267
38423
  logo,
38268
38424
  logoSrc,
@@ -38280,6 +38436,7 @@ var init_Header = __esm({
38280
38436
  actions,
38281
38437
  sticky = true,
38282
38438
  variant = "mobile",
38439
+ look = "compact-bar",
38283
38440
  onLogoClick,
38284
38441
  className
38285
38442
  }) => {
@@ -38295,6 +38452,7 @@ var init_Header = __esm({
38295
38452
  "flex items-center px-4 justify-between bg-card",
38296
38453
  sticky && "sticky top-0 z-50",
38297
38454
  variant === "mobile" && "lg:hidden",
38455
+ lookStyles8[look],
38298
38456
  className
38299
38457
  ),
38300
38458
  children: [
@@ -44971,7 +45129,7 @@ var init_TeamOrganism = __esm({
44971
45129
  TeamOrganism.displayName = "TeamOrganism";
44972
45130
  }
44973
45131
  });
44974
- var STATUS_STYLES3, Timeline;
45132
+ var lookStyles9, STATUS_STYLES3, Timeline;
44975
45133
  var init_Timeline = __esm({
44976
45134
  "components/organisms/Timeline.tsx"() {
44977
45135
  "use client";
@@ -44982,6 +45140,12 @@ var init_Timeline = __esm({
44982
45140
  init_ErrorState();
44983
45141
  init_EmptyState();
44984
45142
  init_useTranslate();
45143
+ lookStyles9 = {
45144
+ "vertical-compact": "gap-1 [&>*]:py-1",
45145
+ "vertical-spacious": "",
45146
+ horizontal: "flex-row [&>*]:flex-row [&>*]:items-center",
45147
+ swimlane: "flex-row gap-6 [&>*]:flex-row [&>*]:items-center"
45148
+ };
44985
45149
  STATUS_STYLES3 = {
44986
45150
  complete: {
44987
45151
  dotColor: "text-success",
@@ -45012,7 +45176,8 @@ var init_Timeline = __esm({
45012
45176
  entity,
45013
45177
  isLoading = false,
45014
45178
  error,
45015
- className
45179
+ className,
45180
+ look = "vertical-spacious"
45016
45181
  }) => {
45017
45182
  const { t } = useTranslate();
45018
45183
  const entityData = Array.isArray(entity) ? entity : [];
@@ -45068,7 +45233,7 @@ var init_Timeline = __esm({
45068
45233
  }
45069
45234
  return /* @__PURE__ */ jsx(Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
45070
45235
  title && /* @__PURE__ */ jsx(Typography, { variant: "h5", weight: "semibold", children: title }),
45071
- /* @__PURE__ */ jsx(VStack, { gap: "none", className: "relative", children: items.map((item, idx) => {
45236
+ /* @__PURE__ */ jsx(VStack, { gap: "none", className: cn("relative", lookStyles9[look]), children: items.map((item, idx) => {
45072
45237
  const status = item.status || "pending";
45073
45238
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
45074
45239
  const ItemIcon = item.icon || style.icon;