@getvitops/generator 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +35 -0
  2. package/assets/bricks/elements/carousel.php +89 -0
  3. package/assets/bricks/elements/centered.php +128 -0
  4. package/assets/bricks/elements/color-scheme-toggle.php +61 -0
  5. package/assets/bricks/elements/copy-button.php +65 -0
  6. package/assets/bricks/elements/dismissable.php +93 -0
  7. package/assets/bricks/elements/entries.php +96 -0
  8. package/assets/bricks/elements/image-compare.php +132 -0
  9. package/assets/bricks/elements/multi-field.php +148 -0
  10. package/assets/bricks/elements/sitenav.php +298 -0
  11. package/assets/bricks/elements/split-link.php +170 -0
  12. package/assets/bricks/elements/split-panel.php +155 -0
  13. package/assets/bricks/elements/split.php +83 -0
  14. package/assets/bricks/load.php +129 -0
  15. package/assets/css/animation.css +526 -0
  16. package/assets/css/global.css +17 -0
  17. package/assets/css/index.css +58 -0
  18. package/assets/css/layout.css +723 -0
  19. package/assets/css/patterns/anchor-link.css +66 -0
  20. package/assets/css/patterns/banner.css +64 -0
  21. package/assets/css/patterns/carousel.css +269 -0
  22. package/assets/css/patterns/cluster.css +64 -0
  23. package/assets/css/patterns/code.css +17 -0
  24. package/assets/css/patterns/combobox.css +97 -0
  25. package/assets/css/patterns/comment.css +88 -0
  26. package/assets/css/patterns/copy.css +82 -0
  27. package/assets/css/patterns/details.css +87 -0
  28. package/assets/css/patterns/dialog.css +99 -0
  29. package/assets/css/patterns/drawer.css +108 -0
  30. package/assets/css/patterns/dropdown.css +45 -0
  31. package/assets/css/patterns/forms.css +335 -0
  32. package/assets/css/patterns/grouped.css +86 -0
  33. package/assets/css/patterns/horizontal-scroll.css +40 -0
  34. package/assets/css/patterns/icon.css +72 -0
  35. package/assets/css/patterns/lightbox.css +156 -0
  36. package/assets/css/patterns/list.css +272 -0
  37. package/assets/css/patterns/marquee.css +68 -0
  38. package/assets/css/patterns/masonry.css +40 -0
  39. package/assets/css/patterns/media.css +70 -0
  40. package/assets/css/patterns/nav.css +241 -0
  41. package/assets/css/patterns/notification.css +114 -0
  42. package/assets/css/patterns/overlay.css +28 -0
  43. package/assets/css/patterns/popover.css +68 -0
  44. package/assets/css/patterns/pull-quote.css +71 -0
  45. package/assets/css/patterns/scroll-based.css +227 -0
  46. package/assets/css/patterns/scroll-target.css +124 -0
  47. package/assets/css/patterns/separator.css +130 -0
  48. package/assets/css/patterns/sitenav.css +582 -0
  49. package/assets/css/patterns/split-link.css +113 -0
  50. package/assets/css/patterns/splitter.css +212 -0
  51. package/assets/css/patterns/stack.css +67 -0
  52. package/assets/css/patterns/sticky.css +127 -0
  53. package/assets/css/patterns/subgrid.css +178 -0
  54. package/assets/css/patterns/svg.css +166 -0
  55. package/assets/css/patterns/table.css +106 -0
  56. package/assets/css/patterns/tag.css +75 -0
  57. package/assets/css/patterns/text-effects.css +317 -0
  58. package/assets/css/patterns/tooltip.css +68 -0
  59. package/assets/css/patterns/tree.css +126 -0
  60. package/assets/css/utilities.css +351 -0
  61. package/assets/js/deferred.js +1 -0
  62. package/assets/js/elements.js +887 -0
  63. package/assets/js/polyfills/adoptedStyleSheets.js +1 -0
  64. package/assets/js/polyfills/css-anchor-positioning-fn.js +17 -0
  65. package/assets/js/polyfills/global.esm.js +1 -0
  66. package/assets/js/polyfills/popover.js +63 -0
  67. package/assets/js/polyfills/template-shadowroot.js +24 -0
  68. package/assets/js/polyfills/webcomponents-bundle.js +27 -0
  69. package/assets/js/polyfills.js +1 -0
  70. package/dist/index.d.mts +1425 -0
  71. package/dist/index.d.mts.map +1 -0
  72. package/dist/index.mjs +2611 -0
  73. package/dist/index.mjs.map +1 -0
  74. package/package.json +33 -0
  75. package/schema.json +508 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Separator — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Separator — dividers with dashed/dotted/fade/text/ornament variants ───── */
