@crisp-ui-kit/crisp 0.7.3 → 0.7.5

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 (52) hide show
  1. package/dist/cjs/components/avatar/avatar.recipe.js +0 -7
  2. package/dist/cjs/components/badge/badge.recipe.js +0 -8
  3. package/dist/cjs/components/button/button.recipe.js +0 -10
  4. package/dist/cjs/components/checkbox/checkbox.recipe.js +0 -6
  5. package/dist/cjs/components/datatable/datatable.js +28 -7
  6. package/dist/cjs/components/input/input.recipe.js +0 -1
  7. package/dist/cjs/components/kbd/kbd.recipe.js +0 -7
  8. package/dist/cjs/components/switch/switch.recipe.js +0 -1
  9. package/dist/cjs/components/wheelpicker/wheelpicker.recipe.js +0 -1
  10. package/dist/cjs/product/appshell/appshell.recipe.js +0 -1
  11. package/dist/cjs/product/command/command.recipe.js +0 -6
  12. package/dist/cjs/product/navitem/navitem.recipe.js +0 -8
  13. package/dist/cjs/product/recordpanel/recordpanel.recipe.js +0 -1
  14. package/dist/cjs/product/recordstable/recordstable.recipe.js +12 -8
  15. package/dist/cjs/product/sidebar/sidebar.recipe.js +0 -5
  16. package/dist/esm/components/avatar/avatar.recipe.js +0 -7
  17. package/dist/esm/components/badge/badge.recipe.js +0 -8
  18. package/dist/esm/components/button/button.recipe.js +0 -10
  19. package/dist/esm/components/checkbox/checkbox.recipe.js +0 -6
  20. package/dist/esm/components/datatable/datatable.js +28 -7
  21. package/dist/esm/components/input/input.recipe.js +0 -1
  22. package/dist/esm/components/kbd/kbd.recipe.js +0 -7
  23. package/dist/esm/components/switch/switch.recipe.js +0 -1
  24. package/dist/esm/components/wheelpicker/wheelpicker.recipe.js +0 -1
  25. package/dist/esm/product/appshell/appshell.recipe.js +0 -1
  26. package/dist/esm/product/command/command.recipe.js +0 -6
  27. package/dist/esm/product/navitem/navitem.recipe.js +0 -8
  28. package/dist/esm/product/recordpanel/recordpanel.recipe.js +0 -1
  29. package/dist/esm/product/recordstable/recordstable.recipe.js +12 -8
  30. package/dist/esm/product/sidebar/sidebar.recipe.js +0 -5
  31. package/dist/recordstable.css +12 -2
  32. package/dist/styles.css +1639 -1629
  33. package/dist/types/components/avatar/avatar.d.ts +0 -7
  34. package/dist/types/components/avatar/avatar.recipe.d.ts +0 -7
  35. package/dist/types/components/badge/badge.d.ts +0 -8
  36. package/dist/types/components/badge/badge.recipe.d.ts +0 -8
  37. package/dist/types/components/button/button.d.ts +0 -10
  38. package/dist/types/components/button/button.recipe.d.ts +0 -10
  39. package/dist/types/components/checkbox/checkbox.recipe.d.ts +0 -6
  40. package/dist/types/components/datatable/datatable.d.ts +3 -1
  41. package/dist/types/components/input/input.d.ts +0 -7
  42. package/dist/types/components/input/input.recipe.d.ts +0 -7
  43. package/dist/types/components/kbd/kbd.recipe.d.ts +0 -7
  44. package/dist/types/components/switch/switch.recipe.d.ts +0 -9
  45. package/dist/types/components/wheelpicker/wheelpicker.recipe.d.ts +0 -6
  46. package/dist/types/product/appshell/appshell.recipe.d.ts +0 -5
  47. package/dist/types/product/command/command.recipe.d.ts +0 -6
  48. package/dist/types/product/navitem/navitem.recipe.d.ts +0 -8
  49. package/dist/types/product/recordpanel/recordpanel.recipe.d.ts +0 -5
  50. package/dist/types/product/recordstable/recordstable.recipe.d.ts +0 -6
  51. package/dist/types/product/sidebar/sidebar.recipe.d.ts +0 -5
  52. package/package.json +12 -1
