@almadar/ui 5.159.0 → 5.160.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.
@@ -28888,8 +28888,8 @@ function DataGrid({
28888
28888
  }
28889
28889
  return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", className: "items-center", children: [
28890
28890
  field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
28891
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
28892
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue(value, field.format) })
28891
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", className: "sr-only", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
28892
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: formatValue(value, field.format) })
28893
28893
  ] }, field.name);
28894
28894
  }) })
28895
28895
  ] }) })
@@ -29317,7 +29317,11 @@ function DataList({
29317
29317
  Box,
29318
29318
  {
29319
29319
  className: cn(
29320
- "group flex items-center gap-4 transition-all duration-fast",
29320
+ // items-start, not items-center: a multi-line row (title + meta +
29321
+ // progress) centred its action cluster in the vertical middle, so
29322
+ // the buttons floated between the meta fields instead of anchoring
29323
+ // to the title they act on (U-DATALIST-ACTIONS-FLOAT-MID-ROW).
29324
+ "group flex items-start gap-4 transition-all duration-fast",
29321
29325
  isCompact ? "px-4 py-2" : "px-6 py-4",
29322
29326
  "hover:bg-muted/80",
29323
29327
  !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
@@ -29348,11 +29352,19 @@ function DataList({
29348
29352
  if (value === void 0 || value === null || value === "") return null;
29349
29353
  return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", className: "items-center", children: [
29350
29354
  field.icon && renderIconInput2(field.icon, { size: "xs", className: "text-muted-foreground" }),
29351
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", children: [
29352
- field.label ?? fieldLabel3(field.name),
29353
- ":"
29354
- ] }),
29355
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
29355
+ /* @__PURE__ */ jsxRuntime.jsxs(
29356
+ Typography,
29357
+ {
29358
+ variant: "caption",
29359
+ color: "secondary",
29360
+ className: cn(field.format !== "boolean" && "sr-only"),
29361
+ children: [
29362
+ field.label ?? fieldLabel3(field.name),
29363
+ ":"
29364
+ ]
29365
+ }
29366
+ ),
29367
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
29356
29368
  ] }, field.name);
29357
29369
  }) }),
29358
29370
  progressFields.map((field) => {
@@ -29371,7 +29383,7 @@ function DataList({
29371
29383
  ]
29372
29384
  }
29373
29385
  ),
29374
- isCard && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "mx-6 border-b border-border/40" })
29386
+ (isCard || isCompact) && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("border-b border-border/40", isCompact ? "mx-4" : "mx-6") })
29375
29387
  ] }, id)
29376
29388
  );
29377
29389
  };
@@ -29381,7 +29393,13 @@ function DataList({
29381
29393
  {
29382
29394
  className: cn(
29383
29395
  isCard && "bg-card rounded-xl border border-border shadow-elevation-dialog overflow-hidden",
29384
- !isCard && gapClass,
29396
+ // `gap-*` is inert on a block container, and Box only emits a display
29397
+ // class when its `display` prop is set — so every non-card list had
29398
+ // been asking for a gap that CSS silently dropped. flex-col makes it
29399
+ // real. `compact` keeps gap-0 on purpose: it separates with the row
29400
+ // divider above instead, never both (Almadar_UI_Beauty.md 6).
29401
+ !isCard && "flex flex-col",
29402
+ !isCard && !isCompact && gapClass,
29385
29403
  listLookStyles[look],
29386
29404
  className
29387
29405
  ),
@@ -44901,16 +44919,11 @@ var init_DetailPanel = __esm({
44901
44919
  footer
44902
44920
  ] })
44903
44921
  ] }) });
44904
- return /* @__PURE__ */ jsxRuntime.jsx(
44905
- Box,
44906
- {
44907
- className: cn(
44908
- slideOver && "fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6",
44909
- className
44910
- ),
44911
- children: content
44912
- }
44913
- );
44922
+ if (!slideOver) {
44923
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className, children: content });
44924
+ }
44925
+ const panel = /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
44926
+ return typeof document === "undefined" ? panel : reactDom.createPortal(panel, document.body);
44914
44927
  };
44915
44928
  DetailPanel.displayName = "DetailPanel";
44916
44929
  }
