@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.
@@ -6770,7 +6770,7 @@ var init_Overlay = __esm({
6770
6770
  };
6771
6771
  }
6772
6772
  });
6773
- var sizeClasses2, minWidthClasses, Modal;
6773
+ var sizeClasses2, minWidthClasses, lookStyles, Modal;
6774
6774
  var init_Modal = __esm({
6775
6775
  "components/molecules/Modal.tsx"() {
6776
6776
  "use client";
@@ -6795,6 +6795,12 @@ var init_Modal = __esm({
6795
6795
  xl: "min-w-[700px] max-sm:min-w-0",
6796
6796
  full: "min-w-0"
6797
6797
  };
6798
+ lookStyles = {
6799
+ "centered-card": "",
6800
+ "top-sheet": "top-0 rounded-t-none rounded-b-container max-w-full w-full",
6801
+ "side-drawer": "right-0 top-0 bottom-0 h-full rounded-l-container rounded-r-none w-[400px] max-w-full",
6802
+ "full-screen": "inset-0 rounded-none w-full h-full max-w-full"
6803
+ };
6798
6804
  Modal = ({
6799
6805
  isOpen = true,
6800
6806
  onClose = () => {
@@ -6808,7 +6814,8 @@ var init_Modal = __esm({
6808
6814
  closeOnEscape = true,
6809
6815
  className,
6810
6816
  closeEvent,
6811
- swipeDownToClose = true
6817
+ swipeDownToClose = true,
6818
+ look = "centered-card"
6812
6819
  }) => {
6813
6820
  const eventBus = useEventBus();
6814
6821
  const modalRef = React98.useRef(null);
@@ -6893,6 +6900,7 @@ var init_Modal = __esm({
6893
6900
  // Mobile: take the entire screen. Override desktop max-w cap,
6894
6901
  // full height, no rounded corners, no min-width.
6895
6902
  "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
6903
+ lookStyles[look],
6896
6904
  className
6897
6905
  ),
6898
6906
  style: dragY > 0 ? {
@@ -8467,7 +8475,7 @@ var init_Checkbox = __esm({
8467
8475
  Checkbox.displayName = "Checkbox";
8468
8476
  }
8469
8477
  });
8470
- var variantStyles4, paddingStyles2, shadowStyles2, lookStyles, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
8478
+ var variantStyles4, paddingStyles2, shadowStyles2, lookStyles2, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
8471
8479
  var init_Card = __esm({
8472
8480
  "components/atoms/Card.tsx"() {
8473
8481
  init_cn();
@@ -8515,7 +8523,7 @@ var init_Card = __esm({
8515
8523
  md: "shadow",
8516
8524
  lg: "shadow-elevation-dialog"
8517
8525
  };
8518
- lookStyles = {
8526
+ lookStyles2 = {
8519
8527
  elevated: "",
8520
8528
  "flat-bordered": "shadow-none border-[length:var(--border-width)] border-border",
8521
8529
  "borderless-divider": "shadow-none border-0 border-b border-border rounded-none",
@@ -8545,7 +8553,7 @@ var init_Card = __esm({
8545
8553
  "transition-all duration-[var(--transition-normal)]",
8546
8554
  variantStyles4[variant],
8547
8555
  paddingStyles2[padding],
8548
- lookStyles[look],
8556
+ lookStyles2[look],
8549
8557
  shadow && shadowStyles2[shadow],
8550
8558
  className
8551
8559
  ),
@@ -19931,7 +19939,7 @@ var init_BookTableOfContents = __esm({
19931
19939
  BookTableOfContents.displayName = "BookTableOfContents";
19932
19940
  }
19933
19941
  });
19934
- var ICON_NAME_ALIASES, EmptyState;
19942
+ var ICON_NAME_ALIASES, lookStyles3, EmptyState;
19935
19943
  var init_EmptyState = __esm({
19936
19944
  "components/molecules/EmptyState.tsx"() {
19937
19945
  "use client";
@@ -19948,6 +19956,12 @@ var init_EmptyState = __esm({
19948
19956
  error: "x-circle",
19949
19957
  warning: "alert-circle"
19950
19958
  };
19959
+ lookStyles3 = {
19960
+ "icon-only": "",
19961
+ illustrated: "[&_svg]:w-32 [&_svg]:h-32",
19962
+ "text-only": "[&_svg]:hidden",
19963
+ mascot: "[&_svg]:w-24 [&_svg]:h-24 [&_svg]:rounded-pill"
19964
+ };
19951
19965
  EmptyState = ({
19952
19966
  icon,
19953
19967
  title,
@@ -19958,7 +19972,8 @@ var init_EmptyState = __esm({
19958
19972
  className,
19959
19973
  destructive,
19960
19974
  variant,
19961
- actionEvent
19975
+ actionEvent,
19976
+ look = "icon-only"
19962
19977
  }) => {
19963
19978
  const eventBus = useEventBus();
19964
19979
  const { t } = useTranslate();
@@ -19978,6 +19993,7 @@ var init_EmptyState = __esm({
19978
19993
  align: "center",
19979
19994
  className: cn(
19980
19995
  "justify-center py-12 text-center",
19996
+ lookStyles3[look],
19981
19997
  className
19982
19998
  ),
19983
19999
  children: [
@@ -21218,7 +21234,7 @@ function useSafeEventBus2() {
21218
21234
  } };
21219
21235
  }
21220
21236
  }
21221
- var log9, ButtonGroup;
21237
+ var log9, lookStyles4, ButtonGroup;
21222
21238
  var init_ButtonGroup = __esm({
21223
21239
  "components/molecules/ButtonGroup.tsx"() {
21224
21240
  "use client";
@@ -21226,6 +21242,13 @@ var init_ButtonGroup = __esm({
21226
21242
  init_atoms();
21227
21243
  init_useEventBus();
21228
21244
  log9 = logger.createLogger("almadar:ui:button-group");
21245
+ lookStyles4 = {
21246
+ "right-aligned-buttons": "",
21247
+ "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
21248
+ "inline-row": "gap-2 inline-flex",
21249
+ "dropdown-menu": "[&>button:not(:first-child)]:hidden",
21250
+ "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
21251
+ };
21229
21252
  ButtonGroup = ({
21230
21253
  children,
21231
21254
  primary,
@@ -21235,7 +21258,8 @@ var init_ButtonGroup = __esm({
21235
21258
  className,
21236
21259
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
21237
21260
  entity: _entity,
21238
- filters
21261
+ filters,
21262
+ look = "right-aligned-buttons"
21239
21263
  }) => {
21240
21264
  const eventBus = useSafeEventBus2();
21241
21265
  const variantClasses2 = {
@@ -21312,6 +21336,7 @@ var init_ButtonGroup = __esm({
21312
21336
  "inline-flex gap-2",
21313
21337
  variantClasses2[variant],
21314
21338
  orientationClasses[orientation],
21339
+ lookStyles4[look],
21315
21340
  className
21316
21341
  ),
21317
21342
  role: "group",
@@ -23843,7 +23868,7 @@ var init_CastleTemplate = __esm({
23843
23868
  CastleTemplate.displayName = "CastleTemplate";
23844
23869
  }
23845
23870
  });
23846
- var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, Chart;
23871
+ var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, LOOK_FROM_CHART_TYPE, Chart;
23847
23872
  var init_Chart = __esm({
23848
23873
  "components/organisms/Chart.tsx"() {
23849
23874
  "use client";
@@ -23873,7 +23898,7 @@ var init_Chart = __esm({
23873
23898
  if (Number.isNaN(parsed.getTime())) return raw;
23874
23899
  return monthFormatter.format(parsed);
23875
23900
  };
23876
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
23901
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
23877
23902
  const categories = React98.useMemo(() => {
23878
23903
  const set = [];
23879
23904
  const seen = /* @__PURE__ */ new Set();
@@ -23911,6 +23936,64 @@ var init_Chart = __esm({
23911
23936
  }
23912
23937
  return m;
23913
23938
  }, [series, stack, columnTotals]);
23939
+ if (horizontal) {
23940
+ return /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "xs", align: "stretch", className: "w-full", style: { minHeight: height }, children: categories.map((label, catIdx) => {
23941
+ const displayLabel = timeAxis ? formatTimeLabel(label) : label;
23942
+ const total = columnTotals?.[catIdx] ?? 1;
23943
+ return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "w-full", children: [
23944
+ /* @__PURE__ */ jsxRuntime.jsx(
23945
+ Typography,
23946
+ {
23947
+ variant: "caption",
23948
+ color: "secondary",
23949
+ className: "truncate text-right",
23950
+ style: { width: 80, flexShrink: 0 },
23951
+ children: displayLabel
23952
+ }
23953
+ ),
23954
+ /* @__PURE__ */ jsxRuntime.jsx(
23955
+ HStack,
23956
+ {
23957
+ gap: stack === "none" ? "xs" : "none",
23958
+ align: "center",
23959
+ className: "flex-1 min-w-0",
23960
+ style: { height: 24 },
23961
+ children: series.map((s, sIdx) => {
23962
+ const value = valueAt(s, label);
23963
+ const ratio = stack === "normalize" ? total === 0 ? 0 : value / total * 100 : value / maxValue * 100;
23964
+ const color = seriesColor(s, sIdx);
23965
+ return /* @__PURE__ */ jsxRuntime.jsx(
23966
+ Box,
23967
+ {
23968
+ className: "h-full rounded-r-sm transition-all duration-500 ease-out min-w-[2px] cursor-pointer hover:opacity-80",
23969
+ style: {
23970
+ width: `${ratio}%`,
23971
+ backgroundColor: color
23972
+ },
23973
+ onClick: () => onPointClick?.(
23974
+ { label, value, color },
23975
+ s.name
23976
+ ),
23977
+ title: `${s.name}: ${value}`
23978
+ },
23979
+ s.name
23980
+ );
23981
+ })
23982
+ }
23983
+ ),
23984
+ showValues && series.length === 1 && /* @__PURE__ */ jsxRuntime.jsx(
23985
+ Typography,
23986
+ {
23987
+ variant: "caption",
23988
+ color: "secondary",
23989
+ className: "tabular-nums",
23990
+ style: { width: 40, flexShrink: 0 },
23991
+ children: valueAt(series[0], label)
23992
+ }
23993
+ )
23994
+ ] }, label);
23995
+ }) });
23996
+ }
23914
23997
  return /* @__PURE__ */ jsxRuntime.jsx(
23915
23998
  HStack,
23916
23999
  {
@@ -24338,10 +24421,20 @@ var init_Chart = __esm({
24338
24421
  }
24339
24422
  );
24340
24423
  };
24424
+ LOOK_FROM_CHART_TYPE = {
24425
+ bar: "bar-vertical",
24426
+ line: "line",
24427
+ pie: "pie",
24428
+ area: "area",
24429
+ donut: "donut",
24430
+ scatter: "scatter",
24431
+ histogram: "histogram"
24432
+ };
24341
24433
  Chart = ({
24342
24434
  title,
24343
24435
  subtitle,
24344
- chartType = "bar",
24436
+ chartType,
24437
+ look,
24345
24438
  series,
24346
24439
  data: simpleData,
24347
24440
  scatterData,
@@ -24357,6 +24450,7 @@ var init_Chart = __esm({
24357
24450
  error,
24358
24451
  className
24359
24452
  }) => {
24453
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
24360
24454
  const eventBus = useEventBus();
24361
24455
  const { t } = useTranslate();
24362
24456
  const handleAction = React98.useCallback(
@@ -24385,7 +24479,7 @@ var init_Chart = __esm({
24385
24479
  return [];
24386
24480
  }, [simpleData, series]);
24387
24481
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
24388
- const hasContent = chartType === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
24482
+ const hasContent = resolvedLook === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
24389
24483
  if (isLoading) {
24390
24484
  return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading chart...", className });
24391
24485
  }
@@ -24420,7 +24514,18 @@ var init_Chart = __esm({
24420
24514
  )) })
24421
24515
  ] }),
24422
24516
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "w-full", children: [
24423
- chartType === "bar" && /* @__PURE__ */ jsxRuntime.jsx(
24517
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsxRuntime.jsx(
24518
+ BarChart,
24519
+ {
24520
+ series: normalizedSeries,
24521
+ height,
24522
+ showValues,
24523
+ stack,
24524
+ timeAxis,
24525
+ onPointClick: handlePointClick
24526
+ }
24527
+ ),
24528
+ resolvedLook === "bar-horizontal" && /* @__PURE__ */ jsxRuntime.jsx(
24424
24529
  BarChart,
24425
24530
  {
24426
24531
  series: normalizedSeries,
@@ -24428,10 +24533,11 @@ var init_Chart = __esm({
24428
24533
  showValues,
24429
24534
  stack,
24430
24535
  timeAxis,
24536
+ horizontal: true,
24431
24537
  onPointClick: handlePointClick
24432
24538
  }
24433
24539
  ),
24434
- chartType === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
24540
+ resolvedLook === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
24435
24541
  BarChart,
24436
24542
  {
24437
24543
  series: normalizedSeries,
@@ -24443,7 +24549,7 @@ var init_Chart = __esm({
24443
24549
  onPointClick: handlePointClick
24444
24550
  }
24445
24551
  ),
24446
- chartType === "line" && /* @__PURE__ */ jsxRuntime.jsx(
24552
+ resolvedLook === "line" && /* @__PURE__ */ jsxRuntime.jsx(
24447
24553
  LineChart,
24448
24554
  {
24449
24555
  series: normalizedSeries,
@@ -24453,7 +24559,7 @@ var init_Chart = __esm({
24453
24559
  onPointClick: handlePointClick
24454
24560
  }
24455
24561
  ),
24456
- chartType === "area" && /* @__PURE__ */ jsxRuntime.jsx(
24562
+ resolvedLook === "area" && /* @__PURE__ */ jsxRuntime.jsx(
24457
24563
  LineChart,
24458
24564
  {
24459
24565
  series: normalizedSeries,
@@ -24464,7 +24570,7 @@ var init_Chart = __esm({
24464
24570
  onPointClick: handlePointClick
24465
24571
  }
24466
24572
  ),
24467
- chartType === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
24573
+ resolvedLook === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
24468
24574
  PieChart,
24469
24575
  {
24470
24576
  data: firstSeriesData,
@@ -24473,7 +24579,7 @@ var init_Chart = __esm({
24473
24579
  onPointClick: handlePointClick
24474
24580
  }
24475
24581
  ),
24476
- chartType === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
24582
+ resolvedLook === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
24477
24583
  PieChart,
24478
24584
  {
24479
24585
  data: firstSeriesData,
@@ -24483,7 +24589,7 @@ var init_Chart = __esm({
24483
24589
  onPointClick: handlePointClick
24484
24590
  }
24485
24591
  ),
24486
- chartType === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
24592
+ resolvedLook === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
24487
24593
  ScatterChart,
24488
24594
  {
24489
24595
  data: scatterData ?? [],
@@ -27906,7 +28012,7 @@ var init_useQuerySingleton = __esm({
27906
28012
  queryStores = /* @__PURE__ */ new Map();
27907
28013
  }
27908
28014
  });
27909
- var resolveFilterType, FilterGroup;
28015
+ var resolveFilterType, lookStyles5, FilterGroup;
27910
28016
  var init_FilterGroup = __esm({
27911
28017
  "components/molecules/FilterGroup.tsx"() {
27912
28018
  "use client";
@@ -27920,6 +28026,13 @@ var init_FilterGroup = __esm({
27920
28026
  init_useEventBus();
27921
28027
  init_useQuerySingleton();
27922
28028
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
28029
+ lookStyles5 = {
28030
+ toolbar: "",
28031
+ chips: "gap-2 [&>*]:rounded-pill [&>*]:px-3 [&>*]:py-1",
28032
+ pills: "gap-2 [&>*]:rounded-pill",
28033
+ "popover-trigger": "[&>*:not(:first-child)]:hidden",
28034
+ "inline-column-header": "hidden"
28035
+ };
27923
28036
  FilterGroup = ({
27924
28037
  entity,
27925
28038
  filters,
@@ -27929,7 +28042,8 @@ var init_FilterGroup = __esm({
27929
28042
  variant = "default",
27930
28043
  showIcon = true,
27931
28044
  query,
27932
- isLoading
28045
+ isLoading,
28046
+ look = "toolbar"
27933
28047
  }) => {
27934
28048
  const eventBus = useEventBus();
27935
28049
  const queryState = useQuerySingleton(query);
@@ -27984,63 +28098,71 @@ var init_FilterGroup = __esm({
27984
28098
  }, [onClearAll, queryState, eventBus, entity, query]);
27985
28099
  const activeFilterCount = Object.keys(selectedValues).length;
27986
28100
  if (variant === "pills") {
27987
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
27988
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
27989
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
27990
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
27991
- filter.label,
27992
- ":"
27993
- ] }),
27994
- /* @__PURE__ */ jsxRuntime.jsxs(
27995
- HStack,
27996
- {
27997
- gap: "none",
27998
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
27999
- children: [
28000
- /* @__PURE__ */ jsxRuntime.jsx(
28001
- "button",
28002
- {
28003
- type: "button",
28004
- onClick: () => handleFilterSelect(filter.field, null),
28005
- className: cn(
28006
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
28007
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
28008
- ),
28009
- children: "All"
28010
- }
28011
- ),
28012
- filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
28013
- "button",
28014
- {
28015
- type: "button",
28016
- onClick: () => handleFilterSelect(filter.field, option),
28017
- className: cn(
28018
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
28019
- "border-l-[length:var(--border-width)] border-border",
28020
- selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
28101
+ return /* @__PURE__ */ jsxRuntime.jsxs(
28102
+ HStack,
28103
+ {
28104
+ gap: "md",
28105
+ align: "center",
28106
+ className: cn("flex-wrap", lookStyles5[look], className),
28107
+ children: [
28108
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
28109
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
28110
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
28111
+ filter.label,
28112
+ ":"
28113
+ ] }),
28114
+ /* @__PURE__ */ jsxRuntime.jsxs(
28115
+ HStack,
28116
+ {
28117
+ gap: "none",
28118
+ className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
28119
+ children: [
28120
+ /* @__PURE__ */ jsxRuntime.jsx(
28121
+ "button",
28122
+ {
28123
+ type: "button",
28124
+ onClick: () => handleFilterSelect(filter.field, null),
28125
+ className: cn(
28126
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
28127
+ !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
28128
+ ),
28129
+ children: "All"
28130
+ }
28021
28131
  ),
28022
- children: option
28023
- },
28024
- option
28025
- ))
28026
- ]
28027
- }
28028
- )
28029
- ] }, filter.field)),
28030
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
28031
- Button,
28032
- {
28033
- variant: "ghost",
28034
- size: "sm",
28035
- onClick: handleClearAll,
28036
- leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28037
- children: "Clear"
28038
- }
28039
- )
28040
- ] });
28132
+ filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
28133
+ "button",
28134
+ {
28135
+ type: "button",
28136
+ onClick: () => handleFilterSelect(filter.field, option),
28137
+ className: cn(
28138
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
28139
+ "border-l-[length:var(--border-width)] border-border",
28140
+ selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
28141
+ ),
28142
+ children: option
28143
+ },
28144
+ option
28145
+ ))
28146
+ ]
28147
+ }
28148
+ )
28149
+ ] }, filter.field)),
28150
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
28151
+ Button,
28152
+ {
28153
+ variant: "ghost",
28154
+ size: "sm",
28155
+ onClick: handleClearAll,
28156
+ leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28157
+ children: "Clear"
28158
+ }
28159
+ )
28160
+ ]
28161
+ }
28162
+ );
28041
28163
  }
28042
28164
  if (variant === "vertical") {
28043
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
28165
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles5[look], className), children: [
28044
28166
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
28045
28167
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
28046
28168
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -28123,92 +28245,100 @@ var init_FilterGroup = __esm({
28123
28245
  ] });
28124
28246
  }
28125
28247
  if (variant === "compact") {
28126
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
28127
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
28128
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
28129
- Input,
28130
- {
28131
- type: "date",
28132
- value: selectedValues[filter.field] || "",
28133
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
28134
- clearable: true,
28135
- onClear: () => handleFilterSelect(filter.field, null),
28136
- className: "text-sm"
28137
- }
28138
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
28139
- /* @__PURE__ */ jsxRuntime.jsx(
28140
- Input,
28141
- {
28142
- type: "date",
28143
- value: selectedValues[`${filter.field}_from`] || "",
28144
- onChange: (e) => handleFilterSelect(
28145
- `${filter.field}_from`,
28146
- e.target.value || null
28147
- ),
28148
- className: "text-sm min-w-[100px]"
28149
- }
28150
- ),
28151
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
28152
- /* @__PURE__ */ jsxRuntime.jsx(
28153
- Input,
28154
- {
28155
- type: "date",
28156
- value: selectedValues[`${filter.field}_to`] || "",
28157
- onChange: (e) => handleFilterSelect(
28158
- `${filter.field}_to`,
28159
- e.target.value || null
28248
+ return /* @__PURE__ */ jsxRuntime.jsxs(
28249
+ HStack,
28250
+ {
28251
+ gap: "sm",
28252
+ align: "center",
28253
+ className: cn("flex-wrap", lookStyles5[look], className),
28254
+ children: [
28255
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
28256
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
28257
+ Input,
28258
+ {
28259
+ type: "date",
28260
+ value: selectedValues[filter.field] || "",
28261
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
28262
+ clearable: true,
28263
+ onClear: () => handleFilterSelect(filter.field, null),
28264
+ className: "text-sm"
28265
+ }
28266
+ ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
28267
+ /* @__PURE__ */ jsxRuntime.jsx(
28268
+ Input,
28269
+ {
28270
+ type: "date",
28271
+ value: selectedValues[`${filter.field}_from`] || "",
28272
+ onChange: (e) => handleFilterSelect(
28273
+ `${filter.field}_from`,
28274
+ e.target.value || null
28275
+ ),
28276
+ className: "text-sm min-w-[100px]"
28277
+ }
28160
28278
  ),
28161
- className: "text-sm min-w-[100px]"
28162
- }
28163
- )
28164
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
28165
- Input,
28166
- {
28167
- value: selectedValues[filter.field] || "",
28168
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
28169
- placeholder: filter.label,
28170
- clearable: true,
28171
- onClear: () => handleFilterSelect(filter.field, null),
28172
- className: "text-sm"
28173
- }
28174
- ) : /* @__PURE__ */ jsxRuntime.jsx(
28175
- Select,
28176
- {
28177
- value: selectedValues[filter.field] || "all",
28178
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28179
- options: [
28180
- { value: "all", label: `All ${filter.label}` },
28181
- ...filter.options?.map((opt) => ({
28182
- value: opt,
28183
- label: opt
28184
- })) || []
28185
- ],
28186
- className: "text-sm"
28187
- }
28188
- ) }, filter.field)),
28189
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
28190
- Object.entries(selectedValues).map(([field, value]) => {
28191
- const filterDef = filters.find((f3) => f3.field === field);
28192
- return /* @__PURE__ */ jsxRuntime.jsxs(
28193
- Badge,
28279
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
28280
+ /* @__PURE__ */ jsxRuntime.jsx(
28281
+ Input,
28282
+ {
28283
+ type: "date",
28284
+ value: selectedValues[`${filter.field}_to`] || "",
28285
+ onChange: (e) => handleFilterSelect(
28286
+ `${filter.field}_to`,
28287
+ e.target.value || null
28288
+ ),
28289
+ className: "text-sm min-w-[100px]"
28290
+ }
28291
+ )
28292
+ ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
28293
+ Input,
28194
28294
  {
28195
- variant: "primary",
28196
- size: "md",
28197
- className: "cursor-pointer",
28198
- onClick: () => handleFilterSelect(field, null),
28199
- children: [
28200
- filterDef?.label,
28201
- ": ",
28202
- value,
28203
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
28204
- ]
28205
- },
28206
- field
28207
- );
28208
- }),
28209
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
28210
- ] })
28211
- ] });
28295
+ value: selectedValues[filter.field] || "",
28296
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
28297
+ placeholder: filter.label,
28298
+ clearable: true,
28299
+ onClear: () => handleFilterSelect(filter.field, null),
28300
+ className: "text-sm"
28301
+ }
28302
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
28303
+ Select,
28304
+ {
28305
+ value: selectedValues[filter.field] || "all",
28306
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28307
+ options: [
28308
+ { value: "all", label: `All ${filter.label}` },
28309
+ ...filter.options?.map((opt) => ({
28310
+ value: opt,
28311
+ label: opt
28312
+ })) || []
28313
+ ],
28314
+ className: "text-sm"
28315
+ }
28316
+ ) }, filter.field)),
28317
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
28318
+ Object.entries(selectedValues).map(([field, value]) => {
28319
+ const filterDef = filters.find((f3) => f3.field === field);
28320
+ return /* @__PURE__ */ jsxRuntime.jsxs(
28321
+ Badge,
28322
+ {
28323
+ variant: "primary",
28324
+ size: "md",
28325
+ className: "cursor-pointer",
28326
+ onClick: () => handleFilterSelect(field, null),
28327
+ children: [
28328
+ filterDef?.label,
28329
+ ": ",
28330
+ value,
28331
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
28332
+ ]
28333
+ },
28334
+ field
28335
+ );
28336
+ }),
28337
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
28338
+ ] })
28339
+ ]
28340
+ }
28341
+ );
28212
28342
  }
28213
28343
  return /* @__PURE__ */ jsxRuntime.jsx(
28214
28344
  "div",
@@ -28217,6 +28347,7 @@ var init_FilterGroup = __esm({
28217
28347
  "p-4 rounded-container",
28218
28348
  "bg-card",
28219
28349
  "border-[length:var(--border-width)] border-border",
28350
+ lookStyles5[look],
28220
28351
  className
28221
28352
  ),
28222
28353
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -32690,7 +32821,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
32690
32821
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
32691
32822
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
32692
32823
  }
32693
- var variantColor, StatDisplay;
32824
+ var lookStyles6, variantColor, StatDisplay;
32694
32825
  var init_StatDisplay = __esm({
32695
32826
  "components/molecules/StatDisplay.tsx"() {
32696
32827
  "use client";
@@ -32702,6 +32833,13 @@ var init_StatDisplay = __esm({
32702
32833
  init_Sparkline();
32703
32834
  init_Icon();
32704
32835
  init_useEventBus();
32836
+ lookStyles6 = {
32837
+ elevated: "",
32838
+ flat: "shadow-none border-[length:var(--border-width)] border-border",
32839
+ "progress-backed": "",
32840
+ gauge: "",
32841
+ sparkline: ""
32842
+ };
32705
32843
  variantColor = {
32706
32844
  default: "text-foreground",
32707
32845
  primary: "text-primary",
@@ -32729,6 +32867,7 @@ var init_StatDisplay = __esm({
32729
32867
  size = "md",
32730
32868
  variant = "default",
32731
32869
  compact = false,
32870
+ look = "elevated",
32732
32871
  className,
32733
32872
  isLoading = false,
32734
32873
  error = null
@@ -32781,7 +32920,7 @@ var init_StatDisplay = __esm({
32781
32920
  return /* @__PURE__ */ jsxRuntime.jsx(
32782
32921
  Card,
32783
32922
  {
32784
- className: cn(padSizes[size], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
32923
+ className: cn(padSizes[size], lookStyles6[look], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
32785
32924
  onClick: clickEvent ? handleClick : void 0,
32786
32925
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { align: "start", justify: "between", children: [
32787
32926
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -37960,7 +38099,8 @@ function DataTable({
37960
38099
  bulkActions,
37961
38100
  headerActions,
37962
38101
  showTotal = true,
37963
- className
38102
+ className,
38103
+ look = "dense"
37964
38104
  }) {
37965
38105
  const [openActionMenu, setOpenActionMenu] = React98.useState(
37966
38106
  null
@@ -38087,6 +38227,7 @@ function DataTable({
38087
38227
  {
38088
38228
  className: cn(
38089
38229
  "bg-card border-2 border-border rounded-none overflow-hidden",
38230
+ lookStyles7[look],
38090
38231
  className
38091
38232
  ),
38092
38233
  children: [
@@ -38313,6 +38454,7 @@ function DataTable({
38313
38454
  }
38314
38455
  );
38315
38456
  }
38457
+ var lookStyles7;
38316
38458
  var init_DataTable = __esm({
38317
38459
  "components/organisms/DataTable.tsx"() {
38318
38460
  "use client";
@@ -38326,6 +38468,13 @@ var init_DataTable = __esm({
38326
38468
  init_useEventBus();
38327
38469
  init_useTranslate();
38328
38470
  init_types3();
38471
+ lookStyles7 = {
38472
+ dense: "",
38473
+ spacious: "[&_tbody_tr_td]:py-5 [&_thead_tr_th]:py-4",
38474
+ striped: "[&_tbody_tr:nth-child(odd)]:bg-muted/30",
38475
+ borderless: "border-0 [&_thead]:border-b-0 [&_tbody_tr]:border-b-0 [&_tbody]:divide-y-0",
38476
+ "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"
38477
+ };
38329
38478
  DataTable.displayName = "DataTable";
38330
38479
  }
38331
38480
  });
@@ -41484,7 +41633,7 @@ var init_GraphCanvas = __esm({
41484
41633
  GraphCanvas.displayName = "GraphCanvas";
41485
41634
  }
41486
41635
  });
41487
- var Header;
41636
+ var lookStyles8, Header;
41488
41637
  var init_Header = __esm({
41489
41638
  "components/organisms/Header.tsx"() {
41490
41639
  "use client";
@@ -41497,6 +41646,13 @@ var init_Header = __esm({
41497
41646
  init_Typography();
41498
41647
  init_cn();
41499
41648
  init_useTranslate();
41649
+ lookStyles8 = {
41650
+ "compact-bar": "",
41651
+ hero: "py-section min-h-[200px] [&_h1]:text-display-1",
41652
+ breadcrumb: "py-2 text-sm [&_h1]:text-base [&_h1]:font-medium",
41653
+ contextual: "py-3 [&_h1]:text-lg",
41654
+ "editorial-banner": "py-12 [&_h1]:text-display-2 [&_h1]:font-display-bold border-b border-border"
41655
+ };
41500
41656
  Header = ({
41501
41657
  logo,
41502
41658
  logoSrc,
@@ -41514,6 +41670,7 @@ var init_Header = __esm({
41514
41670
  actions,
41515
41671
  sticky = true,
41516
41672
  variant = "mobile",
41673
+ look = "compact-bar",
41517
41674
  onLogoClick,
41518
41675
  className
41519
41676
  }) => {
@@ -41529,6 +41686,7 @@ var init_Header = __esm({
41529
41686
  "flex items-center px-4 justify-between bg-card",
41530
41687
  sticky && "sticky top-0 z-50",
41531
41688
  variant === "mobile" && "lg:hidden",
41689
+ lookStyles8[look],
41532
41690
  className
41533
41691
  ),
41534
41692
  children: [
@@ -48224,7 +48382,7 @@ var init_TeamOrganism = __esm({
48224
48382
  TeamOrganism.displayName = "TeamOrganism";
48225
48383
  }
48226
48384
  });
48227
- var STATUS_STYLES3, Timeline;
48385
+ var lookStyles9, STATUS_STYLES3, Timeline;
48228
48386
  var init_Timeline = __esm({
48229
48387
  "components/organisms/Timeline.tsx"() {
48230
48388
  "use client";
@@ -48235,6 +48393,12 @@ var init_Timeline = __esm({
48235
48393
  init_ErrorState();
48236
48394
  init_EmptyState();
48237
48395
  init_useTranslate();
48396
+ lookStyles9 = {
48397
+ "vertical-compact": "gap-1 [&>*]:py-1",
48398
+ "vertical-spacious": "",
48399
+ horizontal: "flex-row [&>*]:flex-row [&>*]:items-center",
48400
+ swimlane: "flex-row gap-6 [&>*]:flex-row [&>*]:items-center"
48401
+ };
48238
48402
  STATUS_STYLES3 = {
48239
48403
  complete: {
48240
48404
  dotColor: "text-success",
@@ -48265,7 +48429,8 @@ var init_Timeline = __esm({
48265
48429
  entity,
48266
48430
  isLoading = false,
48267
48431
  error,
48268
- className
48432
+ className,
48433
+ look = "vertical-spacious"
48269
48434
  }) => {
48270
48435
  const { t } = useTranslate();
48271
48436
  const entityData = Array.isArray(entity) ? entity : [];
@@ -48321,7 +48486,7 @@ var init_Timeline = __esm({
48321
48486
  }
48322
48487
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "md", children: [
48323
48488
  title && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h5", weight: "semibold", children: title }),
48324
- /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: "relative", children: items.map((item, idx) => {
48489
+ /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: cn("relative", lookStyles9[look]), children: items.map((item, idx) => {
48325
48490
  const status = item.status || "pending";
48326
48491
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
48327
48492
  const ItemIcon = item.icon || style.icon;