@@ -31,12 +31,5 @@ const config = (0, core_1.defineRecipe)({
31
31
  });
32
32
  exports.avatarRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
33
33
  config,
34
- meta: {
35
- lg: {
36
- height: "24px",
37
- fontSize: "12px",
38
- fontWeight: "600",
39
- },
40
- },
41
34
  });
42
35
  exports.default = config;
@@ -56,13 +56,5 @@ const config = (0, core_1.defineRecipe)({
56
56
  });
57
57
  exports.badgeRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
58
58
  config,
59
- meta: {
60
- medium: {
61
- height: "20px",
62
- borderRadius: "6px",
63
- fontSize: "12px",
64
- fontWeight: "500",
65
- },
66
- },
67
59
  });
68
60
  exports.default = config;
@@ -44,15 +44,5 @@ const config = (0, core_1.defineRecipe)({
44
44
  });
45
45
  exports.buttonRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
46
46
  config,
47
- meta: {
48
- primary: {
49
- height: "28px",
50
- borderRadius: "8px",
51
- fontWeight: "500",
52
- fontSize: "14px",
53
- background: "rgb(38, 109, 240)",
54
- color: "rgb(255, 255, 255)",
55
- },
56
- },
57
47
  });
58
48
  exports.default = config;
@@ -24,11 +24,5 @@ const config = (0, core_1.defineRecipe)({
24
24
  });
25
25
  exports.checkboxRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
26
26
  config,
27
- meta: {
28
- box: {
29
- size: "16px",
30
- borderRadius: "6px",
31
- },
32
- },
33
27
  });
34
28
  exports.default = config;
@@ -107,16 +107,30 @@ function formatCell(type, v, symbol) {
107
107
  return asText(v);
108
108
  }
109
109
  /** Built-in typed-cell renderer (used when a column has no custom `render`). */