package/dist/avl/index.js CHANGED
@@ -28812,8 +28812,8 @@ function DataGrid({
28812
28812
  }
28813
28813
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
28814
28814
  field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
28815
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
28816
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue(value, field.format) })
28815
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "sr-only", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
28816
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: formatValue(value, field.format) })
28817
28817
  ] }, field.name);
28818
28818
  }) })
28819
28819
  ] }) })
@@ -29241,7 +29241,11 @@ function DataList({
29241
29241
  Box,
29242
29242
  {
29243
29243
  className: cn(
29244
- "group flex items-center gap-4 transition-all duration-fast",
29244
+ // items-start, not items-center: a multi-line row (title + meta +
29245
+ // progress) centred its action cluster in the vertical middle, so
29246
+ // the buttons floated between the meta fields instead of anchoring
29247
+ // to the title they act on (U-DATALIST-ACTIONS-FLOAT-MID-ROW).
29248
+ "group flex items-start gap-4 transition-all duration-fast",
29245
29249
  isCompact ? "px-4 py-2" : "px-6 py-4",
29246
29250
  "hover:bg-muted/80",
29247
29251
  !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
@@ -29272,11 +29276,19 @@ function DataList({
29272
29276
  if (value === void 0 || value === null || value === "") return null;
29273
29277
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
29274
29278
  field.icon && renderIconInput2(field.icon, { size: "xs", className: "text-muted-foreground" }),
29275
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", children: [
29276
- field.label ?? fieldLabel3(field.name),
29277
- ":"
29278
- ] }),
29279
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
29279
+ /* @__PURE__ */ jsxs(
29280
+ Typography,
29281
+ {
29282
+ variant: "caption",
29283
+ color: "secondary",
29284
+ className: cn(field.format !== "boolean" && "sr-only"),
29285
+ children: [
29286
+ field.label ?? fieldLabel3(field.name),
29287
+ ":"
29288
+ ]
29289
+ }
29290
+ ),
29291
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
29280
29292
  ] }, field.name);
29281
29293
  }) }),
29282
29294
  progressFields.map((field) => {
@@ -29295,7 +29307,7 @@ function DataList({
29295
29307
  ]
29296
29308
  }
29297
29309
  ),
29298
- isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
29310
+ (isCard || isCompact) && !isLast && /* @__PURE__ */ jsx(Box, { className: cn("border-b border-border/40", isCompact ? "mx-4" : "mx-6") })
29299
29311
  ] }, id)
29300
29312
  );
29301
29313
  };
@@ -29305,7 +29317,13 @@ function DataList({
29305
29317
  {
29306
29318
  className: cn(
29307
29319
  isCard && "bg-card rounded-xl border border-border shadow-elevation-dialog overflow-hidden",
29308
- !isCard && gapClass,
29320
+ // `gap-*` is inert on a block container, and Box only emits a display
29321
+ // class when its `display` prop is set — so every non-card list had
29322
+ // been asking for a gap that CSS silently dropped. flex-col makes it
29323
+ // real. `compact` keeps gap-0 on purpose: it separates with the row
29324
+ // divider above instead, never both (Almadar_UI_Beauty.md 6).
29325
+ !isCard && "flex flex-col",
29326
+ !isCard && !isCompact && gapClass,
29309
29327
  listLookStyles[look],
29310
29328
  className
29311
29329
  ),
@@ -44825,16 +44843,11 @@ var init_DetailPanel = __esm({
44825
44843
  footer
44826
44844
  ] })
44827
44845
  ] }) });
44828
- return /* @__PURE__ */ jsx(
44829
- Box,
44830
- {
44831
- className: cn(
44832
- slideOver && "fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6",
44833
- className
44834
- ),
44835
- children: content
44836
- }
44837
- );
44846
+ if (!slideOver) {
44847
+ return /* @__PURE__ */ jsx(Box, { className, children: content });
44848
+ }
44849
+ const panel = /* @__PURE__ */ jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
44850
+ return typeof document === "undefined" ? panel : createPortal(panel, document.body);
44838
44851
  };
44839
44852
  DetailPanel.displayName = "DetailPanel";
44840
44853
  }
@@ -24301,8 +24301,8 @@ function DataGrid({
24301
24301
  }
24302
24302
  return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", className: "items-center", children: [
24303
24303
  field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
24304
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
24305
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", children: formatValue(value, field.format) })
24304
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "secondary", className: "sr-only", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
24305
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", color: "secondary", children: formatValue(value, field.format) })
24306
24306
  ] }, field.name);
