@beehexa/design-rules 2611.3.2 → 2611.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +1 -1
  2. package/dist/AGENTS.md +1 -7
  3. package/dist/catalog.json +153 -125
  4. package/dist/docs/scripts/color-pairs.mjs +5 -1
  5. package/dist/docs/scripts/token-utils.mjs +16 -1
  6. package/dist/docs/src/components/ColorDemo.astro +5 -5
  7. package/dist/docs/src/components/ElevationDemo.astro +196 -0
  8. package/dist/docs/src/components/LayoutDemo.astro +1 -1
  9. package/dist/docs/src/components/OpacityDemo.astro +95 -0
  10. package/dist/docs/src/components/ShapeDemo.astro +11 -10
  11. package/dist/docs/src/components/ShapePin.astro +5 -3
  12. package/dist/docs/src/components/ZIndexDemo.astro +102 -0
  13. package/dist/docs/src/content/foundations/styles/border.mdx +3 -3
  14. package/dist/docs/src/content/foundations/styles/color/usage.mdx +11 -4
  15. package/dist/docs/src/content/foundations/styles/data-visualization.mdx +74 -6
  16. package/dist/docs/src/content/foundations/styles/elevation.mdx +66 -3
  17. package/dist/docs/src/content/foundations/styles/icons/usage.mdx +9 -6
  18. package/dist/docs/src/content/foundations/styles/layout/app-frame.mdx +10 -0
  19. package/dist/docs/src/content/foundations/styles/opacity.mdx +43 -5
  20. package/dist/docs/src/content/foundations/styles/size-and-density.mdx +7 -0
  21. package/dist/docs/src/content/foundations/styles/typography/code.mdx +1 -1
  22. package/dist/docs/src/content/foundations/styles/z-index.mdx +63 -5
  23. package/dist/docs/src/content/tools/ant-design-vue-theme.mdx +125 -18
  24. package/dist/docs/src/content/tools/application-content.mdx +42 -0
  25. package/dist/docs/src/content/tools/editors.mdx +27 -0
  26. package/dist/docs/src/content/tools/mermaid.mdx +95 -0
  27. package/dist/docs/src/content/tools/vueflow.mdx +121 -0
  28. package/dist/docs/src/content-vi/foundations/styles/border.mdx +3 -3
  29. package/dist/docs/src/content-vi/foundations/styles/color/usage.mdx +11 -4
  30. package/dist/docs/src/content-vi/foundations/styles/data-visualization.mdx +75 -6
  31. package/dist/docs/src/content-vi/foundations/styles/elevation.mdx +75 -0
  32. package/dist/docs/src/content-vi/foundations/styles/icons/usage.mdx +9 -6
  33. package/dist/docs/src/content-vi/foundations/styles/layout/app-frame.mdx +10 -0
  34. package/dist/docs/src/content-vi/foundations/styles/opacity.mdx +43 -5
  35. package/dist/docs/src/content-vi/foundations/styles/size-and-density.mdx +7 -0
  36. package/dist/docs/src/content-vi/foundations/styles/typography/code.mdx +1 -1
  37. package/dist/docs/src/content-vi/foundations/styles/z-index.mdx +63 -5
  38. package/dist/docs/src/lib/token-descriptions-vi.ts +21 -5
  39. package/dist/docs/src/styles/chrome.css +14 -14
  40. package/dist/docs/src/styles/color.css +19 -32
  41. package/dist/docs/src/styles/docs.css +18 -34
  42. package/dist/docs/src/styles/elevation.css +83 -0
  43. package/dist/docs/src/styles/global.css +1 -10
  44. package/dist/docs/src/styles/icons.css +11 -15
  45. package/dist/docs/src/styles/kit.css +112 -0
  46. package/dist/docs/src/styles/layout.css +1 -6
  47. package/dist/docs/src/styles/opacity.css +43 -0
  48. package/dist/docs/src/styles/shapes.css +15 -19
  49. package/dist/docs/src/styles/tokens.css +1282 -3
  50. package/dist/docs/src/styles/tokens.js +358 -3
  51. package/dist/docs/src/styles/typography.css +4 -7
  52. package/dist/docs/src/styles/zindex.css +56 -0
  53. package/dist/docs/tokens/border.json +1 -1
  54. package/dist/docs/tokens/color.json +57 -3
  55. package/dist/docs/tokens/content.json +19 -0
  56. package/dist/docs/tokens/diagram.json +48 -0
  57. package/dist/docs/tokens/editor.json +129 -0
  58. package/dist/docs/tokens/elevation.json +15 -5
  59. package/dist/docs/tokens/flow.json +497 -0
  60. package/dist/docs/tokens/opacity.json +9 -0
  61. package/dist/docs/tokens/resize.json +67 -0
  62. package/dist/docs/tokens/size.json +6 -0
  63. package/dist/docs/tokens/spacing.json +4 -4
  64. package/dist/docs/tokens/typography.json +5 -0
  65. package/dist/docs/tokens/visualization.json +123 -0
  66. package/dist/docs/tokens/z-index.json +49 -0
  67. package/dist/index.js +153 -125
  68. package/package.json +6 -1
@@ -32,7 +32,7 @@
32
32
  .sidebar-item { padding: 0 var(--bh-space-150); }
33
33
  .sidebar-item > span:first-child, .sidebar-child > span:first-child { flex: 1; }
34
34
  .sidebar-item:hover, .sidebar-child:hover { background: var(--c-hover); }
35
- .sidebar-item[aria-current='page'] { background: var(--c-selected); box-shadow: inset 2px 0 0 var(--c-gold); }
35
+ .sidebar-item[aria-current='page'] { background: var(--c-selected); box-shadow: inset var(--bh-border-width-selected) 0 0 var(--c-gold); }
36
36
  .sidebar-item[aria-current='page']:hover, .sidebar-child[aria-current='page']:hover { background: var(--c-selected-hover); }
37
37
  .sidebar-chevron { flex: none; color: var(--c-muted); transition: transform 200ms cubic-bezier(0.2, 0, 0, 1); }
38
38
  .sidebar-item[aria-expanded='true'] .sidebar-chevron { transform: rotate(90deg); }
@@ -98,8 +98,8 @@
98
98
  /* Release phase label, learned from GitHub Primer's Label: a pill with a 1 px border in the role
99
99
  colour, text in the role's fg colour and no fill, 20 px tall. The words carry the meaning;
100
100
  the colour only helps scanning. */
101
- .status-badge { display: inline-flex; align-items: center; height: 20px; padding: 0 calc(var(--bh-space-100) - 1px); border: 1px solid var(--bh-color-border); border-radius: var(--bh-radius-full); color: var(--bh-color-text); background: transparent; text-decoration: none; white-space: nowrap; font: var(--bh-font-label-small); }
102
- .status-badge.is-large { height: var(--bh-size-control-small); padding: 0 calc(var(--bh-space-100) - 1px); }
101
+ .status-badge { display: inline-flex; align-items: center; height: var(--bh-space-250); padding: 0 var(--bh-space-075); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-full); color: var(--bh-color-text); background: transparent; text-decoration: none; white-space: nowrap; font: var(--bh-font-label-small); }
102
+ .status-badge.is-large { height: var(--bh-size-control-small); padding: 0 var(--bh-space-100); }
103
103
  .status-early-access { border-color: var(--bh-color-border-brand); }
104
104
  .status-beta { border-color: var(--bh-color-border-info); color: var(--bh-color-text-info); }
105
105
  .status-ga { border-color: var(--bh-color-border-success); color: var(--bh-color-text-success); }
@@ -110,7 +110,7 @@ a.status-badge:hover { text-decoration: underline; }
110
110
  .component-tabs { display: flex; gap: var(--bh-space-300); margin: var(--bh-space-300) 0 0; padding: 0; border-top: 0; color: inherit; overflow-x: auto; }
111
111
  .component-tabs a { display: flex; align-items: center; height: var(--bh-size-control-default); padding: 0; border-bottom: var(--bh-border-width-selected) solid transparent; color: var(--c-muted); text-decoration: none; white-space: nowrap; font: var(--bh-font-label-default); }
112
112
  .component-tabs a:hover { color: var(--c-ink); }
113
- .component-tabs a[aria-current='page'] { border-bottom-color: var(--c-ink); color: var(--c-ink); }
113
+ .component-tabs a[aria-current='page'] { border-bottom-color: var(--c-gold); color: var(--c-ink); }
114
114
 
115
115
  /* Body text. */
116
116
  .prose { container: prose / inline-size; padding-top: var(--bh-space-300); font: var(--bh-font-body-large); }
@@ -132,7 +132,7 @@ a.status-badge:hover { text-decoration: underline; }
132
132
  .prose th, .prose td { padding: var(--bh-space-100) var(--bh-space-150); border-bottom: 1px solid var(--c-line); text-align: left; vertical-align: baseline; } /* first lines share a baseline, even when code sits next to text */
133
133
  .prose th { color: var(--c-muted); font: var(--bh-font-label-small); }
134
134
  .prose td code { overflow-wrap: anywhere; } /* long token names wrap instead of widening the page */