110
- function renderTyped(col, value, avatarTone) {
110
+ // `value` is always the RAW cell value and `display` the caller's `format`
111
+ // output, if any. They are separate arguments on purpose: the entity and tags
112
+ // branches inspect the value's SHAPE (object / array), so handing them a
113
+ // formatted string used to make them fall through to their empty state and
114
+ // silently drop the cell's data. Each branch decides for itself where a
115
+ // display string belongs -- as an entity's name, a status' label -- while the
116
+ // raw value keeps driving structure and tone.
117
+ function renderTyped(col, value, avatarTone, display) {
111
118
  const empty = (0, jsx_runtime_1.jsx)("span", { className: "datatable-muted", children: "\u2014" });
112
119
  switch (col.type) {
113
120
  case "entity": {
114
- const e = (typeof value === "object" && value ? value : { name: asText(value) });
121
+ const raw = (typeof value === "object" && value ? value : { name: asText(value) });
122
+ // a formatted string relabels the entity; its avatar and its hashed tone
123
+ // still come from the real value
124
+ const e = display ? { ...raw, name: display } : raw;
115
125
  if (!e.name)
116
126
  return empty;
117
- return ((0, jsx_runtime_1.jsxs)("span", { className: "datatable-entity", children: [(0, jsx_runtime_1.jsx)("span", { className: "datatable-avatar", "data-tone": avatarTone === "hashed" ? toneFor(e.name) : undefined, children: e.avatar ? ((0, jsx_runtime_1.jsx)("img", { src: e.avatar, alt: "" })) : (initials(e.name).slice(0, 2)) }), (0, jsx_runtime_1.jsx)("span", { className: "datatable-entity-name", children: e.name })] }));
127
+ return ((0, jsx_runtime_1.jsxs)("span", { className: "datatable-entity", children: [(0, jsx_runtime_1.jsx)("span", { className: "datatable-avatar", "data-tone": avatarTone === "hashed" ? toneFor(raw.name) : undefined, children: e.avatar ? ((0, jsx_runtime_1.jsx)("img", { src: e.avatar, alt: "" })) : (initials(e.name).slice(0, 2)) }), (0, jsx_runtime_1.jsx)("span", { className: "datatable-entity-name", children: e.name })] }));
118
128
  }
119
129
  case "tags": {
130
+ // asking for a format on a tag column means "render it your way" -- show
131
+ // that string rather than trying to split it back into chips
132
+ if (display)
133
+ return display;
120
134
  const tags = Array.isArray(value) ? value : [];
121
135
  if (!tags.length)
122
136
  return empty;
@@ -126,10 +140,12 @@ function renderTyped(col, value, avatarTone) {
126
140
  const s = asText(value);
127
141
  if (!s)
128
142
  return empty;
129
- return ((0, jsx_runtime_1.jsx)("span", { className: "datatable-tag", "data-tone": col.tones?.[s] ?? toneFor(s), children: s }));
143
+ // tone is looked up by the RAW status, so formatting the label (casing,
144
+ // translation) can never silently repaint the chip
145
+ return ((0, jsx_runtime_1.jsx)("span", { className: "datatable-tag", "data-tone": col.tones?.[s] ?? toneFor(s), children: display || s }));
130
146
  }
131
147
  default: {
132
- const text = formatCell(col.type, value, col.symbol);
148
+ const text = display || formatCell(col.type, value, col.symbol);
133
149
  const isNum = col.type === "number" || col.type === "currency";
134
150
  if (!text)
135
151
  return empty;
@@ -324,7 +340,8 @@ function DataTable({ columns: columnsProp, data, selectable = false, selectedIds
324
340
  }
325
341
  /**
326
342
  * Spreadsheet keyboard model, ported from RecordsTable: arrows move the
327
- * selected cell, Enter opens its editor, Escape clears, and Cmd/Ctrl+C
343
+ * selected cell, Enter opens its editor (or, on a non-editable cell,
344
+ * activates the row via `onRowClick`), Escape clears, and Cmd/Ctrl+C
328
345
  * copies the cell's RENDERED text (what the user sees, not the raw value).
329
346
  */
330
347
  function onGridKeyDown(e) {
@@ -361,6 +378,10 @@ function DataTable({ columns: columnsProp, data, selectable = false, selectedIds
361
378
  e.preventDefault();
362
379
  setEditing({ id: selCell.id, key: selCell.key });
363
380
  }
381
+ else if (onRowClick) {
382
+ e.preventDefault();
383
+ onRowClick(rows[r]);
384
+ }
364
385
  return;
365
386
  }
366
387
  else
@@ -502,7 +523,7 @@ function DataTable({ columns: columnsProp, data, selectable = false, selectedIds
502
523
  }
503
524
  }, children: col.render
504
525
  ? col.render(value, row)
505
- : renderTyped(col, col.format ? col.format(value, row) : value, avatarTone) }, col.key));
526
+ : renderTyped(col, value, avatarTone, col.format?.(value, row)) }, col.key));
506
527
  })] }, row.id)))] }, group ?? "__ungrouped")))) }), (hasSummary || onAddRow) && ((0, jsx_runtime_1.jsxs)(table_1.TableFooter, { children: [hasSummary && ((0, jsx_runtime_1.jsxs)(table_1.TableRow, { children: [showGrip && (0, jsx_runtime_1.jsx)(table_1.TableCell, { ...stickyCol(-2) }), selectable && (0, jsx_runtime_1.jsx)(table_1.TableCell, { ...stickyCol(-1) }), columns.map((col, i) => ((0, jsx_runtime_1.jsx)(table_1.TableCell, { align: alignFor(col), ...stickyCol(i), children: col.summary ? col.summary(rows) : null }, col.key)))] })), onAddRow && ((0, jsx_runtime_1.jsx)(table_1.TableRow, { children: (0, jsx_runtime_1.jsx)(table_1.TableCell, { className: "datatable-addcell", colSpan: totalCols, children: (0, jsx_runtime_1.jsxs)("button", { type: "button", className: "datatable-addrow", onClick: onAddRow, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: 15, strokeWidth: 1.75, "aria-hidden": "true" }), addRowLabel] }) }) }))] }))] })] }));