24307
24307
  }) })
24308
24308
  ] }) })
@@ -24730,7 +24730,11 @@ function DataList({
24730
24730
  exports.Box,
24731
24731
  {
24732
24732
  className: cn(
24733
- "group flex items-center gap-4 transition-all duration-fast",
24733
+ // items-start, not items-center: a multi-line row (title + meta +
24734
+ // progress) centred its action cluster in the vertical middle, so
24735
+ // the buttons floated between the meta fields instead of anchoring
24736
+ // to the title they act on (U-DATALIST-ACTIONS-FLOAT-MID-ROW).
24737
+ "group flex items-start gap-4 transition-all duration-fast",
24734
24738
  isCompact ? "px-4 py-2" : "px-6 py-4",
24735
24739
  "hover:bg-muted/80",
24736
24740
  !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
@@ -24761,11 +24765,19 @@ function DataList({
24761
24765
  if (value === void 0 || value === null || value === "") return null;
24762
24766
  return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", className: "items-center", children: [
24763
24767
  field.icon && renderIconInput2(field.icon, { size: "xs", className: "text-muted-foreground" }),
24764
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "caption", color: "secondary", children: [
24765
- field.label ?? fieldLabel3(field.name),
24766
- ":"
24767
- ] }),
24768
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24768
+ /* @__PURE__ */ jsxRuntime.jsxs(
24769
+ exports.Typography,
24770
+ {
24771
+ variant: "caption",
24772
+ color: "secondary",
24773
+ className: cn(field.format !== "boolean" && "sr-only"),
24774
+ children: [
24775
+ field.label ?? fieldLabel3(field.name),
24776
+ ":"
24777
+ ]
24778
+ }
24779
+ ),
24780
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "small", color: "secondary", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24769
24781
  ] }, field.name);
24770
24782
  }) }),
24771
24783
  progressFields.map((field) => {
@@ -24784,7 +24796,7 @@ function DataList({
24784
24796
  ]
24785
24797
  }
24786
24798
  ),
24787
- isCard && !isLast && /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "mx-6 border-b border-border/40" })
24799
+ (isCard || isCompact) && !isLast && /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("border-b border-border/40", isCompact ? "mx-4" : "mx-6") })
24788
24800
  ] }, id)
24789
24801
  );
24790
24802
  };
@@ -24794,7 +24806,13 @@ function DataList({
24794
24806
  {
24795
24807
  className: cn(
24796
24808
  isCard && "bg-card rounded-xl border border-border shadow-elevation-dialog overflow-hidden",
24797
- !isCard && gapClass,
24809
+ // `gap-*` is inert on a block container, and Box only emits a display
24810
+ // class when its `display` prop is set — so every non-card list had
24811
+ // been asking for a gap that CSS silently dropped. flex-col makes it
24812
+ // real. `compact` keeps gap-0 on purpose: it separates with the row
24813
+ // divider above instead, never both (Almadar_UI_Beauty.md 6).
24814
+ !isCard && "flex flex-col",
24815
+ !isCard && !isCompact && gapClass,
24798
24816
  listLookStyles[look],
24799
24817
  className
24800
24818
  ),
@@ -44299,16 +44317,11 @@ var init_DetailPanel = __esm({
44299
44317
  footer
44300
44318
  ] })
44301
44319
  ] }) });
44302
- return /* @__PURE__ */ jsxRuntime.jsx(
44303
- exports.Box,
44304
- {
44305
- className: cn(
44306
- slideOver && "fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6",
44307
- className
44308
- ),
44309
- children: content
44310
- }
44311
- );
44320
+ if (!slideOver) {
44321
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className, children: content });
44322
+ }
44323
+ const panel = /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
44324
+ return typeof document === "undefined" ? panel : reactDom.createPortal(panel, document.body);
44312
44325
  };
44313
44326
  exports.DetailPanel.displayName = "DetailPanel";
44314
44327
  }
@@ -24226,8 +24226,8 @@ function DataGrid({
24226
24226
  }
24227
24227
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
24228
24228
  field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
24229
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
24230
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue(value, field.format) })
24229
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "sr-only", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
24230
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: formatValue(value, field.format) })
24231
24231
  ] }, field.name);
