@hjmds/react 1.4.0 → 1.5.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.
@@ -0,0 +1,2588 @@
1
+ @layer hjm {
2
+ .hjm-root,
3
+ .hjm-root *,
4
+ .hjm-root *::before,
5
+ .hjm-root *::after {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ .hjm-root {
10
+ min-inline-size: 0;
11
+ font-family: var(--hjm-font-family-ui, system-ui, sans-serif);
12
+ font-size: var(--hjm-type-body-size, 0.875rem);
13
+ line-height: var(--hjm-type-body-line-height, 1.25rem);
14
+ background: var(--hjm-color-bg);
15
+ color: var(--hjm-color-text);
16
+ }
17
+
18
+ /* host="contents": the element only carries the theme variables, dir and data
19
+ attributes. Custom properties still inherit through display: contents, so
20
+ recipes keep resolving; the product's own root paints the surface. */
21
+ .hjm-root[data-host="contents"] {
22
+ display: contents;
23
+ background: transparent;
24
+ color: inherit;
25
+ font-family: inherit;
26
+ font-size: inherit;
27
+ line-height: inherit;
28
+ }
29
+
30
+ .hjm-visually-hidden {
31
+ position: absolute !important;
32
+ inline-size: 1px !important;
33
+ block-size: 1px !important;
34
+ padding: 0 !important;
35
+ margin: -1px !important;
36
+ overflow: hidden !important;
37
+ clip: rect(0, 0, 0, 0) !important;
38
+ white-space: nowrap !important;
39
+ border: 0 !important;
40
+ }
41
+
42
+ .hjm-text {
43
+ margin: 0;
44
+ overflow-wrap: anywhere;
45
+ }
46
+
47
+ .hjm-text[data-variant="caption"] { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
48
+ .hjm-text[data-variant="label"] { font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
49
+ .hjm-text[data-variant="body"] { font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
50
+ .hjm-text[data-variant="bodyLarge"] { font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
51
+ .hjm-text[data-variant="title"] { font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); }
52
+ .hjm-text[data-variant="titleLarge"] { font-size: var(--hjm-type-title-large-size); line-height: var(--hjm-type-title-large-line-height); }
53
+ .hjm-text[data-variant="heading"] { font-size: var(--hjm-type-heading-size); line-height: var(--hjm-type-heading-line-height); }
54
+ .hjm-text[data-emphasis="regular"] { font-weight: var(--hjm-font-weight-regular); }
55
+ .hjm-text[data-emphasis="medium"] { font-weight: var(--hjm-font-weight-semibold); }
56
+ .hjm-text[data-emphasis="strong"] { font-weight: var(--hjm-font-weight-bold); }
57
+ .hjm-text[data-tone="primary"] { color: var(--hjm-color-text); }
58
+ .hjm-text[data-tone="body"] { color: var(--hjm-color-text-body); }
59
+ .hjm-text[data-tone="muted"] { color: var(--hjm-color-text-muted); }
60
+ .hjm-text[data-tone="subtle"] { color: var(--hjm-color-text-sub); }
61
+ .hjm-text[data-tone="weak"] { color: var(--hjm-color-text-weak); }
62
+ .hjm-text[data-tone="brand"] { color: var(--hjm-color-content-brand); }
63
+ .hjm-text[data-tone="danger"] { color: var(--hjm-color-danger); }
64
+ .hjm-text[data-tone="inverse"] { color: var(--hjm-color-on-primary); }
65
+
66
+ /* Long unbroken copy (URLs, e-mail, identifiers) must wrap inside layout
67
+ containers instead of pushing them past the viewport; found by the 1.5.0
68
+ long-copy scenario proof. overflow-wrap inherits, so text children follow. */
69
+ .hjm-surface {
70
+ min-inline-size: 0;
71
+ overflow-wrap: anywhere;
72
+ border: 1px solid transparent;
73
+ border-radius: var(--hjm-radius-lg);
74
+ background: var(--hjm-color-surface);
75
+ }
76
+ /* A child image would otherwise spill past the rounded corner. An elevated tone
77
+ opts out because clipping cuts off its own shadow. */
78
+ .hjm-surface[data-clips="true"] { overflow: hidden; }
79
+ .hjm-surface[data-tone="raised"] { background: var(--hjm-color-bg); box-shadow: 0 4px 12px rgb(0 0 0 / 12%); }
80
+ .hjm-surface[data-tone="accent"] { background: var(--hjm-color-surface-accent); }
81
+ .hjm-surface[data-tone="sunken"] { background: var(--hjm-color-surface-alt); }
82
+ .hjm-surface[data-tone="subtle"] { background: var(--hjm-color-bg); }
83
+ .hjm-surface[data-bordered="true"] { border-color: var(--hjm-color-border); }
84
+ .hjm-surface[data-tone="accent"][data-bordered="true"] { border-color: color-mix(in srgb, var(--hjm-color-primary) 30%, transparent); }
85
+
86
+ .hjm-stack,
87
+ .hjm-grid { min-inline-size: 0; }
88
+ .hjm-grid > * { min-inline-size: 0; }
89
+
90
+ .hjm-container {
91
+ box-sizing: border-box;
92
+ inline-size: 100%;
93
+ margin-inline: auto;
94
+ min-inline-size: 0;
95
+ }
96
+
97
+ .hjm-aspect-ratio {
98
+ inline-size: 100%;
99
+ min-inline-size: 0;
100
+ position: relative;
101
+ }
102
+ .hjm-aspect-ratio > * {
103
+ block-size: 100%;
104
+ inline-size: 100%;
105
+ min-inline-size: 0;
106
+ }
107
+
108
+ .hjm-visually-hidden {
109
+ block-size: 1px;
110
+ border: 0;
111
+ clip-path: inset(50%);
112
+ inline-size: 1px;
113
+ margin: -1px;
114
+ overflow: hidden;
115
+ padding: 0;
116
+ position: absolute;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ .hjm-layout {
121
+ min-inline-size: 0;
122
+ min-block-size: 100%;
123
+ display: grid;
124
+ grid-template-columns: minmax(0, 1fr);
125
+ align-content: start;
126
+ }
127
+ .hjm-layout[data-sidebar-mode="persistent"] {
128
+ grid-template-columns: auto minmax(0, 1fr);
129
+ }
130
+ .hjm-layout__skip-link {
131
+ position: fixed;
132
+ z-index: 1400;
133
+ inset-block-start: var(--hjm-space-sm);
134
+ inset-inline-start: var(--hjm-space-sm);
135
+ padding: var(--hjm-space-sm) var(--hjm-space-md);
136
+ border-radius: var(--hjm-radius-md);
137
+ color: var(--hjm-color-on-primary);
138
+ background: var(--hjm-color-primary);
139
+ font-weight: var(--hjm-font-weight-semibold);
140
+ text-decoration: none;
141
+ transform: translateY(calc(-100% - (2 * var(--hjm-space-sm))));
142
+ transition: transform var(--hjm-motion-fast);
143
+ }
144
+ .hjm-layout__skip-link:focus-visible {
145
+ outline: 2px solid var(--hjm-color-content-brand);
146
+ outline-offset: 2px;
147
+ transform: translateY(0);
148
+ }
149
+ .hjm-layout__header,
150
+ .hjm-layout__footer { min-inline-size: 0; grid-column: 1 / -1; }
151
+ .hjm-layout__sidebar { min-inline-size: 0; grid-column: 1; }
152
+ .hjm-layout__main {
153
+ min-inline-size: 0;
154
+ inline-size: 100%;
155
+ margin-inline: auto;
156
+ grid-column: 1 / -1;
157
+ }
158
+ .hjm-layout[data-sidebar-mode="persistent"] .hjm-layout__main {
159
+ grid-column: 2;
160
+ }
161
+
162
+ .hjm-image {
163
+ position: relative;
164
+ display: inline-grid;
165
+ place-items: stretch;
166
+ max-inline-size: 100%;
167
+ overflow: hidden;
168
+ border-radius: var(--hjm-radius-md);
169
+ background: var(--hjm-color-surface-alt);
170
+ vertical-align: middle;
171
+ }
172
+ .hjm-image__asset,
173
+ .hjm-image__fallback {
174
+ inline-size: 100%;
175
+ block-size: 100%;
176
+ min-block-size: 0;
177
+ }
178
+ .hjm-image__asset { display: block; }
179
+ .hjm-image__fallback {
180
+ display: grid;
181
+ place-items: center;
182
+ color: var(--hjm-color-text-muted);
183
+ background: var(--hjm-color-surface-alt);
184
+ }
185
+ .hjm-image__fallback-icon { display: inline-grid; place-items: center; }
186
+
187
+ .hjm-button,
188
+ .hjm-icon-button,
189
+ .hjm-link {
190
+ font: inherit;
191
+ font-weight: var(--hjm-font-weight-semibold);
192
+ transition: background-color var(--hjm-motion-fast), color var(--hjm-motion-fast), opacity var(--hjm-motion-fast), transform var(--hjm-motion-fast);
193
+ }
194
+ .hjm-button,
195
+ .hjm-icon-button {
196
+ display: inline-flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ gap: var(--hjm-space-xs);
200
+ border: 1px solid transparent;
201
+ cursor: pointer;
202
+ }
203
+ .hjm-button {
204
+ position: relative;
205
+ min-block-size: var(--hjm-control-button-medium);
206
+ padding: var(--hjm-space-xs) var(--hjm-space-md);
207
+ border-radius: var(--hjm-radius-md);
208
+ font-size: var(--hjm-type-body-size);
209
+ line-height: var(--hjm-type-body-line-height);
210
+ }
211
+ .hjm-button[data-size="small"] {
212
+ min-block-size: var(--hjm-control-button-small);
213
+ padding-inline: var(--hjm-space-sm);
214
+ font-size: var(--hjm-type-label-size);
215
+ line-height: var(--hjm-type-label-line-height);
216
+ }
217
+ .hjm-button[data-size="small"]::after {
218
+ content: "";
219
+ position: absolute;
220
+ inset: calc(-1 * var(--hjm-space-xxs));
221
+ }
222
+ /* Shape and label alignment are recipe axes; a product must not override
223
+ border-radius or justify-content on the control itself. */
224
+ .hjm-button[data-shape="pill"] { border-radius: var(--hjm-radius-full); }
225
+ .hjm-button[data-align="leading"] { justify-content: flex-start; text-align: start; }
226
+
227
+ .hjm-button[data-size="large"] {
228
+ min-block-size: var(--hjm-control-button-large);
229
+ padding-inline: var(--hjm-space-lg);
230
+ font-size: var(--hjm-type-body-large-size);
231
+ line-height: var(--hjm-type-body-large-line-height);
232
+ }
233
+ .hjm-button[data-tone="primary"], .hjm-icon-button[data-tone="primary"] { color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
234
+ .hjm-button[data-tone="secondary"], .hjm-icon-button[data-tone="secondary"] { color: var(--hjm-color-text); background: var(--hjm-color-surface-alt); border-color: var(--hjm-color-border-control); }
235
+ .hjm-button[data-tone="ghost"], .hjm-icon-button[data-tone="ghost"] { color: var(--hjm-color-text-muted); background: transparent; }
236
+ .hjm-button[data-tone="danger"], .hjm-icon-button[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
237
+ /* A link-tone control is inline copy; the size axis' padding would push it out
238
+ of alignment with the text around it. */
239
+ .hjm-button[data-tone="link"] { color: var(--hjm-color-content-brand); background: transparent; padding-inline: 0; }
240
+ /* Toggle treatment: aria-pressed already carried the state, so without a paired
241
+ visual every consumer painted the selected background in product styles. */
242
+ .hjm-button[data-selected="true"], .hjm-icon-button[data-selected="true"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); border-color: var(--hjm-color-content-brand); }
243
+ .hjm-button:active:not(:disabled):not([aria-disabled="true"]), .hjm-icon-button:active:not(:disabled):not([aria-disabled="true"]) { opacity: var(--hjm-button-pressed-opacity); }
244
+ .hjm-button:disabled, .hjm-icon-button:disabled { cursor: not-allowed; opacity: var(--hjm-button-disabled-opacity); }
245
+ /* 라벨은 자르지 않고 두 줄까지 접는다(buttonRecipe.label). 잘린 행동 라벨은 무엇을 하는
246
+ 버튼인지 잃고, 무제한 줄바꿈은 하단 CTA 행 같은 남의 레이아웃을 밀어낸다. */
247
+ .hjm-button__label { min-inline-size: 0; overflow-wrap: anywhere; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: var(--hjm-button-label-lines, 2); overflow: hidden; }
248
+ /* 큰 글자 설정에서는 상한을 푼다 — 사용자가 키운 글자를 잘라 내용을 숨기면 WCAG 1.4.4다. */
249
+ [data-large-text="true"] .hjm-button__label { display: block; overflow: visible; }
250
+ .hjm-button__spinner,
251
+ .hjm-spinner__glyph {
252
+ display: inline-block;
253
+ inline-size: 1em;
254
+ block-size: 1em;
255
+ border: 2px solid currentColor;
256
+ border-inline-end-color: transparent;
257
+ border-radius: 50%;
258
+ animation: hjm-spin 800ms linear infinite;
259
+ }
260
+ .hjm-icon-button {
261
+ position: relative;
262
+ inline-size: var(--hjm-control-button-medium);
263
+ block-size: var(--hjm-control-button-medium);
264
+ min-inline-size: var(--hjm-control-min-touch-target);
265
+ min-block-size: var(--hjm-control-min-touch-target);
266
+ padding: var(--hjm-space-xs);
267
+ border-radius: var(--hjm-radius-md);
268
+ }
269
+ .hjm-icon-button[data-shape="circle"] { border-radius: var(--hjm-radius-full); }
270
+ .hjm-icon-button[data-size="small"] { inline-size: var(--hjm-control-button-small); block-size: var(--hjm-control-button-small); min-inline-size: 0; min-block-size: 0; }
271
+ .hjm-icon-button[data-size="small"]::after { content: ""; position: absolute; inset: calc(-1 * var(--hjm-space-xxs)); }
272
+ .hjm-icon-button[data-size="large"] { inline-size: var(--hjm-control-button-large); block-size: var(--hjm-control-button-large); }
273
+ .hjm-link { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); max-inline-size: 100%; min-inline-size: 0; overflow-wrap: anywhere; color: var(--hjm-color-content-brand); text-underline-offset: 0.18em; }
274
+ .hjm-link[data-tone="neutral"] { color: var(--hjm-color-text-body); }
275
+ .hjm-link[data-variant="standalone"] { min-block-size: var(--hjm-control-min-touch-target); min-inline-size: var(--hjm-control-min-touch-target); justify-content: center; text-decoration: none; }
276
+ .hjm-link[aria-disabled="true"] { opacity: 0.5; text-decoration: none; }
277
+
278
+ .hjm-button:focus-visible,
279
+ .hjm-icon-button:focus-visible,
280
+ .hjm-link:focus-visible,
281
+ .hjm-choice__input:focus-visible + .hjm-choice__indicator,
282
+ .hjm-switch:focus-visible .hjm-switch__track,
283
+ .hjm-segmented__item:has(input:focus-visible),
284
+ .hjm-tabs__tab:focus-visible,
285
+ .hjm-list-row:focus-visible {
286
+ outline: var(--hjm-focus-width) solid var(--hjm-color-focus);
287
+ outline-offset: var(--hjm-focus-offset);
288
+ }
289
+
290
+ .hjm-field { display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
291
+ .hjm-field__label { color: var(--hjm-color-text-body); font-weight: var(--hjm-font-weight-semibold); }
292
+ .hjm-field__control {
293
+ display: flex;
294
+ align-items: center;
295
+ min-block-size: var(--hjm-control-field-height);
296
+ padding-inline: var(--hjm-space-md);
297
+ border: var(--hjm-field-border-width) solid var(--hjm-color-text-muted);
298
+ border-radius: var(--hjm-radius-md);
299
+ background: var(--hjm-color-surface);
300
+ }
301
+ .hjm-field[data-variant="inset"] .hjm-field__control { background: var(--hjm-color-bg); }
302
+ .hjm-field[data-shape="large"] .hjm-field__control { border-radius: var(--hjm-radius-lg); }
303
+ .hjm-field[data-shape="full"] .hjm-field__control { border-radius: var(--hjm-radius-full); }
304
+ /* The ring is 2px (focusIndicatorContract.width), not 1px: at 1px the focused and
305
+ unfocused frames differ by 1.06:1 in light and 1.44:1 in dark, so the state change
306
+ reads as hue only. The wider ring makes it a shape change like every other control.
307
+ See issue #19. */
308
+ .hjm-field[data-state="focused"] .hjm-field__control { border-color: var(--hjm-color-content-brand); box-shadow: 0 0 0 var(--hjm-field-focus-ring-width) var(--hjm-color-content-brand); }
309
+ .hjm-field[data-state="invalid"] .hjm-field__control { border-color: var(--hjm-color-danger); }
310
+ .hjm-field[data-state="disabled"] { opacity: var(--hjm-field-disabled-opacity); }
311
+ .hjm-field__input {
312
+ inline-size: 100%;
313
+ min-inline-size: 0;
314
+ min-block-size: calc(var(--hjm-control-field-height) - 2px);
315
+ padding-block: var(--hjm-space-xs);
316
+ border: 0;
317
+ outline: 0;
318
+ color: var(--hjm-color-text);
319
+ background: transparent;
320
+ font: inherit;
321
+ }
322
+ .hjm-field__input::placeholder { color: var(--hjm-color-text-muted); opacity: 1; }
323
+ /* A short, ceremonial value (nickname, code) centres; the default follows the
324
+ resolved direction. Product code must not reach for `text-align`. */
325
+ .hjm-field[data-align="center"] .hjm-field__input { text-align: center; }
326
+ /* The multiline minimum came from the recipe, not from a hardcoded 80px, and a
327
+ consumer can widen or cap it in visible lines rather than pixels. */
328
+ .hjm-field__control--multiline { min-block-size: var(--hjm-field-multiline-min-height); align-items: stretch; }
329
+ .hjm-field__control--multiline textarea {
330
+ min-block-size: max(
331
+ calc(var(--hjm-field-multiline-min-height) - 2px),
332
+ calc(var(--hjm-field-min-visible-lines, 0) * var(--hjm-type-body-line-height) + var(--hjm-field-padding-block) * 2)
333
+ );
334
+ max-block-size: calc(
335
+ var(--hjm-field-max-visible-lines, 1000) * var(--hjm-type-body-line-height) + var(--hjm-field-padding-block) * 2
336
+ );
337
+ resize: vertical;
338
+ }
339
+ .hjm-field__affix { display: inline-flex; align-items: center; color: var(--hjm-color-text-muted); }
340
+ .hjm-field__description, .hjm-choice__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
341
+ .hjm-field__error { color: var(--hjm-color-danger); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
342
+ .hjm-search-field__clear { inline-size: 32px; block-size: 32px; display: inline-grid; place-items: center; border: 0; border-radius: 50%; color: inherit; background: transparent; font: inherit; cursor: pointer; }
343
+ .hjm-search-field__spinner { inline-size: 32px; block-size: 32px; display: inline-grid; place-items: center; color: var(--hjm-color-content-brand); }
344
+ .hjm-search-field__spinner:empty::before { content: ""; inline-size: 1em; block-size: 1em; border: 2px solid currentColor; border-inline-end-color: transparent; border-radius: 50%; animation: hjm-spin 800ms linear infinite; }
345
+ .hjm-password-field--large .hjm-field__control { min-block-size: var(--hjm-control-button-large); padding-inline: var(--hjm-space-lg); }
346
+ .hjm-password-field--large .hjm-field__input { min-block-size: calc(var(--hjm-control-button-large) - 2px); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
347
+ .hjm-password-field__toggle {
348
+ position: relative;
349
+ flex: 0 0 var(--hjm-control-min-touch-target);
350
+ inline-size: var(--hjm-control-min-touch-target);
351
+ block-size: var(--hjm-control-min-touch-target);
352
+ display: inline-grid;
353
+ place-items: center;
354
+ margin-inline-end: calc(-1 * var(--hjm-space-xs));
355
+ padding: 0;
356
+ border: 0;
357
+ border-radius: var(--hjm-radius-full);
358
+ color: var(--hjm-color-text-muted);
359
+ background: transparent;
360
+ cursor: pointer;
361
+ }
362
+ .hjm-password-field__toggle:disabled { cursor: not-allowed; opacity: 0.6; }
363
+ .hjm-password-field__toggle:focus-visible { outline: 2px solid var(--hjm-color-content-brand); outline-offset: -2px; }
364
+ .hjm-password-field__toggle > span:empty {
365
+ position: relative;
366
+ inline-size: 18px;
367
+ block-size: 12px;
368
+ display: block;
369
+ border: 2px solid currentColor;
370
+ border-radius: 70% 20%;
371
+ transform: rotate(45deg);
372
+ }
373
+ .hjm-password-field__toggle > span:empty::after {
374
+ content: "";
375
+ position: absolute;
376
+ inset: 2px;
377
+ border-radius: 50%;
378
+ background: currentColor;
379
+ }
380
+ .hjm-password-field__toggle[data-revealed] > span:empty::before {
381
+ content: "";
382
+ position: absolute;
383
+ z-index: 1;
384
+ inset-block-start: 4px;
385
+ inset-inline-start: -3px;
386
+ inline-size: 22px;
387
+ border-block-start: 2px solid currentColor;
388
+ }
389
+ .hjm-otp-field__control {
390
+ --hjm-otp-slot-size: var(--hjm-control-min-touch-target);
391
+ --hjm-otp-gap: var(--hjm-space-xs);
392
+ position: relative;
393
+ inline-size: 100%;
394
+ max-inline-size: calc(
395
+ (var(--hjm-otp-slot-size) * var(--hjm-otp-length)) +
396
+ (var(--hjm-otp-gap) * (var(--hjm-otp-length) - 1))
397
+ );
398
+ direction: ltr;
399
+ }
400
+ .hjm-otp-field__control[data-size="large"] {
401
+ --hjm-otp-slot-size: var(--hjm-control-button-large);
402
+ --hjm-otp-gap: var(--hjm-space-sm);
403
+ }
404
+ .hjm-otp-field__input {
405
+ position: absolute;
406
+ z-index: 1;
407
+ inset: 0;
408
+ inline-size: 100%;
409
+ block-size: 100%;
410
+ padding: 0;
411
+ border: 0;
412
+ outline: 0;
413
+ opacity: 0.001;
414
+ color: transparent;
415
+ background: transparent;
416
+ caret-color: transparent;
417
+ cursor: text;
418
+ }
419
+ .hjm-otp-field__slots {
420
+ display: grid;
421
+ grid-template-columns: repeat(var(--hjm-otp-length), minmax(0, var(--hjm-otp-slot-size)));
422
+ gap: var(--hjm-otp-gap);
423
+ pointer-events: none;
424
+ }
425
+ .hjm-otp-field__slot {
426
+ min-inline-size: 0;
427
+ min-block-size: var(--hjm-otp-slot-size);
428
+ display: grid;
429
+ place-items: center;
430
+ padding-block: var(--hjm-space-xxs);
431
+ border: 1px solid var(--hjm-color-text-muted);
432
+ border-radius: var(--hjm-radius-md);
433
+ color: var(--hjm-color-text);
434
+ background: var(--hjm-color-surface);
435
+ font-size: var(--hjm-type-title-size);
436
+ line-height: var(--hjm-type-title-line-height);
437
+ font-weight: var(--hjm-font-weight-semibold);
438
+ }
439
+ .hjm-otp-field__control[data-size="large"] .hjm-otp-field__slot { font-size: var(--hjm-type-title-large-size); line-height: var(--hjm-type-title-large-line-height); }
440
+ .hjm-otp-field__slot[data-state="filled"] { border-color: var(--hjm-color-content-brand); }
441
+ .hjm-otp-field__slot[data-state="focused"] { border-color: var(--hjm-color-content-brand); box-shadow: 0 0 0 2px var(--hjm-color-content-brand); }
442
+ .hjm-otp-field__slot[data-state="invalid"] { border-color: var(--hjm-color-danger); }
443
+
444
+ .hjm-bottom-navigation {
445
+ position: fixed;
446
+ z-index: 700;
447
+ inset-inline: 0;
448
+ inset-block-end: 0;
449
+ padding-block-start: var(--hjm-bottom-navigation-outer-top);
450
+ padding-block-end: calc(env(safe-area-inset-bottom, 0px) + var(--hjm-space-xs));
451
+ padding-inline: var(--hjm-bottom-navigation-outer-inline);
452
+ pointer-events: none;
453
+ }
454
+ .hjm-bottom-navigation__surface {
455
+ position: relative;
456
+ inline-size: 100%;
457
+ max-inline-size: var(--hjm-bottom-navigation-max-width);
458
+ margin-inline: auto;
459
+ border-color: var(--hjm-color-border);
460
+ background: var(--hjm-color-bg);
461
+ pointer-events: auto;
462
+ }
463
+ .hjm-bottom-navigation[data-presentation="bar"] .hjm-bottom-navigation__surface {
464
+ border-block-start: 1px solid var(--hjm-color-border);
465
+ }
466
+ .hjm-bottom-navigation[data-presentation="floating"] .hjm-bottom-navigation__surface {
467
+ border: 1px solid var(--hjm-color-border);
468
+ border-radius: var(--hjm-radius-xl);
469
+ box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
470
+ }
471
+ .hjm-bottom-navigation__list {
472
+ display: grid;
473
+ grid-template-columns: repeat(var(--hjm-bottom-navigation-columns), minmax(var(--hjm-bottom-navigation-item-min-width), 1fr));
474
+ align-items: start;
475
+ margin: 0;
476
+ padding: 0;
477
+ list-style: none;
478
+ }
479
+ .hjm-bottom-navigation[data-distribution="center-gap"] .hjm-bottom-navigation__list {
480
+ grid-template-columns:
481
+ repeat(var(--hjm-bottom-navigation-half-columns), minmax(var(--hjm-bottom-navigation-item-min-width), 1fr))
482
+ var(--hjm-bottom-navigation-center-gap)
483
+ repeat(var(--hjm-bottom-navigation-half-columns), minmax(var(--hjm-bottom-navigation-item-min-width), 1fr));
484
+ }
485
+ .hjm-bottom-navigation__item {
486
+ position: relative;
487
+ min-inline-size: var(--hjm-bottom-navigation-item-min-width);
488
+ min-block-size: var(--hjm-bottom-navigation-item-min-height);
489
+ display: flex;
490
+ flex-direction: column;
491
+ align-items: center;
492
+ justify-content: flex-start;
493
+ gap: var(--hjm-bottom-navigation-item-gap);
494
+ padding: var(--hjm-bottom-navigation-item-padding);
495
+ border-radius: var(--hjm-radius-lg);
496
+ color: var(--hjm-color-text-muted);
497
+ text-align: center;
498
+ text-decoration: none;
499
+ overflow-wrap: anywhere;
500
+ }
501
+ .hjm-bottom-navigation__item:hover { background: var(--hjm-color-surface-alt); }
502
+ .hjm-bottom-navigation__item:active { background: var(--hjm-bottom-navigation-pressed-background); }
503
+ .hjm-bottom-navigation__item:focus-visible {
504
+ outline: 2px solid var(--hjm-color-content-brand);
505
+ outline-offset: 2px;
506
+ }
507
+ .hjm-bottom-navigation__item[data-state="selected"] { color: var(--hjm-color-content-brand); }
508
+ .hjm-bottom-navigation__item[data-state="disabled"] { opacity: 0.5; }
509
+ .hjm-bottom-navigation__indicator {
510
+ position: relative;
511
+ min-inline-size: 40px;
512
+ min-block-size: 28px;
513
+ display: inline-flex;
514
+ align-items: center;
515
+ justify-content: center;
516
+ }
517
+ .hjm-bottom-navigation__indicator > :first-child { transition: transform 160ms ease; }
518
+ .hjm-bottom-navigation__indicator[data-state="selected"] > :first-child { transform: scale(1.06); }
519
+ .hjm-bottom-navigation__label { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-semibold); }
520
+ .hjm-bottom-navigation__item[data-state="selected"] .hjm-bottom-navigation__label { font-weight: var(--hjm-font-weight-bold); }
521
+ .hjm-bottom-navigation__badge {
522
+ position: absolute;
523
+ inset-block-start: calc(-1 * var(--hjm-space-xxs));
524
+ inset-inline-end: calc(-1 * var(--hjm-space-xs));
525
+ min-inline-size: 1rem;
526
+ min-block-size: 1rem;
527
+ display: inline-flex;
528
+ align-items: center;
529
+ justify-content: center;
530
+ padding-inline: 0.25rem;
531
+ border: 2px solid var(--hjm-color-bg);
532
+ border-radius: var(--hjm-radius-full);
533
+ color: var(--hjm-color-on-danger);
534
+ background: var(--hjm-color-danger-fill);
535
+ font-size: var(--hjm-type-caption-size);
536
+ line-height: 1;
537
+ }
538
+ .hjm-bottom-navigation__primary-action {
539
+ position: absolute;
540
+ inset-inline-start: 50%;
541
+ inset-block-start: 50%;
542
+ translate: -50% -50%;
543
+ }
544
+
545
+ .hjm-number-field__control {
546
+ padding-inline: 0;
547
+ overflow: hidden;
548
+ }
549
+ .hjm-number-field[data-size="large"] .hjm-number-field__control {
550
+ min-block-size: var(--hjm-control-button-large);
551
+ }
552
+ .hjm-number-field__input {
553
+ block-size: 100%;
554
+ padding-inline: var(--hjm-space-md);
555
+ text-align: center;
556
+ font-variant-numeric: tabular-nums;
557
+ }
558
+ .hjm-number-field[data-size="large"] .hjm-number-field__input {
559
+ min-block-size: calc(var(--hjm-control-button-large) - 2px);
560
+ padding-inline: var(--hjm-space-lg);
561
+ font-size: var(--hjm-type-body-large-size);
562
+ line-height: var(--hjm-type-body-large-line-height);
563
+ }
564
+ .hjm-number-field__stepper {
565
+ align-self: stretch;
566
+ flex: 0 0 var(--hjm-control-min-touch-target);
567
+ display: inline-grid;
568
+ place-items: center;
569
+ min-inline-size: var(--hjm-control-min-touch-target);
570
+ min-block-size: var(--hjm-control-min-touch-target);
571
+ padding: 0;
572
+ border: 0;
573
+ color: var(--hjm-color-text-muted);
574
+ background: transparent;
575
+ font: inherit;
576
+ font-size: var(--hjm-type-title-size);
577
+ cursor: pointer;
578
+ }
579
+ .hjm-number-field__stepper[data-direction="decrement"] {
580
+ border-inline-end: 1px solid var(--hjm-color-border);
581
+ }
582
+ .hjm-number-field__stepper[data-direction="increment"] {
583
+ border-inline-start: 1px solid var(--hjm-color-border);
584
+ }
585
+ .hjm-number-field__stepper:hover:not(:disabled) { background: var(--hjm-color-surface-alt); }
586
+ .hjm-number-field__stepper:active:not(:disabled) { background: var(--hjm-color-surface-accent); }
587
+ .hjm-number-field__stepper:disabled { cursor: not-allowed; opacity: 0.5; }
588
+ .hjm-number-field__stepper:focus-visible {
589
+ outline: 2px solid var(--hjm-color-content-brand);
590
+ outline-offset: -3px;
591
+ }
592
+
593
+ .hjm-slider {
594
+ display: grid;
595
+ gap: var(--hjm-space-xs);
596
+ min-inline-size: 0;
597
+ }
598
+ .hjm-slider[data-disabled="true"] { opacity: 0.5; }
599
+ .hjm-slider__header {
600
+ display: flex;
601
+ align-items: baseline;
602
+ justify-content: space-between;
603
+ gap: var(--hjm-space-md);
604
+ min-inline-size: 0;
605
+ }
606
+ .hjm-slider__label {
607
+ min-inline-size: 0;
608
+ color: var(--hjm-color-text-body);
609
+ font-size: var(--hjm-type-body-size);
610
+ line-height: var(--hjm-type-body-line-height);
611
+ overflow-wrap: anywhere;
612
+ }
613
+ .hjm-slider__value {
614
+ flex: 0 0 auto;
615
+ color: var(--hjm-color-text-muted);
616
+ font-size: var(--hjm-type-label-size);
617
+ line-height: var(--hjm-type-label-line-height);
618
+ font-variant-numeric: tabular-nums;
619
+ }
620
+ .hjm-slider__control {
621
+ position: relative;
622
+ min-block-size: var(--hjm-control-min-touch-target);
623
+ }
624
+ .hjm-slider__interactive {
625
+ position: absolute;
626
+ inset-block: 0;
627
+ inset-inline: 10px;
628
+ }
629
+ .hjm-slider__track,
630
+ .hjm-slider__filled-track {
631
+ position: absolute;
632
+ inset-inline-start: 0;
633
+ inset-block-start: 50%;
634
+ block-size: 4px;
635
+ border-radius: var(--hjm-radius-full);
636
+ transform: translateY(-50%);
637
+ pointer-events: none;
638
+ }
639
+ .hjm-slider__track {
640
+ inline-size: 100%;
641
+ border: 1px solid var(--hjm-color-text-muted);
642
+ background: var(--hjm-color-surface-alt);
643
+ }
644
+ .hjm-slider__filled-track {
645
+ inline-size: var(--hjm-slider-fill);
646
+ border: 0;
647
+ background: var(--hjm-color-content-brand);
648
+ }
649
+ .hjm-slider__thumb {
650
+ position: absolute;
651
+ z-index: 1;
652
+ inset-inline-start: var(--hjm-slider-fill);
653
+ inset-block-start: 50%;
654
+ inline-size: 20px;
655
+ block-size: 20px;
656
+ border: 2px solid var(--hjm-color-content-brand);
657
+ border-radius: var(--hjm-radius-full);
658
+ background: var(--hjm-color-bg);
659
+ transform: translate(-50%, -50%);
660
+ transition: box-shadow var(--hjm-motion-fast), opacity var(--hjm-motion-fast);
661
+ pointer-events: none;
662
+ }
663
+ [dir="rtl"] .hjm-slider__thumb { transform: translate(50%, -50%); }
664
+ .hjm-slider[data-interaction="pointer"] .hjm-slider__thumb { opacity: 0.64; }
665
+ .hjm-slider__input {
666
+ position: absolute;
667
+ z-index: 2;
668
+ inset-block: 0;
669
+ inset-inline: -10px;
670
+ inline-size: auto;
671
+ block-size: var(--hjm-control-min-touch-target);
672
+ margin: 0;
673
+ appearance: none;
674
+ background: transparent;
675
+ opacity: 0;
676
+ cursor: pointer;
677
+ }
678
+ .hjm-slider__input::-webkit-slider-runnable-track {
679
+ block-size: 4px;
680
+ background: transparent;
681
+ }
682
+ .hjm-slider__input::-webkit-slider-thumb {
683
+ inline-size: 20px;
684
+ block-size: 20px;
685
+ margin-block-start: -8px;
686
+ appearance: none;
687
+ }
688
+ .hjm-slider__input::-moz-range-track {
689
+ block-size: 4px;
690
+ background: transparent;
691
+ }
692
+ .hjm-slider__input::-moz-range-thumb {
693
+ inline-size: 20px;
694
+ block-size: 20px;
695
+ border: 0;
696
+ }
697
+ .hjm-slider__interactive:has(.hjm-slider__input:focus-visible) .hjm-slider__thumb {
698
+ box-shadow: 0 0 0 3px var(--hjm-color-bg), 0 0 0 5px var(--hjm-color-content-brand);
699
+ }
700
+ .hjm-slider__input:disabled { cursor: not-allowed; }
701
+
702
+ .hjm-choice { display: inline-flex; align-items: center; gap: var(--hjm-space-sm); min-block-size: 56px; padding: var(--hjm-space-sm) var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); cursor: pointer; }
703
+ .hjm-choice[data-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
704
+ .hjm-choice[data-readonly="true"] { cursor: default; }
705
+ .hjm-choice[data-presentation="plain"] { padding: 0; border-color: transparent; background: transparent; }
706
+ .hjm-choice[data-presentation="grouped"] { border: 0; border-radius: 0; background: transparent; }
707
+ .hjm-choice[data-presentation="card"][data-state="checked"],
708
+ .hjm-choice[data-presentation="card"][data-state="mixed"],
709
+ .hjm-choice[data-presentation="grouped"][data-state="checked"],
710
+ .hjm-choice[data-presentation="grouped"][data-state="mixed"] { border-color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); }
711
+ .hjm-choice[data-size="small"] { min-block-size: 44px; gap: var(--hjm-space-xs); padding: var(--hjm-space-xs) var(--hjm-space-sm); }
712
+ .hjm-choice[data-size="small"][data-presentation="plain"] { padding: 0; }
713
+ .hjm-choice__input { position: absolute; opacity: 0; inline-size: 1px; block-size: 1px; }
714
+ .hjm-choice__indicator { flex: 0 0 24px; display: grid; place-items: center; inline-size: 24px; block-size: 24px; margin-block-start: 2px; border: 2px solid var(--hjm-color-text-muted); background: var(--hjm-color-surface); }
715
+ .hjm-choice[data-size="small"] .hjm-choice__indicator { flex-basis: 20px; inline-size: 20px; block-size: 20px; }
716
+ .hjm-choice__leading { flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; color: var(--hjm-color-text-muted); }
717
+ .hjm-choice[data-kind="checkbox"] .hjm-choice__indicator { border-radius: var(--hjm-radius-sm); }
718
+ .hjm-choice[data-kind="radio"] .hjm-choice__indicator { border-radius: 50%; }
719
+ .hjm-choice[data-state="checked"] .hjm-choice__indicator, .hjm-choice[data-state="mixed"] .hjm-choice__indicator { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
720
+ .hjm-choice[data-state="checked"] .hjm-choice__indicator::after { content: ""; inline-size: 8px; block-size: 4px; border-inline-start: 2px solid var(--hjm-color-on-primary); border-block-end: 2px solid var(--hjm-color-on-primary); transform: rotate(-45deg); }
721
+ [dir="rtl"] .hjm-choice[data-state="checked"] .hjm-choice__indicator::after { transform: rotate(45deg); }
722
+ .hjm-choice[data-kind="radio"][data-state="checked"] .hjm-choice__indicator::after { inline-size: 8px; block-size: 8px; border: 0; border-radius: 50%; background: var(--hjm-color-on-primary); transform: none; }
723
+ .hjm-choice[data-state="mixed"] .hjm-choice__indicator::after { content: ""; inline-size: 10px; block-size: 2px; background: var(--hjm-color-on-primary); }
724
+ .hjm-choice__copy { display: grid; gap: var(--hjm-space-xxs); padding-block: 2px; }
725
+ .hjm-choice[data-state="checked"] .hjm-choice__copy > :first-child,
726
+ .hjm-choice[data-state="mixed"] .hjm-choice__copy > :first-child { font-weight: var(--hjm-font-weight-bold); }
727
+ .hjm-radio-group { min-inline-size: 0; padding: 0; border: 0; }
728
+ .hjm-radio-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-font-weight-semibold); }
729
+ .hjm-radio-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
730
+ .hjm-radio-group[data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-xxs); }
731
+ .hjm-radio-group[data-presentation="grouped"] .hjm-radio-group__items { gap: 0; overflow: hidden; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-surface); }
732
+ .hjm-radio-group[data-orientation="horizontal"] .hjm-radio-group__items { flex-direction: row; flex-wrap: wrap; gap: var(--hjm-space-md); }
733
+ .hjm-radio-group[data-orientation="horizontal"][data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-sm); }
734
+ .hjm-radio-group[data-orientation="horizontal"][data-presentation="grouped"] .hjm-radio-group__items { gap: 0; }
735
+ .hjm-checkbox-group { min-inline-size: 0; margin: 0; padding: 0; border: 0; }
736
+ .hjm-checkbox-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-font-weight-semibold); }
737
+ .hjm-checkbox-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
738
+ .hjm-checkbox-group[data-presentation="plain"] .hjm-checkbox-group__items { gap: var(--hjm-space-xxs); }
739
+ .hjm-checkbox-group[data-presentation="grouped"] .hjm-checkbox-group__items { gap: 0; overflow: hidden; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-surface); }
740
+ .hjm-checkbox-group[data-orientation="horizontal"] .hjm-checkbox-group__items { flex-direction: row; flex-wrap: wrap; gap: var(--hjm-space-md); }
741
+ .hjm-checkbox-group[data-orientation="horizontal"][data-presentation="plain"] .hjm-checkbox-group__items { gap: var(--hjm-space-sm); }
742
+ .hjm-checkbox-group[data-orientation="horizontal"][data-presentation="grouped"] .hjm-checkbox-group__items { gap: 0; }
743
+
744
+ .hjm-switch { display: inline-flex; align-items: center; gap: var(--hjm-space-sm); min-block-size: var(--hjm-control-min-touch-target); padding: 0; border: 0; color: inherit; background: transparent; font: inherit; cursor: pointer; }
745
+ /* A disabled switch still has to report what it is set to, so `switchRecipe.colors`
746
+ swaps hue instead of fading the row — a flat `opacity` made on and off nearly
747
+ identical, and it would also double-fade the calibrated 38% on-track. The fade is
748
+ kept on the label alone, so the row still reads disabled at a glance while the
749
+ control keeps the contrast its colours were chosen for. */
750
+ .hjm-switch:disabled { cursor: not-allowed; }
751
+ .hjm-switch:disabled .hjm-switch__label { opacity: 0.5; }
752
+ .hjm-switch:disabled .hjm-switch__track { background: var(--hjm-color-border); box-shadow: inset 0 0 0 1px var(--hjm-color-border); }
753
+ .hjm-switch:disabled[data-state="checked"] .hjm-switch__track { background: color-mix(in srgb, var(--hjm-color-primary) 38%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--hjm-color-primary) 38%, transparent); }
754
+ .hjm-switch:disabled .hjm-switch__thumb { box-shadow: 0 1px 3px rgb(0 0 0 / 20%), inset 0 0 0 1px var(--hjm-color-text-weak); }
755
+ /* Track and thumb geometry reads `switchRecipe.sizes`. The stylesheet used to
756
+ carry 48/28/22/3px, which matched neither recipe size, so the size axis was
757
+ unbound on web and consumers re-implemented it with their own variables. */
758
+ .hjm-switch__copy { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); min-inline-size: 0; text-align: start; overflow-wrap: anywhere; }
759
+ .hjm-switch__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
760
+ .hjm-switch[data-presentation="row"] { display: flex; inline-size: 100%; justify-content: space-between; }
761
+ .hjm-switch[data-presentation="row"] .hjm-switch__copy { order: -1; flex: 1; }
762
+ /* Inherited layout variables reset at nested providers and keep ./selection independent. */
763
+ .hjm-root { --hjm-switch-row-direction: row; --hjm-switch-row-align: center; --hjm-switch-copy-flex: 1; }
764
+ .hjm-root[data-large-text="true"] { --hjm-switch-row-direction: column; --hjm-switch-row-align: flex-start; --hjm-switch-copy-flex: none; }
765
+ .hjm-switch[data-presentation="row"][data-label-visibility="visible"] { flex-direction: var(--hjm-switch-row-direction, row); align-items: var(--hjm-switch-row-align, center); }
766
+ .hjm-switch[data-presentation="row"][data-label-visibility="visible"] .hjm-switch__copy { flex: var(--hjm-switch-copy-flex, 1); }
767
+ .hjm-switch { --hjm-switch-track-width: var(--hjm-switch-medium-width); --hjm-switch-track-height: var(--hjm-switch-medium-height); --hjm-switch-track-thumb: var(--hjm-switch-medium-thumb); --hjm-switch-track-inset: var(--hjm-switch-medium-inset); --hjm-switch-track-offset: var(--hjm-switch-medium-offset); }
768
+ .hjm-switch[data-size="small"] { --hjm-switch-track-width: var(--hjm-switch-small-width); --hjm-switch-track-height: var(--hjm-switch-small-height); --hjm-switch-track-thumb: var(--hjm-switch-small-thumb); --hjm-switch-track-inset: var(--hjm-switch-small-inset); --hjm-switch-track-offset: var(--hjm-switch-small-offset); }
769
+ /* Off-state hairlines paint `switchRecipe.colors.*OffBorder` (see the recipe for why).
770
+ Inset shadow, not `border`: under `box-sizing: border-box` a border shrinks the
771
+ padding box while `--hjm-switch-track-offset` keeps the unborrowed travel. */
772
+ .hjm-switch__track { display: flex; align-items: center; flex: 0 0 auto; inline-size: var(--hjm-switch-track-width); block-size: var(--hjm-switch-track-height); padding: var(--hjm-switch-track-inset); border-radius: var(--hjm-radius-full); background: var(--hjm-color-surface-alt); box-shadow: inset 0 0 0 1px var(--hjm-color-text-muted); transition: background var(--hjm-motion-fast), box-shadow var(--hjm-motion-fast); }
773
+ .hjm-switch__thumb { inline-size: var(--hjm-switch-track-thumb); block-size: var(--hjm-switch-track-thumb); border-radius: 50%; background: var(--hjm-color-bg); box-shadow: 0 1px 3px rgb(0 0 0 / 20%), inset 0 0 0 1px var(--hjm-color-text-muted); transition: transform var(--hjm-motion-fast), box-shadow var(--hjm-motion-fast); }
774
+ .hjm-switch[data-state="checked"] .hjm-switch__track { background: var(--hjm-color-primary); box-shadow: inset 0 0 0 1px var(--hjm-color-content-brand); }
775
+ .hjm-switch[data-state="checked"] .hjm-switch__thumb { transform: translateX(var(--hjm-switch-track-offset)); box-shadow: 0 1px 3px rgb(0 0 0 / 20%); }
776
+ [dir="rtl"] .hjm-switch[data-state="checked"] .hjm-switch__thumb { transform: translateX(calc(-1 * var(--hjm-switch-track-offset))); }
777
+
778
+ .hjm-segmented { min-inline-size: 0; padding: 0; border: 0; }
779
+ .hjm-segmented__items { display: flex; min-inline-size: 0; gap: 2px; padding: 2px; border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface-alt); overflow-x: auto; }
780
+ .hjm-segmented__item { position: relative; flex: 1 1 0; min-inline-size: max-content; min-block-size: var(--hjm-control-min-touch-target); display: grid; place-items: center; padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: calc(var(--hjm-radius-md) - 2px); color: var(--hjm-color-text-muted); cursor: pointer; }
781
+ .hjm-segmented__item input { position: absolute; opacity: 0; }
782
+ .hjm-segmented__item[data-state="checked"] { color: var(--hjm-color-text); background: var(--hjm-color-surface-accent); font-weight: var(--hjm-font-weight-semibold); }
783
+ .hjm-segmented__item[data-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
784
+
785
+ /* segmentedControlRecipe.adaptive.largeTextLayout = "stacked": equal-width
786
+ segments stop being comparable once large text wraps a syllable per line, and
787
+ on a narrow viewport the row overflows into a horizontal scroller instead.
788
+ React Native reads the recipe and stacks; this renderer had no translation of
789
+ it, so one contract rendered two layouts.
790
+
791
+ There are two triggers because web has two large-text signals. A browser
792
+ user changes the default font size, which `em` in a media query reads
793
+ directly; a product that declares `textScale` to the provider publishes
794
+ `data-large-text`, which is the recipe's `stackAtFontScale` resolved once
795
+ (a stylesheet cannot compare the raw number). Before #20 only the first
796
+ existed, so the declared axis reached RN and not this renderer. 11em is 176px at 100% (no real viewport, so the
797
+ row is untouched) and 352px at 200%. Measured on the sea view: the row is
798
+ 195px at 100%, 263px at 150% and 333px at 200%, so 320px/200% overflowed
799
+ (10em) while 360px/200% did not (11.25em) — the threshold sits between them.
800
+ Stacking releases two row-only declarations: `flex: 1 1 0` would collapse an
801
+ auto-height column to its padding, and `max-content` would stop a long label
802
+ from wrapping inside its own full-width row.
803
+
804
+ `renderers.ssr.test.tsx` fails if the recipe stops declaring "stacked" while
805
+ these rules remain, so the two do not drift apart silently. */
806
+ @media (max-width: 11em) {
807
+ .hjm-segmented__items { flex-direction: column; overflow-x: visible; }
808
+ .hjm-segmented__item { flex: 0 0 auto; min-inline-size: 0; }
809
+ }
810
+ [data-large-text="true"] .hjm-segmented__items { flex-direction: column; overflow-x: visible; }
811
+ [data-large-text="true"] .hjm-segmented__item { flex: 0 0 auto; min-inline-size: 0; }
812
+
813
+ .hjm-tabs { min-inline-size: 0; }
814
+ .hjm-tabs__list { display: flex; gap: var(--hjm-space-xs); min-inline-size: 0; overflow-x: auto; border-block-end: 1px solid var(--hjm-color-border); }
815
+ .hjm-tabs[data-overflow="clip"] .hjm-tabs__list { overflow: hidden; }
816
+ .hjm-tabs[data-layout="fitted"] .hjm-tabs__tab { flex: 1 1 0; }
817
+ .hjm-tabs__tab { position: relative; min-block-size: 48px; padding: var(--hjm-space-xs) var(--hjm-space-md); border: 0; color: var(--hjm-color-text-muted); background: transparent; font: inherit; font-weight: var(--hjm-font-weight-semibold); white-space: nowrap; cursor: pointer; }
818
+ .hjm-tabs[data-size="small"] .hjm-tabs__tab { min-block-size: 44px; padding-inline: var(--hjm-space-sm); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
819
+ .hjm-tabs__leading { display: inline-flex; flex: 0 0 auto; align-items: center; margin-inline-end: var(--hjm-space-xs); }
820
+ .hjm-tabs__tab[data-state="selected"] { color: var(--hjm-color-text); }
821
+ .hjm-tabs__tab[data-state="selected"]::after { content: ""; position: absolute; inset-inline: 0; inset-block-end: 0; block-size: 2px; background: var(--hjm-color-content-brand); }
822
+ .hjm-tabs__tab:disabled { opacity: 0.5; cursor: not-allowed; }
823
+ .hjm-tabs__panel { padding-block: var(--hjm-space-md); outline-offset: 2px; }
824
+ .hjm-tabs[data-orientation="vertical"] { display: grid; grid-template-columns: minmax(8rem, auto) minmax(0, 1fr); gap: var(--hjm-space-md); }
825
+ .hjm-tabs[data-orientation="vertical"] .hjm-tabs__list { flex-direction: column; overflow: visible; border-block-end: 0; border-inline-end: 1px solid var(--hjm-color-border); }
826
+ .hjm-tabs[data-orientation="vertical"][data-overflow="scroll"] .hjm-tabs__list { overflow-y: auto; }
827
+ .hjm-tabs[data-orientation="vertical"][data-overflow="clip"] .hjm-tabs__list { overflow: hidden; }
828
+ .hjm-tabs[data-orientation="vertical"] .hjm-tabs__tab { text-align: start; }
829
+ .hjm-tabs[data-orientation="vertical"] .hjm-tabs__tab[data-state="selected"]::after { inset-block: 0; inset-inline-start: auto; inset-inline-end: 0; inline-size: 2px; block-size: auto; }
830
+
831
+ .hjm-badge, .hjm-tag { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); max-inline-size: 100%; overflow-wrap: anywhere; }
832
+ .hjm-badge { min-block-size: 24px; padding: 2px var(--hjm-space-xs); border: 1px solid transparent; border-radius: var(--hjm-radius-full); color: var(--hjm-color-text-muted); background: var(--hjm-color-surface-alt); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-bold); }
833
+ .hjm-badge[data-size="small"] { min-block-size: 20px; font-size: var(--hjm-type-caption-size); }
834
+ .hjm-badge[data-tone="strong"] { color: var(--hjm-color-bg); background: var(--hjm-color-text); }
835
+ .hjm-badge[data-tone="brand"] { color: var(--hjm-color-content-brand); }
836
+ .hjm-badge[data-tone="info"], .hjm-tag[data-tone="info"] { color: var(--hjm-accent-info); background: color-mix(in srgb, var(--hjm-accent-info) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-info) 30%, transparent); }
837
+ .hjm-badge[data-tone="success"], .hjm-tag[data-tone="success"] { color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-success) 30%, transparent); }
838
+ .hjm-badge[data-tone="warning"] { color: var(--hjm-accent-warning); background: color-mix(in srgb, var(--hjm-accent-warning) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-warning) 30%, transparent); }
839
+ .hjm-badge[data-tone="attention"], .hjm-tag[data-tone="attention"] { color: var(--hjm-accent-attention); background: color-mix(in srgb, var(--hjm-accent-attention) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
840
+ .hjm-badge[data-tone="danger"] { color: var(--hjm-color-danger); background: color-mix(in srgb, var(--hjm-color-danger) 14%, transparent); border-color: color-mix(in srgb, var(--hjm-color-danger) 30%, transparent); }
841
+ .hjm-badge[data-variant="outline"] { background: transparent; border-color: var(--hjm-color-border); }
842
+ .hjm-badge[data-variant="outline"][data-tone="strong"] { color: var(--hjm-color-text); }
843
+ .hjm-badge[data-variant="outline"][data-tone="info"] { border-color: color-mix(in srgb, var(--hjm-accent-info) 30%, transparent); }
844
+ .hjm-badge[data-variant="outline"][data-tone="success"] { border-color: color-mix(in srgb, var(--hjm-accent-success) 30%, transparent); }
845
+ .hjm-badge[data-variant="outline"][data-tone="warning"] { border-color: color-mix(in srgb, var(--hjm-accent-warning) 30%, transparent); }
846
+ .hjm-badge[data-variant="outline"][data-tone="attention"] { border-color: color-mix(in srgb, var(--hjm-accent-attention) 30%, transparent); }
847
+ .hjm-badge[data-variant="outline"][data-tone="danger"] { border-color: color-mix(in srgb, var(--hjm-color-danger) 30%, transparent); }
848
+ .hjm-tag { min-block-size: 20px; padding-inline: var(--hjm-space-xxs); border: 1px solid transparent; border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-muted); background: var(--hjm-color-surface-alt); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-semibold); }
849
+ .hjm-tag[data-tone="brand"] { color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); }
850
+ .hjm-tag[data-tone="info"] { background: color-mix(in srgb, var(--hjm-accent-info) 10%, transparent); }
851
+ .hjm-tag[data-tone="success"] { background: color-mix(in srgb, var(--hjm-accent-success) 10%, transparent); }
852
+ .hjm-tag[data-tone="attention"] { background: color-mix(in srgb, var(--hjm-accent-attention) 10%, transparent); }
853
+ .hjm-icon { display: inline-block; flex: 0 0 auto; vertical-align: middle; }
854
+ .hjm-icon[data-transform="mirror-inline"] { transform: scaleX(-1); }
855
+ .hjm-icon[data-tone="primary"] { color: var(--hjm-color-text); }
856
+ .hjm-icon[data-tone="secondary"], .hjm-icon[data-tone="decorative"] { color: var(--hjm-color-text-muted); }
857
+ .hjm-icon[data-tone="brand"] { color: var(--hjm-color-content-brand); }
858
+ .hjm-icon[data-tone="info"] { color: var(--hjm-accent-info); }
859
+ .hjm-icon[data-tone="success"] { color: var(--hjm-accent-success); }
860
+ .hjm-icon[data-tone="warning"] { color: var(--hjm-accent-warning); }
861
+ .hjm-icon[data-tone="danger"] { color: var(--hjm-color-danger); }
862
+ .hjm-icon[data-tone="inverse"] { color: var(--hjm-color-on-primary); }
863
+ .hjm-counter-badge { display: inline-grid; place-items: center; min-inline-size: 20px; block-size: 20px; padding-inline: var(--hjm-space-xs); border-radius: var(--hjm-radius-full); color: var(--hjm-color-bg); background: var(--hjm-color-text); font-size: var(--hjm-type-caption-size); line-height: 1; font-weight: var(--hjm-font-weight-bold); font-variant-numeric: tabular-nums; }
864
+ .hjm-counter-badge[data-size="small"] { min-inline-size: 16px; block-size: 16px; padding-inline: var(--hjm-space-xxs); }
865
+ .hjm-counter-badge[data-tone="brand"] { color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
866
+ .hjm-counter-badge[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
867
+ .hjm-counter-badge[data-variant="floating"] { border: 2px solid var(--hjm-color-bg); }
868
+
869
+ .hjm-card { overflow: hidden; }
870
+ .hjm-card__media > * { display: block; inline-size: 100%; }
871
+ .hjm-card__body { display: grid; gap: var(--hjm-space-xs); padding: var(--hjm-space-md); }
872
+ .hjm-card__header { display: flex; align-items: flex-start; gap: var(--hjm-space-sm); min-inline-size: 0; }
873
+ .hjm-card__leading { flex: 0 0 auto; display: inline-grid; place-items: center; line-height: 1; }
874
+ .hjm-card__copy { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xs); }
875
+ .hjm-card__title { margin: 0; color: var(--hjm-color-text); font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); overflow-wrap: anywhere; }
876
+ .hjm-card__description { margin: 0; overflow-wrap: anywhere; }
877
+ .hjm-card__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-space-sm); padding: 0 var(--hjm-space-md) var(--hjm-space-md); }
878
+ /* Row rhythm reads the recipe density variables so the stylesheet does not
879
+ carry a second copy of the same numbers. */
880
+ .hjm-list-row { inline-size: 100%; display: flex; align-items: center; gap: var(--hjm-list-row-gap); min-block-size: var(--hjm-list-row-comfortable-one-line); padding-inline: var(--hjm-list-row-comfortable-padding-inline); padding-block: var(--hjm-list-row-comfortable-padding-block); border: 0; color: inherit; background: transparent; text-align: start; text-decoration: none; font: inherit; }
881
+ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
882
+ .hjm-list-row[data-lines="two"] { min-block-size: var(--hjm-list-row-comfortable-two-line); }
883
+ .hjm-list-row[data-density="compact"] { min-block-size: var(--hjm-list-row-compact-one-line); padding-inline: var(--hjm-list-row-compact-padding-inline); padding-block: var(--hjm-list-row-compact-padding-block); }
884
+ .hjm-list-row[data-density="compact"][data-lines="two"] { min-block-size: var(--hjm-list-row-compact-two-line); }
885
+ /* The two wider steps read the same generated variables; no numbers here. */
886
+ .hjm-list-row[data-density="relaxed"] { min-block-size: var(--hjm-list-row-relaxed-one-line); padding-inline: var(--hjm-list-row-relaxed-padding-inline); padding-block: var(--hjm-list-row-relaxed-padding-block); }
887
+ .hjm-list-row[data-density="relaxed"][data-lines="two"] { min-block-size: var(--hjm-list-row-relaxed-two-line); }
888
+ .hjm-list-row[data-density="spacious"] { min-block-size: var(--hjm-list-row-spacious-one-line); padding-inline: var(--hjm-list-row-spacious-padding-inline); padding-block: var(--hjm-list-row-spacious-padding-block); }
889
+ .hjm-list-row[data-density="spacious"][data-lines="two"] { min-block-size: var(--hjm-list-row-spacious-two-line); }
890
+ .hjm-list-row[data-state="selected"] { background: var(--hjm-color-surface-accent); }
891
+ .hjm-list-row[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
892
+ .hjm-list-row__leading, .hjm-list-row__trailing { flex: 0 0 auto; }
893
+ /* `leadingSize` was declared by the recipe but unbound, so consumers rebuilt
894
+ the avatar box in product styles. */
895
+ .hjm-list-row__leading { display: flex; align-items: center; justify-content: center; inline-size: var(--hjm-list-row-leading-size); block-size: var(--hjm-list-row-leading-size); overflow: hidden; }
896
+ .hjm-list-row__leading[data-shape="circle"] { border-radius: var(--hjm-radius-full); }
897
+ .hjm-list-row__content { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
898
+ .hjm-list-row__title { color: var(--hjm-color-text-body); font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; }
899
+ .hjm-list-row__description, .hjm-list-row__trailing { color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
900
+
901
+ .hjm-section { display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; overflow-wrap: anywhere; }
902
+ .hjm-section__header { display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); min-inline-size: 0; }
903
+ .hjm-section__copy { display: grid; flex: 1 1 auto; gap: var(--hjm-space-xxs); min-inline-size: 0; }
904
+ .hjm-section__title { margin: 0; color: var(--hjm-color-text-body); font: inherit; font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; }
905
+ .hjm-section__description { color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
906
+ .hjm-section__action { flex: 0 0 auto; }
907
+ .hjm-section__content { min-inline-size: 0; }
908
+ @media (max-width: 640px) {
909
+ .hjm-section__header { align-items: stretch; flex-direction: column; }
910
+ }
911
+
912
+ .hjm-chip { min-block-size: var(--hjm-control-min-touch-target); display: inline-flex; align-items: center; gap: var(--hjm-space-xs); padding-inline: var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: 999px; background: var(--hjm-color-surface); color: var(--hjm-color-text-body); font: inherit; font-weight: var(--hjm-font-weight-medium); cursor: pointer; }
913
+ .hjm-chip[data-size="small"] { min-block-size: 36px; padding-inline: var(--hjm-space-xs); }
914
+ .hjm-chip[data-selected] { border-color: var(--hjm-color-content-brand); background: var(--hjm-color-surface-accent); color: var(--hjm-color-content-brand); }
915
+ .hjm-chip:disabled { opacity: 0.5; cursor: not-allowed; }
916
+ .hjm-chip:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: var(--hjm-focus-offset); }
917
+ .hjm-chip__indicator, .hjm-chip__leading, .hjm-chip__trailing { display: inline-flex; flex: 0 0 auto; }
918
+ .hjm-chip__label { overflow-wrap: anywhere; }
919
+
920
+ .hjm-list { overflow: hidden; min-inline-size: 0; }
921
+ .hjm-list[data-appearance="grouped"] { border-radius: var(--hjm-radius-lg); background: var(--hjm-color-surface); }
922
+ .hjm-list__item { min-inline-size: 0; }
923
+ .hjm-list[data-separator="full"] > .hjm-list__item + .hjm-list__item { border-block-start: 1px solid var(--hjm-color-border); }
924
+ /* Indent only the divider: moving the row shifted every title after the first
925
+ and narrowed its text column in the notification-settings composition. */
926
+ .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item { position: relative; }
927
+ .hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item::before { content: ""; position: absolute; inset-block-start: 0; inset-inline: var(--hjm-space-xl) 0; border-block-start: 1px solid var(--hjm-color-border); pointer-events: none; }
928
+
929
+ .hjm-statistic { display: grid; gap: var(--hjm-space-xxs); min-inline-size: 0; color: var(--hjm-color-text-body); }
930
+ .hjm-statistic[data-presentation="surface"] { padding: var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); }
931
+ .hjm-statistic[data-density="compact"] { gap: 2px; }
932
+ .hjm-statistic__label { color: var(--hjm-color-text-muted); font-weight: var(--hjm-font-weight-medium); overflow-wrap: anywhere; }
933
+ .hjm-statistic__value-row { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--hjm-space-xxs); min-inline-size: 0; }
934
+ .hjm-statistic__value { color: var(--hjm-color-text); font-size: calc(var(--hjm-type-title-size) * var(--hjm-text-scale, 1)); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
935
+ .hjm-statistic__affix, .hjm-statistic__hint { color: var(--hjm-color-text-muted); }
936
+ .hjm-statistic__trend { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); font-weight: var(--hjm-font-weight-medium); overflow-wrap: anywhere; }
937
+ .hjm-statistic__trend[data-tone="success"] { color: var(--hjm-accent-success); }
938
+ .hjm-statistic__trend[data-tone="warning"] { color: var(--hjm-accent-warning); }
939
+ .hjm-statistic__trend[data-tone="danger"] { color: var(--hjm-color-danger); }
940
+ .hjm-statistic-group { display: grid; grid-template-columns: repeat(var(--hjm-statistic-columns), minmax(0, 1fr)); gap: var(--hjm-space-sm); min-inline-size: 0; }
941
+ @media (max-width: 640px) {
942
+ .hjm-statistic-group { grid-template-columns: minmax(0, 1fr); }
943
+ }
944
+
945
+ .hjm-notice { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); border: 1px solid; border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-surface); border-color: var(--hjm-color-border); }
946
+ .hjm-notice[data-tone="info"] { border-color: var(--hjm-accent-info); }
947
+ .hjm-notice[data-tone="success"] { border-color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 10%, var(--hjm-color-bg)); }
948
+ .hjm-notice[data-tone="warning"] { border-color: var(--hjm-accent-warning); background: color-mix(in srgb, var(--hjm-accent-warning) 10%, var(--hjm-color-bg)); }
949
+ .hjm-notice[data-tone="attention"] { border-color: var(--hjm-accent-attention); background: color-mix(in srgb, var(--hjm-accent-attention) 10%, var(--hjm-color-bg)); }
950
+ .hjm-notice[data-tone="danger"] { border-color: var(--hjm-color-danger); background: color-mix(in srgb, var(--hjm-color-danger) 10%, var(--hjm-color-bg)); }
951
+ /* Reserve readable copy; wrap the action instead of crushing its label. */
952
+ .hjm-notice__content { flex: 1 1 60%; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
953
+ .hjm-notice__action { flex: 0 0 auto; max-inline-size: 100%; }
954
+ .hjm-notice__title, .hjm-notice__description { overflow-wrap: anywhere; }
955
+
956
+ .hjm-empty-state { display: grid; justify-items: center; gap: var(--hjm-space-xs); padding: var(--hjm-space-xxl) var(--hjm-space-xl); color: var(--hjm-color-text-muted); text-align: center; }
957
+ .hjm-empty-state[data-density="compact"] { padding-block: var(--hjm-space-xl); }
958
+ .hjm-empty-state__title { color: var(--hjm-color-text); }
959
+ .hjm-result { display: grid; justify-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-xxxl) var(--hjm-space-xl); text-align: center; }
960
+ .hjm-result__icon { inline-size: 3.5rem; block-size: 3.5rem; display: grid; place-items: center; border-radius: var(--hjm-radius-full); font-size: 1.5rem; font-weight: var(--hjm-font-weight-bold); }
961
+ .hjm-result__icon:empty::before { content: "i"; }
962
+ .hjm-result[data-status="success"] .hjm-result__icon { color: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 12%, transparent); }
963
+ .hjm-result[data-status="success"] .hjm-result__icon:empty::before { content: "✓"; }
964
+ .hjm-result[data-status="failure"] .hjm-result__icon { color: var(--hjm-color-danger); background: color-mix(in srgb, var(--hjm-color-danger) 12%, transparent); }
965
+ .hjm-result[data-status="failure"] .hjm-result__icon:empty::before { content: "!"; }
966
+ .hjm-result[data-status="info"] .hjm-result__icon { color: var(--hjm-accent-info); background: color-mix(in srgb, var(--hjm-accent-info) 12%, transparent); }
967
+ .hjm-result__title { margin: 0; color: var(--hjm-color-text); font-size: var(--hjm-type-title-large-size); line-height: var(--hjm-type-title-large-line-height); overflow-wrap: anywhere; }
968
+ .hjm-result__description { max-inline-size: 40rem; margin: 0; color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
969
+ .hjm-result__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--hjm-space-sm); margin-block-start: var(--hjm-space-xs); }
970
+ .hjm-progress { display: grid; gap: var(--hjm-space-xs); }
971
+ .hjm-progress__copy { display: flex; justify-content: space-between; gap: var(--hjm-space-md); color: var(--hjm-color-text-body); }
972
+ .hjm-progress__native { inline-size: 100%; block-size: 8px; border: 0; border-radius: var(--hjm-radius-full); overflow: hidden; accent-color: var(--hjm-color-content-brand); }
973
+ .hjm-progress[data-size="small"] .hjm-progress__native { block-size: 4px; }
974
+ .hjm-progress[data-size="large"] .hjm-progress__native { block-size: 12px; }
975
+ .hjm-progress[data-tone="success"] .hjm-progress__native { accent-color: var(--hjm-accent-success); }
976
+ .hjm-progress[data-tone="warning"] .hjm-progress__native { accent-color: var(--hjm-accent-warning); }
977
+ .hjm-progress[data-tone="danger"] .hjm-progress__native { accent-color: var(--hjm-color-danger); }
978
+ /*
979
+ The circular shape hides the native bar and draws the same value as a conic
980
+ sweep. The element stays a <progress>, so the value, the indeterminate case
981
+ and the announcement are unchanged — only the paint differs.
982
+ */
983
+ .hjm-progress[data-shape="circular"] { grid-template-columns: auto 1fr; align-items: center; }
984
+ .hjm-progress[data-shape="circular"] .hjm-progress__native { display: none; }
985
+ .hjm-progress__ring {
986
+ position: relative;
987
+ display: grid;
988
+ place-items: center;
989
+ inline-size: var(--hjm-progress-diameter);
990
+ block-size: var(--hjm-progress-diameter);
991
+ border-radius: var(--hjm-radius-full);
992
+ background: conic-gradient(var(--hjm-progress-ring-color, var(--hjm-color-content-brand)) var(--hjm-progress-sweep), var(--hjm-color-surface-alt) 0);
993
+ -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - var(--hjm-progress-stroke)), #000 calc(100% - var(--hjm-progress-stroke)));
994
+ mask: radial-gradient(farthest-side, transparent calc(100% - var(--hjm-progress-stroke)), #000 calc(100% - var(--hjm-progress-stroke)));
995
+ }
996
+ .hjm-progress[data-tone="success"] .hjm-progress__ring { --hjm-progress-ring-color: var(--hjm-accent-success); }
997
+ .hjm-progress[data-tone="warning"] .hjm-progress__ring { --hjm-progress-ring-color: var(--hjm-accent-warning); }
998
+ .hjm-progress[data-tone="danger"] .hjm-progress__ring { --hjm-progress-ring-color: var(--hjm-color-danger); }
999
+ .hjm-progress[data-state="indeterminate"][data-shape="circular"] .hjm-progress__ring { animation: hjm-provider-spin 1200ms linear infinite; }
1000
+ @media (prefers-reduced-motion: reduce) {
1001
+ .hjm-progress[data-state="indeterminate"][data-shape="circular"] .hjm-progress__ring { animation: none; }
1002
+ }
1003
+ .hjm-progress__ring-content {
1004
+ position: absolute;
1005
+ inset: 0;
1006
+ display: grid;
1007
+ place-items: center;
1008
+ /* The mask hides the ring's own paint region; content must escape it. */
1009
+ -webkit-mask: none;
1010
+ mask: none;
1011
+ color: var(--hjm-color-text);
1012
+ font-size: var(--hjm-type-label-size);
1013
+ }
1014
+ /*
1015
+ Placeholders reserve the *line boxes* the real copy will occupy, not an
1016
+ arbitrary bar height — otherwise the row grows when the content arrives and
1017
+ the list jumps, which is the whole problem this variant exists to remove.
1018
+ */
1019
+ .hjm-list-row--loading [data-placeholder] {
1020
+ display: block;
1021
+ border-radius: var(--hjm-radius-sm);
1022
+ background: var(--hjm-color-surface-alt);
1023
+ }
1024
+ .hjm-list-row--loading .hjm-list-row__title[data-placeholder] {
1025
+ inline-size: 60%;
1026
+ block-size: var(--hjm-type-body-large-line-height);
1027
+ }
1028
+ .hjm-list-row--loading .hjm-list-row__description[data-placeholder] {
1029
+ inline-size: 40%;
1030
+ block-size: var(--hjm-type-body-line-height);
1031
+ }
1032
+ .hjm-list-row--loading .hjm-list-row__leading[data-placeholder] { background: var(--hjm-color-surface-alt); }
1033
+ .hjm-list-row--loading .hjm-list-row__trailing[data-placeholder] { inline-size: var(--hjm-space-xxl); }
1034
+ .hjm-spinner { display: inline-flex; align-items: center; justify-content: center; color: var(--hjm-color-content-brand); }
1035
+ .hjm-spinner[data-tone="neutral"] { color: var(--hjm-color-text-muted); }
1036
+ .hjm-spinner[data-tone="inverse"] { color: var(--hjm-color-on-primary); }
1037
+ .hjm-spinner[data-size="small"] { font-size: 14px; }
1038
+ .hjm-spinner[data-size="medium"] { font-size: 20px; }
1039
+ .hjm-spinner[data-size="large"] { font-size: 28px; }
1040
+ .hjm-skeleton { display: block; inline-size: 100%; min-block-size: var(--hjm-space-xxl); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface-alt); }
1041
+ .hjm-skeleton[data-shape="text"] { min-block-size: var(--hjm-space-md); border-radius: var(--hjm-radius-sm); }
1042
+ .hjm-skeleton[data-shape="circle"] { inline-size: var(--hjm-skeleton-circle-size); block-size: var(--hjm-skeleton-circle-size); border-radius: var(--hjm-radius-full); }
1043
+ .hjm-skeleton[data-animated="true"] { animation: hjm-pulse var(--hjm-skeleton-duration) var(--hjm-skeleton-easing) infinite alternate; }
1044
+
1045
+ /* CommandPalette ---------------------------------------------------------- */
1046
+ /*
1047
+ A modal takeover, so it reuses the shared overlay veil and modal stack; only
1048
+ the pinned search field and the result viewport are new chrome. Rows are
1049
+ chrome-identical to Menu items, which is why they carry no separate tokens.
1050
+ */
1051
+ .hjm-command-palette-positioner { align-items: flex-start; padding-block-start: 10vh; }
1052
+ .hjm-command-palette {
1053
+ display: flex;
1054
+ flex-direction: column;
1055
+ inline-size: min(100%, 35rem);
1056
+ min-block-size: 0;
1057
+ overflow: hidden;
1058
+ border: 1px solid var(--hjm-color-border);
1059
+ border-radius: var(--hjm-radius-lg);
1060
+ background: var(--hjm-color-surface);
1061
+ box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
1062
+ }
1063
+ .hjm-command-palette__search {
1064
+ flex: 0 0 auto;
1065
+ min-block-size: var(--hjm-control-field-height);
1066
+ padding-inline: var(--hjm-space-md);
1067
+ border: 0;
1068
+ border-block-end: 1px solid var(--hjm-color-border);
1069
+ background: transparent;
1070
+ color: var(--hjm-color-text);
1071
+ font: inherit;
1072
+ }
1073
+ .hjm-command-palette__search:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1074
+ .hjm-command-palette__viewport { flex: 1 1 auto; min-block-size: 0; overflow: auto; overscroll-behavior: contain; padding: var(--hjm-space-xxs); }
1075
+ .hjm-command-palette__section-label { margin: 0; padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1076
+ .hjm-command-palette__item {
1077
+ display: flex;
1078
+ align-items: center;
1079
+ gap: var(--hjm-space-xs);
1080
+ min-block-size: var(--hjm-control-min-touch-target);
1081
+ padding-inline: var(--hjm-space-sm);
1082
+ border-radius: var(--hjm-radius-sm);
1083
+ }
1084
+ .hjm-command-palette__item[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1085
+ .hjm-command-palette__item[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1086
+ .hjm-command-palette__item[data-tone="danger"] { color: var(--hjm-color-danger); }
1087
+ .hjm-command-palette__copy { display: flex; min-inline-size: 0; flex: 1 1 auto; flex-wrap: wrap; align-items: baseline; gap: var(--hjm-space-xs); overflow-wrap: anywhere; }
1088
+ .hjm-command-palette__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1089
+ .hjm-command-palette__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1090
+ .hjm-command-palette__state { margin: 0; padding: var(--hjm-space-md); color: var(--hjm-color-text-muted); }
1091
+
1092
+ /* DataTable --------------------------------------------------------------- */
1093
+ .hjm-data-table { display: flex; flex-direction: column; gap: var(--hjm-space-sm); min-inline-size: 0; }
1094
+ .hjm-data-table__table { inline-size: 100%; border-collapse: collapse; }
1095
+ .hjm-data-table__table th,
1096
+ .hjm-data-table__table td {
1097
+ padding: var(--hjm-space-sm);
1098
+ border-block-end: 1px solid var(--hjm-color-border);
1099
+ vertical-align: top;
1100
+ overflow-wrap: anywhere;
1101
+ }
1102
+ .hjm-data-table[data-density="compact"] .hjm-data-table__table th,
1103
+ .hjm-data-table[data-density="compact"] .hjm-data-table__table td { padding: var(--hjm-space-xs) var(--hjm-space-sm); }
1104
+ .hjm-data-table__table th { color: var(--hjm-color-text-muted); font-weight: var(--hjm-font-weight-semibold); }
1105
+ .hjm-data-table__selector { inline-size: var(--hjm-control-min-touch-target); }
1106
+ .hjm-data-table__sort {
1107
+ display: inline-flex;
1108
+ align-items: center;
1109
+ gap: var(--hjm-space-xxs);
1110
+ min-block-size: var(--hjm-control-min-touch-target);
1111
+ padding: 0;
1112
+ border: 0;
1113
+ background: transparent;
1114
+ color: inherit;
1115
+ font: inherit;
1116
+ }
1117
+ .hjm-data-table__check {
1118
+ display: grid;
1119
+ place-items: center;
1120
+ inline-size: var(--hjm-space-md);
1121
+ block-size: var(--hjm-space-md);
1122
+ border: 1px solid var(--hjm-color-border-control);
1123
+ border-radius: var(--hjm-radius-sm);
1124
+ background: transparent;
1125
+ color: var(--hjm-color-on-primary);
1126
+ font-size: var(--hjm-type-label-size);
1127
+ }
1128
+ .hjm-data-table__check[aria-checked="true"],
1129
+ .hjm-data-table__check[aria-checked="mixed"] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1130
+ .hjm-data-table__sort:focus-visible,
1131
+ .hjm-data-table__check:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
1132
+ .hjm-data-table__table tr[data-disabled] { color: var(--hjm-color-text-weak); }
1133
+ .hjm-data-table__state { margin: 0; color: var(--hjm-color-text-muted); }
1134
+ .hjm-data-table__footer { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--hjm-space-sm); }
1135
+
1136
+ /* Mentions ---------------------------------------------------------------- */
1137
+ /*
1138
+ The popup is Combobox's listbox contract layered on a plain TextArea, so the
1139
+ rules here are only the anchored surface — no new selection or filtering
1140
+ visuals, which the Combobox renderer already owns.
1141
+ */
1142
+ .hjm-mentions { display: block; }
1143
+ .hjm-mentions__list {
1144
+ max-block-size: 14rem;
1145
+ overflow: auto;
1146
+ overscroll-behavior: contain;
1147
+ padding: var(--hjm-space-xxs);
1148
+ border: 1px solid var(--hjm-color-border);
1149
+ border-radius: var(--hjm-radius-md);
1150
+ background: var(--hjm-color-bg);
1151
+ box-shadow: 0 12px 32px rgb(0 0 0 / 18%);
1152
+ pointer-events: auto;
1153
+ }
1154
+ .hjm-mentions__option {
1155
+ display: flex;
1156
+ flex-wrap: wrap;
1157
+ align-items: baseline;
1158
+ gap: var(--hjm-space-xs);
1159
+ min-block-size: var(--hjm-control-min-touch-target);
1160
+ padding: var(--hjm-space-xxs) var(--hjm-space-xs);
1161
+ border-radius: var(--hjm-radius-sm);
1162
+ overflow-wrap: anywhere;
1163
+ }
1164
+ .hjm-mentions__option[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1165
+ .hjm-mentions__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1166
+ .hjm-mentions__empty { margin: 0; padding: var(--hjm-space-xs); color: var(--hjm-color-text-muted); }
1167
+
1168
+ /* TransferList ------------------------------------------------------------ */
1169
+ .hjm-transfer-list {
1170
+ display: grid;
1171
+ grid-template-columns: 1fr auto 1fr;
1172
+ align-items: start;
1173
+ gap: var(--hjm-space-md);
1174
+ }
1175
+ /* Narrow viewports stack the panels; the move buttons stay between them. */
1176
+ @media (max-width: 30rem) {
1177
+ .hjm-transfer-list { grid-template-columns: 1fr; }
1178
+ }
1179
+ .hjm-transfer-list__panel {
1180
+ min-inline-size: 0;
1181
+ border: 1px solid var(--hjm-color-border);
1182
+ border-radius: var(--hjm-radius-md);
1183
+ background: var(--hjm-color-bg);
1184
+ }
1185
+ .hjm-transfer-list__header {
1186
+ display: flex;
1187
+ align-items: center;
1188
+ justify-content: space-between;
1189
+ gap: var(--hjm-space-xs);
1190
+ min-block-size: var(--hjm-control-min-touch-target);
1191
+ padding-inline: var(--hjm-space-sm);
1192
+ border-block-end: 1px solid var(--hjm-color-border);
1193
+ }
1194
+ .hjm-transfer-list__title { font-weight: var(--hjm-font-weight-bold); overflow-wrap: anywhere; }
1195
+ .hjm-transfer-list__select-all,
1196
+ .hjm-transfer-list__mark {
1197
+ display: grid;
1198
+ place-items: center;
1199
+ flex: 0 0 auto;
1200
+ inline-size: var(--hjm-space-md);
1201
+ block-size: var(--hjm-space-md);
1202
+ border: 1px solid var(--hjm-color-border-control);
1203
+ border-radius: var(--hjm-radius-sm);
1204
+ background: transparent;
1205
+ color: var(--hjm-color-on-primary);
1206
+ font-size: var(--hjm-type-label-size);
1207
+ }
1208
+ .hjm-transfer-list__select-all[aria-checked="true"],
1209
+ .hjm-transfer-list__select-all[aria-checked="mixed"],
1210
+ .hjm-transfer-list__mark[data-checked] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1211
+ .hjm-transfer-list__options { display: flex; flex-direction: column; padding: var(--hjm-space-xxs); }
1212
+ .hjm-transfer-list__option {
1213
+ display: flex;
1214
+ align-items: center;
1215
+ gap: var(--hjm-space-xs);
1216
+ min-block-size: var(--hjm-control-min-touch-target);
1217
+ padding-inline: var(--hjm-space-xs);
1218
+ border-radius: var(--hjm-radius-sm);
1219
+ overflow-wrap: anywhere;
1220
+ }
1221
+ .hjm-transfer-list__option[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1222
+ .hjm-transfer-list__option[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1223
+ .hjm-transfer-list__option:focus-visible,
1224
+ .hjm-transfer-list__empty:focus-visible,
1225
+ .hjm-transfer-list__select-all:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1226
+ .hjm-transfer-list__empty { margin: 0; padding: var(--hjm-space-md) var(--hjm-space-sm); color: var(--hjm-color-text-muted); }
1227
+ .hjm-transfer-list__actions { display: flex; flex-direction: column; gap: var(--hjm-space-xs); padding-block-start: var(--hjm-space-xl); }
1228
+
1229
+ /* AuthProviderButton ------------------------------------------------------ */
1230
+ /*
1231
+ Brand fills come in as custom properties from the provider guideline table,
1232
+ never from the theme: recoloring them would fail provider review. HJM keeps
1233
+ the height, radius, target and focus ring so a stack of providers lines up,
1234
+ and the ring is drawn outside the fill so it survives every brand color.
1235
+ */
1236
+ .hjm-auth-provider-button {
1237
+ display: flex;
1238
+ align-items: center;
1239
+ justify-content: center;
1240
+ gap: var(--hjm-provider-gap);
1241
+ inline-size: 100%;
1242
+ min-block-size: max(var(--hjm-provider-min-height), var(--hjm-control-min-touch-target));
1243
+ padding-inline: var(--hjm-provider-padding);
1244
+ border: var(--hjm-provider-border-width) solid var(--hjm-provider-border);
1245
+ border-radius: var(--hjm-provider-radius);
1246
+ background: var(--hjm-provider-background);
1247
+ color: var(--hjm-provider-content);
1248
+ font: inherit;
1249
+ font-size: var(--hjm-type-body-size);
1250
+ line-height: var(--hjm-type-body-line-height);
1251
+ cursor: pointer;
1252
+ }
1253
+ .hjm-auth-provider-button:disabled { cursor: default; opacity: var(--hjm-opacity-disabled, 0.5); }
1254
+ .hjm-auth-provider-button:focus-visible {
1255
+ outline: 2px solid var(--hjm-color-focus);
1256
+ outline-offset: var(--hjm-provider-focus-offset);
1257
+ }
1258
+ .hjm-auth-provider-button__logo {
1259
+ display: grid;
1260
+ place-items: center;
1261
+ flex: 0 0 auto;
1262
+ inline-size: var(--hjm-provider-logo-size);
1263
+ block-size: var(--hjm-provider-logo-size);
1264
+ color: var(--hjm-provider-content);
1265
+ }
1266
+ .hjm-auth-provider-button__label { min-inline-size: 0; overflow-wrap: anywhere; }
1267
+ .hjm-auth-provider-button__spinner {
1268
+ flex: 0 0 auto;
1269
+ inline-size: 1em;
1270
+ block-size: 1em;
1271
+ border: 2px solid currentcolor;
1272
+ border-block-start-color: transparent;
1273
+ border-radius: var(--hjm-radius-full);
1274
+ animation: hjm-provider-spin 900ms linear infinite;
1275
+ }
1276
+ @media (prefers-reduced-motion: reduce) {
1277
+ .hjm-auth-provider-button__spinner { animation: none; opacity: 0.6; }
1278
+ }
1279
+ @keyframes hjm-provider-spin { to { transform: rotate(360deg); } }
1280
+
1281
+ /* DateRangePicker --------------------------------------------------------- */
1282
+ /*
1283
+ Range edges are painted on the cell content layer; Calendar keeps its single
1284
+ selection semantics underneath. The hovered preview uses the same states, so
1285
+ there is one set of rules rather than a committed and a provisional set.
1286
+ */
1287
+ .hjm-date-range__cell { position: absolute; inset: 0; border-radius: var(--hjm-radius-sm); pointer-events: auto; }
1288
+ .hjm-date-range__cell[data-range="between"] { background: var(--hjm-color-surface-accent); }
1289
+ .hjm-date-range__cell[data-range="start"],
1290
+ .hjm-date-range__cell[data-range="end"] { background: var(--hjm-color-surface-accent); outline: 2px solid var(--hjm-color-focus); }
1291
+ .hjm-date-range__cell[data-range="none"] { background: transparent; }
1292
+
1293
+ /* AvatarGroup: overlap comes from the recipe ratio, not a per-size pixel value. */
1294
+ .hjm-avatar-group { display: inline-flex; align-items: center; }
1295
+ .hjm-avatar-group > * + * { margin-inline-start: calc(var(--hjm-avatar-overlap) * -1); }
1296
+ .hjm-avatar-group > .hjm-avatar { border: 2px solid var(--hjm-color-bg); border-radius: var(--hjm-radius-full); }
1297
+ .hjm-avatar-group__overflow {
1298
+ display: grid;
1299
+ place-items: center;
1300
+ min-inline-size: var(--hjm-space-xl);
1301
+ min-block-size: var(--hjm-space-xl);
1302
+ padding-inline: var(--hjm-space-xxs);
1303
+ border: 2px solid var(--hjm-color-bg);
1304
+ border-radius: var(--hjm-radius-full);
1305
+ background: var(--hjm-color-surface-alt);
1306
+ color: var(--hjm-color-text-muted);
1307
+ font-size: var(--hjm-type-label-size);
1308
+ }
1309
+
1310
+ /* CounterBadge dot: no number, so the accessible name carries the meaning. */
1311
+ .hjm-counter-badge[data-dot] {
1312
+ min-inline-size: var(--hjm-counter-dot-size);
1313
+ inline-size: var(--hjm-counter-dot-size);
1314
+ block-size: var(--hjm-counter-dot-size);
1315
+ padding: 0;
1316
+ border-radius: var(--hjm-radius-full);
1317
+ }
1318
+
1319
+ /* TextFormat -------------------------------------------------------------- */
1320
+ .hjm-text-format { margin: 0; overflow-wrap: anywhere; }
1321
+ .hjm-text-format[data-kind="kbd"],
1322
+ .hjm-text-format[data-kind="code"] {
1323
+ padding-inline: var(--hjm-space-xxs);
1324
+ border-radius: var(--hjm-radius-sm);
1325
+ background: var(--hjm-color-surface-alt);
1326
+ font-family: var(--hjm-font-family-code, ui-monospace, SFMono-Regular, Consolas, monospace);
1327
+ }
1328
+ .hjm-text-format[data-kind="kbd"] {
1329
+ border: 1px solid var(--hjm-color-border);
1330
+ color: var(--hjm-color-text-body);
1331
+ font-size: var(--hjm-type-label-size);
1332
+ }
1333
+ .hjm-text-format[data-kind="code"] { color: var(--hjm-color-text); font-size: var(--hjm-type-body-size); }
1334
+ .hjm-text-format[data-kind="quote"] {
1335
+ padding-inline-start: var(--hjm-space-md);
1336
+ border-inline-start: 2px solid var(--hjm-color-border);
1337
+ color: var(--hjm-color-text-body);
1338
+ }
1339
+
1340
+ /* SkipNav ----------------------------------------------------------------- */
1341
+ /*
1342
+ Hidden until focused, then unmissable. Clipping it away without restoring it
1343
+ on focus is the common bug: the caret would leave the viewport and WCAG
1344
+ 2.4.7 (Focus Visible) fails.
1345
+ */
1346
+ .hjm-skip-nav {
1347
+ position: absolute;
1348
+ inset-block-start: var(--hjm-skip-nav-offset);
1349
+ inset-inline-start: var(--hjm-skip-nav-offset);
1350
+ z-index: 1300;
1351
+ display: inline-flex;
1352
+ align-items: center;
1353
+ min-block-size: var(--hjm-skip-nav-min-height);
1354
+ padding-inline: var(--hjm-skip-nav-padding);
1355
+ border-radius: var(--hjm-skip-nav-radius);
1356
+ background: var(--hjm-color-primary);
1357
+ color: var(--hjm-color-on-primary);
1358
+ text-decoration: none;
1359
+ transform: translateY(calc(-100% - var(--hjm-skip-nav-offset) * 2));
1360
+ }
1361
+ .hjm-skip-nav:focus-visible,
1362
+ .hjm-skip-nav:focus {
1363
+ transform: none;
1364
+ outline: 2px solid var(--hjm-color-focus);
1365
+ outline-offset: 2px;
1366
+ }
1367
+
1368
+ /* BottomInfo -------------------------------------------------------------- */
1369
+ .hjm-bottom-info {
1370
+ display: block;
1371
+ padding-block-start: var(--hjm-space-sm);
1372
+ color: var(--hjm-color-text-muted);
1373
+ font-size: var(--hjm-type-caption-size);
1374
+ line-height: var(--hjm-type-caption-line-height);
1375
+ }
1376
+ .hjm-bottom-info[data-tone="emphasis"] { color: var(--hjm-color-text-body); }
1377
+ .hjm-bottom-info__list { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); margin: 0; padding-inline-start: var(--hjm-space-md); }
1378
+ .hjm-bottom-info:not([data-list]) .hjm-bottom-info__item { margin: 0; }
1379
+ .hjm-bottom-info__item { overflow-wrap: anywhere; }
1380
+
1381
+ /* AuthScreenLayout -------------------------------------------------------- */
1382
+ /* 두 영역만 둔다. 위(히어로+주 행동)가 남는 세로 공간을 전부 먹고 그 안에서 가운데
1383
+ 정렬하며, 아래(동의 고지·정책 링크)는 바닥에 붙는다. 수치는 계약이 해석한 값을
1384
+ 인라인 custom property로 받으므로 이 파일과 계약이 어긋날 수 없다. */
1385
+ .hjm-auth-screen {
1386
+ display: flex;
1387
+ flex-direction: column;
1388
+ min-block-size: 100dvh;
1389
+ padding-inline: var(--hjm-auth-screen-padding-inline);
1390
+ padding-block: var(--hjm-auth-screen-padding-block);
1391
+ }
1392
+ .hjm-auth-screen__block {
1393
+ display: flex;
1394
+ flex: 1;
1395
+ flex-direction: column;
1396
+ justify-content: center;
1397
+ align-items: center;
1398
+ gap: var(--hjm-auth-screen-main-gap);
1399
+ inline-size: 100%;
1400
+ max-inline-size: var(--hjm-auth-screen-max-width);
1401
+ margin-inline: auto;
1402
+ }
1403
+ .hjm-auth-screen__hero {
1404
+ display: flex;
1405
+ flex-direction: column;
1406
+ align-items: center;
1407
+ gap: var(--hjm-auth-screen-hero-gap);
1408
+ inline-size: 100%;
1409
+ text-align: center;
1410
+ }
1411
+ .hjm-auth-screen__main { inline-size: 100%; }
1412
+ .hjm-auth-screen__footer {
1413
+ display: flex;
1414
+ flex-direction: column;
1415
+ align-items: center;
1416
+ inline-size: 100%;
1417
+ max-inline-size: var(--hjm-auth-screen-max-width);
1418
+ margin-inline: auto;
1419
+ margin-block-start: var(--hjm-auth-screen-footer-gap);
1420
+ text-align: center;
1421
+ }
1422
+
1423
+ /* Sidebar ----------------------------------------------------------------- */
1424
+ .hjm-sidebar {
1425
+ display: flex;
1426
+ flex-direction: column;
1427
+ gap: var(--hjm-sidebar-group-gap);
1428
+ inline-size: var(--hjm-sidebar-width);
1429
+ min-block-size: 100%;
1430
+ padding: var(--hjm-space-sm) var(--hjm-space-xs);
1431
+ border-inline-end: 1px solid var(--hjm-color-border);
1432
+ background: var(--hjm-color-surface-alt);
1433
+ overflow: auto;
1434
+ }
1435
+ .hjm-sidebar__toggle {
1436
+ align-self: flex-end;
1437
+ min-inline-size: var(--hjm-control-min-touch-target);
1438
+ min-block-size: var(--hjm-control-min-touch-target);
1439
+ border: 0;
1440
+ border-radius: var(--hjm-sidebar-item-radius);
1441
+ background: transparent;
1442
+ color: var(--hjm-color-text-muted);
1443
+ font: inherit;
1444
+ cursor: pointer;
1445
+ }
1446
+ .hjm-sidebar__group { display: flex; flex-direction: column; gap: var(--hjm-sidebar-gap); }
1447
+ .hjm-sidebar__group-label {
1448
+ margin: 0;
1449
+ padding: var(--hjm-space-xxs) var(--hjm-space-sm);
1450
+ color: var(--hjm-color-text-muted);
1451
+ font-size: var(--hjm-type-label-size);
1452
+ font-weight: var(--hjm-type-label-weight);
1453
+ }
1454
+ .hjm-sidebar__list { display: flex; flex-direction: column; gap: var(--hjm-sidebar-gap); margin: 0; padding: 0; list-style: none; }
1455
+ .hjm-sidebar__item {
1456
+ display: flex;
1457
+ align-items: center;
1458
+ gap: var(--hjm-space-sm);
1459
+ min-block-size: var(--hjm-sidebar-item-height);
1460
+ padding-inline: var(--hjm-space-sm);
1461
+ border-radius: var(--hjm-sidebar-item-radius);
1462
+ color: var(--hjm-color-text-body);
1463
+ text-decoration: none;
1464
+ overflow-wrap: anywhere;
1465
+ }
1466
+ .hjm-sidebar__item[aria-current="page"] {
1467
+ background: var(--hjm-color-surface-accent);
1468
+ color: var(--hjm-color-content-brand);
1469
+ font-weight: var(--hjm-font-weight-semibold);
1470
+ }
1471
+ .hjm-sidebar__item[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1472
+ .hjm-sidebar__item:focus-visible,
1473
+ .hjm-sidebar__toggle:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1474
+ .hjm-sidebar__icon { display: grid; place-items: center; flex: 0 0 auto; inline-size: var(--hjm-space-lg); }
1475
+ .hjm-sidebar__label { flex: 1 1 auto; min-inline-size: 0; }
1476
+ .hjm-sidebar__badge { flex: 0 0 auto; color: var(--hjm-color-content-brand); font-size: var(--hjm-type-label-size); }
1477
+ /*
1478
+ Collapsed hides the labels only. Every item, its badge and its accessible
1479
+ name stay — collapsing is density, not a different menu.
1480
+ */
1481
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__label,
1482
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__group-label { display: none; }
1483
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__item { justify-content: center; padding-inline: var(--hjm-space-xxs); }
1484
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__badge { position: absolute; margin-block-start: -1.25rem; margin-inline-start: 1rem; }
1485
+ .hjm-sidebar[data-collapsed] .hjm-sidebar__item { position: relative; }
1486
+
1487
+ /* ToggleGroup ------------------------------------------------------------- */
1488
+ .hjm-toggle-group { display: flex; flex-wrap: wrap; gap: var(--hjm-toggle-gap); }
1489
+ .hjm-toggle-group__item {
1490
+ min-block-size: var(--hjm-toggle-min-height);
1491
+ padding-inline: var(--hjm-toggle-padding);
1492
+ border: 1px solid var(--hjm-color-border-control);
1493
+ border-radius: var(--hjm-toggle-radius);
1494
+ background: var(--hjm-color-surface);
1495
+ color: var(--hjm-color-text-body);
1496
+ font: inherit;
1497
+ cursor: pointer;
1498
+ }
1499
+ /* The pressed state is announced by aria-pressed; color only reinforces it. */
1500
+ .hjm-toggle-group__item[aria-pressed="true"] {
1501
+ border-color: var(--hjm-color-focus);
1502
+ background: var(--hjm-color-surface-accent);
1503
+ color: var(--hjm-color-content-brand);
1504
+ font-weight: var(--hjm-font-weight-semibold);
1505
+ }
1506
+ .hjm-toggle-group__item:disabled { cursor: default; color: var(--hjm-color-text-weak); }
1507
+ .hjm-toggle-group__item:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
1508
+
1509
+ /* TagsInput --------------------------------------------------------------- */
1510
+ .hjm-tags-input { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); }
1511
+ .hjm-tags-input__label { color: var(--hjm-color-text-body); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-type-label-weight); }
1512
+ .hjm-tags-input__frame {
1513
+ display: flex;
1514
+ flex-wrap: wrap;
1515
+ align-items: center;
1516
+ gap: var(--hjm-tags-gap);
1517
+ min-block-size: var(--hjm-tags-min-height);
1518
+ padding: var(--hjm-space-xxs) var(--hjm-space-sm);
1519
+ border: 1px solid var(--hjm-color-border-control);
1520
+ border-radius: var(--hjm-radius-md);
1521
+ background: var(--hjm-color-bg);
1522
+ cursor: text;
1523
+ }
1524
+ .hjm-tags-input__frame:focus-within { outline: 2px solid var(--hjm-color-focus); outline-offset: -1px; }
1525
+ .hjm-tags-input__list { display: contents; margin: 0; padding: 0; list-style: none; }
1526
+ .hjm-tags-input__tag {
1527
+ display: inline-flex;
1528
+ align-items: center;
1529
+ gap: var(--hjm-space-xxs);
1530
+ min-block-size: var(--hjm-tags-tag-min-height);
1531
+ padding-inline: var(--hjm-space-xs);
1532
+ border-radius: var(--hjm-radius-full);
1533
+ background: var(--hjm-color-surface-alt);
1534
+ color: var(--hjm-color-text-body);
1535
+ overflow-wrap: anywhere;
1536
+ }
1537
+ /* Armed by the first Backspace: visible before the second press removes it. */
1538
+ .hjm-tags-input__tag[data-armed] { outline: 2px solid var(--hjm-color-focus); }
1539
+ .hjm-tags-input__remove {
1540
+ display: grid;
1541
+ place-items: center;
1542
+ min-inline-size: var(--hjm-space-md);
1543
+ min-block-size: var(--hjm-space-md);
1544
+ padding: 0;
1545
+ border: 0;
1546
+ background: transparent;
1547
+ color: var(--hjm-color-text-muted);
1548
+ font: inherit;
1549
+ cursor: pointer;
1550
+ }
1551
+ .hjm-tags-input__remove::after {
1552
+ /* Keeps the pointer target at the shared minimum without growing the chip. */
1553
+ content: "";
1554
+ position: absolute;
1555
+ min-inline-size: var(--hjm-tags-remove-target);
1556
+ min-block-size: var(--hjm-tags-remove-target);
1557
+ }
1558
+ .hjm-tags-input__tag { position: relative; }
1559
+ .hjm-tags-input__input {
1560
+ flex: 1 1 8ch;
1561
+ min-inline-size: 8ch;
1562
+ border: 0;
1563
+ background: transparent;
1564
+ color: var(--hjm-color-text);
1565
+ font: inherit;
1566
+ outline: none;
1567
+ }
1568
+ .hjm-tags-input__suggestions {
1569
+ display: flex;
1570
+ flex-direction: column;
1571
+ max-block-size: 12rem;
1572
+ margin: var(--hjm-space-xxs) 0 0;
1573
+ padding: var(--hjm-space-xxs);
1574
+ border: 1px solid var(--hjm-color-border);
1575
+ border-radius: var(--hjm-radius-md);
1576
+ background: var(--hjm-color-bg);
1577
+ list-style: none;
1578
+ overflow: auto;
1579
+ }
1580
+ .hjm-tags-input__suggestion {
1581
+ display: flex;
1582
+ align-items: center;
1583
+ min-block-size: var(--hjm-control-min-touch-target);
1584
+ padding-inline: var(--hjm-space-xs);
1585
+ border-radius: var(--hjm-radius-sm);
1586
+ cursor: pointer;
1587
+ overflow-wrap: anywhere;
1588
+ }
1589
+ .hjm-tags-input__suggestion[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1590
+ .hjm-tags-input__suggestion[aria-disabled="true"] { color: var(--hjm-color-text-weak); cursor: default; }
1591
+ .hjm-tags-input__description { margin: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1592
+ .hjm-tags-input[data-disabled] .hjm-tags-input__frame { opacity: 0.6; cursor: default; }
1593
+
1594
+ /* Heading ----------------------------------------------------------------- */
1595
+ /*
1596
+ Exposes the existing heading scale; owns no surrounding layout, so the block
1597
+ that contains it decides the spacing.
1598
+ */
1599
+ .hjm-heading {
1600
+ margin: 0;
1601
+ color: var(--hjm-color-text);
1602
+ font-size: calc(var(--hjm-heading-size) * var(--hjm-text-scale, 1));
1603
+ line-height: calc(var(--hjm-heading-line-height) * var(--hjm-text-scale, 1));
1604
+ font-weight: var(--hjm-heading-weight);
1605
+ overflow-wrap: anywhere;
1606
+ }
1607
+
1608
+ /* Top --------------------------------------------------------------------- */
1609
+ /*
1610
+ Body content, not fixed chrome: no position, no safe area, no z-index. The
1611
+ title uses the shared type scale passed down as custom properties so the two
1612
+ sizes never drift from `topRecipe.sizes`.
1613
+ */
1614
+ .hjm-top {
1615
+ display: flex;
1616
+ flex-direction: column;
1617
+ padding-block: var(--hjm-top-padding-top) var(--hjm-top-padding-bottom);
1618
+ }
1619
+ .hjm-top__eyebrow {
1620
+ margin: 0 0 var(--hjm-space-xxs);
1621
+ color: var(--hjm-color-content-brand, var(--hjm-color-primary));
1622
+ font-size: var(--hjm-type-label-size);
1623
+ line-height: var(--hjm-type-label-line-height);
1624
+ font-weight: var(--hjm-type-label-weight);
1625
+ }
1626
+ .hjm-top__row {
1627
+ display: flex;
1628
+ flex-wrap: wrap;
1629
+ align-items: baseline;
1630
+ justify-content: space-between;
1631
+ gap: var(--hjm-space-xs);
1632
+ }
1633
+ .hjm-top__title {
1634
+ margin: 0;
1635
+ min-inline-size: 0;
1636
+ flex: 1 1 auto;
1637
+ color: var(--hjm-color-text);
1638
+ font-size: calc(var(--hjm-top-title-size) * var(--hjm-text-scale, 1));
1639
+ line-height: calc(var(--hjm-top-title-line-height) * var(--hjm-text-scale, 1));
1640
+ font-weight: var(--hjm-top-title-weight);
1641
+ overflow-wrap: anywhere;
1642
+ }
1643
+ .hjm-top__trailing { display: flex; flex: 0 0 auto; align-items: center; gap: var(--hjm-space-xs); }
1644
+ .hjm-top__description {
1645
+ margin: var(--hjm-space-xs) 0 0;
1646
+ color: var(--hjm-color-text-body);
1647
+ overflow-wrap: anywhere;
1648
+ }
1649
+
1650
+ /* Agreement --------------------------------------------------------------- */
1651
+ .hjm-agreement { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
1652
+ .hjm-agreement__all,
1653
+ .hjm-agreement__toggle {
1654
+ display: flex;
1655
+ align-items: center;
1656
+ gap: var(--hjm-space-sm);
1657
+ min-block-size: var(--hjm-control-min-touch-target);
1658
+ padding: 0;
1659
+ border: 0;
1660
+ background: transparent;
1661
+ color: var(--hjm-color-text);
1662
+ font: inherit;
1663
+ text-align: start;
1664
+ }
1665
+ .hjm-agreement__all {
1666
+ gap: var(--hjm-space-sm);
1667
+ padding: var(--hjm-space-sm) var(--hjm-space-md);
1668
+ border-radius: var(--hjm-radius-md);
1669
+ background: var(--hjm-color-surface-alt);
1670
+ font-size: var(--hjm-type-body-large-size);
1671
+ line-height: var(--hjm-type-body-large-line-height);
1672
+ }
1673
+ .hjm-agreement__list { display: flex; flex-direction: column; }
1674
+ .hjm-agreement__item {
1675
+ display: grid;
1676
+ grid-template-columns: 1fr auto;
1677
+ align-items: center;
1678
+ gap: var(--hjm-space-xs);
1679
+ padding-inline: var(--hjm-space-sm);
1680
+ }
1681
+ .hjm-agreement__item[data-disabled] { color: var(--hjm-color-text-weak); }
1682
+ .hjm-agreement__copy { display: flex; min-inline-size: 0; flex-wrap: wrap; align-items: baseline; gap: var(--hjm-space-xxs); overflow-wrap: anywhere; }
1683
+ .hjm-agreement__required { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1684
+ .hjm-agreement__required[data-required] { color: var(--hjm-color-content-brand, var(--hjm-color-primary)); }
1685
+ .hjm-agreement__description {
1686
+ grid-column: 1 / -1;
1687
+ margin: 0 0 var(--hjm-space-xs);
1688
+ color: var(--hjm-color-text-muted);
1689
+ font-size: var(--hjm-type-label-size);
1690
+ }
1691
+ .hjm-agreement__detail {
1692
+ display: inline-flex;
1693
+ align-items: center;
1694
+ min-block-size: var(--hjm-control-min-touch-target);
1695
+ padding: 0 var(--hjm-space-xs);
1696
+ border: 0;
1697
+ background: transparent;
1698
+ color: var(--hjm-color-text-muted);
1699
+ font: inherit;
1700
+ font-size: var(--hjm-type-label-size);
1701
+ text-decoration: underline;
1702
+ }
1703
+ .hjm-agreement__mark {
1704
+ display: grid;
1705
+ place-items: center;
1706
+ flex: 0 0 auto;
1707
+ inline-size: var(--hjm-space-md);
1708
+ block-size: var(--hjm-space-md);
1709
+ border: 1px solid var(--hjm-color-border-control);
1710
+ border-radius: var(--hjm-radius-sm);
1711
+ color: var(--hjm-color-on-primary);
1712
+ font-size: var(--hjm-type-label-size);
1713
+ }
1714
+ .hjm-agreement__mark[data-state="true"],
1715
+ .hjm-agreement__mark[data-state="mixed"] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1716
+ .hjm-agreement__all:focus-visible,
1717
+ .hjm-agreement__toggle:focus-visible,
1718
+ .hjm-agreement__detail:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
1719
+
1720
+ /* Tree -------------------------------------------------------------------- */
1721
+ /*
1722
+ A flat list of treeitems with aria-level, not nested group elements: the
1723
+ roving tab stop and the contract's visible-node navigation both operate on one
1724
+ resolved array, and WAI-ARIA accepts either shape. Indentation is presentation
1725
+ only — depth is announced, never inferred from the padding.
1726
+ */
1727
+ .hjm-tree { display: flex; flex-direction: column; }
1728
+ .hjm-tree__node {
1729
+ display: flex;
1730
+ align-items: center;
1731
+ gap: var(--hjm-space-xs);
1732
+ min-block-size: var(--hjm-control-min-touch-target);
1733
+ padding-inline: var(--hjm-space-sm);
1734
+ padding-block: var(--hjm-space-xxs);
1735
+ border-radius: var(--hjm-radius-sm);
1736
+ color: var(--hjm-color-text);
1737
+ cursor: default;
1738
+ }
1739
+ .hjm-tree__node[aria-selected="true"] { background: var(--hjm-color-surface-accent); }
1740
+ .hjm-tree__node[aria-disabled="true"] { color: var(--hjm-color-text-weak); }
1741
+ .hjm-tree__node:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1742
+ .hjm-tree__indent { flex: 0 0 auto; inline-size: calc(var(--hjm-tree-depth) * var(--hjm-tree-indent)); }
1743
+ .hjm-tree__toggle { flex: 0 0 auto; inline-size: var(--hjm-space-md); color: var(--hjm-color-text-muted); text-align: center; }
1744
+ .hjm-tree__label { min-inline-size: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--hjm-space-xs); overflow-wrap: anywhere; }
1745
+ .hjm-tree__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
1746
+ .hjm-tree__check {
1747
+ flex: 0 0 auto;
1748
+ display: grid;
1749
+ place-items: center;
1750
+ inline-size: var(--hjm-space-md);
1751
+ block-size: var(--hjm-space-md);
1752
+ border: 1px solid var(--hjm-color-border-control);
1753
+ border-radius: var(--hjm-radius-sm);
1754
+ color: var(--hjm-color-on-primary);
1755
+ font-size: var(--hjm-type-label-size);
1756
+ }
1757
+ .hjm-tree__check[data-state="true"],
1758
+ .hjm-tree__check[data-state="mixed"] { border-color: var(--hjm-color-primary); background: var(--hjm-color-primary); }
1759
+ .hjm-tree__state { margin: 0; padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); }
1760
+
1761
+ /* Splitter ---------------------------------------------------------------- */
1762
+ /*
1763
+ Slider's "thin visible line, large hit target" split: the bar draws
1764
+ `--hjm-splitter-thickness` but the separator itself reserves the 44px target
1765
+ the recipe requires, so the extra area is padding rather than a wider line.
1766
+ */
1767
+ .hjm-splitter { display: flex; min-inline-size: 0; min-block-size: 0; }
1768
+ .hjm-splitter[data-axis="vertical"] { flex-direction: column; }
1769
+ .hjm-splitter__pane { min-inline-size: 0; min-block-size: 0; overflow: auto; }
1770
+ .hjm-splitter__pane[data-pane="primary"] { flex: 0 0 var(--hjm-splitter-primary); }
1771
+ .hjm-splitter__pane[data-pane="secondary"] { flex: 1 1 0; }
1772
+ .hjm-splitter__separator {
1773
+ display: flex;
1774
+ flex: 0 0 auto;
1775
+ align-items: center;
1776
+ justify-content: center;
1777
+ background: none;
1778
+ touch-action: none;
1779
+ }
1780
+ .hjm-splitter[data-axis="horizontal"] > .hjm-splitter__separator {
1781
+ inline-size: var(--hjm-splitter-hit-target);
1782
+ cursor: col-resize;
1783
+ }
1784
+ .hjm-splitter[data-axis="vertical"] > .hjm-splitter__separator {
1785
+ block-size: var(--hjm-splitter-hit-target);
1786
+ cursor: row-resize;
1787
+ }
1788
+ .hjm-splitter__handle { display: block; background: var(--hjm-color-border); }
1789
+ .hjm-splitter[data-axis="horizontal"] .hjm-splitter__handle {
1790
+ inline-size: var(--hjm-splitter-thickness);
1791
+ block-size: 100%;
1792
+ }
1793
+ .hjm-splitter[data-axis="vertical"] .hjm-splitter__handle {
1794
+ block-size: var(--hjm-splitter-thickness);
1795
+ inline-size: 100%;
1796
+ }
1797
+ .hjm-splitter__separator:hover .hjm-splitter__handle { background: var(--hjm-color-border-control); }
1798
+ .hjm-splitter[data-dragging] .hjm-splitter__handle { background: var(--hjm-color-focus); }
1799
+ .hjm-splitter__separator:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; }
1800
+ .hjm-splitter__separator[aria-disabled="true"] { cursor: default; }
1801
+
1802
+ /* Overlays ---------------------------------------------------------------- */
1803
+ .hjm-portal { color: var(--hjm-color-text); }
1804
+ .hjm-portal[inert] { visibility: hidden; pointer-events: none; }
1805
+ .hjm-overlay {
1806
+ position: fixed;
1807
+ z-index: 1000;
1808
+ inset: 0;
1809
+ display: flex;
1810
+ align-items: center;
1811
+ justify-content: center;
1812
+ padding: var(--hjm-space-md);
1813
+ background: rgb(0 0 0 / 58%);
1814
+ overscroll-behavior: contain;
1815
+ }
1816
+ .hjm-dialog,
1817
+ .hjm-alert-dialog,
1818
+ .hjm-sheet {
1819
+ min-inline-size: 0;
1820
+ max-inline-size: calc(100vw - (2 * var(--hjm-space-md)));
1821
+ max-block-size: calc(100dvh - (2 * var(--hjm-space-md)));
1822
+ overflow: auto;
1823
+ border: var(--hjm-dialog-border-width) solid var(--hjm-dialog-border);
1824
+ border-radius: var(--hjm-dialog-radius);
1825
+ color: var(--hjm-color-text);
1826
+ background: var(--hjm-dialog-background);
1827
+ box-shadow: var(--hjm-dialog-shadow);
1828
+ }
1829
+ .hjm-dialog { inline-size: min(36rem, 100%); }
1830
+ .hjm-dialog[data-size="small"] { inline-size: min(28rem, 100%); }
1831
+ .hjm-dialog[data-size="large"] { inline-size: min(48rem, 100%); }
1832
+ .hjm-alert-dialog[data-size="small"] { inline-size: min(28rem, 100%); }
1833
+ .hjm-alert-dialog[data-size="large"] { inline-size: min(48rem, 100%); }
1834
+ .hjm-dialog__header,
1835
+ .hjm-sheet__header {
1836
+ display: flex;
1837
+ align-items: flex-start;
1838
+ justify-content: space-between;
1839
+ gap: var(--hjm-space-md);
1840
+ padding: var(--hjm-space-lg) var(--hjm-space-lg) 0;
1841
+ }
1842
+ /* Sheet headings share the close target's center; consumers previously forced
1843
+ title line-height or patched this private selector to achieve this alignment. */
1844
+ .hjm-sheet__header { align-items: center; }
1845
+ .hjm-sheet__header > div { min-inline-size: 0; }
1846
+ .hjm-dialog__title,
1847
+ .hjm-sheet__title,
1848
+ .hjm-alert-dialog__title {
1849
+ margin: 0;
1850
+ font-size: var(--hjm-type-title-size);
1851
+ line-height: var(--hjm-type-title-line-height);
1852
+ overflow-wrap: anywhere;
1853
+ }
1854
+ .hjm-dialog__description,
1855
+ .hjm-sheet__description,
1856
+ .hjm-alert-dialog__description {
1857
+ margin: var(--hjm-space-xs) 0 0;
1858
+ color: var(--hjm-color-text-muted);
1859
+ overflow-wrap: anywhere;
1860
+ }
1861
+ .hjm-dialog > .hjm-dialog__description { padding-inline: var(--hjm-space-lg); }
1862
+ .hjm-dialog__body,
1863
+ .hjm-sheet__body { padding: var(--hjm-space-lg); }
1864
+ .hjm-dialog__footer,
1865
+ .hjm-sheet__footer,
1866
+ .hjm-alert-dialog__actions {
1867
+ display: flex;
1868
+ flex-wrap: wrap;
1869
+ justify-content: flex-end;
1870
+ gap: var(--hjm-space-sm);
1871
+ padding: 0 var(--hjm-space-lg) var(--hjm-space-lg);
1872
+ }
1873
+ .hjm-dialog__close {
1874
+ flex: 0 0 auto;
1875
+ display: grid;
1876
+ place-items: center;
1877
+ inline-size: var(--hjm-control-min-touch-target);
1878
+ block-size: var(--hjm-control-min-touch-target);
1879
+ margin: calc(-1 * var(--hjm-space-xs));
1880
+ border: 0;
1881
+ border-radius: var(--hjm-radius-md);
1882
+ color: var(--hjm-color-text-muted);
1883
+ background: transparent;
1884
+ font: inherit;
1885
+ font-size: 1.5em;
1886
+ cursor: pointer;
1887
+ }
1888
+ .hjm-dialog__close:disabled { opacity: 0.5; cursor: not-allowed; }
1889
+ .hjm-alert-dialog {
1890
+ inline-size: min(36rem, 100%);
1891
+ display: grid;
1892
+ gap: var(--hjm-space-sm);
1893
+ padding: var(--hjm-space-lg);
1894
+ }
1895
+ .hjm-alert-dialog__icon { color: var(--hjm-accent-attention); font-size: 1.5rem; }
1896
+ /* The mark carries the tone. `info` explains before an ordinary action and
1897
+ `success` reports one that finished — painting either in the attention accent
1898
+ made a neutral dialog read as a warning. */
1899
+ .hjm-alert-dialog[data-tone="info"] .hjm-alert-dialog__icon { color: var(--hjm-accent-info); }
1900
+ .hjm-alert-dialog[data-tone="success"] .hjm-alert-dialog__icon { color: var(--hjm-accent-success); }
1901
+ .hjm-alert-dialog[data-tone="danger"] .hjm-alert-dialog__icon,
1902
+ .hjm-alert-dialog__error { color: var(--hjm-color-danger); }
1903
+ .hjm-alert-dialog__description,
1904
+ .hjm-alert-dialog__error { margin: 0; }
1905
+ .hjm-alert-dialog__actions { padding: var(--hjm-space-sm) 0 0; }
1906
+ .hjm-sheet-positioner {
1907
+ padding-block-start: max(var(--hjm-space-md), env(safe-area-inset-top, 0px));
1908
+ padding-block-end: max(var(--hjm-space-md), env(safe-area-inset-bottom, 0px));
1909
+ padding-inline-start: max(var(--hjm-space-md), env(safe-area-inset-left, 0px));
1910
+ padding-inline-end: max(var(--hjm-space-md), env(safe-area-inset-right, 0px));
1911
+ }
1912
+ .hjm-sheet-positioner[data-placement="bottom"] {
1913
+ align-items: flex-end;
1914
+ padding-block-end: 0;
1915
+ }
1916
+ .hjm-sheet-positioner[data-placement="start"] { justify-content: flex-start; }
1917
+ .hjm-sheet-positioner[data-placement="end"] { justify-content: flex-end; }
1918
+ .hjm-sheet {
1919
+ inline-size: min(28rem, 100%);
1920
+ border: var(--hjm-sheet-border-width) solid var(--hjm-sheet-border);
1921
+ border-radius: var(--hjm-sheet-radius);
1922
+ background: var(--hjm-sheet-background);
1923
+ box-shadow: var(--hjm-sheet-shadow);
1924
+ display: flex;
1925
+ flex-direction: column;
1926
+ overflow: hidden;
1927
+ }
1928
+ .hjm-sheet__header,
1929
+ .hjm-sheet__footer { flex: 0 0 auto; }
1930
+ .hjm-sheet__body {
1931
+ min-block-size: 0;
1932
+ flex: 1 1 auto;
1933
+ display: flex;
1934
+ flex-direction: column;
1935
+ overflow: auto;
1936
+ overscroll-behavior: contain;
1937
+ }
1938
+ .hjm-sheet[data-placement="bottom"] {
1939
+ inline-size: min(var(--hjm-sheet-max-width), 100%);
1940
+ max-block-size: var(--hjm-sheet-max-height);
1941
+ border-end-start-radius: 0;
1942
+ border-end-end-radius: 0;
1943
+ }
1944
+ .hjm-sheet[data-placement="bottom"]:not([data-has-footer="true"]) > .hjm-sheet__body {
1945
+ padding-block-end: calc(var(--hjm-space-lg) + env(safe-area-inset-bottom, 0px));
1946
+ }
1947
+ .hjm-sheet[data-placement="bottom"] > .hjm-sheet__footer {
1948
+ padding-block-end: calc(var(--hjm-space-lg) + env(safe-area-inset-bottom, 0px));
1949
+ }
1950
+ /* Detent handle: a control, so it carries the shared minimum target. */
1951
+ .hjm-sheet__handle-row { display: flex; justify-content: center; flex: 0 0 auto; }
1952
+ .hjm-sheet__handle {
1953
+ display: grid;
1954
+ place-items: center;
1955
+ min-inline-size: var(--hjm-control-min-touch-target);
1956
+ min-block-size: var(--hjm-space-lg);
1957
+ padding: 0;
1958
+ border: 0;
1959
+ background: transparent;
1960
+ cursor: pointer;
1961
+ }
1962
+ .hjm-sheet__handle:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: -2px; border-radius: var(--hjm-radius-full); }
1963
+ .hjm-sheet__handle-bar { inline-size: var(--hjm-sheet-handle-width); block-size: var(--hjm-sheet-handle-height); border-radius: var(--hjm-radius-full); background: var(--hjm-sheet-handle-color); }
1964
+ .hjm-sheet[data-detent="medium"] { block-size: var(--hjm-sheet-size-medium); }
1965
+ .hjm-sheet[data-detent="large"] { block-size: var(--hjm-sheet-size-large); }
1966
+ .hjm-sheet[data-detent="full"] { block-size: var(--hjm-sheet-size-full); }
1967
+ .hjm-sheet[data-placement="start"],
1968
+ .hjm-sheet[data-placement="end"] {
1969
+ block-size: calc(100dvh - (2 * var(--hjm-space-md)));
1970
+ }
1971
+ /*
1972
+ SidePanel docks to a logical viewport edge, so it drops the floating radius the
1973
+ Dialog/Sheet cards keep (sidePanelRecipe.content.radius is null) and spans the
1974
+ full block size. The non-modal panel has no backdrop element at all — the page
1975
+ behind it stays interactive — so it positions itself instead of a positioner.
1976
+ */
1977
+ .hjm-side-panel-positioner { padding: 0; }
1978
+ .hjm-side-panel-positioner[data-edge="start"] { justify-content: flex-start; }
1979
+ .hjm-side-panel-positioner[data-edge="end"] { justify-content: flex-end; }
1980
+ .hjm-side-panel {
1981
+ display: flex;
1982
+ flex-direction: column;
1983
+ inline-size: min(var(--hjm-side-panel-size), 100%);
1984
+ block-size: 100dvh;
1985
+ min-inline-size: 0;
1986
+ overflow: hidden;
1987
+ border: 1px solid var(--hjm-color-border);
1988
+ border-radius: 0;
1989
+ color: var(--hjm-color-text);
1990
+ background: var(--hjm-color-surface);
1991
+ box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
1992
+ }
1993
+ .hjm-side-panel[data-modal="false"] {
1994
+ position: fixed;
1995
+ inset-block: 0;
1996
+ inset-inline-start: auto;
1997
+ inset-inline-end: 0;
1998
+ }
1999
+ .hjm-side-panel[data-modal="false"][data-edge="start"] {
2000
+ inset-inline-start: 0;
2001
+ inset-inline-end: auto;
2002
+ }
2003
+ .hjm-side-panel__header {
2004
+ display: flex;
2005
+ flex: 0 0 auto;
2006
+ align-items: flex-start;
2007
+ justify-content: space-between;
2008
+ gap: var(--hjm-space-md);
2009
+ min-block-size: 44px;
2010
+ padding: var(--hjm-space-sm) var(--hjm-space-lg) 0;
2011
+ }
2012
+ .hjm-side-panel__title {
2013
+ margin: 0;
2014
+ font-size: var(--hjm-type-title-size);
2015
+ line-height: var(--hjm-type-title-line-height);
2016
+ overflow-wrap: anywhere;
2017
+ }
2018
+ .hjm-side-panel__description {
2019
+ margin: var(--hjm-space-xs) 0 0;
2020
+ color: var(--hjm-color-text-muted);
2021
+ overflow-wrap: anywhere;
2022
+ }
2023
+ .hjm-side-panel__body {
2024
+ display: flex;
2025
+ flex: 1 1 auto;
2026
+ flex-direction: column;
2027
+ gap: var(--hjm-space-md);
2028
+ min-block-size: 0;
2029
+ padding: var(--hjm-space-md) var(--hjm-space-lg);
2030
+ overflow: auto;
2031
+ overscroll-behavior: contain;
2032
+ }
2033
+ .hjm-side-panel__footer {
2034
+ display: flex;
2035
+ flex: 0 0 auto;
2036
+ flex-wrap: wrap;
2037
+ justify-content: flex-end;
2038
+ gap: var(--hjm-space-sm);
2039
+ padding: var(--hjm-space-sm) var(--hjm-space-lg)
2040
+ max(var(--hjm-space-sm), env(safe-area-inset-bottom, 0px));
2041
+ }
2042
+ /*
2043
+ Tour keeps the veil and the card in separate portals: the veil must cover the
2044
+ page while the card is positioned against its anchor, and the shared anchored
2045
+ popup helper owns the card's coordinates. The highlight is a ring drawn at the
2046
+ measured anchor box — decoration only, so it is hidden from assistive tech.
2047
+ */
2048
+ .hjm-tour-backdrop { position: fixed; inset: 0; background: rgb(0 0 0 / 58%); pointer-events: auto; }
2049
+ .hjm-tour-highlight {
2050
+ position: fixed;
2051
+ border-radius: var(--hjm-radius-md);
2052
+ box-shadow: 0 0 0 2px var(--hjm-color-focus);
2053
+ pointer-events: none;
2054
+ }
2055
+ .hjm-tour {
2056
+ display: flex;
2057
+ flex-direction: column;
2058
+ gap: var(--hjm-space-sm);
2059
+ box-sizing: border-box;
2060
+ padding: var(--hjm-space-md);
2061
+ border: 1px solid var(--hjm-color-border);
2062
+ border-radius: var(--hjm-radius-md);
2063
+ color: var(--hjm-color-text);
2064
+ background: var(--hjm-color-surface);
2065
+ box-shadow: 0 16px 48px rgb(0 0 0 / 28%);
2066
+ pointer-events: auto;
2067
+ }
2068
+ .hjm-tour__counter { margin: 0; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2069
+ .hjm-tour__title { margin: var(--hjm-space-xxs) 0 0; font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); overflow-wrap: anywhere; }
2070
+ .hjm-tour__description { margin: var(--hjm-space-xs) 0 0; color: var(--hjm-color-text-body); overflow-wrap: anywhere; }
2071
+ .hjm-tour__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--hjm-space-xs); }
2072
+ .hjm-tour:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2073
+
2074
+ .hjm-tooltip { position: relative; display: inline-flex; }
2075
+ .hjm-tooltip__content {
2076
+ position: fixed;
2077
+ z-index: 1100;
2078
+ inline-size: max-content;
2079
+ max-inline-size: min(20rem, 80vw);
2080
+ padding: var(--hjm-space-xs) var(--hjm-space-sm);
2081
+ border-radius: var(--hjm-radius-sm);
2082
+ color: var(--hjm-color-bg);
2083
+ background: var(--hjm-color-text);
2084
+ font-size: var(--hjm-type-label-size);
2085
+ line-height: var(--hjm-type-label-line-height);
2086
+ overflow-wrap: anywhere;
2087
+ pointer-events: auto;
2088
+ }
2089
+ .hjm-menu { position: relative; display: inline-flex; }
2090
+ .hjm-menu__content {
2091
+ position: fixed;
2092
+ z-index: 900;
2093
+ min-inline-size: 13.75rem;
2094
+ max-inline-size: min(24rem, 90vw);
2095
+ max-block-size: calc(100dvh - (2 * var(--hjm-space-md)));
2096
+ overflow: auto;
2097
+ padding: var(--hjm-space-xxs);
2098
+ border: 1px solid var(--hjm-color-border);
2099
+ border-radius: var(--hjm-radius-md);
2100
+ background: var(--hjm-color-surface);
2101
+ box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
2102
+ }
2103
+ .hjm-menu__item {
2104
+ inline-size: 100%;
2105
+ min-block-size: var(--hjm-control-min-touch-target);
2106
+ display: flex;
2107
+ align-items: center;
2108
+ gap: var(--hjm-space-sm);
2109
+ padding: var(--hjm-space-xs) var(--hjm-space-sm);
2110
+ border: 0;
2111
+ border-radius: var(--hjm-radius-sm);
2112
+ color: var(--hjm-color-text-body);
2113
+ background: transparent;
2114
+ font: inherit;
2115
+ text-align: start;
2116
+ cursor: pointer;
2117
+ }
2118
+ .hjm-menu__content[data-density="comfortable"] .hjm-menu__item { min-block-size: 3.5rem; }
2119
+ .hjm-menu__item:hover,
2120
+ .hjm-menu__item[data-focus="true"] { background: var(--hjm-color-surface-alt); }
2121
+ .hjm-menu__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2122
+ .hjm-menu__item[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-semibold); }
2123
+ .hjm-menu__item:disabled { opacity: 0.5; cursor: not-allowed; }
2124
+ .hjm-menu__state-message { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
2125
+ .hjm-menu__section-label { padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-semibold); }
2126
+ .hjm-menu__separator { block-size: 1px; margin: var(--hjm-space-xxs) var(--hjm-space-xs); background: var(--hjm-color-border); }
2127
+ .hjm-menu__danger-indicator { flex: 0 0 auto; color: var(--hjm-color-danger); font-weight: var(--hjm-font-weight-bold); }
2128
+ .hjm-menu__copy { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
2129
+ .hjm-menu__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2130
+ .hjm-menu__leading,
2131
+ .hjm-menu__trailing { flex: 0 0 auto; color: var(--hjm-color-text-muted); }
2132
+
2133
+ /* Advanced forms --------------------------------------------------------- */
2134
+ .hjm-select__native { appearance: none; padding-inline-end: calc(var(--hjm-space-lg) + var(--hjm-space-sm)); cursor: pointer; }
2135
+ .hjm-select__anchor { position: relative; min-inline-size: 0; }
2136
+ .hjm-select__trigger { inline-size: 100%; justify-content: space-between; gap: var(--hjm-space-sm); color: var(--hjm-color-text); font: inherit; text-align: start; cursor: pointer; }
2137
+ .hjm-select__trigger:disabled { cursor: not-allowed; }
2138
+ .hjm-select__trigger[aria-disabled="true"] { cursor: progress; }
2139
+ .hjm-select__leading, .hjm-select__option-leading { flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; color: var(--hjm-color-text-muted); }
2140
+ .hjm-select__value { min-inline-size: 0; flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2141
+ .hjm-select__value[data-state="placeholder"] { color: var(--hjm-color-text-muted); }
2142
+ .hjm-select__indicator { flex: 0 0 auto; color: var(--hjm-color-text-muted); pointer-events: none; }
2143
+ .hjm-select__busy-indicator { flex: 0 0 auto; inline-size: 1em; block-size: 1em; border: 2px solid var(--hjm-color-content-brand); border-inline-end-color: transparent; border-radius: 50%; animation: hjm-spin 800ms linear infinite; }
2144
+ .hjm-select__native + .hjm-select__indicator { margin-inline-start: calc(-1 * var(--hjm-space-lg)); }
2145
+ .hjm-select__listbox { position: fixed; z-index: 800; max-inline-size: min(26.25rem, calc(100vw - (2 * var(--hjm-space-md)))); max-block-size: 22.5rem; overflow: auto; padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2146
+ .hjm-select__section-label { padding: var(--hjm-space-xs) var(--hjm-space-sm); color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-semibold); }
2147
+ .hjm-select__option, .hjm-select__message { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: var(--hjm-radius-sm); overflow-wrap: anywhere; }
2148
+ .hjm-select[data-density="comfortable"] .hjm-select__option,
2149
+ .hjm-select__listbox[data-density="comfortable"] .hjm-select__option { min-block-size: 3.5rem; }
2150
+ .hjm-select__option { cursor: pointer; }
2151
+ .hjm-select__option[data-active="true"] { background: var(--hjm-color-surface-alt); }
2152
+ .hjm-select__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2153
+ .hjm-select__option[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
2154
+ .hjm-select__option-copy { min-inline-size: 0; flex: 1 1 auto; display: grid; gap: var(--hjm-space-xxs); }
2155
+ .hjm-select__option-description, .hjm-select__message { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2156
+ .hjm-select__check { flex: 0 0 auto; }
2157
+ .hjm-select[data-size="large"] .hjm-field__control,
2158
+ .hjm-combobox[data-size="large"] .hjm-field__control { min-block-size: var(--hjm-control-button-large); }
2159
+ .hjm-combobox__anchor { position: relative; min-inline-size: 0; }
2160
+ .hjm-combobox__spinner {
2161
+ flex: 0 0 auto;
2162
+ inline-size: 1em;
2163
+ block-size: 1em;
2164
+ border: 2px solid var(--hjm-color-content-brand);
2165
+ border-inline-end-color: transparent;
2166
+ border-radius: 50%;
2167
+ animation: hjm-spin 800ms linear infinite;
2168
+ }
2169
+ .hjm-combobox__listbox {
2170
+ position: fixed;
2171
+ z-index: 800;
2172
+ max-block-size: 22.5rem;
2173
+ overflow: auto;
2174
+ padding: var(--hjm-space-xxs);
2175
+ border: 1px solid var(--hjm-color-border);
2176
+ border-radius: var(--hjm-radius-md);
2177
+ background: var(--hjm-color-surface);
2178
+ box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
2179
+ }
2180
+ .hjm-combobox__option,
2181
+ .hjm-combobox__message {
2182
+ min-block-size: var(--hjm-control-min-touch-target);
2183
+ display: flex;
2184
+ align-items: center;
2185
+ padding: var(--hjm-space-xs) var(--hjm-space-sm);
2186
+ border-radius: var(--hjm-radius-sm);
2187
+ overflow-wrap: anywhere;
2188
+ }
2189
+ .hjm-combobox[data-density="comfortable"] .hjm-combobox__option,
2190
+ .hjm-combobox__listbox[data-density="comfortable"] .hjm-combobox__option { min-block-size: 3.5rem; }
2191
+ .hjm-combobox__option { cursor: pointer; }
2192
+ .hjm-combobox__option[data-state="active"] { background: var(--hjm-color-surface-alt); }
2193
+ .hjm-combobox__option[data-state="selected"] { color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2194
+ .hjm-combobox__option[data-state="disabled"] { opacity: 0.5; cursor: not-allowed; }
2195
+ .hjm-combobox__message { color: var(--hjm-color-text-muted); }
2196
+ .hjm-form__fieldset { min-inline-size: 0; margin: 0; padding: 0; border: 0; }
2197
+ .hjm-form__fields { display: grid; gap: var(--hjm-space-lg); }
2198
+ .hjm-form[data-density="compact"] .hjm-form__fields { gap: var(--hjm-space-sm); }
2199
+ .hjm-form__error { margin-block-start: var(--hjm-space-sm); color: var(--hjm-color-danger); }
2200
+ .hjm-form__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-space-sm); margin-block-start: var(--hjm-space-sm); }
2201
+
2202
+ /* Advanced display ------------------------------------------------------- */
2203
+ .hjm-timeline { display: grid; gap: var(--hjm-space-md); margin: 0; padding: 0; list-style: none; }
2204
+ .hjm-timeline__item { min-inline-size: 0; display: grid; grid-template-columns: 1rem minmax(0, 1fr); gap: var(--hjm-space-sm); }
2205
+ .hjm-timeline__rail { position: relative; display: flex; justify-content: center; }
2206
+ .hjm-timeline__dot { position: relative; z-index: 1; inline-size: 0.625rem; block-size: 0.625rem; margin-block-start: 0.25rem; border: 1px solid transparent; border-radius: var(--hjm-radius-full); background: var(--hjm-color-text-muted); }
2207
+ .hjm-timeline__item[data-tone="info"] .hjm-timeline__dot { border-color: var(--hjm-accent-info); background: var(--hjm-accent-info); }
2208
+ .hjm-timeline__item[data-tone="success"] .hjm-timeline__dot { border-color: var(--hjm-accent-success); background: var(--hjm-accent-success); }
2209
+ .hjm-timeline__item[data-tone="attention"] .hjm-timeline__dot { border-color: var(--hjm-accent-attention); background: var(--hjm-accent-attention); }
2210
+ .hjm-timeline__connector { position: absolute; inset-block: 0.875rem calc(-1 * var(--hjm-space-md)); inline-size: 1px; background: var(--hjm-color-border); }
2211
+ .hjm-timeline__content { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-block-end: var(--hjm-space-xxs); }
2212
+ .hjm-timeline__heading { min-inline-size: 0; display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--hjm-space-xxs) var(--hjm-space-sm); }
2213
+ .hjm-timeline__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); overflow-wrap: anywhere; }
2214
+ .hjm-timeline__timestamp { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
2215
+ .hjm-timeline__description { color: var(--hjm-color-text-body); white-space: pre-wrap; overflow-wrap: anywhere; }
2216
+ .hjm-accordion { border-block-start: 1px solid var(--hjm-color-border); }
2217
+ .hjm-accordion__item { border-block-end: 1px solid var(--hjm-color-border); }
2218
+ .hjm-accordion__header { margin: 0; }
2219
+ .hjm-accordion__trigger {
2220
+ inline-size: 100%;
2221
+ min-block-size: 3.5rem;
2222
+ display: flex;
2223
+ align-items: center;
2224
+ justify-content: space-between;
2225
+ gap: var(--hjm-space-sm);
2226
+ padding: var(--hjm-space-sm) var(--hjm-space-xs);
2227
+ border: 0;
2228
+ color: var(--hjm-color-text-body);
2229
+ background: transparent;
2230
+ font: inherit;
2231
+ font-weight: var(--hjm-font-weight-bold);
2232
+ text-align: start;
2233
+ cursor: pointer;
2234
+ }
2235
+ .hjm-accordion[data-density="compact"] .hjm-accordion__trigger { min-block-size: var(--hjm-control-min-touch-target); padding-block: var(--hjm-space-xs); }
2236
+ .hjm-accordion__trigger:hover { background: var(--hjm-color-surface-alt); }
2237
+ .hjm-accordion__trigger:disabled { opacity: 0.5; cursor: not-allowed; }
2238
+ .hjm-accordion__title { min-inline-size: 0; overflow-wrap: anywhere; }
2239
+ .hjm-accordion__indicator { flex: 0 0 auto; color: var(--hjm-color-text-muted); }
2240
+ .hjm-accordion__panel { padding: 0 var(--hjm-space-xs) var(--hjm-space-md); color: var(--hjm-color-text-body); overflow-wrap: anywhere; }
2241
+ .hjm-avatar {
2242
+ display: inline-grid;
2243
+ place-items: center;
2244
+ inline-size: 2.5rem;
2245
+ block-size: 2.5rem;
2246
+ overflow: hidden;
2247
+ border: 1px solid var(--hjm-color-border);
2248
+ border-radius: 50%;
2249
+ color: var(--hjm-color-text-muted);
2250
+ background: var(--hjm-color-surface-alt);
2251
+ font-weight: var(--hjm-font-weight-bold);
2252
+ }
2253
+ .hjm-avatar[data-size="small"] { inline-size: 2rem; block-size: 2rem; font-size: var(--hjm-type-label-size); }
2254
+ .hjm-avatar[data-size="large"] { inline-size: 3rem; block-size: 3rem; }
2255
+ .hjm-avatar[data-size="xlarge"] { inline-size: 4rem; block-size: 4rem; font-size: var(--hjm-type-title-size); }
2256
+ .hjm-avatar[data-shape="rounded"] { border-radius: var(--hjm-radius-md); }
2257
+ .hjm-avatar__image { inline-size: 100%; block-size: 100%; object-fit: cover; }
2258
+ .hjm-avatar__fallback { display: grid; place-items: center; inline-size: 100%; block-size: 100%; }
2259
+ .hjm-divider { flex: 0 0 auto; margin: 0; border: 0; background: var(--hjm-color-border); }
2260
+ .hjm-divider[data-orientation="horizontal"] { inline-size: 100%; block-size: 1px; }
2261
+ .hjm-divider[data-orientation="vertical"] { align-self: stretch; inline-size: 1px; min-block-size: var(--hjm-control-min-touch-target); }
2262
+ .hjm-divider[data-orientation="horizontal"][data-inset="start"] { margin-inline-start: var(--hjm-space-md); inline-size: calc(100% - var(--hjm-space-md)); }
2263
+ .hjm-divider[data-orientation="horizontal"][data-inset="both"] { margin-inline: var(--hjm-space-md); inline-size: calc(100% - (2 * var(--hjm-space-md))); }
2264
+ .hjm-description-list { display: grid; grid-template-columns: repeat(var(--hjm-description-columns), minmax(0, 1fr)); gap: var(--hjm-space-sm); margin: 0; }
2265
+ .hjm-description-list__item { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
2266
+ .hjm-description-list__label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-semibold); }
2267
+ .hjm-description-list__value { margin: 0; color: var(--hjm-color-text); overflow-wrap: anywhere; }
2268
+ .hjm-table-scroll { max-inline-size: 100%; overflow: auto; outline-offset: 2px; }
2269
+ .hjm-table { inline-size: 100%; border-collapse: collapse; color: var(--hjm-color-text-body); }
2270
+ .hjm-table__caption { padding: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-bold); text-align: start; }
2271
+ .hjm-table__header,
2272
+ .hjm-table__cell { padding: var(--hjm-space-sm); border-block-end: 1px solid var(--hjm-color-border); text-align: start; vertical-align: top; overflow-wrap: anywhere; }
2273
+ .hjm-table__header { color: var(--hjm-color-text); background: var(--hjm-color-surface-alt); }
2274
+ .hjm-table__header[data-align="center"], .hjm-table__cell[data-align="center"] { text-align: center; }
2275
+ .hjm-table__header[data-align="end"], .hjm-table__cell[data-align="end"] { text-align: end; }
2276
+ .hjm-table__row:hover { background: var(--hjm-color-surface-alt); }
2277
+ .hjm-table__sort { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); padding: var(--hjm-space-xxs); border: 0; color: inherit; background: transparent; font: inherit; font-weight: inherit; cursor: pointer; }
2278
+ .hjm-table__empty { padding: var(--hjm-space-xl); color: var(--hjm-color-text-muted); text-align: center; }
2279
+
2280
+ /* Web navigation --------------------------------------------------------- */
2281
+ .hjm-breadcrumb__list,
2282
+ .hjm-pagination__list { display: flex; align-items: center; flex-wrap: wrap; gap: var(--hjm-space-xxs); margin: 0; padding: 0; list-style: none; }
2283
+ .hjm-breadcrumb__item { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); min-inline-size: 0; }
2284
+ .hjm-breadcrumb__link { color: var(--hjm-color-text-muted); text-underline-offset: 0.18em; overflow-wrap: anywhere; }
2285
+ .hjm-breadcrumb__current { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); overflow-wrap: anywhere; }
2286
+ .hjm-breadcrumb__separator { color: var(--hjm-color-text-weak); }
2287
+ [dir="rtl"] .hjm-breadcrumb__separator[data-default="true"],
2288
+ [dir="rtl"] .hjm-pagination__previous > span,
2289
+ [dir="rtl"] .hjm-pagination__next > span { transform: scaleX(-1); }
2290
+ .hjm-pagination__item,
2291
+ .hjm-pagination__ellipsis {
2292
+ min-inline-size: var(--hjm-control-min-touch-target);
2293
+ min-block-size: var(--hjm-control-min-touch-target);
2294
+ display: grid;
2295
+ place-items: center;
2296
+ padding: var(--hjm-space-xs);
2297
+ border: 1px solid transparent;
2298
+ border-radius: var(--hjm-radius-md);
2299
+ }
2300
+ .hjm-pagination__item { color: var(--hjm-color-text-body); background: transparent; font: inherit; cursor: pointer; }
2301
+ .hjm-pagination__item:hover:not([aria-disabled="true"]) { background: var(--hjm-color-surface-alt); }
2302
+ .hjm-pagination__item[data-state="current"] { border-color: var(--hjm-color-content-brand); color: var(--hjm-color-content-brand); font-weight: var(--hjm-font-weight-bold); }
2303
+ .hjm-pagination__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2304
+ .hjm-pagination__ellipsis { color: var(--hjm-color-text-muted); }
2305
+ .hjm-load-more { display: grid; justify-items: center; gap: var(--hjm-space-sm); padding-block: var(--hjm-space-lg); text-align: center; }
2306
+ .hjm-load-more[data-density="compact"] { gap: var(--hjm-space-xs); padding-block: var(--hjm-space-sm); }
2307
+ .hjm-load-more__sentinel { inline-size: 1px; block-size: 1px; }
2308
+ .hjm-load-more__trigger { min-block-size: var(--hjm-control-min-touch-target); padding-inline: var(--hjm-space-md); border: 0; border-radius: var(--hjm-radius-md); color: var(--hjm-color-content-brand); background: transparent; font: inherit; font-weight: var(--hjm-font-weight-bold); cursor: pointer; }
2309
+ .hjm-load-more__status, .hjm-load-more__error { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--hjm-space-sm); color: var(--hjm-color-text-muted); }
2310
+ .hjm-load-more__error { color: var(--hjm-color-danger); }
2311
+ .hjm-load-more__end { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); }
2312
+ .hjm-load-more__spinner { inline-size: 1em; block-size: 1em; border: 2px solid var(--hjm-color-content-brand); border-inline-end-color: transparent; border-radius: 50%; animation: hjm-spin 800ms linear infinite; }
2313
+
2314
+ /* Expansion renderers --------------------------------------------------- */
2315
+ .hjm-steps { display: grid; grid-template-columns: repeat(var(--hjm-steps-count, auto-fit), minmax(0, 1fr)); gap: var(--hjm-space-xs); margin: 0; padding: 0; list-style: none; }
2316
+ .hjm-steps__step { min-inline-size: 0; display: grid; gap: var(--hjm-space-xs); }
2317
+ .hjm-steps__rail { display: flex; align-items: center; min-inline-size: 0; }
2318
+ .hjm-steps__indicator { flex: 0 0 auto; inline-size: 1.5rem; block-size: 1.5rem; display: grid; place-items: center; border: 1px solid var(--hjm-color-border); border-radius: 50%; color: var(--hjm-color-text-muted); background: var(--hjm-color-surface); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-font-weight-bold); }
2319
+ .hjm-steps__connector { flex: 1 1 auto; block-size: 1px; background: var(--hjm-color-border); }
2320
+ .hjm-steps__step[data-status="current"] .hjm-steps__indicator { border: 2px solid var(--hjm-color-content-brand); color: var(--hjm-color-content-brand); }
2321
+ .hjm-steps__step[data-status="complete"] .hjm-steps__indicator { border-color: var(--hjm-accent-success); color: var(--hjm-accent-success); background: var(--hjm-color-surface-alt); }
2322
+ .hjm-steps__step[data-status="complete"] .hjm-steps__connector { background: var(--hjm-color-content-brand); }
2323
+ .hjm-steps__step[data-status="error"] .hjm-steps__indicator { border: 2px solid var(--hjm-color-danger); color: var(--hjm-color-danger); background: var(--hjm-color-danger-fill); }
2324
+ .hjm-steps__copy { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-inline-end: var(--hjm-space-sm); }
2325
+ .hjm-steps__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); overflow-wrap: anywhere; }
2326
+ .hjm-steps__step[data-status="pending"] .hjm-steps__label { color: var(--hjm-color-text-muted); }
2327
+ .hjm-steps__step[data-status="error"] .hjm-steps__label { color: var(--hjm-color-danger); }
2328
+ .hjm-steps__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); overflow-wrap: anywhere; }
2329
+
2330
+ .hjm-file-picker { display: grid; gap: var(--hjm-space-xs); }
2331
+ .hjm-file-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
2332
+ .hjm-file-picker__dropzone { min-block-size: 8rem; display: grid; place-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-xl); border: 1px dashed var(--hjm-color-border); border-radius: var(--hjm-radius-lg); color: var(--hjm-color-text-muted); background: var(--hjm-color-surface); text-align: center; }
2333
+ .hjm-file-picker[data-dragging] .hjm-file-picker__dropzone { border-color: var(--hjm-color-focus); background: var(--hjm-color-surface-accent); }
2334
+ .hjm-file-picker__dropzone button { min-block-size: var(--hjm-control-min-touch-target); padding-inline: var(--hjm-space-md); border: 0; border-radius: var(--hjm-radius-md); color: var(--hjm-color-content-brand); background: transparent; font: inherit; font-weight: var(--hjm-font-weight-bold); cursor: pointer; }
2335
+ .hjm-file-picker__hint { color: var(--hjm-color-text-muted); }
2336
+ .hjm-file-picker__error { color: var(--hjm-color-danger); }
2337
+
2338
+ .hjm-upload-item { min-block-size: 4rem; display: flex; flex-wrap: wrap; align-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-sm) var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); }
2339
+ .hjm-upload-item__leading { flex: 0 0 auto; }
2340
+ .hjm-upload-item__body { min-inline-size: 0; flex: 1 1 14rem; display: grid; gap: var(--hjm-space-xxs); }
2341
+ .hjm-upload-item__name { color: var(--hjm-color-text-body); overflow-wrap: anywhere; unicode-bidi: plaintext; }
2342
+ .hjm-upload-item__meta, .hjm-upload-item__status { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); overflow-wrap: anywhere; unicode-bidi: plaintext; }
2343
+ .hjm-upload-item .hjm-progress__copy { flex-wrap: wrap; align-items: baseline; row-gap: var(--hjm-space-xxs); }
2344
+ .hjm-upload-item .hjm-progress__copy > span { min-inline-size: 0; unicode-bidi: plaintext; }
2345
+ .hjm-upload-item .hjm-progress__copy > span:first-child { flex: 0 0 auto; white-space: nowrap; }
2346
+ .hjm-upload-item .hjm-progress__copy > span:last-child:not(:first-child) { flex: 1 1 10rem; overflow-wrap: anywhere; text-align: end; }
2347
+ .hjm-upload-item[data-status="success"] .hjm-upload-item__status { color: var(--hjm-accent-success); }
2348
+ .hjm-upload-item[data-status="error"] .hjm-upload-item__status { color: var(--hjm-color-danger); }
2349
+ .hjm-upload-item__action { flex: 0 0 auto; min-inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); margin-inline-start: auto; padding-inline: var(--hjm-space-sm); border: 0; color: var(--hjm-color-content-brand); background: transparent; font: inherit; font-weight: var(--hjm-font-weight-bold); white-space: nowrap; word-break: keep-all; cursor: pointer; }
2350
+ .hjm-upload-item__action[data-action="cancel"] { color: var(--hjm-color-danger); }
2351
+
2352
+ .hjm-date-picker { display: grid; gap: var(--hjm-space-xs); }
2353
+ .hjm-date-picker__label { color: var(--hjm-color-text); font-weight: var(--hjm-font-weight-semibold); }
2354
+ .hjm-date-picker__anchor { position: relative; display: flex; align-items: center; }
2355
+ .hjm-date-picker__trigger { inline-size: 100%; min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; gap: var(--hjm-space-sm); padding-inline: var(--hjm-space-md) 3rem; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-surface); font: inherit; text-align: start; cursor: pointer; }
2356
+ .hjm-date-picker[data-size="large"] .hjm-date-picker__trigger { min-block-size: 3.5rem; padding-inline-start: var(--hjm-space-lg); }
2357
+ .hjm-date-picker[data-invalid] .hjm-date-picker__trigger { border-color: var(--hjm-color-danger); }
2358
+ .hjm-date-picker__trigger [data-placeholder] { color: var(--hjm-color-text-muted); }
2359
+ .hjm-date-picker__clear { position: absolute; inset-inline-end: 0; inline-size: var(--hjm-control-min-touch-target); block-size: var(--hjm-control-min-touch-target); border: 0; color: var(--hjm-color-text-muted); background: transparent; font: inherit; cursor: pointer; }
2360
+ .hjm-date-picker__popover { position: absolute; z-index: 800; inset-block-start: calc(100% + var(--hjm-space-xs)); inset-inline-start: 0; inline-size: min(22.5rem, calc(100vw - 2rem)); padding: var(--hjm-space-sm); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-lg); color: var(--hjm-color-text); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2361
+ .hjm-date-picker__description { color: var(--hjm-color-text-muted); }
2362
+ .hjm-date-picker__error { color: var(--hjm-color-danger); }
2363
+
2364
+ /* Toast ------------------------------------------------------------------ */
2365
+ .hjm-toast-viewport { position: fixed; z-index: 1200; inset-inline: max(var(--hjm-space-md), env(safe-area-inset-left)) max(var(--hjm-space-md), env(safe-area-inset-right)); display: flex; flex-direction: column; gap: var(--hjm-space-sm); max-inline-size: min(26.25rem, calc(100vw - (2 * var(--hjm-space-md)))); margin-inline: auto; pointer-events: none; }
2366
+ .hjm-toast-viewport[data-placement^="top"] { inset-block-start: max(var(--hjm-space-md), env(safe-area-inset-top)); }
2367
+ .hjm-toast-viewport[data-placement^="bottom"] { inset-block-end: calc(max(var(--hjm-space-md), env(safe-area-inset-bottom)) + var(--hjm-toast-bottom-offset, 0px)); flex-direction: column-reverse; }
2368
+ .hjm-toast-viewport[data-placement$="-start"] { margin-inline-start: 0; }
2369
+ .hjm-toast-viewport[data-placement$="-end"] { margin-inline-end: 0; }
2370
+ /* Cards stay narrow on desktop too; keep close/action rows explicit (docs/toast.md). */
2371
+ .hjm-toast { position: relative; min-inline-size: 0; min-block-size: 3.5rem; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); overflow: hidden; border: var(--hjm-toast-border-width) solid var(--hjm-toast-border); border-radius: var(--hjm-toast-radius); color: var(--hjm-color-text); background: var(--hjm-toast-background); box-shadow: var(--hjm-toast-shadow); pointer-events: auto; }
2372
+ .hjm-toast__tone-mark { position: absolute; inset-block: 0; inset-inline-start: 0; inline-size: 2px; background: var(--hjm-color-text-muted); }
2373
+ .hjm-toast[data-tone="info"] .hjm-toast__tone-mark, .hjm-toast[data-tone="info"] .hjm-toast__icon { color: var(--hjm-accent-info); background-color: var(--hjm-accent-info); }
2374
+ .hjm-toast[data-tone="success"] .hjm-toast__tone-mark, .hjm-toast[data-tone="success"] .hjm-toast__icon { color: var(--hjm-accent-success); background-color: var(--hjm-accent-success); }
2375
+ .hjm-toast[data-tone="warning"] .hjm-toast__tone-mark, .hjm-toast[data-tone="warning"] .hjm-toast__icon { color: var(--hjm-accent-warning); background-color: var(--hjm-accent-warning); }
2376
+ .hjm-toast[data-tone="danger"] .hjm-toast__tone-mark, .hjm-toast[data-tone="danger"] .hjm-toast__icon { color: var(--hjm-color-danger); background-color: var(--hjm-color-danger); }
2377
+ .hjm-toast__icon { grid-column: 1; grid-row: 1; display: grid; place-items: center; inline-size: 1.25rem; block-size: 1.25rem; border-radius: 50%; color: var(--hjm-color-text-muted); background: transparent !important; font-weight: var(--hjm-font-weight-bold); }
2378
+ .hjm-toast__content { grid-column: 2; grid-row: 1; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); overflow-wrap: anywhere; }
2379
+ .hjm-toast__action, .hjm-toast__close { min-block-size: var(--hjm-control-min-touch-target); border: 0; color: var(--hjm-color-content-brand); background: transparent; font: inherit; font-weight: var(--hjm-font-weight-bold); cursor: pointer; }
2380
+ .hjm-toast__close { grid-column: 3; grid-row: 1; align-self: start; inline-size: var(--hjm-control-min-touch-target); color: var(--hjm-color-text-muted); }
2381
+ .hjm-toast__action { grid-column: 2 / -1; grid-row: 2; justify-self: start; max-inline-size: 100%; overflow-wrap: anywhere; text-align: start; }
2382
+ .hjm-toast[data-state="closing"] { opacity: 0; transform: translateY(var(--hjm-space-xs)); transition: opacity var(--hjm-toast-exit-duration) var(--hjm-toast-exit-easing), transform var(--hjm-toast-exit-duration) var(--hjm-toast-exit-easing); }
2383
+
2384
+ .hjm-dialog__close:focus-visible,
2385
+ .hjm-menu__item:focus-visible,
2386
+ .hjm-combobox__option:focus-visible,
2387
+ .hjm-accordion__trigger:focus-visible,
2388
+ .hjm-table__sort:focus-visible,
2389
+ .hjm-breadcrumb__link:focus-visible,
2390
+ .hjm-pagination__item:focus-visible,
2391
+ .hjm-select__trigger:focus-visible,
2392
+ .hjm-load-more__trigger:focus-visible,
2393
+ .hjm-toast__action:focus-visible,
2394
+ .hjm-toast__close:focus-visible,
2395
+ .hjm-file-picker__dropzone button:focus-visible,
2396
+ .hjm-upload-item__action:focus-visible,
2397
+ .hjm-date-picker__trigger:focus-visible,
2398
+ .hjm-date-picker__clear:focus-visible,
2399
+ .hjm-table-scroll:focus-visible {
2400
+ outline: 2px solid var(--hjm-color-content-brand);
2401
+ outline-offset: 2px;
2402
+ }
2403
+
2404
+ @keyframes hjm-spin { to { transform: rotate(360deg); } }
2405
+ @keyframes hjm-pulse { from { opacity: var(--hjm-skeleton-from-opacity); } to { opacity: var(--hjm-skeleton-to-opacity); } }
2406
+
2407
+ .hjm-root[data-motion="reduced"] .hjm-button__spinner,
2408
+ .hjm-root[data-motion="reduced"] .hjm-spinner__glyph,
2409
+ .hjm-root[data-motion="reduced"] .hjm-skeleton,
2410
+ .hjm-root[data-motion="reduced"] .hjm-combobox__spinner {
2411
+ animation: none;
2412
+ }
2413
+ .hjm-root[data-motion="reduced"] .hjm-load-more__spinner,
2414
+ .hjm-root[data-motion="reduced"] .hjm-search-field__spinner:empty::before,
2415
+ .hjm-root[data-motion="reduced"] .hjm-select__busy-indicator,
2416
+ .hjm-root[data-motion="reduced"] .hjm-toast,
2417
+ .hjm-root[data-motion="reduced"] .hjm-slider__thumb,
2418
+ .hjm-root[data-motion="reduced"] .hjm-bottom-navigation__indicator > :first-child {
2419
+ animation: none;
2420
+ transition: none;
2421
+ }
2422
+
2423
+ @media (prefers-reduced-motion: reduce) {
2424
+ .hjm-button__spinner,
2425
+ .hjm-spinner__glyph,
2426
+ .hjm-skeleton,
2427
+ .hjm-combobox__spinner {
2428
+ animation: none;
2429
+ }
2430
+ .hjm-load-more__spinner,
2431
+ .hjm-search-field__spinner:empty::before,
2432
+ .hjm-select__busy-indicator { animation: none; }
2433
+ .hjm-toast,
2434
+ .hjm-slider__thumb,
2435
+ .hjm-bottom-navigation__indicator > :first-child { transition: none; }
2436
+ }
2437
+
2438
+ @media (max-width: 30rem) {
2439
+ .hjm-tabs[data-orientation="vertical"] { grid-template-columns: minmax(0, 1fr); }
2440
+ .hjm-tabs[data-orientation="vertical"] .hjm-tabs__list { flex-direction: row; overflow-x: auto; border-inline-end: 0; border-block-end: 1px solid var(--hjm-color-border); }
2441
+ }
2442
+
2443
+ /* TDS-inspired screen rhythm: shared Native recipes, content-driven height. See docs/screen-chrome.md. */
2444
+ /* Intrinsic action columns keep short labels readable at 320px; the title wraps
2445
+ in the remaining space instead of squeezing actions to equal-width tracks. */
2446
+ .hjm-top-bar { display: grid; grid-template-columns: minmax(var(--hjm-control-min-touch-target), auto) minmax(0, 1fr) minmax(var(--hjm-control-min-touch-target), auto); align-items: center; min-block-size: var(--hjm-top-bar-min-height); gap: var(--hjm-top-bar-gap); padding-inline: var(--hjm-top-bar-padding); padding-block-start: max(env(safe-area-inset-top, 0px), var(--hjm-top-bar-safe-area)); background: var(--hjm-color-bg); }
2447
+ .hjm-top-bar__leading, .hjm-top-bar__trailing { display: flex; flex-wrap: wrap; align-items: center; min-inline-size: 0; gap: var(--hjm-top-bar-gap); }
2448
+ .hjm-top-bar__trailing { justify-content: flex-end; }
2449
+ .hjm-top-bar__title { min-inline-size: 0; text-align: center; overflow-wrap: anywhere; }
2450
+ .hjm-top-bar__heading { margin: 0; font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-font-weight-bold); }
2451
+ .hjm-top-bar__heading > span { display: inline-flex; align-items: center; gap: var(--hjm-top-bar-gap); }
2452
+ .hjm-top-bar[data-centered="false"] { grid-template-columns: auto minmax(0, 1fr) auto; }
2453
+ .hjm-top-bar[data-centered="false"] .hjm-top-bar__title { text-align: start; }
2454
+ .hjm-top-bar[data-large-text="true"] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
2455
+ .hjm-top-bar[data-large-text="true"] .hjm-top-bar__title { grid-column: 1 / -1; grid-row: 2; padding-block: var(--hjm-space-xs); text-align: start; }
2456
+ .hjm-top-bar[data-large-text="true"] .hjm-top-bar__trailing { grid-column: 2; grid-row: 1; }
2457
+ .hjm-bottom-cta { display: grid; gap: var(--hjm-bottom-cta-gap); min-block-size: var(--hjm-bottom-cta-min-height); padding: var(--hjm-bottom-cta-padding-top) var(--hjm-bottom-cta-padding-inline) max(var(--hjm-bottom-cta-padding-bottom), env(safe-area-inset-bottom, 0px), var(--hjm-bottom-cta-safe-area)); border-block-start: 1px solid var(--hjm-color-border); background: var(--hjm-color-surface); }
2458
+ .hjm-bottom-cta[data-position="sticky"] { position: sticky; inset-block-end: 0; z-index: 1; }
2459
+ .hjm-bottom-cta__description { margin: 0; font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
2460
+ .hjm-bottom-cta__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-bottom-cta-gap); }
2461
+ .hjm-bottom-cta__actions > div { flex: 1 1 calc(var(--hjm-control-min-touch-target) * 3); min-inline-size: 0; }
2462
+ .hjm-bottom-cta__actions .hjm-button { inline-size: 100%; block-size: 100%; }
2463
+ .hjm-bottom-cta[data-large-text="true"] .hjm-bottom-cta__actions { flex-direction: column-reverse; }
2464
+ .hjm-bottom-cta[data-large-text="true"] .hjm-bottom-cta__actions > div { flex: initial; }
2465
+
2466
+ /* Controls remain outside the hidden track so keyboard users can reach every card. */
2467
+ .hjm-carousel { display: grid; gap: var(--hjm-space-sm); min-inline-size: 0; }
2468
+ .hjm-carousel__track, .hjm-carousel__slide { min-inline-size: 0; overflow-wrap: anywhere; }
2469
+ .hjm-carousel__slide[hidden] { display: none; }
2470
+ .hjm-carousel__slide input { max-inline-size: 100%; }
2471
+ .hjm-carousel__rotation { justify-self: start; }
2472
+ .hjm-carousel__controls, .hjm-carousel__dots { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--hjm-space-xs); }
2473
+ .hjm-carousel__dot { display: grid; place-items: center; min-inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); border: 0; border-radius: var(--hjm-radius-full); background: transparent; cursor: pointer; }
2474
+ .hjm-carousel__dot > span { inline-size: var(--hjm-space-xs); block-size: var(--hjm-space-xs); border-radius: var(--hjm-radius-full); background: var(--hjm-color-border); }
2475
+ .hjm-carousel__dot[data-current="true"] > span { background: var(--hjm-color-content-brand); }
2476
+ .hjm-carousel__dot:focus-visible { outline: 2px solid var(--hjm-color-content-brand); outline-offset: 2px; }
2477
+ /* Keep previous/next paired when scaled text would wrap only one to a new row. */
2478
+ .hjm-carousel[data-large-text="true"] .hjm-carousel__controls { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
2479
+ .hjm-carousel[data-large-text="true"] .hjm-carousel__dots { grid-column: 1 / -1; grid-row: 1; }
2480
+ .hjm-carousel[data-large-text="true"] .hjm-carousel__controls > .hjm-button { grid-row: 2; }
2481
+
2482
+ /* The viewport action follows the content in DOM order. Its measured clearance
2483
+ belongs on the scroll content, not on the fixed button (docs/floating-action-button.md). */
2484
+ .hjm-fab { position: fixed; z-index: 500; inset-inline-end: max(var(--hjm-fab-margin), env(safe-area-inset-right, 0px)); inset-block-end: calc(var(--hjm-fab-margin) + max(var(--hjm-fab-safe-area), env(safe-area-inset-bottom, 0px))); max-inline-size: calc(100% - var(--hjm-fab-margin) * 2); min-block-size: var(--hjm-fab-diameter); }
2485
+ .hjm-fab__icon { display: flex; flex: 0 0 auto; align-items: center; justify-content: center; }
2486
+ .hjm-fab[data-direction="rtl"] { inset-inline-end: max(var(--hjm-fab-margin), env(safe-area-inset-left, 0px)); }
2487
+ .hjm-fab[data-mode="collapsed"] { inline-size: var(--hjm-fab-diameter); padding-inline: 0; gap: 0; }
2488
+ .hjm-fab[data-mode="collapsed"] .hjm-button__label { display: none; }
2489
+ .hjm-fab[data-mode="expanded"] .hjm-button__label { animation: hjm-fab-label-in var(--hjm-fab-duration) var(--hjm-fab-easing); }
2490
+ .hjm-fab[data-reduced-motion="true"] .hjm-button__label { animation: none; }
2491
+ @keyframes hjm-fab-label-in { from { opacity: 0; } to { opacity: 1; } }
2492
+
2493
+ /* Keep the seven-column spatial model and minimum targets; narrow hosts scroll
2494
+ the grid instead of shrinking dates or wrapping a week onto another row. */
2495
+ .hjm-calendar { display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
2496
+ .hjm-calendar__header { display: grid; grid-template-columns: var(--hjm-control-min-touch-target) minmax(0, 1fr) var(--hjm-control-min-touch-target); align-items: center; gap: var(--hjm-space-xs); }
2497
+ .hjm-calendar__header strong { text-align: center; overflow-wrap: anywhere; font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-font-weight-bold); }
2498
+ .hjm-calendar__header button { min-block-size: var(--hjm-control-min-touch-target); border: 0; border-radius: var(--hjm-radius-full); background: transparent; color: var(--hjm-color-text-body); font: inherit; cursor: pointer; }
2499
+ .hjm-calendar__viewport { overflow-x: auto; padding: var(--hjm-space-xxs); }
2500
+ .hjm-calendar__grid { min-inline-size: calc(7 * var(--hjm-calendar-cell-size)); }
2501
+ .hjm-calendar__week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
2502
+ .hjm-calendar__weekday { padding-block: var(--hjm-space-xs); text-align: center; color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); overflow-wrap: anywhere; }
2503
+ .hjm-calendar__day { display: grid; justify-items: center; align-content: start; gap: var(--hjm-space-xxs); min-inline-size: var(--hjm-calendar-cell-size); min-block-size: var(--hjm-calendar-cell-size); padding: 0; border: 0; border-radius: var(--hjm-radius-full); background: transparent; color: var(--hjm-color-text-body); font: inherit; font-variant-numeric: tabular-nums; cursor: pointer; }
2504
+ .hjm-calendar__day[data-today] .hjm-calendar__day-label { border-color: var(--hjm-color-focus); }
2505
+ .hjm-calendar__day[data-selected] .hjm-calendar__day-label { background: var(--hjm-color-primary); color: var(--hjm-color-on-primary); }
2506
+ .hjm-calendar__day[data-outside] { opacity: var(--hjm-calendar-outside-opacity); }
2507
+ .hjm-calendar__day[data-disabled] { opacity: var(--hjm-calendar-disabled-opacity); cursor: not-allowed; }
2508
+ .hjm-calendar__content { max-inline-size: 100%; min-block-size: var(--hjm-type-label-line-height); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); overflow-wrap: anywhere; }
2509
+ .hjm-calendar__header button:focus-visible, .hjm-calendar__day:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2510
+ .hjm-date-picker__calendar-close { display: block; margin-inline-start: auto; inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); border: 0; border-radius: var(--hjm-radius-full); background: transparent; color: inherit; font: inherit; cursor: pointer; }
2511
+ .hjm-date-picker__calendar-close:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2512
+
2513
+ /* Reserve a common annotation row; dates with a dot must not sit above their neighbours. */
2514
+ .hjm-calendar__day-label { display: grid; place-items: center; inline-size: var(--hjm-calendar-cell-size); min-block-size: var(--hjm-calendar-cell-size); border: 1px solid transparent; border-radius: var(--hjm-radius-full); }
2515
+
2516
+ .hjm-calendar__day-label { font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
2517
+ .hjm-calendar[data-size="large"] .hjm-calendar__day-label { font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
2518
+
2519
+ .hjm-breadcrumb, .hjm-pagination { min-inline-size: 0; }
2520
+ .hjm-breadcrumb__item { max-inline-size: 100%; }
2521
+ .hjm-breadcrumb__separator { flex-shrink: 0; }
2522
+
2523
+ .hjm-anchor { min-inline-size: 0; }
2524
+ .hjm-anchor__list { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); list-style: none; margin: 0; padding: 0; }
2525
+ .hjm-anchor__link { display: block; padding: var(--hjm-space-xs); border-inline-start: 2px solid transparent; color: var(--hjm-color-text-muted); text-decoration: none; overflow-wrap: anywhere; }
2526
+ .hjm-anchor__link:hover { text-decoration: underline; text-underline-offset: 0.18em; }
2527
+ .hjm-anchor__link[aria-current="location"] { color: var(--hjm-color-content-brand); border-color: var(--hjm-color-focus); font-weight: var(--hjm-font-weight-bold); }
2528
+ .hjm-anchor__link:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2529
+ .hjm-anchor[data-orientation="horizontal"] .hjm-anchor__list { flex-direction: row; flex-wrap: wrap; }
2530
+ .hjm-anchor[data-orientation="horizontal"] .hjm-anchor__link { border-inline-start: 0; border-block-end: 2px solid transparent; }
2531
+ .hjm-anchor[data-orientation="horizontal"] .hjm-anchor__link[aria-current="location"] { border-block-end-color: var(--hjm-color-focus); }
2532
+
2533
+ /* A contextual form uses the shared floating surface and body typography. Logical
2534
+ sizing preserves long translations and lets the positioning hook cap the viewport. */
2535
+ .hjm-popover { box-sizing: border-box; inline-size: var(--hjm-popover-max-width); overflow: auto; overscroll-behavior: contain; padding: var(--hjm-space-sm); border: var(--hjm-stroke-default) solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); color: var(--hjm-color-text-body); pointer-events: auto; animation: hjm-popover-in var(--hjm-popover-duration) var(--hjm-popover-easing); }
2536
+ .hjm-popover[data-state="closed"] { pointer-events: none; animation-name: hjm-popover-out; }
2537
+ .hjm-popover__header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--hjm-space-xs); }
2538
+ .hjm-popover__title { flex: 1 1 50%; min-inline-size: 0; margin: 0; font-size: var(--hjm-type-body-size); font-weight: var(--hjm-font-weight-bold); line-height: var(--hjm-type-body-line-height); overflow-wrap: anywhere; }
2539
+ .hjm-popover__description { margin-block: var(--hjm-space-xs) var(--hjm-space-md); color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
2540
+ .hjm-popover__body { min-inline-size: 0; padding-block-start: var(--hjm-space-xs); overflow-wrap: anywhere; }
2541
+ .hjm-popover:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2542
+ @keyframes hjm-popover-in { from { opacity: 0; } to { opacity: 1; } }
2543
+ @keyframes hjm-popover-out { from { opacity: 1; } to { opacity: 0; } }
2544
+
2545
+ /* Disclosure, context menu, menubar --------------------------------------- */
2546
+ .hjm-collapsible { display: grid; gap: var(--hjm-collapsible-gap); min-inline-size: 0; }
2547
+ .hjm-collapsible__trigger { inline-size: 100%; min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) 0; border: 0; background: transparent; color: var(--hjm-color-text-body); font: inherit; text-align: start; cursor: pointer; }
2548
+ .hjm-collapsible__trigger:disabled { opacity: 0.5; cursor: not-allowed; }
2549
+ .hjm-collapsible__trigger:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2550
+ /* The marker is decoration: aria-expanded carries the state, so it only needs
2551
+ to keep one box while the glyph changes. */
2552
+ .hjm-collapsible__marker { flex: 0 0 auto; inline-size: 1em; color: var(--hjm-color-text-muted); text-align: center; }
2553
+ .hjm-collapsible__content { min-inline-size: 0; overflow-wrap: anywhere; }
2554
+
2555
+ /* Both surfaces reuse the menu's floating look; only the anchor differs. */
2556
+ .hjm-context-menu-host { min-inline-size: 0; }
2557
+ .hjm-context-menu-host:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2558
+ .hjm-context-menu { position: fixed; max-inline-size: min(24rem, 90vw); max-block-size: calc(100dvh - (2 * var(--hjm-space-md))); overflow: auto; padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2559
+ .hjm-context-menu__item { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-body); cursor: pointer; }
2560
+ .hjm-context-menu__item[data-active] { background: var(--hjm-color-surface-alt); }
2561
+ .hjm-context-menu__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2562
+ .hjm-context-menu__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2563
+ .hjm-context-menu__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2564
+
2565
+ .hjm-menubar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hjm-menubar-gap); min-block-size: var(--hjm-menubar-min-height); padding-inline: var(--hjm-menubar-padding); }
2566
+ .hjm-menubar__menu { position: relative; }
2567
+ .hjm-menubar__label { min-block-size: var(--hjm-control-min-touch-target); padding-inline: var(--hjm-menubar-label-padding); border: 0; border-radius: var(--hjm-menubar-label-radius); background: transparent; color: var(--hjm-color-text-body); font: inherit; cursor: pointer; }
2568
+ .hjm-menubar__label[data-open] { background: var(--hjm-color-surface-accent); }
2569
+ .hjm-menubar__label:disabled { opacity: 0.5; cursor: not-allowed; }
2570
+ .hjm-menubar__label:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
2571
+ .hjm-menubar__panel { position: absolute; inset-block-start: 100%; inset-inline-start: 0; z-index: 900; min-inline-size: 13.75rem; max-inline-size: min(24rem, 90vw); padding: var(--hjm-space-xxs); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); }
2572
+ .hjm-menubar__item { min-block-size: var(--hjm-control-min-touch-target); display: flex; align-items: center; justify-content: space-between; gap: var(--hjm-space-sm); padding: var(--hjm-space-xs) var(--hjm-space-sm); border-radius: var(--hjm-radius-sm); color: var(--hjm-color-text-body); cursor: pointer; }
2573
+ .hjm-menubar__item[data-active] { background: var(--hjm-color-surface-alt); }
2574
+ .hjm-menubar__item[data-tone="danger"] { color: var(--hjm-color-danger); }
2575
+ .hjm-menubar__item[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
2576
+ .hjm-menubar__shortcut { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); }
2577
+
2578
+ /* Asset frame ------------------------------------------------------------ */
2579
+ .hjm-asset { position: relative; display: inline-flex; flex: 0 0 auto; }
2580
+ .hjm-asset__frame { inline-size: var(--hjm-asset-size); block-size: var(--hjm-asset-size); display: grid; place-items: center; overflow: hidden; border: var(--hjm-stroke-default) solid var(--hjm-color-border); border-radius: var(--hjm-asset-radius); background: var(--hjm-color-surface-alt); }
2581
+ .hjm-asset__media { inline-size: 100%; block-size: 100%; display: grid; place-items: center; }
2582
+ .hjm-asset__media > * { max-inline-size: 100%; max-block-size: 100%; }
2583
+ /* The accessory hangs off the outer corner so it never covers the frame's middle. */
2584
+ .hjm-asset__accessory { position: absolute; inset-block-end: var(--hjm-asset-accessory-offset); inset-inline-end: var(--hjm-asset-accessory-offset); transform: translate(25%, 25%); display: inline-flex; }
2585
+ .hjm-asset-group { display: inline-flex; align-items: center; }
2586
+ .hjm-asset-group > .hjm-asset + .hjm-asset { margin-inline-start: var(--hjm-asset-overlap); }
2587
+
2588
+ }