@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.
@@ -2190,7 +2190,7 @@ var init_Overlay = __esm({
2190
2190
  };
2191
2191
  }
2192
2192
  });
2193
- var sizeClasses2, minWidthClasses, Modal;
2193
+ var sizeClasses2, minWidthClasses, lookStyles, Modal;
2194
2194
  var init_Modal = __esm({
2195
2195
  "components/molecules/Modal.tsx"() {
2196
2196
  "use client";
@@ -2215,6 +2215,12 @@ var init_Modal = __esm({
2215
2215
  xl: "min-w-[700px] max-sm:min-w-0",
2216
2216
  full: "min-w-0"
2217
2217
  };
2218
+ lookStyles = {
2219
+ "centered-card": "",
2220
+ "top-sheet": "top-0 rounded-t-none rounded-b-container max-w-full w-full",
2221
+ "side-drawer": "right-0 top-0 bottom-0 h-full rounded-l-container rounded-r-none w-[400px] max-w-full",
2222
+ "full-screen": "inset-0 rounded-none w-full h-full max-w-full"
2223
+ };
2218
2224
  Modal = ({
2219
2225
  isOpen = true,
2220
2226
  onClose = () => {
@@ -2228,7 +2234,8 @@ var init_Modal = __esm({
2228
2234
  closeOnEscape = true,
2229
2235
  className,
2230
2236
  closeEvent,
2231
- swipeDownToClose = true
2237
+ swipeDownToClose = true,
2238
+ look = "centered-card"
2232
2239
  }) => {
2233
2240
  const eventBus = useEventBus();
2234
2241
  const modalRef = React85.useRef(null);
@@ -2313,6 +2320,7 @@ var init_Modal = __esm({
2313
2320
  // Mobile: take the entire screen. Override desktop max-w cap,
2314
2321
  // full height, no rounded corners, no min-width.
2315
2322
  "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
2323
+ lookStyles[look],
2316
2324
  className
2317
2325
  ),
2318
2326
  style: dragY > 0 ? {
@@ -3887,7 +3895,7 @@ var init_Checkbox = __esm({
3887
3895
  Checkbox.displayName = "Checkbox";
3888
3896
  }
3889
3897
  });
3890
- var variantStyles4, paddingStyles2, shadowStyles2, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3898
+ var variantStyles4, paddingStyles2, shadowStyles2, lookStyles2, Card, CardHeader, CardTitle, CardContent, CardBody, CardFooter;
3891
3899
  var init_Card = __esm({
3892
3900
  "components/atoms/Card.tsx"() {
3893
3901
  init_cn();
@@ -3935,6 +3943,15 @@ var init_Card = __esm({
3935
3943
  md: "shadow",
3936
3944
  lg: "shadow-elevation-dialog"
3937
3945
  };
3946
+ lookStyles2 = {
3947
+ elevated: "",
3948
+ "flat-bordered": "shadow-none border-[length:var(--border-width)] border-border",
3949
+ "borderless-divider": "shadow-none border-0 border-b border-border rounded-none",
3950
+ ticket: "shadow-none border-dashed border-[length:var(--border-width)] border-border",
3951
+ invoice: "shadow-none border-[length:var(--border-width-thick)] border-border rounded-sm",
3952
+ chip: "shadow-none rounded-pill border-[length:var(--border-width)] border-border",
3953
+ "tile-image-first": "p-0 overflow-hidden"
3954
+ };
3938
3955
  Card = React85__namespace.default.forwardRef(
3939
3956
  ({
3940
3957
  className,
@@ -3943,6 +3960,7 @@ var init_Card = __esm({
3943
3960
  title,
3944
3961
  subtitle,
3945
3962
  shadow,
3963
+ look = "elevated",
3946
3964
  children,
3947
3965
  ...props
3948
3966
  }, ref) => {
@@ -3955,6 +3973,7 @@ var init_Card = __esm({
3955
3973
  "transition-all duration-[var(--transition-normal)]",
3956
3974
  variantStyles4[variant],
3957
3975
  paddingStyles2[padding],
3976
+ lookStyles2[look],
3958
3977
  shadow && shadowStyles2[shadow],
3959
3978
  className
3960
3979
  ),
@@ -16182,7 +16201,7 @@ var init_BookTableOfContents = __esm({
16182
16201
  BookTableOfContents.displayName = "BookTableOfContents";
16183
16202
  }
16184
16203
  });
16185
- var ICON_NAME_ALIASES, EmptyState;
16204
+ var ICON_NAME_ALIASES, lookStyles3, EmptyState;
16186
16205
  var init_EmptyState = __esm({
16187
16206
  "components/molecules/EmptyState.tsx"() {
16188
16207
  "use client";
@@ -16199,6 +16218,12 @@ var init_EmptyState = __esm({
16199
16218
  error: "x-circle",
16200
16219
  warning: "alert-circle"
16201
16220
  };
16221
+ lookStyles3 = {
16222
+ "icon-only": "",
16223
+ illustrated: "[&_svg]:w-32 [&_svg]:h-32",
16224
+ "text-only": "[&_svg]:hidden",
16225
+ mascot: "[&_svg]:w-24 [&_svg]:h-24 [&_svg]:rounded-pill"
16226
+ };
16202
16227
  EmptyState = ({
16203
16228
  icon,
16204
16229
  title,
@@ -16209,7 +16234,8 @@ var init_EmptyState = __esm({
16209
16234
  className,
16210
16235
  destructive,
16211
16236
  variant,
16212
- actionEvent
16237
+ actionEvent,
16238
+ look = "icon-only"
16213
16239
  }) => {
16214
16240
  const eventBus = useEventBus();
16215
16241
  const { t } = useTranslate();
@@ -16229,6 +16255,7 @@ var init_EmptyState = __esm({
16229
16255
  align: "center",
16230
16256
  className: cn(
16231
16257
  "justify-center py-12 text-center",
16258
+ lookStyles3[look],
16232
16259
  className
16233
16260
  ),
16234
16261
  children: [
@@ -17469,7 +17496,7 @@ function useSafeEventBus2() {
17469
17496
  } };
17470
17497
  }
17471
17498
  }
17472
- var log8, ButtonGroup;
17499
+ var log8, lookStyles4, ButtonGroup;
17473
17500
  var init_ButtonGroup = __esm({
17474
17501
  "components/molecules/ButtonGroup.tsx"() {
17475
17502
  "use client";
@@ -17477,6 +17504,13 @@ var init_ButtonGroup = __esm({
17477
17504
  init_atoms();
17478
17505
  init_useEventBus();
17479
17506
  log8 = logger.createLogger("almadar:ui:button-group");
17507
+ lookStyles4 = {
17508
+ "right-aligned-buttons": "",
17509
+ "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
17510
+ "inline-row": "gap-2 inline-flex",
17511
+ "dropdown-menu": "[&>button:not(:first-child)]:hidden",
17512
+ "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
17513
+ };
17480
17514
  ButtonGroup = ({
17481
17515
  children,
17482
17516
  primary,
@@ -17486,7 +17520,8 @@ var init_ButtonGroup = __esm({
17486
17520
  className,
17487
17521
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
17488
17522
  entity: _entity,
17489
- filters
17523
+ filters,
17524
+ look = "right-aligned-buttons"
17490
17525
  }) => {
17491
17526
  const eventBus = useSafeEventBus2();
17492
17527
  const variantClasses2 = {
@@ -17563,6 +17598,7 @@ var init_ButtonGroup = __esm({
17563
17598
  "inline-flex gap-2",
17564
17599
  variantClasses2[variant],
17565
17600
  orientationClasses[orientation],
17601
+ lookStyles4[look],
17566
17602
  className
17567
17603
  ),
17568
17604
  role: "group",
@@ -20027,7 +20063,7 @@ var init_CastleTemplate = __esm({
20027
20063
  CastleTemplate.displayName = "CastleTemplate";
20028
20064
  }
20029
20065
  });
20030
- var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, Chart;
20066
+ var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, LOOK_FROM_CHART_TYPE, Chart;
20031
20067
  var init_Chart = __esm({
20032
20068
  "components/organisms/Chart.tsx"() {
20033
20069
  "use client";
@@ -20057,7 +20093,7 @@ var init_Chart = __esm({
20057
20093
  if (Number.isNaN(parsed.getTime())) return raw;
20058
20094
  return monthFormatter.format(parsed);
20059
20095
  };
20060
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
20096
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
20061
20097
  const categories = React85.useMemo(() => {
20062
20098
  const set = [];
20063
20099
  const seen = /* @__PURE__ */ new Set();
@@ -20095,6 +20131,64 @@ var init_Chart = __esm({
20095
20131
  }
20096
20132
  return m;
20097
20133
  }, [series, stack, columnTotals]);
20134
+ if (horizontal) {
20135
+ return /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "xs", align: "stretch", className: "w-full", style: { minHeight: height }, children: categories.map((label, catIdx) => {
20136
+ const displayLabel = timeAxis ? formatTimeLabel(label) : label;
20137
+ const total = columnTotals?.[catIdx] ?? 1;
20138
+ return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: "w-full", children: [
20139
+ /* @__PURE__ */ jsxRuntime.jsx(
20140
+ Typography,
20141
+ {
20142
+ variant: "caption",
20143
+ color: "secondary",
20144
+ className: "truncate text-right",
20145
+ style: { width: 80, flexShrink: 0 },
20146
+ children: displayLabel
20147
+ }
20148
+ ),
20149
+ /* @__PURE__ */ jsxRuntime.jsx(
20150
+ HStack,
20151
+ {
20152
+ gap: stack === "none" ? "xs" : "none",
20153
+ align: "center",
20154
+ className: "flex-1 min-w-0",
20155
+ style: { height: 24 },
20156
+ children: series.map((s, sIdx) => {
20157
+ const value = valueAt(s, label);
20158
+ const ratio = stack === "normalize" ? total === 0 ? 0 : value / total * 100 : value / maxValue * 100;
20159
+ const color = seriesColor(s, sIdx);
20160
+ return /* @__PURE__ */ jsxRuntime.jsx(
20161
+ Box,
20162
+ {
20163
+ className: "h-full rounded-r-sm transition-all duration-500 ease-out min-w-[2px] cursor-pointer hover:opacity-80",
20164
+ style: {
20165
+ width: `${ratio}%`,
20166
+ backgroundColor: color
20167
+ },
20168
+ onClick: () => onPointClick?.(
20169
+ { label, value, color },
20170
+ s.name
20171
+ ),
20172
+ title: `${s.name}: ${value}`
20173
+ },
20174
+ s.name
20175
+ );
20176
+ })
20177
+ }
20178
+ ),
20179
+ showValues && series.length === 1 && /* @__PURE__ */ jsxRuntime.jsx(
20180
+ Typography,
20181
+ {
20182
+ variant: "caption",
20183
+ color: "secondary",
20184
+ className: "tabular-nums",
20185
+ style: { width: 40, flexShrink: 0 },
20186
+ children: valueAt(series[0], label)
20187
+ }
20188
+ )
20189
+ ] }, label);
20190
+ }) });
20191
+ }
20098
20192
  return /* @__PURE__ */ jsxRuntime.jsx(
20099
20193
  HStack,
20100
20194
  {
@@ -20522,10 +20616,20 @@ var init_Chart = __esm({
20522
20616
  }
20523
20617
  );
20524
20618
  };
20619
+ LOOK_FROM_CHART_TYPE = {
20620
+ bar: "bar-vertical",
20621
+ line: "line",
20622
+ pie: "pie",
20623
+ area: "area",
20624
+ donut: "donut",
20625
+ scatter: "scatter",
20626
+ histogram: "histogram"
20627
+ };
20525
20628
  Chart = ({
20526
20629
  title,
20527
20630
  subtitle,
20528
- chartType = "bar",
20631
+ chartType,
20632
+ look,
20529
20633
  series,
20530
20634
  data: simpleData,
20531
20635
  scatterData,
@@ -20541,6 +20645,7 @@ var init_Chart = __esm({
20541
20645
  error,
20542
20646
  className
20543
20647
  }) => {
20648
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
20544
20649
  const eventBus = useEventBus();
20545
20650
  const { t } = useTranslate();
20546
20651
  const handleAction = React85.useCallback(
@@ -20569,7 +20674,7 @@ var init_Chart = __esm({
20569
20674
  return [];
20570
20675
  }, [simpleData, series]);
20571
20676
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
20572
- const hasContent = chartType === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20677
+ const hasContent = resolvedLook === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
20573
20678
  if (isLoading) {
20574
20679
  return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading chart...", className });
20575
20680
  }
@@ -20604,7 +20709,7 @@ var init_Chart = __esm({
20604
20709
  )) })
20605
20710
  ] }),
20606
20711
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "w-full", children: [
20607
- chartType === "bar" && /* @__PURE__ */ jsxRuntime.jsx(
20712
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsxRuntime.jsx(
20608
20713
  BarChart,
20609
20714
  {
20610
20715
  series: normalizedSeries,
@@ -20615,7 +20720,19 @@ var init_Chart = __esm({
20615
20720
  onPointClick: handlePointClick
20616
20721
  }
20617
20722
  ),
20618
- chartType === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
20723
+ resolvedLook === "bar-horizontal" && /* @__PURE__ */ jsxRuntime.jsx(
20724
+ BarChart,
20725
+ {
20726
+ series: normalizedSeries,
20727
+ height,
20728
+ showValues,
20729
+ stack,
20730
+ timeAxis,
20731
+ horizontal: true,
20732
+ onPointClick: handlePointClick
20733
+ }
20734
+ ),
20735
+ resolvedLook === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
20619
20736
  BarChart,
20620
20737
  {
20621
20738
  series: normalizedSeries,
@@ -20627,7 +20744,7 @@ var init_Chart = __esm({
20627
20744
  onPointClick: handlePointClick
20628
20745
  }
20629
20746
  ),
20630
- chartType === "line" && /* @__PURE__ */ jsxRuntime.jsx(
20747
+ resolvedLook === "line" && /* @__PURE__ */ jsxRuntime.jsx(
20631
20748
  LineChart,
20632
20749
  {
20633
20750
  series: normalizedSeries,
@@ -20637,7 +20754,7 @@ var init_Chart = __esm({
20637
20754
  onPointClick: handlePointClick
20638
20755
  }
20639
20756
  ),
20640
- chartType === "area" && /* @__PURE__ */ jsxRuntime.jsx(
20757
+ resolvedLook === "area" && /* @__PURE__ */ jsxRuntime.jsx(
20641
20758
  LineChart,
20642
20759
  {
20643
20760
  series: normalizedSeries,
@@ -20648,7 +20765,7 @@ var init_Chart = __esm({
20648
20765
  onPointClick: handlePointClick
20649
20766
  }
20650
20767
  ),
20651
- chartType === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
20768
+ resolvedLook === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
20652
20769
  PieChart,
20653
20770
  {
20654
20771
  data: firstSeriesData,
@@ -20657,7 +20774,7 @@ var init_Chart = __esm({
20657
20774
  onPointClick: handlePointClick
20658
20775
  }
20659
20776
  ),
20660
- chartType === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
20777
+ resolvedLook === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
20661
20778
  PieChart,
20662
20779
  {
20663
20780
  data: firstSeriesData,
@@ -20667,7 +20784,7 @@ var init_Chart = __esm({
20667
20784
  onPointClick: handlePointClick
20668
20785
  }
20669
20786
  ),
20670
- chartType === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
20787
+ resolvedLook === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
20671
20788
  ScatterChart,
20672
20789
  {
20673
20790
  data: scatterData ?? [],
@@ -24012,7 +24129,7 @@ var init_FormField = __esm({
24012
24129
  FormField.displayName = "FormField";
24013
24130
  }
24014
24131
  });
24015
- var resolveFilterType, FilterGroup;
24132
+ var resolveFilterType, lookStyles5, FilterGroup;
24016
24133
  var init_FilterGroup = __esm({
24017
24134
  "components/molecules/FilterGroup.tsx"() {
24018
24135
  "use client";
@@ -24026,6 +24143,13 @@ var init_FilterGroup = __esm({
24026
24143
  init_useEventBus();
24027
24144
  init_useQuerySingleton();
24028
24145
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
24146
+ lookStyles5 = {
24147
+ toolbar: "",
24148
+ chips: "gap-2 [&>*]:rounded-pill [&>*]:px-3 [&>*]:py-1",
24149
+ pills: "gap-2 [&>*]:rounded-pill",
24150
+ "popover-trigger": "[&>*:not(:first-child)]:hidden",
24151
+ "inline-column-header": "hidden"
24152
+ };
24029
24153
  FilterGroup = ({
24030
24154
  entity,
24031
24155
  filters,
@@ -24035,7 +24159,8 @@ var init_FilterGroup = __esm({
24035
24159
  variant = "default",
24036
24160
  showIcon = true,
24037
24161
  query,
24038
- isLoading
24162
+ isLoading,
24163
+ look = "toolbar"
24039
24164
  }) => {
24040
24165
  const eventBus = useEventBus();
24041
24166
  const queryState = useQuerySingleton(query);
@@ -24090,63 +24215,71 @@ var init_FilterGroup = __esm({
24090
24215
  }, [onClearAll, queryState, eventBus, entity, query]);
24091
24216
  const activeFilterCount = Object.keys(selectedValues).length;
24092
24217
  if (variant === "pills") {
24093
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
24094
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24095
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24096
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24097
- filter.label,
24098
- ":"
24099
- ] }),
24100
- /* @__PURE__ */ jsxRuntime.jsxs(
24101
- HStack,
24102
- {
24103
- gap: "none",
24104
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24105
- children: [
24106
- /* @__PURE__ */ jsxRuntime.jsx(
24107
- "button",
24108
- {
24109
- type: "button",
24110
- onClick: () => handleFilterSelect(filter.field, null),
24111
- className: cn(
24112
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24113
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24114
- ),
24115
- children: "All"
24116
- }
24117
- ),
24118
- filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
24119
- "button",
24120
- {
24121
- type: "button",
24122
- onClick: () => handleFilterSelect(filter.field, option),
24123
- className: cn(
24124
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24125
- "border-l-[length:var(--border-width)] border-border",
24126
- selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24218
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24219
+ HStack,
24220
+ {
24221
+ gap: "md",
24222
+ align: "center",
24223
+ className: cn("flex-wrap", lookStyles5[look], className),
24224
+ children: [
24225
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24226
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24227
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
24228
+ filter.label,
24229
+ ":"
24230
+ ] }),
24231
+ /* @__PURE__ */ jsxRuntime.jsxs(
24232
+ HStack,
24233
+ {
24234
+ gap: "none",
24235
+ className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
24236
+ children: [
24237
+ /* @__PURE__ */ jsxRuntime.jsx(
24238
+ "button",
24239
+ {
24240
+ type: "button",
24241
+ onClick: () => handleFilterSelect(filter.field, null),
24242
+ className: cn(
24243
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24244
+ !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24245
+ ),
24246
+ children: "All"
24247
+ }
24127
24248
  ),
24128
- children: option
24129
- },
24130
- option
24131
- ))
24132
- ]
24133
- }
24134
- )
24135
- ] }, filter.field)),
24136
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
24137
- Button,
24138
- {
24139
- variant: "ghost",
24140
- size: "sm",
24141
- onClick: handleClearAll,
24142
- leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24143
- children: "Clear"
24144
- }
24145
- )
24146
- ] });
24249
+ filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
24250
+ "button",
24251
+ {
24252
+ type: "button",
24253
+ onClick: () => handleFilterSelect(filter.field, option),
24254
+ className: cn(
24255
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
24256
+ "border-l-[length:var(--border-width)] border-border",
24257
+ selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
24258
+ ),
24259
+ children: option
24260
+ },
24261
+ option
24262
+ ))
24263
+ ]
24264
+ }
24265
+ )
24266
+ ] }, filter.field)),
24267
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
24268
+ Button,
24269
+ {
24270
+ variant: "ghost",
24271
+ size: "sm",
24272
+ onClick: handleClearAll,
24273
+ leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
24274
+ children: "Clear"
24275
+ }
24276
+ )
24277
+ ]
24278
+ }
24279
+ );
24147
24280
  }
24148
24281
  if (variant === "vertical") {
24149
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
24282
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles5[look], className), children: [
24150
24283
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
24151
24284
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24152
24285
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -24229,92 +24362,100 @@ var init_FilterGroup = __esm({
24229
24362
  ] });
24230
24363
  }
24231
24364
  if (variant === "compact") {
24232
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
24233
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24234
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
24235
- Input,
24236
- {
24237
- type: "date",
24238
- value: selectedValues[filter.field] || "",
24239
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24240
- clearable: true,
24241
- onClear: () => handleFilterSelect(filter.field, null),
24242
- className: "text-sm"
24243
- }
24244
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24245
- /* @__PURE__ */ jsxRuntime.jsx(
24246
- Input,
24247
- {
24248
- type: "date",
24249
- value: selectedValues[`${filter.field}_from`] || "",
24250
- onChange: (e) => handleFilterSelect(
24251
- `${filter.field}_from`,
24252
- e.target.value || null
24253
- ),
24254
- className: "text-sm min-w-[100px]"
24255
- }
24256
- ),
24257
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
24258
- /* @__PURE__ */ jsxRuntime.jsx(
24259
- Input,
24260
- {
24261
- type: "date",
24262
- value: selectedValues[`${filter.field}_to`] || "",
24263
- onChange: (e) => handleFilterSelect(
24264
- `${filter.field}_to`,
24265
- e.target.value || null
24365
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24366
+ HStack,
24367
+ {
24368
+ gap: "sm",
24369
+ align: "center",
24370
+ className: cn("flex-wrap", lookStyles5[look], className),
24371
+ children: [
24372
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
24373
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
24374
+ Input,
24375
+ {
24376
+ type: "date",
24377
+ value: selectedValues[filter.field] || "",
24378
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24379
+ clearable: true,
24380
+ onClear: () => handleFilterSelect(filter.field, null),
24381
+ className: "text-sm"
24382
+ }
24383
+ ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24384
+ /* @__PURE__ */ jsxRuntime.jsx(
24385
+ Input,
24386
+ {
24387
+ type: "date",
24388
+ value: selectedValues[`${filter.field}_from`] || "",
24389
+ onChange: (e) => handleFilterSelect(
24390
+ `${filter.field}_from`,
24391
+ e.target.value || null
24392
+ ),
24393
+ className: "text-sm min-w-[100px]"
24394
+ }
24266
24395
  ),
24267
- className: "text-sm min-w-[100px]"
24268
- }
24269
- )
24270
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
24271
- Input,
24272
- {
24273
- value: selectedValues[filter.field] || "",
24274
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24275
- placeholder: filter.label,
24276
- clearable: true,
24277
- onClear: () => handleFilterSelect(filter.field, null),
24278
- className: "text-sm"
24279
- }
24280
- ) : /* @__PURE__ */ jsxRuntime.jsx(
24281
- Select,
24282
- {
24283
- value: selectedValues[filter.field] || "all",
24284
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24285
- options: [
24286
- { value: "all", label: `All ${filter.label}` },
24287
- ...filter.options?.map((opt) => ({
24288
- value: opt,
24289
- label: opt
24290
- })) || []
24291
- ],
24292
- className: "text-sm"
24293
- }
24294
- ) }, filter.field)),
24295
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24296
- Object.entries(selectedValues).map(([field, value]) => {
24297
- const filterDef = filters.find((f3) => f3.field === field);
24298
- return /* @__PURE__ */ jsxRuntime.jsxs(
24299
- Badge,
24396
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
24397
+ /* @__PURE__ */ jsxRuntime.jsx(
24398
+ Input,
24399
+ {
24400
+ type: "date",
24401
+ value: selectedValues[`${filter.field}_to`] || "",
24402
+ onChange: (e) => handleFilterSelect(
24403
+ `${filter.field}_to`,
24404
+ e.target.value || null
24405
+ ),
24406
+ className: "text-sm min-w-[100px]"
24407
+ }
24408
+ )
24409
+ ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
24410
+ Input,
24300
24411
  {
24301
- variant: "primary",
24302
- size: "md",
24303
- className: "cursor-pointer",
24304
- onClick: () => handleFilterSelect(field, null),
24305
- children: [
24306
- filterDef?.label,
24307
- ": ",
24308
- value,
24309
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24310
- ]
24311
- },
24312
- field
24313
- );
24314
- }),
24315
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24316
- ] })
24317
- ] });
24412
+ value: selectedValues[filter.field] || "",
24413
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
24414
+ placeholder: filter.label,
24415
+ clearable: true,
24416
+ onClear: () => handleFilterSelect(filter.field, null),
24417
+ className: "text-sm"
24418
+ }
24419
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
24420
+ Select,
24421
+ {
24422
+ value: selectedValues[filter.field] || "all",
24423
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value),
24424
+ options: [
24425
+ { value: "all", label: `All ${filter.label}` },
24426
+ ...filter.options?.map((opt) => ({
24427
+ value: opt,
24428
+ label: opt
24429
+ })) || []
24430
+ ],
24431
+ className: "text-sm"
24432
+ }
24433
+ ) }, filter.field)),
24434
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24435
+ Object.entries(selectedValues).map(([field, value]) => {
24436
+ const filterDef = filters.find((f3) => f3.field === field);
24437
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24438
+ Badge,
24439
+ {
24440
+ variant: "primary",
24441
+ size: "md",
24442
+ className: "cursor-pointer",
24443
+ onClick: () => handleFilterSelect(field, null),
24444
+ children: [
24445
+ filterDef?.label,
24446
+ ": ",
24447
+ value,
24448
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
24449
+ ]
24450
+ },
24451
+ field
24452
+ );
24453
+ }),
24454
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
24455
+ ] })
24456
+ ]
24457
+ }
24458
+ );
24318
24459
  }
24319
24460
  return /* @__PURE__ */ jsxRuntime.jsx(
24320
24461
  "div",
@@ -24323,6 +24464,7 @@ var init_FilterGroup = __esm({
24323
24464
  "p-4 rounded-container",
24324
24465
  "bg-card",
24325
24466
  "border-[length:var(--border-width)] border-border",
24467
+ lookStyles5[look],
24326
24468
  className
24327
24469
  ),
24328
24470
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -28796,7 +28938,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
28796
28938
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
28797
28939
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
28798
28940
  }
28799
- var variantColor, StatDisplay;
28941
+ var lookStyles6, variantColor, StatDisplay;
28800
28942
  var init_StatDisplay = __esm({
28801
28943
  "components/molecules/StatDisplay.tsx"() {
28802
28944
  "use client";
@@ -28808,6 +28950,13 @@ var init_StatDisplay = __esm({
28808
28950
  init_Sparkline();
28809
28951
  init_Icon();
28810
28952
  init_useEventBus();
28953
+ lookStyles6 = {
28954
+ elevated: "",
28955
+ flat: "shadow-none border-[length:var(--border-width)] border-border",
28956
+ "progress-backed": "",
28957
+ gauge: "",
28958
+ sparkline: ""
28959
+ };
28811
28960
  variantColor = {
28812
28961
  default: "text-foreground",
28813
28962
  primary: "text-primary",
@@ -28835,6 +28984,7 @@ var init_StatDisplay = __esm({
28835
28984
  size = "md",
28836
28985
  variant = "default",
28837
28986
  compact = false,
28987
+ look = "elevated",
28838
28988
  className,
28839
28989
  isLoading = false,
28840
28990
  error = null
@@ -28887,7 +29037,7 @@ var init_StatDisplay = __esm({
28887
29037
  return /* @__PURE__ */ jsxRuntime.jsx(
28888
29038
  Card,
28889
29039
  {
28890
- className: cn(padSizes[size], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
29040
+ className: cn(padSizes[size], lookStyles6[look], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
28891
29041
  onClick: clickEvent ? handleClick : void 0,
28892
29042
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { align: "start", justify: "between", children: [
28893
29043
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -34331,7 +34481,8 @@ function DataTable({
34331
34481
  bulkActions,
34332
34482
  headerActions,
34333
34483
  showTotal = true,
34334
- className
34484
+ className,
34485
+ look = "dense"
34335
34486
  }) {
34336
34487
  const [openActionMenu, setOpenActionMenu] = React85.useState(
34337
34488
  null
@@ -34458,6 +34609,7 @@ function DataTable({
34458
34609
  {
34459
34610
  className: cn(
34460
34611
  "bg-card border-2 border-border rounded-none overflow-hidden",
34612
+ lookStyles7[look],
34461
34613
  className
34462
34614
  ),
34463
34615
  children: [
@@ -34684,6 +34836,7 @@ function DataTable({
34684
34836
  }
34685
34837
  );
34686
34838
  }
34839
+ var lookStyles7;
34687
34840
  var init_DataTable = __esm({
34688
34841
  "components/organisms/DataTable.tsx"() {
34689
34842
  "use client";
@@ -34697,6 +34850,13 @@ var init_DataTable = __esm({
34697
34850
  init_useEventBus();
34698
34851
  init_useTranslate();
34699
34852
  init_types3();
34853
+ lookStyles7 = {
34854
+ dense: "",
34855
+ spacious: "[&_tbody_tr_td]:py-5 [&_thead_tr_th]:py-4",
34856
+ striped: "[&_tbody_tr:nth-child(odd)]:bg-muted/30",
34857
+ borderless: "border-0 [&_thead]:border-b-0 [&_tbody_tr]:border-b-0 [&_tbody]:divide-y-0",
34858
+ "card-rows": "border-0 [&_tbody]:divide-y-0 [&_tbody_tr]:border-b-0 [&_tbody_tr]:shadow-elevation-card [&_tbody_tr]:rounded-container [&_tbody_tr]:bg-card [&_tbody]:[&_tr]:my-2"
34859
+ };
34700
34860
  DataTable.displayName = "DataTable";
34701
34861
  }
34702
34862
  });
@@ -37855,7 +38015,7 @@ var init_GraphCanvas = __esm({
37855
38015
  GraphCanvas.displayName = "GraphCanvas";
37856
38016
  }
37857
38017
  });
37858
- var Header;
38018
+ var lookStyles8, Header;
37859
38019
  var init_Header = __esm({
37860
38020
  "components/organisms/Header.tsx"() {
37861
38021
  "use client";
@@ -37868,6 +38028,13 @@ var init_Header = __esm({
37868
38028
  init_Typography();
37869
38029
  init_cn();
37870
38030
  init_useTranslate();
38031
+ lookStyles8 = {
38032
+ "compact-bar": "",
38033
+ hero: "py-section min-h-[200px] [&_h1]:text-display-1",
38034
+ breadcrumb: "py-2 text-sm [&_h1]:text-base [&_h1]:font-medium",
38035
+ contextual: "py-3 [&_h1]:text-lg",
38036
+ "editorial-banner": "py-12 [&_h1]:text-display-2 [&_h1]:font-display-bold border-b border-border"
38037
+ };
37871
38038
  Header = ({
37872
38039
  logo,
37873
38040
  logoSrc,
@@ -37885,6 +38052,7 @@ var init_Header = __esm({
37885
38052
  actions,
37886
38053
  sticky = true,
37887
38054
  variant = "mobile",
38055
+ look = "compact-bar",
37888
38056
  onLogoClick,
37889
38057
  className
37890
38058
  }) => {
@@ -37900,6 +38068,7 @@ var init_Header = __esm({
37900
38068
  "flex items-center px-4 justify-between bg-card",
37901
38069
  sticky && "sticky top-0 z-50",
37902
38070
  variant === "mobile" && "lg:hidden",
38071
+ lookStyles8[look],
37903
38072
  className
37904
38073
  ),
37905
38074
  children: [
@@ -44595,7 +44764,7 @@ var init_TeamOrganism = __esm({
44595
44764
  TeamOrganism.displayName = "TeamOrganism";
44596
44765
  }
44597
44766
  });
44598
- var STATUS_STYLES3, Timeline;
44767
+ var lookStyles9, STATUS_STYLES3, Timeline;
44599
44768
  var init_Timeline = __esm({
44600
44769
  "components/organisms/Timeline.tsx"() {
44601
44770
  "use client";
@@ -44606,6 +44775,12 @@ var init_Timeline = __esm({
44606
44775
  init_ErrorState();
44607
44776
  init_EmptyState();
44608
44777
  init_useTranslate();
44778
+ lookStyles9 = {
44779
+ "vertical-compact": "gap-1 [&>*]:py-1",
44780
+ "vertical-spacious": "",
44781
+ horizontal: "flex-row [&>*]:flex-row [&>*]:items-center",
44782
+ swimlane: "flex-row gap-6 [&>*]:flex-row [&>*]:items-center"
44783
+ };
44609
44784
  STATUS_STYLES3 = {
44610
44785
  complete: {
44611
44786
  dotColor: "text-success",
@@ -44636,7 +44811,8 @@ var init_Timeline = __esm({
44636
44811
  entity,
44637
44812
  isLoading = false,
44638
44813
  error,
44639
- className
44814
+ className,
44815
+ look = "vertical-spacious"
44640
44816
  }) => {
44641
44817
  const { t } = useTranslate();
44642
44818
  const entityData = Array.isArray(entity) ? entity : [];
@@ -44692,7 +44868,7 @@ var init_Timeline = __esm({
44692
44868
  }
44693
44869
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "md", children: [
44694
44870
  title && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h5", weight: "semibold", children: title }),
44695
- /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: "relative", children: items.map((item, idx) => {
44871
+ /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: cn("relative", lookStyles9[look]), children: items.map((item, idx) => {
44696
44872
  const status = item.status || "pending";
44697
44873
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
44698
44874
  const ItemIcon = item.icon || style.icon;