@almadar/ui 5.4.0 → 5.5.1

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.
@@ -6223,7 +6223,7 @@ var init_EntitySchemaContext = __esm({
6223
6223
  EntitySchemaContext = React80.createContext(null);
6224
6224
  }
6225
6225
  });
6226
- var sizeClasses5, minWidthClasses; exports.Modal = void 0;
6226
+ var sizeClasses5, minWidthClasses, lookStyles2; exports.Modal = void 0;
6227
6227
  var init_Modal = __esm({
6228
6228
  "components/molecules/Modal.tsx"() {
6229
6229
  "use client";
@@ -6248,6 +6248,12 @@ var init_Modal = __esm({
6248
6248
  xl: "min-w-[700px] max-sm:min-w-0",
6249
6249
  full: "min-w-0"
6250
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
+ };
6251
6257
  exports.Modal = ({
6252
6258
  isOpen = true,
6253
6259
  onClose = () => {
@@ -6261,7 +6267,8 @@ var init_Modal = __esm({
6261
6267
  closeOnEscape = true,
6262
6268
  className,
6263
6269
  closeEvent,
6264
- swipeDownToClose = true
6270
+ swipeDownToClose = true,
6271
+ look = "centered-card"
6265
6272
  }) => {
6266
6273
  const eventBus = useEventBus();
6267
6274
  const modalRef = React80.useRef(null);
@@ -6346,6 +6353,7 @@ var init_Modal = __esm({
6346
6353
  // Mobile: take the entire screen. Override desktop max-w cap,
6347
6354
  // full height, no rounded corners, no min-width.
6348
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],
6349
6357
  className
6350
6358
  ),
6351
6359
  style: dragY > 0 ? {
@@ -14867,7 +14875,7 @@ var init_BookTableOfContents = __esm({
14867
14875
  exports.BookTableOfContents.displayName = "BookTableOfContents";
14868
14876
  }
14869
14877
  });
14870
- var ICON_NAME_ALIASES; exports.EmptyState = void 0;
14878
+ var ICON_NAME_ALIASES, lookStyles3; exports.EmptyState = void 0;
14871
14879
  var init_EmptyState = __esm({
14872
14880
  "components/molecules/EmptyState.tsx"() {
14873
14881
  "use client";
@@ -14884,6 +14892,12 @@ var init_EmptyState = __esm({
14884
14892
  error: "x-circle",
14885
14893
  warning: "alert-circle"
14886
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
+ };
14887
14901
  exports.EmptyState = ({
14888
14902
  icon,
14889
14903
  title,
@@ -14894,7 +14908,8 @@ var init_EmptyState = __esm({
14894
14908
  className,
14895
14909
  destructive,
14896
14910
  variant,
14897
- actionEvent
14911
+ actionEvent,
14912
+ look = "icon-only"
14898
14913
  }) => {
14899
14914
  const eventBus = useEventBus();
14900
14915
  const { t } = useTranslate();
@@ -14914,6 +14929,7 @@ var init_EmptyState = __esm({
14914
14929
  align: "center",
14915
14930
  className: cn(
14916
14931
  "justify-center py-12 text-center",
14932
+ lookStyles3[look],
14917
14933
  className
14918
14934
  ),
14919
14935
  children: [
@@ -16154,7 +16170,7 @@ function useSafeEventBus2() {
16154
16170
  } };
16155
16171
  }
16156
16172
  }
16157
- var log6; exports.ButtonGroup = void 0;
16173
+ var log6, lookStyles4; exports.ButtonGroup = void 0;
16158
16174
  var init_ButtonGroup = __esm({
16159
16175
  "components/molecules/ButtonGroup.tsx"() {
16160
16176
  "use client";
@@ -16162,6 +16178,13 @@ var init_ButtonGroup = __esm({
16162
16178
  init_atoms();
16163
16179
  init_useEventBus();
16164
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
+ };
16165
16188
  exports.ButtonGroup = ({
16166
16189
  children,
16167
16190
  primary,
@@ -16171,7 +16194,8 @@ var init_ButtonGroup = __esm({
16171
16194
  className,
16172
16195
  // Filter-group pattern props (entity and filters are used for schema-driven filtering)
16173
16196
  entity: _entity,
16174
- filters
16197
+ filters,
16198
+ look = "right-aligned-buttons"
16175
16199
  }) => {
16176
16200
  const eventBus = useSafeEventBus2();
16177
16201
  const variantClasses2 = {
@@ -16248,6 +16272,7 @@ var init_ButtonGroup = __esm({
16248
16272
  "inline-flex gap-2",
16249
16273
  variantClasses2[variant],
16250
16274
  orientationClasses[orientation],
16275
+ lookStyles4[look],
16251
16276
  className
16252
16277
  ),
16253
16278
  role: "group",
@@ -18779,7 +18804,7 @@ var init_CastleTemplate = __esm({
18779
18804
  CastleTemplate.displayName = "CastleTemplate";
18780
18805
  }
18781
18806
  });
18782
- 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;
18783
18808
  var init_Chart = __esm({
18784
18809
  "components/organisms/Chart.tsx"() {
18785
18810
  "use client";
@@ -18809,7 +18834,7 @@ var init_Chart = __esm({
18809
18834
  if (Number.isNaN(parsed.getTime())) return raw;
18810
18835
  return monthFormatter.format(parsed);
18811
18836
  };
18812
- BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, onPointClick }) => {
18837
+ BarChart = ({ series, height, showValues, stack, timeAxis, histogram = false, horizontal = false, onPointClick }) => {
18813
18838
  const categories = React80.useMemo(() => {
18814
18839
  const set = [];
18815
18840
  const seen = /* @__PURE__ */ new Set();
@@ -18847,6 +18872,64 @@ var init_Chart = __esm({
18847
18872
  }
18848
18873
  return m;
18849
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
+ }
18850
18933
  return /* @__PURE__ */ jsxRuntime.jsx(
18851
18934
  exports.HStack,
18852
18935
  {
@@ -19274,10 +19357,20 @@ var init_Chart = __esm({
19274
19357
  }
19275
19358
  );
19276
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
+ };
19277
19369
  exports.Chart = ({
19278
19370
  title,
19279
19371
  subtitle,
19280
- chartType = "bar",
19372
+ chartType,
19373
+ look,
19281
19374
  series,
19282
19375
  data: simpleData,
19283
19376
  scatterData,
@@ -19293,6 +19386,7 @@ var init_Chart = __esm({
19293
19386
  error,
19294
19387
  className
19295
19388
  }) => {
19389
+ const resolvedLook = look ?? (chartType ? LOOK_FROM_CHART_TYPE[chartType] : "bar-vertical");
19296
19390
  const eventBus = useEventBus();
19297
19391
  const { t } = useTranslate();
19298
19392
  const handleAction = React80.useCallback(
@@ -19321,7 +19415,7 @@ var init_Chart = __esm({
19321
19415
  return [];
19322
19416
  }, [simpleData, series]);
19323
19417
  const firstSeriesData = normalizedSeries[0]?.data ?? [];
19324
- 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);
19325
19419
  if (isLoading) {
19326
19420
  return /* @__PURE__ */ jsxRuntime.jsx(exports.LoadingState, { message: "Loading chart...", className });
19327
19421
  }
@@ -19356,7 +19450,7 @@ var init_Chart = __esm({
19356
19450
  )) })
19357
19451
  ] }),
19358
19452
  /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "w-full", children: [
19359
- chartType === "bar" && /* @__PURE__ */ jsxRuntime.jsx(
19453
+ resolvedLook === "bar-vertical" && /* @__PURE__ */ jsxRuntime.jsx(
19360
19454
  BarChart,
19361
19455
  {
19362
19456
  series: normalizedSeries,
@@ -19367,7 +19461,19 @@ var init_Chart = __esm({
19367
19461
  onPointClick: handlePointClick
19368
19462
  }
19369
19463
  ),
19370
- 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(
19371
19477
  BarChart,
19372
19478
  {
19373
19479
  series: normalizedSeries,
@@ -19379,7 +19485,7 @@ var init_Chart = __esm({
19379
19485
  onPointClick: handlePointClick
19380
19486
  }
19381
19487
  ),
19382
- chartType === "line" && /* @__PURE__ */ jsxRuntime.jsx(
19488
+ resolvedLook === "line" && /* @__PURE__ */ jsxRuntime.jsx(
19383
19489
  LineChart,
19384
19490
  {
19385
19491
  series: normalizedSeries,
@@ -19389,7 +19495,7 @@ var init_Chart = __esm({
19389
19495
  onPointClick: handlePointClick
19390
19496
  }
19391
19497
  ),
19392
- chartType === "area" && /* @__PURE__ */ jsxRuntime.jsx(
19498
+ resolvedLook === "area" && /* @__PURE__ */ jsxRuntime.jsx(
19393
19499
  LineChart,
19394
19500
  {
19395
19501
  series: normalizedSeries,
@@ -19400,7 +19506,7 @@ var init_Chart = __esm({
19400
19506
  onPointClick: handlePointClick
19401
19507
  }
19402
19508
  ),
19403
- chartType === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
19509
+ resolvedLook === "pie" && /* @__PURE__ */ jsxRuntime.jsx(
19404
19510
  PieChart,
19405
19511
  {
19406
19512
  data: firstSeriesData,
@@ -19409,7 +19515,7 @@ var init_Chart = __esm({
19409
19515
  onPointClick: handlePointClick
19410
19516
  }
19411
19517
  ),
19412
- chartType === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
19518
+ resolvedLook === "donut" && /* @__PURE__ */ jsxRuntime.jsx(
19413
19519
  PieChart,
19414
19520
  {
19415
19521
  data: firstSeriesData,
@@ -19419,7 +19525,7 @@ var init_Chart = __esm({
19419
19525
  onPointClick: handlePointClick
19420
19526
  }
19421
19527
  ),
19422
- chartType === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
19528
+ resolvedLook === "scatter" && /* @__PURE__ */ jsxRuntime.jsx(
19423
19529
  ScatterChart,
19424
19530
  {
19425
19531
  data: scatterData ?? [],
@@ -23081,7 +23187,7 @@ var init_useQuerySingleton = __esm({
23081
23187
  queryStores = /* @__PURE__ */ new Map();
23082
23188
  }
23083
23189
  });
23084
- var resolveFilterType; exports.FilterGroup = void 0;
23190
+ var resolveFilterType, lookStyles5; exports.FilterGroup = void 0;
23085
23191
  var init_FilterGroup = __esm({
23086
23192
  "components/molecules/FilterGroup.tsx"() {
23087
23193
  "use client";
@@ -23095,6 +23201,13 @@ var init_FilterGroup = __esm({
23095
23201
  init_useEventBus();
23096
23202
  init_useQuerySingleton();
23097
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
+ };
23098
23211
  exports.FilterGroup = ({
23099
23212
  entity,
23100
23213
  filters,
@@ -23104,7 +23217,8 @@ var init_FilterGroup = __esm({
23104
23217
  variant = "default",
23105
23218
  showIcon = true,
23106
23219
  query,
23107
- isLoading
23220
+ isLoading,
23221
+ look = "toolbar"
23108
23222
  }) => {
23109
23223
  const eventBus = useEventBus();
23110
23224
  const queryState = useQuerySingleton(query);
@@ -23159,63 +23273,71 @@ var init_FilterGroup = __esm({
23159
23273
  }, [onClearAll, queryState, eventBus, entity, query]);
23160
23274
  const activeFilterCount = Object.keys(selectedValues).length;
23161
23275
  if (variant === "pills") {
23162
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "md", align: "center", className: cn("flex-wrap", className), children: [
23163
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
23164
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
23165
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [
23166
- filter.label,
23167
- ":"
23168
- ] }),
23169
- /* @__PURE__ */ jsxRuntime.jsxs(
23170
- exports.HStack,
23171
- {
23172
- gap: "none",
23173
- className: "rounded-sm overflow-hidden border-[length:var(--border-width)] border-border",
23174
- children: [
23175
- /* @__PURE__ */ jsxRuntime.jsx(
23176
- "button",
23177
- {
23178
- type: "button",
23179
- onClick: () => handleFilterSelect(filter.field, null),
23180
- className: cn(
23181
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
23182
- !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
23183
- ),
23184
- children: "All"
23185
- }
23186
- ),
23187
- filter.options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
23188
- "button",
23189
- {
23190
- type: "button",
23191
- onClick: () => handleFilterSelect(filter.field, option),
23192
- className: cn(
23193
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
23194
- "border-l-[length:var(--border-width)] border-border",
23195
- 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
+ }
23196
23306
  ),
23197
- children: option
23198
- },
23199
- option
23200
- ))
23201
- ]
23202
- }
23203
- )
23204
- ] }, filter.field)),
23205
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
23206
- exports.Button,
23207
- {
23208
- variant: "ghost",
23209
- size: "sm",
23210
- onClick: handleClearAll,
23211
- leftIcon: /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "h-3.5 w-3.5" }),
23212
- children: "Clear"
23213
- }
23214
- )
23215
- ] });
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
+ );
23216
23338
  }
23217
23339
  if (variant === "vertical") {
23218
- 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: [
23219
23341
  showIcon && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
23220
23342
  /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4" }),
23221
23343
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: "Filters" })
@@ -23298,92 +23420,100 @@ var init_FilterGroup = __esm({
23298
23420
  ] });
23299
23421
  }
23300
23422
  if (variant === "compact") {
23301
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", align: "center", className: cn("flex-wrap", className), children: [
23302
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "filter", className: "h-4 w-4 text-muted-foreground" }),
23303
- filters.map((filter) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-[120px]", children: resolveFilterType(filter) === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
23304
- exports.Input,
23305
- {
23306
- type: "date",
23307
- value: selectedValues[filter.field] || "",
23308
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
23309
- clearable: true,
23310
- onClear: () => handleFilterSelect(filter.field, null),
23311
- className: "text-sm"
23312
- }
23313
- ) : resolveFilterType(filter) === "daterange" || resolveFilterType(filter) === "date-range" ? /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
23314
- /* @__PURE__ */ jsxRuntime.jsx(
23315
- exports.Input,
23316
- {
23317
- type: "date",
23318
- value: selectedValues[`${filter.field}_from`] || "",
23319
- onChange: (e) => handleFilterSelect(
23320
- `${filter.field}_from`,
23321
- e.target.value || null
23322
- ),
23323
- className: "text-sm min-w-[100px]"
23324
- }
23325
- ),
23326
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
23327
- /* @__PURE__ */ jsxRuntime.jsx(
23328
- exports.Input,
23329
- {
23330
- type: "date",
23331
- value: selectedValues[`${filter.field}_to`] || "",
23332
- onChange: (e) => handleFilterSelect(
23333
- `${filter.field}_to`,
23334
- 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
+ }
23335
23453
  ),
23336
- className: "text-sm min-w-[100px]"
23337
- }
23338
- )
23339
- ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
23340
- exports.Input,
23341
- {
23342
- value: selectedValues[filter.field] || "",
23343
- onChange: (e) => handleFilterSelect(filter.field, e.target.value || null),
23344
- placeholder: filter.label,
23345
- clearable: true,
23346
- onClear: () => handleFilterSelect(filter.field, null),
23347
- className: "text-sm"
23348
- }
23349
- ) : /* @__PURE__ */ jsxRuntime.jsx(
23350
- exports.Select,
23351
- {
23352
- value: selectedValues[filter.field] || "all",
23353
- onChange: (e) => handleFilterSelect(filter.field, e.target.value),
23354
- options: [
23355
- { value: "all", label: `All ${filter.label}` },
23356
- ...filter.options?.map((opt) => ({
23357
- value: opt,
23358
- label: opt
23359
- })) || []
23360
- ],
23361
- className: "text-sm"
23362
- }
23363
- ) }, filter.field)),
23364
- activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
23365
- Object.entries(selectedValues).map(([field, value]) => {
23366
- const filterDef = filters.find((f3) => f3.field === field);
23367
- return /* @__PURE__ */ jsxRuntime.jsxs(
23368
- 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,
23369
23469
  {
23370
- variant: "primary",
23371
- size: "md",
23372
- className: "cursor-pointer",
23373
- onClick: () => handleFilterSelect(field, null),
23374
- children: [
23375
- filterDef?.label,
23376
- ": ",
23377
- value,
23378
- /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: "x", className: "ml-1 h-3 w-3" })
23379
- ]
23380
- },
23381
- field
23382
- );
23383
- }),
23384
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", onClick: handleClearAll, children: "Clear all" })
23385
- ] })
23386
- ] });
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
+ );
23387
23517
  }
23388
23518
  return /* @__PURE__ */ jsxRuntime.jsx(
23389
23519
  "div",
@@ -23392,6 +23522,7 @@ var init_FilterGroup = __esm({
23392
23522
  "p-4 rounded-container",
23393
23523
  "bg-card",
23394
23524
  "border-[length:var(--border-width)] border-border",
23525
+ lookStyles5[look],
23395
23526
  className
23396
23527
  ),
23397
23528
  children: /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "md", align: "center", className: "flex-wrap", children: [
@@ -28149,7 +28280,7 @@ function composeDisplayValue(value, format, max, prefix, suffix) {
28149
28280
  const withMax = max != null && max > 0 ? `${formatted} / ${max}` : formatted;
28150
28281
  return `${prefix ?? ""}${withMax}${suffix ?? ""}`;
28151
28282
  }
28152
- var variantColor; exports.StatDisplay = void 0;
28283
+ var lookStyles6, variantColor; exports.StatDisplay = void 0;
28153
28284
  var init_StatDisplay = __esm({
28154
28285
  "components/molecules/StatDisplay.tsx"() {
28155
28286
  "use client";
@@ -28161,6 +28292,13 @@ var init_StatDisplay = __esm({
28161
28292
  init_Sparkline();
28162
28293
  init_Icon();
28163
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
+ };
28164
28302
  variantColor = {
28165
28303
  default: "text-foreground",
28166
28304
  primary: "text-primary",
@@ -28188,6 +28326,7 @@ var init_StatDisplay = __esm({
28188
28326
  size = "md",
28189
28327
  variant = "default",
28190
28328
  compact = false,
28329
+ look = "elevated",
28191
28330
  className,
28192
28331
  isLoading = false,
28193
28332
  error = null
@@ -28240,7 +28379,7 @@ var init_StatDisplay = __esm({
28240
28379
  return /* @__PURE__ */ jsxRuntime.jsx(
28241
28380
  exports.Card,
28242
28381
  {
28243
- 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),
28244
28383
  onClick: clickEvent ? handleClick : void 0,
28245
28384
  children: /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { align: "start", justify: "between", children: [
28246
28385
  /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "none", className: "space-y-1 flex-1", children: [
@@ -33923,7 +34062,8 @@ function DataTable({
33923
34062
  bulkActions,
33924
34063
  headerActions,
33925
34064
  showTotal = true,
33926
- className
34065
+ className,
34066
+ look = "dense"
33927
34067
  }) {
33928
34068
  const [openActionMenu, setOpenActionMenu] = React80.useState(
33929
34069
  null
@@ -34050,6 +34190,7 @@ function DataTable({
34050
34190
  {
34051
34191
  className: cn(
34052
34192
  "bg-card border-2 border-border rounded-none overflow-hidden",
34193
+ lookStyles7[look],
34053
34194
  className
34054
34195
  ),
34055
34196
  children: [
@@ -34276,6 +34417,7 @@ function DataTable({
34276
34417
  }
34277
34418
  );
34278
34419
  }
34420
+ var lookStyles7;
34279
34421
  var init_DataTable = __esm({
34280
34422
  "components/organisms/DataTable.tsx"() {
34281
34423
  "use client";
@@ -34289,6 +34431,13 @@ var init_DataTable = __esm({
34289
34431
  init_useEventBus();
34290
34432
  init_useTranslate();
34291
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
+ };
34292
34441
  DataTable.displayName = "DataTable";
34293
34442
  }
34294
34443
  });
@@ -37542,7 +37691,7 @@ var init_GraphCanvas = __esm({
37542
37691
  exports.GraphCanvas.displayName = "GraphCanvas";
37543
37692
  }
37544
37693
  });
37545
- exports.Header = void 0;
37694
+ var lookStyles8; exports.Header = void 0;
37546
37695
  var init_Header = __esm({
37547
37696
  "components/organisms/Header.tsx"() {
37548
37697
  "use client";
@@ -37555,6 +37704,13 @@ var init_Header = __esm({
37555
37704
  init_Typography();
37556
37705
  init_cn();
37557
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
+ };
37558
37714
  exports.Header = ({
37559
37715
  logo,
37560
37716
  logoSrc,
@@ -37572,6 +37728,7 @@ var init_Header = __esm({
37572
37728
  actions,
37573
37729
  sticky = true,
37574
37730
  variant = "mobile",
37731
+ look = "compact-bar",
37575
37732
  onLogoClick,
37576
37733
  className
37577
37734
  }) => {
@@ -37587,6 +37744,7 @@ var init_Header = __esm({
37587
37744
  "flex items-center px-4 justify-between bg-card",
37588
37745
  sticky && "sticky top-0 z-50",
37589
37746
  variant === "mobile" && "lg:hidden",
37747
+ lookStyles8[look],
37590
37748
  className
37591
37749
  ),
37592
37750
  children: [
@@ -44583,7 +44741,7 @@ var init_TeamOrganism = __esm({
44583
44741
  exports.TeamOrganism.displayName = "TeamOrganism";
44584
44742
  }
44585
44743
  });
44586
- var STATUS_STYLES3; exports.Timeline = void 0;
44744
+ var lookStyles9, STATUS_STYLES3; exports.Timeline = void 0;
44587
44745
  var init_Timeline = __esm({
44588
44746
  "components/organisms/Timeline.tsx"() {
44589
44747
  "use client";
@@ -44594,6 +44752,12 @@ var init_Timeline = __esm({
44594
44752
  init_ErrorState();
44595
44753
  init_EmptyState();
44596
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
+ };
44597
44761
  STATUS_STYLES3 = {
44598
44762
  complete: {
44599
44763
  dotColor: "text-success",
@@ -44624,7 +44788,8 @@ var init_Timeline = __esm({
44624
44788
  entity,
44625
44789
  isLoading = false,
44626
44790
  error,
44627
- className
44791
+ className,
44792
+ look = "vertical-spacious"
44628
44793
  }) => {
44629
44794
  const { t } = useTranslate();
44630
44795
  const entityData = Array.isArray(entity) ? entity : [];
@@ -44680,7 +44845,7 @@ var init_Timeline = __esm({
44680
44845
  }
44681
44846
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Card, { className: cn("p-6", className), children: /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "md", children: [
44682
44847
  title && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h5", weight: "semibold", children: title }),
44683
- /* @__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) => {
44684
44849
  const status = item.status || "pending";
44685
44850
  const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
44686
44851
  const ItemIcon = item.icon || style.icon;