24232
24232
  }) })
24233
24233
  ] }) })
@@ -24655,7 +24655,11 @@ function DataList({
24655
24655
  Box,
24656
24656
  {
24657
24657
  className: cn(
24658
- "group flex items-center gap-4 transition-all duration-fast",
24658
+ // items-start, not items-center: a multi-line row (title + meta +
24659
+ // progress) centred its action cluster in the vertical middle, so
24660
+ // the buttons floated between the meta fields instead of anchoring
24661
+ // to the title they act on (U-DATALIST-ACTIONS-FLOAT-MID-ROW).
24662
+ "group flex items-start gap-4 transition-all duration-fast",
24659
24663
  isCompact ? "px-4 py-2" : "px-6 py-4",
24660
24664
  "hover:bg-muted/80",
24661
24665
  !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
@@ -24686,11 +24690,19 @@ function DataList({
24686
24690
  if (value === void 0 || value === null || value === "") return null;
24687
24691
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
24688
24692
  field.icon && renderIconInput2(field.icon, { size: "xs", className: "text-muted-foreground" }),
24689
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", children: [
24690
- field.label ?? fieldLabel3(field.name),
24691
- ":"
24692
- ] }),
24693
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24693
+ /* @__PURE__ */ jsxs(
24694
+ Typography,
24695
+ {
24696
+ variant: "caption",
24697
+ color: "secondary",
24698
+ className: cn(field.format !== "boolean" && "sr-only"),
24699
+ children: [
24700
+ field.label ?? fieldLabel3(field.name),
24701
+ ":"
24702
+ ]
24703
+ }
24704
+ ),
24705
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
24694
24706
  ] }, field.name);
24695
24707
  }) }),
24696
24708
  progressFields.map((field) => {
@@ -24709,7 +24721,7 @@ function DataList({
24709
24721
  ]
24710
24722
  }
24711
24723
  ),
24712
- isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
24724
+ (isCard || isCompact) && !isLast && /* @__PURE__ */ jsx(Box, { className: cn("border-b border-border/40", isCompact ? "mx-4" : "mx-6") })
24713
24725
  ] }, id)
24714
24726
  );
24715
24727
  };
@@ -24719,7 +24731,13 @@ function DataList({
24719
24731
  {
24720
24732
  className: cn(
24721
24733
  isCard && "bg-card rounded-xl border border-border shadow-elevation-dialog overflow-hidden",
24722
- !isCard && gapClass,
24734
+ // `gap-*` is inert on a block container, and Box only emits a display
24735
+ // class when its `display` prop is set — so every non-card list had
24736
+ // been asking for a gap that CSS silently dropped. flex-col makes it
24737
+ // real. `compact` keeps gap-0 on purpose: it separates with the row
24738
+ // divider above instead, never both (Almadar_UI_Beauty.md 6).
24739
+ !isCard && "flex flex-col",
24740
+ !isCard && !isCompact && gapClass,
24723
24741
  listLookStyles[look],
24724
24742
  className
24725
24743
  ),
@@ -44224,16 +44242,11 @@ var init_DetailPanel = __esm({
44224
44242
  footer
44225
44243
  ] })
44226
44244
  ] }) });
44227
- return /* @__PURE__ */ jsx(
44228
- Box,
44229
- {
44230
- className: cn(
44231
- slideOver && "fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6",
44232
- className
44233
- ),
44234
- children: content
44235
- }
44236
- );
44245
+ if (!slideOver) {
44246
+ return /* @__PURE__ */ jsx(Box, { className, children: content });
44247
+ }
44248
+ const panel = /* @__PURE__ */ jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
44249
+ return typeof document === "undefined" ? panel : createPortal(panel, document.body);
44237
44250
  };
44238
44251
  DetailPanel.displayName = "DetailPanel";
44239
44252
  }
@@ -26614,8 +26614,8 @@ function DataGrid({
26614
26614
  }
26615
26615
  return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", className: "items-center", children: [
26616
26616
  field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
26617
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
26618
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue(value, field.format) })
26617
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", className: "sr-only", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
26618
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: formatValue(value, field.format) })
26619
26619
  ] }, field.name);
26620
26620
  }) })
26621
26621
  ] }) })
