@viglet/viglet-design-system 2026.3.13 → 2026.3.15

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 (53) hide show
  1. package/README.md +35 -7
  2. package/dist/bento/bento-entity-shell.d.ts +9 -1
  3. package/dist/bento/bento-entity-shell.d.ts.map +1 -1
  4. package/dist/bento/bento-form-hero.d.ts +1 -1
  5. package/dist/bento/bento-form-hero.d.ts.map +1 -1
  6. package/dist/bento/bento-hero.d.ts +14 -1
  7. package/dist/bento/bento-hero.d.ts.map +1 -1
  8. package/dist/bento/bento-list-page.d.ts +43 -11
  9. package/dist/bento/bento-list-page.d.ts.map +1 -1
  10. package/dist/bento/bento-nav-rail.d.ts +8 -2
  11. package/dist/bento/bento-nav-rail.d.ts.map +1 -1
  12. package/dist/bento/bento-nav.d.ts +7 -0
  13. package/dist/bento/bento-nav.d.ts.map +1 -1
  14. package/dist/bento/bento-shell.d.ts +5 -3
  15. package/dist/bento/bento-shell.d.ts.map +1 -1
  16. package/dist/bento/bento-trail.d.ts +27 -0
  17. package/dist/bento/bento-trail.d.ts.map +1 -0
  18. package/dist/bento/index.d.ts +1 -0
  19. package/dist/bento/index.d.ts.map +1 -1
  20. package/dist/bento.cjs +4 -4
  21. package/dist/bento.css +3 -3
  22. package/dist/bento.es.js +1101 -973
  23. package/dist/catalogue.json +102 -18
  24. package/dist/components/ui/index.d.ts +1 -1
  25. package/dist/components/ui/index.d.ts.map +1 -1
  26. package/dist/components/ui/viglet-assistant.d.ts +11 -1
  27. package/dist/components/ui/viglet-assistant.d.ts.map +1 -1
  28. package/dist/exports.json +7 -1
  29. package/dist/i18n/index.d.ts +8 -0
  30. package/dist/i18n/index.d.ts.map +1 -1
  31. package/dist/i18n/locales/en/bento.json.d.ts +6 -2
  32. package/dist/i18n/locales/pt/bento.json.d.ts +6 -2
  33. package/dist/i18n.cjs +1 -1
  34. package/dist/i18n.es.js +12 -4
  35. package/dist/index.cjs +1 -1
  36. package/dist/index.es.js +762 -718
  37. package/dist/lib/corner-slot.d.ts +11 -0
  38. package/dist/lib/corner-slot.d.ts.map +1 -1
  39. package/dist/{user.context-D3kmD3_y.js → user.context-DUs2lT6D.js} +201 -197
  40. package/dist/user.context-uYif5Mp2.cjs +1 -0
  41. package/dist/viglet-design-system.css +1 -1
  42. package/docs/BENTO-AUTHORING.md +18 -10
  43. package/docs/reference/README.md +9 -1
  44. package/docs/reference/canvas.json +1 -1
  45. package/docs/reference/detail.dc.html +18 -22
  46. package/docs/reference/form-hero.dc.html +11 -14
  47. package/docs/reference/list.dc.html +74 -56
  48. package/docs/reference/page-anatomy.dc.html +10 -9
  49. package/docs/reference/panel.dc.html +8 -6
  50. package/docs/reference/shell.dc.html +7 -4
  51. package/docs/reference/split.dc.html +8 -13
  52. package/package.json +2 -1
  53. package/dist/user.context-gQvBxcwr.cjs +0 -1
@@ -42,10 +42,12 @@ and the palette is the mobile one, and a second eats the width the content needs
42
42
  not a home for one surface's controls: a switcher or a pending count belongs to the surface
43
43
  that owns it, not to every page that renders beneath it.
44
44
 
45
- **The corner is the shell's.** The assistant dock, passed as `dock`, takes it, and
46
- `BentoBackToTop` stacks above the dock. Neither is fixed to the viewport inside the shell:
47
- two components each pinning themselves to one corner is how the dock came to cover the
48
- button.
45
+ **The corner and the dock's place are the shell's.** Pass the assistant as `dock`. With a
46
+ rail it rests at the rail's foot and opens beside the rail; on a phone it sits at the
47
+ header's trailing edge; with neither it takes the corner. `BentoBackToTop` keeps the
48
+ corner. Nothing is fixed to the viewport inside the shell. Two components each pinning
49
+ themselves to one corner is how the dock came to cover the button, and a corner that
50
+ reserves no room is how it came to cover the column's last row actions.
49
51
 
50
52
  **The shell owns the reading column.** `main` sets the max width, the gutters and the
51
53
  vertical rhythm once, so every page begins and ends on the same line; a page sets none of
@@ -83,12 +85,18 @@ receiving `{ staged, onStateChange }` and groups its fields in
83
85
  `BentoFormSection`s. Wire the query hooks in the page and put no shell mechanics
84
86
  there.
85
87
 
86
- **A list screen** is one `BentoListPage` call with a `renderTile`. Use
87
- `BentoEntityTile` for the common icon-chip + status-pill + title + meta shape;
88
- hand-roll a tile only when the entity genuinely needs a different layout.
89
-
90
- A list a reader sorts, selects a range of and acts on in bulk, or one that runs
91
- to thousands of rows, is `BentoDataTable` instead. It mounts only the visible rows,
88
+ **A list screen** is one `BentoListPage` call, and by default it is a table. Ask
89
+ first whether the reader arrives to **compare many** or to **pick one**. Comparing
90
+ is rows: users, roles, tokens, webhooks, providers, anything a reader scans down a
91
+ column. Pass `columns` (and `rowActions`, `onRowOpen`), and the page renders a
92
+ `BentoDataTable` under its hero with the create action as the hero's one primary.
93
+ An empty list is one inline card. Picking is tiles: media, blueprints, a hub, or a
94
+ handful of things a reader tells apart by sight. Pass `renderTile` to ask for the
95
+ mosaic, and use `BentoEntityTile` for the common tile shape. Hand-roll a tile only
96
+ when the entity genuinely needs a different layout.
97
+
98
+ A table with selection and bulk actions, or one inside a page that already has its
99
+ own hero, is `BentoDataTable` on its own. It mounts only the visible rows,
92
100
  its headers sort and say how, a row is reachable and selectable from the keyboard,