507
528
  }
508
529
  DataTable.displayName = "DataTable";
@@ -54,6 +54,5 @@ const config = (0, core_1.defineRecipe)({
54
54
  });
55
55
  exports.inputRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
56
56
  config,
57
- meta: { medium: { height: "32px", borderRadius: "8px", fontSize: "14px" } },
58
57
  });
59
58
  exports.default = config;
@@ -12,12 +12,5 @@ const config = (0, core_1.defineRecipe)({
12
12
  });
13
13
  exports.kbdRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
14
14
  config,
15
- meta: {
16
- chip: {
17
- height: "20px",
18
- borderRadius: "6px",
19
- fontSize: "11px",
20
- },
21
- },
22
15
  });
23
16
  exports.default = config;
@@ -24,6 +24,5 @@ const config = (0, core_1.defineRecipe)({
24
24
  });
25
25
  exports.switchRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
26
26
  config,
27
- meta: { track: { width: "24px", height: "16px" }, thumb: { size: "12px" } },
28
27
  });
29
28
  exports.default = config;
@@ -90,6 +90,5 @@ const config = (0, core_1.defineRecipe)({
90
90
  });
91
91
  exports.wheelpickerRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
92
92
  config,
93
- meta: { medium: { height: "220px", itemHeight: "44px" } },
94
93
  });
95
94
  exports.default = config;
@@ -25,6 +25,5 @@ const config = (0, core_1.defineRecipe)({
25
25
  });
26
26
  exports.appshellRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
27
27
  config,
28
- meta: { sidebar: { defaultWidth: "275px" } },
29
28
  });
30
29
  exports.default = config;
@@ -37,11 +37,5 @@ const config = (0, core_1.defineRecipe)({
37
37
  });
38
38
  exports.commandRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
39
39
  config,
40
- meta: {
41
- content: {
42
- maxWidth: "720px",
43
- borderRadius: "16px",
44
- },
45
- },
46
40
  });
47
41
  exports.default = config;
@@ -24,13 +24,5 @@ const config = (0, core_1.defineRecipe)({
24
24
  });
25
25
  exports.navitemRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
26
26
  config,
27
- meta: {
28
- row: {
29
- height: "28px",
30
- borderRadius: "9px",
31
- fontSize: "14px",
32
- fontWeight: "500",
33
- },
34
- },
35
27
  });
36
28
  exports.default = config;
@@ -46,6 +46,5 @@ const config = (0, core_1.defineRecipe)({
46
46
  });
47
47
  exports.recordpanelRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
48
48
  config,
49
- meta: { panel: { width: "420px" } },
50
49
  });
51
50
  exports.default = config;
@@ -97,11 +97,21 @@ ${(0, tabletoolbar_chrome_1.toolbarChromeBody)("recordstable")}
97
97
  & .recordstable-col-check { width: 40px; min-width: 40px; padding: 0; }
98
98
  & .recordstable-check-inner { display: flex; align-items: center; justify-content: center; height: 100%; }
99
99
  & .recordstable-col-check, & .recordstable-col-entity { position: sticky; z-index: 3; background: ${tokens_1.contract.bgSurface}; }