@@ -27043,7 +27043,11 @@ function DataList({
27043
27043
  Box,
27044
27044
  {
27045
27045
  className: cn(
27046
- "group flex items-center gap-4 transition-all duration-fast",
27046
+ // items-start, not items-center: a multi-line row (title + meta +
27047
+ // progress) centred its action cluster in the vertical middle, so
27048
+ // the buttons floated between the meta fields instead of anchoring
27049
+ // to the title they act on (U-DATALIST-ACTIONS-FLOAT-MID-ROW).
27050
+ "group flex items-start gap-4 transition-all duration-fast",
27047
27051
  isCompact ? "px-4 py-2" : "px-6 py-4",
27048
27052
  "hover:bg-muted/80",
27049
27053
  !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
@@ -27074,11 +27078,19 @@ function DataList({
27074
27078
  if (value === void 0 || value === null || value === "") return null;
27075
27079
  return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", className: "items-center", children: [
27076
27080
  field.icon && renderIconInput2(field.icon, { size: "xs", className: "text-muted-foreground" }),
27077
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", children: [
27078
- field.label ?? fieldLabel3(field.name),
27079
- ":"
27080
- ] }),
27081
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
27081
+ /* @__PURE__ */ jsxRuntime.jsxs(
27082
+ Typography,
27083
+ {
27084
+ variant: "caption",
27085
+ color: "secondary",
27086
+ className: cn(field.format !== "boolean" && "sr-only"),
27087
+ children: [
27088
+ field.label ?? fieldLabel3(field.name),
27089
+ ":"
27090
+ ]
27091
+ }
27092
+ ),
27093
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
27082
27094
  ] }, field.name);
27083
27095
  }) }),
27084
27096
  progressFields.map((field) => {
@@ -27097,7 +27109,7 @@ function DataList({
27097
27109
  ]
27098
27110
  }
27099
27111
  ),
27100
- isCard && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "mx-6 border-b border-border/40" })
27112
+ (isCard || isCompact) && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("border-b border-border/40", isCompact ? "mx-4" : "mx-6") })
27101
27113
  ] }, id)
27102
27114
  );
27103
27115
  };
@@ -27107,7 +27119,13 @@ function DataList({
27107
27119
  {
27108
27120
  className: cn(
27109
27121
  isCard && "bg-card rounded-xl border border-border shadow-elevation-dialog overflow-hidden",
27110
- !isCard && gapClass,
27122
+ // `gap-*` is inert on a block container, and Box only emits a display
27123
+ // class when its `display` prop is set — so every non-card list had
27124
+ // been asking for a gap that CSS silently dropped. flex-col makes it
27125
+ // real. `compact` keeps gap-0 on purpose: it separates with the row
27126
+ // divider above instead, never both (Almadar_UI_Beauty.md 6).
27127
+ !isCard && "flex flex-col",
27128
+ !isCard && !isCompact && gapClass,
27111
27129
  listLookStyles[look],
27112
27130
  className
27113
27131
  ),
@@ -43036,16 +43054,11 @@ var init_DetailPanel = __esm({
43036
43054
  footer
43037
43055
  ] })
43038
43056
  ] }) });
43039
- return /* @__PURE__ */ jsxRuntime.jsx(
43040
- Box,
43041
- {
43042
- className: cn(
43043
- slideOver && "fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6",
43044
- className
43045
- ),
43046
- children: content
43047
- }
43048
- );
43057
+ if (!slideOver) {
43058
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className, children: content });
43059
+ }
43060
+ const panel = /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
43061
+ return typeof document === "undefined" ? panel : reactDom.createPortal(panel, document.body);
43049
43062
  };
43050
43063
  DetailPanel.displayName = "DetailPanel";
43051
43064
  }
@@ -26540,8 +26540,8 @@ function DataGrid({
26540
26540
  }
26541
26541
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
26542
26542
  field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
26543
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
26544
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue(value, field.format) })
26543
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "sr-only", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
26544
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: formatValue(value, field.format) })
26545
26545
  ] }, field.name);
26546
26546
  }) })
26547
26547
  ] }) })
