@vertebr/react 0.19.0 → 0.21.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.
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceCell.d.ts","sourceRoot":"","sources":["../../../src/components/resources/ResourceCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA6CnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC9B,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,KAAK,EACL,KAAK,EACL,OAAiB,GAClB,EAAE,iBAAiB,+BAuHnB"}
1
+ {"version":3,"file":"ResourceCell.d.ts","sourceRoot":"","sources":["../../../src/components/resources/ResourceCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA+CnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC9B,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,KAAK,EACL,KAAK,EACL,OAAiB,GAClB,EAAE,iBAAiB,+BAkInB"}
@@ -6,6 +6,7 @@ const IMAGE_EXT = /\.(png|jpe?g|gif|webp|svg|avif)(\?|#|$)/i;
6
6
  function looksLikeUrl(value) {
7
7
  return /^https?:\/\//i.test(value) || value.startsWith("//");
8
8
  }
9
+ const ISO_DATE = /^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}|$)/;
9
10
  function looksLikeImageUrl(value) {
10
11
  if (!looksLikeUrl(value))
11
12
  return false;
@@ -77,6 +78,15 @@ export function ResourceCell({ fieldKey, field, value, variant = "table", }) {
77
78
  }
78
79
  }
79
80
  if (typeof value === "string") {
81
+ if (ISO_DATE.test(value)) {
82
+ const formatted = formatDate(value);
83
+ if (formatted) {
84
+ return _jsx("span", { className: "vertebr-cell-datetime", children: formatted });
85
+ }
86
+ }
87
+ if (detail && value.length > 28 && !/\s/.test(value)) {
88
+ return _jsx("code", { className: "vertebr-cell-token", children: value });
89
+ }
80
90
  if (URL_KEY.test(fieldKey) || looksLikeUrl(value)) {
81
91
  return (_jsx("a", { className: "vertebr-cell-link", href: value.startsWith("//") ? `https:${value}` : value, target: "_blank", rel: "noreferrer", title: value, onClick: (event) => event.stopPropagation(), children: detail ? value : value.replace(/^https?:\/\//i, "") }));
82
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceTable.d.ts","sourceRoot":"","sources":["../../../src/components/resources/ResourceTable.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ResourceTable.d.ts","sourceRoot":"","sources":["../../../src/components/resources/ResourceTable.tsx"],"names":[],"mappings":"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"}
@@ -44,10 +44,27 @@ function humanizeKey(key) {
44
44
  .trim();
45
45
  }
46
46
  function rowTitle(row, keys) {
47
- for (const key of ["name", "title", "label", ...keys]) {
47
+ const preferred = [
48
+ "confirmationNumber",
49
+ "name",
50
+ "title",
51
+ "label",
52
+ "shippingName",
53
+ "customerName",
54
+ "email",
55
+ "customerEmail",
56
+ ...keys,
57
+ ];
58
+ for (const key of preferred) {
48
59
  const value = row[key];
49
- if (typeof value === "string" && value.trim())
50
- return value;
60
+ if (typeof value !== "string")
61
+ continue;
62
+ const trimmed = value.trim();
63
+ if (!trimmed)
64
+ continue;
65
+ if (trimmed.length > 28 && !/\s/.test(trimmed))
66
+ continue;
67
+ return trimmed;
51
68
  }
52
69
  return "Record";
53
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceViewModal.d.ts","sourceRoot":"","sources":["../../../src/components/resources/ResourceViewModal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AA4BF,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,GAAG,EACH,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,GACP,EAAE,sBAAsB,+BAsFxB"}
1
+ {"version":3,"file":"ResourceViewModal.d.ts","sourceRoot":"","sources":["../../../src/components/resources/ResourceViewModal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AA+GF,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,GAAG,EACH,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,GACP,EAAE,sBAAsB,+BAgFxB"}
@@ -1,5 +1,6 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect } from "react";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { Dialog, DialogContent, DialogTitle } from "../dialog/Dialog";
3
4
  import { ResourceCell } from "./ResourceCell";
4
5
  function humanizeKey(key) {
5
6
  return key
@@ -8,6 +9,77 @@ function humanizeKey(key) {
8
9
  .replace(/\bcents\b/i, "")
9
10
  .trim();
10
11
  }
12
+ const HEADING_KEYS = [
13
+ "confirmationNumber",
14
+ "name",
15
+ "title",
16
+ "label",
17
+ "shippingName",
18
+ "customerName",
19
+ "email",
20
+ "customerEmail",
21
+ ];
22
+ function isToken(value) {
23
+ const trimmed = value.trim();
24
+ return trimmed.length > 28 && !/\s/.test(trimmed);
25
+ }
26
+ function readableHeading(value) {
27
+ if (typeof value !== "string")
28
+ return null;
29
+ const trimmed = value.trim();
30
+ if (!trimmed || trimmed.length > 80 || isToken(trimmed))
31
+ return null;
32
+ return trimmed;
33
+ }
34
+ function recordHeading(row, fallback) {
35
+ for (const key of HEADING_KEYS) {
36
+ const heading = readableHeading(row[key]);
37
+ if (heading)
38
+ return heading;
39
+ }
40
+ return readableHeading(fallback) ?? "Record";
41
+ }
42
+ /** Long or structured values get the full row so they wrap instead of colliding. */
43
+ function spansRow(value) {
44
+ if (typeof value === "string") {
45
+ return value.length > 36 || value.includes("\n");
46
+ }
47
+ if (Array.isArray(value)) {
48
+ return value.some((entry) => typeof entry === "string" && entry.length > 36);
49
+ }
50
+ if (value instanceof Date)
51
+ return false;
52
+ if (value &&
53
+ typeof value === "object" &&
54
+ "toDate" in value &&
55
+ typeof value.toDate === "function") {
56
+ return false;
57
+ }
58
+ return value != null && typeof value === "object";
59
+ }
60
+ /** Keep short fields in pairs. A leftover short field fills the row before a wide one. */
61
+ function layoutFields(entries) {
62
+ const laid = [];
63
+ let compact = [];
64
+ const flush = () => {
65
+ compact.forEach(([key, value], index) => {
66
+ const fillRow = compact.length % 2 === 1 && index === compact.length - 1;
67
+ laid.push({ key, value, span: fillRow });
68
+ });
69
+ compact = [];
70
+ };
71
+ for (const entry of entries) {
72
+ if (spansRow(entry[1])) {
73
+ flush();
74
+ laid.push({ key: entry[0], value: entry[1], span: true });
75
+ }
76
+ else {
77
+ compact.push(entry);
78
+ }
79
+ }
80
+ flush();
81
+ return laid;
82
+ }
11
83
  function findHeroImage(schema, row) {
12
84
  for (const [key, value] of Object.entries(row)) {
13
85
  if (typeof value !== "string" || !/^https?:\/\//i.test(value))
@@ -27,18 +99,8 @@ export function ResourceViewModal({ schema, row, title, canEdit, onClose, onEdit
27
99
  ? fields.map((key) => [key, row[key]])
28
100
  : Object.entries(row);
29
101
  const hero = findHeroImage(schema, row);
30
- useEffect(() => {
31
- const onKeyDown = (event) => {
32
- if (event.key === "Escape")
33
- onClose();
34
- };
35
- window.addEventListener("keydown", onKeyDown);
36
- const previous = document.body.style.overflow;
37
- document.body.style.overflow = "hidden";
38
- return () => {
39
- window.removeEventListener("keydown", onKeyDown);
40
- document.body.style.overflow = previous;
41
- };
42
- }, [onClose]);
43
- return (_jsx("div", { className: "vertebr-modal-backdrop", role: "presentation", onClick: onClose, children: _jsxs("div", { className: "vertebr-modal", role: "dialog", "aria-modal": "true", "aria-label": title, onClick: (event) => event.stopPropagation(), children: [_jsxs("header", { className: "vertebr-modal-head", children: [_jsxs("div", { className: "vertebr-modal-heading", children: [_jsx("p", { className: "vertebr-modal-eyebrow", children: "Record" }), _jsx("h2", { children: title })] }), _jsxs("div", { className: "vertebr-modal-actions", children: [canEdit && onEdit ? (_jsx("button", { type: "button", className: "vertebr-btn vertebr-btn-primary", onClick: onEdit, children: "Edit" })) : null, _jsx("button", { type: "button", className: "vertebr-btn", onClick: onClose, "aria-label": "Close", children: "Close" })] })] }), _jsxs("div", { className: "vertebr-modal-body", children: [hero ? (_jsx("div", { className: "vertebr-modal-hero", children: _jsx("img", { src: hero, alt: "" }) })) : null, _jsx("dl", { className: "vertebr-modal-fields", children: entries.map(([key, value]) => (_jsxs("div", { className: "vertebr-modal-field", children: [_jsx("dt", { children: schema[key]?.label ?? humanizeKey(key) }), _jsx("dd", { children: _jsx(ResourceCell, { fieldKey: key, field: schema[key], value: value, variant: "detail" }) })] }, key))) })] })] }) }));
102
+ const heading = recordHeading(row, title);
103
+ const fieldsToShow = layoutFields(entries);
104
+ const titleId = useId();
105
+ return (_jsxs(Dialog, { onClose: onClose, maxWidth: "sm", fullWidth: true, className: "vertebr-record-modal", "aria-labelledby": titleId, children: [_jsxs(DialogTitle, { id: titleId, eyebrow: "Record", actions: _jsxs(_Fragment, { children: [canEdit && onEdit ? (_jsx("button", { type: "button", className: "vertebr-btn vertebr-btn-primary", onClick: onEdit, children: "Edit" })) : null, _jsx("button", { type: "button", className: "vertebr-btn", onClick: onClose, "aria-label": "Close", children: "Close" })] }), children: [heading, heading === "Record" && isToken(title) ? (_jsx("span", { className: "vertebr-modal-id", title: title, children: title })) : null] }), _jsxs(DialogContent, { children: [hero ? (_jsx("div", { className: "vertebr-modal-hero", children: _jsx("img", { src: hero, alt: "" }) })) : null, _jsx("dl", { className: "vertebr-modal-fields", children: fieldsToShow.map(({ key, value, span }) => (_jsxs("div", { className: "vertebr-modal-field", "data-span": span ? "full" : undefined, children: [_jsx("dt", { children: schema[key]?.label ?? humanizeKey(key) }), _jsx("dd", { children: _jsx(ResourceCell, { fieldKey: key, field: schema[key], value: value, variant: "detail" }) })] }, key))) })] })] }));
44
106
  }
package/dist/index.d.ts CHANGED
@@ -12,6 +12,10 @@ export type { EmailsLibraryPanelProps } from "./components/emails/EmailsLibraryP
12
12
  export type { EmailsActivityPanelProps } from "./components/emails/EmailsActivityPanel";
13
13
  export { ResourcePanel, ResourceTable } from "./components/resources/ResourceTable";
14
14
  export { SortableHeader } from "./components/resources/SortableHeader";
15
+ export { SelectionTableDialog } from "./components/dialog/SelectionTableDialog";
16
+ export { Dialog, DialogActions, DialogContent, DialogTitle, } from "./components/dialog/Dialog";
17
+ export type { DialogActionsProps, DialogContentProps, DialogMaxWidth, DialogProps, DialogTitleProps, } from "./components/dialog/Dialog";
18
+ export type { SelectionTableDialogProps, SelectionTableDialogOverrides, SelectionTableRow, SelectionTableColumnLabels, } from "./components/dialog/SelectionTableDialog";
15
19
  export { compareFieldValues, nextTableSort, sortRows, type SortOrder, type TableSortState, } from "./lib/sort";
16
20
  export { ThemeToggle } from "./components/theme/ThemeToggle";
17
21
  export type { ThemeToggleProps } from "./components/theme/ThemeToggle";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -6,6 +6,8 @@ export { FontPickerField } from "./components/fonts/FontPickerField";
6
6
  export { EmailsBoard } from "./components/emails/EmailsBoard";
7
7
  export { ResourcePanel, ResourceTable } from "./components/resources/ResourceTable";
8
8
  export { SortableHeader } from "./components/resources/SortableHeader";
9
+ export { SelectionTableDialog } from "./components/dialog/SelectionTableDialog";
10
+ export { Dialog, DialogActions, DialogContent, DialogTitle, } from "./components/dialog/Dialog";
9
11
  export { compareFieldValues, nextTableSort, sortRows, } from "./lib/sort";
10
12
  export { ThemeToggle } from "./components/theme/ThemeToggle";
11
13
  export { ConfigForm } from "./components/config/ConfigForm";
@@ -94,6 +94,19 @@
94
94
  font-family: var(--vb-mono);
95
95
  }
96
96
 
97
+ .vertebr-cell-token {
98
+ display: block;
99
+ max-width: 100%;
100
+ margin: 0;
101
+ font-family: var(--vb-mono);
102
+ font-size: 0.78rem;
103
+ line-height: 1.45;
104
+ color: var(--vb-text);
105
+ white-space: normal;
106
+ overflow-wrap: anywhere;
107
+ word-break: break-word;
108
+ }
109
+
97
110
  .vertebr-cell-json {
98
111
  display: inline-block;
99
112
  max-width: 14rem;
@@ -14,6 +14,7 @@
14
14
  @import "./columns.css";
15
15
  @import "./cells.css";
16
16
  @import "./modal.css";
17
+ @import "./selection-dialog.css";
17
18
  @import "./mail.css";
18
19
  @import "./emails.css";
19
20
  @import "./form.css";
@@ -5,9 +5,11 @@
5
5
  inset: 0;
6
6
  /* Above shell chrome, toasts (100), and command palette (90). */
7
7
  z-index: 200;
8
- display: grid;
9
- place-items: center;
10
- padding: 1.25rem;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ padding: 2rem;
12
+ overflow: auto;
11
13
  background: color-mix(in srgb, var(--vb-bg) 55%, rgba(0, 0, 0, 0.45));
12
14
  backdrop-filter: blur(6px);
13
15
  animation: vb-fade-in var(--vb-duration-normal) var(--vb-ease);
@@ -15,7 +17,10 @@
15
17
 
16
18
  .vertebr-modal {
17
19
  width: min(100%, 720px);
18
- max-height: min(88vh, 860px);
20
+ min-width: 0;
21
+ min-height: 0;
22
+ max-width: min(100%, calc(100vw - 4rem));
23
+ max-height: calc(100dvh - 4rem);
19
24
  display: flex;
20
25
  flex-direction: column;
21
26
  overflow: hidden;
@@ -28,6 +33,64 @@
28
33
  animation: vb-pop-in var(--vb-duration-normal) var(--vb-ease);
29
34
  }
30
35
 
36
+ /* MUI-style paper: hug content up to maxWidth, scroll the body. */
37
+ .vertebr-dialog {
38
+ width: fit-content;
39
+ max-height: calc(100dvh - 4rem);
40
+ }
41
+
42
+ .vertebr-dialog[data-max-width="xs"] {
43
+ max-width: min(27.75rem, 100%);
44
+ }
45
+ .vertebr-dialog[data-max-width="sm"] {
46
+ max-width: min(37.5rem, 100%);
47
+ }
48
+ .vertebr-dialog[data-max-width="md"] {
49
+ max-width: min(56.25rem, 100%);
50
+ }
51
+ .vertebr-dialog[data-max-width="lg"] {
52
+ max-width: min(75rem, 100%);
53
+ }
54
+ .vertebr-dialog[data-max-width="xl"] {
55
+ max-width: min(96rem, 100%);
56
+ }
57
+
58
+ .vertebr-dialog[data-full-width="true"] {
59
+ width: 100%;
60
+ }
61
+
62
+ .vertebr-dialog-content {
63
+ flex: 1 1 auto;
64
+ min-width: 0;
65
+ min-height: 0;
66
+ overflow-x: auto;
67
+ overflow-y: auto;
68
+ }
69
+
70
+ .vertebr-dialog-content-dividers {
71
+ border-top: 1px solid var(--vb-border);
72
+ border-bottom: 1px solid var(--vb-border);
73
+ }
74
+
75
+ .vertebr-dialog-actions {
76
+ display: flex;
77
+ flex: none;
78
+ justify-content: flex-end;
79
+ gap: 0.45rem;
80
+ padding: 0.85rem 1.25rem 1.05rem;
81
+ border-top: 1px solid var(--vb-border);
82
+ }
83
+
84
+ .vertebr-dialog-title h2 {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 0.35rem;
88
+ }
89
+
90
+ .vertebr-record-modal {
91
+ container-type: inline-size;
92
+ }
93
+
31
94
  .vertebr-modal-form {
32
95
  width: min(100%, 960px);
33
96
  max-height: min(92vh, 920px);
@@ -51,15 +114,34 @@
51
114
  align-items: flex-start;
52
115
  justify-content: space-between;
53
116
  gap: 1rem;
117
+ flex: none;
54
118
  padding: 1.15rem 1.25rem;
55
119
  border-bottom: 1px solid var(--vb-border);
56
120
  background: var(--vb-surface-tint);
57
121
  }
58
122
 
123
+ .vertebr-modal-heading {
124
+ flex: 1 1 auto;
125
+ min-width: 0;
126
+ }
127
+
59
128
  .vertebr-modal-heading h2 {
60
129
  margin: 0.15rem 0 0;
61
130
  font-size: 1.25rem;
62
131
  letter-spacing: -0.02em;
132
+ overflow-wrap: anywhere;
133
+ line-height: 1.3;
134
+ }
135
+
136
+ .vertebr-modal-id {
137
+ margin: 0.35rem 0 0;
138
+ overflow: hidden;
139
+ font-family: var(--vb-mono);
140
+ font-size: 0.75rem;
141
+ line-height: 1.4;
142
+ color: var(--vb-text-subtle);
143
+ text-overflow: ellipsis;
144
+ white-space: nowrap;
63
145
  }
64
146
 
65
147
  .vertebr-modal-eyebrow {
@@ -73,12 +155,17 @@
73
155
 
74
156
  .vertebr-modal-actions {
75
157
  display: flex;
158
+ flex: none;
76
159
  flex-wrap: wrap;
77
160
  gap: 0.45rem;
78
161
  }
79
162
 
80
163
  .vertebr-modal-body {
81
- overflow: auto;
164
+ flex: 1 1 auto;
165
+ min-width: 0;
166
+ min-height: 0;
167
+ overflow-x: auto;
168
+ overflow-y: auto;
82
169
  padding: 1.25rem;
83
170
  display: flex;
84
171
  flex-direction: column;
@@ -102,20 +189,70 @@
102
189
  .vertebr-modal-fields {
103
190
  margin: 0;
104
191
  display: grid;
105
- grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
192
+ grid-template-columns: repeat(2, minmax(0, 1fr));
106
193
  gap: 0.9rem 1rem;
194
+ width: 100%;
195
+ }
196
+
197
+ @container (max-width: 36rem) {
198
+ .vertebr-modal-fields {
199
+ grid-template-columns: 1fr;
200
+ }
201
+ }
202
+
203
+ @media (max-width: 640px) {
204
+ .vertebr-modal-fields {
205
+ grid-template-columns: 1fr;
206
+ }
107
207
  }
108
208
 
109
209
  .vertebr-modal-field {
110
210
  display: grid;
111
211
  gap: 0.35rem;
112
- padding: 0.85rem 0.95rem;
212
+ padding: 0.85rem 0.95rem 1.25rem;
113
213
  border: 1px solid var(--vb-border);
114
214
  border-radius: var(--vb-radius);
115
215
  background: var(--vb-surface-tint);
116
216
  min-width: 0;
117
217
  }
118
218
 
219
+ .vertebr-modal-field[data-span="full"] {
220
+ grid-column: 1 / -1;
221
+ }
222
+
223
+ .vertebr-record-modal .vertebr-modal-fields {
224
+ gap: 1px;
225
+ flex: none;
226
+ border: 1px solid var(--vb-border);
227
+ border-radius: 12px;
228
+ background: var(--vb-border);
229
+ /* Square cells paint over the rounded border unless they are clipped to it.
230
+ The sheet is as tall as its rows, so this only trims the corners. */
231
+ overflow: clip;
232
+ }
233
+
234
+ .vertebr-record-modal .vertebr-modal-field {
235
+ gap: 0.35rem;
236
+ padding: 0.8rem 1rem 1.15rem;
237
+ border: 0;
238
+ border-radius: 0;
239
+ background: var(--vb-bg-elevated);
240
+ }
241
+
242
+ /* Last row sits above the sheet's bottom radius, so it needs extra room
243
+ or the values look cut off. */
244
+ .vertebr-record-modal .vertebr-modal-field:last-child,
245
+ .vertebr-record-modal .vertebr-modal-fields > .vertebr-modal-field:nth-last-child(2):not([data-span="full"]) {
246
+ padding-bottom: 1.85rem;
247
+ }
248
+
249
+ /* The On pill is inline-flex. Margin under it does not grow the line box,
250
+ and overflow:hidden on the cell used to clip it, so the divider stayed put. */
251
+ .vertebr-record-modal .vertebr-modal-field dd {
252
+ display: block;
253
+ padding-bottom: 0;
254
+ }
255
+
119
256
  .vertebr-modal-field dt {
120
257
  margin: 0;
121
258
  font-family: var(--vb-mono);
@@ -128,6 +265,34 @@
128
265
  .vertebr-modal-field dd {
129
266
  margin: 0;
130
267
  min-width: 0;
268
+ max-width: 100%;
269
+ overflow-wrap: anywhere;
270
+ word-break: break-word;
271
+ line-height: 1.4;
272
+ }
273
+
274
+ .vertebr-modal-field dd > * {
275
+ max-width: 100%;
276
+ min-width: 0;
277
+ }
278
+
279
+ .vertebr-modal-field .vertebr-cell-text,
280
+ .vertebr-modal-field .vertebr-cell-link,
281
+ .vertebr-modal-field .vertebr-cell-json,
282
+ .vertebr-modal-field .vertebr-cell-prose,
283
+ .vertebr-modal-field .vertebr-cell-datetime,
284
+ .vertebr-modal-field .vertebr-cell-number,
285
+ .vertebr-modal-field .vertebr-cell-money {
286
+ display: block;
287
+ max-width: 100%;
288
+ overflow: visible;
289
+ text-overflow: unset;
290
+ white-space: normal;
291
+ overflow-wrap: anywhere;
292
+ }
293
+
294
+ .vertebr-modal-field .vertebr-chip-row {
295
+ max-width: none;
131
296
  }
132
297
 
133
298
  .vertebr-picker-body {
@@ -0,0 +1,170 @@
1
+ /* ── Selection table dialog (Sync pickers, multi-select tables) ─ */
2
+
3
+ .vertebr-selection-dialog {
4
+ width: min(52rem, calc(100vw - 2rem));
5
+ max-height: min(40rem, calc(100vh - 2rem));
6
+ display: flex;
7
+ flex-direction: column;
8
+ }
9
+
10
+ .vertebr-selection-dialog-head {
11
+ align-items: flex-start;
12
+ flex: 0 0 auto;
13
+ }
14
+
15
+ .vertebr-selection-dialog-sub {
16
+ margin: 0.4rem 0 0;
17
+ max-width: 40rem;
18
+ font-size: var(--vb-font-size-100);
19
+ color: var(--vb-text-muted);
20
+ line-height: 1.45;
21
+ }
22
+
23
+ .vertebr-selection-dialog-body {
24
+ flex: 1 1 auto;
25
+ min-height: 0;
26
+ display: flex;
27
+ flex-direction: column;
28
+ overflow: hidden;
29
+ border-top: 1px solid var(--vb-border-subdued);
30
+ }
31
+
32
+ .vertebr-selection-dialog-toolbar {
33
+ flex-wrap: wrap;
34
+ gap: 0.55rem 0.75rem;
35
+ align-items: center;
36
+ }
37
+
38
+ .vertebr-selection-dialog-toolbar .vertebr-table-toolbar-start {
39
+ flex: 1 1 auto;
40
+ min-width: 0;
41
+ gap: 0.45rem;
42
+ }
43
+
44
+ .vertebr-selection-dialog-toolbar-end {
45
+ display: inline-flex;
46
+ flex-wrap: wrap;
47
+ align-items: center;
48
+ gap: 0.45rem;
49
+ margin-left: auto;
50
+ }
51
+
52
+ .vertebr-selection-dialog-source {
53
+ font-size: var(--vb-font-size-100);
54
+ color: var(--vb-text-subtle);
55
+ white-space: nowrap;
56
+ padding-right: 0.25rem;
57
+ }
58
+
59
+ .vertebr-selection-dialog .vertebr-table-filter-menu {
60
+ z-index: 50;
61
+ }
62
+
63
+ .vertebr-selection-dialog-body .vertebr-table-wrap {
64
+ flex: 1 1 auto;
65
+ min-height: 0;
66
+ border: 0;
67
+ border-radius: 0;
68
+ }
69
+
70
+ .vertebr-selection-dialog-body .vertebr-empty {
71
+ margin: 1.25rem;
72
+ }
73
+
74
+ .vertebr-env-chips {
75
+ display: inline-flex;
76
+ flex-wrap: wrap;
77
+ gap: 0.35rem;
78
+ }
79
+
80
+ .vertebr-env-chip {
81
+ display: inline-flex;
82
+ align-items: center;
83
+ gap: 0.35rem;
84
+ padding: 0.2rem 0.55rem 0.2rem 0.4rem;
85
+ border-radius: 999px;
86
+ border: 1px solid var(--vb-border-subdued);
87
+ background: var(--vb-bg-muted);
88
+ color: var(--vb-text-subtle);
89
+ font-size: 0.72rem;
90
+ font-weight: var(--vb-font-weight-medium);
91
+ letter-spacing: 0.01em;
92
+ line-height: 1.2;
93
+ white-space: nowrap;
94
+ }
95
+
96
+ .vertebr-env-chip-dot {
97
+ width: 0.45rem;
98
+ height: 0.45rem;
99
+ border-radius: 50%;
100
+ background: var(--vb-border-strong);
101
+ flex: 0 0 auto;
102
+ }
103
+
104
+ .vertebr-env-chip[data-on="true"] {
105
+ border-color: color-mix(in srgb, var(--vb-accent) 35%, var(--vb-border));
106
+ background: color-mix(in srgb, var(--vb-accent) 12%, var(--vb-bg-elevated));
107
+ color: var(--vb-text);
108
+ }
109
+
110
+ .vertebr-env-chip[data-on="true"] .vertebr-env-chip-dot {
111
+ background: var(--vb-accent);
112
+ }
113
+
114
+ .vertebr-env-chip[data-on="true"][data-tone="danger"] {
115
+ border-color: color-mix(in srgb, var(--vb-danger, #b42318) 40%, var(--vb-border));
116
+ background: color-mix(
117
+ in srgb,
118
+ var(--vb-danger, #b42318) 10%,
119
+ var(--vb-bg-elevated)
120
+ );
121
+ }
122
+
123
+ .vertebr-env-chip[data-on="true"][data-tone="danger"] .vertebr-env-chip-dot {
124
+ background: var(--vb-danger, #b42318);
125
+ }
126
+
127
+ .vertebr-env-chip[data-on="false"] {
128
+ opacity: 0.72;
129
+ }
130
+
131
+ .vertebr-selection-dialog-table tbody tr {
132
+ cursor: pointer;
133
+ }
134
+
135
+ .vertebr-selection-dialog-table tbody tr[data-selected="true"] {
136
+ background: color-mix(in srgb, var(--vb-accent) 8%, transparent);
137
+ box-shadow: inset 3px 0 0 var(--vb-accent);
138
+ }
139
+
140
+ .vertebr-selection-dialog-col-check {
141
+ width: 2.25rem;
142
+ text-align: center;
143
+ }
144
+
145
+ .vertebr-selection-dialog-primary {
146
+ font-family: var(--vb-font-mono, ui-monospace, monospace);
147
+ font-size: 0.92em;
148
+ font-weight: var(--vb-font-weight-semibold);
149
+ }
150
+
151
+ .vertebr-selection-dialog-foot {
152
+ display: flex;
153
+ flex-wrap: wrap;
154
+ align-items: center;
155
+ justify-content: space-between;
156
+ gap: var(--vb-space-300);
157
+ flex: 0 0 auto;
158
+ }
159
+
160
+ .vertebr-selection-dialog-foot-meta {
161
+ font-size: var(--vb-font-size-100);
162
+ color: var(--vb-text-muted);
163
+ }
164
+
165
+ .vertebr-selection-dialog-foot-actions {
166
+ display: flex;
167
+ flex-wrap: wrap;
168
+ gap: var(--vb-space-200);
169
+ margin-left: auto;
170
+ }