100
- & .recordstable-col-check { left: 0; }
101
- & .recordstable-col-entity { left: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
100
+ /* The sticky pin is a LOGICAL offset: with physical \`left\` these columns
101
+ were not pinned at all under RTL -- scrolled, they left the viewport
102
+ entirely (measured: viewport 13..773, check column at x=1333). Nothing in
103
+ JS measures these, so converting them is safe; the two properties below
104
+ that have no logical form get an explicit RTL rule rather than being
105
+ left to point the wrong way. */
106
+ & .recordstable-col-check { inset-inline-start: 0; }
107
+ & .recordstable-col-entity { inset-inline-start: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
108
+ [dir="rtl"] & .recordstable-col-entity { clip-path: inset(0 0 0 -38px); }
102
109
  & thead .recordstable-col-check, & thead .recordstable-col-entity { z-index: 4; }
103
110
  /* soft shadow on the sticky column edge once the grid is scrolled horizontally */
104
111
  & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: 6px 0 16px 4px rgba(0,0,0,0.12); }
112
+ /* box-shadow has no logical form either: the bleed follows the scrolled
113
+ content, which is the opposite side under RTL. */
114
+ [dir="rtl"] & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
105
115
  /* AI-enriched values carry a purple wash. Measured from Attio:
106
116
  a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
107
117
  whatever row-state background the cell already has, which is why it
@@ -142,11 +152,5 @@ ${(0, tabletoolbar_chrome_1.toolbarChromeBody)("recordstable")}
142
152
  });
143
153
  exports.recordstableRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
144
154
  config,
145
- meta: {
146
- row: {
147
- height: "36px",
148
- gridLine: "1px",
149
- },
150
- },
151
155
  });
152
156
  exports.default = config;
@@ -37,10 +37,5 @@ const config = (0, core_1.defineRecipe)({
37
37
  });
38
38
  exports.sidebarRecipe = Object.assign((0, core_1.resolveRecipe)(config), {
39
39
  config,
40
- meta: {
41
- container: {
42
- width: "275px",
43
- },
44
- },
45
40
  });
46
41
  exports.default = config;
@@ -28,12 +28,5 @@ const config = defineRecipe({
28
28
  });
29
29
  export const avatarRecipe = Object.assign(resolveRecipe(config), {
30
30
  config,
31
- meta: {
32
- lg: {
33
- height: "24px",
34
- fontSize: "12px",
35
- fontWeight: "600",
36
- },
37
- },
38
31
  });
39
32
  export default config;
@@ -53,13 +53,5 @@ const config = defineRecipe({
53
53
  });
54
54
  export const badgeRecipe = Object.assign(resolveRecipe(config), {
55
55
  config,
56
- meta: {
57
- medium: {
58
- height: "20px",
59
- borderRadius: "6px",
60
- fontSize: "12px",
61
- fontWeight: "500",
62
- },
63
- },
64
56
  });
65
57
  export default config;
@@ -41,15 +41,5 @@ const config = defineRecipe({
41
41
  });
42
42
  export const buttonRecipe = Object.assign(resolveRecipe(config), {
43
43
  config,
44
- meta: {
45
- primary: {
46
- height: "28px",
47
- borderRadius: "8px",
48
- fontWeight: "500",
49
- fontSize: "14px",
50
- background: "rgb(38, 109, 240)",
51
- color: "rgb(255, 255, 255)",
52
- },
53
- },
54
44
  });
55
45
  export default config;
@@ -21,11 +21,5 @@ const config = defineRecipe({
21
21
  });
22
22
  export const checkboxRecipe = Object.assign(resolveRecipe(config), {
23
23
  config,
24
- meta: {
25
- box: {
26
- size: "16px",
27
- borderRadius: "6px",
28
- },
29
- },
30
24
  });
31
25
  export default config;
@@ -71,16 +71,30 @@ function formatCell(type, v, symbol) {
71
71
  return asText(v);
72
72
  }
73
73
  /** Built-in typed-cell renderer (used when a column has no custom `render`). */
74
- function renderTyped(col, value, avatarTone) {
74
+ // `value` is always the RAW cell value and `display` the caller's `format`
75
+ // output, if any. They are separate arguments on purpose: the entity and tags
76
+ // branches inspect the value's SHAPE (object / array), so handing them a
77
+ // formatted string used to make them fall through to their empty state and
78
+ // silently drop the cell's data. Each branch decides for itself where a
79
+ // display string belongs -- as an entity's name, a status' label -- while the
80
+ // raw value keeps driving structure and tone.
81
+ function renderTyped(col, value, avatarTone, display) {
75
82
  const empty = _jsx("span", { className: "datatable-muted", children: "\u2014" });
76
83
  switch (col.type) {
77
84
  case "entity": {
78
- const e = (typeof value === "object" && value ? value : { name: asText(value) });
85
+ const raw = (typeof value === "object" && value ? value : { name: asText(value) });
86
+ // a formatted string relabels the entity; its avatar and its hashed tone
87
+ // still come from the real value
88
+ const e = display ? { ...raw, name: display } : raw;
79
89
  if (!e.name)
80
90
  return empty;
81
- return (_jsxs("span", { className: "datatable-entity", children: [_jsx("span", { className: "datatable-avatar", "data-tone": avatarTone === "hashed" ? toneFor(e.name) : undefined, children: e.avatar ? (_jsx("img", { src: e.avatar, alt: "" })) : (initials(e.name).slice(0, 2)) }), _jsx("span", { className: "datatable-entity-name", children: e.name })] }));
91
+ return (_jsxs("span", { className: "datatable-entity", children: [_jsx("span", { className: "datatable-avatar", "data-tone": avatarTone === "hashed" ? toneFor(raw.name) : undefined, children: e.avatar ? (_jsx("img", { src: e.avatar, alt: "" })) : (initials(e.name).slice(0, 2)) }), _jsx("span", { className: "datatable-entity-name", children: e.name })] }));
82
92
  }
83
93
  case "tags": {
94
+ // asking for a format on a tag column means "render it your way" -- show
95
+ // that string rather than trying to split it back into chips
96
+ if (display)
97
+ return display;
84
98
  const tags = Array.isArray(value) ? value : [];
85
99
  if (!tags.length)
86
100
  return empty;
@@ -90,10 +104,12 @@ function renderTyped(col, value, avatarTone) {
90
104
  const s = asText(value);
91
105
  if (!s)
92
106
  return empty;
93
- return (_jsx("span", { className: "datatable-tag", "data-tone": col.tones?.[s] ?? toneFor(s), children: s }));
107
+ // tone is looked up by the RAW status, so formatting the label (casing,
108
+ // translation) can never silently repaint the chip
109
+ return (_jsx("span", { className: "datatable-tag", "data-tone": col.tones?.[s] ?? toneFor(s), children: display || s }));
94
110
  }
95
111
  default: {
96
- const text = formatCell(col.type, value, col.symbol);
112
+ const text = display || formatCell(col.type, value, col.symbol);
97
113
  const isNum = col.type === "number" || col.type === "currency";
98
114
  if (!text)
99
115
  return empty;
@@ -288,7 +304,8 @@ export function DataTable({ columns: columnsProp, data, selectable = false, sele
288
304
  }
289
305
  /**
290
306
  * Spreadsheet keyboard model, ported from RecordsTable: arrows move the
291
- * selected cell, Enter opens its editor, Escape clears, and Cmd/Ctrl+C
307
+ * selected cell, Enter opens its editor (or, on a non-editable cell,
308
+ * activates the row via `onRowClick`), Escape clears, and Cmd/Ctrl+C
292
309
  * copies the cell's RENDERED text (what the user sees, not the raw value).
293
310
  */
294
311
  function onGridKeyDown(e) {
@@ -325,6 +342,10 @@ export function DataTable({ columns: columnsProp, data, selectable = false, sele
325
342
  e.preventDefault();
326
343
  setEditing({ id: selCell.id, key: selCell.key });
327
344
  }
345
+ else if (onRowClick) {
346
+ e.preventDefault();
347
+ onRowClick(rows[r]);
348
+ }
328
349
  return;
329
350
  }
330
351
  else
@@ -466,7 +487,7 @@ export function DataTable({ columns: columnsProp, data, selectable = false, sele
466
487
  }
467
488
  }, children: col.render
468
489
  ? col.render(value, row)
469
- : renderTyped(col, col.format ? col.format(value, row) : value, avatarTone) }, col.key));
490
+ : renderTyped(col, value, avatarTone, col.format?.(value, row)) }, col.key));
470
491
  })] }, row.id)))] }, group ?? "__ungrouped")))) }), (hasSummary || onAddRow) && (_jsxs(TableFooter, { children: [hasSummary && (_jsxs(TableRow, { children: [showGrip && _jsx(TableCell, { ...stickyCol(-2) }), selectable && _jsx(TableCell, { ...stickyCol(-1) }), columns.map((col, i) => (_jsx(TableCell, { align: alignFor(col), ...stickyCol(i), children: col.summary ? col.summary(rows) : null }, col.key)))] })), onAddRow && (_jsx(TableRow, { children: _jsx(TableCell, { className: "datatable-addcell", colSpan: totalCols, children: _jsxs("button", { type: "button", className: "datatable-addrow", onClick: onAddRow, children: [_jsx(Plus, { size: 15, strokeWidth: 1.75, "aria-hidden": "true" }), addRowLabel] }) }) }))] }))] })] }));