135
- .prose blockquote, .callout { margin: 0 0 var(--bh-space-300); padding: calc(var(--bh-space-200) - 1px); border: 1px solid var(--c-note-line); border-radius: var(--bh-radius-100); background: var(--c-note-bg); }
135
+ .prose blockquote, .callout { margin: 0 0 var(--bh-space-300); padding: calc(var(--bh-space-200) - var(--bh-border-width-default)); border: 1px solid var(--c-note-line); border-radius: var(--bh-radius-100); background: var(--c-note-bg); }
136
136
  .prose blockquote p, .callout p { margin: 0; }
137
137
  .callout-title { margin-bottom: var(--bh-space-050) !important; font: var(--bh-font-heading-xsmall); }
138
138
 
@@ -149,14 +149,14 @@ a.status-badge:hover { text-decoration: underline; }
149
149
  /* Cards. */
150
150
  .card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--bh-space-200); margin: 0 0 var(--bh-space-200); padding: 0 !important; list-style: none; }
151
151
  .card-grid > li { margin: 0 !important; }
152
- .card { display: block; height: 100%; padding: calc(var(--bh-space-300) - 1px); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); color: var(--c-ink) !important; text-decoration: none; transition: border-color 150ms ease, box-shadow 150ms ease; font: var(--bh-font-heading-small); }
153
- .card:hover { border-color: var(--c-muted); box-shadow: var(--c-shadow); }
152
+ .card { display: block; height: 100%; padding: calc(var(--bh-space-300) - var(--bh-border-width-default)); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); color: var(--c-ink) !important; background: var(--bh-color-surface); box-shadow: var(--bh-elevation-shadow-raised); text-decoration: none; transition: border-color 150ms ease; font: var(--bh-font-heading-small); }
153
+ .card:hover { border-color: var(--bh-color-border-bold); }
154
154
  .card p { margin: var(--bh-space-050) 0 var(--bh-space-150); color: var(--c-muted) !important; font: var(--bh-font-body-default); }
155
155
  .child-pages h2 { margin-top: var(--bh-space-500); }
156
156
 
157
157
  /* Previous / next and page meta. */
158
158
  .pager { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--bh-space-200); margin-top: var(--bh-space-600); }
159
- .pager-link { display: grid; gap: var(--bh-space-050); padding: calc(var(--bh-space-200) - 1px); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); color: var(--c-ink); text-decoration: none; }
159
+ .pager-link { display: grid; gap: var(--bh-space-050); padding: calc(var(--bh-space-200) - var(--bh-border-width-default)); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); color: var(--c-ink); text-decoration: none; }
160
160
  .pager-link:hover { border-color: var(--c-muted); }
161
161
  .pager-link span { color: var(--c-muted); font: var(--bh-font-body-small); }
162
162
  .pager-link b { font: var(--bh-font-heading-small); }
@@ -166,7 +166,7 @@ a.status-badge:hover { text-decoration: underline; }
166
166
  .page-meta a:hover { color: var(--c-ink); }
167
167
 
168
168
  /* Pages listed before their content is written. */
169
- .in-development { display: flex; gap: var(--bh-space-200); padding: calc(var(--bh-space-300) - 1px); border: 1px dashed var(--c-muted); border-radius: var(--bh-radius-150); background: var(--c-surf); }
169
+ .in-development { display: flex; gap: var(--bh-space-200); padding: calc(var(--bh-space-300) - var(--bh-border-width-default)); border: 1px dashed var(--c-muted); border-radius: var(--bh-radius-150); background: var(--c-surf); }
170
170
  .in-development-icon { flex: none; display: grid; place-items: center; width: var(--bh-space-500); height: var(--bh-space-500); border-radius: var(--bh-radius-100); color: var(--bh-color-text-on-brand); background: var(--bh-color-background-brand-subtle); box-shadow: inset 0 0 0 1px var(--bh-color-border-brand-subtle); }
171
171
  .in-development p { margin: 0 0 var(--bh-space-100); }
172
172
  .in-development p:last-child { margin-bottom: 0; }
@@ -181,27 +181,11 @@ a.status-badge:hover { text-decoration: underline; }
181
181
  .prose .code-example pre { margin: 0; border-radius: var(--bh-radius-0); }
182
182
 
183
183
  /* Demo styles for component examples, until the component library ships. */
184
- .bh-button { display: inline-flex; align-items: center; gap: var(--bh-space-050); height: var(--bh-size-control-default); padding: 0 calc(var(--bh-space-150) - var(--bh-border-width-default)); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-100); background: var(--bh-color-surface-page); color: var(--bh-color-text); cursor: pointer; transition: background var(--bh-motion-duration-fast) var(--bh-motion-easing-standard); font: var(--bh-font-label-default); }
185
- .bh-button:hover { background: var(--bh-color-background-neutral-subtle-hover); }
186
- .bh-button:focus-visible { outline: var(--bh-border-width-focused) solid var(--bh-color-border-focus); outline-offset: var(--bh-state-focus-offset); }
187
- .bh-button-primary { border-color: var(--bh-color-background-neutral-bold); background: var(--bh-color-background-neutral-bold); color: var(--bh-color-text-inverse); }
188
- .bh-button-primary:hover { border-color: var(--bh-color-background-neutral-bold-hover); background: var(--bh-color-background-neutral-bold-hover); }
189
- .bh-button-danger { border-color: var(--bh-color-background-danger-bold); background: var(--bh-color-background-danger-bold); color: var(--bh-color-text-on-bold); }
190
- .bh-button-danger:hover { border-color: var(--bh-color-background-danger-bold-hover); background: var(--bh-color-background-danger-bold-hover); }
191
- .bh-button:disabled, .bh-button:disabled:hover { border-color: var(--bh-color-border-disabled); color: var(--bh-color-text-disabled); background: var(--bh-color-background-disabled); cursor: not-allowed; }
192
184
 
193
185
  /* Label and state label, learned from GitHub Primer (@primer/react Label and StateLabel).
194
186
  Label: outlined pill, 1 px border in the role's emphasis colour, text in its fg colour, no
195
187
  fill; 20 px tall with 6 px padding (large: 24 px, 8 px). State label: solid emphasis fill,
196
188
  white text and an icon. */
197
- .bh-label { display: inline-flex; align-items: center; height: 20px; padding: 0 calc(var(--bh-space-100) - 1px); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-full); color: var(--bh-color-text); background: transparent; white-space: nowrap; font: var(--bh-font-label-small); }
198
- .bh-label.is-large { height: var(--bh-size-control-small); padding: 0 calc(var(--bh-space-100) - 1px); }
199
- .bh-label.is-brand { border-color: var(--bh-color-border-brand); }
200
- .bh-label.is-info { border-color: var(--bh-color-border-info); color: var(--bh-color-text-info); }
201
- .bh-label.is-success { border-color: var(--bh-color-border-success); color: var(--bh-color-text-success); }
202
- .bh-label.is-warning { border-color: var(--bh-color-border-warning); color: var(--bh-color-text-warning); }
203
- .bh-label.is-danger { border-color: var(--bh-color-border-danger); color: var(--bh-color-text-danger); }
204
- .bh-label.is-neutral { border-color: var(--bh-color-border-bold); color: var(--bh-color-text-subtle); }
205
189
  .bh-state { display: inline-flex; align-items: center; gap: var(--bh-space-050); height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-full); color: var(--bh-color-text-on-bold); white-space: nowrap; font: var(--bh-font-heading-xsmall); }
206
190
  .bh-state svg { flex: none; }
207
191
  .bh-state.is-info { background: var(--bh-color-background-info-bold); }
@@ -217,7 +201,7 @@ a.status-badge:hover { text-decoration: underline; }
217
201
 
218
202
  /* Below lg (1024 px) the side navigation is a drawer and a bar under the header opens it and
219
203
  the folded table of contents. */
220
- .docs-mobilebar { position: sticky; z-index: 50; top: var(--header-bottom); box-sizing: content-box; display: flex; align-items: center; justify-content: space-between; gap: var(--bh-space-150); height: var(--header-h); padding: 0 var(--page-margin); border-bottom: 1px solid var(--c-line); background: var(--c-bg); font: var(--bh-font-label-default); }
204
+ .docs-mobilebar { position: sticky; z-index: var(--bh-z-index-sticky); top: var(--header-bottom); box-sizing: content-box; display: flex; align-items: center; justify-content: space-between; gap: var(--bh-space-150); height: var(--header-h); padding: 0 var(--page-margin); border-bottom: 1px solid var(--c-line); background: var(--c-bg); font: var(--bh-font-label-default); }
221
205
  .drawer-open { display: flex; align-items: center; gap: var(--bh-space-050); min-width: 0; height: var(--bh-size-control-default); padding: 0; border: 0; color: var(--c-ink); background: none; font: inherit; cursor: pointer; }
222
206
  .drawer-open-label { overflow: hidden; color: var(--c-muted); text-overflow: ellipsis; white-space: nowrap; }
223
207
  .drawer-open-label b { color: var(--c-ink); }
@@ -225,22 +209,22 @@ a.status-badge:hover { text-decoration: underline; }
225
209
  .toc-menu summary { display: flex; align-items: center; height: var(--bh-size-control-default); color: var(--c-muted); cursor: pointer; list-style: none; }
