@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.
- package/README.md +35 -7
- package/dist/bento/bento-entity-shell.d.ts +9 -1
- package/dist/bento/bento-entity-shell.d.ts.map +1 -1
- package/dist/bento/bento-form-hero.d.ts +1 -1
- package/dist/bento/bento-form-hero.d.ts.map +1 -1
- package/dist/bento/bento-hero.d.ts +14 -1
- package/dist/bento/bento-hero.d.ts.map +1 -1
- package/dist/bento/bento-list-page.d.ts +43 -11
- package/dist/bento/bento-list-page.d.ts.map +1 -1
- package/dist/bento/bento-nav-rail.d.ts +8 -2
- package/dist/bento/bento-nav-rail.d.ts.map +1 -1
- package/dist/bento/bento-nav.d.ts +7 -0
- package/dist/bento/bento-nav.d.ts.map +1 -1
- package/dist/bento/bento-shell.d.ts +5 -3
- package/dist/bento/bento-shell.d.ts.map +1 -1
- package/dist/bento/bento-trail.d.ts +27 -0
- package/dist/bento/bento-trail.d.ts.map +1 -0
- package/dist/bento/index.d.ts +1 -0
- package/dist/bento/index.d.ts.map +1 -1
- package/dist/bento.cjs +4 -4
- package/dist/bento.css +3 -3
- package/dist/bento.es.js +1101 -973
- package/dist/catalogue.json +102 -18
- package/dist/components/ui/index.d.ts +1 -1
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/viglet-assistant.d.ts +11 -1
- package/dist/components/ui/viglet-assistant.d.ts.map +1 -1
- package/dist/exports.json +7 -1
- package/dist/i18n/index.d.ts +8 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/locales/en/bento.json.d.ts +6 -2
- package/dist/i18n/locales/pt/bento.json.d.ts +6 -2
- package/dist/i18n.cjs +1 -1
- package/dist/i18n.es.js +12 -4
- package/dist/index.cjs +1 -1
- package/dist/index.es.js +762 -718
- package/dist/lib/corner-slot.d.ts +11 -0
- package/dist/lib/corner-slot.d.ts.map +1 -1
- package/dist/{user.context-D3kmD3_y.js → user.context-DUs2lT6D.js} +201 -197
- package/dist/user.context-uYif5Mp2.cjs +1 -0
- package/dist/viglet-design-system.css +1 -1
- package/docs/BENTO-AUTHORING.md +18 -10
- package/docs/reference/README.md +9 -1
- package/docs/reference/canvas.json +1 -1
- package/docs/reference/detail.dc.html +18 -22
- package/docs/reference/form-hero.dc.html +11 -14
- package/docs/reference/list.dc.html +74 -56
- package/docs/reference/page-anatomy.dc.html +10 -9
- package/docs/reference/panel.dc.html +8 -6
- package/docs/reference/shell.dc.html +7 -4
- package/docs/reference/split.dc.html +8 -13
- package/package.json +2 -1
- package/dist/user.context-gQvBxcwr.cjs +0 -1
package/docs/BENTO-AUTHORING.md
CHANGED
|
@@ -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
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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`
|
package/docs/reference/README.md
CHANGED
|
@@ -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
|
|
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
|
|
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:
|
|
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="
|
|
75
|
-
<div style="
|
|
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="
|
|
86
|
-
<div style="
|
|
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="
|
|
126
|
-
<div style="
|
|
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="
|
|
137
|
-
<div style="
|
|
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
|
-
|
|
25
|
-
.
|
|
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="
|
|
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:
|
|
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="
|
|
67
|
-
<div style="
|
|
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="
|
|
78
|
-
<div style="
|
|
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
|
-
|
|
25
|
-
.
|
|
26
|
-
|
|
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
|
|
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
|
-
<!--
|
|
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(
|
|
47
|
-
<span class="mono" style="font-size:10.5px;color:#737373">
|
|
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="
|
|
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:
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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="
|
|
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">
|
|
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
|
-
<!--
|
|
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(
|
|
100
|
-
<span class="mono" style="font-size:10.5px;color:#737373">
|
|
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="
|
|
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:
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
|
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">
|
|
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>
|
|
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:
|
|
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
|
-
|
|
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 · 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 · NAV</b><i>
|
|
52
|
+
<div class="lab" style="top:132px"><b style="color:#1447e6">SHELL · 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 · 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 · 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 · 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,
|
|
81
|
-
<div style="position:absolute;left:0;top:80px;bottom:0;width:
|
|
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:
|
|
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="
|
|
109
|
-
<div class="
|
|
110
|
-
<div class="
|
|
111
|
-
<div class="
|
|
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
|
-
|
|
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
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
|
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">
|