@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,66 @@
1
+ /**
2
+ * Anchor Link — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Anchor link — explicit .link + mailto/tel/external affordances ───────── */
7
+ .link {
8
+ --_link-decoration-color: var(--link-decoration-color, currentColor);
9
+
10
+ color: var(--link-color, currentColor);
11
+ text-decoration: var(--link-decoration, underline);
12
+ text-decoration-color: var(--_link-decoration-color);
13
+ text-underline-offset: 0.2em;
14
+ transition:
15
+ color 0.2s ease,
16
+ text-decoration-color 0.2s ease;
17
+
18
+ &:hover,
19
+ &:focus-visible {
20
+ --_link-decoration-color: var(--link-hover-decoration-color, transparent);
21
+ }
22
+
23
+ &:focus-visible {
24
+ outline: 2px solid var(--link-focus-color, currentColor);
25
+ outline-offset: 2px;
26
+ }
27
+ }
28
+
29
+ a[href^='mailto:'].link--icon::before {
30
+ content: '';
31
+ display: inline-block;
32
+ inline-size: 1em;
33
+ block-size: 1em;
34
+ margin-inline-end: 0.25em;
35
+ vertical-align: -0.125em;
36
+ background-color: currentColor;
37
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z'/%3E%3C/svg%3E");
38
+ mask-size: contain;
39
+ mask-repeat: no-repeat;
40
+ }
41
+
42
+ a[href^='tel:'].link--icon::before {
43
+ content: '';
44
+ display: inline-block;
45
+ inline-size: 1em;
46
+ block-size: 1em;
47
+ margin-inline-end: 0.25em;
48
+ vertical-align: -0.125em;
49
+ background-color: currentColor;
50
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z'/%3E%3C/svg%3E");
51
+ mask-size: contain;
52
+ mask-repeat: no-repeat;
53
+ }
54
+
55
+ a[target='_blank'].link--external::after {
56
+ content: '';
57
+ display: inline-block;
58
+ inline-size: 0.75em;
59
+ block-size: 0.75em;
60
+ margin-inline-start: 0.25em;
61
+ vertical-align: baseline;
62
+ background-color: currentColor;
63
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M320 0c-17.7 0-32 14.3-32 32s14.3 32 32 32h82.7L201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L448 109.3V192c0 17.7 14.3 32 32 32s32-14.3 32-32V32c0-17.7-14.3-32-32-32H320zM80 32C35.8 32 0 67.8 0 112V432c0 44.2 35.8 80 80 80H400c44.2 0 80-35.8 80-80V320c0-17.7-14.3-32-32-32s-32 14.3-32 32V432c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16V112c0-8.8 7.2-16 16-16H192c17.7 0 32-14.3 32-32s-14.3-32-32-32H80z'/%3E%3C/svg%3E");
64
+ mask-size: contain;
65
+ mask-repeat: no-repeat;
66
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Banner — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Banner — full-width announcement; colour via bg-/text- utilities ─────── */
7
+ .banner {
8
+ --_p: var(--p-banner, var(--p-banner-group, var(--p-default)));
9
+ --_br: var(--br-banner, var(--br-banner-group, var(--br-default)));
10
+ --_b: var(--b-banner, var(--b-banner-group, var(--b-default)));
11
+
12
+ position: relative;
13
+ display: flex;
14
+ flex-wrap: wrap;
15
+ align-items: center;
16
+ justify-content: center;
17
+ text-align: center;
18
+ padding: var(--_p);
19
+ border: var(--_b);
20
+ border-radius: var(--_br);
21
+
22
+ &.banner--dismissible {
23
+ padding-inline-end: calc(1rem + 2.5rem);
24
+ }
25
+
26
+ .banner__close {
27
+ position: absolute;
28
+ inset-inline-end: 1rem;
29
+ inset-block: 0;
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ padding: 0.5rem;
34
+ background: transparent;
35
+ border: none;
36
+ color: inherit;
37
+ cursor: pointer;
38
+ opacity: 0.7;
39
+ transition: opacity 0.2s ease;
40
+
41
+ &:hover,
42
+ &:focus-visible {
43
+ opacity: 1;
44
+ }
45
+ }
46
+
47
+ &.banner--sticky {
48
+ position: sticky;
49
+ inset-block-start: 0;
50
+ z-index: var(--z-tier-sticky);
51
+ }
52
+
53
+ .banner__content {
54
+ display: flex;
55
+ flex-wrap: wrap;
56
+ align-items: center;
57
+ justify-content: center;
58
+ gap: var(--banner-gap, 1rem);
59
+ }
60
+
61
+ .banner__action {
62
+ flex-shrink: 0;
63
+ }
64
+ }
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Carousel — CSS-only scroll-snap carousel migrated from old-css-lib. Uses
3
+ * ::scroll-button(), ::scroll-marker-group, ::column, scroll-state() and
4
+ * anchor positioning (all polyfilled). Fully operable as a scroll-snap strip
5
+ * without JS; the Lit component adds autoplay + any marker fallback.
6
+ */
7
+
8
+ .carousel {
9
+ overflow-x: auto;
10
+ scroll-behavior: smooth;
11
+ overscroll-behavior-x: contain;
12
+ scrollbar-width: none;
13
+ scroll-snap-type: x mandatory;
14
+ scroll-padding: var(--carousel-scroll-padding, 1rem);
15
+ padding: var(--carousel-padding, 1rem);
16
+ max-inline-size: 100%;
17
+ anchor-name: --carousel;
18
+ anchor-scope: --carousel;
19
+
20
+ /* Non-paged (default) — grid layout */
21
+ &:not(.carousel--auto-pages) {
22
+ display: grid;
23
+ grid-auto-flow: column;
24
+ grid-auto-columns: var(--carousel-slide-size, 100%);
25
+ gap: var(--carousel-gap, 1rem);
26
+
27
+ > * {
28
+ scroll-snap-align: center;
29
+ }
30
+
31
+ > [part='autoplay'] {
32
+ scroll-snap-align: unset;
33
+ }
34
+ }
35
+
36
+ /* Paged — CSS columns */
37
+ &.carousel--auto-pages {
38
+ columns: var(--carousel-columns, 1);
39
+ text-align: center;
40
+
41
+ > * {
42
+ break-inside: avoid;
43
+ display: inline-grid;
44
+ }
45
+
46
+ &::column {
47
+ scroll-snap-align: center;
48
+ }
49
+ }
50
+
51
+ /* Scroll buttons — anchor-positioned */
52
+ &.carousel--scroll-buttons {
53
+ &::scroll-button(*) {
54
+ position: fixed;
55
+ position-anchor: --carousel;
56
+ position-visibility: always;
57
+ cursor: pointer;
58
+ font-size: 1.5rem;
59
+ inline-size: 44px;
60
+ aspect-ratio: 1;
61
+ display: flex;
62
+ place-items: center;
63
+ place-content: center;
64
+ border: none;
65
+ border-radius: 50%;
66
+ color: var(--carousel-button-color, currentColor);
67
+ background: var(--color-surface-xl);
68
+ opacity: 0.9;
69
+ transition:
70
+ opacity 0.2s ease,
71
+ background 0.2s ease;
72
+ }
73
+
74
+ &::scroll-button(*):hover {
75
+ opacity: 1;
76
+ background: var(--color-surface-l);
77
+ }
78
+
79
+ &::scroll-button(*):focus-visible {
80
+ outline: 2px solid currentColor;
81
+ outline-offset: 2px;
82
+ }
83
+
84
+ &::scroll-button(*):disabled {
85
+ cursor: not-allowed;
86
+ opacity: 0.2;
87
+ }
88
+
89
+ &::scroll-button(left) {
90
+ position-area: inline-start center;
91
+ content: '\2190' / 'Previous';
92
+ }
93
+
94
+ &::scroll-button(right) {
95
+ position-area: inline-end center;
96
+ content: '\2192' / 'Next';
97
+ }
98
+ }
99
+
100
+ /* Scroll markers — anchor-positioned group */
101
+ &.carousel--scroll-markers {
102
+ scroll-marker-group: after;
103
+
104
+ &::scroll-marker-group {
105
+ position: fixed;
106
+ position-anchor: --carousel;
107
+ position-area: block-end;
108
+ position-visibility: always;
109
+ margin-block-end: var(--carousel-marker-offset, 1rem);
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ gap: 0.5rem;
114
+ padding-block: 0.5rem;
115
+ }
116
+
117
+ /* Non-paged: per-item markers */
118
+ &:not(.carousel--auto-pages) {
119
+ > *::scroll-marker {
120
+ content: '';
121
+ inline-size: 0.75rem;
122
+ block-size: 0.75rem;
123
+ border-radius: 50%;
124
+ background-color: var(--carousel-marker-color, currentColor);
125
+ opacity: 0.4;
126
+ cursor: pointer;
127
+ transition: opacity 0.2s ease;
128
+ }
129
+
130
+ > [data-carousel-clone]::scroll-marker,
131
+ > [part='autoplay']::scroll-marker {
132
+ content: none;
133
+ }
134
+
135
+ > *::scroll-marker:target-current {
136
+ opacity: 1;
137
+ background-color: var(
138
+ --carousel-marker-active-color,
139
+ var(--carousel-marker-color, currentColor)
140
+ );
141
+ }
142
+
143
+ > *::scroll-marker:focus-visible {
144
+ outline: 2px solid currentColor;
145
+ outline-offset: 2px;
146
+ }
147
+ }
148
+
149
+ /* Paged: per-column markers */
150
+ &.carousel--auto-pages {
151
+ &::column::scroll-marker {
152
+ content: '';
153
+ inline-size: 0.75rem;
154
+ block-size: 0.75rem;
155
+ border-radius: 50%;
156
+ background-color: var(--carousel-marker-color, currentColor);
157
+ opacity: 0.4;
158
+ cursor: pointer;
159
+ transition: opacity 0.2s ease;
160
+ }
161
+
162
+ &::column::scroll-marker:target-current {
163
+ opacity: 1;
164
+ background-color: var(
165
+ --carousel-marker-active-color,
166
+ var(--carousel-marker-color, currentColor)
167
+ );
168
+ }
169
+
170
+ &::column::scroll-marker:focus-visible {
171
+ outline: 2px solid currentColor;
172
+ outline-offset: 2px;
173
+ }
174
+ }
175
+ }
176
+
177
+ /* Inert — dim/disable off-screen content */
178
+ &.carousel--inert {
179
+ &:not(.carousel--auto-pages) > * {
180
+ container-type: scroll-state;
181
+
182
+ > * {
183
+ transition: opacity 0.5s ease;
184
+
185
+ @container not scroll-state(snapped) {
186
+ interactivity: inert;
187
+ opacity: var(--carousel-inert-opacity, 0.25);
188
+ }
189
+ }
190
+ }
191
+
192
+ &.carousel--auto-pages > * {
193
+ animation: carousel-offscreen-inert linear both;
194
+ animation-timeline: view(x);
195
+ }
196
+ }
197
+
198
+ /* Autoplay — play/pause toggle (enhanced by the Lit component) */
199
+ & > [part='autoplay'] {
200
+ position: fixed;
201
+ position-anchor: --carousel;
202
+ position-area: block-end inline-end;
203
+ position-visibility: always;
204
+ margin-block-end: var(--carousel-marker-offset, 1rem);
205
+ margin-inline-end: 0.5rem;
206
+ z-index: var(--z-tier-raised);
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: center;
210
+ inline-size: 2rem;
211
+ block-size: 2rem;
212
+ border: none;
213
+ border-radius: 50%;
214
+ background: var(--color-surface-xl);
215
+ color: var(--carousel-button-color, currentColor);
216
+ opacity: 0.7;
217
+ cursor: pointer;
218
+ font-size: 0.75rem;
219
+ transition: opacity 0.2s ease;
220
+
221
+ &:hover {
222
+ opacity: 1;
223
+ }
224
+
225
+ &:focus-visible {
226
+ outline: 2px solid currentColor;
227
+ outline-offset: 2px;
228
+ }
229
+ }
230
+
231
+ /* Force stop — always stop at each snap point */
232
+ &.carousel--force-stop {
233
+ &:not(.carousel--auto-pages) > * {
234
+ scroll-snap-stop: always;
235
+ }
236
+
237
+ &.carousel--auto-pages::column {
238
+ scroll-snap-stop: always;
239
+ }
240
+ }
241
+ }
242
+
243
+ @keyframes carousel-offscreen-inert {
244
+ entry 0%,
245
+ exit 100% {
246
+ interactivity: inert;
247
+ opacity: var(--carousel-inert-opacity, 0.25);
248
+ }
249
+
250
+ entry 100%,
251
+ exit 0% {
252
+ interactivity: auto;
253
+ opacity: 1;
254
+ }
255
+ }
256
+
257
+ @media (prefers-reduced-motion: reduce) {
258
+ .carousel {
259
+ scroll-behavior: auto;
260
+
261
+ &.carousel--inert:not(.carousel--auto-pages) > * > * {
262
+ transition: none;
263
+ }
264
+
265
+ &.carousel--inert.carousel--auto-pages > * {
266
+ animation: none;
267
+ }
268
+ }
269
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Cluster — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Cluster — flexible wrapping group with 9 alignment positions ─────────── */
7
+ /* First value = block axis (align-content), second = inline axis (justify). */
8
+ .cluster,
9
+ [class^='cluster-'],
10
+ [class*=' cluster-'] {
11
+ display: flex;
12
+ flex-wrap: wrap;
13
+ gap: var(--cluster-gap, 0.5rem);
14
+ }
15
+
16
+ .cluster-start-start {
17
+ place-content: start start;
18
+ }
19
+ .cluster-start-center {
20
+ place-content: start center;
21
+ }
22
+ .cluster-start-end {
23
+ place-content: start end;
24
+ }
25
+ .cluster-center-start {
26
+ place-content: center start;
27
+ }
28
+ .cluster-center-center {
29
+ place-content: center center;
30
+ }
31
+ .cluster-center-end {
32
+ place-content: center end;
33
+ }
34
+ .cluster-end-start {
35
+ place-content: end start;
36
+ }
37
+ .cluster-end-center {
38
+ place-content: end center;
39
+ }
40
+ .cluster-end-end {
41
+ place-content: end end;
42
+ }
43
+
44
+ /* Single-axis shorthands */
45
+ .cluster-start {
46
+ place-content: start start;
47
+ }
48
+ .cluster-center {
49
+ place-content: center center;
50
+ }
51
+ .cluster-end {
52
+ place-content: end end;
53
+ }
54
+
55
+ /* Space distribution */
56
+ .cluster-between {
57
+ justify-content: space-between;
58
+ }
59
+ .cluster-around {
60
+ justify-content: space-around;
61
+ }
62
+ .cluster-evenly {
63
+ justify-content: space-evenly;
64
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Code — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Inline code chip — prose <code> that isn't inside a <pre>. Element-level at
7
+ zero specificity (like the schema-generated button/link patterns) so bare
8
+ <code> needs no class and any explicit class overrides it. .font-code styles
9
+ type only; this adds the chip. ── */
10
+ :where(:not(pre) > code) {
11
+ font-family: var(--font-mono);
12
+ font-size: 0.85em;
13
+ background: var(--color-neutral-xl);
14
+ color: var(--color-neutral-xxd);
15
+ padding: 0.1em 0.4em;
16
+ border-radius: var(--br-default);
17
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Combobox — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Combobox — CSS shell; filtering/selection lands via Lit ───────────────── */
7
+ .combobox {
8
+ --_b: var(--b-combobox, var(--b-combobox-group, var(--b-control, var(--b-default))));
9
+ --_br: var(--br-combobox, var(--br-combobox-group, var(--br-control, var(--br-default))));
10
+ --_p: var(--p-combobox, var(--p-combobox-group, var(--p-control, var(--p-default))));
11
+ --_ds: var(--ds-combobox, var(--ds-combobox-group, var(--ds-panel, var(--ds-default))));
12
+
13
+ position: relative;
14
+ display: inline-flex;
15
+ flex-direction: column;
16
+
17
+ .combobox__input {
18
+ padding: var(--_p);
19
+ border: var(--_b);
20
+ border-radius: var(--_br);
21
+
22
+ &:focus {
23
+ outline: 2px solid var(--combobox-focus-color, var(--color-brand-primary-l));
24
+ outline-offset: 2px;
25
+ }
26
+ }
27
+
28
+ .combobox__listbox {
29
+ position: absolute;
30
+ inset-block-start: 100%;
31
+ inset-inline: 0;
32
+ z-index: var(--z-tier-overlay);
33
+ margin-block-start: 0.25rem;
34
+ padding: 0.25rem;
35
+ border: var(--_b);
36
+ border-radius: var(--_br);
37
+ box-shadow: var(--_ds);
38
+ background: var(--color-surface-xxl);
39
+ max-block-size: 15rem;
40
+ overflow-y: auto;
41
+ list-style: none;
42
+ display: none;
43
+ }
44
+
45
+ /* Native open state via :has(); Lit toggles the same visibility */
46
+ &:has(.combobox__input:focus):has(.combobox__listbox:not(:empty)) .combobox__listbox {
47
+ display: block;
48
+ }
49
+
50
+ .combobox__option {
51
+ padding: var(--_p);
52
+ border-radius: calc(var(--_br) - 0.125rem);
53
+ cursor: pointer;
54
+ transition: background-color 0.15s ease;
55
+
56
+ &:hover,
57
+ &[aria-selected='true'] {
58
+ background: var(--color-surface-l);
59
+ }
60
+
61
+ &[aria-disabled='true'] {
62
+ opacity: 0.5;
63
+ cursor: not-allowed;
64
+ }
65
+ }
66
+
67
+ .combobox__empty {
68
+ padding: var(--_p);
69
+ text-align: center;
70
+ opacity: 0.7;
71
+ }
72
+
73
+ &.combobox--loading .combobox__input {
74
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='10' stroke-dasharray='32' stroke-dashoffset='32'%3E%3Canimate attributeName='stroke-dashoffset' dur='1s' values='32;0' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E");
75
+ background-repeat: no-repeat;
76
+ background-position: right 0.5rem center;
77
+ background-size: 1.25rem;
78
+ padding-inline-end: 2.5rem;
79
+ }
80
+
81
+ &.combobox--clearable .combobox__clear {
82
+ position: absolute;
83
+ inset-inline-end: 0.5rem;
84
+ inset-block-start: 50%;
85
+ translate: 0 -50%;
86
+ padding: 0.25rem;
87
+ background: transparent;
88
+ border: none;
89
+ cursor: pointer;
90
+ opacity: 0.5;
91
+ transition: opacity 0.15s ease;
92
+
93
+ &:hover {
94
+ opacity: 1;
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Comment — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Comment — threaded avatar/header/body/footer grid ────────────────────── */
7
+ .comment {
8
+ display: grid;
9
+ grid-template-columns: auto 1fr;
10
+ grid-template-areas:
11
+ 'avatar header'
12
+ 'avatar body'
13
+ 'avatar footer';
14
+ gap: 1rem;
15
+ column-gap: 0.75rem;
16
+
17
+ .comment__avatar {
18
+ grid-area: avatar;
19
+ align-self: start;
20
+ }
21
+
22
+ .comment__header {
23
+ grid-area: header;
24
+ display: flex;
25
+ flex-wrap: wrap;
26
+ align-items: baseline;
27
+ gap: 0.5rem;
28
+ }
29
+
30
+ .comment__author {
31
+ font-weight: 600;
32
+ }
33
+
34
+ .comment__date {
35
+ font-size: 0.875em;
36
+ opacity: 0.7;
37
+ }
38
+
39
+ .comment__body {
40
+ grid-area: body;
41
+ }
42
+
43
+ .comment__footer {
44
+ grid-area: footer;
45
+ display: flex;
46
+ flex-wrap: wrap;
47
+ gap: 1rem;
48
+ }
49
+
50
+ .comment__action {
51
+ font-size: 0.875em;
52
+ opacity: 0.7;
53
+ transition: opacity 0.2s ease;
54
+
55
+ &:hover,
56
+ &:focus-visible {
57
+ opacity: 1;
58
+ }
59
+ }
60
+
61
+ .comment__replies {
62
+ grid-column: 1 / -1;
63
+ margin-inline-start: var(--comment-indent, 2rem);
64
+ padding-inline-start: var(--comment-indent, 2rem);
65
+ border-inline-start: 2px solid var(--color-surface-l);
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: 1rem;
69
+ }
70
+
71
+ &.comment--compact {
72
+ grid-template-columns: 1fr;
73
+ grid-template-areas:
74
+ 'header'
75
+ 'body'
76
+ 'footer';
77
+
78
+ .comment__avatar {
79
+ display: none;
80
+ }
81
+ }
82
+ }
83
+
84
+ .comment-thread {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 1.5rem;
88
+ }