226
210
  .toc-menu summary::-webkit-details-marker { display: none; }
227
211
  .toc-menu summary::after { content: ' ▾'; }
228
- .toc-menu nav { position: absolute; top: calc(100% + var(--bh-space-050)); right: 0; width: min(300px, calc(100vw - 2 * var(--page-margin))); max-height: 60vh; padding: var(--bh-space-100); overflow-y: auto; border: 1px solid var(--c-line); border-radius: var(--bh-radius-100); background: var(--c-bg); box-shadow: var(--c-shadow); }
212
+ .toc-menu nav { position: absolute; top: calc(100% + var(--bh-space-050)); right: 0; width: min(300px, calc(100vw - 2 * var(--page-margin))); max-height: 60vh; padding: var(--bh-space-050); overflow-y: auto; border-radius: var(--bh-radius-100); background: var(--bh-color-surface-overlay); box-shadow: var(--c-shadow); }
229
213
  .toc-menu a { display: flex; align-items: center; min-height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-050); color: var(--c-ink); text-decoration: none; font: var(--bh-font-label-default); }
230
214
  .toc-menu .toc-depth-3 a { padding-left: var(--bh-space-300); color: var(--c-muted); }
231
- .toc-menu a:hover { background: var(--c-hover); }
215
+ .toc-menu a:hover { background: var(--bh-color-surface-overlay-hover); }
232
216
 
233
- .sidebar { position: fixed; z-index: 120; top: 0; bottom: 0; left: 0; width: min(var(--sidebar-w), 86vw); height: auto; border-right: 1px solid var(--c-line); box-shadow: var(--c-shadow); transform: translateX(-105%); transition: transform 200ms ease; visibility: hidden; }
217
+ .sidebar { --c-hover: var(--bh-color-surface-overlay-hover); --c-selected: var(--bh-color-surface-overlay-selected); --c-selected-hover: var(--bh-color-surface-overlay-selected-hover); position: fixed; z-index: var(--bh-z-index-modal); top: 0; bottom: 0; left: 0; width: min(var(--sidebar-w), 86vw); height: auto; border-right: 0; background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-modal); transform: translateX(-105%); transition: transform 200ms ease; visibility: hidden; }
234
218
  body[data-drawer] .sidebar { transform: none; visibility: visible; }
235
219
  .drawer-backdrop { display: none; }
236
- .drawer-backdrop:not([hidden]) { position: fixed; z-index: 110; inset: 0; display: block; background: var(--bh-color-surface-scrim); }
220
+ .drawer-backdrop:not([hidden]) { position: fixed; z-index: var(--bh-z-index-modal); inset: 0; display: block; background: var(--bh-color-surface-scrim); }
237
221
 
238
222
  /* Tables marked stackable are one card per row in a narrow column, and a table once the column is 720 px wide. */
239
223
  .prose table.stackable, .prose table.stackable tbody, .prose table.stackable tr, .prose table.stackable td { display: block; width: 100%; }
240
224
  .prose table.stackable thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
241
225
  .prose table.stackable tr { margin-bottom: var(--bh-space-150); padding: var(--bh-space-050) 0; border: 1px solid var(--c-line); border-radius: var(--bh-radius-100); }
242
226
  /* The cell stays one block, so text, code and links inside it flow as one line of text; the label sits in the left column. */
243
- .prose table.stackable td { position: relative; display: block; min-height: var(--bh-space-500); padding: var(--bh-space-100) var(--bh-space-150) var(--bh-space-100) calc(7rem + 2 * var(--bh-space-150)); border: 0; }
227
+ .prose table.stackable td { position: relative; display: block; min-height: var(--bh-space-500); --label-w: 7rem; padding: var(--bh-space-100) var(--bh-space-150) var(--bh-space-100) calc(var(--label-w) + 2 * var(--bh-space-150)); border: 0; }
244
228
  .prose table.stackable td::before { content: attr(data-label); position: absolute; top: var(--bh-space-100); left: var(--bh-space-150); width: 7rem; color: var(--c-muted); font: var(--bh-font-label-small); }
245
229
  @container prose (min-width: 720px) {
246
230
  .prose table.stackable { display: table; }
@@ -262,7 +246,7 @@ body[data-drawer] .sidebar { transform: none; visibility: visible; }
262
246
  .docs-grid { grid-template-columns: var(--sidebar-w) minmax(0, 1fr); }
263
247
  .docs-grid.no-sidebar { grid-template-columns: minmax(0, 1fr); }
264
248
  .docs-mobilebar { display: none; }
265
- .sidebar { position: sticky; z-index: auto; top: var(--header-bottom); bottom: auto; width: auto; height: calc(100vh - var(--header-bottom)); box-shadow: none; transform: none; transition: none; visibility: visible; }
249
+ .sidebar { --c-hover: var(--bh-color-background-neutral-subtle-hover); --c-selected: var(--bh-color-background-selected); --c-selected-hover: var(--bh-color-background-selected-hover); background: var(--c-bg); border-right: var(--bh-border-width-default) solid var(--c-line); position: sticky; z-index: auto; top: var(--header-bottom); bottom: auto; width: auto; height: calc(100vh - var(--header-bottom)); box-shadow: none; transform: none; transition: none; visibility: visible; }
266
250
  .sidebar-head { display: none; }
267
251
  .drawer-backdrop:not([hidden]) { display: none; }
268
252
  }
@@ -280,7 +264,7 @@ body[data-drawer] .sidebar { transform: none; visibility: visible; }
280
264
 
281
265
  /* Get started. */
282
266
  .role-cards { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--bh-space-200); margin-bottom: var(--bh-space-200); }
283
- .role-card { padding: calc(var(--bh-space-300) - 1px); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); }
267
+ .role-card { padding: calc(var(--bh-space-300) - var(--bh-border-width-default)); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); background: var(--bh-color-surface); box-shadow: var(--bh-elevation-shadow-raised); }
284
268
  .prose .role-card h3 { margin: 0 0 var(--bh-space-050); font: var(--bh-font-heading-small); }
285
269
  .prose .role-card h3 a { color: var(--c-ink); text-decoration: none; }
286
270
  .prose .role-card h3 a:hover { text-decoration: underline; }
@@ -309,7 +293,7 @@ body[data-drawer] .sidebar { transform: none; visibility: visible; }
309
293
  /* A 40 px button on small screens, the default 32 px from md. */
310
294
  @media (min-width: 768px) { .prose .button-dark { justify-content: flex-start; height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); } }
311
295
  /* Under /vi/, a page shown in English says so above its title. */
312
- .lang-notice { margin: 0 0 var(--bh-space-150); padding: calc(var(--bh-space-100) - 1px) calc(var(--bh-space-150) - 1px); border: 1px solid var(--c-note-line); border-radius: var(--bh-radius-100); color: var(--c-ink); background: var(--c-note-bg); font: var(--bh-font-body-default); }
296
+ .lang-notice { margin: 0 0 var(--bh-space-150); padding: calc(var(--bh-space-100) - var(--bh-border-width-default)) calc(var(--bh-space-150) - var(--bh-border-width-default)); border: 1px solid var(--c-note-line); border-radius: var(--bh-radius-100); color: var(--c-ink); background: var(--c-note-bg); font: var(--bh-font-body-default); }
313
297
 
314
298
  /* Moving between pages: the page fades across instead of flashing white, while the header and
315
299
  the sidebar stay put (cross-document view transitions; browsers without them load as before). */
