gridsmith-ui 0.8.0 → 0.9.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.
Files changed (40) hide show
  1. package/dist/charts.d.ts +22 -12
  2. package/dist/charts.js +86 -17
  3. package/dist/charts.js.map +1 -1
  4. package/dist/chat.js +4 -3
  5. package/dist/chat.js.map +1 -1
  6. package/dist/{chunk-RLNIRPOH.js → chunk-CQADS7JZ.js} +5 -45
  7. package/dist/chunk-CQADS7JZ.js.map +1 -0
  8. package/dist/{chunk-VXKSQ56H.js → chunk-ENBESZS2.js} +3 -3
  9. package/dist/{chunk-VXKSQ56H.js.map → chunk-ENBESZS2.js.map} +1 -1
  10. package/dist/chunk-FDIFQ5UF.js +67 -0
  11. package/dist/chunk-FDIFQ5UF.js.map +1 -0
  12. package/dist/{chunk-QVNGQ64Q.js → chunk-OVVRMMCO.js} +13 -5
  13. package/dist/chunk-OVVRMMCO.js.map +1 -0
  14. package/dist/chunk-PKLVP5ZB.js +49 -0
  15. package/dist/chunk-PKLVP5ZB.js.map +1 -0
  16. package/dist/chunk-RG4KUCRS.js +9 -0
  17. package/dist/chunk-RG4KUCRS.js.map +1 -0
  18. package/dist/chunk-Z37HO5NU.js +950 -0
  19. package/dist/chunk-Z37HO5NU.js.map +1 -0
  20. package/dist/data-grid.d.ts +3 -1
  21. package/dist/data-grid.js +40 -10
  22. package/dist/data-grid.js.map +1 -1
  23. package/dist/index.d.ts +76 -65
  24. package/dist/index.js +874 -1321
  25. package/dist/index.js.map +1 -1
  26. package/dist/kanban.d.ts +7 -1
  27. package/dist/kanban.js +23 -6
  28. package/dist/kanban.js.map +1 -1
  29. package/dist/resizable.d.ts +48 -2
  30. package/dist/resizable.js +151 -4
  31. package/dist/resizable.js.map +1 -1
  32. package/dist/roots.css +8 -4
  33. package/dist/{use-breakpoint-BfKzmkxx.d.ts → table-utils-GounRE6s.d.ts} +4 -1
  34. package/dist/tokens.css +6 -4
  35. package/dist-static/tokens.css +6 -4
  36. package/package.json +1 -1
  37. package/dist/chunk-5B2ZFL2H.js +0 -89
  38. package/dist/chunk-5B2ZFL2H.js.map +0 -1
  39. package/dist/chunk-QVNGQ64Q.js.map +0 -1
  40. package/dist/chunk-RLNIRPOH.js.map +0 -1
package/dist/charts.d.ts CHANGED
@@ -2,6 +2,8 @@ import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
 