471
492
  }
472
493
  DataTable.displayName = "DataTable";
@@ -51,6 +51,5 @@ const config = defineRecipe({
51
51
  });
52
52
  export const inputRecipe = Object.assign(resolveRecipe(config), {
53
53
  config,
54
- meta: { medium: { height: "32px", borderRadius: "8px", fontSize: "14px" } },
55
54
  });
56
55
  export default config;
@@ -9,12 +9,5 @@ const config = defineRecipe({
9
9
  });
10
10
  export const kbdRecipe = Object.assign(resolveRecipe(config), {
11
11
  config,
12
- meta: {
13
- chip: {
14
- height: "20px",
15
- borderRadius: "6px",
16
- fontSize: "11px",
17
- },
18
- },
19
12
  });
20
13
  export default config;
@@ -21,6 +21,5 @@ const config = defineRecipe({
21
21
  });
22
22
  export const switchRecipe = Object.assign(resolveRecipe(config), {
23
23
  config,
24
- meta: { track: { width: "24px", height: "16px" }, thumb: { size: "12px" } },
25
24
  });
26
25
  export default config;
@@ -87,6 +87,5 @@ const config = defineRecipe({
87
87
  });
88
88
  export const wheelpickerRecipe = Object.assign(resolveRecipe(config), {
89
89
  config,
90
- meta: { medium: { height: "220px", itemHeight: "44px" } },
91
90
  });