@@ -0,0 +1,83 @@
1
+ /* Illustrations for the Elevation page. Surfaces, shadows, edges and sizes are tokens only. */
2
+ .bh-scope-light, .bh-scope-dark { color: var(--bh-color-text); background: var(--bh-color-surface-page); }
3
+
4
+ /* Hero: the three levels from the front and from the side (as on Material's elevation page). */
5
+ .el-hero { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--bh-space-200); margin: var(--bh-space-300) 0; }
6
+ @container prose (min-width: 640px) { .el-hero { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
7
+ .el-view { display: grid; grid-template-rows: 1fr auto; margin: 0; overflow: hidden; border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-150); }
8
+ .el-view figcaption { padding: var(--bh-space-100) var(--bh-space-200); border-top: var(--bh-border-width-default) solid var(--bh-color-border); color: var(--bh-color-text-subtle); font: var(--bh-font-body-small); }
9
+ .el-front { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); align-items: center; gap: var(--bh-space-200); min-height: calc(3 * var(--bh-space-800)); padding: var(--bh-space-400) var(--bh-space-300); background: var(--bh-color-surface-page); }
10
+ .el-plate { display: grid; place-items: end start; aspect-ratio: 1; padding: var(--bh-space-100); border-radius: var(--bh-radius-150); background: var(--bh-color-surface); }
11
+ .el-plate b { color: var(--bh-color-text-subtle); font: var(--bh-font-label-small); }
12
+ .el-plate.is-page { background: transparent; border: var(--bh-border-width-default) dashed var(--bh-color-border-bold); }
13
+ .el-plate.is-raised { border: var(--bh-border-width-default) solid var(--bh-color-border); box-shadow: var(--bh-elevation-shadow-raised); }
14
+ .el-plate.is-overlay { background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-overlay); }
15
+ .el-plate.is-modal { background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-modal); }
16
+ .el-side { display: grid; align-content: end; gap: var(--bh-space-300); min-height: calc(3 * var(--bh-space-800)); padding: var(--bh-space-300) var(--bh-space-300) 0; background: var(--bh-color-surface-page); }
17
+ .el-bar { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: var(--bh-space-025) var(--bh-space-150); }
18
+ .el-bar i { grid-row: span 2; width: calc(2 * var(--bh-space-800)); height: var(--bh-space-400); border-radius: var(--bh-radius-100); background: var(--bh-color-surface); }
19
+ .el-bar.is-raised i { border: var(--bh-border-width-default) solid var(--bh-color-border); box-shadow: var(--bh-elevation-shadow-raised); }
20
+ .el-bar.is-overlay i { background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-overlay); }
21
+ .el-bar.is-modal i { background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-modal); }
22
+ .el-bar code { font: var(--bh-font-code-default); font-size: var(--bh-font-size-100); color: var(--bh-color-text); }
23
+ .el-bar em { color: var(--bh-color-text-subtle); font: var(--bh-font-body-small); font-style: normal; }
24
+ .el-ground { display: block; margin: var(--bh-space-100) calc(-1 * var(--bh-space-300)) 0; padding: var(--bh-space-050) var(--bh-space-300); border-top: var(--bh-border-width-default) solid var(--bh-color-border-bold); background: var(--bh-color-surface-page); }
25
+ .el-ground code { font: var(--bh-font-code-default); font-size: var(--bh-font-size-100); color: var(--bh-color-text-subtle); }
26
+
27
+ /* Examples: the level's real component on the page colour, so the shadow reads as it will in the product. */
28
+ .el-ex { background: var(--bh-color-surface-page); }
29
+ .el-ex.is-top { align-items: flex-start; padding-bottom: calc(var(--bh-space-1000) + var(--bh-space-200)); }
30
+ .el-card { display: grid; gap: var(--bh-space-050); width: min(100%, 16rem); }
31
+ .el-card.is-wide { width: 16rem; }
32
+ .el-anchor { display: grid; justify-items: start; gap: var(--bh-space-050); }
33
+ .el-menu { min-width: 11rem; }
34
+ /* Menu rows follow the site menus: a default-height control, 12 px side padding, 4 px items in an 8 px menu with 4 px padding. */
35
+ .el-menu > .sh-pin { display: flex; }
36
+ .el-menu > .sh-pin > span:first-child { flex: 1; }
37
+ .el-btn-icon { gap: var(--bh-space-050); }
38
+ .el-btn-icon svg { flex: none; color: var(--bh-color-icon); }
39
+ .el-menu.is-list { width: 11rem; min-width: 0; }
40
+
41
+ .el-modal-ex { position: relative; overflow: hidden; min-height: calc(4 * var(--bh-space-800)); }
42
+ .el-page { position: absolute; inset: 0; }
43
+ .el-lines { display: grid; gap: var(--bh-space-150); padding: var(--bh-space-300); }
44
+ .el-lines i { height: var(--bh-space-150); border-radius: var(--bh-radius-full); background: var(--bh-color-skeleton); }
45
+ .el-lines i:nth-child(1) { width: 60%; }
46
+ .el-lines i:nth-child(3) { width: 75%; }
47
+ .el-scrim { position: absolute; inset: 0; background: var(--bh-color-surface-scrim); }
48
+ .el-modal-ex > .sh-pin { position: relative; }
49
+ .el-dialog { width: min(100%, 20rem); }
50
+ .el-actions { display: flex; justify-content: flex-end; gap: var(--bh-space-100); }
51
+ .el-scrim-pin { position: absolute; top: var(--bh-space-300); right: calc(var(--bh-space-1000) + var(--bh-space-200)); }
52
+ .el-dot { display: block; width: var(--bh-space-100); height: var(--bh-space-100); }
53
+
54
+ /* Light and dark side by side. */
55
+ .el-themes { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--bh-space-200); margin: var(--bh-space-300) 0; }
56
+ @container prose (min-width: 640px) { .el-themes:not(.is-stack) { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
57
+ .el-theme { margin: 0; overflow: hidden; border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-150); }
58
+ .el-theme figcaption { padding: var(--bh-space-100) var(--bh-space-200); border-bottom: var(--bh-border-width-default) solid var(--bh-color-border); color: var(--bh-color-text-subtle); font: var(--bh-font-label-small); }
59
+ .el-theme-stage { position: relative; display: flex; flex-direction: column; align-items: center; gap: var(--bh-space-400); padding: var(--bh-space-800) var(--bh-space-300); }
60
+ .el-theme-stage > .sh-pin:first-child { position: absolute; top: var(--bh-space-200); left: var(--bh-space-500); }
61
+ .el-theme-stage.is-col { align-items: flex-end; padding: var(--bh-space-400) var(--bh-space-1000) var(--bh-space-400) var(--bh-space-300); }
62
+ @container prose (max-width: 560px) { .el-theme-stage { gap: calc(var(--bh-space-1000) + var(--bh-space-400)); padding-bottom: var(--bh-space-1000); } .el-theme-stage.is-col { align-items: center; padding-right: var(--bh-space-300); } .el-menu.is-list > .sh-pin + .sh-pin { margin-top: var(--bh-space-1000); } }
63
+
64
+ /* Do and don't. */
65
+ .el-panel { display: grid; gap: var(--bh-space-050); width: min(100%, 16rem); padding: var(--bh-space-300); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-150); background: var(--bh-color-surface); }
66
+ .el-panel b { color: var(--bh-color-text); font: var(--bh-font-heading-small); }
67
+ .el-panel span { color: var(--bh-color-text-subtle); font: var(--bh-font-body-default); }
68
+ .el-panel.is-shadowed { box-shadow: var(--bh-elevation-shadow-modal); }
69
+ .el-menu.is-wrong-surface .is-on { background: var(--bh-color-background-neutral-subtle-hover); }
70
+ .el-menu.is-own { box-shadow: var(--bh-elevation-shadow-raised), var(--bh-elevation-shadow-modal); }
71
+ .el-menu.is-bordered { border: var(--bh-border-width-default) solid var(--bh-color-border-bold); }
72
+ .sp-dd-stage.bh-scope-dark { background: var(--bh-color-surface-page); }
73
+ @container prose (max-width: 560px) { .el-ex { padding-bottom: calc(var(--bh-space-1000) + var(--bh-space-800)); } }
74
+ @container prose (max-width: 560px) { .sh-ex.el-ex, .sh-ex.el-ex.is-top { padding-bottom: calc(2 * var(--bh-space-1000) + var(--bh-space-200)); } .el-theme-stage, .el-theme-stage.is-col { padding-bottom: calc(2 * var(--bh-space-1000)); } }
75
+ /* Examples with a pin to the left: the element moves right so the label has room. */
76
+ .sh-ex.el-ex.is-pin-left { justify-content: flex-end; padding-right: calc(2 * var(--bh-space-1000)); }
77
+ .el-modal-ex .el-scrim-pin { right: auto; left: calc(var(--bh-space-1000) + var(--bh-space-600)); top: auto; bottom: calc(var(--bh-space-1000) + var(--bh-space-400)); }
78
+ .el-theme-stage:not(.is-col) { align-items: flex-end; padding-right: calc(2 * var(--bh-space-1000)); }
79
+ @container prose (max-width: 560px) {
80
+ .sh-ex.el-ex.is-pin-left { justify-content: center; padding-right: var(--bh-space-300); }
81
+ .el-theme-stage:not(.is-col), .el-theme-stage.is-col { align-items: flex-start; padding-right: var(--bh-space-300); }
82
+ .el-modal-ex .el-scrim-pin { left: auto; right: calc(var(--bh-space-1000) + var(--bh-space-600)); top: var(--bh-space-100); }
83
+ }
@@ -34,15 +34,6 @@ html { scroll-behavior: smooth; scroll-padding-top: var(--bh-space-1000); scroll
34
34
  (16 px by default), because every size token is in rem. */
35
35
  body { margin: 0; min-width: 320px; overflow-x: hidden; font: var(--bh-font-body-default); }
36
36
  /* Bold inside text is semibold: 700 belongs to the display styles only. */
37
- /* Inter character variants, on everywhere (decided 27/10/2026): cv05 gives lowercase l a tail and
38
- cv08 gives uppercase I serifs, so l, I and 1 never look alike in names, IDs and keys.
39
- Every text style is applied with the `font` shorthand, and the shorthand resets
40
- font-feature-settings to normal, so inheritance alone can't carry the features. This rule sets
41
- them on every element from one variable; change the variable, not the property:
42
- `--bh-font-features: "cv05", "cv08", "zero"` adds the slashed zero to a code value.
43
- JetBrains Mono has no cv05 or cv08, so code is not affected. */
44
- :root { --bh-font-features: "cv05", "cv08"; }
45
- *, ::before, ::after { font-feature-settings: var(--bh-font-features) !important; }
46
37
  b, strong { font-weight: var(--bh-font-weight-semibold); }
47
38
  h1, h2, h3, h4, h5, h6 { font-weight: var(--bh-font-weight-semibold); }
48
39
  code, kbd, pre, samp { font-family: var(--bh-font-family-mono); }
@@ -51,7 +42,7 @@ button, a { -webkit-tap-highlight-color: transparent; }
51
42
  a { color: inherit; }
52
43
  svg { display: block; }
53
44
 
54
- .skip-link { position: fixed; z-index: 200; top: -5rem; left: 1rem; display: inline-flex; align-items: center; height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-100); color: var(--bh-color-text-inverse); background: var(--bh-color-background-neutral-bold); font: var(--bh-font-label-default); }
45
+ .skip-link { position: fixed; z-index: var(--bh-z-index-toast); top: -5rem; left: 1rem; display: inline-flex; align-items: center; height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-100); color: var(--bh-color-text-inverse); background: var(--bh-color-background-neutral-bold); font: var(--bh-font-label-default); }
55
46
  .skip-link:focus { top: 1rem; }
