@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.
@@ -2332,7 +2332,7 @@ var init_Checkbox = __esm({
2332
2332
  exports.Checkbox.displayName = "Checkbox";
2333
2333
  }
2334
2334
  });
2335
- var variantStyles2, paddingStyles, shadowStyles; exports.Card = void 0; exports.CardHeader = void 0; exports.CardTitle = void 0; exports.CardContent = void 0; exports.CardBody = void 0; exports.CardFooter = void 0;
2335
+ var variantStyles2, paddingStyles, shadowStyles, lookStyles; exports.Card = void 0; exports.CardHeader = void 0; exports.CardTitle = void 0; exports.CardContent = void 0; exports.CardBody = void 0; exports.CardFooter = void 0;
2336
2336
  var init_Card = __esm({
2337
2337
  "components/atoms/Card.tsx"() {
2338
2338
  init_cn();
@@ -2380,6 +2380,15 @@ var init_Card = __esm({
2380
2380
  md: "shadow",
2381
2381
  lg: "shadow-elevation-dialog"
2382
2382
  };
2383
+ lookStyles = {
2384
+ elevated: "",
2385
+ "flat-bordered": "shadow-none border-[length:var(--border-width)] border-border",
2386
+ "borderless-divider": "shadow-none border-0 border-b border-border rounded-none",
2387
+ ticket: "shadow-none border-dashed border-[length:var(--border-width)] border-border",
2388
+ invoice: "shadow-none border-[length:var(--border-width-thick)] border-border rounded-sm",
2389
+ chip: "shadow-none rounded-pill border-[length:var(--border-width)] border-border",
2390
+ "tile-image-first": "p-0 overflow-hidden"
2391
+ };
2383
2392
  exports.Card = React80__namespace.default.forwardRef(
2384
2393
  ({
2385
2394
  className,
@@ -2388,6 +2397,7 @@ var init_Card = __esm({
2388
2397
  title,
2389
2398
  subtitle,
2390
2399
  shadow,
2400
+ look = "elevated",
2391
2401
  children,
2392
2402
  ...props
2393
2403
  }, ref) => {
@@ -2400,6 +2410,7 @@ var init_Card = __esm({
2400
2410
  "transition-all duration-[var(--transition-normal)]",
2401
2411
  variantStyles2[variant],
2402
2412
  paddingStyles[padding],
2413
+ lookStyles[look],
2403
2414
  shadow && shadowStyles[shadow],
2404
2415
  className
2405
2416
  ),
@@ -6212,7 +6223,7 @@ var init_EntitySchemaContext = __esm({
6212
6223
  EntitySchemaContext = React80.createContext(null);
6213
6224
  }
6214
6225
  });
6215
- var sizeClasses5, minWidthClasses; exports.Modal = void 0;
6226
+ var sizeClasses5, minWidthClasses, lookStyles2; exports.Modal = void 0;
6216
6227
  var init_Modal = __esm({
6217
6228
  "components/molecules/Modal.tsx"() {
6218
6229
  "use client";
@@ -6237,6 +6248,12 @@ var init_Modal = __esm({
6237
6248
  xl: "min-w-[700px] max-sm:min-w-0",
6238
6249
  full: "min-w-0"
6239
6250
  };
6251
+ lookStyles2 = {
6252
+ "centered-card": "",
6253
+ "top-sheet": "top-0 rounded-t-none rounded-b-container max-w-full w-full",
6254
+ "side-drawer": "right-0 top-0 bottom-0 h-full rounded-l-container rounded-r-none w-[400px] max-w-full",
6255
+ "full-screen": "inset-0 rounded-none w-full h-full max-w-full"
6256
+ };
6240
6257
  exports.Modal = ({
6241
6258
  isOpen = true,
6242
6259
  onClose = () => {
@@ -6250,7 +6267,8 @@ var init_Modal = __esm({
6250
6267
  closeOnEscape = true,
6251
6268
  className,
6252
6269
  closeEvent,
6253
- swipeDownToClose = true
6270
+ swipeDownToClose = true,
6271
+ look = "centered-card"
6254
6272
  }) => {
6255
6273
  const eventBus = useEventBus();
6256
6274
  const modalRef = React80.useRef(null);
@@ -6335,6 +6353,7 @@ var init_Modal = __esm({
6335
6353
  // Mobile: take the entire screen. Override desktop max-w cap,
6336
6354
  // full height, no rounded corners, no min-width.
6337
6355
  "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
6356
+ lookStyles2[look],
6338
6357
  className
6339
6358
  ),
6340
6359
  style: dragY > 0 ? {
@@ -14856,7 +14875,7 @@ var init_BookTableOfContents = __esm({
14856
14875
  exports.BookTableOfContents.displayName = "BookTableOfContents";
14857
14876
  }
14858
14877
  });
14859
- var ICON_NAME_ALIASES; exports.EmptyState = void 0;
14878
+ var ICON_NAME_ALIASES, lookStyles3; exports.EmptyState = void 0;
14860
14879
  var init_EmptyState = __esm({
14861
14880
  "components/molecules/EmptyState.tsx"() {
14862
14881
  "use client";
@@ -14873,6 +14892,12 @@ var init_EmptyState = __esm({
14873
14892
  error: "x-circle",
14874
14893
  warning: "alert-circle"
14875
14894
  };
14895
+ lookStyles3 = {
14896
+ "icon-only": "",
14897
+ illustrated: "[&_svg]:w-32 [&_svg]:h-32",
14898
+ "text-only": "[&_svg]:hidden",
14899
+ mascot: "[&_svg]:w-24 [&_svg]:h-24 [&_svg]:rounded-pill"
14900
+ };
14876
14901
  exports.EmptyState = ({
14877
14902
  icon,
14878
14903
  title,
@@ -14883,7 +14908,8 @@ var init_EmptyState = __esm({
14883
14908
  className,
14884
14909
  destructive,
14885
14910
  variant,
14886
- actionEvent
14911
+ actionEvent,
14912
+ look = "icon-only"
14887
14913
  }) => {
14888
14914
  const eventBus = useEventBus();
14889
14915
  const { t } = useTranslate();
@@ -14903,6 +14929,7 @@ var init_EmptyState = __esm({
14903
14929
  align: "center",
14904
14930
  className: cn(
14905
14931
  "justify-center py-12 text-center",
14932
+ lookStyles3[look],
14906
14933
  className
14907
14934
  ),
14908
14935
  children: [
@@ -16143,7 +16170,7 @@ function useSafeEventBus2() {
16143
16170
  } };
16144
16171
  }
16145
16172
  }
16146
- var log6; exports.ButtonGroup = void 0;
16173
+ var log6, lookStyles4; exports.ButtonGroup = void 0;
16147
16174
  var init_ButtonGroup = __esm({
16148
16175
  "components/molecules/ButtonGroup.tsx"() {
16149
16176
  "use client";
@@ -16151,6 +16178,13 @@ var init_ButtonGroup = __esm({
16151
16178
  init_atoms();
16152
16179
  init_useEventBus();
16153
16180
  log6 = logger.createLogger("almadar:ui:button-group");
16181
+ lookStyles4 = {
16182
+ "right-aligned-buttons": "",
16183
+ "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
16184
+ "inline-row": "gap-2 inline-flex",
16185
+ "dropdown-menu": "[&>button:not(:first-child)]:hidden",
16186
+ "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
16187
+ };
16154
16188
  exports.ButtonGroup = ({
16155
16189
  children,
16156
16190
  primary,
@@ -16160,7 +16194,8 @@ var init_ButtonGroup = __esm({
16160
16194
  className,
16161
16195
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
16162
16196
  entity: _entity,
16163
- filters
16197
+ filters,
16198
+ look = "right-aligned-buttons"
16164
16199
  }) => {
16165
16200
  const eventBus = useSafeEventBus2();
16166
16201
  const variantClasses2 = {
@@ -16237,6 +16272,7 @@ var init_ButtonGroup = __esm({
16237
16272
  "inline-flex gap-2",
16238
16273
  variantClasses2[variant],
16239
16274
  orientationClasses[orientation],
16275
+ lookStyles4[look],
16240
16276
  className
16241
16277
  ),
16242
16278
  role: "group",
@@ -18768,7 +18804,7 @@ var init_CastleTemplate = __esm({
18768
18804
  CastleTemplate.displayName = "CastleTemplate";
18769
18805
  }
18770
18806
  });
18771
- var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart; exports.Chart = void 0;
18807
+ var CHART_COLORS, seriesColor, monthFormatter, formatTimeLabel, BarChart, PieChart, LineChart, ScatterChart, LOOK_FROM_CHART_TYPE; exports.Chart = void 0;
18772
18808
  var init_Chart = __esm({
18773
18809
  "components/organisms/Chart.tsx"() {
18774
18810
  "use client";
@@ -18798,7 +18834,7 @@ var init_Chart = __esm({
18798
18834
  if (Number.isNaN(parsed.getTime())) return raw;
18799
18835
  return monthFormatter.format(parsed);
18800
18836
  };
18801
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
18837
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
18802
18838
  const categories = React80.useMemo(() => {
18803
18839
  const set = [];
18804
18840
  const seen = /* @__PURE__ */ new Set();
@@ -18836,6 +18872,64 @@ var init_Chart = __esm({
18836
18872
  }
18837
18873
  return m;
18838
18874
  }, [series, stack, columnTotals]);
18875
+ if (horizontal) {
18876
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.VStack, { gap: "xs", align: "stretch", className: "w-full", style: { minHeight: height }, children: categories.map((label, catIdx) => {
18877
+ const displayLabel = timeAxis ? formatTimeLabel(label) : label;
18878
+ const total = columnTotals?.[catIdx] ?? 1;
18879
+ return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", align: "center", className: "w-full", children: [
18880
+ /* @__PURE__ */ jsxRuntime.jsx(
18881
+ exports.Typography,
18882
+ {
18883
+ variant: "caption",
18884
+ color: "secondary",
18885
+ className: "truncate text-right",
18886
+ style: { width: 80, flexShrink: 0 },
18887
+ children: displayLabel
18888
+ }
18889
+ ),
18890
+ /* @__PURE__ */ jsxRuntime.jsx(
18891
+ exports.HStack,
18892
+ {
18893
+ gap: stack === "none" ? "xs" : "none",
18894
+ align: "center",
18895
+ className: "flex-1 min-w-0",
18896
+ style: { height: 24 },
18897
+ children: series.map((s, sIdx) => {
18898
+ const value = valueAt(s, label);
18899
+ const ratio = stack === "normalize" ? total === 0 ? 0 : value / total * 100 : value / maxValue * 100;
18900
+ const color = seriesColor(s, sIdx);
18901
+ return /* @__PURE__ */ jsxRuntime.jsx(
18902
+ exports.Box,
18903
+ {
18904
+ className: "h-full rounded-r-sm transition-all duration-500 ease-out min-w-[2px] cursor-pointer hover:opacity-80",
18905
+ style: {
18906
+ width: `${ratio}%`,
18907
+ backgroundColor: color
18908
+ },
18909
+ onClick: () => onPointClick?.(
18910
+ { label, value, color },
18911
+ s.name
18912
+ ),
18913
+ title: `${s.name}: ${value}`
18914
+ },
18915
+ s.name
18916
+ );
18917
+ })
18918
+ }
18919
+ ),
18920
+ showValues && series.length === 1 && /* @__PURE__ */ jsxRuntime.jsx(
18921
+ exports.Typography,
18922
+ {
18923
+ variant: "caption",
18924
+ color: "secondary",
18925
+ className: "tabular-nums",
18926
+ style: { width: 40, flexShrink: 0 },
18927
+ children: valueAt(series[0], label)
18928
+ }
18929
+ )
18930
+ ] }, label);
18931
+ }) });
18932
+ }
18839
18933
  return /* @__PURE__ */ jsxRuntime.jsx(
18840
18934
  exports.HStack,
18841
18935
  {
@@ -19263,10 +19357,20 @@ var init_Chart = __esm({
19263
19357
  }
19264
19358
  );
19265
19359
  };
19360
+ LOOK_FROM_CHART_TYPE = {
19361
+ bar: "bar-vertical",
19362
+ line: "line",
19363
+ pie: "pie",
19364
+ area: "area",
19365
+ donut: "donut",
19366
+ scatter: "scatter",
19367
+ histogram: "histogram"
19368
+ };
19266
19369
  exports.Chart = ({
19267
19370
  title,
19268
19371
  subtitle,
19269
- chartType = "bar",
19372
+ chartType,
19373
+ look,
19270
19374
  series,
19271
19375
  data: simpleData,
19272
19376
  scatterData,
@@ -19282,6 +19386,7 @@ var init_Chart = __esm({
19282
19386
  error,
19283
19387
  className
19284
19388
  }) => {
19389
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
19285
19390
  const eventBus = useEventBus();
19286
19391
  const { t } = useTranslate();
19287
19392
  const handleAction = React80.useCallback(
@@ -19310,7 +19415,7 @@ var init_Chart = __esm({
19310
19415
  return [];
19311
19416
  }, [simpleData, series]);
19312
19417
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
19313
- const hasContent = chartType === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
19418
+ const hasContent = resolvedLook === "scatter" ? (scatterData?.length ?? 0) > 0 : normalizedSeries.some((s) => s.data.length > 0);
19314
19419
  if (isLoading) {
19315
19420
  return /* @__PURE__ */ jsxRuntime.jsx(exports.LoadingState, { message: "Loading chart...", className });
19316
19421
  }
@@ -19345,7 +19450,7 @@ var init_Chart = __esm({
19345
19450
  )) })
19346
19451
  ] }),
19347
19452
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "w-full", children: [
19348
- chartType === "bar" && /* @__PURE__ */ jsxRuntime.jsx(
19453
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsxRuntime.jsx(
19349
19454
  BarChart,
19350
19455
  {
19351
19456
  series: normalizedSeries,
@@ -19356,7 +19461,19 @@ var init_Chart = __esm({
19356
19461
  onPointClick: handlePointClick
19357
19462
  }
19358
19463
  ),
19359
- chartType === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
19464
+ resolvedLook === "bar-horizontal" && /* @__PURE__ */ jsxRuntime.jsx(
19465
+ BarChart,
19466
+ {
19467
+ series: normalizedSeries,
19468
+ height,
19469
+ showValues,
19470
+ stack,
19471
+ timeAxis,
19472
+ horizontal: true,
19473
+ onPointClick: handlePointClick
19474
+ }
19475
+ ),
19476
+ resolvedLook === "histogram" && /* @__PURE__ */ jsxRuntime.jsx(
19360
19477
  BarChart,
19361
19478
  {
19362
19479
  series: normalizedSeries,
@@ -19368,7 +19485,7 @@ var init_Chart = __esm({
19368
19485
  onPointClick: handlePointClick
19369
19486
  }
19370
19487
  ),
19371
- chartType === "line" && /* @__PURE__ */ jsxRuntime.jsx(
19488
+ resolvedLook === "line" && /* @__PURE__ */ jsxRuntime.jsx(
19372
19489
  LineChart,
19373
19490
  {
19374
19491
  series: normalizedSeries,
@@ -19378,7 +19495,7 @@ var init_Chart = __esm({
19378
19495
  onPointClick: handlePointClick
19379
19496
  }
19380
19497
  ),
19381
- chartType === "area" && /* @__PURE__ */ jsxRuntime.jsx(
19498
+ resolvedLook === "area" && /* @__PURE__ */ jsxRuntime.jsx(
19382
19499
  LineChart,
19383
19500
  {
19384
19501
  series: normalizedSeries,
@@ -19389,7 +19506,7 @@ var init_Chart = __esm({
19389
19506
  onPointClick: handlePointClick
19390
19507
  }
19391
19508
  ),
19392
- chartType === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
19509
+ resolvedLook === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
19393
19510
  PieChart,
19394
19511
  {
19395
19512
  data: firstSeriesData,
@@ -19398,7 +19515,7 @@ var init_Chart = __esm({
19398
19515
  onPointClick: handlePointClick
19399
19516
  }
19400
19517
  ),
19401
- chartType === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
19518
+ resolvedLook === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
19402
19519
  PieChart,
19403
19520
  {
19404
19521
  data: firstSeriesData,
@@ -19408,7 +19525,7 @@ var init_Chart = __esm({
19408
19525
  onPointClick: handlePointClick
19409
19526
  }
19410
19527
  ),
19411
- chartType === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
19528
+ resolvedLook === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
19412
19529
  ScatterChart,
19413
19530
  {
19414
19531
  data: scatterData ?? [],
@@ -23070,7 +23187,7 @@ var init_useQuerySingleton = __esm({
23070
23187
  queryStores = /* @__PURE__ */ new Map();
23071
23188
  }
23072
23189
  });
23073
- var resolveFilterType; exports.FilterGroup = void 0;
23190
+ var resolveFilterType, lookStyles5; exports.FilterGroup = void 0;
23074
23191
  var init_FilterGroup = __esm({
23075
23192
  "components/molecules/FilterGroup.tsx"() {
23076
23193
  "use client";
@@ -23084,6 +23201,13 @@ var init_FilterGroup = __esm({
23084
23201
  init_useEventBus();
23085
23202
  init_useQuerySingleton();
23086
23203
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
23204
+ lookStyles5 = {
23205
+ toolbar: "",
23206
+ chips: "gap-2 [&>*]:rounded-pill [&>*]:px-3 [&>*]:py-1",
23207
+ pills: "gap-2 [&>*]:rounded-pill",
23208
+ "popover-trigger": "[&>*:not(:first-child)]:hidden",
23209
+ "inline-column-header": "hidden"
23210
+ };
23087
23211
  exports.FilterGroup = ({
23088
23212
  entity,
23089
23213
  filters,
@@ -23093,7 +23217,8 @@ var init_FilterGroup = __esm({
23093
23217
  variant = "default",
23094
23218
  showIcon = true,
23095
23219
  query,
23096
- isLoading
23220
+ isLoading,
23221
+ look = "toolbar"
23097
23222
  }) => {
23098
23223
  const eventBus = useEventBus();
23099
23224
  const queryState = useQuerySingleton(query);
@@ -23148,63 +23273,71 @@ var init_FilterGroup = __esm({
23148
23273
  }, [onClearAll, queryState, eventBus, entity, query]);
23149
23274
  const activeFilterCount = Object.keys(selectedValues).length;
23150
23275
  if (variant === "pills") {
23151
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
23152
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
23153
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
23154
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
23155
- filter.label,
23156
- ":"
23157
- ] }),
23158
- /* @__PURE__ */ jsxRuntime.jsxs(
23159
- exports.HStack,
23160
- {
23161
- gap: "none",
23162
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
23163
- children: [
23164
- /* @__PURE__ */ jsxRuntime.jsx(
23165
- "button",
23166
- {
23167
- type: "button",
23168
- onClick: () => handleFilterSelect(filter.field, null),
23169
- className: cn(
23170
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
23171
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
23172
- ),
23173
- children: "All"
23174
- }
23175
- ),
23176
- filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
23177
- "button",
23178
- {
23179
- type: "button",
23180
- onClick: () => handleFilterSelect(filter.field, option),
23181
- className: cn(
23182
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
23183
- "border-l-[length:var(--border-width)] border-border",
23184
- selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
23276
+ return /* @__PURE__ */ jsxRuntime.jsxs(
23277
+ exports.HStack,
23278
+ {
23279
+ gap: "md",
23280
+ align: "center",
23281
+ className: cn("flex-wrap", lookStyles5[look], className),
23282
+ children: [
23283
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
23284
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
23285
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
23286
+ filter.label,
23287
+ ":"
23288
+ ] }),
23289
+ /* @__PURE__ */ jsxRuntime.jsxs(
23290
+ exports.HStack,
23291
+ {
23292
+ gap: "none",
23293
+ className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
23294
+ children: [
23295
+ /* @__PURE__ */ jsxRuntime.jsx(
23296
+ "button",
23297
+ {
23298
+ type: "button",
23299
+ onClick: () => handleFilterSelect(filter.field, null),
23300
+ className: cn(
23301
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
23302
+ !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
23303
+ ),
23304
+ children: "All"
23305
+ }
23185
23306
  ),
23186
- children: option
23187
- },
23188
- option
23189
- ))
23190
- ]
23191
- }
23192
- )
23193
- ] }, filter.field)),
23194
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
23195
- exports.Button,
23196
- {
23197
- variant: "ghost",
23198
- size: "sm",
23199
- onClick: handleClearAll,
23200
- leftIcon: /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "h-3.5 w-3.5" }),
23201
- children: "Clear"
23202
- }
23203
- )
23204
- ] });
23307
+ filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
23308
+ "button",
23309
+ {
23310
+ type: "button",
23311
+ onClick: () => handleFilterSelect(filter.field, option),
23312
+ className: cn(
23313
+ "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
23314
+ "border-l-[length:var(--border-width)] border-border",
23315
+ selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
23316
+ ),
23317
+ children: option
23318
+ },
23319
+ option
23320
+ ))
23321
+ ]
23322
+ }
23323
+ )
23324
+ ] }, filter.field)),
23325
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
23326
+ exports.Button,
23327
+ {
23328
+ variant: "ghost",
23329
+ size: "sm",
23330
+ onClick: handleClearAll,
23331
+ leftIcon: /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "h-3.5 w-3.5" }),
23332
+ children: "Clear"
23333
+ }
23334
+ )
23335
+ ]
23336
+ }
23337
+ );
23205
23338
  }
23206
23339
  if (variant === "vertical") {
23207
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", className), children: [
23340
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4", lookStyles5[look], className), children: [
23208
23341
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
23209
23342
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4" }),
23210
23343
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -23287,92 +23420,100 @@ var init_FilterGroup = __esm({
23287
23420
  ] });
23288
23421
  }
23289
23422
  if (variant === "compact") {
23290
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
23291
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
23292
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
23293
- exports.Input,
23294
- {
23295
- type: "date",
23296
- value: selectedValues[filter.field] || "",
23297
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
23298
- clearable: true,
23299
- onClear: () => handleFilterSelect(filter.field, null),
23300
- className: "text-sm"
23301
- }
23302
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
23303
- /* @__PURE__ */ jsxRuntime.jsx(
23304
- exports.Input,
23305
- {
23306
- type: "date",
23307
- value: selectedValues[`${filter.field}_from`] || "",
23308
- onChange: (e) => handleFilterSelect(
23309
- `${filter.field}_from`,
23310
- e.target.value || null
23311
- ),
23312
- className: "text-sm min-w-[100px]"
23313
- }
23314
- ),
23315
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
23316
- /* @__PURE__ */ jsxRuntime.jsx(
23317
- exports.Input,
23318
- {
23319
- type: "date",
23320
- value: selectedValues[`${filter.field}_to`] || "",
23321
- onChange: (e) => handleFilterSelect(
23322
- `${filter.field}_to`,
23323
- e.target.value || null
23423
+ return /* @__PURE__ */ jsxRuntime.jsxs(
23424
+ exports.HStack,
23425
+ {
23426
+ gap: "sm",
23427
+ align: "center",
23428
+ className: cn("flex-wrap", lookStyles5[look], className),
23429
+ children: [
23430
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
23431
+ filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
23432
+ exports.Input,
23433
+ {
23434
+ type: "date",
23435
+ value: selectedValues[filter.field] || "",
23436
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
23437
+ clearable: true,
23438
+ onClear: () => handleFilterSelect(filter.field, null),
23439
+ className: "text-sm"
23440
+ }
23441
+ ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
23442
+ /* @__PURE__ */ jsxRuntime.jsx(
23443
+ exports.Input,
23444
+ {
23445
+ type: "date",
23446
+ value: selectedValues[`${filter.field}_from`] || "",
23447
+ onChange: (e) => handleFilterSelect(
23448
+ `${filter.field}_from`,
23449
+ e.target.value || null
23450
+ ),
23451
+ className: "text-sm min-w-[100px]"
23452
+ }
23324
23453
  ),
23325
- className: "text-sm min-w-[100px]"
23326
- }
23327
- )
23328
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
23329
- exports.Input,
23330
- {
23331
- value: selectedValues[filter.field] || "",
23332
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
23333
- placeholder: filter.label,
23334
- clearable: true,
23335
- onClear: () => handleFilterSelect(filter.field, null),
23336
- className: "text-sm"
23337
- }
23338
- ) : /* @__PURE__ */ jsxRuntime.jsx(
23339
- exports.Select,
23340
- {
23341
- value: selectedValues[filter.field] || "all",
23342
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23343
- options: [
23344
- { value: "all", label: `All ${filter.label}` },
23345
- ...filter.options?.map((opt) => ({
23346
- value: opt,
23347
- label: opt
23348
- })) || []
23349
- ],
23350
- className: "text-sm"
23351
- }
23352
- ) }, filter.field)),
23353
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
23354
- Object.entries(selectedValues).map(([field, value]) => {
23355
- const filterDef = filters.find((f3) => f3.field === field);
23356
- return /* @__PURE__ */ jsxRuntime.jsxs(
23357
- exports.Badge,
23454
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
23455
+ /* @__PURE__ */ jsxRuntime.jsx(
23456
+ exports.Input,
23457
+ {
23458
+ type: "date",
23459
+ value: selectedValues[`${filter.field}_to`] || "",
23460
+ onChange: (e) => handleFilterSelect(
23461
+ `${filter.field}_to`,
23462
+ e.target.value || null
23463
+ ),
23464
+ className: "text-sm min-w-[100px]"
23465
+ }
23466
+ )
23467
+ ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
23468
+ exports.Input,
23358
23469
  {
23359
- variant: "primary",
23360
- size: "md",
23361
- className: "cursor-pointer",
23362
- onClick: () => handleFilterSelect(field, null),
23363
- children: [
23364
- filterDef?.label,
23365
- ": ",
23366
- value,
23367
- /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "ml-1 h-3 w-3" })
23368
- ]
23369
- },
23370
- field
23371
- );
23372
- }),
23373
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
23374
- ] })
23375
- ] });
23470
+ value: selectedValues[filter.field] || "",
23471
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
23472
+ placeholder: filter.label,
23473
+ clearable: true,
23474
+ onClear: () => handleFilterSelect(filter.field, null),
23475
+ className: "text-sm"
23476
+ }
23477
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
23478
+ exports.Select,
23479
+ {
23480
+ value: selectedValues[filter.field] || "all",
23481
+ onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23482
+ options: [
23483
+ { value: "all", label: `All ${filter.label}` },
23484
+ ...filter.options?.map((opt) => ({
23485
+ value: opt,
23486
+ label: opt
23487
+ })) || []
23488
+ ],
23489
+ className: "text-sm"
23490
+ }
23491
+ ) }, filter.field)),
23492
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
23493
+ Object.entries(selectedValues).map(([field, value]) => {
23494
+ const filterDef = filters.find((f3) => f3.field === field);
23495
+ return /* @__PURE__ */ jsxRuntime.jsxs(
23496
+ exports.Badge,
23497
+ {
23498
+ variant: "primary",
23499
+ size: "md",
23500
+ className: "cursor-pointer",
23501
+ onClick: () => handleFilterSelect(field, null),
23502
+ children: [
23503
+ filterDef?.label,
23504
+ ": ",
23505
+ value,
23506
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "ml-1 h-3 w-3" })
23507
+ ]
23508
+ },
23509
+ field
23510
+ );
23511
+ }),
23512
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
23513
+ ] })
23514
+ ]
23515
+ }
23516
+ );
23376
23517
  }
23377
23518
  return /* @__PURE__ */ jsxRuntime.jsx(
23378
23519
  "div",
@@ -23381,6 +23522,7 @@ var init_FilterGroup = __esm({
23381
23522
  "p-4 rounded-container",
23382
23523
  "bg-card",
23383
23524
  "border-[length:var(--border-width)] border-border",
23525
+ lookStyles5[look],
23384
23526
  className
23385
23527
  ),
23386
23528
  children: /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -28138,7 +28280,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
28138
28280
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
28139
28281
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
28140
28282
  }
28141
- var variantColor; exports.StatDisplay = void 0;
28283
+ var lookStyles6, variantColor; exports.StatDisplay = void 0;
28142
28284
  var init_StatDisplay = __esm({
28143
28285
  "components/molecules/StatDisplay.tsx"() {
28144
28286
  "use client";
@@ -28150,6 +28292,13 @@ var init_StatDisplay = __esm({
28150
28292
  init_Sparkline();
28151
28293
  init_Icon();
28152
28294
  init_useEventBus();
28295
+ lookStyles6 = {
28296
+ elevated: "",
28297
+ flat: "shadow-none border-[length:var(--border-width)] border-border",
28298
+ "progress-backed": "",
28299
+ gauge: "",
28300
+ sparkline: ""
28301
+ };
28153
28302
  variantColor = {
28154
28303
  default: "text-foreground",
28155
28304
  primary: "text-primary",
@@ -28177,6 +28326,7 @@ var init_StatDisplay = __esm({
28177
28326
  size = "md",
28178
28327
  variant = "default",
28179
28328
  compact = false,
28329
+ look = "elevated",
28180
28330
  className,
28181
28331
  isLoading = false,
28182
28332
  error = null
@@ -28229,7 +28379,7 @@ var init_StatDisplay = __esm({
28229
28379
  return /* @__PURE__ */ jsxRuntime.jsx(
28230
28380
  exports.Card,
28231
28381
  {
28232
- className: cn(padSizes[size], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
28382
+ className: cn(padSizes[size], lookStyles6[look], clickEvent && "cursor-pointer hover:shadow-md transition-shadow", className),
28233
28383
  onClick: clickEvent ? handleClick : void 0,
28234
28384
  children: /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { align: "start", justify: "between", children: [
28235
28385
  /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -33912,7 +34062,8 @@ function DataTable({
33912
34062
  bulkActions,
33913
34063
  headerActions,
33914
34064
  showTotal = true,
33915
- className
34065
+ className,
34066
+ look = "dense"
33916
34067
  }) {
33917
34068
  const [openActionMenu, setOpenActionMenu] = React80.useState(
33918
34069
  null
@@ -34039,6 +34190,7 @@ function DataTable({
34039
34190
  {
34040
34191
  className: cn(
34041
34192
  "bg-card border-2 border-border rounded-none overflow-hidden",
34193
+ lookStyles7[look],
34042
34194
  className
34043
34195
  ),
34044
34196
  children: [
@@ -34265,6 +34417,7 @@ function DataTable({
34265
34417
  }
34266
34418
  );
34267
34419
  }
34420
+ var lookStyles7;
34268
34421
  var init_DataTable = __esm({
34269
34422
  "components/organisms/DataTable.tsx"() {
34270
34423
  "use client";
@@ -34278,6 +34431,13 @@ var init_DataTable = __esm({
34278
34431
  init_useEventBus();
34279
34432
  init_useTranslate();
34280
34433
  init_types3();
34434
+ lookStyles7 = {
34435
+ dense: "",
34436
+ spacious: "[&_tbody_tr_td]:py-5 [&_thead_tr_th]:py-4",
34437
+ striped: "[&_tbody_tr:nth-child(odd)]:bg-muted/30",
34438
+ borderless: "border-0 [&_thead]:border-b-0 [&_tbody_tr]:border-b-0 [&_tbody]:divide-y-0",
34439
+ "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"
34440
+ };
34281
34441
  DataTable.displayName = "DataTable";
34282
34442
  }
34283
34443
  });
@@ -37531,7 +37691,7 @@ var init_GraphCanvas = __esm({
37531
37691
  exports.GraphCanvas.displayName = "GraphCanvas";
37532
37692
  }
37533
37693
  });
37534
- exports.Header = void 0;
37694
+ var lookStyles8; exports.Header = void 0;
37535
37695
  var init_Header = __esm({
37536
37696
  "components/organisms/Header.tsx"() {
37537
37697
  "use client";
@@ -37544,6 +37704,13 @@ var init_Header = __esm({
37544
37704
  init_Typography();
37545
37705
  init_cn();
37546
37706
  init_useTranslate();
37707
+ lookStyles8 = {
37708
+ "compact-bar": "",
37709
+ hero: "py-section min-h-[200px] [&_h1]:text-display-1",
37710
+ breadcrumb: "py-2 text-sm [&_h1]:text-base [&_h1]:font-medium",
37711
+ contextual: "py-3 [&_h1]:text-lg",
37712
+ "editorial-banner": "py-12 [&_h1]:text-display-2 [&_h1]:font-display-bold border-b border-border"
37713
+ };
37547
37714
  exports.Header = ({
37548
37715
  logo,
37549
37716
  logoSrc,
@@ -37561,6 +37728,7 @@ var init_Header = __esm({
37561
37728
  actions,
37562
37729
  sticky = true,
37563
37730
  variant = "mobile",
37731
+ look = "compact-bar",
37564
37732
  onLogoClick,
37565
37733
  className
37566
37734
  }) => {
@@ -37576,6 +37744,7 @@ var init_Header = __esm({
37576
37744
  "flex items-center px-4 justify-between bg-card",
37577
37745
  sticky && "sticky top-0 z-50",
37578
37746
  variant === "mobile" && "lg:hidden",
37747
+ lookStyles8[look],
37579
37748
  className
37580
37749
  ),
37581
37750
  children: [
@@ -44572,7 +44741,7 @@ var init_TeamOrganism = __esm({
44572
44741
  exports.TeamOrganism.displayName = "TeamOrganism";
44573
44742
  }
44574
44743
  });
44575
- var STATUS_STYLES3; exports.Timeline = void 0;
44744
+ var lookStyles9, STATUS_STYLES3; exports.Timeline = void 0;
44576
44745
  var init_Timeline = __esm({
44577
44746
  "components/organisms/Timeline.tsx"() {
44578
44747
  "use client";
@@ -44583,6 +44752,12 @@ var init_Timeline = __esm({
44583
44752
  init_ErrorState();
44584
44753
  init_EmptyState();
44585
44754
  init_useTranslate();
44755
+ lookStyles9 = {
44756
+ "vertical-compact": "gap-1 [&>*]:py-1",
44757
+ "vertical-spacious": "",
44758
+ horizontal: "flex-row [&>*]:flex-row [&>*]:items-center",
44759
+ swimlane: "flex-row gap-6 [&>*]:flex-row [&>*]:items-center"
44760
+ };
44586
44761
  STATUS_STYLES3 = {
44587
44762
  complete: {
44588
44763
  dotColor: "text-success",
@@ -44613,7 +44788,8 @@ var init_Timeline = __esm({
44613
44788
  entity,
44614
44789
  isLoading = false,
44615
44790
  error,
44616
- className
44791
+ className,
44792
+ look = "vertical-spacious"
44617
44793
  }) => {
44618
44794
  const { t } = useTranslate();
44619
44795
  const entityData = Array.isArray(entity) ? entity : [];
@@ -44669,7 +44845,7 @@ var init_Timeline = __esm({
44669
44845
  }
44670
44846
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "md", children: [
44671
44847
  title && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h5", weight: "semibold", children: title }),
44672
- /* @__PURE__ */ jsxRuntime.jsx(exports.VStack, { gap: "none", className: "relative", children: items.map((item, idx) => {
44848
+ /* @__PURE__ */ jsxRuntime.jsx(exports.VStack, { gap: "none", className: cn("relative", lookStyles9[look]), children: items.map((item, idx) => {
44673
44849
  const status = item.status || "pending";
44674
44850
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
44675
44851
  const ItemIcon = item.icon || style.icon;