@@ -26969,7 +26969,11 @@ function DataList({
26969
26969
  Box,
26970
26970
  {
26971
26971
  className: cn(
26972
- "group flex items-center gap-4 transition-all duration-fast",
26972
+ // items-start, not items-center: a multi-line row (title + meta +
26973
+ // progress) centred its action cluster in the vertical middle, so
26974
+ // the buttons floated between the meta fields instead of anchoring
26975
+ // to the title they act on (U-DATALIST-ACTIONS-FLOAT-MID-ROW).
26976
+ "group flex items-start gap-4 transition-all duration-fast",
26973
26977
  isCompact ? "px-4 py-2" : "px-6 py-4",
26974
26978
  "hover:bg-muted/80",
26975
26979
  !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
@@ -27000,11 +27004,19 @@ function DataList({
27000
27004
  if (value === void 0 || value === null || value === "") return null;
27001
27005
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
27002
27006
  field.icon && renderIconInput2(field.icon, { size: "xs", className: "text-muted-foreground" }),
27003
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", children: [
27004
- field.label ?? fieldLabel3(field.name),
27005
- ":"
27006
- ] }),
27007
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
27007
+ /* @__PURE__ */ jsxs(
27008
+ Typography,
27009
+ {
27010
+ variant: "caption",
27011
+ color: "secondary",
27012
+ className: cn(field.format !== "boolean" && "sr-only"),
27013
+ children: [
27014
+ field.label ?? fieldLabel3(field.name),
27015
+ ":"
27016
+ ]
27017
+ }
27018
+ ),
27019
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
27008
27020
  ] }, field.name);
27009
27021
  }) }),
27010
27022
  progressFields.map((field) => {
@@ -27023,7 +27035,7 @@ function DataList({
27023
27035
  ]
27024
27036
  }
27025
27037
  ),
27026
- isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
27038
+ (isCard || isCompact) && !isLast && /* @__PURE__ */ jsx(Box, { className: cn("border-b border-border/40", isCompact ? "mx-4" : "mx-6") })
27027
27039
  ] }, id)
27028
27040
  );
27029
27041
  };
@@ -27033,7 +27045,13 @@ function DataList({
27033
27045
  {
27034
27046
  className: cn(
27035
27047
  isCard && "bg-card rounded-xl border border-border shadow-elevation-dialog overflow-hidden",
27036
- !isCard && gapClass,
27048
+ // `gap-*` is inert on a block container, and Box only emits a display
27049
+ // class when its `display` prop is set — so every non-card list had
27050
+ // been asking for a gap that CSS silently dropped. flex-col makes it
27051
+ // real. `compact` keeps gap-0 on purpose: it separates with the row
27052
+ // divider above instead, never both (Almadar_UI_Beauty.md 6).
27053
+ !isCard && "flex flex-col",
27054
+ !isCard && !isCompact && gapClass,
27037
27055
  listLookStyles[look],
27038
27056
  className
27039
27057
  ),
@@ -42962,16 +42980,11 @@ var init_DetailPanel = __esm({
42962
42980
  footer
42963
42981
  ] })
42964
42982
  ] }) });
42965
- return /* @__PURE__ */ jsx(
42966
- Box,
42967
- {
42968
- className: cn(
42969
- slideOver && "fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6",
42970
- className
42971
- ),
42972
- children: content
42973
- }
42974
- );
42983
+ if (!slideOver) {
42984
+ return /* @__PURE__ */ jsx(Box, { className, children: content });
42985
+ }
42986
+ const panel = /* @__PURE__ */ jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
42987
+ return typeof document === "undefined" ? panel : createPortal(panel, document.body);
42975
42988
  };
42976
42989
  DetailPanel.displayName = "DetailPanel";
42977
42990
  }
@@ -26179,8 +26179,8 @@ function DataGrid({
26179
26179
  }
26180
26180
  return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", className: "items-center", children: [
26181
26181
  field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
26182
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
26183
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue(value, field.format) })
26182
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "secondary", className: "sr-only", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
26183
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: formatValue(value, field.format) })
26184
26184
  ] }, field.name);
26185
26185
  }) })
26186
26186
  ] }) })