56
47
  h1, h2, h3, p { margin-top: 0; }
57
48
  h1, h2, h3 { text-wrap: balance; }
@@ -5,21 +5,20 @@
5
5
 
6
6
  /* ---------- Library ---------- */
7
7
  .ib { margin: 0 0 var(--bh-space-400); }
8
- .ib-controls { position: sticky; z-index: 5; top: var(--header-bottom, 49px); display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--bh-space-150) var(--bh-space-200); padding: var(--bh-space-150) 0; border-bottom: 1px solid var(--c-line); background: var(--c-bg); }
8
+ .ib-controls { position: sticky; z-index: var(--bh-z-index-sticky); top: var(--header-bottom, 49px); display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--bh-space-150) var(--bh-space-200); padding: var(--bh-space-150) 0; border-bottom: 1px solid var(--c-line); background: var(--c-bg); }
9
9
  .ib-search { position: relative; display: flex; align-items: center; flex: 1 1 280px; min-width: 0; }
10
10
  .ib-search-icon { position: absolute; left: var(--bh-space-150); color: var(--bh-color-icon-subtle); pointer-events: none; }
11
- .ib-search input { width: 100%; height: 40px; padding: 0 var(--bh-space-150) 0 var(--bh-space-400); border: 1px solid var(--bh-color-border-bold); border-radius: var(--bh-radius-100); color: var(--c-ink); background: var(--bh-color-surface); font: var(--bh-font-body-default); }
11
+ .ib-search input { width: 100%; padding: 0 var(--bh-space-150) 0 var(--bh-space-400); }
12
12
  .ib-search input::placeholder { color: var(--bh-color-text-subtlest); }
13
- .ib-field { display: grid; gap: var(--bh-space-050); color: var(--c-muted); font: var(--bh-font-label-small); }
14
13
  /* Category select: the browser's own arrow sits at a fixed spot of its own, so it is replaced by the
15
14
  Lucide chevron at the spacing tokens: 12 px from the edge, 16 px icon, 4 px to the text (as the search field). */
16
15
  .ib-select { position: relative; display: flex; align-items: center; max-width: 100%; }
17
16
  .ib-select-icon { position: absolute; right: var(--bh-space-150); color: var(--bh-color-icon-subtle); pointer-events: none; }
18
- .ib-field select { appearance: none; -webkit-appearance: none; height: 40px; max-width: 100%; padding: 0 var(--bh-space-400) 0 var(--bh-space-150); border: 1px solid var(--bh-color-border-bold); border-radius: var(--bh-radius-100); color: var(--c-ink); background: var(--bh-color-surface); font: var(--bh-font-body-default); }
17
+ .ib-field select { appearance: none; -webkit-appearance: none; max-width: 100%; padding: 0 var(--bh-space-400) 0 var(--bh-space-150); }
19
18
  .ib-sizes { display: flex; }
20
19
  .ib-size { position: relative; }
21
20
  .ib-size input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: pointer; }
22
- .ib-size span { display: grid; place-items: center; min-width: 44px; height: 40px; padding: 0 var(--bh-space-100); border: 1px solid var(--bh-color-border-bold); color: var(--c-muted); background: var(--bh-color-surface); font: var(--bh-font-label-default); font-variant-numeric: tabular-nums; }
21
+ .ib-size span { display: grid; place-items: center; min-width: 44px; height: var(--bh-size-control-default); padding: 0 var(--bh-space-100); border: var(--bh-border-width-default) solid var(--bh-color-border-bold); color: var(--c-muted); background: var(--bh-color-surface); font: var(--bh-font-label-default); font-variant-numeric: tabular-nums; }
23
22
  .ib-size + .ib-size span { margin-left: -1px; }
24
23
  .ib-size:first-of-type span { border-radius: var(--bh-radius-100) 0 0 var(--bh-radius-100); }
25
24
  .ib-size:last-of-type span { border-radius: 0 var(--bh-radius-100) var(--bh-radius-100) 0; }
@@ -38,7 +37,7 @@
38
37
  .ib-icon[data-copied] { border-color: var(--bh-color-border-success); background: var(--bh-color-background-success-subtle); }
39
38
  .ib-icon[data-copied] .ib-name { color: var(--bh-color-text-success); }
40
39
  .prose .ib-empty { margin: var(--bh-space-300) 0; padding: var(--bh-space-300); border: 1px dashed var(--c-line); border-radius: var(--bh-radius-150); color: var(--c-muted); text-align: center; }
41
- .ib-toast { position: fixed; z-index: 60; left: 50%; bottom: 24px; max-width: calc(100vw - 32px); padding: var(--bh-space-100) var(--bh-space-200); border-radius: var(--bh-radius-100); color: var(--bh-color-text-inverse); background: var(--bh-color-surface-inverse); box-shadow: var(--c-shadow); font: var(--bh-font-label-default); opacity: 0; transform: translate(-50%, 8px); transition: opacity 150ms ease, transform 150ms ease; pointer-events: none; }
40
+ .ib-toast { position: fixed; z-index: var(--bh-z-index-toast); left: 50%; bottom: 24px; max-width: calc(100vw - 32px); padding: var(--bh-space-100) var(--bh-space-200); border-radius: var(--bh-radius-100); color: var(--bh-color-text-inverse); background: var(--bh-color-surface-inverse); box-shadow: var(--c-shadow); font: var(--bh-font-label-default); opacity: 0; transform: translate(-50%, 8px); transition: opacity 150ms ease, transform 150ms ease; pointer-events: none; }
42
41
  .ib-toast:empty { padding: 0; }
43
42
  .ib-toast[data-show] { opacity: 1; transform: translate(-50%, 0); }
44
43
  .prose .ib-credit { margin: var(--bh-space-300) 0 0; color: var(--c-muted); font: var(--bh-font-body-small); }
@@ -84,15 +83,15 @@
84
83
  .ic-spaced svg { color: var(--bh-color-icon); }
85
84
  .ic-spaced.is-16 { font: var(--bh-font-label-default); }
86
85
  .ic-spaced.is-20 { font: var(--bh-font-body-large); }
87
- .ic-gap { position: relative; align-self: stretch; min-height: 24px; background: var(--bh-color-background-danger-subtle); box-shadow: inset 1px 0 0 var(--bh-color-border-danger), inset -1px 0 0 var(--bh-color-border-danger); }
86
+ .ic-gap { position: relative; align-self: stretch; min-height: var(--bh-space-300); background: var(--bh-color-background-danger-subtle); box-shadow: inset 1px 0 0 var(--bh-color-border-danger), inset -1px 0 0 var(--bh-color-border-danger); }
88
87
  .is-16 .ic-gap { width: 4px; }
89
88
  .is-20 .ic-gap { width: 8px; }
90
89
  .ic-gap small { position: absolute; top: 100%; left: 50%; margin-top: var(--bh-space-050); color: var(--bh-color-text-danger); font: var(--bh-font-label-small); font-style: normal; transform: translateX(-50%); }
91
90
 
92
91
  /* Target size */
93
92
  .ic-target { position: relative; display: grid; place-items: center; border: 1px dashed var(--bh-color-border-info); border-radius: var(--bh-radius-100); color: var(--bh-color-icon); background: var(--bh-color-background-info-subtle); }
94
- .ic-target.is-24 { width: 24px; height: 24px; }
95
- .ic-target.is-32 { width: 32px; height: 32px; }
93
+ .ic-target.is-24 { width: var(--bh-size-target-minimum); height: var(--bh-size-target-minimum); }
94
+ .ic-target.is-32 { width: var(--bh-size-control-default); height: var(--bh-size-control-default); }
96
95
  .ic-target small { position: absolute; left: 100%; margin-left: var(--bh-space-100); color: var(--bh-color-text-info); font: var(--bh-font-label-small); }
97
96
 
98
97
  /* Common actions */
@@ -114,8 +113,7 @@
114
113
 
115
114
  .ic-row { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--bh-space-100); }
116
115
  .ic-row.is-icons { gap: var(--bh-space-200); color: var(--bh-color-icon); }