7
+ .separator,
8
+ hr.separator {
9
+ --_separator-size: var(--separator-size, 1px);
10
+
11
+ border: none;
12
+
13
+ &:not(.separator--vertical) {
14
+ block-size: var(--_separator-size);
15
+ inline-size: 100%;
16
+ background: currentColor;
17
+ }
18
+
19
+ &.separator--vertical {
20
+ inline-size: var(--_separator-size);
21
+ block-size: 100%;
22
+ background: currentColor;
23
+ }
24
+
25
+ &.separator--dashed {
26
+ background: repeating-linear-gradient(
27
+ to right,
28
+ currentColor 0,
29
+ currentColor 8px,
30
+ transparent 8px,
31
+ transparent 16px
32
+ );
33
+ }
34
+
35
+ &.separator--dashed.separator--vertical {
36
+ background: repeating-linear-gradient(
37
+ to bottom,
38
+ currentColor 0,
39
+ currentColor 8px,
40
+ transparent 8px,
41
+ transparent 16px
42
+ );
43
+ }
44
+
45
+ &.separator--dotted {
46
+ background: repeating-linear-gradient(
47
+ to right,
48
+ currentColor 0,
49
+ currentColor 2px,
50
+ transparent 2px,
51
+ transparent 8px
52
+ );
53
+ }
54
+
55
+ &.separator--dotted.separator--vertical {
56
+ background: repeating-linear-gradient(
57
+ to bottom,
58
+ currentColor 0,
59
+ currentColor 2px,
60
+ transparent 2px,
61
+ transparent 8px
62
+ );
63
+ }
64
+
65
+ &.separator--fade {
66
+ background: linear-gradient(
67
+ to right,
68
+ transparent,
69
+ currentColor 20%,
70
+ currentColor 80%,
71
+ transparent
72
+ );
73
+ }
74
+
75
+ &.separator--fade.separator--vertical {
76
+ background: linear-gradient(
77
+ to bottom,
78
+ transparent,
79
+ currentColor 20%,
80
+ currentColor 80%,
81
+ transparent
82
+ );
83
+ }
84
+
85
+ &.separator--with-text,
86
+ &.separator--ornament {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 1rem;
90
+ background: none;
91
+ block-size: auto;
92
+
93
+ &::before,
94
+ &::after {
95
+ content: '';
96
+ flex: 1;
97
+ block-size: var(--_separator-size);
98
+ background: currentColor;
99
+ }
100
+ }
101
+
102
+ &.separator--ornament {
103
+ justify-content: center;
104
+ }
105
+
106
+ .separator__text {
107
+ flex-shrink: 0;
108
+ font-size: 0.875em;
109
+ text-transform: uppercase;
110
+ letter-spacing: 0.05em;
111
+ }
112
+
113
+ .separator__ornament {
114
+ flex-shrink: 0;
115
+ inline-size: 1.5rem;
116
+ block-size: 1.5rem;
117
+ background: currentColor;
118
+ mask-size: contain;
119
+ mask-repeat: no-repeat;
120
+ mask-position: center;
121
+ }
122
+
123
+ .separator__ornament--diamond {
124
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='6' y='6' width='12' height='12' transform='rotate(45 12 12)'/%3E%3C/svg%3E");
125
+ }
126
+
127
+ .separator__ornament--star {
128
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'%3E%3Cpath d='M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L440.2 329l104.1-103c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L382.9 150.3 316.9 18z'/%3E%3C/svg%3E");
129
+ }
130
+ }
@@ -0,0 +1,582 @@
1
+ /**
2
+ * Site Nav — the site's primary navigation, generated from a WordPress menu
3
+ * (Bricks `vitops-sitenav`). One markup tree, two presentations switched purely by
4
+ * container width — native platform only, no JS beyond the Popover API.
5
+ *
6
+ * Mobile-first (below `.sitenav--bp-{sm,md,lg,xl}`): a hamburger button (a Popover
7
+ * API invoker) opens a slide-in DRAWER — its sibling `[popover]`. Inside, branch
8
+ * items are ACCORDIONS: each is a real parent link flush with a `<details>`
9
+ * disclosure whose `<summary>` is *only* the caret (the link sits OUTSIDE the
10
+ * summary, so nothing interactive nests inside the summary's button role). The
11
+ * submenu opens in-flow via a grid-row height transition.
12
+ *
13
+ * Desktop (≥ the breakpoint, gated against the nearest container — `body` per
14
+ * layout.css): the hamburger + drawer chrome fall away, the `[popover]` panel is
15
+ * forced back inline as a NAVBAR, the list turns horizontal, and each branch's
16
+ * submenu promotes to a pop-out DROPDOWN revealed on hover, keyboard `:focus-within`,
17
+ * OR click (native `[open]` pins it). Top-level submenus drop below their item;
18
+ * deeper (megamenu) submenus fly out to the inline-end side.
19
+ *
20
+ * `.sitenav__disclosure` is `display: contents` so the `<summary>` (caret) and the
21
+ * submenu `<ul>` participate directly in the branch item's grid — that is what lets
22
+ * the caret sit inline with the link while the submenu spans full width on its own
23
+ * row. Native `[open]` toggling is unaffected by `display: contents`.
24
+ *
25
+ * Per-breakpoint depth caps come pre-resolved from PHP as item classes:
26
+ * `.sitenav__item--desktop-branch` — caret + submenu shown only ≥ breakpoint;
27
+ * `.sitenav__item--mobile-branch` — caret + submenu shown only below breakpoint.
28
+ * The parent link always stays, so a capped branch degrades to a plain link.
29
+ */
30
+
31
+ /* ── Container + mobile chrome ─────────────────────────────────────────────── */
32
+ .sitenav {
33
+ display: flex;
34
+ align-items: center;
35
+ }
36
+
37
+ .sitenav__toggle,
38
+ .sitenav__close {
39
+ display: inline-flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ padding: 0.5rem;
43
+ background: transparent;
44
+ border: none;
45
+ color: inherit;
46
+ cursor: pointer;
47
+ border-radius: var(--br-control, 0.375rem);
48
+
49
+ &:hover {
50
+ background: var(--color-surface-l);
51
+ }
52
+
53
+ &:focus-visible {
54
+ outline: 2px solid var(--sitenav-focus-color, var(--color-brand-primary-l));
55
+ outline-offset: 2px;
56
+ }
57
+ }
58
+
59
+ .sitenav__close {
60
+ position: absolute;
61
+ inset-block-start: 0.75rem;
62
+ inset-inline-end: 0.75rem;
63
+ }
64
+
65
+ /* ── Drawer (mobile) — the [popover] sibling the hamburger controls ─────────── */
66
+ .sitenav__panel {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: 0.25rem;
70
+ position: fixed;
71
+ inset-block: 0;
72
+ inline-size: min(100dvw, var(--sitenav-drawer-size, 20rem));
73
+ max-inline-size: 100dvw;
74
+ padding: 1.5rem;
75
+ padding-block-start: 3.5rem; /* clearance for the close button */
76
+ background: var(--color-surface-xxl);
77
+ color: var(--color-surface-xxd);
78
+ border: none;
79
+ box-shadow: var(--ds-panel);
80
+ overflow-y: auto;
81
+ overscroll-behavior: contain;
82
+ z-index: var(--z-tier-overlay);
83
+
84
+ /* Popover API toggles display; fade + slide across the top-layer transition. */
85
+ opacity: 0;
86
+ transition:
87
+ opacity 0.3s ease,
88
+ translate 0.3s ease,
89
+ overlay 0.3s allow-discrete,
90
+ display 0.3s allow-discrete;
91
+
92
+ &::backdrop {
93
+ background: transparent;
94
+ transition:
95
+ background-color 0.3s,
96
+ overlay 0.3s allow-discrete,
97
+ display 0.3s allow-discrete;
98
+ }
99
+
100
+ &:popover-open::backdrop {
101
+ background: rgb(0 0 0 / 25%);
102
+ }
103
+ }
104
+
105
+ /* Slide from the chosen edge (default inline-end). */
106
+ .sitenav--drawer-end .sitenav__panel {
107
+ inset-inline-end: 0;
108
+ inset-inline-start: auto;
109
+ translate: 100% 0;
110
+ }
111
+ .sitenav--drawer-start .sitenav__panel {
112
+ inset-inline-start: 0;
113
+ inset-inline-end: auto;
114
+ translate: -100% 0;
115
+ }
116
+ .sitenav__panel:popover-open {
117
+ opacity: 1;
118
+ translate: 0 0;
119
+ }
120
+ @starting-style {
121
+ .sitenav--drawer-end .sitenav__panel:popover-open {
122
+ opacity: 0;
123
+ translate: 100% 0;
124
+ }
125
+ .sitenav--drawer-start .sitenav__panel:popover-open {
126
+ opacity: 0;
127
+ translate: -100% 0;
128
+ }
129
+ }
130
+
131
+ /* ── Lists + links ─────────────────────────────────────────────────────────── */
132
+ .sitenav__list,
133
+ .sitenav__submenu {
134
+ list-style: none;
135
+ margin: 0;
136
+ padding: 0;
137
+ display: flex;
138
+ flex-direction: column;
139
+ gap: 0.25rem;
140
+ }
141
+
142
+ .sitenav__link {
143
+ display: inline-flex;
144
+ align-items: center;
145
+ gap: 0.5rem;
146
+ text-decoration: none;
147
+ color: inherit;
148
+ padding: 0.5rem 0.75rem;
149
+ border-radius: var(--br-control, 0.375rem);
150
+
151
+ &:hover {
152
+ background: var(--color-surface-l);
153
+ }
154
+
155
+ &:focus-visible {
156
+ outline: 2px solid var(--sitenav-focus-color, var(--color-brand-primary-l));
157
+ outline-offset: 2px;
158
+ }
159
+ }
160
+
161
+ .sitenav__empty {
162
+ opacity: 0.6;
163
+ font-style: italic;
164
+ }
165
+
166
+ /* ── Branch item — mobile accordion ────────────────────────────────────────
167
+ The item is a grid: [link | caret] on row 1, the submenu spanning row 2. The
168
+ <details> holds only the caret <summary>; the submenu <ul> is its sibling and a
169
+ real grid child of the item. The row-2 track animates 0fr→1fr when the details is
170
+ open (the classic no-JS accordion, driven by `:has`), so the submenu pushes the
171
+ content below rather than overlaying it. */
172
+ .sitenav__item--branch {
173
+ display: grid;
174
+ grid-template-columns: 1fr auto;
175
+ grid-template-rows: auto 0fr;
176
+ align-items: center;
177
+ column-gap: 0.5rem;
178
+ transition: grid-template-rows 0.25s ease;
179
+ }
180
+
181
+ .sitenav__item--branch > .split-link__link {
182
+ grid-column: 1;
183
+ grid-row: 1;
184
+ }
185
+
186
+ /* <details> is only the caret; keep its box out of the flow's height. */
187
+ .sitenav__disclosure {
188
+ grid-column: 2;
189
+ grid-row: 1;
190
+ }
191
+
192
+ /* The <summary>. `.split-link__toggle` supplies the flush look, hover + focus, and
193
+ the caret transition; only the disclosure-marker reset is added here. */
194
+ .sitenav__subtoggle {
195
+ list-style: none;
196
+ cursor: pointer;
197
+
198
+ &::-webkit-details-marker {
199
+ display: none;
200
+ }
201
+ }
202
+
203
+ .sitenav__item--branch > .sitenav__submenu {
204
+ grid-column: 1 / -1;
205
+ grid-row: 2;
206
+ /* Stretch to the row-2 track (not content-sized) so the 0fr collapsed state
207
+ actually clips to 0 — the item's own align-self must beat the grid's
208
+ `align-items: center`, or overflow:hidden has nothing to clip against. */
209
+ align-self: stretch;
210
+ min-block-size: 0;
211
+ overflow: hidden;
212
+ padding-inline-start: 1rem;
213
+ }
214
+
215
+ .sitenav__item--branch:has(> .sitenav__disclosure[open]) {
216
+ grid-template-rows: auto 1fr;
217
+ }
218
+
219
+ /* Caret flips while the disclosure is open (summary carries no aria-expanded). */
220
+ .sitenav__disclosure[open] > .sitenav__subtoggle .split-link__caret {
221
+ rotate: 180deg;
222
+ }
223
+
224
+ /* Depth cap (mobile side): a desktop-only branch shows just its parent link. */
225
+ .sitenav__item--desktop-branch > .sitenav__disclosure,
226
+ .sitenav__item--desktop-branch > .sitenav__submenu {
227
+ display: none;
228
+ }
229
+
230
+ /* ── Desktop promotion — one block per framework breakpoint ─────────────────
231
+ Only the min-width threshold + `.sitenav--bp-*` scope differ; the nested ruleset
232
+ is identical. CSS has no mixins, so the four blocks are intentionally parallel —
233
+ edit them together. Each: hide the mobile chrome, force the [popover] panel back
234
+ inline as a navbar, turn the list horizontal, and promote submenus to dropdowns. */
235
+ @container (min-width: 30rem) {
236
+ .sitenav--bp-sm {
237
+ & > .sitenav__toggle,
238
+ & .sitenav__close {
239
+ display: none;
240
+ }
241
+ /* [popover] is UA/polyfill display:none while closed; !important forces the
242
+ navbar body back inline (the hamburger is gone, so it never re-hides). */
243
+ & .sitenav__panel {
244
+ display: flex !important;
245
+ flex-direction: row;
246
+ align-items: center;
247
+ position: static;
248
+ inset: auto;
249
+ inline-size: auto;
250
+ max-inline-size: none;
251
+ block-size: auto;
252
+ padding: 0;
253
+ translate: none;
254
+ opacity: 1;
255
+ overflow: visible;
256
+ background: none;
257
+ color: inherit;
258
+ box-shadow: none;
259
+ z-index: auto;
260
+ }
261
+ & .sitenav__panel::backdrop {
262
+ display: none;
263
+ }
264
+ & .sitenav__list {
265
+ flex-direction: row;
266
+ flex-wrap: wrap;
267
+ align-items: center;
268
+ }
269
+ & .sitenav__item--branch {
270
+ position: relative;
271
+ display: flex;
272
+ align-items: center;
273
+ grid-template-columns: none;
274
+ grid-template-rows: none;
275
+ }
276
+ & .sitenav__submenu {
277
+ position: absolute;
278
+ inset-block-start: 100%;
279
+ inset-inline-start: 0;
280
+ min-inline-size: 13rem;
281
+ padding: 0.5rem;
282
+ overflow: visible;
283
+ background: var(--color-surface-xxl);
284
+ color: var(--color-surface-xxd);
285
+ border: var(--b-panel);
286
+ border-radius: var(--br-panel);
287
+ box-shadow: var(--ds-panel);
288
+ z-index: var(--z-tier-overlay);
289
+ opacity: 0;
290
+ visibility: hidden;
291
+ pointer-events: none;
292
+ translate: 0 0.25rem;
293
+ transition:
294
+ opacity 0.15s ease,
295
+ translate 0.15s ease,
296
+ visibility 0.15s allow-discrete;
297
+ }
298
+ /* deeper submenus (inside a panel) fly out to the side, not downward */
299
+ & .sitenav__submenu .sitenav__item--branch > .sitenav__disclosure > .sitenav__submenu {
300
+ inset-block-start: 0;
301
+ inset-inline-start: 100%;
302
+ translate: 0.25rem 0;
303
+ }
304
+ & .sitenav__item--branch:hover > .sitenav__disclosure > .sitenav__submenu,
305
+ & .sitenav__item--branch:focus-within > .sitenav__disclosure > .sitenav__submenu,
306
+ & .sitenav__item--branch > .sitenav__disclosure[open] > .sitenav__submenu {
307
+ opacity: 1;
308
+ visibility: visible;
309
+ pointer-events: auto;
310
+ translate: 0 0;
311
+ }
312
+ /* depth caps flip at the breakpoint */
313
+ & .sitenav__item--desktop-branch > .sitenav__disclosure > .sitenav__subtoggle {
314
+ display: inline-flex;
315
+ }
316
+ & .sitenav__item--mobile-branch > .sitenav__disclosure > .sitenav__subtoggle,
317
+ & .sitenav__item--mobile-branch > .sitenav__disclosure > .sitenav__submenu {
318
+ display: none;
319
+ }
320
+ }
321
+ }
322
+
323
+ @container (min-width: 48rem) {
324
+ .sitenav--bp-md {
325
+ & > .sitenav__toggle,
326
+ & .sitenav__close {
327
+ display: none;
328
+ }
329
+ & .sitenav__panel {
330
+ display: flex !important;
331
+ flex-direction: row;
332
+ align-items: center;
333
+ position: static;
334
+ inset: auto;
335
+ inline-size: auto;
336
+ max-inline-size: none;
337
+ block-size: auto;
338
+ padding: 0;
339
+ translate: none;
340
+ opacity: 1;
341
+ overflow: visible;
342
+ background: none;
343
+ color: inherit;
344
+ box-shadow: none;
345
+ z-index: auto;
346
+ }
347
+ & .sitenav__panel::backdrop {
348
+ display: none;
349
+ }
350
+ & .sitenav__list {
351
+ flex-direction: row;
352
+ flex-wrap: wrap;
353
+ align-items: center;
354
+ }
355
+ & .sitenav__item--branch {
356
+ position: relative;
357
+ display: flex;
358
+ align-items: center;
359
+ grid-template-columns: none;
360
+ grid-template-rows: none;
361
+ }
362
+ & .sitenav__submenu {
363
+ position: absolute;
364
+ inset-block-start: 100%;
365
+ inset-inline-start: 0;
366
+ min-inline-size: 13rem;
367
+ padding: 0.5rem;
368
+ overflow: visible;
369
+ background: var(--color-surface-xxl);
370
+ color: var(--color-surface-xxd);
371
+ border: var(--b-panel);
372
+ border-radius: var(--br-panel);
373
+ box-shadow: var(--ds-panel);
374
+ z-index: var(--z-tier-overlay);
375
+ opacity: 0;
376
+ visibility: hidden;
377
+ pointer-events: none;
378
+ translate: 0 0.25rem;
379
+ transition:
380
+ opacity 0.15s ease,
381
+ translate 0.15s ease,
382
+ visibility 0.15s allow-discrete;
383
+ }
384
+ & .sitenav__submenu .sitenav__item--branch > .sitenav__submenu {
385
+ inset-block-start: 0;
386
+ inset-inline-start: 100%;
387
+ translate: 0.25rem 0;
388
+ }
389
+ & .sitenav__item--branch:hover > .sitenav__submenu,
390
+ & .sitenav__item--branch:focus-within > .sitenav__submenu,
391
+ & .sitenav__item--branch:has(> .sitenav__disclosure[open]) > .sitenav__submenu {
392
+ opacity: 1;
393
+ visibility: visible;
394
+ pointer-events: auto;
395
+ translate: 0 0;
396
+ }
397
+ /* depth caps flip at the breakpoint: desktop-only branches reveal their caret +
398
+ dropdown; mobile-only branches collapse to a plain link. */
399
+ & .sitenav__item--desktop-branch > .sitenav__disclosure,
400
+ & .sitenav__item--desktop-branch > .sitenav__submenu {
401
+ display: block;
402
+ }
403
+ & .sitenav__item--mobile-branch > .sitenav__disclosure,
404
+ & .sitenav__item--mobile-branch > .sitenav__submenu {
405
+ display: none;
406
+ }
407
+ }
408
+ }
409
+
410
+ @container (min-width: 64rem) {
411
+ .sitenav--bp-lg {
412
+ & > .sitenav__toggle,
413
+ & .sitenav__close {
414
+ display: none;
415
+ }
416
+ & .sitenav__panel {
417
+ display: flex !important;
418
+ flex-direction: row;
419
+ align-items: center;
420
+ position: static;
421
+ inset: auto;
422
+ inline-size: auto;
423
+ max-inline-size: none;
424
+ block-size: auto;
425
+ padding: 0;
426
+ translate: none;
427
+ opacity: 1;
428
+ overflow: visible;
429
+ background: none;
430
+ color: inherit;
431
+ box-shadow: none;
432
+ z-index: auto;
433
+ }
434
+ & .sitenav__panel::backdrop {
435
+ display: none;
436
+ }
437
+ & .sitenav__list {
438
+ flex-direction: row;
439
+ flex-wrap: wrap;
440
+ align-items: center;
441
+ }
442
+ & .sitenav__item--branch {
443
+ position: relative;
444
+ display: flex;
445
+ align-items: center;
446
+ grid-template-columns: none;
447
+ grid-template-rows: none;
448
+ }
449
+ & .sitenav__submenu {
450
+ position: absolute;
451
+ inset-block-start: 100%;
452
+ inset-inline-start: 0;
453
+ min-inline-size: 13rem;
454
+ padding: 0.5rem;
455
+ overflow: visible;
456
+ background: var(--color-surface-xxl);
457
+ color: var(--color-surface-xxd);
458
+ border: var(--b-panel);
459
+ border-radius: var(--br-panel);
460
+ box-shadow: var(--ds-panel);
461
+ z-index: var(--z-tier-overlay);
462
+ opacity: 0;
463
+ visibility: hidden;
464
+ pointer-events: none;
465
+ translate: 0 0.25rem;
466
+ transition:
467
+ opacity 0.15s ease,
468
+ translate 0.15s ease,
469
+ visibility 0.15s allow-discrete;
470
+ }
471
+ & .sitenav__submenu .sitenav__item--branch > .sitenav__submenu {
472
+ inset-block-start: 0;
473
+ inset-inline-start: 100%;
474
+ translate: 0.25rem 0;
475
+ }
476
+ & .sitenav__item--branch:hover > .sitenav__submenu,
477
+ & .sitenav__item--branch:focus-within > .sitenav__submenu,
478
+ & .sitenav__item--branch:has(> .sitenav__disclosure[open]) > .sitenav__submenu {
479
+ opacity: 1;
480
+ visibility: visible;
481
+ pointer-events: auto;
482
+ translate: 0 0;
483
+ }
484
+ /* depth caps flip at the breakpoint: desktop-only branches reveal their caret +
485
+ dropdown; mobile-only branches collapse to a plain link. */
486
+ & .sitenav__item--desktop-branch > .sitenav__disclosure,
487
+ & .sitenav__item--desktop-branch > .sitenav__submenu {
488
+ display: block;
489
+ }
490
+ & .sitenav__item--mobile-branch > .sitenav__disclosure,
491
+ & .sitenav__item--mobile-branch > .sitenav__submenu {
492
+ display: none;
493
+ }
494
+ }
495
+ }
496
+
497
+ @container (min-width: 80rem) {
498
+ .sitenav--bp-xl {
499
+ & > .sitenav__toggle,
500
+ & .sitenav__close {
501
+ display: none;
502
+ }
503
+ & .sitenav__panel {
504
+ display: flex !important;
505
+ flex-direction: row;
506
+ align-items: center;
507
+ position: static;
508
+ inset: auto;
509
+ inline-size: auto;
510
+ max-inline-size: none;
511
+ block-size: auto;
512
+ padding: 0;
513
+ translate: none;
514
+ opacity: 1;
515
+ overflow: visible;
516
+ background: none;
517
+ color: inherit;
518
+ box-shadow: none;
519
+ z-index: auto;
520
+ }
521
+ & .sitenav__panel::backdrop {
522
+ display: none;
523
+ }
524
+ & .sitenav__list {
525
+ flex-direction: row;
526
+ flex-wrap: wrap;
527
+ align-items: center;
528
+ }
529
+ & .sitenav__item--branch {
530
+ position: relative;
531
+ display: flex;
532
+ align-items: center;
533
+ grid-template-columns: none;
534
+ grid-template-rows: none;
535
+ }
536
+ & .sitenav__submenu {
537
+ position: absolute;
538
+ inset-block-start: 100%;
539
+ inset-inline-start: 0;
540
+ min-inline-size: 13rem;
541
+ padding: 0.5rem;
542
+ overflow: visible;
543
+ background: var(--color-surface-xxl);
544
+ color: var(--color-surface-xxd);
545
+ border: var(--b-panel);
546
+ border-radius: var(--br-panel);
547
+ box-shadow: var(--ds-panel);
548
+ z-index: var(--z-tier-overlay);
549
+ opacity: 0;
550
+ visibility: hidden;
551
+ pointer-events: none;
552
+ translate: 0 0.25rem;
553
+ transition:
554
+ opacity 0.15s ease,
555
+ translate 0.15s ease,
556
+ visibility 0.15s allow-discrete;
557
+ }
558
+ & .sitenav__submenu .sitenav__item--branch > .sitenav__submenu {
559
+ inset-block-start: 0;
560
+ inset-inline-start: 100%;
561
+ translate: 0.25rem 0;
562
+ }
563
+ & .sitenav__item--branch:hover > .sitenav__submenu,
564
+ & .sitenav__item--branch:focus-within > .sitenav__submenu,
565
+ & .sitenav__item--branch:has(> .sitenav__disclosure[open]) > .sitenav__submenu {
566
+ opacity: 1;
567
+ visibility: visible;
568
+ pointer-events: auto;
569
+ translate: 0 0;
570
+ }
571
+ /* depth caps flip at the breakpoint: desktop-only branches reveal their caret +
572
+ dropdown; mobile-only branches collapse to a plain link. */
573
+ & .sitenav__item--desktop-branch > .sitenav__disclosure,
574
+ & .sitenav__item--desktop-branch > .sitenav__submenu {
575
+ display: block;
576
+ }
577
+ & .sitenav__item--mobile-branch > .sitenav__disclosure,
578
+ & .sitenav__item--mobile-branch > .sitenav__submenu {
579
+ display: none;
580
+ }
581
+ }
582
+ }