@keenmate/web-components-devkit 1.0.0-rc02 → 1.0.0-rc03

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.
@@ -0,0 +1,285 @@
1
+ /* ==============================================================================
2
+ EXAMPLES KIT — FORM CONTROLS
3
+ ==============================================================================
4
+ One look for the native controls a demo page uses — text fields, selects
5
+ (single and multiple), textareas, checkboxes, radios, switches, ranges,
6
+ colour and file inputs — wherever the page puts them, not only in a
7
+ `.controls` row. Modelled on pure-admin's forms (fixed control height,
8
+ accent focus border + halo, the shared --base-icon-check tick) and read
9
+ through the --base-* contract, so a theme restyles them with the component.
10
+
11
+ Every selector is wrapped in :where() — zero specificity — so any page or
12
+ component rule wins. `.kmwc-native` on an element (or an ancestor) keeps
13
+ the browser's own controls, e.g. for a light-DOM component that draws its
14
+ own inputs. A switch is `<input type="checkbox" role="switch">`. */
15
+ @layer kmwc {
16
+ /* ==========================================================================
17
+ TEXT FIELDS & SELECT
18
+ ==========================================================================
19
+ A fixed height and no vertical padding: the browser centres the text. */
20
+ :where(
21
+ input:not([type]),
22
+ input[type="text"], input[type="search"], input[type="email"], input[type="url"],
23
+ input[type="tel"], input[type="password"], input[type="number"], input[type="date"],
24
+ input[type="time"], input[type="datetime-local"], input[type="month"], input[type="week"],
25
+ select, textarea
26
+ ):not(:where(.kmwc-native, .kmwc-native *)) {
27
+ box-sizing: border-box;
28
+ height: var(--kmwc-control-height);
29
+ padding: 0 0.625rem;
30
+ border: var(--kmwc-input-border);
31
+ border-radius: var(--kmwc-radius-sm);
32
+ background-color: var(--kmwc-input-bg);
33
+ color: var(--kmwc-input-color);
34
+ font: inherit;
35
+ font-size: 0.875rem;
36
+ transition: border-color 0.15s ease-out, box-shadow 0.15s ease-out;
37
+ }
38
+
39
+ :where(input, select, textarea):not(:where(.kmwc-native, .kmwc-native *))::placeholder {
40
+ color: var(--kmwc-input-placeholder-color);
41
+ opacity: 1;
42
+ }
43
+
44
+ :where(
45
+ input:not([type]),
46
+ input[type="text"], input[type="search"], input[type="email"], input[type="url"],
47
+ input[type="tel"], input[type="password"], input[type="number"], input[type="date"],
48
+ input[type="time"], input[type="datetime-local"], input[type="month"], input[type="week"],
49
+ select, textarea
50
+ ):not(:where(.kmwc-native, .kmwc-native *)):hover {
51
+ border: var(--kmwc-input-border-hover);
52
+ }
53
+
54
+ :where(
55
+ input:not([type]),
56
+ input[type="text"], input[type="search"], input[type="email"], input[type="url"],
57
+ input[type="tel"], input[type="password"], input[type="number"], input[type="date"],
58
+ input[type="time"], input[type="datetime-local"], input[type="month"], input[type="week"],
59
+ select, textarea
60
+ ):not(:where(.kmwc-native, .kmwc-native *)):focus {
61
+ outline: none;
62
+ border: var(--kmwc-input-border-focus);
63
+ box-shadow: var(--kmwc-input-box-shadow-focus);
64
+ }
65
+
66
+ /* A field the user has left invalid (not one that starts empty). */
67
+ :where(input, select, textarea):not(:where(.kmwc-native, .kmwc-native *)):user-invalid {
68
+ border-color: var(--kmwc-danger-fill-color);
69
+ }
70
+
71
+ :where(input, select, textarea):not(:where(.kmwc-native, .kmwc-native *)):disabled {
72
+ background-color: var(--kmwc-input-disabled-bg);
73
+ opacity: var(--kmwc-disabled-opacity);
74
+ cursor: not-allowed;
75
+ }
76
+
77
+ :where(input[type="number"]):not(:where(.kmwc-native, .kmwc-native *)) {
78
+ padding-inline-end: 0.25rem; /* room for the spin buttons */
79
+ }
80
+
81
+ /* Single select: the kit's caret (drawn from the input icon colour, so it
82
+ follows the theme) instead of the platform's. */
83
+ :where(select:not([multiple], [size])):not(:where(.kmwc-native, .kmwc-native *)) {
84
+ appearance: none;
85
+ padding-inline-end: 2rem;
86
+ background-image:
87
+ linear-gradient(45deg, transparent 50%, var(--kmwc-input-icon-color) 50%),
88
+ linear-gradient(135deg, var(--kmwc-input-icon-color) 50%, transparent 50%);
89
+ background-position:
90
+ right 0.95rem center,
91
+ right 0.65rem center;
92
+ background-size: 0.3rem 0.3rem;
93
+ background-repeat: no-repeat;
94
+ cursor: pointer;
95
+ }
96
+
97
+ /* Multiple select / list box: grows with its rows; options are rows. */
98
+ :where(select[multiple], select[size]):not(:where(.kmwc-native, .kmwc-native *)) {
99
+ height: auto;
100
+ padding: 0.25rem;
101
+ }
102
+
103
+ :where(select[multiple], select[size]):not(:where(.kmwc-native, .kmwc-native *)) option {
104
+ padding: 0.25rem 0.5rem;
105
+ border-radius: var(--kmwc-radius-sm);
106
+ }
107
+
108
+ :where(select[multiple], select[size]):not(:where(.kmwc-native, .kmwc-native *)) option:checked {
109
+ background: var(--kmwc-accent-light-bg-hover);
110
+ color: var(--kmwc-text-color-1);
111
+ }
112
+
113
+ :where(textarea):not(:where(.kmwc-native, .kmwc-native *)) {
114
+ height: auto;
115
+ min-height: 5rem;
116
+ padding: 0.5rem 0.625rem;
117
+ line-height: 1.5;
118
+ resize: vertical;
119
+ }
120
+
121
+ /* Inside a form group a field takes the row (pure-admin .pa-input). */
122
+ :where(.form-group) :where(
123
+ input:not([type]),
124
+ input[type="text"], input[type="search"], input[type="email"], input[type="url"],
125
+ input[type="tel"], input[type="password"], input[type="number"], input[type="date"],
126
+ input[type="time"], input[type="datetime-local"], input[type="month"], input[type="week"],
127
+ select, textarea
128
+ ) {
129
+ width: 100%;
130
+ }
131
+
132
+ /* ==========================================================================
133
+ CHECKBOX & RADIO
134
+ ==========================================================================
135
+ The native input, redrawn: the contract's checkbox render method — a
136
+ border-box square sized by --base-checkbox-scale, the tick / dash masked
137
+ from --base-icon-check / --base-icon-indeterminate (the glyph every
138
+ Keenmate component draws). Radios get a dot from the same tokens. */
139
+ :where(input[type="checkbox"], input[type="radio"]):not(:where(.kmwc-native, .kmwc-native *)) {
140
+ appearance: none;
141
+ box-sizing: border-box;
142
+ position: relative;
143
+ flex-shrink: 0;
144
+ display: inline-block;
145
+ width: var(--kmwc-checkbox-size);
146
+ height: var(--kmwc-checkbox-size);
147
+ margin: 0;
148
+ vertical-align: -0.15em;
149
+ border: calc(1px * var(--base-checkbox-scale, 1)) solid var(--kmwc-checkbox-border-color);
150
+ border-radius: calc(4px * var(--base-checkbox-scale, 1));
151
+ background-color: var(--kmwc-input-bg);
152
+ cursor: pointer;
153
+ transition: background-color 0.15s ease, border-color 0.15s ease;
154
+ }
155
+
156
+ :where(input[type="radio"]):not(:where(.kmwc-native, .kmwc-native *)) {
157
+ border-radius: 50%;
158
+ }
159
+
160
+ :where(input[type="checkbox"], input[type="radio"]):not(:where(.kmwc-native, .kmwc-native *)):hover:not(:checked, :indeterminate, :disabled) {
161
+ border-color: var(--kmwc-accent-color);
162
+ }
163
+
164
+ :where(input[type="checkbox"], input[type="radio"]):not(:where(.kmwc-native, .kmwc-native *)):focus-visible {
165
+ outline: none;
166
+ border-color: var(--kmwc-accent-color);
167
+ box-shadow: 0 0 0 3px var(--kmwc-accent-light-bg-hover);
168
+ }
169
+
170
+ :where(input[type="checkbox"]):not(:where(.kmwc-native, .kmwc-native *)):is(:checked, :indeterminate) {
171
+ background-color: var(--kmwc-accent-color);
172
+ border-color: var(--kmwc-accent-color);
173
+ }
174
+
175
+ :where(input[type="checkbox"]):not(:where(.kmwc-native, .kmwc-native *, [role="switch"])):is(:checked, :indeterminate)::before {
176
+ content: '';
177
+ position: absolute;
178
+ inset: 0;
179
+ background-color: var(--kmwc-text-color-on-accent);
180
+ mask: var(--kmwc-icon-check) center / var(--kmwc-icon-check-size) no-repeat;
181
+ }
182
+
183
+ :where(input[type="checkbox"]):not(:where(.kmwc-native, .kmwc-native *, [role="switch"])):indeterminate::before {
184
+ mask-image: var(--kmwc-icon-indeterminate);
185
+ }
186
+
187
+ :where(input[type="radio"]):not(:where(.kmwc-native, .kmwc-native *)):checked {
188
+ border-color: var(--kmwc-accent-color);
189
+ background: radial-gradient(circle, var(--kmwc-text-color-on-accent) 0 30%, var(--kmwc-accent-color) 34%);
190
+ }
191
+
192
+ :where(input[type="checkbox"], input[type="radio"]):not(:where(.kmwc-native, .kmwc-native *)):disabled {
193
+ opacity: var(--kmwc-disabled-opacity);
194
+ cursor: not-allowed;
195
+ }
196
+
197
+ /* The option's label fades with it. */
198
+ :where(label):has(> :is(input, select, textarea):disabled) {
199
+ color: var(--kmwc-text-color-3);
200
+ cursor: not-allowed;
201
+ }
202
+
203
+ /* ==========================================================================
204
+ SWITCH — <input type="checkbox" role="switch">
205
+ ========================================================================== */
206
+ :where(input[type="checkbox"][role="switch"]):not(:where(.kmwc-native, .kmwc-native *)) {
207
+ width: calc(var(--kmwc-checkbox-size) * 1.9);
208
+ border-radius: 999px;
209
+ background-color: var(--kmwc-checkbox-border-color);
210
+ border-color: var(--kmwc-checkbox-border-color);
211
+ }
212
+
213
+ :where(input[type="checkbox"][role="switch"]):not(:where(.kmwc-native, .kmwc-native *))::before {
214
+ content: '';
215
+ position: absolute;
216
+ top: 1px;
217
+ left: 1px;
218
+ width: calc(var(--kmwc-checkbox-size) - 4px);
219
+ height: calc(var(--kmwc-checkbox-size) - 4px);
220
+ border-radius: 50%;
221
+ background-color: var(--kmwc-main-bg);
222
+ transition: translate 0.15s ease;
223
+ }
224
+
225
+ :where(input[type="checkbox"][role="switch"]):not(:where(.kmwc-native, .kmwc-native *)):checked::before {
226
+ translate: calc(var(--kmwc-checkbox-size) * 0.9) 0;
227
+ }
228
+
229
+ /* ==========================================================================
230
+ RANGE, COLOUR, FILE
231
+ ========================================================================== */
232
+ :where(input[type="range"], progress, meter):not(:where(.kmwc-native, .kmwc-native *)) {
233
+ accent-color: var(--kmwc-accent-color);
234
+ vertical-align: middle;
235
+ }
236
+
237
+ :where(input[type="color"]):not(:where(.kmwc-native, .kmwc-native *)) {
238
+ box-sizing: border-box;
239
+ width: var(--kmwc-control-height);
240
+ height: var(--kmwc-control-height);
241
+ padding: 0.2rem;
242
+ border: var(--kmwc-input-border);
243
+ border-radius: var(--kmwc-radius-sm);
244
+ background-color: var(--kmwc-input-bg);
245
+ cursor: pointer;
246
+ }
247
+
248
+ :where(input[type="file"]):not(:where(.kmwc-native, .kmwc-native *)) {
249
+ font: inherit;
250
+ font-size: 0.875rem;
251
+ color: var(--kmwc-text-color-2);
252
+ }
253
+
254
+ :where(input[type="file"]):not(:where(.kmwc-native, .kmwc-native *))::file-selector-button {
255
+ height: var(--kmwc-control-height);
256
+ margin-inline-end: 0.75rem;
257
+ padding: 0 1rem;
258
+ border: 1px solid var(--kmwc-border-color-strong);
259
+ border-radius: var(--kmwc-radius-sm);
260
+ background: var(--kmwc-main-bg);
261
+ color: var(--kmwc-text-color-1);
262
+ font: inherit;
263
+ cursor: pointer;
264
+ }
265
+
266
+ :where(input[type="file"]):not(:where(.kmwc-native, .kmwc-native *))::file-selector-button:hover {
267
+ background: var(--kmwc-hover-bg);
268
+ }
269
+
270
+ /* ==========================================================================
271
+ FIELDSET
272
+ ========================================================================== */
273
+ :where(fieldset):not(:where(.kmwc-native, .kmwc-native *)) {
274
+ border: 1px solid var(--kmwc-border-color);
275
+ border-radius: var(--kmwc-radius-md);
276
+ padding: 0.75rem 1rem 1rem;
277
+ }
278
+
279
+ :where(legend):not(:where(.kmwc-native, .kmwc-native *)) {
280
+ padding: 0 0.375rem;
281
+ font-weight: 600;
282
+ font-size: 0.875rem;
283
+ color: var(--kmwc-text-color-2);
284
+ }
285
+ }
@@ -0,0 +1,417 @@
1
+ /* ==============================================================================
2
+ EXAMPLES KIT — SPOTLIGHT
3
+ ==============================================================================
4
+ Ctrl/⌘+K chapter search (spotlight.js). MIRRORS web-commandpalette's CSS
5
+ (src/css/dialog.css, search.css, results.css, footer.css, animations.css):
6
+ same elements under the kit prefix, same layout, the same --base-* hooks
7
+ for backdrop, focused row and highlight — so both look alike under a theme.
8
+ A rule marked `mirrors …` keeps the wcp rule; keep them in step
9
+ (scripts/spotlight-mirror.json, `npm run check:spotlight-mirror`).
10
+ Spotlight-only: the header trigger button and the section-code chip. */
11
+ @layer kmwc {
12
+ /* ==========================================================================
13
+ TRIGGER (spotlight only) — left of the theme switch
14
+ ========================================================================== */
15
+ .kmwc-spotlight__trigger {
16
+ position: fixed;
17
+ top: 0.75rem;
18
+ right: calc(0.75rem + 36px + 0.5rem);
19
+ z-index: 9000;
20
+ display: inline-flex;
21
+ align-items: center;
22
+ gap: 0.4rem;
23
+ height: 36px;
24
+ padding: 0 0.6rem 0 0.7rem;
25
+ border-radius: 18px;
26
+ border: 1px solid var(--kmwc-border-color);
27
+ background: var(--kmwc-main-bg);
28
+ color: var(--kmwc-text-color-2);
29
+ box-shadow: 0 2px 6px var(--kmwc-shadow-color);
30
+ font: inherit;
31
+ cursor: pointer;
32
+ }
33
+
34
+ .kmwc-spotlight__trigger:hover {
35
+ background: var(--kmwc-hover-bg);
36
+ color: var(--kmwc-text-color-1);
37
+ }
38
+
39
+ .kmwc-spotlight__trigger:focus-visible {
40
+ outline: 2px solid var(--kmwc-accent-color);
41
+ outline-offset: 2px;
42
+ }
43
+
44
+ .kmwc-spotlight__trigger svg,
45
+ .kmwc-spotlight__close svg {
46
+ width: 18px;
47
+ height: 18px;
48
+ flex: none;
49
+ fill: none;
50
+ stroke: currentColor;
51
+ stroke-width: 2;
52
+ stroke-linecap: round;
53
+ }
54
+
55
+ /* ==========================================================================
56
+ DIALOG — mirrors wcp dialog.css
57
+ ========================================================================== */
58
+ .kmwc-spotlight {
59
+ position: fixed;
60
+ inset: 0;
61
+ z-index: 9100; /* above the kit chrome (9000); wcp: --base-z-popover + 1 */
62
+ display: none;
63
+ align-items: flex-start;
64
+ justify-content: center;
65
+ padding-top: 128px;
66
+ font-family: var(--kmwc-font-family);
67
+ }
68
+
69
+ .kmwc-spotlight--active {
70
+ display: flex;
71
+ }
72
+
73
+ .kmwc-spotlight__backdrop {
74
+ position: absolute;
75
+ inset: 0;
76
+ background-color: var(--kmwc-overlay-bg);
77
+ backdrop-filter: blur(4px);
78
+ animation: kmwc-spotlight-fade-in 0.2s ease;
79
+ }
80
+
81
+ .kmwc-spotlight__container {
82
+ position: relative;
83
+ width: 100%;
84
+ max-width: 608px;
85
+ background-color: var(--kmwc-main-bg);
86
+ color: var(--kmwc-text-color-1);
87
+ border-radius: var(--kmwc-radius-md);
88
+ box-shadow: 0 16px 48px var(--kmwc-shadow-color);
89
+ animation: kmwc-spotlight-slide-down 0.2s ease;
90
+ overflow: hidden;
91
+ }
92
+
93
+ @media (max-width: 768px) {
94
+ .kmwc-spotlight {
95
+ padding-top: 1rem;
96
+ }
97
+
98
+ .kmwc-spotlight__container {
99
+ max-width: calc(100% - 2rem);
100
+ }
101
+ }
102
+
103
+ /* Phone fullscreen sheet — mirrors wcp dialog.css `--fullscreen` */
104
+ .kmwc-spotlight__fullscreen-bar {
105
+ display: none;
106
+ flex: 0 0 auto;
107
+ align-items: center;
108
+ justify-content: space-between;
109
+ gap: 0.5rem;
110
+ padding: calc(0.5rem + env(safe-area-inset-top)) 0.5rem 0.5rem;
111
+ border-bottom: 1px solid var(--kmwc-border-color);
112
+ }
113
+
114
+ .kmwc-spotlight__fullscreen-title {
115
+ font-size: 1.5rem;
116
+ font-weight: 600;
117
+ color: var(--kmwc-text-color-1);
118
+ }
119
+
120
+ .kmwc-spotlight__close {
121
+ display: inline-flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ width: 38px;
125
+ height: 38px;
126
+ padding: 0;
127
+ border: var(--kmwc-input-border);
128
+ border-radius: var(--kmwc-radius-md);
129
+ background-color: var(--kmwc-input-bg);
130
+ color: var(--kmwc-text-color-1);
131
+ cursor: pointer;
132
+ }
133
+
134
+ .kmwc-spotlight--fullscreen {
135
+ padding: 0;
136
+ align-items: stretch;
137
+ justify-content: stretch;
138
+ }
139
+
140
+ .kmwc-spotlight--fullscreen .kmwc-spotlight__backdrop {
141
+ display: none;
142
+ }
143
+
144
+ .kmwc-spotlight--fullscreen .kmwc-spotlight__container {
145
+ position: fixed;
146
+ top: 0;
147
+ inset-inline-start: 0;
148
+ width: 100vw;
149
+ max-width: 100vw;
150
+ height: 100dvh;
151
+ max-height: 100dvh;
152
+ border-radius: 0;
153
+ box-shadow: none;
154
+ animation: none;
155
+ display: flex;
156
+ flex-direction: column;
157
+ }
158
+
159
+ .kmwc-spotlight--fullscreen .kmwc-spotlight__fullscreen-bar {
160
+ display: flex;
161
+ }
162
+
163
+ .kmwc-spotlight--fullscreen .kmwc-spotlight__search {
164
+ flex: 0 0 auto;
165
+ }
166
+
167
+ .kmwc-spotlight--fullscreen .kmwc-spotlight__results {
168
+ flex: 1 1 0;
169
+ min-height: 0;
170
+ max-height: none;
171
+ }
172
+
173
+ .kmwc-spotlight--fullscreen .kmwc-spotlight__footer {
174
+ flex: 0 0 auto;
175
+ padding-bottom: calc(0.5rem + env(safe-area-inset-bottom));
176
+ }
177
+
178
+ /* ==========================================================================
179
+ SEARCH — mirrors wcp search.css
180
+ ========================================================================== */
181
+ .kmwc-spotlight__search {
182
+ position: relative;
183
+ border-bottom: 1px solid var(--kmwc-border-color);
184
+ padding: 0.5rem;
185
+ }
186
+
187
+ .kmwc-spotlight__input-wrapper {
188
+ position: relative;
189
+ }
190
+
191
+ .kmwc-spotlight__input {
192
+ box-sizing: border-box; /* wcp gets it from its shadow-root reset */
193
+ width: 100%;
194
+ height: 38px;
195
+ padding: 0 0.5rem;
196
+ font: inherit;
197
+ font-size: 1rem;
198
+ border: var(--kmwc-input-border);
199
+ border-radius: var(--kmwc-radius-md);
200
+ background-color: var(--kmwc-input-bg);
201
+ color: var(--kmwc-input-color);
202
+ outline: none;
203
+ transition: border-color 0.15s ease-out, box-shadow 0.15s ease-out;
204
+ }
205
+
206
+ .kmwc-spotlight__input:focus {
207
+ border-color: var(--kmwc-accent-color);
208
+ box-shadow: 0 0 0 3px var(--kmwc-accent-light-bg);
209
+ }
210
+
211
+ .kmwc-spotlight__input::placeholder {
212
+ color: var(--kmwc-text-color-3);
213
+ opacity: 1;
214
+ }
215
+
216
+ /* ==========================================================================
217
+ RESULTS — mirrors wcp results.css
218
+ ========================================================================== */
219
+ .kmwc-spotlight__results {
220
+ max-height: min(384px, max(160px, 100dvh - 128px - 120px));
221
+ overflow-y: auto;
222
+ overscroll-behavior: contain;
223
+ padding: 0.5rem 0;
224
+ position: relative;
225
+ scrollbar-width: thin;
226
+ }
227
+
228
+ @media (max-width: 768px) {
229
+ .kmwc-spotlight__results {
230
+ max-height: 60vh;
231
+ }
232
+ }
233
+
234
+ .kmwc-spotlight__home-section:not(:first-child) {
235
+ border-top: 1px solid var(--kmwc-border-color);
236
+ margin-top: 0.25rem;
237
+ padding-top: 0.25rem;
238
+ }
239
+
240
+ .kmwc-spotlight__home-heading {
241
+ padding: 0.25rem 0.5rem;
242
+ font-size: 0.7rem;
243
+ font-weight: 600;
244
+ color: var(--kmwc-text-color-2);
245
+ text-transform: uppercase;
246
+ letter-spacing: 0.05em;
247
+ }
248
+
249
+ .kmwc-spotlight__empty {
250
+ padding: 2rem 0.5rem;
251
+ text-align: center;
252
+ color: var(--kmwc-text-color-2);
253
+ font-size: 0.875rem;
254
+ }
255
+
256
+ .kmwc-spotlight__item {
257
+ padding: 0.5rem;
258
+ cursor: pointer;
259
+ transition: background-color 0.15s ease;
260
+ display: flex;
261
+ align-items: center;
262
+ gap: 0.5rem;
263
+ color: inherit;
264
+ text-decoration: none;
265
+ }
266
+
267
+ .kmwc-spotlight__item:hover {
268
+ background-color: var(--kmwc-hover-bg);
269
+ text-decoration: none;
270
+ }
271
+
272
+ /* The keyboard cursor (where Enter goes): the focused item state — an inset
273
+ outline (offset = minus its width, so a thicker outline stays inside the row). */
274
+ .kmwc-spotlight__item--active {
275
+ background-color: var(--kmwc-focused-bg);
276
+ outline: var(--kmwc-focused-outline);
277
+ outline-offset: calc(-1 * var(--kmwc-outline-width));
278
+ }
279
+
280
+ .kmwc-spotlight__item--active:hover {
281
+ background-color: var(--kmwc-hover-bg);
282
+ }
283
+
284
+ .kmwc-spotlight__item--active .kmwc-spotlight__item-title {
285
+ color: var(--kmwc-focused-text-color);
286
+ }
287
+
288
+ /* The section code, in the slot wcp gives the item icon (spotlight only). */
289
+ .kmwc-spotlight__item-code {
290
+ flex-shrink: 0;
291
+ min-width: 3.4rem;
292
+ padding: 0.15rem 0.35rem;
293
+ border-radius: var(--kmwc-radius-sm);
294
+ background-color: var(--kmwc-accent-light-bg);
295
+ color: var(--kmwc-accent-color);
296
+ font-family: var(--kmwc-mono-font-family);
297
+ font-size: 0.78rem;
298
+ font-weight: 700;
299
+ text-align: center;
300
+ }
301
+
302
+ .kmwc-spotlight__item-content {
303
+ flex: 1;
304
+ min-width: 0;
305
+ }
306
+
307
+ .kmwc-spotlight__item-title {
308
+ display: block;
309
+ font-size: 0.875rem;
310
+ font-weight: 500;
311
+ color: var(--kmwc-text-color-1);
312
+ white-space: nowrap;
313
+ overflow: hidden;
314
+ text-overflow: ellipsis;
315
+ }
316
+
317
+ /* The matched part of the query. */
318
+ .kmwc-spotlight__item-title mark,
319
+ .kmwc-spotlight__item-code mark {
320
+ background-color: var(--kmwc-accent-light-bg-hover);
321
+ color: var(--kmwc-accent-color);
322
+ font-weight: 600;
323
+ padding: 0 2px;
324
+ border-radius: var(--kmwc-radius-sm);
325
+ }
326
+
327
+ .kmwc-spotlight__item-code mark {
328
+ padding: 0;
329
+ }
330
+
331
+ /* Screen-reader-only result count (wcp: .cp-sr-only). */
332
+ .kmwc-spotlight__live {
333
+ position: absolute;
334
+ width: 1px;
335
+ height: 1px;
336
+ margin: -1px;
337
+ overflow: hidden;
338
+ clip-path: inset(50%);
339
+ white-space: nowrap;
340
+ }
341
+
342
+ /* ==========================================================================
343
+ FOOTER — mirrors wcp footer.css
344
+ ========================================================================== */
345
+ .kmwc-spotlight__footer {
346
+ border-top: 1px solid var(--kmwc-border-color);
347
+ padding: 0.5rem;
348
+ display: flex;
349
+ flex-wrap: wrap;
350
+ gap: 1rem;
351
+ font-size: 0.75rem;
352
+ color: var(--kmwc-text-color-2);
353
+ }
354
+
355
+ .kmwc-spotlight__hint {
356
+ display: flex;
357
+ align-items: center;
358
+ gap: 0.25rem;
359
+ }
360
+
361
+ .kmwc-spotlight__key,
362
+ .kmwc-spotlight__trigger-key {
363
+ padding: 2px 0.25rem;
364
+ background-color: var(--kmwc-elevated-bg);
365
+ color: var(--kmwc-text-color-1);
366
+ border: 1px solid var(--kmwc-border-color);
367
+ border-radius: var(--kmwc-radius-sm);
368
+ font-family: var(--kmwc-font-family);
369
+ font-weight: 600;
370
+ font-size: 0.75rem;
371
+ line-height: 1;
372
+ }
373
+
374
+ .kmwc-spotlight__trigger-key {
375
+ color: var(--kmwc-text-color-3);
376
+ font-weight: 400;
377
+ }
378
+
379
+ /* ==========================================================================
380
+ ANIMATIONS — mirrors wcp animations.css
381
+ ========================================================================== */
382
+ @keyframes kmwc-spotlight-fade-in {
383
+ from { opacity: 0; }
384
+ to { opacity: 1; }
385
+ }
386
+
387
+ @keyframes kmwc-spotlight-slide-down {
388
+ from {
389
+ opacity: 0;
390
+ transform: translateY(-20px);
391
+ }
392
+ to {
393
+ opacity: 1;
394
+ transform: translateY(0);
395
+ }
396
+ }
397
+
398
+ @media (prefers-reduced-motion: reduce) {
399
+ .kmwc-spotlight__backdrop,
400
+ .kmwc-spotlight__container {
401
+ animation: none;
402
+ }
403
+ }
404
+
405
+ @media (max-width: 768px) {
406
+ .kmwc-spotlight__trigger-key,
407
+ .kmwc-spotlight__footer {
408
+ display: none;
409
+ }
410
+
411
+ .kmwc-spotlight__trigger {
412
+ width: 36px;
413
+ padding: 0;
414
+ justify-content: center;
415
+ }
416
+ }
417
+ }