117
- .ic-ibtn { display: inline-grid; place-items: center; width: 32px; height: 32px; border-radius: var(--bh-radius-100); color: var(--bh-color-icon); }
118
- .ic-ibtn.is-outlined { border: 1px solid var(--bh-color-border); background: var(--bh-color-surface); }
116
+ .ic-ibtn.is-outlined { border-color: var(--bh-color-border); background: var(--bh-color-surface); }
119
117
  .ic-bare { display: inline-grid; place-items: center; width: 16px; height: 16px; color: var(--bh-color-icon); outline: 1px dashed var(--bh-color-border-danger); outline-offset: 0; }
120
118
  .ic-text14 { display: inline-flex; align-items: center; gap: var(--bh-space-050); color: var(--c-ink); font: var(--bh-font-body-default); }
121
119
  .ic-text14 svg { color: var(--bh-color-icon); }
@@ -126,10 +124,8 @@
126
124
  .ic-text14.is-baseline svg { display: inline; margin-right: var(--bh-space-050); vertical-align: baseline; }
127
125
  .ic-text14 .is-decor { color: var(--bh-color-border-brand); }
128
126
  .ic-nav { display: grid; gap: var(--bh-space-025); width: 180px; }
129
- .ic-nav-item { position: relative; display: flex; align-items: center; gap: var(--bh-space-100); height: 32px; padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-100); color: var(--c-ink); font: var(--bh-font-label-default); }
127
+ .ic-nav-item { position: relative; display: flex; align-items: center; gap: var(--bh-space-100); height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-050); color: var(--bh-color-text); font: var(--bh-font-label-default); }
130
128
  .ic-nav-item svg { color: var(--bh-color-icon); }
131
- .ic-nav-item.is-selected { background: var(--bh-color-background-selected); }
132
- .ic-nav-item.is-selected::before { content: ''; position: absolute; left: 0; top: 6px; bottom: 6px; width: var(--bh-border-width-selected); border-radius: var(--bh-radius-025); background: var(--bh-color-border-selected); }
133
129
  .ic-tip-wrap { display: grid; justify-items: center; gap: var(--bh-space-075); }
134
- .ic-tip { position: relative; padding: var(--bh-space-050) var(--bh-space-100); border-radius: var(--bh-radius-050); color: var(--bh-color-text-inverse); background: var(--bh-color-surface-inverse); font: var(--bh-font-label-small); }
130
+ .ic-tip { position: relative; }
135
131
  .ic-tip::after { content: ''; position: absolute; left: 50%; top: 100%; border: 4px solid transparent; border-top-color: var(--bh-color-surface-inverse); transform: translateX(-50%); }