@@ -26608,7 +26608,11 @@ function DataList({
26608
26608
  Box,
26609
26609
  {
26610
26610
  className: cn(
26611
- "group flex items-center gap-4 transition-all duration-fast",
26611
+ // items-start, not items-center: a multi-line row (title + meta +
26612
+ // progress) centred its action cluster in the vertical middle, so
26613
+ // the buttons floated between the meta fields instead of anchoring
26614
+ // to the title they act on (U-DATALIST-ACTIONS-FLOAT-MID-ROW).
26615
+ "group flex items-start gap-4 transition-all duration-fast",
26612
26616
  isCompact ? "px-4 py-2" : "px-6 py-4",
26613
26617
  "hover:bg-muted/80",
26614
26618
  !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
@@ -26639,11 +26643,19 @@ function DataList({
26639
26643
  if (value === void 0 || value === null || value === "") return null;
26640
26644
  return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", className: "items-center", children: [
26641
26645
  field.icon && renderIconInput2(field.icon, { size: "xs", className: "text-muted-foreground" }),
26642
- /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", color: "secondary", children: [
26643
- field.label ?? fieldLabel3(field.name),
26644
- ":"
26645
- ] }),
26646
- /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
26646
+ /* @__PURE__ */ jsxRuntime.jsxs(
26647
+ Typography,
26648
+ {
26649
+ variant: "caption",
26650
+ color: "secondary",
26651
+ className: cn(field.format !== "boolean" && "sr-only"),
26652
+ children: [
26653
+ field.label ?? fieldLabel3(field.name),
26654
+ ":"
26655
+ ]
26656
+ }
26657
+ ),
26658
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "secondary", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
26647
26659
  ] }, field.name);
26648
26660
  }) }),
26649
26661
  progressFields.map((field) => {
@@ -26662,7 +26674,7 @@ function DataList({
26662
26674
  ]
26663
26675
  }
26664
26676
  ),
26665
- isCard && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "mx-6 border-b border-border/40" })
26677
+ (isCard || isCompact) && !isLast && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("border-b border-border/40", isCompact ? "mx-4" : "mx-6") })
26666
26678
  ] }, id)
26667
26679
  );
26668
26680
  };
@@ -26672,7 +26684,13 @@ function DataList({
26672
26684
  {
26673
26685
  className: cn(
26674
26686
  isCard && "bg-card rounded-xl border border-border shadow-elevation-dialog overflow-hidden",
26675
- !isCard && gapClass,
26687
+ // `gap-*` is inert on a block container, and Box only emits a display
26688
+ // class when its `display` prop is set — so every non-card list had
26689
+ // been asking for a gap that CSS silently dropped. flex-col makes it
26690
+ // real. `compact` keeps gap-0 on purpose: it separates with the row
26691
+ // divider above instead, never both (Almadar_UI_Beauty.md 6).
26692
+ !isCard && "flex flex-col",
26693
+ !isCard && !isCompact && gapClass,
26676
26694
  listLookStyles[look],
26677
26695
  className
26678
26696
  ),
@@ -42399,16 +42417,11 @@ var init_DetailPanel = __esm({
42399
42417
  footer
42400
42418
  ] })
42401
42419
  ] }) });
42402
- return /* @__PURE__ */ jsxRuntime.jsx(
42403
- Box,
42404
- {
42405
- className: cn(
42406
- slideOver && "fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6",
42407
- className
42408
- ),
42409
- children: content
42410
- }
42411
- );
42420
+ if (!slideOver) {
42421
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { className, children: content });
42422
+ }
42423
+ const panel = /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
42424
+ return typeof document === "undefined" ? panel : reactDom.createPortal(panel, document.body);
42412
42425
  };
42413
42426
  DetailPanel.displayName = "DetailPanel";
42414
42427
  }
@@ -26105,8 +26105,8 @@ function DataGrid({
26105
26105
  }
26106
26106
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
26107
26107
  field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
26108
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
26109
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue(value, field.format) })
26108
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "sr-only", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
26109
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: formatValue(value, field.format) })
26110
26110
  ] }, field.name);
26111
26111
  }) })
26112
26112
  ] }) })