93
101
  and row actions are a menu of named items. Pass the rows, the columns and the
94
102
  actions, and store the column layout it reports. Never build a table from `Table`
@@ -18,12 +18,20 @@ prose. Where the two disagree, the contract is right and an artboard is stale.
18
18
  | The shapes | `list.dc.html` | a list screen, and the discriminator between tiles and rows |
19
19
  | The shapes | `detail.dc.html` | a detail screen, and the save-bar morph at both ends of the scroll |
20
20
  | The shapes | `form-hero.dc.html` | a form with no entity behind it yet |
21
- | The shapes | `panel.dc.html` | the frosted box with no heading, and why it has none |
21
+ | The shapes | `panel.dc.html` | the plain card with no heading, and why it has none |
22
22
  | The shapes | `grounds.dc.html` | the same components on both grounds, with the ratios |
23
23
  | The shapes | `split.dc.html` | a two-pane screen: who scrolls, who owns the ratio, and phone width |
24
24
 
25
25
  `canvas.json` places them and names the two pages.
26
26
 
27
+ **The shapes are drawn one step ahead of the components.** They show the quieter surface
28
+ that this package proposes, for review as a composition before any component changes. Panels
29
+ are solid cards, not frosted glass. The gradient chip names a thing, so it stays in an
30
+ entity hero and a hub's tiles and leaves rows, lists and form sections. Colour marks
31
+ state (published, draft, scheduled, changed, archived) as a dot and a word, not an
32
+ area. Until the components follow, a page built today still renders the glass and
33
+ the chips; the rule above, that the contract wins, applies again once they do.
34
+
27
35
  ## Two rules about the content
28
36
 
29
37
  **No product data.** Subjects are role labels — "Entity name", "Eyebrow", "Meta". A
@@ -110,7 +110,7 @@
110
110
  "x": 0,
111
111
  "y": -190,
112
112
  "w": 700,
113
- "text": "Almost every screen is one of four shapes plus data: a detail is BentoEntityShell wrapping a form, a list is one BentoListPage call with a renderTile, a form with no entity behind it yet is BentoFormHero as the first child of its form, and a form beside its preview is BentoSplitPage under one hero.\nThe panel is the fifth thing and not a shape: a frosted box with no heading, for whatever a hero already named.\nThe last artboard is the same components on both grounds, because one look means one look twice."
113
+ "text": "Almost every screen is one of four shapes plus data: a detail is BentoEntityShell wrapping a form, a list is one BentoListPage call with a renderTile, a form with no entity behind it yet is BentoFormHero as the first child of its form, and a form beside its preview is BentoSplitPage under one hero.\nThe panel is the fifth thing and not a shape: a plain card with no heading, for whatever a hero already named.\nThe last artboard is the same components on both grounds, because one look means one look twice."
114
114
  }
115
115
  ],
116
116
  "launch": { "view": "canvas", "page": "vds-shell" }
@@ -21,7 +21,15 @@
21
21
  .vg { font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; -webkit-font-smoothing: antialiased; }
22
22
  .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
23
23
  .eyebrow { font-size: 10.5px; font-weight: 600; letter-spacing: 0.09em; }
24
+ /* Frost is kept for the one surface content scrolls under: the save bar. */
24
25
  .glass { background: rgba(255,255,255,0.72); border: 1px solid rgba(229,229,229,0.7); backdrop-filter: blur(18px) saturate(180%); -webkit-backdrop-filter: blur(18px) saturate(180%); }