@@ -0,0 +1,112 @@
1
+ /* Example kit: the one look of each part used in the examples on this site.
2
+ Every value is a token, and each part follows the rules on the foundation pages
3
+ (Color usage, Typography usage, Size and density, Spacing, Radius, Border, Elevation).
4
+ This is not a component library. Real components will replace it.
5
+ The older class names after each kit-* name are aliases kept while the demos move to kit-*. */
6
+
7
+ /* Button: 32 px, side padding space.150, radius.100, label.default. */
8
+ .kit-btn, .sp-btn, .c-button, .ui-btn, .bh-button, .ic-ibtn, .icon-button { display: inline-flex; flex: none; align-items: center; justify-content: center; gap: var(--bh-space-050); box-sizing: border-box; height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-100); color: var(--bh-color-text); background: var(--bh-color-surface); white-space: nowrap; font: var(--bh-font-label-default); }
9
+ :is(button, a):is(.kit-btn, .bh-button) { cursor: pointer; text-decoration: none; }
10
+ :is(button, a):is(.kit-btn, .bh-button):hover { background: var(--bh-color-background-neutral-subtle-hover); }
11
+ :is(.kit-btn, .bh-button):focus-visible { outline: var(--bh-border-width-focused) solid var(--bh-color-border-focus); outline-offset: var(--bh-state-focus-offset); }
12
+ :is(.kit-btn, .sp-btn, .c-button).is-primary, .ui-btn, .bh-button-primary { border-color: var(--bh-color-background-neutral-bold); color: var(--bh-color-text-inverse); background: var(--bh-color-background-neutral-bold); }
13
+ :is(button, a):is(.kit-btn.is-primary, .bh-button-primary):hover { border-color: var(--bh-color-background-neutral-bold-hover); background: var(--bh-color-background-neutral-bold-hover); }
14
+ :is(.kit-btn, .sp-btn, .c-button).is-danger, .bh-button-danger { border-color: var(--bh-color-background-danger-bold); color: var(--bh-color-text-on-bold); background: var(--bh-color-background-danger-bold); }
15
+ :is(button, a):is(.kit-btn.is-danger, .bh-button-danger):hover { border-color: var(--bh-color-background-danger-bold-hover); background: var(--bh-color-background-danger-bold-hover); }
16
+ :is(.kit-btn, .sp-btn).is-small { height: var(--bh-size-control-small); padding: 0 var(--bh-space-100); font: var(--bh-font-label-small); }
17
+ :is(.kit-btn, .sp-btn).is-large { height: var(--bh-size-control-large); padding: 0 var(--bh-space-200); }
18
+ /* Icon button: square, same height as a button. */
19
+ .kit-btn.is-icon, .ic-ibtn, .icon-button { width: var(--bh-size-control-default); padding: 0; color: var(--bh-color-icon); }
20
+ .kit-btn.is-subtle, .ic-ibtn:not(.is-outlined) { border-color: transparent; background: transparent; }
21
+ :is(.kit-btn, .bh-button):disabled, :is(.kit-btn, .bh-button):disabled:hover { border-color: var(--bh-color-border-disabled); color: var(--bh-color-text-disabled); background: var(--bh-color-background-disabled); cursor: not-allowed; }
22
+
23
+ /* Text field and select: 32 px, edge border.bold, placeholder text.subtlest. */
24
+ .kit-input, .sp-input, .ib-search input, .ib-field select { box-sizing: border-box; height: var(--bh-size-control-default); border: var(--bh-border-width-default) solid var(--bh-color-border-bold); border-radius: var(--bh-radius-100); color: var(--bh-color-text); background: var(--bh-color-surface); font: var(--bh-font-body-default); }
25
+ .kit-input { padding: 0 var(--bh-space-150); }
26
+ .kit-input::placeholder, .ib-search input::placeholder { color: var(--bh-color-text-subtlest); }
27
+ .kit-field, .zi-field, .ib-field { display: grid; gap: var(--bh-space-050); color: var(--bh-color-text); font: var(--bh-font-label-default); }
28
+
29
+ /* Card: surface, border, radius.150, padding space.300, raised at rest. */
30
+ .kit-card, .el-card, .op-tile, .ui-card, .c-surf-card { box-sizing: border-box; padding: var(--bh-space-300); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-150); background: var(--bh-color-surface); box-shadow: var(--bh-elevation-shadow-raised); }
31
+ .kit-card-title, .el-card > b, .op-tile b { color: var(--bh-color-text); font: var(--bh-font-heading-small); }
32
+ .kit-card-text, .el-card > span, .op-tile span.op-status { color: var(--bh-color-text-subtle); font: var(--bh-font-body-default); }
33
+
34
+ /* Menu: surface.overlay, radius.100, padding space.050, shadow overlay. Items 32 px, radius.050, label.default. */
35
+ .kit-menu, .sh-menu, .el-menu { display: grid; box-sizing: border-box; padding: var(--bh-space-050); border-radius: var(--bh-radius-100); background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-overlay); }
36
+ .kit-menu-item, .sh-menu > span:not(.sh-pin), .sh-menu > .sh-pin > span:first-child, .el-menu > span:not(.sh-pin):not(.zi-n), .el-menu > .sh-pin > span:first-child { display: flex; align-items: center; justify-content: space-between; gap: var(--bh-space-100); min-height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-050); color: var(--bh-color-text); font: var(--bh-font-label-default); }
37
+ :is(.kit-menu, .sh-menu, .el-menu) .is-on { background: var(--bh-color-surface-overlay-hover); }
38
+ :is(.kit-menu, .sh-menu, .el-menu) .is-sel { background: var(--bh-color-surface-overlay-selected); }
39
+ :is(.kit-menu, .sh-menu, .el-menu) .is-sel svg { flex: none; color: var(--bh-color-icon); }
40
+ :is(.kit-menu, .sh-menu, .el-menu) .is-focus { outline: var(--bh-border-width-focused) solid var(--bh-color-border-focus); outline-offset: calc(-1 * var(--bh-state-focus-offset)); }
41
+
42
+ /* Label: shows a status. 20 px pill, outline, padding space.075, label.small. */
43
+ .kit-label, .bh-label, .ui-badge, .sh-tag.is-pill { display: inline-flex; align-items: center; box-sizing: border-box; height: var(--bh-space-250); padding: 0 var(--bh-space-075); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-full); color: var(--bh-color-text); background: transparent; white-space: nowrap; font: var(--bh-font-label-small); }
44
+ :is(.kit-label, .bh-label).is-large { height: var(--bh-size-control-small); padding: 0 var(--bh-space-100); }
45
+ :is(.kit-label, .bh-label).is-brand { border-color: var(--bh-color-border-brand); }
46
+ :is(.kit-label, .bh-label).is-info { border-color: var(--bh-color-border-info); color: var(--bh-color-text-info); }
47
+ :is(.kit-label, .bh-label).is-success, .ui-badge, .sh-tag.is-pill { border-color: var(--bh-color-border-success); color: var(--bh-color-text-success); }
48
+ :is(.kit-label, .bh-label).is-warning { border-color: var(--bh-color-border-warning); color: var(--bh-color-text-warning); }
49
+ :is(.kit-label, .bh-label).is-danger, .ui-badge.is-error { border-color: var(--bh-color-border-danger); color: var(--bh-color-text-danger); }
50
+ :is(.kit-label, .bh-label).is-neutral { border-color: var(--bh-color-border-bold); color: var(--bh-color-text-subtle); }
51
+
52
+ /* Tag: something people add or remove. 24 px, radius.050, border, text. */
53
+ .kit-tag, .sh-tag:not(.is-pill) { display: inline-flex; align-items: center; gap: var(--bh-space-050); box-sizing: border-box; height: var(--bh-size-control-small); padding: 0 var(--bh-space-100); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-050); color: var(--bh-color-text); background: var(--bh-color-surface); font: var(--bh-font-label-small); }
54
+
55
+ /* Table: header surface.subtle, label.small, text.subtle. Cells space.100 space.150, body.default. */
56
+ .kit-table th, .kit-th { padding: var(--bh-space-100) var(--bh-space-150); border-bottom: var(--bh-border-width-default) solid var(--bh-color-border); color: var(--bh-color-text-subtle); background: var(--bh-color-surface-subtle); text-align: left; font: var(--bh-font-label-small); }
57
+ .kit-table td, .kit-td { padding: var(--bh-space-100) var(--bh-space-150); border-bottom: var(--bh-border-width-default) solid var(--bh-color-border); color: var(--bh-color-text); font: var(--bh-font-body-default); }
58
+
59
+ /* Dialog: surface.overlay, radius.200, padding space.300, shadow modal, title heading.medium. */
60
+ .kit-dialog, .el-dialog, .zi-mini-dialog, .c-surf-dialog { display: grid; gap: var(--bh-space-200); box-sizing: border-box; padding: var(--bh-space-300); border-radius: var(--bh-radius-200); color: var(--bh-color-text-subtle); background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-modal); font: var(--bh-font-body-default); }
61
+ .kit-dialog-title, .el-dialog b, .zi-mini-dialog b, .c-surf-dialog b { color: var(--bh-color-text); font: var(--bh-font-heading-medium); }
62
+
63
+ /* Tooltip: surface.inverse, radius.100, padding space.050 space.075, body.small. */
64
+ .kit-tooltip, .sh-tip, .ic-tip, .zi-tip { box-sizing: border-box; padding: var(--bh-space-050) var(--bh-space-075); border-radius: var(--bh-radius-100); color: var(--bh-color-text-inverse); background: var(--bh-color-surface-inverse); font: var(--bh-font-body-small); }
65
+
66
+ /* Toast: surface.overlay and overlay shadow, no border (like menus); icon in the status colour.
67
+ Title heading.xsmall, message body.default. */
68
+ .kit-toast, .el-toast, .ib-toast { display: inline-flex; align-items: center; gap: var(--bh-space-100); box-sizing: border-box; padding: var(--bh-space-150) var(--bh-space-200); border-radius: var(--bh-radius-100); color: var(--bh-color-text); background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-overlay); font: var(--bh-font-body-default); }
69
+ :is(.kit-toast, .el-toast) > svg { flex: none; }
70
+ :is(.kit-toast, .el-toast).is-info > svg { color: var(--bh-color-icon-info); }
71
+ :is(.kit-toast, .el-toast).is-success > svg { color: var(--bh-color-icon-success); }
72
+ :is(.kit-toast, .el-toast).is-warning > svg { color: var(--bh-color-icon-warning); }
73
+ :is(.kit-toast, .el-toast).is-danger > svg { color: var(--bh-color-icon-danger); }
74
+ .kit-toast b { color: var(--bh-color-text); font: var(--bh-font-heading-xsmall); }
75
+
76
+ /* Banner: background.{role}.subtle, border.{role}.subtle, text, icon.{role}. */
77
+ .kit-banner, .c-banner { display: flex; align-items: center; gap: var(--bh-space-100); box-sizing: border-box; padding: var(--bh-space-100) var(--bh-space-150); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-100); color: var(--bh-color-text); font: var(--bh-font-body-default); }
78
+ :is(.kit-banner, .c-banner) svg { flex: none; }
79
+ :is(.kit-banner, .c-banner).is-info { border-color: var(--bh-color-border-info-subtle); background: var(--bh-color-background-info-subtle); }
80
+ :is(.kit-banner, .c-banner).is-info svg { color: var(--bh-color-icon-info); }
81
+ :is(.kit-banner, .c-banner).is-success { border-color: var(--bh-color-border-success-subtle); background: var(--bh-color-background-success-subtle); }
82
+ :is(.kit-banner, .c-banner).is-success svg { color: var(--bh-color-icon-success); }
83
+ :is(.kit-banner, .c-banner).is-warning { border-color: var(--bh-color-border-warning-subtle); background: var(--bh-color-background-warning-subtle); }
84
+ :is(.kit-banner, .c-banner).is-warning svg { color: var(--bh-color-icon-warning); }
85
+ :is(.kit-banner, .c-banner).is-danger { border-color: var(--bh-color-border-danger-subtle); background: var(--bh-color-background-danger-subtle); }
86
+ :is(.kit-banner, .c-banner).is-danger svg { color: var(--bh-color-icon-danger); }
87
+
88
+ /* Callout: content note with a 4 px bar on the left edge. Not for statuses; those are banners. */
89
+ .kit-callout, .sh-alert { --kit-bar: var(--bh-color-border-info); position: relative; display: grid; gap: var(--bh-space-025); box-sizing: border-box; padding: var(--bh-space-150) var(--bh-space-200) var(--bh-space-150) calc(var(--bh-space-200) + var(--bh-border-width-accent)); overflow: hidden; border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-100); background: var(--bh-color-surface); }
90
+ :is(.kit-callout, .sh-alert)::before { content: ""; position: absolute; inset: 0 auto 0 0; width: var(--bh-border-width-accent); background: var(--kit-bar); }
91
+ :is(.kit-callout, .sh-alert).is-brand { --kit-bar: var(--bh-color-border-brand); }
92
+ :is(.kit-callout, .sh-alert) b { color: var(--bh-color-text); font: var(--bh-font-heading-xsmall); }
93
+ :is(.kit-callout, .sh-alert) span { color: var(--bh-color-text-subtle); font: var(--bh-font-body-default); }
94
+
95
+ /* Switch: 20 x 36, knob 16 px. On background.neutral.bold; off background.neutral with a border.bold edge. */
96
+ .kit-switch, .sh-switch, .op-switch { position: relative; flex: none; display: inline-block; box-sizing: border-box; width: calc(2 * var(--bh-space-200) + 2 * var(--bh-space-025)); height: var(--bh-space-250); border-radius: var(--bh-radius-full); background: var(--bh-color-background-neutral-bold); }
97
+ :is(.kit-switch, .sh-switch, .op-switch)::after { content: ""; position: absolute; top: var(--bh-space-025); right: var(--bh-space-025); width: var(--bh-space-200); height: var(--bh-space-200); border-radius: var(--bh-radius-full); background: var(--bh-color-surface); }
98
+ .kit-switch.is-off { background: var(--bh-color-background-neutral); box-shadow: inset 0 0 0 var(--bh-border-width-default) var(--bh-color-border-bold); }
99
+ .kit-switch.is-off::after { right: auto; left: var(--bh-space-025); }
100
+
101
+ /* Avatar: 32 px circle, background.neutral, text, label.small. Small 24 px. */
102
+ .kit-avatar, .sh-avatar, .op-avatar { display: inline-grid; flex: none; place-items: center; width: var(--bh-size-control-default); height: var(--bh-size-control-default); border-radius: var(--bh-radius-full); color: var(--bh-color-text); background: var(--bh-color-background-neutral); font: var(--bh-font-label-small); }
103
+ .kit-avatar.is-small { width: var(--bh-size-control-small); height: var(--bh-size-control-small); }
104
+
105
+ /* Step number or count: background.neutral.bold, text.inverse. */
106
+ .kit-count, .zi-n { display: inline-grid; flex: none; place-items: center; box-sizing: border-box; min-width: var(--bh-space-250); height: var(--bh-space-250); padding: 0 var(--bh-space-050); border-radius: var(--bh-radius-full); color: var(--bh-color-text-inverse); background: var(--bh-color-background-neutral-bold); font: var(--bh-font-label-small); font-variant-numeric: tabular-nums; }
107
+
108
+ /* Selected item in a navigation list: background.selected and a border.selected bar inside the left edge. */
109
+ .kit-nav-item { display: flex; align-items: center; gap: var(--bh-space-100); height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-050); color: var(--bh-color-text); font: var(--bh-font-label-default); }
110
+ .kit-nav-item.is-selected, .ic-nav-item.is-selected { background: var(--bh-color-background-selected); box-shadow: inset var(--bh-border-width-selected) 0 0 var(--bh-color-border-selected); }
111
+ /* A count on an inverse surface flips to the surface colours. */
112
+ .kit-tooltip .kit-count, .zi-tip .zi-n { color: var(--bh-color-text); background: var(--bh-color-surface); }
@@ -51,13 +51,9 @@
51
51
  .sp-title { color: var(--bh-color-text); font: var(--bh-font-heading-small); }