@@ -26534,7 +26534,11 @@ function DataList({
26534
26534
  Box,
26535
26535
  {
26536
26536
  className: cn(
26537
- "group flex items-center gap-4 transition-all duration-fast",
26537
+ // items-start, not items-center: a multi-line row (title + meta +
26538
+ // progress) centred its action cluster in the vertical middle, so
26539
+ // the buttons floated between the meta fields instead of anchoring
26540
+ // to the title they act on (U-DATALIST-ACTIONS-FLOAT-MID-ROW).
26541
+ "group flex items-start gap-4 transition-all duration-fast",
26538
26542
  isCompact ? "px-4 py-2" : "px-6 py-4",
26539
26543
  "hover:bg-muted/80",
26540
26544
  !isCard && !isCompact && "rounded-lg border border-transparent hover:border-border"
@@ -26565,11 +26569,19 @@ function DataList({
26565
26569
  if (value === void 0 || value === null || value === "") return null;
26566
26570
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
26567
26571
  field.icon && renderIconInput2(field.icon, { size: "xs", className: "text-muted-foreground" }),
26568
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "secondary", children: [
26569
- field.label ?? fieldLabel3(field.name),
26570
- ":"
26571
- ] }),
26572
- /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
26572
+ /* @__PURE__ */ jsxs(
26573
+ Typography,
26574
+ {
26575
+ variant: "caption",
26576
+ color: "secondary",
26577
+ className: cn(field.format !== "boolean" && "sr-only"),
26578
+ children: [
26579
+ field.label ?? fieldLabel3(field.name),
26580
+ ":"
26581
+ ]
26582
+ }
26583
+ ),
26584
+ /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: formatValue2(value, field.format, { yes: t("common.yes"), no: t("common.no") }) })
26573
26585
  ] }, field.name);
26574
26586
  }) }),
26575
26587
  progressFields.map((field) => {
@@ -26588,7 +26600,7 @@ function DataList({
26588
26600
  ]
26589
26601
  }
26590
26602
  ),
26591
- isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
26603
+ (isCard || isCompact) && !isLast && /* @__PURE__ */ jsx(Box, { className: cn("border-b border-border/40", isCompact ? "mx-4" : "mx-6") })
26592
26604
  ] }, id)
26593
26605
  );
26594
26606
  };
@@ -26598,7 +26610,13 @@ function DataList({
26598
26610
  {
26599
26611
  className: cn(
26600
26612
  isCard && "bg-card rounded-xl border border-border shadow-elevation-dialog overflow-hidden",
26601
- !isCard && gapClass,
26613
+ // `gap-*` is inert on a block container, and Box only emits a display
26614
+ // class when its `display` prop is set — so every non-card list had
26615
+ // been asking for a gap that CSS silently dropped. flex-col makes it
26616
+ // real. `compact` keeps gap-0 on purpose: it separates with the row
26617
+ // divider above instead, never both (Almadar_UI_Beauty.md 6).
26618
+ !isCard && "flex flex-col",
26619
+ !isCard && !isCompact && gapClass,
26602
26620
  listLookStyles[look],
26603
26621
  className
26604
26622
  ),
@@ -42325,16 +42343,11 @@ var init_DetailPanel = __esm({
42325
42343
  footer
42326
42344
  ] })
42327
42345
  ] }) });
42328
- return /* @__PURE__ */ jsx(
42329
- Box,
42330
- {
42331
- className: cn(
42332
- slideOver && "fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6",
42333
- className
42334
- ),
42335
- children: content
42336
- }
42337
- );
42346
+ if (!slideOver) {
42347
+ return /* @__PURE__ */ jsx(Box, { className, children: content });
42348
+ }
42349
+ const panel = /* @__PURE__ */ jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
42350
+ return typeof document === "undefined" ? panel : createPortal(panel, document.body);
42338
42351
  };
42339
42352
  DetailPanel.displayName = "DetailPanel";
42340
42353
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "5.159.0",
3
+ "version": "5.160.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -118,11 +118,11 @@
118
118
  "access": "public"
119
119
  },
120
120
  "dependencies": {
121
- "@almadar/core": "^10.69.0",
121
+ "@almadar/core": "^10.70.0",
122
122
  "@almadar/evaluator": "^2.42.0",
123
123
  "@almadar/logger": "^1.11.0",
124
- "@almadar/runtime": "^6.60.0",
125
- "@almadar/std": "^16.185.0",
124
+ "@almadar/runtime": "^6.61.0",
125
+ "@almadar/std": "^16.188.0",
126
126
  "@almadar/syntax": "^1.15.0",
127
127
  "@dnd-kit/core": "^6.3.1",
128
128
  "@dnd-kit/sortable": "^10.0.0",