5
+ type XAxisInterval = number | "preserveStart" | "preserveEnd" | "preserveStartEnd" | "equidistantPreserveStart";
6
+
5
7
  interface BarDef {
6
8
  dataKey: string;
7
9
  label?: string;
@@ -9,10 +11,12 @@ interface BarDef {
9
11
  }
10
12
  interface BarChartProps {
11
13
  /**
12
- * Which category ticks show. "preserveStartEnd" (default) keeps the first and last and drops the rest as they
13
- * would collide; 0 shows every tick (labels stay on one line and truncate). Recharts measures the full label.
14
+ * Which category ticks show. Leave it out: the chart measures its widest label with the chart's font and labels every
15
+ * k-th category from the first, the last only when it falls on the step (Sprint 25.4 C-11, decision 7). A number
16
+ * labels every Nth category instead. The Recharts strings ("preserveStartEnd") are accepted for compatibility and
17
+ * mean the same measured labelling — they never hand the ticks back to Recharts' thinning (round 13).
14
18
  */
15
- xAxisInterval?: number | "preserveStart" | "preserveEnd" | "preserveStartEnd" | "equidistantPreserveStart";
19
+ xAxisInterval?: XAxisInterval;
16
20
  data: Record<string, unknown>[];
17
21
  bars: BarDef[];
18
22
  xAxisKey: string;
@@ -37,10 +41,12 @@ interface LineDef {
37
41
  }
38
42
  interface LineChartProps {
39
43
  /**
40
- * Which category ticks show. "preserveStartEnd" (default) keeps the first and last and drops the rest as they
41
- * would collide; 0 shows every tick (labels stay on one line and truncate). Recharts measures the full label.
44
+ * Which category ticks show. Leave it out: the chart measures its widest label with the chart's font and labels every
45
+ * k-th category from the first, the last only when it falls on the step (Sprint 25.4 C-11, decision 7). A number
46
+ * labels every Nth category instead. The Recharts strings ("preserveStartEnd") are accepted for compatibility and
47
+ * mean the same measured labelling — they never hand the ticks back to Recharts' thinning (round 13).
42
48
  */
43
- xAxisInterval?: number | "preserveStart" | "preserveEnd" | "preserveStartEnd" | "equidistantPreserveStart";
49
+ xAxisInterval?: XAxisInterval;
44
50
  data: Record<string, unknown>[];
45
51
  lines: LineDef[];
46
52
  xAxisKey: string;
@@ -64,10 +70,12 @@ interface AreaDef {
64
70
  }
65
71
  interface AreaChartProps {
66
72
  /**
67
- * Which category ticks show. "preserveStartEnd" (default) keeps the first and last and drops the rest as they
68
- * would collide; 0 shows every tick (labels stay on one line and truncate). Recharts measures the full label.
73
+ * Which category ticks show. Leave it out: the chart measures its widest label with the chart's font and labels every
74
+ * k-th category from the first, the last only when it falls on the step (Sprint 25.4 C-11, decision 7). A number
75
+ * labels every Nth category instead. The Recharts strings ("preserveStartEnd") are accepted for compatibility and
76
+ * mean the same measured labelling — they never hand the ticks back to Recharts' thinning (round 13).
69
77
  */
70
- xAxisInterval?: number | "preserveStart" | "preserveEnd" | "preserveStartEnd" | "equidistantPreserveStart";
78
+ xAxisInterval?: XAxisInterval;
71
79
  data: Record<string, unknown>[];
72
80
  areas: AreaDef[];
73
81
  xAxisKey: string;
@@ -105,10 +113,12 @@ declare const PieChart: react.ForwardRefExoticComponent<PieChartProps & react.Re
105
113
 
106
114
  interface CompositeChartProps {
107
115
  /**
108
- * Which category ticks show. "preserveStartEnd" (default) keeps the first and last and drops the rest as they
109
- * would collide; 0 shows every tick (labels stay on one line and truncate). Recharts measures the full label.
116
+ * Which category ticks show. Leave it out: the chart measures its widest label with the chart's font and labels every
117
+ * k-th category from the first, the last only when it falls on the step (Sprint 25.4 C-11, decision 7). A number
118
+ * labels every Nth category instead. The Recharts strings ("preserveStartEnd") are accepted for compatibility and
119
+ * mean the same measured labelling — they never hand the ticks back to Recharts' thinning (round 13).
110
120
  */
111
- xAxisInterval?: number | "preserveStart" | "preserveEnd" | "preserveStartEnd" | "equidistantPreserveStart";
121
+ xAxisInterval?: XAxisInterval;
112
122
  data: Record<string, unknown>[];
113
123
  bars: BarDef[];
114
124
  lines: LineDef[];
package/dist/charts.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Skeleton } from './chunk-M3AARGLI.js';
2
+ import { mergeRefs } from './chunk-PKLVP5ZB.js';
2
3
  import { cn, GLASS_SURFACE } from './chunk-4KVFH5KC.js';
3
- import { createContext, forwardRef, useId, useContext, useSyncExternalStore, useState, useLayoutEffect } from 'react';
4
+ import { createContext, forwardRef, useRef, useId, useContext, useMemo, useState, useEffect, useSyncExternalStore, useLayoutEffect } from 'react';
4
5
  import { ResponsiveContainer, BarChart as BarChart$1, CartesianGrid, XAxis, YAxis, Tooltip, Legend, Bar, LineChart as LineChart$1, Line, AreaChart as AreaChart$1, Area, PieChart as PieChart$1, Pie, Cell, ComposedChart, ScatterChart as ScatterChart$1, ZAxis, Scatter, RadarChart as RadarChart$1, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, RadialBarChart as RadialBarChart$1, RadialBar, FunnelChart as FunnelChart$1, Funnel, LabelList, Treemap, Sankey, Text } from 'recharts';
5
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
7
 
@@ -201,14 +202,69 @@ function useRadius() {
201
202
  return isNaN(parsed) ? 6 : parsed;
202
203
  }
203
204
  function xAxisTick(props) {
204
- const { x, y, payload, width, visibleTicksCount, ...rest } = props;
205
- const tickWidth = width && visibleTicksCount ? Math.floor(width / visibleTicksCount) : 100;
206
- return /* @__PURE__ */ jsx(Text, { ...rest, x, y, width: tickWidth, textAnchor: "middle", verticalAnchor: "start", maxLines: 1, children: payload.value });
205
+ const { x, y, payload, width: _width, visibleTicksCount: _count, ...rest } = props;
206
+ return /* @__PURE__ */ jsx(Text, { ...rest, x, y, textAnchor: "middle", verticalAnchor: "start", children: payload.value });
207
207
  }
208
208
  function yAxisTick(props) {
209
209
  const { x, y, payload, ...rest } = props;
210
210
  return /* @__PURE__ */ jsx(Text, { ...rest, x, y, textAnchor: "end", verticalAnchor: "middle", width: 200, maxLines: 2, children: payload.value });
211
211
  }
212
+ function lengthPx(value, el) {
213
+ const v = value.trim();
214
+ if (v.endsWith("rem")) return parseFloat(v) * (parseFloat(getComputedStyle(el.ownerDocument.documentElement).fontSize) || 16);
215
+ if (v.endsWith("px")) return parseFloat(v);
216
+ const n = parseFloat(v);
217
+ return Number.isFinite(n) ? n : NaN;
218
+ }
219
+ function widestLabel(el, labels) {
220
+ if (typeof document === "undefined") return null;
221
+ const ctx = document.createElement("canvas").getContext?.("2d");
222
+ if (!ctx) return null;
223
+ const cs = getComputedStyle(el);
224
+ const size = lengthPx(cs.getPropertyValue("--ds-font-size-xs"), el) || 12;
225
+ const family = cs.getPropertyValue("--ds-font-sans").trim() || cs.fontFamily || "sans-serif";
226
+ ctx.font = `${size}px ${family}`;
227
+ return labels.reduce((w, l) => Math.max(w, ctx.measureText(l).width), 0);
228
+ }
229
+ var TICK_GAP = 12;
230
+ var AXIS_RESERVE = 48;
231
+ function useCategoryTicks(data, xAxisKey, ref, override) {
232
+ const labels = useMemo(() => (data ?? []).map((d) => String(d[xAxisKey] ?? "")), [data, xAxisKey]);
233
+ const labelsKey = labels.join("");
234
+ const [ticks, setTicks] = useState(void 0);
235
+ const [endMargin, setEndMargin] = useState(4);
236
+ const numeric = typeof override === "number" ? override : void 0;
237
+ useEffect(() => {
238
+ const el = ref.current;
239
+ if (numeric !== void 0 || !el || labels.length === 0) return;
240
+ let live = true;
241
+ const compute = () => {
242
+ if (!live) return;
243
+ const widest = widestLabel(el, labels);
244
+ const plot = el.clientWidth - AXIS_RESERVE;
245
+ if (widest == null || plot <= 0) {
246
+ setTicks(void 0);
247
+ return;
248
+ }
249
+ setEndMargin(Math.max(4, Math.ceil(widest / 2)));
250
+ const fits = Math.max(1, Math.floor(plot / (widest + TICK_GAP)));
251
+ const step = Math.ceil(labels.length / fits);
252
+ setTicks(labels.filter((_, i) => i % step === 0));
253
+ };
254
+ if (typeof ResizeObserver === "undefined") return;
255
+ const ro = new ResizeObserver(compute);
256
+ ro.observe(el);
257
+ const fonts = document.fonts;
258
+ fonts?.ready.then(compute, () => {
259
+ });
260
+ return () => {
261
+ live = false;
262
+ ro.disconnect();
263
+ };
264
+ }, [labelsKey, numeric, ref]);
265
+ if (numeric !== void 0) return { interval: numeric, endMargin: 4 };
266
+ return ticks ? { ticks, interval: 0, endMargin } : { interval: "preserveStartEnd", endMargin: 4 };
267
+ }
212
268
  var ChartContainerContext = createContext(false);
213
269
  function useInsideChartContainer() {
214
270
  return useContext(ChartContainerContext);
@@ -230,7 +286,7 @@ var BarChart = forwardRef(function BarChart2({
230
286
  data,
231
287
  bars,
232
288
  xAxisKey,
233
- xAxisInterval = "preserveStartEnd",
289
+ xAxisInterval,
234
290
  height = "md",
235
291
  stacked = false,
236
292
  horizontal = false,
@@ -243,6 +299,8 @@ var BarChart = forwardRef(function BarChart2({
243
299
  "aria-label": ariaLabel,
244
300
  className
245
301
  }, ref) {
302
+ const wrapperRef = useRef(null);
303
+ const xTicks = useCategoryTicks(data, xAxisKey, wrapperRef, horizontal ? xAxisInterval ?? "preserveStartEnd" : xAxisInterval);
246
304
  const solidColors = useChartColors(bars.length, false);
247
305
  const softColors = useChartColors(bars.length, true);
248
306
  const gridStroke = useGridStroke();
@@ -261,12 +319,12 @@ var BarChart = forwardRef(function BarChart2({
261
319
  }
262
320
  const axisLabelStyle = { fontSize: "var(--ds-font-size-xs)", fontFamily: "var(--ds-font-sans)", fill: axisStyle.tick.fill };
263
321
  if (!data?.length) return null;
264
- return /* @__PURE__ */ jsx(ChartWrapper, { ref, height, className, "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(
322
+ return /* @__PURE__ */ jsx(ChartWrapper, { ref: mergeRefs(ref, wrapperRef), height, className, "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(
265
323
  BarChart$1,
266
324
  {
267
325
  data,
268
326
  layout,
269
- margin: { top: 4, right: 4, bottom: 4, left: 4 },
327
+ margin: { top: 4, right: xTicks.endMargin, bottom: 4, left: 4 },
270
328
  accessibilityLayer: true,
271
329
  children: [
272
330
  showGrid && /* @__PURE__ */ jsx(CartesianGrid, { strokeDasharray: "3 3", stroke: gridStroke, vertical: !horizontal, horizontal: true }),
@@ -302,7 +360,8 @@ var BarChart = forwardRef(function BarChart2({
302
360
  axisLine: false,
303
361
  tickLine: false,
304
362
  tick: xAxisTick,
305
- interval: xAxisInterval,
363
+ interval: xTicks.interval,
364
+ ticks: xTicks.ticks,
306
365
  height: "auto",
307
366
  label: xAxisLabel ? { value: xAxisLabel, position: "insideBottom", offset: -2, style: axisLabelStyle } : void 0
308
367
  }
@@ -340,7 +399,7 @@ var LineChart = forwardRef(function LineChart2({
340
399
  data,
341
400
  lines,
342
401
  xAxisKey,
343
- xAxisInterval = "preserveStartEnd",
402
+ xAxisInterval,
344
403
  height = "md",
345
404
  curved = true,
346
405
  showDots = false,
@@ -353,6 +412,8 @@ var LineChart = forwardRef(function LineChart2({
353
412
  "aria-label": ariaLabel,
354
413
  className
355
414
  }, ref) {
415
+ const wrapperRef = useRef(null);
416
+ const xTicks = useCategoryTicks(data, xAxisKey, wrapperRef, xAxisInterval);
356
417
  const colors = useChartColors(lines.length, false);
357
418
  const gridStroke = useGridStroke();
358
419
  const axisStyle = useAxisStyle();
@@ -360,7 +421,7 @@ var LineChart = forwardRef(function LineChart2({
360
421
  const legendVisible = showLegend ?? lines.length >= 2;
361
422
  const axisLabelStyle = { fontSize: "var(--ds-font-size-xs)", fontFamily: "var(--ds-font-sans)", fill: axisStyle.tick.fill };
362
423
  if (!data?.length) return null;
363
- return /* @__PURE__ */ jsx(ChartWrapper, { ref, height, className, "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(LineChart$1, { data, margin: { top: 4, right: 4, bottom: 4, left: 4 }, accessibilityLayer: true, children: [
424
+ return /* @__PURE__ */ jsx(ChartWrapper, { ref: mergeRefs(ref, wrapperRef), height, className, "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(LineChart$1, { data, margin: { top: 4, right: xTicks.endMargin, bottom: 4, left: 4 }, accessibilityLayer: true, children: [
364
425
  showGrid && /* @__PURE__ */ jsx(CartesianGrid, { strokeDasharray: "3 3", stroke: gridStroke }),
365
426
  /* @__PURE__ */ jsx(
366
427
  XAxis,
@@ -370,7 +431,8 @@ var LineChart = forwardRef(function LineChart2({
370
431
  axisLine: false,
371
432
  tickLine: false,
372
433
  tick: xAxisTick,
373
- interval: xAxisInterval,
434
+ interval: xTicks.interval,
435
+ ticks: xTicks.ticks,
374
436
  height: "auto",
375
437
  label: xAxisLabel ? { value: xAxisLabel, position: "insideBottom", offset: -2, style: axisLabelStyle } : void 0
376
438
  }
@@ -408,7 +470,7 @@ var AreaChart = forwardRef(function AreaChart2({
408
470
  data,
409
471
  areas,
410
472
  xAxisKey,
411
- xAxisInterval = "preserveStartEnd",
473
+ xAxisInterval,
412
474
  height = "md",
413
475
  stacked = false,
414
476
  curved = true,
@@ -422,6 +484,8 @@ var AreaChart = forwardRef(function AreaChart2({
422
484
  "aria-label": ariaLabel,
423
485
  className
424
486
  }, ref) {
487
+ const wrapperRef = useRef(null);
488
+ const xTicks = useCategoryTicks(data, xAxisKey, wrapperRef, xAxisInterval);
425
489
  const instanceId = useId();
426
490
  const solidColors = useChartColors(areas.length, false);
427
491
  const softColors = useChartColors(areas.length, true);
@@ -431,7 +495,7 @@ var AreaChart = forwardRef(function AreaChart2({
431
495
  const legendVisible = showLegend ?? areas.length >= 2;
432
496
  const axisLabelStyle = { fontSize: "var(--ds-font-size-xs)", fontFamily: "var(--ds-font-sans)", fill: axisStyle.tick.fill };
433
497
  if (!data?.length) return null;
434
- return /* @__PURE__ */ jsx(ChartWrapper, { ref, height, className, "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(AreaChart$1, { data, margin: { top: 4, right: 4, bottom: 4, left: 4 }, accessibilityLayer: true, children: [
498
+ return /* @__PURE__ */ jsx(ChartWrapper, { ref: mergeRefs(ref, wrapperRef), height, className, "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(AreaChart$1, { data, margin: { top: 4, right: xTicks.endMargin, bottom: 4, left: 4 }, accessibilityLayer: true, children: [
435
499
  /* @__PURE__ */ jsx("defs", { children: areas.map((area, i) => /* @__PURE__ */ jsxs("linearGradient", { id: `gradient-${instanceId}-${area.dataKey}`, x1: "0", y1: "0", x2: "0", y2: "1", children: [
436
500
  /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: softColors[i], stopOpacity: 1 }),
437
501
  /* @__PURE__ */ jsx("stop", { offset: "95%", stopColor: softColors[i], stopOpacity: 0.1 })
@@ -445,7 +509,8 @@ var AreaChart = forwardRef(function AreaChart2({
445
509
  axisLine: false,
446
510
  tickLine: false,
447
511
  tick: xAxisTick,
448
- interval: xAxisInterval,
512
+ interval: xTicks.interval,
513
+ ticks: xTicks.ticks,
449
514
  height: "auto",
450
515
  label: xAxisLabel ? { value: xAxisLabel, position: "insideBottom", offset: -2, style: axisLabelStyle } : void 0
451
516
  }
@@ -521,7 +586,7 @@ var CompositeChart = forwardRef(function CompositeChart2({
521
586
  bars,
522
587
  lines,
523
588
  xAxisKey,
524
- xAxisInterval = "preserveStartEnd",
589
+ xAxisInterval,
525
590
  height = "md",
526
591
  dualAxis = true,
527
592
  showGrid = true,
@@ -533,6 +598,8 @@ var CompositeChart = forwardRef(function CompositeChart2({
533
598
  "aria-label": ariaLabel,
534
599
  className
535
600
  }, ref) {
601
+ const wrapperRef = useRef(null);
602
+ const xTicks = useCategoryTicks(data, xAxisKey, wrapperRef, xAxisInterval);
536
603
  const barSoftColors = useChartColors(bars.length, true);
537
604
  const lineColors = useChartColors(lines.length, false);
538
605
  const gridStroke = useGridStroke();
@@ -541,7 +608,7 @@ var CompositeChart = forwardRef(function CompositeChart2({
541
608
  const radius = useRadius();
542
609
  const axisLabelStyle = { fontSize: "var(--ds-font-size-xs)", fontFamily: "var(--ds-font-sans)", fill: axisStyle.tick.fill };
543
610
  if (!data?.length) return null;
544
- return /* @__PURE__ */ jsx(ChartWrapper, { ref, height, className, "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(ComposedChart, { data, margin: { top: 4, right: 4, bottom: 4, left: 4 }, accessibilityLayer: true, children: [
611
+ return /* @__PURE__ */ jsx(ChartWrapper, { ref: mergeRefs(ref, wrapperRef), height, className, "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(ComposedChart, { data, margin: { top: 4, right: xTicks.endMargin, bottom: 4, left: 4 }, accessibilityLayer: true, children: [
545
612
  showGrid && /* @__PURE__ */ jsx(CartesianGrid, { strokeDasharray: "3 3", stroke: gridStroke }),
546
613
  /* @__PURE__ */ jsx(
547
614
  XAxis,
@@ -551,7 +618,8 @@ var CompositeChart = forwardRef(function CompositeChart2({
551
618
  axisLine: false,
552
619
  tickLine: false,
553
620
  tick: xAxisTick,
554
- interval: xAxisInterval,
621
+ interval: xTicks.interval,
622
+ ticks: xTicks.ticks,
555
623
  height: "auto",
556
624
  label: xAxisLabel ? { value: xAxisLabel, position: "insideBottom", offset: -2, style: axisLabelStyle } : void 0
557
625
  }
@@ -1006,6 +1074,7 @@ function ChartContainer({
1006
1074
  return /* @__PURE__ */ jsxs(
1007
1075
  "div",
1008
1076
  {
1077
+ "data-card": "",
1009
1078
  className: cn(
1010
1079
  variant === "ghost" ? "bg-transparent" : cn(
1011
1080
  "rounded-[var(--ds-radius-md)] p-ds-4",