@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.
@@ -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, 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,6 +8523,15 @@ var init_Card = __esm({
8515
8523
  md: "shadow",
8516
8524
  lg: "shadow-elevation-dialog"
8517
8525
  };
8526
+ lookStyles2 = {
8527
+ elevated: "",
8528
+ "flat-bordered": "shadow-none border-[length:var(--border-width)] border-border",
8529
+ "borderless-divider": "shadow-none border-0 border-b border-border rounded-none",
8530
+ ticket: "shadow-none border-dashed border-[length:var(--border-width)] border-border",
8531
+ invoice: "shadow-none border-[length:var(--border-width-thick)] border-border rounded-sm",
8532
+ chip: "shadow-none rounded-pill border-[length:var(--border-width)] border-border",
8533
+ "tile-image-first": "p-0 overflow-hidden"
8534
+ };
8518
8535
  Card = React98__namespace.default.forwardRef(
8519
8536
  ({
8520
8537
  className,
@@ -8523,6 +8540,7 @@ var init_Card = __esm({
8523
8540
  title,
8524
8541
  subtitle,
8525
8542
  shadow,
8543
+ look = "elevated",
8526
8544
  children,
8527
8545
  ...props
8528
8546
  }, ref) => {
@@ -8535,6 +8553,7 @@ var init_Card = __esm({
8535
8553
  "transition-all duration-[var(--transition-normal)]",
8536
8554
  variantStyles4[variant],
8537
8555
  paddingStyles2[padding],
8556
+ lookStyles2[look],
8538
8557
  shadow && shadowStyles2[shadow],
8539
8558
  className
8540
8559
  ),
@@ -19920,7 +19939,7 @@ var init_BookTableOfContents = __esm({
19920
19939
  BookTableOfContents.displayName = "BookTableOfContents";
19921
19940
  }
19922
19941
  });
19923
- var ICON_NAME_ALIASES, EmptyState;
19942
+ var ICON_NAME_ALIASES, lookStyles3, EmptyState;
19924
19943
  var init_EmptyState = __esm({
19925
19944
  "components/molecules/EmptyState.tsx"() {
19926
19945
  "use client";
@@ -19937,6 +19956,12 @@ var init_EmptyState = __esm({
19937
19956
  error: "x-circle",
19938
19957
  warning: "alert-circle"
19939
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
+ };
19940
19965
  EmptyState = ({
19941
19966
  icon,
19942
19967
  title,
@@ -19947,7 +19972,8 @@ var init_EmptyState = __esm({
19947
19972
  className,
19948
19973
  destructive,
19949
19974
  variant,
19950
- actionEvent
19975
+ actionEvent,
19976
+ look = "icon-only"
19951
19977
  }) => {
19952
19978
  const eventBus = useEventBus();
19953
19979
  const { t } = useTranslate();
@@ -19967,6 +19993,7 @@ var init_EmptyState = __esm({
19967
19993
  align: "center",
19968
19994
  className: cn(
19969
19995
  "justify-center py-12 text-center",
19996
+ lookStyles3[look],
19970
19997
  className
19971
19998
  ),
19972
19999
  children: [
@@ -21207,7 +21234,7 @@ function useSafeEventBus2() {
21207
21234
  } };
21208
21235
  }
21209
21236
  }
21210
- var log9, ButtonGroup;
21237
+ var log9, lookStyles4, ButtonGroup;
21211
21238
  var init_ButtonGroup = __esm({
21212
21239
  "components/molecules/ButtonGroup.tsx"() {
21213
21240
  "use client";
@@ -21215,6 +21242,13 @@ var init_ButtonGroup = __esm({
21215
21242
  init_atoms();
21216
21243
  init_useEventBus();
21217
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
+ };
21218
21252
  ButtonGroup = ({
21219
21253
  children,
21220
21254
  primary,
@@ -21224,7 +21258,8 @@ var init_ButtonGroup = __esm({
21224
21258
  className,
21225
21259
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
21226
21260
  entity: _entity,
21227
- filters
21261
+ filters,
21262
+ look = "right-aligned-buttons"
21228
21263
  }) => {
21229
21264
  const eventBus = useSafeEventBus2();
21230
21265
  const variantClasses2 = {
@@ -21301,6 +21336,7 @@ var init_ButtonGroup = __esm({
21301
21336
  "inline-flex gap-2",
21302
21337
  variantClasses2[variant],
21303
21338
  orientationClasses[orientation],
21339
+ lookStyles4[look],
21304
21340
  className
21305
21341
  ),
21306
21342
  role: "group",
@@ -23832,7 +23868,7 @@ var init_CastleTemplate = __esm({
23832
23868
  CastleTemplate.displayName = "CastleTemplate";
23833
23869
  }
23834
23870
  });
23835
- 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;
23836
23872
  var init_Chart = __esm({
23837
23873
  "components/organisms/Chart.tsx"() {
23838
23874
  "use client";
@@ -23862,7 +23898,7 @@ var init_Chart = __esm({
23862
23898
  if (Number.isNaN(parsed.getTime())) return raw;
23863
23899
  return monthFormatter.format(parsed);
23864
23900
  };
23865
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
23901
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
23866
23902
  const categories = React98.useMemo(() => {
23867
23903
  const set = [];
23868
23904
  const seen = /* @__PURE__ */ new Set();
@@ -23900,6 +23936,64 @@ var init_Chart = __esm({
23900
23936
  }
23901
23937
  return m;
23902
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
+ }
23903
23997
  return /* @__PURE__ */ jsxRuntime.jsx(
23904
23998
  HStack,
23905
23999
  {
@@ -24327,10 +24421,20 @@ var init_Chart = __esm({
24327
24421
  }
24328
24422
  );
24329
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
+ };
24330
24433
  Chart = ({
24331
24434
  title,
24332
24435
  subtitle,
24333
- chartType = "bar",
24436
+ chartType,
24437
+ look,
24334
24438
  series,
24335
24439
  data: simpleData,
24336
24440
  scatterData,
@@ -24346,6 +24450,7 @@ var init_Chart = __esm({
24346
24450
  error,
24347
24451
  className
24348
24452
  }) => {
24453
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
24349
24454
  const eventBus = useEventBus();
24350
24455
  const { t } = useTranslate();
24351
24456
  const handleAction = React98.useCallback(
@@ -24374,7 +24479,7 @@ var init_Chart = __esm({
24374
24479
  return [];
24375
24480
  }, [simpleData, series]);
24376
24481
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
24377
- 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);
24378
24483
  if (isLoading) {
24379
24484
  return /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { message: "Loading chart...", className });
24380
24485
  }
@@ -24409,7 +24514,7 @@ var init_Chart = __esm({
24409
24514
  )) })
24410
24515
  ] }),
24411
24516
  /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "w-full", children: [
24412
- chartType === "bar" && /* @__PURE__ */ jsxRuntime.jsx(
24517
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsxRuntime.jsx(
24413
24518
  BarChart,
24414
24519
  {
24415
24520
  series: normalizedSeries,
@@ -24420,7 +24525,19 @@ var init_Chart = __esm({
24420
24525
  onPointClick: handlePointClick
24421
24526
  }
24422
24527
  ),
24423
- chartType === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
24528
+ resolvedLook === "bar-horizontal" && /* @__PURE__ */ jsxRuntime.jsx(
24529
+ BarChart,
24530
+ {
24531
+ series: normalizedSeries,
24532
+ height,
24533
+ showValues,
24534
+ stack,
24535
+ timeAxis,
24536
+ horizontal: true,
24537
+ onPointClick: handlePointClick
24538
+ }
24539
+ ),
24540
+ resolvedLook === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
24424
24541
  BarChart,
24425
24542
  {
24426
24543
  series: normalizedSeries,
@@ -24432,7 +24549,7 @@ var init_Chart = __esm({
24432
24549
  onPointClick: handlePointClick
24433
24550
  }
24434
24551
  ),
24435
- chartType === "line" && /* @__PURE__ */ jsxRuntime.jsx(
24552
+ resolvedLook === "line" && /* @__PURE__ */ jsxRuntime.jsx(
24436
24553
  LineChart,
24437
24554
  {
24438
24555
  series: normalizedSeries,
@@ -24442,7 +24559,7 @@ var init_Chart = __esm({
24442
24559
  onPointClick: handlePointClick
24443
24560
  }
24444
24561
  ),
24445
- chartType === "area" && /* @__PURE__ */ jsxRuntime.jsx(
24562
+ resolvedLook === "area" && /* @__PURE__ */ jsxRuntime.jsx(
24446
24563
  LineChart,
24447
24564
  {
24448
24565
  series: normalizedSeries,
@@ -24453,7 +24570,7 @@ var init_Chart = __esm({
24453
24570
  onPointClick: handlePointClick
24454
24571
  }
24455
24572
  ),
24456
- chartType === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
24573
+ resolvedLook === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
24457
24574
  PieChart,
24458
24575
  {
24459
24576
  data: firstSeriesData,
@@ -24462,7 +24579,7 @@ var init_Chart = __esm({
24462
24579
  onPointClick: handlePointClick
24463
24580
  }
24464
24581
  ),
24465
- chartType === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
24582
+ resolvedLook === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
24466
24583
  PieChart,
24467
24584
  {
24468
24585
  data: firstSeriesData,
@@ -24472,7 +24589,7 @@ var init_Chart = __esm({
24472
24589
  onPointClick: handlePointClick
24473
24590
  }
24474
24591
  ),
24475
- chartType === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
24592
+ resolvedLook === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
24476
24593
  ScatterChart,
24477
24594
  {
24478
24595
  data: scatterData ?? [],
@@ -27895,7 +28012,7 @@ var init_useQuerySingleton = __esm({
27895
28012
  queryStores = /* @__PURE__ */ new Map();
27896
28013
  }
27897
28014
  });
27898
- var resolveFilterType, FilterGroup;
28015
+ var resolveFilterType, lookStyles5, FilterGroup;
27899
28016
  var init_FilterGroup = __esm({
27900
28017
  "components/molecules/FilterGroup.tsx"() {
27901
28018
  "use client";
@@ -27909,6 +28026,13 @@ var init_FilterGroup = __esm({
27909
28026
  init_useEventBus();
27910
28027
  init_useQuerySingleton();
27911
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
+ };
27912
28036
  FilterGroup = ({
27913
28037
  entity,
27914
28038
  filters,
@@ -27918,7 +28042,8 @@ var init_FilterGroup = __esm({
27918
28042
  variant = "default",
27919
28043
  showIcon = true,
27920
28044
  query,
27921
- isLoading
28045
+ isLoading,
28046
+ look = "toolbar"
27922
28047
  }) => {
27923
28048
  const eventBus = useEventBus();
27924
28049
  const queryState = useQuerySingleton(query);
@@ -27973,63 +28098,71 @@ var init_FilterGroup = __esm({
27973
28098
  }, [onClearAll, queryState, eventBus, entity, query]);
27974
28099
  const activeFilterCount = Object.keys(selectedValues).length;
27975
28100
  if (variant === "pills") {
27976
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
27977
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
27978
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
27979
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
27980
- filter.label,
27981
- ":"
27982
- ] }),
27983
- /* @__PURE__ */ jsxRuntime.jsxs(
27984
- HStack,
27985
- {
27986
- gap: "none",
27987
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
27988
- children: [
27989
- /* @__PURE__ */ jsxRuntime.jsx(
27990
- "button",
27991
- {
27992
- type: "button",
27993
- onClick: () => handleFilterSelect(filter.field, null),
27994
- className: cn(
27995
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
27996
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
27997
- ),
27998
- children: "All"
27999
- }
28000
- ),
28001
- filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
28002
- "button",
28003
- {
28004
- type: "button",
28005
- onClick: () => handleFilterSelect(filter.field, option),
28006
- className: cn(
28007
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
28008
- "border-l-[length:var(--border-width)] border-border",
28009
- 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
+ }
28010
28131
  ),
28011
- children: option
28012
- },
28013
- option
28014
- ))
28015
- ]
28016
- }
28017
- )
28018
- ] }, filter.field)),
28019
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
28020
- Button,
28021
- {
28022
- variant: "ghost",
28023
- size: "sm",
28024
- onClick: handleClearAll,
28025
- leftIcon: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "h-3.5 w-3.5" }),
28026
- children: "Clear"
28027
- }
28028
- )
28029
- ] });
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
+ );
28030
28163
  }
28031
28164
  if (variant === "vertical") {
28032
- 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: [
28033
28166
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
28034
28167
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
28035
28168
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -28112,92 +28245,100 @@ var init_FilterGroup = __esm({
28112
28245
  ] });
28113
28246
  }
28114
28247
  if (variant === "compact") {
28115
- return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
28116
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
28117
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
28118
- Input,
28119
- {
28120
- type: "date",
28121
- value: selectedValues[filter.field] || "",
28122
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
28123
- clearable: true,
28124
- onClear: () => handleFilterSelect(filter.field, null),
28125
- className: "text-sm"
28126
- }
28127
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
28128
- /* @__PURE__ */ jsxRuntime.jsx(
28129
- Input,
28130
- {
28131
- type: "date",
28132
- value: selectedValues[`${filter.field}_from`] || "",
28133
- onChange: (e) => handleFilterSelect(
28134
- `${filter.field}_from`,
28135
- e.target.value || null
28136
- ),
28137
- className: "text-sm min-w-[100px]"
28138
- }
28139
- ),
28140
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
28141
- /* @__PURE__ */ jsxRuntime.jsx(
28142
- Input,
28143
- {
28144
- type: "date",
28145
- value: selectedValues[`${filter.field}_to`] || "",
28146
- onChange: (e) => handleFilterSelect(
28147
- `${filter.field}_to`,
28148
- 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
+ }
28149
28278
  ),
28150
- className: "text-sm min-w-[100px]"
28151
- }
28152
- )
28153
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
28154
- Input,
28155
- {
28156
- value: selectedValues[filter.field] || "",
28157
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
28158
- placeholder: filter.label,
28159
- clearable: true,
28160
- onClear: () => handleFilterSelect(filter.field, null),
28161
- className: "text-sm"
28162
- }
28163
- ) : /* @__PURE__ */ jsxRuntime.jsx(
28164
- Select,
28165
- {
28166
- value: selectedValues[filter.field] || "all",
28167
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
28168
- options: [
28169
- { value: "all", label: `All ${filter.label}` },
28170
- ...filter.options?.map((opt) => ({
28171
- value: opt,
28172
- label: opt
28173
- })) || []
28174
- ],
28175
- className: "text-sm"
28176
- }
28177
- ) }, filter.field)),
28178
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
28179
- Object.entries(selectedValues).map(([field, value]) => {
28180
- const filterDef = filters.find((f3) => f3.field === field);
28181
- return /* @__PURE__ */ jsxRuntime.jsxs(
28182
- 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,
28183
28294
  {
28184
- variant: "primary",
28185
- size: "md",
28186
- className: "cursor-pointer",
28187
- onClick: () => handleFilterSelect(field, null),
28188
- children: [
28189
- filterDef?.label,
28190
- ": ",
28191
- value,
28192
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "ml-1 h-3 w-3" })
28193
- ]
28194
- },
28195
- field
28196
- );
28197
- }),
28198
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
28199
- ] })
28200
- ] });
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
+ );
28201
28342
  }
28202
28343
  return /* @__PURE__ */ jsxRuntime.jsx(
28203
28344
  "div",
@@ -28206,6 +28347,7 @@ var init_FilterGroup = __esm({
28206
28347
  "p-4 rounded-container",
28207
28348
  "bg-card",
28208
28349
  "border-[length:var(--border-width)] border-border",
28350
+ lookStyles5[look],
28209
28351
  className
28210
28352
  ),
28211
28353
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -32679,7 +32821,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
32679
32821
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
32680
32822
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
32681
32823
  }
32682
- var variantColor, StatDisplay;
32824
+ var lookStyles6, variantColor, StatDisplay;
32683
32825
  var init_StatDisplay = __esm({
32684
32826
  "components/molecules/StatDisplay.tsx"() {
32685
32827
  "use client";
@@ -32691,6 +32833,13 @@ var init_StatDisplay = __esm({
32691
32833
  init_Sparkline();
32692
32834
  init_Icon();
32693
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
+ };
32694
32843
  variantColor = {
32695
32844
  default: "text-foreground",
32696
32845
  primary: "text-primary",
@@ -32718,6 +32867,7 @@ var init_StatDisplay = __esm({
32718
32867
  size = "md",
32719
32868
  variant = "default",
32720
32869
  compact = false,
32870
+ look = "elevated",
32721
32871
  className,
32722
32872
  isLoading = false,
32723
32873
  error = null
@@ -32770,7 +32920,7 @@ var init_StatDisplay = __esm({
32770
32920
  return /* @__PURE__ */ jsxRuntime.jsx(
32771
32921
  Card,
32772
32922
  {
32773
- 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),
32774
32924
  onClick: clickEvent ? handleClick : void 0,
32775
32925
  children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { align: "start", justify: "between", children: [
32776
32926
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -37949,7 +38099,8 @@ function DataTable({
37949
38099
  bulkActions,
37950
38100
  headerActions,
37951
38101
  showTotal = true,
37952
- className
38102
+ className,
38103
+ look = "dense"
37953
38104
  }) {
37954
38105
  const [openActionMenu, setOpenActionMenu] = React98.useState(
37955
38106
  null
@@ -38076,6 +38227,7 @@ function DataTable({
38076
38227
  {
38077
38228
  className: cn(
38078
38229
  "bg-card border-2 border-border rounded-none overflow-hidden",
38230
+ lookStyles7[look],
38079
38231
  className
38080
38232
  ),
38081
38233
  children: [
@@ -38302,6 +38454,7 @@ function DataTable({
38302
38454
  }
38303
38455
  );
38304
38456
  }
38457
+ var lookStyles7;
38305
38458
  var init_DataTable = __esm({
38306
38459
  "components/organisms/DataTable.tsx"() {
38307
38460
  "use client";
@@ -38315,6 +38468,13 @@ var init_DataTable = __esm({
38315
38468
  init_useEventBus();
38316
38469
  init_useTranslate();
38317
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
+ };
38318
38478
  DataTable.displayName = "DataTable";
38319
38479
  }
38320
38480
  });
@@ -41473,7 +41633,7 @@ var init_GraphCanvas = __esm({
41473
41633
  GraphCanvas.displayName = "GraphCanvas";
41474
41634
  }
41475
41635
  });
41476
- var Header;
41636
+ var lookStyles8, Header;
41477
41637
  var init_Header = __esm({
41478
41638
  "components/organisms/Header.tsx"() {
41479
41639
  "use client";
@@ -41486,6 +41646,13 @@ var init_Header = __esm({
41486
41646
  init_Typography();
41487
41647
  init_cn();
41488
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
+ };
41489
41656
  Header = ({
41490
41657
  logo,
41491
41658
  logoSrc,
@@ -41503,6 +41670,7 @@ var init_Header = __esm({
41503
41670
  actions,
41504
41671
  sticky = true,
41505
41672
  variant = "mobile",
41673
+ look = "compact-bar",
41506
41674
  onLogoClick,
41507
41675
  className
41508
41676
  }) => {
@@ -41518,6 +41686,7 @@ var init_Header = __esm({
41518
41686
  "flex items-center px-4 justify-between bg-card",
41519
41687
  sticky && "sticky top-0 z-50",
41520
41688
  variant === "mobile" && "lg:hidden",
41689
+ lookStyles8[look],
41521
41690
  className
41522
41691
  ),
41523
41692
  children: [
@@ -48213,7 +48382,7 @@ var init_TeamOrganism = __esm({
48213
48382
  TeamOrganism.displayName = "TeamOrganism";
48214
48383
  }
48215
48384
  });
48216
- var STATUS_STYLES3, Timeline;
48385
+ var lookStyles9, STATUS_STYLES3, Timeline;
48217
48386
  var init_Timeline = __esm({
48218
48387
  "components/organisms/Timeline.tsx"() {
48219
48388
  "use client";
@@ -48224,6 +48393,12 @@ var init_Timeline = __esm({
48224
48393
  init_ErrorState();
48225
48394
  init_EmptyState();
48226
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
+ };
48227
48402
  STATUS_STYLES3 = {
48228
48403
  complete: {
48229
48404
  dotColor: "text-success",
@@ -48254,7 +48429,8 @@ var init_Timeline = __esm({
48254
48429
  entity,
48255
48430
  isLoading = false,
48256
48431
  error,
48257
- className
48432
+ className,
48433
+ look = "vertical-spacious"
48258
48434
  }) => {
48259
48435
  const { t } = useTranslate();
48260
48436
  const entityData = Array.isArray(entity) ? entity : [];
@@ -48310,7 +48486,7 @@ var init_Timeline = __esm({
48310
48486
  }
48311
48487
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "md", children: [
48312
48488
  title && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "h5", weight: "semibold", children: title }),
48313
- /* @__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) => {
48314
48490
  const status = item.status || "pending";
48315
48491
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
48316
48492
  const ItemIcon = item.icon || style.icon;