26
+ /* VDS182 — a solid card, not frosted glass: --card on --border. */
27
+ .card { background: #ffffff; border: 1px solid #e5e5e5; }
28
+ /* State, not area: a dot and a word, the shape BentoStatusMarker draws. */
29
+ .state { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: #404040; }
30
+ .state i { width: 6px; height: 6px; border-radius: 999px; }
31
+ .s-published i { background: #00bc7d; } .s-draft i { background: #62748e; } .s-scheduled i { background: #8e51ff; }
32
+ .s-changed i { background: #fe9a00; } .s-archived i { background: #d4d4d4; } .s-archived { color: #737373; }
25
33
  .chip { display: flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 11px; background-image: linear-gradient(to bottom right, #155dfc, #4f39f6); color: #ffffff; flex: 0 0 auto; }
26
34
  .field { height: 30px; border: 1px solid #e5e5e5; border-radius: 10px; background: #ffffff; }
27
35
  .flabel { font-size: 10px; color: #737373; margin-bottom: 4px; }
@@ -56,7 +64,7 @@
56
64
  <div style="display:flex;align-items:flex-start;gap:11px">
57
65
  <div class="chip" style="width:40px;height:40px;border-radius:13px"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><circle cx="12" cy="12" r="8"></circle></svg></div>
58
66
  <div style="flex:1;min-width:0">
59
- <div style="font-size:18px;font-weight:600;letter-spacing:-0.015em">Entity name</div>
67
+ <div style="display:flex;align-items:center;gap:9px"><div style="font-size:16px;font-weight:600;letter-spacing:-0.01em">Entity name</div><span class="state s-changed"><i></i>Changed</span></div>
60
68
  <div style="font-size:11.5px;color:#737373;margin-top:2px">Description. Icon, title, description and enabled state are all here.</div>
61
69
  </div>
62
70
  <div style="display:flex;align-items:center;gap:7px">
@@ -71,22 +79,16 @@
71
79
  </div>
72
80
 
73
81
  <!-- form sections -->
74
- <div class="glass" style="border-radius:24px;padding:14px;margin-bottom:11px">
75
- <div style="display:flex;align-items:center;gap:9px;margin-bottom:11px">
76
- <div class="chip" style="width:26px;height:26px;border-radius:9px"></div>
77
- <div style="font-size:13px;font-weight:600">Field group</div>
78
- </div>
82
+ <div class="card" style="border-radius:24px;padding:14px;margin-bottom:11px">
83
+ <div style="font-size:13px;font-weight:600;margin-bottom:11px">Field group</div>
79
84
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
80
85
  <div><div class="flabel">Label</div><div class="field"></div></div>
81
86
  <div><div class="flabel">Label</div><div class="field"></div></div>
82
87
  <div style="grid-column:span 2"><div class="flabel">Label</div><div class="field" style="height:52px"></div></div>
83
88
  </div>
84
89
  </div>
85
- <div class="glass" style="border-radius:24px;padding:14px">
86
- <div style="display:flex;align-items:center;gap:9px;margin-bottom:11px">
87
- <div class="chip" style="width:26px;height:26px;border-radius:9px"></div>
88
- <div style="font-size:13px;font-weight:600">Field group</div>
89
- </div>
90
+ <div class="card" style="border-radius:24px;padding:14px">
91
+ <div style="font-size:13px;font-weight:600;margin-bottom:11px">Field group</div>
90
92
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
91
93
  <div><div class="flabel">Label</div><div class="field"></div></div>
92
94
  <div><div class="flabel">Label</div><div class="field"></div></div>
@@ -94,7 +96,7 @@
94
96
  </div>
95
97
  </div>
96
98
 
97
- <div style="font-size:11px;color:#404040;line-height:1.45">The form is a render prop taking <span class="mono" style="font-size:10.5px">{ staged, onStateChange }</span>. It groups fields and nothing else -- no shell mechanics, no identity field.</div>
99
+ <div style="font-size:11px;color:#404040;line-height:1.45">The form is a render prop taking <span class="mono" style="font-size:10.5px">{ staged, onStateChange }</span>. It groups fields and nothing else -- no shell mechanics, no identity field, and no chip: only the hero names the entity.</div>
98
100
  </div>
99
101
 
100
102
  <!-- scrolled -->
@@ -122,22 +124,16 @@
122
124
  </div>
123
125
  <div class="mono" style="position:absolute;right:20px;top:62px;z-index:5;font-size:9px;color:#1447e6">the same two controls, not a second pair</div>
124
126
 
125
- <div class="glass" style="border-radius:24px;padding:14px;margin-top:34px;margin-bottom:11px">
126
- <div style="display:flex;align-items:center;gap:9px;margin-bottom:11px">
127
- <div class="chip" style="width:26px;height:26px;border-radius:9px"></div>
128
- <div style="font-size:13px;font-weight:600">Field group</div>
129
- </div>
127
+ <div class="card" style="border-radius:24px;padding:14px;margin-top:34px;margin-bottom:11px">
128
+ <div style="font-size:13px;font-weight:600;margin-bottom:11px">Field group</div>
130
129
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
131
130
  <div><div class="flabel">Label</div><div class="field"></div></div>
132
131
  <div><div class="flabel">Label</div><div class="field" style="border-color:rgba(20,71,230,0.6)"></div></div>
133
132
  <div style="grid-column:span 2"><div class="flabel">Label</div><div class="field" style="height:52px"></div></div>
134
133
  </div>
135
134
  </div>
136
- <div class="glass" style="border-radius:24px;padding:14px">
137
- <div style="display:flex;align-items:center;gap:9px;margin-bottom:11px">
138
- <div class="chip" style="width:26px;height:26px;border-radius:9px"></div>
139
- <div style="font-size:13px;font-weight:600">Field group</div>
140
- </div>
135
+ <div class="card" style="border-radius:24px;padding:14px">
136
+ <div style="font-size:13px;font-weight:600;margin-bottom:11px">Field group</div>
141
137
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
142
138
  <div><div class="flabel">Label</div><div class="field"></div></div>
143
139
  <div><div class="flabel">Label</div><div class="field"></div></div>
@@ -21,8 +21,11 @@
21
21
  .vg { font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; -webkit-font-smoothing: antialiased; }
22
22
  .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
23
23
  .eyebrow { font-size: 10.5px; font-weight: 600; letter-spacing: 0.09em; }
24
- .glass { background: rgba(255,255,255,0.72); border: 1px solid rgba(229,229,229,0.7); backdrop-filter: blur(18px) saturate(180%); -webkit-backdrop-filter: blur(18px) saturate(180%); }
25
- .chip { display: flex; align-items: center; justify-content: center; border-radius: 11px; background-image: linear-gradient(to bottom right, #155dfc, #4f39f6); color: #ffffff; flex: 0 0 auto; }
24
+ /* VDS182 — a solid card, not frosted glass: --card on --border. */
25
+ .card { background: #ffffff; border: 1px solid #e5e5e5; }
26
+ /* No entity exists yet, so there is no identity for the gradient chip to
27
+ carry: the form's own hero takes the neutral well. */
28
+ .well { display: flex; align-items: center; justify-content: center; border-radius: 11px; background: #f5f5f5; border: 1px solid #ededed; color: #525252; flex: 0 0 auto; }
26
29
  .field { height: 30px; border: 1px solid #e5e5e5; border-radius: 10px; background: #ffffff; }
27
30
  .flabel { font-size: 10px; color: #737373; margin-bottom: 4px; }
28
31
  .btn { display: inline-flex; align-items: center; height: 30px; padding: 0 12px; border-radius: 10px; font-size: 12px; font-weight: 500; }
@@ -50,10 +53,10 @@
50
53
  <div style="border:1px dashed rgba(20,71,230,0.4);border-radius:14px;padding:12px;margin:14px 0;position:relative">
51
54
  <div class="mono" style="position:absolute;right:9px;top:-8px;background:#ffffff;padding:0 5px;font-size:9px;color:#1447e6">BentoFormHero -- first child</div>
52
55
  <div style="display:flex;align-items:flex-start;gap:11px">
53
- <div class="chip" style="width:40px;height:40px;border-radius:13px"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><path d="M5 12h14M12 5v14"></path></svg></div>
56
+ <div class="well" style="width:40px;height:40px;border-radius:13px"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><path d="M5 12h14M12 5v14"></path></svg></div>
54
57
  <div style="flex:1;min-width:0">
55
58
  <div style="font-size:10px;color:#737373;letter-spacing:0.05em;font-weight:600">EYEBROW</div>
56
- <div style="font-size:18px;font-weight:600;letter-spacing:-0.015em;margin-top:2px">New entity</div>
59
+ <div style="font-size:16px;font-weight:600;letter-spacing:-0.01em;margin-top:2px">New entity</div>
57
60
  <div style="font-size:11.5px;color:#737373;margin-top:2px">A form with no entity behind it yet, so the hero is the form's.</div>
58
61
  </div>
59
62
  <div style="display:flex;align-items:center;gap:7px">
@@ -63,22 +66,16 @@
63
66
  </div>
64
67
  </div>
65
68
 
66
- <div class="glass" style="border-radius:24px;padding:14px;margin-bottom:11px">
67
- <div style="display:flex;align-items:center;gap:9px;margin-bottom:11px">
68
- <div class="chip" style="width:26px;height:26px;border-radius:9px"></div>
69
- <div style="font-size:13px;font-weight:600">Field group</div>
70
- </div>
69
+ <div class="card" style="border-radius:24px;padding:14px;margin-bottom:11px">
70
+ <div style="font-size:13px;font-weight:600;margin-bottom:11px">Field group</div>
71
71
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
72
72
  <div><div class="flabel">Label</div><div class="field"></div></div>
73
73
  <div><div class="flabel">Label</div><div class="field"></div></div>
74
74
  <div style="grid-column:span 2"><div class="flabel">Label</div><div class="field" style="height:48px"></div></div>
75
75
  </div>
76
76
  </div>
77
- <div class="glass" style="border-radius:24px;padding:14px">
78
- <div style="display:flex;align-items:center;gap:9px;margin-bottom:11px">
79
- <div class="chip" style="width:26px;height:26px;border-radius:9px"></div>
80
- <div style="font-size:13px;font-weight:600">Field group</div>
81
- </div>
77
+ <div class="card" style="border-radius:24px;padding:14px">
78
+ <div style="font-size:13px;font-weight:600;margin-bottom:11px">Field group</div>
82
79
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
83
80
  <div><div class="flabel">Label</div><div class="field"></div></div>
84
81
  <div><div class="flabel">Label</div><div class="field"></div></div>
@@ -21,9 +21,16 @@
21
21
  .vg { font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; -webkit-font-smoothing: antialiased; }
22
22
  .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
23
23
  .eyebrow { font-size: 10.5px; font-weight: 600; letter-spacing: 0.09em; }
24
- .glass { background: rgba(255,255,255,0.72); border: 1px solid rgba(229,229,229,0.7); backdrop-filter: blur(18px) saturate(180%); -webkit-backdrop-filter: blur(18px) saturate(180%); }
25
- .chip { display: flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 11px; background-image: linear-gradient(to bottom right, #155dfc, #4f39f6); color: #ffffff; flex: 0 0 auto; }
26
- .pill { display: inline-flex; align-items: center; gap: 5px; height: 19px; padding: 0 7px; border-radius: 999px; border: 1px solid rgba(0,188,125,0.4); background: rgba(0,188,125,0.1); color: #007a55; font-size: 10px; font-weight: 600; }
24
+ /* VDS182 — a solid card, not frosted glass: --card on --border. */
25
+ .card { background: #ffffff; border: 1px solid #e5e5e5; }
26
+ /* Where nothing single is named, the icon sits in a neutral well; the
27
+ gradient chip is kept for an entity hero and a hub's tiles. */
28
+ .well { display: flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 11px; background: #f5f5f5; border: 1px solid #ededed; color: #525252; flex: 0 0 auto; }
29
+ /* State, not area: a dot and a word, the shape BentoStatusMarker draws. */
30
+ .state { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: #404040; }
31
+ .state i { width: 6px; height: 6px; border-radius: 999px; }
32
+ .s-published i { background: #00bc7d; } .s-draft i { background: #62748e; } .s-scheduled i { background: #8e51ff; }
33
+ .s-changed i { background: #fe9a00; } .s-archived i { background: #d4d4d4; } .s-archived { color: #737373; }
27
34
  .row { display: grid; grid-template-columns: 1fr 92px 74px 60px; gap: 12px; align-items: center; padding: 7px 14px; border-bottom: 1px solid #f4f4f4; font-size: 11.5px; }
28
35
  </style>
29
36
  </helmet>
@@ -34,108 +41,119 @@
34
41
  <div class="eyebrow" style="color:#1447e6">REFERENCE</div>
35
42
  <div style="display:flex;align-items:baseline;gap:12px;margin-top:4px">
36
43
  <div style="font-size:21px;font-weight:600;letter-spacing:-0.015em">A list screen, and when it is not tiles</div>
37
- <div style="font-size:12.5px;color:#737373">One <span class="mono" style="font-size:12px">BentoListPage</span> call with a <span class="mono" style="font-size:12px">renderTile</span>. The same entities, twice.</div>
44
+ <div style="font-size:12.5px;color:#737373">One <span class="mono" style="font-size:12px">BentoListPage</span> call: a table by default, tiles when the page passes <span class="mono" style="font-size:12px">renderTile</span>. The same entities, twice.</div>
38
45
  </div>
39
46
  </div>
40
47
 
41
48
  <div style="flex:1;min-height:0;display:grid;grid-template-columns:1fr 1fr;gap:20px;padding:14px 24px 0">
42
49
 
43
- <!-- tiles -->
50
+ <!-- rows -->
44
51
  <div style="display:flex;flex-direction:column;gap:9px;min-height:0">
45
52
  <div style="display:flex;align-items:center;gap:9px">
46
- <span style="display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 9px;border-radius:999px;border:1px solid rgba(20,71,230,0.4);background:rgba(20,71,230,0.08);color:#1447e6;font-size:11px;font-weight:600">arrive to pick one</span>
47
- <span class="mono" style="font-size:10.5px;color:#737373">BentoEntityTile</span>
53
+ <span style="display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 9px;border-radius:999px;border:1px solid rgba(254,154,0,0.45);background:rgba(254,154,0,0.1);color:#973c00;font-size:11px;font-weight:600">the default: arrive to compare many</span>
54
+ <span class="mono" style="font-size:10.5px;color:#737373">BentoListPage with columns</span>
48
55
  </div>
49
56
 
50
57
  <div style="flex:1;min-height:0;border-radius:14px;background:#ffffff;border:1px solid #e5e5e5;padding:16px;overflow:hidden">
51
- <!-- hero -->
52
58
  <div style="display:flex;align-items:flex-start;gap:12px;margin-bottom:16px">
53
- <div class="chip" style="width:42px;height:42px;border-radius:13px"><svg width="21" height="21" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><rect x="4" y="4" width="7" height="7" rx="2"></rect><rect x="13" y="4" width="7" height="7" rx="2"></rect><rect x="4" y="13" width="7" height="7" rx="2"></rect></svg></div>
59
+ <div class="well" style="width:42px;height:42px;border-radius:13px"><svg width="21" height="21" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><path d="M9 6h11M9 12h11M9 18h11"></path><path d="M4.5 6h.01M4.5 12h.01M4.5 18h.01"></path></svg></div>
54
60
  <div style="flex:1;min-width:0">
55
61
  <div style="font-size:10px;color:#737373;letter-spacing:0.05em;font-weight:600">EYEBROW</div>
56
- <div style="font-size:19px;font-weight:600;letter-spacing:-0.015em;margin-top:2px">Collection name</div>
62
+ <div style="font-size:16px;font-weight:600;letter-spacing:-0.01em;margin-top:2px">Collection name</div>
57
63
  <div style="font-size:11.5px;color:#737373;margin-top:2px">One sentence of subtitle, which the shell does not own.</div>
58
64
  </div>
59
65
  <div style="display:inline-flex;align-items:center;height:30px;padding:0 12px;border-radius:10px;background:#171717;color:#fafafa;font-size:12px;font-weight:500">New</div>
60
66
  </div>
61
67
 
62
- <!-- mosaic: spans in multiples of two -->
63
- <div style="display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));gap:11px">
64
- <div class="glass" style="grid-column:span 4;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:8px;height:118px">
65
- <div class="chip"></div>
66
- <div style="font-size:12.5px;font-weight:600">Entity name</div>
67
- <div style="font-size:10.5px;color:#737373;line-height:1.35">Description, two lines at most, from the entity itself.</div>
68
- <div style="flex:1"></div>
69
- <div><span class="pill"><span style="width:5px;height:5px;border-radius:999px;background:#00bc7d"></span>Status</span></div>
70
- </div>
71
- <div class="glass" style="grid-column:span 2;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:7px;height:118px">
72
- <div class="chip"></div>
73
- <div style="font-size:12.5px;font-weight:600">Entity name</div>
74
- <div style="flex:1"></div>
75
- <div style="font-size:10px;color:#737373">Meta</div>
76
- </div>
77
- <div class="glass" style="grid-column:span 2;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:7px;height:104px">
78
- <div class="chip" style="width:28px;height:28px;border-radius:9px"></div>
79
- <div style="font-size:12px;font-weight:600">Entity name</div>
80
- <div style="flex:1"></div>
81
- <div style="font-size:10px;color:#737373">Meta</div>
82
- </div>
83
- <div class="glass" style="grid-column:span 2;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:7px;height:104px">
84
- <div class="chip" style="width:28px;height:28px;border-radius:9px"></div>
85
- <div style="font-size:12px;font-weight:600">Entity name</div>
86
- <div style="flex:1"></div>
87
- <div style="font-size:10px;color:#737373">Meta</div>
68
+ <div class="card" style="border-radius:24px;overflow:hidden">
69
+ <div class="row" style="background:rgba(245,245,245,0.6);font-size:9.5px;font-weight:600;letter-spacing:0.06em;color:#737373;border-bottom:1px solid #ededed">
70
+ <div>ENTITY</div><div>META</div><div>STATE</div><div></div>
88
71
  </div>
89
- <div style="grid-column:span 2;border-radius:24px;height:104px;border:1px dashed #d4d4d4;display:flex;align-items:center;justify-content:center;color:#a1a1a1;font-size:11.5px">New</div>
72
+ <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="state s-published"><i></i>Published</span></div><div style="color:#a1a1a1">…</div></div>
73
+ <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="state s-published"><i></i>Published</span></div><div style="color:#a1a1a1">…</div></div>
74
+ <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="state s-changed"><i></i>Changed</span></div><div style="color:#a1a1a1">…</div></div>
75
+ <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="state s-draft"><i></i>Draft</span></div><div style="color:#a1a1a1">…</div></div>
76
+ <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="state s-scheduled"><i></i>Scheduled</span></div><div style="color:#a1a1a1">…</div></div>
77
+ <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="state s-published"><i></i>Published</span></div><div style="color:#a1a1a1">…</div></div>
78
+ <div class="row" style="border-bottom:none"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="state s-archived"><i></i>Archived</span></div><div style="color:#a1a1a1">…</div></div>
90
79
  </div>
91
80
  </div>
92
81
 
93
- <div style="font-size:11px;color:#404040;line-height:1.45">Spans in multiples of two, so the mosaic reflows without a gap at every breakpoint. The dashed tile is the one affordance the grid adds.</div>
82
+ <div style="font-size:11px;color:#404040;line-height:1.45">Still the layer: the same hero, the same panel. A row carries no chip and no tone of its own; colour appears only where it says something, as one of five states.</div>
94
83
  </div>
95
84
 
96
- <!-- rows -->
85
+ <!-- tiles -->
97
86
  <div style="display:flex;flex-direction:column;gap:9px;min-height:0">
98
87
  <div style="display:flex;align-items:center;gap:9px">
99
- <span style="display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 9px;border-radius:999px;border:1px solid rgba(254,154,0,0.45);background:rgba(254,154,0,0.1);color:#973c00;font-size:11px;font-weight:600">arrive to compare many</span>
100
- <span class="mono" style="font-size:10.5px;color:#737373">a table inside BentoPanel, contentClassName p-0</span>
88
+ <span style="display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 9px;border-radius:999px;border:1px solid rgba(20,71,230,0.4);background:rgba(20,71,230,0.08);color:#1447e6;font-size:11px;font-weight:600">the variant: arrive to pick one</span>
89
+ <span class="mono" style="font-size:10.5px;color:#737373">BentoListPage with renderTile, BentoEntityTile</span>
101
90
  </div>
102
91
 
103
92
  <div style="flex:1;min-height:0;border-radius:14px;background:#ffffff;border:1px solid #e5e5e5;padding:16px;overflow:hidden">
93
+ <!-- hero -->
104
94
  <div style="display:flex;align-items:flex-start;gap:12px;margin-bottom:16px">
105
- <div class="chip" style="width:42px;height:42px;border-radius:13px"><svg width="21" height="21" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><path d="M9 6h11M9 12h11M9 18h11"></path><path d="M4.5 6h.01M4.5 12h.01M4.5 18h.01"></path></svg></div>
95
+ <div class="well" style="width:42px;height:42px;border-radius:13px"><svg width="21" height="21" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><rect x="4" y="4" width="7" height="7" rx="2"></rect><rect x="13" y="4" width="7" height="7" rx="2"></rect><rect x="4" y="13" width="7" height="7" rx="2"></rect></svg></div>
106
96
  <div style="flex:1;min-width:0">
107
97
  <div style="font-size:10px;color:#737373;letter-spacing:0.05em;font-weight:600">EYEBROW</div>
108
- <div style="font-size:19px;font-weight:600;letter-spacing:-0.015em;margin-top:2px">Collection name</div>
98
+ <div style="font-size:16px;font-weight:600;letter-spacing:-0.01em;margin-top:2px">Collection name</div>
109
99
  <div style="font-size:11.5px;color:#737373;margin-top:2px">The same hero. Only what sits under it changed.</div>
110
100
  </div>
111
101
  <div style="display:inline-flex;align-items:center;height:30px;padding:0 12px;border-radius:10px;background:#171717;color:#fafafa;font-size:12px;font-weight:500">New</div>
112
102
  </div>
113
103
 
114
- <div class="glass" style="border-radius:24px;overflow:hidden">
115
- <div class="row" style="background:rgba(245,245,245,0.6);font-size:9.5px;font-weight:600;letter-spacing:0.06em;color:#737373;border-bottom:1px solid #ededed">
116
- <div>ENTITY</div><div>META</div><div>STATUS</div><div></div>
104
+ <!-- mosaic: spans in multiples of two -->
105
+ <div style="display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));gap:11px">
106
+ <div class="card" style="grid-column:span 2;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:7px;height:118px">
107
+ <div style="font-size:12.5px;font-weight:600">Entity name</div>
108
+ <div style="font-size:10.5px;color:#737373;line-height:1.35">Description, two lines at most, from the entity itself.</div>
109
+ <div style="flex:1"></div>
110
+ <div><span class="state s-published"><i></i>Published</span></div>
111
+ </div>
112
+ <div class="card" style="grid-column:span 2;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:7px;height:118px">
113
+ <div style="font-size:12.5px;font-weight:600">Entity name</div>
114
+ <div style="font-size:10.5px;color:#737373;line-height:1.35">Description from the entity.</div>
115
+ <div style="flex:1"></div>
116
+ <div><span class="state s-changed"><i></i>Changed</span></div>
117
+ </div>
118
+ <div class="card" style="grid-column:span 2;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:7px;height:118px">
119
+ <div style="font-size:12.5px;font-weight:600">Entity name</div>
120
+ <div style="flex:1"></div>
121
+ <div><span class="state s-draft"><i></i>Draft</span></div>
122
+ </div>
123
+ <div class="card" style="grid-column:span 2;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:7px;height:104px">
124
+ <div style="font-size:12px;font-weight:600">Entity name</div>
125
+ <div style="flex:1"></div>
126
+ <div><span class="state s-scheduled"><i></i>Scheduled</span></div>
127
+ </div>
128
+ <div class="card" style="grid-column:span 2;border-radius:24px;padding:13px;display:flex;flex-direction:column;gap:7px;height:104px">
129
+ <div style="font-size:12px;font-weight:600">Entity name</div>
130
+ <div style="flex:1"></div>
131
+ <div style="font-size:10px;color:#737373">Meta</div>
117
132
  </div>
118
- <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="pill"><span style="width:5px;height:5px;border-radius:999px;background:#00bc7d"></span>On</span></div><div style="color:#a1a1a1">…</div></div>
119
- <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="pill"><span style="width:5px;height:5px;border-radius:999px;background:#00bc7d"></span>On</span></div><div style="color:#a1a1a1">…</div></div>
120
- <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="pill" style="border-color:rgba(254,154,0,0.4);background:rgba(254,154,0,0.1);color:#973c00"><span style="width:5px;height:5px;border-radius:999px;background:#fe9a00"></span>Warn</span></div><div style="color:#a1a1a1">…</div></div>
121
- <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="pill"><span style="width:5px;height:5px;border-radius:999px;background:#00bc7d"></span>On</span></div><div style="color:#a1a1a1">…</div></div>
122
- <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="pill"><span style="width:5px;height:5px;border-radius:999px;background:#00bc7d"></span>On</span></div><div style="color:#a1a1a1">…</div></div>
123
- <div class="row"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="pill"><span style="width:5px;height:5px;border-radius:999px;background:#00bc7d"></span>On</span></div><div style="color:#a1a1a1">…</div></div>
124
- <div class="row" style="border-bottom:none"><div>Entity name</div><div style="color:#737373">Meta</div><div><span class="pill"><span style="width:5px;height:5px;border-radius:999px;background:#00bc7d"></span>On</span></div><div style="color:#a1a1a1">…</div></div>
133
+ <div style="grid-column:span 2;border-radius:24px;height:104px;border:1px dashed #d4d4d4;display:flex;align-items:center;justify-content:center;color:#a1a1a1;font-size:11.5px">New</div>
125
134
  </div>
126
135
  </div>
127
136
 
128
- <div style="font-size:11px;color:#404040;line-height:1.45">Still the layer: the hero is the hero, the frosted surface is the panel, the pills are the same intents. Density did not mean leaving.</div>
137
+ <div style="font-size:11px;color:#404040;line-height:1.45">Spans in multiples of two, so the mosaic reflows without a gap at every breakpoint. No tile is emphasised by default and none repeats the chip: a list names many things, not one. The dashed tile is the one affordance the grid adds.</div>
129
138
  </div>
130
139
  </div>
131
140
 
132
141
  <div style="margin:14px 24px 18px;border:1px solid #e5e5e5;background:#ffffff;border-radius:12px;padding:11px 14px;display:flex;gap:18px;align-items:flex-start">
133
142
  <div style="flex:1">
134
143
  <div class="eyebrow" style="color:#737373;margin-bottom:4px">THE DISCRIMINATOR</div>
135
- <div style="font-size:12px;color:#404040;line-height:1.5">Does the reader arrive to <strong>pick one</strong>, or to <strong>compare many</strong>? Picking is tiles: the chip carries identity, the span carries weight, and eight of them fill a screen. Comparing is rows: the eye runs down a column, and a tile that has to be scanned against six others is a tile the reader is fighting.</div>
144
+ <div style="font-size:12px;color:#404040;line-height:1.5">Does the reader arrive to <strong>compare many</strong>, or to <strong>pick one</strong>? Comparing is rows, and rows are the default: the eye runs down a column, and a tile that has to be scanned against six others is a tile the reader is fighting. Picking is tiles, which a page asks for: media, blueprints, a hub, a handful told apart by sight.</div>
145
+ </div>
146
+ <div style="width:1px;align-self:stretch;background:#ededed"></div>
147
+ <div style="width:230px">
148
+ <div class="eyebrow" style="color:#737373;margin-bottom:6px">STATE, NOT AREA</div>
149
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:5px 10px">
150
+ <span class="state s-published"><i></i>Published</span><span class="state s-draft"><i></i>Draft</span>
151
+ <span class="state s-scheduled"><i></i>Scheduled</span><span class="state s-changed"><i></i>Changed</span>
152
+ <span class="state s-archived"><i></i>Archived</span>
153
+ </div>
136
154
  </div>
137
155
  <div style="width:1px;align-self:stretch;background:#ededed"></div>
138
- <div style="width:340px">
156
+ <div style="width:300px">
139
157
  <div class="eyebrow" style="color:#737373;margin-bottom:4px">WHY IT IS WORTH SAYING</div>
140
158
  <div style="font-size:12px;color:#404040;line-height:1.5">Without it, density reads as a reason to drop out of the layer and hand-roll a card and a table -- which is how one product ends up with two eras of chrome on one screen.</div>
141
159
  </div>
@@ -21,7 +21,8 @@
21
21
  .vg { font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; -webkit-font-smoothing: antialiased; }
22
22
  .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
23
23
  .eyebrow { font-size: 10.5px; font-weight: 600; letter-spacing: 0.09em; }
24
- .glass { background: rgba(255,255,255,0.72); border: 1px solid rgba(229,229,229,0.7); }
24
+ /* VDS182 — a solid card on --card and --border, not frosted glass. */
25
+ .card { background: #ffffff; border: 1px solid #e5e5e5; }
25
26
  /* One label per row of the gutter, so no two can ever land on each other. */
26
27
  .lab { position: absolute; right: 0; display: flex; align-items: center; gap: 7px; justify-content: flex-end; width: 100%; }
27
28
  .lab b { font-size: 10px; font-weight: 700; letter-spacing: 0.04em; white-space: nowrap; }
@@ -48,7 +49,7 @@
48
49
  <!-- the gutter. one row per label. -->
49
50
  <div style="position:relative;width:168px;flex:0 0 auto">
50
51
  <div class="lab" style="top:26px"><b style="color:#1447e6">SHELL &middot; HEADER</b><i>80px</i><span class="lead" style="background:#1447e6"></span></div>
51
- <div class="lab" style="top:132px"><b style="color:#1447e6">SHELL &middot; NAV</b><i>64px, fixed</i><span class="lead" style="background:#1447e6"></span></div>
52
+ <div class="lab" style="top:132px"><b style="color:#1447e6">SHELL &middot; NAV</b><i>80px, fixed</i><span class="lead" style="background:#1447e6"></span></div>
52
53
  <div class="lab" style="top:186px"><b style="color:#1447e6">SHELL &middot; COLUMN</b><i>set once</i><span class="lead" style="background:#1447e6"></span></div>
53
54
  <div class="lab" style="top:250px"><b style="color:#7f22fe">PAGE &middot; ASIDE</b><i>optional</i><span class="lead" style="background:#7f22fe"></span></div>
54
55
  <div class="lab" style="top:304px"><b style="color:#7f22fe">PAGE &middot; CONTENT</b><span class="lead" style="background:#7f22fe"></span></div>
@@ -77,15 +78,15 @@
77
78
  <div style="width:28px;height:28px;border-radius:999px;background-image:linear-gradient(to bottom right,#155dfc,#4f39f6)"></div>
78
79
  </div>
79
80
 
80
- <!-- rail, 64px -->
81
- <div style="position:absolute;left:0;top:80px;bottom:0;width:64px;z-index:3;display:flex;flex-direction:column;align-items:center;gap:5px;padding:14px 0;background:rgba(20,71,230,0.05);border-right:1px solid rgba(229,229,229,0.7)">
81
+ <!-- rail, 80px -->
82
+ <div style="position:absolute;left:0;top:80px;bottom:0;width:80px;z-index:3;display:flex;flex-direction:column;align-items:center;gap:5px;padding:14px 0;background:rgba(20,71,230,0.05);border-right:1px solid rgba(229,229,229,0.7)">
82
83
  <div style="display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:12px;border:1px solid rgba(23,23,23,0.4);background:rgba(23,23,23,0.09);color:#171717"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><path d="M4 11.5 12 5l8 6.5"></path><path d="M6 10.5V19h12v-8.5"></path></svg></div>
83
84
  <div style="width:38px;height:38px;border-radius:12px;background:#f0f0f0"></div>
84
85
  <div style="width:38px;height:38px;border-radius:12px;background:#f0f0f0"></div>
85
86
  </div>
86
87
 
87
88
  <!-- everything the shell hands to a page -->
88
- <div style="position:absolute;left:64px;right:0;top:80px;bottom:0;display:flex;flex-direction:column">
89
+ <div style="position:absolute;left:80px;right:0;top:80px;bottom:0;display:flex;flex-direction:column">
89
90
  <div style="flex:1;min-height:0;display:flex;justify-content:center;padding:0 28px">
90
91
  <!-- the column: one max-width, one pair of gutters, set here -->
91
92
  <div style="width:100%;max-width:940px;border-left:1px dashed rgba(20,71,230,0.5);border-right:1px dashed rgba(20,71,230,0.5);padding:22px 22px 0;display:flex;gap:16px;min-height:0">
@@ -105,10 +106,10 @@
105
106
  <div style="height:11px;width:120px;border-radius:999px;background:#ededed;margin-bottom:9px"></div>
106
107
  <div style="height:22px;width:260px;border-radius:8px;background:#e6e6e6;margin-bottom:16px"></div>
107
108
  <div style="display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:12px">
108
- <div class="glass" style="grid-column:span 2;border-radius:24px;height:104px"></div>
109
- <div class="glass" style="grid-column:span 2;border-radius:24px;height:104px"></div>
110
- <div class="glass" style="grid-column:span 2;border-radius:24px;height:88px"></div>
111
- <div class="glass" style="grid-column:span 2;border-radius:24px;height:88px"></div>
109
+ <div class="card" style="grid-column:span 2;border-radius:24px;height:104px"></div>
110
+ <div class="card" style="grid-column:span 2;border-radius:24px;height:104px"></div>
111
+ <div class="card" style="grid-column:span 2;border-radius:24px;height:88px"></div>
112
+ <div class="card" style="grid-column:span 2;border-radius:24px;height:88px"></div>
112
113
  </div>
113
114
  </div>
114
115
  </div>
@@ -21,7 +21,9 @@
21
21
  .vg { font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; -webkit-font-smoothing: antialiased; }
22
22
  .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
23
23
  .eyebrow { font-size: 10.5px; font-weight: 600; letter-spacing: 0.09em; }
24
- .glass { background: rgba(255,255,255,0.72); border: 1px solid rgba(229,229,229,0.7); backdrop-filter: blur(18px) saturate(180%); -webkit-backdrop-filter: blur(18px) saturate(180%); border-radius: 24px; }
24
+ /* VDS182 — the panel is a solid card on --card and --border. Frost behind
25
+ every panel was ornament: nothing scrolls under a panel to be frosted. */
26
+ .card { background: #ffffff; border: 1px solid #e5e5e5; border-radius: 24px; }
25
27
  .slot { position: absolute; font-size: 9px; padding: 0 5px; background: #ffffff; }
26
28
  .trow { display: grid; grid-template-columns: 1fr 90px 70px; gap: 10px; align-items: center; padding: 7px 14px; border-bottom: 1px solid #f4f4f4; font-size: 11px; }
27
29
  </style>
@@ -33,7 +35,7 @@
33
35
  <div class="eyebrow" style="color:#1447e6">REFERENCE</div>
34
36
  <div style="display:flex;align-items:baseline;gap:12px;margin-top:4px">
35
37
  <div style="font-size:21px;font-weight:600;letter-spacing:-0.015em">The panel, and why it has no heading</div>
36
- <div style="font-size:12.5px;color:#737373">A frosted box with arbitrary content. Three of them, and the same component each time.</div>
38
+ <div style="font-size:12.5px;color:#737373">A plain card with arbitrary content. Three of them, and the same component each time.</div>
37
39
  </div>
38
40
  </div>
39
41
 
@@ -49,7 +51,7 @@
49
51
 
50
52
  <!-- a stats strip, py default -->
51
53
  <div style="position:relative">
52
- <div class="glass" style="padding:14px;display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:14px">
54
+ <div class="card" style="padding:14px;display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:14px">
53
55
  <div><div style="font-size:22px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1">128</div><div style="font-size:10.5px;color:#737373;margin-top:2px">Label</div></div>
54
56
  <div><div style="font-size:22px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1">94</div><div style="font-size:10.5px;color:#737373;margin-top:2px">Label</div></div>
55
57
  <div><div style="font-size:22px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1">6</div><div style="font-size:10.5px;color:#737373;margin-top:2px">Label</div></div>
@@ -60,7 +62,7 @@
60
62
 
61
63
  <!-- a toolbar, py-2 -->
62
64
  <div style="position:relative">
63
- <div class="glass" style="padding:8px 12px;display:flex;align-items:center;gap:8px">
65
+ <div class="card" style="padding:8px 12px;display:flex;align-items:center;gap:8px">
64
66
  <div style="display:flex;align-items:center;gap:7px;height:28px;padding:0 10px;border:1px solid #e5e5e5;border-radius:10px;background:#ffffff;flex:1;max-width:230px">
65
67
  <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#737373" stroke-width="2" stroke-linecap="round"><circle cx="11" cy="11" r="7"></circle><path d="M21 21l-4.4-4.4"></path></svg>
66
68
  <span style="font-size:11.5px;color:#737373">Filter</span>
@@ -75,7 +77,7 @@
75
77
 
76
78
  <!-- a table, p-0 -->
77
79
  <div style="position:relative;flex:1;min-height:0">
78
- <div class="glass" style="overflow:hidden;height:100%">
80
+ <div class="card" style="overflow:hidden;height:100%">
79
81
  <div class="trow" style="background:rgba(245,245,245,0.6);font-size:9.5px;font-weight:600;letter-spacing:0.06em;color:#737373"><div>COLUMN</div><div>COLUMN</div><div>COLUMN</div></div>
80
82
  <div class="trow"><div>Row</div><div style="color:#737373">Value</div><div style="color:#737373">Value</div></div>
81
83
  <div class="trow"><div>Row</div><div style="color:#737373">Value</div><div style="color:#737373">Value</div></div>
@@ -95,7 +97,7 @@
95
97
 
96
98
  <div style="border:1px solid #e5e5e5;background:#ffffff;border-radius:14px;padding:13px">
97
99
  <div class="eyebrow" style="color:#737373;margin-bottom:6px">TWO CLASS SLOTS, NO PADDING OF ITS OWN</div>
98
- <div style="font-size:11.5px;color:#404040;line-height:1.5"><span class="mono" style="font-size:11px">className</span> on the frosted container and <span class="mono" style="font-size:11px">contentClassName</span> on the inner wrapper. A table wants <span class="mono" style="font-size:11px">p-0</span>; a toolbar wants <span class="mono" style="font-size:11px">py-2</span>. That is why the padding is yours.</div>
100
+ <div style="font-size:11.5px;color:#404040;line-height:1.5"><span class="mono" style="font-size:11px">className</span> on the card and <span class="mono" style="font-size:11px">contentClassName</span> on the inner wrapper. A table wants <span class="mono" style="font-size:11px">p-0</span>; a toolbar wants <span class="mono" style="font-size:11px">py-2</span>. That is why the padding is yours.</div>
99
101
  </div>
100
102
 
101
103
  <div style="border:1px solid rgba(251,44,54,0.3);background:rgba(251,44,54,0.05);border-radius:14px;padding:13px">