@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.
@@ -1955,7 +1955,7 @@ var init_Overlay = __esm({
1955
1955
  };
1956
1956
  }
1957
1957
  });
1958
- var sizeClasses2, minWidthClasses, Modal;
1958
+ var sizeClasses2, minWidthClasses, lookStyles, Modal;
1959
1959
  var init_Modal = __esm({
1960
1960
  "components/molecules/Modal.tsx"() {
1961
1961
  "use client";
@@ -1980,6 +1980,12 @@ var init_Modal = __esm({
1980
1980
  xl: "min-w-[700px] max-sm:min-w-0",
1981
1981
  full: "min-w-0"
1982
1982
  };
1983
+ lookStyles = {
1984
+ "centered-card": "",
1985
+ "top-sheet": "top-0 rounded-t-none rounded-b-container max-w-full w-full",
1986
+ "side-drawer": "right-0 top-0 bottom-0 h-full rounded-l-container rounded-r-none w-[400px] max-w-full",
1987
+ "full-screen": "inset-0 rounded-none w-full h-full max-w-full"
1988
+ };
1983
1989
  Modal = ({
1984
1990
  isOpen = true,
1985
1991
  onClose = () => {
@@ -1993,7 +1999,8 @@ var init_Modal = __esm({
1993
1999
  closeOnEscape = true,
1994
2000
  className,
1995
2001
  closeEvent,
1996
- swipeDownToClose = true
2002
+ swipeDownToClose = true,
2003
+ look = "centered-card"
1997
2004
  }) => {
1998
2005
  const eventBus = useEventBus();
1999
2006
  const modalRef = React86.useRef(null);
@@ -2078,6 +2085,7 @@ var init_Modal = __esm({
2078
2085
  // Mobile: take the entire screen. Override desktop max-w cap,
2079
2086
  // full height, no rounded corners, no min-width.
2080
2087
  "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2088
+ lookStyles[look],
2081
2089
  className
2082
2090
  ),
2083
2091
  style: dragY > 0 ? {
@@ -3652,7 +3660,7 @@ var init_Checkbox = __esm({
3652
3660
  Checkbox.displayName = "Checkbox";
3653
3661
  }
3654
3662
  });
3655
- var variantStyles4, paddingStyles2, shadowStyles2, lookStyles, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3663
+ var variantStyles4, paddingStyles2, shadowStyles2, lookStyles2, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3656
3664
  var init_Card = __esm({
3657
3665
  "components/atoms/Card.tsx"() {
3658
3666
  init_cn();
@@ -3700,7 +3708,7 @@ var init_Card = __esm({
3700
3708
  md: "shadow",
3701
3709
  lg: "shadow-elevation-dialog"
3702
3710
  };
3703
- lookStyles = {
3711
+ lookStyles2 = {
3704
3712
  elevated: "",
3705
3713
  "flat-bordered": "shadow-none border-[length:var(--border-width)] border-border",
3706
3714
  "borderless-divider": "shadow-none border-0 border-b border-border rounded-none",
@@ -3730,7 +3738,7 @@ var init_Card = __esm({
3730
3738
  "transition-all duration-[var(--transition-normal)]",
3731
3739
  variantStyles4[variant],
3732
3740
  paddingStyles2[padding],
3733
- lookStyles[look],
3741
+ lookStyles2[look],
3734
3742
  shadow && shadowStyles2[shadow],
3735
3743
  className
3736
3744
  ),
@@ -16343,7 +16351,7 @@ var init_BookTableOfContents = __esm({
16343
16351
  BookTableOfContents.displayName = "BookTableOfContents";
16344
16352
  }
16345
16353
  });
16346
- var ICON_NAME_ALIASES, EmptyState;
16354
+ var ICON_NAME_ALIASES, lookStyles3, EmptyState;
16347
16355
  var init_EmptyState = __esm({
16348
16356
  "components/molecules/EmptyState.tsx"() {
16349
16357
  "use client";
@@ -16360,6 +16368,12 @@ var init_EmptyState = __esm({
16360
16368
  error: "x-circle",
16361
16369
  warning: "alert-circle"
16362
16370
  };
16371
+ lookStyles3 = {
16372
+ "icon-only": "",
16373
+ illustrated: "[&_svg]:w-32 [&_svg]:h-32",
16374
+ "text-only": "[&_svg]:hidden",
16375
+ mascot: "[&_svg]:w-24 [&_svg]:h-24 [&_svg]:rounded-pill"
16376
+ };
16363
16377
  EmptyState = ({
16364
16378
  icon,
16365
16379
  title,
@@ -16370,7 +16384,8 @@ var init_EmptyState = __esm({
16370
16384
  className,
16371
16385
  destructive,
16372
16386
  variant,
16373
- actionEvent
16387
+ actionEvent,
16388
+ look = "icon-only"
16374
16389
  }) => {
16375
16390
  const eventBus = useEventBus();
16376
16391
  const { t } = useTranslate();
@@ -16390,6 +16405,7 @@ var init_EmptyState = __esm({
16390
16405
  align: "center",
16391
16406
  className: cn(
16392
16407
  "justify-center py-12 text-center",
16408
+ lookStyles3[look],
16393
16409
  className
16394
16410
  ),
16395
16411
  children: [
@@ -17630,7 +17646,7 @@ function useSafeEventBus2() {
17630
17646
  } };
17631
17647
  }
17632
17648
  }
17633
- var log9, ButtonGroup;
17649
+ var log9, lookStyles4, ButtonGroup;
17634
17650
  var init_ButtonGroup = __esm({
17635
17651
  "components/molecules/ButtonGroup.tsx"() {
17636
17652
  "use client";
@@ -17638,6 +17654,13 @@ var init_ButtonGroup = __esm({
17638
17654
  init_atoms();
17639
17655
  init_useEventBus();
17640
17656
  log9 = logger.createLogger("almadar:ui:button-group");
17657
+ lookStyles4 = {
17658
+ "right-aligned-buttons": "",
17659
+ "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
17660
+ "inline-row": "gap-2 inline-flex",
17661
+ "dropdown-menu": "[&>button:not(:first-child)]:hidden",
17662
+ "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
17663
+ };
17641
17664
  ButtonGroup = ({
17642
17665
  children,
17643
17666
  primary,
@@ -17647,7 +17670,8 @@ var init_ButtonGroup = __esm({
17647
17670
  className,
17648
17671
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
17649
17672
  entity: _entity,
17650
- filters
17673
+ filters,
17674
+ look = "right-aligned-buttons"
17651
17675
  }) => {
17652
17676
  const eventBus = useSafeEventBus2();
17653
17677
  const variantClasses2 = {
@@ -17724,6 +17748,7 @@ var init_ButtonGroup = __esm({
17724
17748
  "inline-flex gap-2",
17725
17749
  variantClasses2[variant],
17726
17750
  orientationClasses[orientation],
17751
+ lookStyles4[look],
17727
17752
  className
17728
17753
  ),
17729
17754
  role: "group",
@@ -20255,7 +20280,7 @@ var init_CastleTemplate = __esm({
20255
20280
  CastleTemplate.displayName = "CastleTemplate";
20256
20281
  }
20257
20282
  });
20258
- var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, Chart;
20283
+ var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, LOOK_FROM_CHART_TYPE, Chart;
20259
20284
  var init_Chart = __esm({
20260
20285
  "components/organisms/Chart.tsx"() {
20261
20286
  "use client";
@@ -20285,7 +20310,7 @@ var init_Chart = __esm({
20285
20310
  if (Number.isNaN(parsed.getTime())) return raw;
20286
20311
  return monthFormatter.format(parsed);
20287
20312
  };
20288
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
20313
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
20289
20314
  const categories = React86.useMemo(() => {
20290
20315
  const set = [];
20291
20316
  const seen = /* @__PURE__ */ new Set();
@@ -20323,6 +20348,64 @@ var init_Chart = __esm({
20323
20348
  }
20324
20349
  return m;
20325
20350
  }, [series, stack, columnTotals]);
20351
+ if (horizontal) {
20352
+ return /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "xs", align: "stretch", className: "w-full", style: { minHeight: height }, children: categories.map((label, catIdx) => {
20353
+ const displayLabel = timeAxis ? formatTimeLabel(label) : label;
20354
+ const total = columnTotals?.[catIdx] ?? 1;
20355
+ return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "w-full", children: [
20356
+ /* @__PURE__ */ jsxRuntime.jsx(
20357
+ Typography,
20358
+ {
20359
+ variant: "caption",
20360
+ color: "secondary",
20361
+ className: "truncate text-right",
20362
+ style: { width: 80, flexShrink: 0 },
20363
+ children: displayLabel
20364
+ }
20365
+ ),
20366
+ /* @__PURE__ */ jsxRuntime.jsx(
20367
+ HStack,
20368
+ {
20369
+ gap: stack === "none" ? "xs" : "none",
20370
+ align: "center",
20371
+ className: "flex-1 min-w-0",
20372
+ style: { height: 24 },
20373
+ children: series.map((s, sIdx) => {
20374
+ const value = valueAt(s, label);
20375
+ const ratio = stack === "normalize" ? total === 0 ? 0 : value / total * 100 : value / maxValue * 100;
20376
+ const color = seriesColor(s, sIdx);
20377
+ return /* @__PURE__ */ jsxRuntime.jsx(
20378
+ Box,
20379
+ {
20380
+ className: "h-full rounded-r-sm transition-all duration-500 ease-out min-w-[2px] cursor-pointer hover:opacity-80",
20381
+ style: {
20382
+ width: `${ratio}%`,
20383
+ backgroundColor: color
20384
+ },
20385
+ onClick: () => onPointClick?.(
20386
+ { label, value, color },
20387
+ s.name
20388
+ ),
20389
+ title: `${s.name}: ${value}`
20390
+ },
20391
+ s.name
20392
+ );
20393
+ })
20394
+ }
20395
+ ),
20396
+ showValues && series.length === 1 && /* @__PURE__ */ jsxRuntime.jsx(
20397
+ Typography,
20398
+ {
20399
+ variant: "caption",
20400
+ color: "secondary",
20401
+ className: "tabular-nums",
20402
+ style: { width: 40, flexShrink: 0 },
20403
+ children: valueAt(series[0], label)
20404
+ }
20405
+ )
20406
+ ] }, label);
20407
+ }) });
20408
+ }
20326
20409
  return /* @__PURE__ */ jsxRuntime.jsx(
20327
20410
  HStack,
20328
20411
  {
@@ -20750,10 +20833,20 @@ var init_Chart = __esm({
20750
20833
  }
20751
20834
  );
20752
20835
  };
20836
+ LOOK_FROM_CHART_TYPE = {
20837
+ bar: "bar-vertical",
20838
+ line: "line",
20839
+ pie: "pie",
20840
+ area: "area",
20841
+ donut: "donut",
20842
+ scatter: "scatter",
20843
+ histogram: "histogram"
20844
+ };
20753
20845
  Chart = ({
20754
20846
  title,
20755
20847
  subtitle,
20756
- chartType = "bar",
20848
+ chartType,
20849
+ look,
20757
20850
  series,
20758
20851
  data: simpleData,
20759
20852
  scatterData,
@@ -20769,6 +20862,7 @@ var init_Chart = __esm({
20769
20862
  error,
20770
20863
  className
20771
20864
  }) => {
20865
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
20772
20866
  const eventBus = useEventBus();
20773
20867
  const { t } = useTranslate();
20774
20868
  const handleAction = React86.useCallback(
@@ -20797,7 +20891,7 @@ var init_Chart = __esm({
20797
20891
  return [];
20798
20892
  }, [simpleData, series]);
20799
20893
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
20800
- const hasContent = chartType === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20894
+ const hasContent = resolvedLook === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20801
20895
  if (isLoading) {
20802
20896
  return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading chart...", className });
20803
20897
  }
@@ -20832,7 +20926,18 @@ var init_Chart = __esm({
20832
20926
  )) })
20833
20927
  ] }),
20834
20928
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "w-full", children: [
20835
- chartType === "bar" && /* @__PURE__ */ jsxRuntime.jsx(
20929
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsxRuntime.jsx(
20930
+ BarChart,
20931
+ {
20932
+ series: normalizedSeries,
20933
+ height,
20934
+ showValues,
20935
+ stack,
20936
+ timeAxis,
20937
+ onPointClick: handlePointClick
20938
+ }
20939
+ ),
20940
+ resolvedLook === "bar-horizontal" && /* @__PURE__ */ jsxRuntime.jsx(
20836
20941
  BarChart,
20837
20942
  {
20838
20943
  series: normalizedSeries,
@@ -20840,10 +20945,11 @@ var init_Chart = __esm({
20840
20945
  showValues,
20841
20946
  stack,
20842
20947
  timeAxis,
20948
+ horizontal: true,
20843
20949
  onPointClick: handlePointClick
20844
20950
  }
20845
20951
  ),
20846
- chartType === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
20952
+ resolvedLook === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
20847
20953
  BarChart,
20848
20954
  {
20849
20955
  series: normalizedSeries,
@@ -20855,7 +20961,7 @@ var init_Chart = __esm({
20855
20961
  onPointClick: handlePointClick
20856
20962
  }
20857
20963
  ),
20858
- chartType === "line" && /* @__PURE__ */ jsxRuntime.jsx(
20964
+ resolvedLook === "line" && /* @__PURE__ */ jsxRuntime.jsx(
20859
20965
  LineChart,
20860
20966
  {
20861
20967
  series: normalizedSeries,
@@ -20865,7 +20971,7 @@ var init_Chart = __esm({
20865
20971
  onPointClick: handlePointClick
20866
20972
  }
20867
20973
  ),
20868
- chartType === "area" && /* @__PURE__ */ jsxRuntime.jsx(
20974
+ resolvedLook === "area" && /* @__PURE__ */ jsxRuntime.jsx(
20869
20975
  LineChart,
20870
20976
  {
20871
20977
  series: normalizedSeries,
@@ -20876,7 +20982,7 @@ var init_Chart = __esm({
20876
20982
  onPointClick: handlePointClick
20877
20983
  }
20878
20984
  ),
20879
- chartType === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
20985
+ resolvedLook === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
20880
20986
  PieChart,
20881
20987
  {
20882
20988
  data: firstSeriesData,
@@ -20885,7 +20991,7 @@ var init_Chart = __esm({
20885
20991
  onPointClick: handlePointClick
20886
20992
  }
20887
20993
  ),
20888
- chartType === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
20994
+ resolvedLook === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
20889
20995
  PieChart,
20890
20996
  {
20891
20997
  data: firstSeriesData,
@@ -20895,7 +21001,7 @@ var init_Chart = __esm({
20895
21001
  onPointClick: handlePointClick
20896
21002
  }
20897
21003
  ),
20898
- chartType === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
21004
+ resolvedLook === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
20899
21005
  ScatterChart,
20900
21006
  {
20901
21007
  data: scatterData ?? [],
@@ -24318,7 +24424,7 @@ var init_useQuerySingleton = __esm({
24318
24424
  queryStores = /* @__PURE__ */ new Map();
24319
24425
  }
24320
24426
  });
24321
- var resolveFilterType, FilterGroup;
24427
+ var resolveFilterType, lookStyles5, FilterGroup;
24322
24428
  var init_FilterGroup = __esm({
24323
24429
  "components/molecules/FilterGroup.tsx"() {
24324
24430
  "use client";
@@ -24332,6 +24438,13 @@ var init_FilterGroup = __esm({
24332
24438
  init_useEventBus();
24333
24439
  init_useQuerySingleton();
24334
24440
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24441
+ lookStyles5 = {
24442
+ toolbar: "",
24443
+ chips: "gap-2 [&>*]:rounded-pill [&>*]:px-3 [&>*]:py-1",
24444
+ pills: "gap-2 [&>*]:rounded-pill",
24445
+ "popover-trigger": "[&>*:not(:first-child)]:hidden",
24446
+ "inline-column-header": "hidden"
24447
+ };
24335
24448
  FilterGroup = ({
24336
24449
  entity,
24337
24450
  filters,
@@ -24341,7 +24454,8 @@ var init_FilterGroup = __esm({
24341
24454
  variant = "default",
24342
24455
  showIcon = true,
24343
24456
  query,
24344
- isLoading
24457
+ isLoading,
24458
+ look = "toolbar"
24345
24459
  }) => {
24346
24460
  const eventBus = useEventBus();
24347
24461
  const queryState = useQuerySingleton(query);
@@ -24396,63 +24510,71 @@ var init_FilterGroup = __esm({
24396
24510
  }, [onClearAll, queryState, eventBus, entity, query]);
24397
24511
  const activeFilterCount = Object.keys(selectedValues).length;
24398
24512
  if (variant === "pills") {
24399
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
24400
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24401
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24402
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24403
- filter.label,
24404
- ":"
24405
- ] }),
24406
- /* @__PURE__ */ jsxRuntime.jsxs(
24407
- HStack,
24408
- {
24409
- gap: "none",
24410
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24411
- children: [
24412
- /* @__PURE__ */ jsxRuntime.jsx(
24413
- "button",
24414
- {
24415
- type: "button",
24416
- onClick: () => handleFilterSelect(filter.field, null),
24417
- className: cn(
24418
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24419
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24420
- ),
24421
- children: "All"
24422
- }
24423
- ),
24424
- filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
24425
- "button",
24426
- {
24427
- type: "button",
24428
- onClick: () => handleFilterSelect(filter.field, option),
24429
- className: cn(
24430
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24431
- "border-l-[length:var(--border-width)] border-border",
24432
- selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24513
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24514
+ HStack,
24515
+ {
24516
+ gap: "md",
24517
+ align: "center",
24518
+ className: cn("flex-wrap", lookStyles5[look], className),
24519
+ children: [
24520
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24521
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24522
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24523
+ filter.label,
24524
+ ":"
24525
+ ] }),
24526
+ /* @__PURE__ */ jsxRuntime.jsxs(
24527
+ HStack,
24528
+ {
24529
+ gap: "none",
24530
+ className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24531
+ children: [
24532
+ /* @__PURE__ */ jsxRuntime.jsx(
24533
+ "button",
24534
+ {
24535
+ type: "button",
24536
+ onClick: () => handleFilterSelect(filter.field, null),
24537
+ className: cn(
24538
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24539
+ !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24540
+ ),
24541
+ children: "All"
24542
+ }
24433
24543
  ),
24434
- children: option
24435
- },
24436
- option
24437
- ))
24438
- ]
24439
- }
24440
- )
24441
- ] }, filter.field)),
24442
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
24443
- Button,
24444
- {
24445
- variant: "ghost",
24446
- size: "sm",
24447
- onClick: handleClearAll,
24448
- leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24449
- children: "Clear"
24450
- }
24451
- )
24452
- ] });
24544
+ filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
24545
+ "button",
24546
+ {
24547
+ type: "button",
24548
+ onClick: () => handleFilterSelect(filter.field, option),
24549
+ className: cn(
24550
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24551
+ "border-l-[length:var(--border-width)] border-border",
24552
+ selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24553
+ ),
24554
+ children: option
24555
+ },
24556
+ option
24557
+ ))
24558
+ ]
24559
+ }
24560
+ )
24561
+ ] }, filter.field)),
24562
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
24563
+ Button,
24564
+ {
24565
+ variant: "ghost",
24566
+ size: "sm",
24567
+ onClick: handleClearAll,
24568
+ leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24569
+ children: "Clear"
24570
+ }
24571
+ )
24572
+ ]
24573
+ }
24574
+ );
24453
24575
  }
24454
24576
  if (variant === "vertical") {
24455
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
24577
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles5[look], className), children: [
24456
24578
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24457
24579
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24458
24580
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -24535,92 +24657,100 @@ var init_FilterGroup = __esm({
24535
24657
  ] });
24536
24658
  }
24537
24659
  if (variant === "compact") {
24538
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
24539
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24540
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
24541
- Input,
24542
- {
24543
- type: "date",
24544
- value: selectedValues[filter.field] || "",
24545
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24546
- clearable: true,
24547
- onClear: () => handleFilterSelect(filter.field, null),
24548
- className: "text-sm"
24549
- }
24550
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24551
- /* @__PURE__ */ jsxRuntime.jsx(
24552
- Input,
24553
- {
24554
- type: "date",
24555
- value: selectedValues[`${filter.field}_from`] || "",
24556
- onChange: (e) => handleFilterSelect(
24557
- `${filter.field}_from`,
24558
- e.target.value || null
24559
- ),
24560
- className: "text-sm min-w-[100px]"
24561
- }
24562
- ),
24563
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
24564
- /* @__PURE__ */ jsxRuntime.jsx(
24565
- Input,
24566
- {
24567
- type: "date",
24568
- value: selectedValues[`${filter.field}_to`] || "",
24569
- onChange: (e) => handleFilterSelect(
24570
- `${filter.field}_to`,
24571
- e.target.value || null
24660
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24661
+ HStack,
24662
+ {
24663
+ gap: "sm",
24664
+ align: "center",
24665
+ className: cn("flex-wrap", lookStyles5[look], className),
24666
+ children: [
24667
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24668
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
24669
+ Input,
24670
+ {
24671
+ type: "date",
24672
+ value: selectedValues[filter.field] || "",
24673
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24674
+ clearable: true,
24675
+ onClear: () => handleFilterSelect(filter.field, null),
24676
+ className: "text-sm"
24677
+ }
24678
+ ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24679
+ /* @__PURE__ */ jsxRuntime.jsx(
24680
+ Input,
24681
+ {
24682
+ type: "date",
24683
+ value: selectedValues[`${filter.field}_from`] || "",
24684
+ onChange: (e) => handleFilterSelect(
24685
+ `${filter.field}_from`,
24686
+ e.target.value || null
24687
+ ),
24688
+ className: "text-sm min-w-[100px]"
24689
+ }
24572
24690
  ),
24573
- className: "text-sm min-w-[100px]"
24574
- }
24575
- )
24576
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
24577
- Input,
24578
- {
24579
- value: selectedValues[filter.field] || "",
24580
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24581
- placeholder: filter.label,
24582
- clearable: true,
24583
- onClear: () => handleFilterSelect(filter.field, null),
24584
- className: "text-sm"
24585
- }
24586
- ) : /* @__PURE__ */ jsxRuntime.jsx(
24587
- Select,
24588
- {
24589
- value: selectedValues[filter.field] || "all",
24590
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24591
- options: [
24592
- { value: "all", label: `All ${filter.label}` },
24593
- ...filter.options?.map((opt) => ({
24594
- value: opt,
24595
- label: opt
24596
- })) || []
24597
- ],
24598
- className: "text-sm"
24599
- }
24600
- ) }, filter.field)),
24601
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24602
- Object.entries(selectedValues).map(([field, value]) => {
24603
- const filterDef = filters.find((f3) => f3.field === field);
24604
- return /* @__PURE__ */ jsxRuntime.jsxs(
24605
- Badge,
24691
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
24692
+ /* @__PURE__ */ jsxRuntime.jsx(
24693
+ Input,
24694
+ {
24695
+ type: "date",
24696
+ value: selectedValues[`${filter.field}_to`] || "",
24697
+ onChange: (e) => handleFilterSelect(
24698
+ `${filter.field}_to`,
24699
+ e.target.value || null
24700
+ ),
24701
+ className: "text-sm min-w-[100px]"
24702
+ }
24703
+ )
24704
+ ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
24705
+ Input,
24606
24706
  {
24607
- variant: "primary",
24608
- size: "md",
24609
- className: "cursor-pointer",
24610
- onClick: () => handleFilterSelect(field, null),
24611
- children: [
24612
- filterDef?.label,
24613
- ": ",
24614
- value,
24615
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24616
- ]
24617
- },
24618
- field
24619
- );
24620
- }),
24621
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24622
- ] })
24623
- ] });
24707
+ value: selectedValues[filter.field] || "",
24708
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24709
+ placeholder: filter.label,
24710
+ clearable: true,
24711
+ onClear: () => handleFilterSelect(filter.field, null),
24712
+ className: "text-sm"
24713
+ }
24714
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
24715
+ Select,
24716
+ {
24717
+ value: selectedValues[filter.field] || "all",
24718
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24719
+ options: [
24720
+ { value: "all", label: `All ${filter.label}` },
24721
+ ...filter.options?.map((opt) => ({
24722
+ value: opt,
24723
+ label: opt
24724
+ })) || []
24725
+ ],
24726
+ className: "text-sm"
24727
+ }
24728
+ ) }, filter.field)),
24729
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24730
+ Object.entries(selectedValues).map(([field, value]) => {
24731
+ const filterDef = filters.find((f3) => f3.field === field);
24732
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24733
+ Badge,
24734
+ {
24735
+ variant: "primary",
24736
+ size: "md",
24737
+ className: "cursor-pointer",
24738
+ onClick: () => handleFilterSelect(field, null),
24739
+ children: [
24740
+ filterDef?.label,
24741
+ ": ",
24742
+ value,
24743
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24744
+ ]
24745
+ },
24746
+ field
24747
+ );
24748
+ }),
24749
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24750
+ ] })
24751
+ ]
24752
+ }
24753
+ );
24624
24754
  }
24625
24755
  return /* @__PURE__ */ jsxRuntime.jsx(
24626
24756
  "div",
@@ -24629,6 +24759,7 @@ var init_FilterGroup = __esm({
24629
24759
  "p-4 rounded-container",
24630
24760
  "bg-card",
24631
24761
  "border-[length:var(--border-width)] border-border",
24762
+ lookStyles5[look],
24632
24763
  className
24633
24764
  ),
24634
24765
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -29102,7 +29233,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
29102
29233
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
29103
29234
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
29104
29235
  }
29105
- var variantColor, StatDisplay;
29236
+ var lookStyles6, variantColor, StatDisplay;
29106
29237
  var init_StatDisplay = __esm({
29107
29238
  "components/molecules/StatDisplay.tsx"() {
29108
29239
  "use client";
@@ -29114,6 +29245,13 @@ var init_StatDisplay = __esm({
29114
29245
  init_Sparkline();
29115
29246
  init_Icon();
29116
29247
  init_useEventBus();
29248
+ lookStyles6 = {
29249
+ elevated: "",
29250
+ flat: "shadow-none border-[length:var(--border-width)] border-border",
29251
+ "progress-backed": "",
29252
+ gauge: "",
29253
+ sparkline: ""
29254
+ };
29117
29255
  variantColor = {
29118
29256
  default: "text-foreground",
29119
29257
  primary: "text-primary",
@@ -29141,6 +29279,7 @@ var init_StatDisplay = __esm({
29141
29279
  size = "md",
29142
29280
  variant = "default",
29143
29281
  compact = false,
29282
+ look = "elevated",
29144
29283
  className,
29145
29284
  isLoading = false,
29146
29285
  error = null
@@ -29193,7 +29332,7 @@ var init_StatDisplay = __esm({
29193
29332
  return /* @__PURE__ */ jsxRuntime.jsx(
29194
29333
  Card,
29195
29334
  {
29196
- className: cn(padSizes[size], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
29335
+ className: cn(padSizes[size], lookStyles6[look], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
29197
29336
  onClick: clickEvent ? handleClick : void 0,
29198
29337
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { align: "start", justify: "between", children: [
29199
29338
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -34775,7 +34914,8 @@ function DataTable({
34775
34914
  bulkActions,
34776
34915
  headerActions,
34777
34916
  showTotal = true,
34778
- className
34917
+ className,
34918
+ look = "dense"
34779
34919
  }) {
34780
34920
  const [openActionMenu, setOpenActionMenu] = React86.useState(
34781
34921
  null
@@ -34902,6 +35042,7 @@ function DataTable({
34902
35042
  {
34903
35043
  className: cn(
34904
35044
  "bg-card border-2 border-border rounded-none overflow-hidden",
35045
+ lookStyles7[look],
34905
35046
  className
34906
35047
  ),
34907
35048
  children: [
@@ -35128,6 +35269,7 @@ function DataTable({
35128
35269
  }
35129
35270
  );
35130
35271
  }
35272
+ var lookStyles7;
35131
35273
  var init_DataTable = __esm({
35132
35274
  "components/organisms/DataTable.tsx"() {
35133
35275
  "use client";
@@ -35141,6 +35283,13 @@ var init_DataTable = __esm({
35141
35283
  init_useEventBus();
35142
35284
  init_useTranslate();
35143
35285
  init_types3();
35286
+ lookStyles7 = {
35287
+ dense: "",
35288
+ spacious: "[&_tbody_tr_td]:py-5 [&_thead_tr_th]:py-4",
35289
+ striped: "[&_tbody_tr:nth-child(odd)]:bg-muted/30",
35290
+ borderless: "border-0 [&_thead]:border-b-0 [&_tbody_tr]:border-b-0 [&_tbody]:divide-y-0",
35291
+ "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"
35292
+ };
35144
35293
  DataTable.displayName = "DataTable";
35145
35294
  }
35146
35295
  });
@@ -38299,7 +38448,7 @@ var init_GraphCanvas = __esm({
38299
38448
  GraphCanvas.displayName = "GraphCanvas";
38300
38449
  }
38301
38450
  });
38302
- var Header;
38451
+ var lookStyles8, Header;
38303
38452
  var init_Header = __esm({
38304
38453
  "components/organisms/Header.tsx"() {
38305
38454
  "use client";
@@ -38312,6 +38461,13 @@ var init_Header = __esm({
38312
38461
  init_Typography();
38313
38462
  init_cn();
38314
38463
  init_useTranslate();
38464
+ lookStyles8 = {
38465
+ "compact-bar": "",
38466
+ hero: "py-section min-h-[200px] [&_h1]:text-display-1",
38467
+ breadcrumb: "py-2 text-sm [&_h1]:text-base [&_h1]:font-medium",
38468
+ contextual: "py-3 [&_h1]:text-lg",
38469
+ "editorial-banner": "py-12 [&_h1]:text-display-2 [&_h1]:font-display-bold border-b border-border"
38470
+ };
38315
38471
  Header = ({
38316
38472
  logo,
38317
38473
  logoSrc,
@@ -38329,6 +38485,7 @@ var init_Header = __esm({
38329
38485
  actions,
38330
38486
  sticky = true,
38331
38487
  variant = "mobile",
38488
+ look = "compact-bar",
38332
38489
  onLogoClick,
38333
38490
  className
38334
38491
  }) => {
@@ -38344,6 +38501,7 @@ var init_Header = __esm({
38344
38501
  "flex items-center px-4 justify-between bg-card",
38345
38502
  sticky && "sticky top-0 z-50",
38346
38503
  variant === "mobile" && "lg:hidden",
38504
+ lookStyles8[look],
38347
38505
  className
38348
38506
  ),
38349
38507
  children: [
@@ -45020,7 +45178,7 @@ var init_TeamOrganism = __esm({
45020
45178
  TeamOrganism.displayName = "TeamOrganism";
45021
45179
  }
45022
45180
  });
45023
- var STATUS_STYLES3, Timeline;
45181
+ var lookStyles9, STATUS_STYLES3, Timeline;
45024
45182
  var init_Timeline = __esm({
45025
45183
  "components/organisms/Timeline.tsx"() {
45026
45184
  "use client";
@@ -45031,6 +45189,12 @@ var init_Timeline = __esm({
45031
45189
  init_ErrorState();
45032
45190
  init_EmptyState();
45033
45191
  init_useTranslate();
45192
+ lookStyles9 = {
45193
+ "vertical-compact": "gap-1 [&>*]:py-1",
45194
+ "vertical-spacious": "",
45195
+ horizontal: "flex-row [&>*]:flex-row [&>*]:items-center",
45196
+ swimlane: "flex-row gap-6 [&>*]:flex-row [&>*]:items-center"
45197
+ };
45034
45198
  STATUS_STYLES3 = {
45035
45199
  complete: {
45036
45200
  dotColor: "text-success",
@@ -45061,7 +45225,8 @@ var init_Timeline = __esm({
45061
45225
  entity,
45062
45226
  isLoading = false,
45063
45227
  error,
45064
- className
45228
+ className,
45229
+ look = "vertical-spacious"
45065
45230
  }) => {
45066
45231
  const { t } = useTranslate();
45067
45232
  const entityData = Array.isArray(entity) ? entity : [];
@@ -45117,7 +45282,7 @@ var init_Timeline = __esm({
45117
45282
  }
45118
45283
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "md", children: [
45119
45284
  title && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h5", weight: "semibold", children: title }),
45120
- /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: "relative", children: items.map((item, idx) => {
45285
+ /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: cn("relative", lookStyles9[look]), children: items.map((item, idx) => {
45121
45286
  const status = item.status || "pending";
45122
45287
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
45123
45288
  const ItemIcon = item.icon || style.icon;