92
91
  export default config;
@@ -22,6 +22,5 @@ const config = defineRecipe({
22
22
  });
23
23
  export const appshellRecipe = Object.assign(resolveRecipe(config), {
24
24
  config,
25
- meta: { sidebar: { defaultWidth: "275px" } },
26
25
  });
27
26
  export default config;
@@ -34,11 +34,5 @@ const config = defineRecipe({
34
34
  });
35
35
  export const commandRecipe = Object.assign(resolveRecipe(config), {
36
36
  config,
37
- meta: {
38
- content: {
39
- maxWidth: "720px",
40
- borderRadius: "16px",
41
- },
42
- },
43
37
  });
44
38
  export default config;
@@ -21,13 +21,5 @@ const config = defineRecipe({
21
21
  });
22
22
  export const navitemRecipe = Object.assign(resolveRecipe(config), {
23
23
  config,
24
- meta: {
25
- row: {
26
- height: "28px",
27
- borderRadius: "9px",
28
- fontSize: "14px",
29
- fontWeight: "500",
30
- },
31
- },
32
24
  });
33
25
  export default config;
@@ -43,6 +43,5 @@ const config = defineRecipe({
43
43
  });
44
44
  export const recordpanelRecipe = Object.assign(resolveRecipe(config), {
45
45
  config,
46
- meta: { panel: { width: "420px" } },
47
46
  });
48
47
  export default config;
@@ -94,11 +94,21 @@ ${toolbarChromeBody("recordstable")}
94
94
  & .recordstable-col-check { width: 40px; min-width: 40px; padding: 0; }