52
52
  .sp-desc { color: var(--bh-color-text-subtle); font: var(--bh-font-body-default); }
53
53
  .sp-label { color: var(--bh-color-text); font: var(--bh-font-label-default); }
54
- .sp-input { display: flex; align-items: stretch; min-width: 0; height: var(--bh-space-400); border: var(--bh-border-width-default) solid var(--bh-color-border-bold); border-radius: var(--bh-radius-100); background: var(--bh-color-surface); }
54
+ .sp-input { display: flex; align-items: stretch; min-width: 0; }
55
55
  .sp-input > span:not(.sp-gap) { align-self: center; overflow: hidden; color: var(--bh-color-text-subtle); white-space: nowrap; text-overflow: ellipsis; font: var(--bh-font-body-default); }
56
56
  .sp-input .sp-gap.is-h { margin: calc(-1 * var(--bh-border-width-default)) 0; }
57
- .sp-btn { display: inline-flex; flex: none; align-items: center; height: var(--bh-size-control-default); padding: 0 var(--bh-space-200); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-100); color: var(--bh-color-text); background: var(--bh-color-surface); font: var(--bh-font-label-default); }
58
- .sp-btn.is-primary { border-color: var(--bh-color-background-neutral-bold); color: var(--bh-color-text-inverse); background: var(--bh-color-background-neutral-bold); }
59
- .sp-btn.is-small { height: var(--bh-size-control-small); padding: 0 var(--bh-space-100); font: var(--bh-font-label-small); }
60
- .sp-btn.is-large { height: var(--bh-size-control-large); padding: 0 var(--bh-space-200); }
61
57
  .sp-legend { display: flex; flex-wrap: wrap; align-items: center; gap: var(--bh-space-100); }
62
58
  .sp-swatch { display: inline-block; width: var(--bh-space-200); height: var(--bh-space-200); border-radius: var(--bh-radius-050); background: var(--sp-mark); box-shadow: inset 0 0 0 var(--bh-border-width-default) var(--sp-mark-edge); vertical-align: middle; }
63
59
  @container prose (min-width: 560px) { .sp-stage { padding: var(--bh-space-400) var(--bh-space-200); } .sp-gap.is-v > .sp-tag { right: 0; transform: translate(calc(100% + var(--bh-space-300) + var(--bh-space-050)), -50%); } }
@@ -81,7 +77,6 @@
81
77
  .sp-dd-stage { display: grid; place-items: center; min-height: 9rem; padding: var(--bh-space-200); background: var(--c-surf); }
82
78
  .sp-dd-panel p { margin: 0; padding: var(--bh-space-150) var(--bh-space-200); color: var(--c-muted); font: var(--bh-font-body-default); }
83
79
  .sp-mini { display: flex; flex-direction: column; width: 100%; max-width: 15rem; }
84
- .sp-mini .sp-input { height: var(--bh-space-400); }
85
80
  .sp-mini-group { color: var(--bh-color-text); font: var(--bh-font-heading-xsmall); }
86
81
  .sp-badge-host { position: relative; display: inline-grid; place-items: center; width: var(--bh-space-400); height: var(--bh-space-400); border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-100); background: var(--bh-color-surface); color: var(--bh-color-icon); }
87
82
  .sp-badge { position: absolute; top: var(--bh-space-025); right: var(--bh-space-025); width: var(--bh-space-100); height: var(--bh-space-100); border-radius: var(--bh-radius-full); background: var(--bh-color-background-danger-bold); }
@@ -0,0 +1,43 @@
1
+ /* Illustrations for the Opacity page. Every value is a token. */
2
+ .op-wrap { display: grid; gap: var(--bh-space-200); margin: var(--bh-space-300) 0; padding: var(--bh-space-300); border-radius: var(--bh-radius-150); background: var(--bh-color-surface-subtle); }
3
+ .op-label { color: var(--bh-color-text-subtle); font: var(--bh-font-label-small); }
4
+ .op-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); gap: var(--bh-space-200); }
5
+ .op-tile { display: grid; gap: var(--bh-space-100); }
6
+ .op-tile-top { display: flex; align-items: center; justify-content: space-between; }
7
+ .op-tile.is-off b, .op-tile.is-off span.op-status, .op-row.is-off .op-name, .op-row.is-off .op-role { color: var(--bh-color-text-disabled); }
8
+ .op-logo { display: inline-grid; place-items: center; width: var(--bh-size-control-large); height: var(--bh-size-control-large); border-radius: var(--bh-radius-100); color: var(--bh-color-text-on-bold); font: var(--bh-font-label-default); }
9
+ .op-logo.is-a { background: var(--bh-color-background-success-bold); }
10
+ .op-logo.is-b { background: var(--bh-color-background-info-bold); }
11
+ .op-logo.is-c { background: var(--bh-color-background-warning-bold); }
12
+ .op-logo.is-d { background: var(--bh-color-background-danger-bold); }
13
+ .op-logo.is-e { background: var(--bh-color-background-neutral-bold); }
14
+ .op-logo.is-f { background: var(--bh-color-background-brand-bold); color: var(--bh-color-text-on-brand); }
15
+ .is-off .op-logo, .is-off .op-avatar { opacity: var(--bh-opacity-disabled); }
16
+ .is-off .op-switch { background: var(--bh-color-background-disabled); }
17
+ .op-list { overflow: hidden; border: var(--bh-border-width-default) solid var(--bh-color-border); border-radius: var(--bh-radius-150); background: var(--bh-color-surface); }
18
+ .op-row { display: flex; align-items: center; gap: var(--bh-space-150); padding: var(--bh-space-100) var(--bh-space-200); }
19
+ .op-row + .op-row { border-top: var(--bh-border-width-default) solid var(--bh-color-border); }
20
+ .op-name { flex: 1; color: var(--bh-color-text); font: var(--bh-font-body-default); }
21
+ .op-role { color: var(--bh-color-text-subtle); font: var(--bh-font-body-default); }
22
+ .op-tile.is-wrong { opacity: var(--bh-opacity-disabled); }
23
+ .op-scrim-box { position: relative; height: 10rem; overflow: hidden; border-radius: var(--bh-radius-150); background: var(--bh-color-surface-page); }
24
+ .op-lines { display: grid; gap: var(--bh-space-100); padding: var(--bh-space-200); }
25
+ .op-lines span { height: var(--bh-space-100); border-radius: var(--bh-radius-full); background: var(--bh-color-skeleton); }
26
+ .op-scrim { position: absolute; inset: 0; background: var(--bh-color-surface-scrim); }
27
+ .op-dialog { position: absolute; top: 50%; left: 50%; padding: var(--bh-space-200) var(--bh-space-300); border-radius: var(--bh-radius-200); background: var(--bh-color-surface-overlay); box-shadow: var(--bh-elevation-shadow-modal); color: var(--bh-color-text); font: var(--bh-font-heading-small); transform: translate(-50%, -50%); }
28
+ .op-ex { background: var(--bh-color-surface-page); }
29
+ .op-tile-lg { width: min(100%, 16rem); }
30
+ .op-tile .sh-pin { display: inline-flex; }
31
+ .el-theme .op-scrim-box { border-radius: 0; }
32
+ .op-scrim-pin { position: absolute; top: var(--bh-space-200); left: calc(var(--bh-space-1000) + var(--bh-space-600)); }
33
+ .op-band { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--bh-space-150); width: min(100%, 22rem); padding: var(--bh-space-150) var(--bh-space-200); border-radius: var(--bh-radius-100); background: var(--bh-color-background-warning-subtle); }
34
+ .op-band-text { color: var(--bh-color-text); font: var(--bh-font-body-default); }
35
+ .op-btn-off { border-color: var(--bh-color-border-disabled); color: var(--bh-color-text-disabled); background: var(--bh-color-background-disabled); }
36
+ .op-btn-faded { opacity: var(--bh-opacity-disabled); }
37
+ .sp-dd-stage .op-tile { width: min(100%, 14rem); }
38
+ .op-tile-top { gap: var(--bh-space-150); }
39
+ .op-tile.is-wrong .op-switch { background: var(--bh-color-background-disabled); }
40
+ .el-theme .op-scrim-box { height: calc(2 * var(--bh-space-1000) + var(--bh-space-600)); }
41
+ .el-theme .op-dialog { top: auto; bottom: var(--bh-space-300); transform: translateX(-50%); }
42
+ /* Switch: a thumb on the track, right when on, left when off. */
43
+ .is-off .op-switch::after, .op-tile.is-wrong .op-switch::after { right: auto; left: var(--bh-space-025); background: var(--bh-color-surface); }