@almadar/ui 5.3.1 → 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.
@@ -2141,7 +2141,7 @@ var init_Overlay = __esm({
2141
2141
  };
2142
2142
  }
2143
2143
  });
2144
- var sizeClasses2, minWidthClasses, Modal;
2144
+ var sizeClasses2, minWidthClasses, lookStyles, Modal;
2145
2145
  var init_Modal = __esm({
2146
2146
  "components/molecules/Modal.tsx"() {
2147
2147
  "use client";
@@ -2166,6 +2166,12 @@ var init_Modal = __esm({
2166
2166
  xl: "min-w-[700px] max-sm:min-w-0",
2167
2167
  full: "min-w-0"
2168
2168
  };
2169
+ lookStyles = {
2170
+ "centered-card": "",
2171
+ "top-sheet": "top-0 rounded-t-none rounded-b-container max-w-full w-full",
2172
+ "side-drawer": "right-0 top-0 bottom-0 h-full rounded-l-container rounded-r-none w-[400px] max-w-full",
2173
+ "full-screen": "inset-0 rounded-none w-full h-full max-w-full"
2174
+ };
2169
2175
  Modal = ({
2170
2176
  isOpen = true,
2171
2177
  onClose = () => {
@@ -2179,7 +2185,8 @@ var init_Modal = __esm({
2179
2185
  closeOnEscape = true,
2180
2186
  className,
2181
2187
  closeEvent,
2182
- swipeDownToClose = true
2188
+ swipeDownToClose = true,
2189
+ look = "centered-card"
2183
2190
  }) => {
2184
2191
  const eventBus = useEventBus();
2185
2192
  const modalRef = useRef(null);
@@ -2264,6 +2271,7 @@ var init_Modal = __esm({
2264
2271
  // Mobile: take the entire screen. Override desktop max-w cap,
2265
2272
  // full height, no rounded corners, no min-width.
2266
2273
  "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2274
+ lookStyles[look],
2267
2275
  className
2268
2276
  ),
2269
2277
  style: dragY > 0 ? {
@@ -3838,7 +3846,7 @@ var init_Checkbox = __esm({
3838
3846
  Checkbox.displayName = "Checkbox";
3839
3847
  }
3840
3848
  });
3841
- var variantStyles4, paddingStyles2, shadowStyles2, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3849
+ var variantStyles4, paddingStyles2, shadowStyles2, lookStyles2, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3842
3850
  var init_Card = __esm({
3843
3851
  "components/atoms/Card.tsx"() {
3844
3852
  init_cn();
@@ -3886,6 +3894,15 @@ var init_Card = __esm({
3886
3894
  md: "shadow",
3887
3895
  lg: "shadow-elevation-dialog"
3888
3896
  };
3897
+ lookStyles2 = {
3898
+ elevated: "",
3899
+ "flat-bordered": "shadow-none border-[length:var(--border-width)] border-border",
3900
+ "borderless-divider": "shadow-none border-0 border-b border-border rounded-none",
3901
+ ticket: "shadow-none border-dashed border-[length:var(--border-width)] border-border",
3902
+ invoice: "shadow-none border-[length:var(--border-width-thick)] border-border rounded-sm",
3903
+ chip: "shadow-none rounded-pill border-[length:var(--border-width)] border-border",
3904
+ "tile-image-first": "p-0 overflow-hidden"
3905
+ };
3889
3906
  Card = React85__default.forwardRef(
3890
3907
  ({
3891
3908
  className,
@@ -3894,6 +3911,7 @@ var init_Card = __esm({
3894
3911
  title,
3895
3912
  subtitle,
3896
3913
  shadow,
3914
+ look = "elevated",
3897
3915
  children,
3898
3916
  ...props
3899
3917
  }, ref) => {
@@ -3906,6 +3924,7 @@ var init_Card = __esm({
3906
3924
  "transition-all duration-[var(--transition-normal)]",
3907
3925
  variantStyles4[variant],
3908
3926
  paddingStyles2[padding],
3927
+ lookStyles2[look],
3909
3928
  shadow && shadowStyles2[shadow],
3910
3929
  className
3911
3930
  ),
@@ -16133,7 +16152,7 @@ var init_BookTableOfContents = __esm({
16133
16152
  BookTableOfContents.displayName = "BookTableOfContents";
16134
16153
  }
16135
16154
  });
16136
- var ICON_NAME_ALIASES, EmptyState;
16155
+ var ICON_NAME_ALIASES, lookStyles3, EmptyState;
16137
16156
  var init_EmptyState = __esm({
16138
16157
  "components/molecules/EmptyState.tsx"() {
16139
16158
  "use client";
@@ -16150,6 +16169,12 @@ var init_EmptyState = __esm({
16150
16169
  error: "x-circle",
16151
16170
  warning: "alert-circle"
16152
16171
  };
16172
+ lookStyles3 = {
16173
+ "icon-only": "",
16174
+ illustrated: "[&_svg]:w-32 [&_svg]:h-32",
16175
+ "text-only": "[&_svg]:hidden",
16176
+ mascot: "[&_svg]:w-24 [&_svg]:h-24 [&_svg]:rounded-pill"
16177
+ };
16153
16178
  EmptyState = ({
16154
16179
  icon,
16155
16180
  title,
@@ -16160,7 +16185,8 @@ var init_EmptyState = __esm({
16160
16185
  className,
16161
16186
  destructive,
16162
16187
  variant,
16163
- actionEvent
16188
+ actionEvent,
16189
+ look = "icon-only"
16164
16190
  }) => {
16165
16191
  const eventBus = useEventBus();
16166
16192
  const { t } = useTranslate();
@@ -16180,6 +16206,7 @@ var init_EmptyState = __esm({
16180
16206
  align: "center",
16181
16207
  className: cn(
16182
16208
  "justify-center py-12 text-center",
16209
+ lookStyles3[look],
16183
16210
  className
16184
16211
  ),
16185
16212
  children: [
@@ -17420,7 +17447,7 @@ function useSafeEventBus2() {
17420
17447
  } };
17421
17448
  }
17422
17449
  }
17423
- var log8, ButtonGroup;
17450
+ var log8, lookStyles4, ButtonGroup;
17424
17451
  var init_ButtonGroup = __esm({
17425
17452
  "components/molecules/ButtonGroup.tsx"() {
17426
17453
  "use client";
@@ -17428,6 +17455,13 @@ var init_ButtonGroup = __esm({
17428
17455
  init_atoms();
17429
17456
  init_useEventBus();
17430
17457
  log8 = createLogger("almadar:ui:button-group");
17458
+ lookStyles4 = {
17459
+ "right-aligned-buttons": "",
17460
+ "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
17461
+ "inline-row": "gap-2 inline-flex",
17462
+ "dropdown-menu": "[&>button:not(:first-child)]:hidden",
17463
+ "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
17464
+ };
17431
17465
  ButtonGroup = ({
17432
17466
  children,
17433
17467
  primary,
@@ -17437,7 +17471,8 @@ var init_ButtonGroup = __esm({
17437
17471
  className,
17438
17472
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
17439
17473
  entity: _entity,
17440
- filters
17474
+ filters,
17475
+ look = "right-aligned-buttons"
17441
17476
  }) => {
17442
17477
  const eventBus = useSafeEventBus2();
17443
17478
  const variantClasses2 = {
@@ -17514,6 +17549,7 @@ var init_ButtonGroup = __esm({
17514
17549
  "inline-flex gap-2",
17515
17550
  variantClasses2[variant],
17516
17551
  orientationClasses[orientation],
17552
+ lookStyles4[look],
17517
17553
  className
17518
17554
  ),
17519
17555
  role: "group",
@@ -19978,7 +20014,7 @@ var init_CastleTemplate = __esm({
19978
20014
  CastleTemplate.displayName = "CastleTemplate";
19979
20015
  }
19980
20016
  });
19981
- var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, Chart;
20017
+ var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, LOOK_FROM_CHART_TYPE, Chart;
19982
20018
  var init_Chart = __esm({
19983
20019
  "components/organisms/Chart.tsx"() {
19984
20020
  "use client";
@@ -20008,7 +20044,7 @@ var init_Chart = __esm({
20008
20044
  if (Number.isNaN(parsed.getTime())) return raw;
20009
20045
  return monthFormatter.format(parsed);
20010
20046
  };
20011
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
20047
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
20012
20048
  const categories = useMemo(() => {
20013
20049
  const set = [];
20014
20050
  const seen = /* @__PURE__ */ new Set();
@@ -20046,6 +20082,64 @@ var init_Chart = __esm({
20046
20082
  }
20047
20083
  return m;
20048
20084
  }, [series, stack, columnTotals]);
20085
+ if (horizontal) {
20086
+ return /* @__PURE__ */ jsx(VStack, { gap: "xs", align: "stretch", className: "w-full", style: { minHeight: height }, children: categories.map((label, catIdx) => {
20087
+ const displayLabel = timeAxis ? formatTimeLabel(label) : label;
20088
+ const total = columnTotals?.[catIdx] ?? 1;
20089
+ return /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: "w-full", children: [
20090
+ /* @__PURE__ */ jsx(
20091
+ Typography,
20092
+ {
20093
+ variant: "caption",
20094
+ color: "secondary",
20095
+ className: "truncate text-right",
20096
+ style: { width: 80, flexShrink: 0 },
20097
+ children: displayLabel
20098
+ }
20099
+ ),
20100
+ /* @__PURE__ */ jsx(
20101
+ HStack,
20102
+ {
20103
+ gap: stack === "none" ? "xs" : "none",
20104
+ align: "center",
20105
+ className: "flex-1 min-w-0",
20106
+ style: { height: 24 },
20107
+ children: series.map((s, sIdx) => {
20108
+ const value = valueAt(s, label);
20109
+ const ratio = stack === "normalize" ? total === 0 ? 0 : value / total * 100 : value / maxValue * 100;
20110
+ const color = seriesColor(s, sIdx);
20111
+ return /* @__PURE__ */ jsx(
20112
+ Box,
20113
+ {
20114
+ className: "h-full rounded-r-sm transition-all duration-500 ease-out min-w-[2px] cursor-pointer hover:opacity-80",
20115
+ style: {
20116
+ width: `${ratio}%`,
20117
+ backgroundColor: color
20118
+ },
20119
+ onClick: () => onPointClick?.(
20120
+ { label, value, color },
20121
+ s.name
20122
+ ),
20123
+ title: `${s.name}: ${value}`
20124
+ },
20125
+ s.name
20126
+ );
20127
+ })
20128
+ }
20129
+ ),
20130
+ showValues && series.length === 1 && /* @__PURE__ */ jsx(
20131
+ Typography,
20132
+ {
20133
+ variant: "caption",
20134
+ color: "secondary",
20135
+ className: "tabular-nums",
20136
+ style: { width: 40, flexShrink: 0 },
20137
+ children: valueAt(series[0], label)
20138
+ }
20139
+ )
20140
+ ] }, label);
20141
+ }) });
20142
+ }
20049
20143
  return /* @__PURE__ */ jsx(
20050
20144
  HStack,
20051
20145
  {
@@ -20473,10 +20567,20 @@ var init_Chart = __esm({
20473
20567
  }
20474
20568
  );
20475
20569
  };
20570
+ LOOK_FROM_CHART_TYPE = {
20571
+ bar: "bar-vertical",
20572
+ line: "line",
20573
+ pie: "pie",
20574
+ area: "area",
20575
+ donut: "donut",
20576
+ scatter: "scatter",
20577
+ histogram: "histogram"
20578
+ };
20476
20579
  Chart = ({
20477
20580
  title,
20478
20581
  subtitle,
20479
- chartType = "bar",
20582
+ chartType,
20583
+ look,
20480
20584
  series,
20481
20585
  data: simpleData,
20482
20586
  scatterData,
@@ -20492,6 +20596,7 @@ var init_Chart = __esm({
20492
20596
  error,
20493
20597
  className
20494
20598
  }) => {
20599
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
20495
20600
  const eventBus = useEventBus();
20496
20601
  const { t } = useTranslate();
20497
20602
  const handleAction = useCallback(
@@ -20520,7 +20625,7 @@ var init_Chart = __esm({
20520
20625
  return [];
20521
20626
  }, [simpleData, series]);
20522
20627
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
20523
- const hasContent = chartType === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20628
+ const hasContent = resolvedLook === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20524
20629
  if (isLoading) {
20525
20630
  return /* @__PURE__ */ jsx(LoadingState, { message: "Loading chart...", className });
20526
20631
  }
@@ -20555,7 +20660,7 @@ var init_Chart = __esm({
20555
20660
  )) })
20556
20661
  ] }),
20557
20662
  /* @__PURE__ */ jsxs(Box, { className: "w-full", children: [
20558
- chartType === "bar" && /* @__PURE__ */ jsx(
20663
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsx(
20559
20664
  BarChart,
20560
20665
  {
20561
20666
  series: normalizedSeries,
@@ -20566,7 +20671,19 @@ var init_Chart = __esm({
20566
20671
  onPointClick: handlePointClick
20567
20672
  }
20568
20673
  ),
20569
- chartType === "histogram" && /* @__PURE__ */ jsx(
20674
+ resolvedLook === "bar-horizontal" && /* @__PURE__ */ jsx(
20675
+ BarChart,
20676
+ {
20677
+ series: normalizedSeries,
20678
+ height,
20679
+ showValues,
20680
+ stack,
20681
+ timeAxis,
20682
+ horizontal: true,
20683
+ onPointClick: handlePointClick
20684
+ }
20685
+ ),
20686
+ resolvedLook === "histogram" && /* @__PURE__ */ jsx(
20570
20687
  BarChart,
20571
20688
  {
20572
20689
  series: normalizedSeries,
@@ -20578,7 +20695,7 @@ var init_Chart = __esm({
20578
20695
  onPointClick: handlePointClick
20579
20696
  }
20580
20697
  ),
20581
- chartType === "line" && /* @__PURE__ */ jsx(
20698
+ resolvedLook === "line" && /* @__PURE__ */ jsx(
20582
20699
  LineChart,
20583
20700
  {
20584
20701
  series: normalizedSeries,
@@ -20588,7 +20705,7 @@ var init_Chart = __esm({
20588
20705
  onPointClick: handlePointClick
20589
20706
  }
20590
20707
  ),
20591
- chartType === "area" && /* @__PURE__ */ jsx(
20708
+ resolvedLook === "area" && /* @__PURE__ */ jsx(
20592
20709
  LineChart,
20593
20710
  {
20594
20711
  series: normalizedSeries,
@@ -20599,7 +20716,7 @@ var init_Chart = __esm({
20599
20716
  onPointClick: handlePointClick
20600
20717
  }
20601
20718
  ),
20602
- chartType === "pie" && /* @__PURE__ */ jsx(
20719
+ resolvedLook === "pie" && /* @__PURE__ */ jsx(
20603
20720
  PieChart,
20604
20721
  {
20605
20722
  data: firstSeriesData,
@@ -20608,7 +20725,7 @@ var init_Chart = __esm({
20608
20725
  onPointClick: handlePointClick
20609
20726
  }
20610
20727
  ),
20611
- chartType === "donut" && /* @__PURE__ */ jsx(
20728
+ resolvedLook === "donut" && /* @__PURE__ */ jsx(
20612
20729
  PieChart,
20613
20730
  {
20614
20731
  data: firstSeriesData,
@@ -20618,7 +20735,7 @@ var init_Chart = __esm({
20618
20735
  onPointClick: handlePointClick
20619
20736
  }
20620
20737
  ),
20621
- chartType === "scatter" && /* @__PURE__ */ jsx(
20738
+ resolvedLook === "scatter" && /* @__PURE__ */ jsx(
20622
20739
  ScatterChart,
20623
20740
  {
20624
20741
  data: scatterData ?? [],
@@ -23963,7 +24080,7 @@ var init_FormField = __esm({
23963
24080
  FormField.displayName = "FormField";
23964
24081
  }
23965
24082
  });
23966
- var resolveFilterType, FilterGroup;
24083
+ var resolveFilterType, lookStyles5, FilterGroup;
23967
24084
  var init_FilterGroup = __esm({
23968
24085
  "components/molecules/FilterGroup.tsx"() {
23969
24086
  "use client";
@@ -23977,6 +24094,13 @@ var init_FilterGroup = __esm({
23977
24094
  init_useEventBus();
23978
24095
  init_useQuerySingleton();
23979
24096
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24097
+ lookStyles5 = {
24098
+ toolbar: "",
24099
+ chips: "gap-2 [&>*]:rounded-pill [&>*]:px-3 [&>*]:py-1",
24100
+ pills: "gap-2 [&>*]:rounded-pill",
24101
+ "popover-trigger": "[&>*:not(:first-child)]:hidden",
24102
+ "inline-column-header": "hidden"
24103
+ };
23980
24104
  FilterGroup = ({
23981
24105
  entity,
23982
24106
  filters,
@@ -23986,7 +24110,8 @@ var init_FilterGroup = __esm({
23986
24110
  variant = "default",
23987
24111
  showIcon = true,
23988
24112
  query,
23989
- isLoading
24113
+ isLoading,
24114
+ look = "toolbar"
23990
24115
  }) => {
23991
24116
  const eventBus = useEventBus();
23992
24117
  const queryState = useQuerySingleton(query);
@@ -24041,63 +24166,71 @@ var init_FilterGroup = __esm({
24041
24166
  }, [onClearAll, queryState, eventBus, entity, query]);
24042
24167
  const activeFilterCount = Object.keys(selectedValues).length;
24043
24168
  if (variant === "pills") {
24044
- return /* @__PURE__ */ jsxs(HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
24045
- showIcon && /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24046
- filters.map((filter) => /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24047
- /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24048
- filter.label,
24049
- ":"
24050
- ] }),
24051
- /* @__PURE__ */ jsxs(
24052
- HStack,
24053
- {
24054
- gap: "none",
24055
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24056
- children: [
24057
- /* @__PURE__ */ jsx(
24058
- "button",
24059
- {
24060
- type: "button",
24061
- onClick: () => handleFilterSelect(filter.field, null),
24062
- className: cn(
24063
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24064
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24065
- ),
24066
- children: "All"
24067
- }
24068
- ),
24069
- filter.options?.map((option) => /* @__PURE__ */ jsx(
24070
- "button",
24071
- {
24072
- type: "button",
24073
- onClick: () => handleFilterSelect(filter.field, option),
24074
- className: cn(
24075
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24076
- "border-l-[length:var(--border-width)] border-border",
24077
- selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24169
+ return /* @__PURE__ */ jsxs(
24170
+ HStack,
24171
+ {
24172
+ gap: "md",
24173
+ align: "center",
24174
+ className: cn("flex-wrap", lookStyles5[look], className),
24175
+ children: [
24176
+ showIcon && /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24177
+ filters.map((filter) => /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24178
+ /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24179
+ filter.label,
24180
+ ":"
24181
+ ] }),
24182
+ /* @__PURE__ */ jsxs(
24183
+ HStack,
24184
+ {
24185
+ gap: "none",
24186
+ className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24187
+ children: [
24188
+ /* @__PURE__ */ jsx(
24189
+ "button",
24190
+ {
24191
+ type: "button",
24192
+ onClick: () => handleFilterSelect(filter.field, null),
24193
+ className: cn(
24194
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24195
+ !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24196
+ ),
24197
+ children: "All"
24198
+ }
24078
24199
  ),
24079
- children: option
24080
- },
24081
- option
24082
- ))
24083
- ]
24084
- }
24085
- )
24086
- ] }, filter.field)),
24087
- activeFilterCount > 0 && /* @__PURE__ */ jsx(
24088
- Button,
24089
- {
24090
- variant: "ghost",
24091
- size: "sm",
24092
- onClick: handleClearAll,
24093
- leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24094
- children: "Clear"
24095
- }
24096
- )
24097
- ] });
24200
+ filter.options?.map((option) => /* @__PURE__ */ jsx(
24201
+ "button",
24202
+ {
24203
+ type: "button",
24204
+ onClick: () => handleFilterSelect(filter.field, option),
24205
+ className: cn(
24206
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24207
+ "border-l-[length:var(--border-width)] border-border",
24208
+ selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24209
+ ),
24210
+ children: option
24211
+ },
24212
+ option
24213
+ ))
24214
+ ]
24215
+ }
24216
+ )
24217
+ ] }, filter.field)),
24218
+ activeFilterCount > 0 && /* @__PURE__ */ jsx(
24219
+ Button,
24220
+ {
24221
+ variant: "ghost",
24222
+ size: "sm",
24223
+ onClick: handleClearAll,
24224
+ leftIcon: /* @__PURE__ */ jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24225
+ children: "Clear"
24226
+ }
24227
+ )
24228
+ ]
24229
+ }
24230
+ );
24098
24231
  }
24099
24232
  if (variant === "vertical") {
24100
- return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
24233
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", lookStyles5[look], className), children: [
24101
24234
  showIcon && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24102
24235
  /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24103
24236
  /* @__PURE__ */ jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -24180,92 +24313,100 @@ var init_FilterGroup = __esm({
24180
24313
  ] });
24181
24314
  }
24182
24315
  if (variant === "compact") {
24183
- return /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
24184
- showIcon && /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24185
- filters.map((filter) => /* @__PURE__ */ jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsx(
24186
- Input,
24187
- {
24188
- type: "date",
24189
- value: selectedValues[filter.field] || "",
24190
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24191
- clearable: true,
24192
- onClear: () => handleFilterSelect(filter.field, null),
24193
- className: "text-sm"
24194
- }
24195
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24196
- /* @__PURE__ */ jsx(
24197
- Input,
24198
- {
24199
- type: "date",
24200
- value: selectedValues[`${filter.field}_from`] || "",
24201
- onChange: (e) => handleFilterSelect(
24202
- `${filter.field}_from`,
24203
- e.target.value || null
24204
- ),
24205
- className: "text-sm min-w-[100px]"
24206
- }
24207
- ),
24208
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
24209
- /* @__PURE__ */ jsx(
24210
- Input,
24211
- {
24212
- type: "date",
24213
- value: selectedValues[`${filter.field}_to`] || "",
24214
- onChange: (e) => handleFilterSelect(
24215
- `${filter.field}_to`,
24216
- e.target.value || null
24316
+ return /* @__PURE__ */ jsxs(
24317
+ HStack,
24318
+ {
24319
+ gap: "sm",
24320
+ align: "center",
24321
+ className: cn("flex-wrap", lookStyles5[look], className),
24322
+ children: [
24323
+ showIcon && /* @__PURE__ */ jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24324
+ filters.map((filter) => /* @__PURE__ */ jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsx(
24325
+ Input,
24326
+ {
24327
+ type: "date",
24328
+ value: selectedValues[filter.field] || "",
24329
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24330
+ clearable: true,
24331
+ onClear: () => handleFilterSelect(filter.field, null),
24332
+ className: "text-sm"
24333
+ }
24334
+ ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24335
+ /* @__PURE__ */ jsx(
24336
+ Input,
24337
+ {
24338
+ type: "date",
24339
+ value: selectedValues[`${filter.field}_from`] || "",
24340
+ onChange: (e) => handleFilterSelect(
24341
+ `${filter.field}_from`,
24342
+ e.target.value || null
24343
+ ),
24344
+ className: "text-sm min-w-[100px]"
24345
+ }
24217
24346
  ),
24218
- className: "text-sm min-w-[100px]"
24219
- }
24220
- )
24221
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
24222
- Input,
24223
- {
24224
- value: selectedValues[filter.field] || "",
24225
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24226
- placeholder: filter.label,
24227
- clearable: true,
24228
- onClear: () => handleFilterSelect(filter.field, null),
24229
- className: "text-sm"
24230
- }
24231
- ) : /* @__PURE__ */ jsx(
24232
- Select,
24233
- {
24234
- value: selectedValues[filter.field] || "all",
24235
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24236
- options: [
24237
- { value: "all", label: `All ${filter.label}` },
24238
- ...filter.options?.map((opt) => ({
24239
- value: opt,
24240
- label: opt
24241
- })) || []
24242
- ],
24243
- className: "text-sm"
24244
- }
24245
- ) }, filter.field)),
24246
- activeFilterCount > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
24247
- Object.entries(selectedValues).map(([field, value]) => {
24248
- const filterDef = filters.find((f3) => f3.field === field);
24249
- return /* @__PURE__ */ jsxs(
24250
- Badge,
24347
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
24348
+ /* @__PURE__ */ jsx(
24349
+ Input,
24350
+ {
24351
+ type: "date",
24352
+ value: selectedValues[`${filter.field}_to`] || "",
24353
+ onChange: (e) => handleFilterSelect(
24354
+ `${filter.field}_to`,
24355
+ e.target.value || null
24356
+ ),
24357
+ className: "text-sm min-w-[100px]"
24358
+ }
24359
+ )
24360
+ ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
24361
+ Input,
24251
24362
  {
24252
- variant: "primary",
24253
- size: "md",
24254
- className: "cursor-pointer",
24255
- onClick: () => handleFilterSelect(field, null),
24256
- children: [
24257
- filterDef?.label,
24258
- ": ",
24259
- value,
24260
- /* @__PURE__ */ jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24261
- ]
24262
- },
24263
- field
24264
- );
24265
- }),
24266
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24267
- ] })
24268
- ] });
24363
+ value: selectedValues[filter.field] || "",
24364
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24365
+ placeholder: filter.label,
24366
+ clearable: true,
24367
+ onClear: () => handleFilterSelect(filter.field, null),
24368
+ className: "text-sm"
24369
+ }
24370
+ ) : /* @__PURE__ */ jsx(
24371
+ Select,
24372
+ {
24373
+ value: selectedValues[filter.field] || "all",
24374
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24375
+ options: [
24376
+ { value: "all", label: `All ${filter.label}` },
24377
+ ...filter.options?.map((opt) => ({
24378
+ value: opt,
24379
+ label: opt
24380
+ })) || []
24381
+ ],
24382
+ className: "text-sm"
24383
+ }
24384
+ ) }, filter.field)),
24385
+ activeFilterCount > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
24386
+ Object.entries(selectedValues).map(([field, value]) => {
24387
+ const filterDef = filters.find((f3) => f3.field === field);
24388
+ return /* @__PURE__ */ jsxs(
24389
+ Badge,
24390
+ {
24391
+ variant: "primary",
24392
+ size: "md",
24393
+ className: "cursor-pointer",
24394
+ onClick: () => handleFilterSelect(field, null),
24395
+ children: [
24396
+ filterDef?.label,
24397
+ ": ",
24398
+ value,
24399
+ /* @__PURE__ */ jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24400
+ ]
24401
+ },
24402
+ field
24403
+ );
24404
+ }),
24405
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24406
+ ] })
24407
+ ]
24408
+ }
24409
+ );
24269
24410
  }
24270
24411
  return /* @__PURE__ */ jsx(
24271
24412
  "div",
@@ -24274,6 +24415,7 @@ var init_FilterGroup = __esm({
24274
24415
  "p-4 rounded-container",
24275
24416
  "bg-card",
24276
24417
  "border-[length:var(--border-width)] border-border",
24418
+ lookStyles5[look],
24277
24419
  className
24278
24420
  ),
24279
24421
  children: /* @__PURE__ */ jsxs(HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -28747,7 +28889,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
28747
28889
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
28748
28890
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
28749
28891
  }
28750
- var variantColor, StatDisplay;
28892
+ var lookStyles6, variantColor, StatDisplay;
28751
28893
  var init_StatDisplay = __esm({
28752
28894
  "components/molecules/StatDisplay.tsx"() {
28753
28895
  "use client";
@@ -28759,6 +28901,13 @@ var init_StatDisplay = __esm({
28759
28901
  init_Sparkline();
28760
28902
  init_Icon();
28761
28903
  init_useEventBus();
28904
+ lookStyles6 = {
28905
+ elevated: "",
28906
+ flat: "shadow-none border-[length:var(--border-width)] border-border",
28907
+ "progress-backed": "",
28908
+ gauge: "",
28909
+ sparkline: ""
28910
+ };
28762
28911
  variantColor = {
28763
28912
  default: "text-foreground",
28764
28913
  primary: "text-primary",
@@ -28786,6 +28935,7 @@ var init_StatDisplay = __esm({
28786
28935
  size = "md",
28787
28936
  variant = "default",
28788
28937
  compact = false,
28938
+ look = "elevated",
28789
28939
  className,
28790
28940
  isLoading = false,
28791
28941
  error = null
@@ -28838,7 +28988,7 @@ var init_StatDisplay = __esm({
28838
28988
  return /* @__PURE__ */ jsx(
28839
28989
  Card,
28840
28990
  {
28841
- className: cn(padSizes[size], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
28991
+ className: cn(padSizes[size], lookStyles6[look], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
28842
28992
  onClick: clickEvent ? handleClick : void 0,
28843
28993
  children: /* @__PURE__ */ jsxs(HStack, { align: "start", justify: "between", children: [
28844
28994
  /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -34282,7 +34432,8 @@ function DataTable({
34282
34432
  bulkActions,
34283
34433
  headerActions,
34284
34434
  showTotal = true,
34285
- className
34435
+ className,
34436
+ look = "dense"
34286
34437
  }) {
34287
34438
  const [openActionMenu, setOpenActionMenu] = useState(
34288
34439
  null
@@ -34409,6 +34560,7 @@ function DataTable({
34409
34560
  {
34410
34561
  className: cn(
34411
34562
  "bg-card border-2 border-border rounded-none overflow-hidden",
34563
+ lookStyles7[look],
34412
34564
  className
34413
34565
  ),
34414
34566
  children: [
@@ -34635,6 +34787,7 @@ function DataTable({
34635
34787
  }
34636
34788
  );
34637
34789
  }
34790
+ var lookStyles7;
34638
34791
  var init_DataTable = __esm({
34639
34792
  "components/organisms/DataTable.tsx"() {
34640
34793
  "use client";
@@ -34648,6 +34801,13 @@ var init_DataTable = __esm({
34648
34801
  init_useEventBus();
34649
34802
  init_useTranslate();
34650
34803
  init_types3();
34804
+ lookStyles7 = {
34805
+ dense: "",
34806
+ spacious: "[&_tbody_tr_td]:py-5 [&_thead_tr_th]:py-4",
34807
+ striped: "[&_tbody_tr:nth-child(odd)]:bg-muted/30",
34808
+ borderless: "border-0 [&_thead]:border-b-0 [&_tbody_tr]:border-b-0 [&_tbody]:divide-y-0",
34809
+ "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"
34810
+ };
34651
34811
  DataTable.displayName = "DataTable";
34652
34812
  }
34653
34813
  });
@@ -37806,7 +37966,7 @@ var init_GraphCanvas = __esm({
37806
37966
  GraphCanvas.displayName = "GraphCanvas";
37807
37967
  }
37808
37968
  });
37809
- var Header;
37969
+ var lookStyles8, Header;
37810
37970
  var init_Header = __esm({
37811
37971
  "components/organisms/Header.tsx"() {
37812
37972
  "use client";
@@ -37819,6 +37979,13 @@ var init_Header = __esm({
37819
37979
  init_Typography();
37820
37980
  init_cn();
37821
37981
  init_useTranslate();
37982
+ lookStyles8 = {
37983
+ "compact-bar": "",
37984
+ hero: "py-section min-h-[200px] [&_h1]:text-display-1",
37985
+ breadcrumb: "py-2 text-sm [&_h1]:text-base [&_h1]:font-medium",
37986
+ contextual: "py-3 [&_h1]:text-lg",
37987
+ "editorial-banner": "py-12 [&_h1]:text-display-2 [&_h1]:font-display-bold border-b border-border"
37988
+ };
37822
37989
  Header = ({
37823
37990
  logo,
37824
37991
  logoSrc,
@@ -37836,6 +38003,7 @@ var init_Header = __esm({
37836
38003
  actions,
37837
38004
  sticky = true,
37838
38005
  variant = "mobile",
38006
+ look = "compact-bar",
37839
38007
  onLogoClick,
37840
38008
  className
37841
38009
  }) => {
@@ -37851,6 +38019,7 @@ var init_Header = __esm({
37851
38019
  "flex items-center px-4 justify-between bg-card",
37852
38020
  sticky && "sticky top-0 z-50",
37853
38021
  variant === "mobile" && "lg:hidden",
38022
+ lookStyles8[look],
37854
38023
  className
37855
38024
  ),
37856
38025
  children: [
@@ -44546,7 +44715,7 @@ var init_TeamOrganism = __esm({
44546
44715
  TeamOrganism.displayName = "TeamOrganism";
44547
44716
  }
44548
44717
  });
44549
- var STATUS_STYLES3, Timeline;
44718
+ var lookStyles9, STATUS_STYLES3, Timeline;
44550
44719
  var init_Timeline = __esm({
44551
44720
  "components/organisms/Timeline.tsx"() {
44552
44721
  "use client";
@@ -44557,6 +44726,12 @@ var init_Timeline = __esm({
44557
44726
  init_ErrorState();
44558
44727
  init_EmptyState();
44559
44728
  init_useTranslate();
44729
+ lookStyles9 = {
44730
+ "vertical-compact": "gap-1 [&>*]:py-1",
44731
+ "vertical-spacious": "",
44732
+ horizontal: "flex-row [&>*]:flex-row [&>*]:items-center",
44733
+ swimlane: "flex-row gap-6 [&>*]:flex-row [&>*]:items-center"
44734
+ };
44560
44735
  STATUS_STYLES3 = {
44561
44736
  complete: {
44562
44737
  dotColor: "text-success",
@@ -44587,7 +44762,8 @@ var init_Timeline = __esm({
44587
44762
  entity,
44588
44763
  isLoading = false,
44589
44764
  error,
44590
- className
44765
+ className,
44766
+ look = "vertical-spacious"
44591
44767
  }) => {
44592
44768
  const { t } = useTranslate();
44593
44769
  const entityData = Array.isArray(entity) ? entity : [];
@@ -44643,7 +44819,7 @@ var init_Timeline = __esm({
44643
44819
  }
44644
44820
  return /* @__PURE__ */ jsx(Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
44645
44821
  title && /* @__PURE__ */ jsx(Typography, { variant: "h5", weight: "semibold", children: title }),
44646
- /* @__PURE__ */ jsx(VStack, { gap: "none", className: "relative", children: items.map((item, idx) => {
44822
+ /* @__PURE__ */ jsx(VStack, { gap: "none", className: cn("relative", lookStyles9[look]), children: items.map((item, idx) => {
44647
44823
  const status = item.status || "pending";
44648
44824
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
44649
44825
  const ItemIcon = item.icon || style.icon;