95
95
  & .recordstable-check-inner { display: flex; align-items: center; justify-content: center; height: 100%; }
96
96
  & .recordstable-col-check, & .recordstable-col-entity { position: sticky; z-index: 3; background: ${c.bgSurface}; }
97
- & .recordstable-col-check { left: 0; }
98
- & .recordstable-col-entity { left: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
97
+ /* The sticky pin is a LOGICAL offset: with physical \`left\` these columns
98
+ were not pinned at all under RTL -- scrolled, they left the viewport
99
+ entirely (measured: viewport 13..773, check column at x=1333). Nothing in
100
+ JS measures these, so converting them is safe; the two properties below
101
+ that have no logical form get an explicit RTL rule rather than being
102
+ left to point the wrong way. */
103
+ & .recordstable-col-check { inset-inline-start: 0; }
104
+ & .recordstable-col-entity { inset-inline-start: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
105
+ [dir="rtl"] & .recordstable-col-entity { clip-path: inset(0 0 0 -38px); }
99
106
  & thead .recordstable-col-check, & thead .recordstable-col-entity { z-index: 4; }
100
107
  /* soft shadow on the sticky column edge once the grid is scrolled horizontally */
101
108
  & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: 6px 0 16px 4px rgba(0,0,0,0.12); }
109
+ /* box-shadow has no logical form either: the bleed follows the scrolled
110
+ content, which is the opposite side under RTL. */
111
+ [dir="rtl"] & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
102
112
  /* AI-enriched values carry a purple wash. Measured from Attio:
103
113
  a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
104
114
  whatever row-state background the cell already has, which is why it
@@ -139,11 +149,5 @@ ${toolbarChromeBody("recordstable")}
139
149
  });
140
150
  export const recordstableRecipe = Object.assign(resolveRecipe(config), {
141
151
  config,
142
- meta: {
143
- row: {
144
- height: "36px",
145
- gridLine: "1px",
146
- },
147
- },
148
152
  });
149
153
  export default config;
@@ -34,10 +34,5 @@ const config = defineRecipe({
34
34
  });
35
35
  export const sidebarRecipe = Object.assign(resolveRecipe(config), {
36
36
  config,
37
- meta: {
38
- container: {
39
- width: "275px",
40
- },
41
- },
42
37
  });
43
38
  export default config;
@@ -149,11 +149,21 @@
149
149
  & .recordstable-col-check { width: 40px; min-width: 40px; padding: 0; }
150
150
  & .recordstable-check-inner { display: flex; align-items: center; justify-content: center; height: 100%; }
151
151
  & .recordstable-col-check, & .recordstable-col-entity { position: sticky; z-index: 3; background: var(--bg-surface); }
152
- & .recordstable-col-check { left: 0; }
153
- & .recordstable-col-entity { left: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
152
+ /* The sticky pin is a LOGICAL offset: with physical `left` these columns
153
+ were not pinned at all under RTL -- scrolled, they left the viewport
154
+ entirely (measured: viewport 13..773, check column at x=1333). Nothing in
155
+ JS measures these, so converting them is safe; the two properties below
156
+ that have no logical form get an explicit RTL rule rather than being
157
+ left to point the wrong way. */
158
+ & .recordstable-col-check { inset-inline-start: 0; }
159
+ & .recordstable-col-entity { inset-inline-start: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
160
+ [dir="rtl"] & .recordstable-col-entity { clip-path: inset(0 0 0 -38px); }
154
161
  & thead .recordstable-col-check, & thead .recordstable-col-entity { z-index: 4; }
155
162
  /* soft shadow on the sticky column edge once the grid is scrolled horizontally */
156
163
  & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: 6px 0 16px 4px rgba(0,0,0,0.12); }
164
+ /* box-shadow has no logical form either: the bleed follows the scrolled
165
+ content, which is the opposite side under RTL. */
166
+ [dir="rtl"] & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
157
167
  /* AI-enriched values carry a purple wash. Measured from Attio:
158
168
  a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
159
169
  whatever row-state background the cell already has, which is why it