@hjmds/react 1.34.0 → 1.35.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.
- package/dist/actions.d.ts +23 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +61 -6
- package/dist/actions.js.map +1 -1
- package/dist/advanced-display.d.ts +35 -2
- package/dist/advanced-display.d.ts.map +1 -1
- package/dist/advanced-display.js +28 -9
- package/dist/advanced-display.js.map +1 -1
- package/dist/anchor.d.ts +3 -1
- package/dist/anchor.d.ts.map +1 -1
- package/dist/anchor.js +5 -5
- package/dist/anchor.js.map +1 -1
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +5 -2
- package/dist/auth-screen.js.map +1 -1
- package/dist/avatar-blobatar-motion.d.ts.map +1 -1
- package/dist/avatar-blobatar-motion.js +2 -1
- package/dist/avatar-blobatar-motion.js.map +1 -1
- package/dist/avatar-blobatar.d.ts.map +1 -1
- package/dist/avatar-blobatar.js +2 -1
- package/dist/avatar-blobatar.js.map +1 -1
- package/dist/bottom-cta.d.ts +8 -1
- package/dist/bottom-cta.d.ts.map +1 -1
- package/dist/bottom-cta.js +6 -2
- package/dist/bottom-cta.js.map +1 -1
- package/dist/carousel-motion.d.ts.map +1 -1
- package/dist/carousel-motion.js +11 -2
- package/dist/carousel-motion.js.map +1 -1
- package/dist/carousel.d.ts +10 -0
- package/dist/carousel.d.ts.map +1 -1
- package/dist/carousel.js +23 -7
- package/dist/carousel.js.map +1 -1
- package/dist/collapsible.d.ts +6 -0
- package/dist/collapsible.d.ts.map +1 -1
- package/dist/collapsible.js +22 -20
- package/dist/collapsible.js.map +1 -1
- package/dist/collection-rail.d.ts +4 -4
- package/dist/collection-rail.d.ts.map +1 -1
- package/dist/collection-rail.js.map +1 -1
- package/dist/conversation-row.d.ts.map +1 -1
- package/dist/conversation-row.js +4 -1
- package/dist/conversation-row.js.map +1 -1
- package/dist/data-table.d.ts +2 -0
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +2 -2
- package/dist/data-table.js.map +1 -1
- package/dist/display.d.ts +60 -5
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js +32 -9
- package/dist/display.js.map +1 -1
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +2 -1
- package/dist/evidence.js.map +1 -1
- package/dist/feedback.d.ts +5 -0
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +7 -5
- package/dist/feedback.js.map +1 -1
- package/dist/floating-action-button.js +1 -1
- package/dist/floating-action-button.js.map +1 -1
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +4 -4
- package/dist/forms.js.map +1 -1
- package/dist/image-choice.js +3 -3
- package/dist/image-choice.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/internal/initial-focus.d.ts +6 -0
- package/dist/internal/initial-focus.d.ts.map +1 -1
- package/dist/internal/initial-focus.js +6 -0
- package/dist/internal/initial-focus.js.map +1 -1
- package/dist/internal/pending-content.d.ts +19 -0
- package/dist/internal/pending-content.d.ts.map +1 -0
- package/dist/internal/pending-content.js +34 -0
- package/dist/internal/pending-content.js.map +1 -0
- package/dist/internal/screen-footer.d.ts +4 -2
- package/dist/internal/screen-footer.d.ts.map +1 -1
- package/dist/internal/screen-footer.js +2 -2
- package/dist/internal/screen-footer.js.map +1 -1
- package/dist/internal.d.ts +9 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +4 -0
- package/dist/internal.js.map +1 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +58 -4
- package/dist/navigation.js.map +1 -1
- package/dist/number-field.d.ts.map +1 -1
- package/dist/number-field.js +4 -3
- package/dist/number-field.js.map +1 -1
- package/dist/overlays.d.ts +4 -0
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +46 -18
- package/dist/overlays.js.map +1 -1
- package/dist/public-exports.generated.d.ts +6 -0
- package/dist/public-exports.generated.d.ts.map +1 -1
- package/dist/public-exports.generated.js +18 -0
- package/dist/public-exports.generated.js.map +1 -1
- package/dist/screen-flows.d.ts +12 -5
- package/dist/screen-flows.d.ts.map +1 -1
- package/dist/screen-flows.js +25 -14
- package/dist/screen-flows.js.map +1 -1
- package/dist/screens.d.ts +18 -5
- package/dist/screens.d.ts.map +1 -1
- package/dist/screens.js +22 -11
- package/dist/screens.js.map +1 -1
- package/dist/selection.d.ts +22 -0
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +32 -9
- package/dist/selection.js.map +1 -1
- package/dist/shortcut-rail.d.ts +27 -0
- package/dist/shortcut-rail.d.ts.map +1 -0
- package/dist/shortcut-rail.js +37 -0
- package/dist/shortcut-rail.js.map +1 -0
- package/dist/steps.d.ts +5 -2
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +3 -3
- package/dist/steps.js.map +1 -1
- package/dist/styles.css +223 -48
- package/dist/styles.layered.css +223 -48
- package/dist/task-list.d.ts +3 -1
- package/dist/task-list.d.ts.map +1 -1
- package/dist/task-list.js +2 -2
- package/dist/task-list.js.map +1 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +1 -0
- package/dist/theme.js.map +1 -1
- package/dist/time-picker.d.ts +9 -0
- package/dist/time-picker.d.ts.map +1 -0
- package/dist/time-picker.js +74 -0
- package/dist/time-picker.js.map +1 -0
- package/dist/top-bar.d.ts +4 -0
- package/dist/top-bar.d.ts.map +1 -1
- package/dist/top-bar.js +2 -2
- package/dist/top-bar.js.map +1 -1
- package/package.json +26 -15
package/dist/styles.layered.css
CHANGED
|
@@ -229,6 +229,7 @@
|
|
|
229
229
|
cursor: pointer;
|
|
230
230
|
}
|
|
231
231
|
.hjm-button {
|
|
232
|
+
text-decoration: none;
|
|
232
233
|
position: relative;
|
|
233
234
|
min-block-size: var(--hjm-control-button-medium);
|
|
234
235
|
padding: var(--hjm-space-xs) var(--hjm-space-md);
|
|
@@ -277,10 +278,23 @@
|
|
|
277
278
|
버튼인지 잃고, 무제한 줄바꿈은 하단 CTA 행 같은 남의 레이아웃을 밀어낸다. */
|
|
278
279
|
.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; }
|
|
279
280
|
/* Keep the original content in layout for stable width; the sole visible busy cue sits at the frame center. */
|
|
280
|
-
.hjm-button[data-state="loading"] > :not(.hjm-button__loading-indicator)
|
|
281
|
+
.hjm-button[data-state="loading"] > :not(.hjm-button__loading-indicator):not(.hjm-button__face),
|
|
282
|
+
.hjm-button[data-state="loading"] > .hjm-button__face > :not(.hjm-button__loading-indicator) { opacity: 0; }
|
|
281
283
|
.hjm-button__loading-indicator { position: absolute; inset: 0; display: grid; place-items: center; pointer-events: none; }
|
|
282
284
|
/* 큰 글자 설정에서는 상한을 푼다 — 사용자가 키운 글자를 잘라 내용을 숨기면 WCAG 1.4.4다. */
|
|
283
285
|
[data-large-text="true"] .hjm-button__label { display: block; overflow: visible; }
|
|
286
|
+
/* The root stays still as the face sinks, preserving the original pointer/focus target. */
|
|
287
|
+
.hjm-button[data-full-width="true"] { inline-size: 100%; }
|
|
288
|
+
.hjm-button[data-tone="primary"] { --hjm-button-face-fill: var(--hjm-color-primary); }
|
|
289
|
+
.hjm-button[data-tone="secondary"] { --hjm-button-face-fill: var(--hjm-color-bg); --hjm-button-face-border: var(--hjm-color-border-control); }
|
|
290
|
+
.hjm-button[data-tone="danger"] { --hjm-button-face-fill: var(--hjm-color-danger-fill); }
|
|
291
|
+
.hjm-button[data-selected="true"] { --hjm-button-face-fill: var(--hjm-color-bg); --hjm-button-face-border: transparent; }
|
|
292
|
+
.hjm-button[data-raised="true"] { padding: 0 0 var(--hjm-button-depth); border: 0; gap: 0; flex-direction: column; background: color-mix(in srgb, var(--hjm-button-side), #000 var(--hjm-button-side-shade)); }
|
|
293
|
+
.hjm-button__face { position: relative; display: flex; box-sizing: border-box; inline-size: 100%; min-block-size: inherit; flex: 1; align-items: center; justify-content: inherit; gap: var(--hjm-space-xs); padding: var(--hjm-space-xs) var(--hjm-button-face-padding); border: 1px solid var(--hjm-button-face-border, transparent); border-radius: inherit; background: var(--hjm-button-face-fill); transition: transform var(--hjm-button-settle) ease-out; }
|
|
294
|
+
.hjm-button[data-raised="true"]:active:not(:disabled):not([aria-disabled="true"]) { opacity: 1; }
|
|
295
|
+
.hjm-button[data-raised="true"]:active:not(:disabled):not([aria-disabled="true"]) > .hjm-button__face { transform: translateY(var(--hjm-button-depth)); }
|
|
296
|
+
@media (prefers-reduced-motion: reduce) { .hjm-button__face { transition: none; } }
|
|
297
|
+
[data-reduced-motion="true"] .hjm-button__face { transition: none; }
|
|
284
298
|
.hjm-button__spinner,
|
|
285
299
|
.hjm-spinner__glyph {
|
|
286
300
|
display: inline-block;
|
|
@@ -350,11 +364,12 @@
|
|
|
350
364
|
font-family: var(--hjm-font-family-ui, inherit); display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
|
|
351
365
|
.hjm-field__label { color: var(--hjm-color-text-body); font-weight: var(--hjm-text-emphasis-medium); }
|
|
352
366
|
.hjm-field__control {
|
|
367
|
+
--hjm-field-resolved-border-width: var(--hjm-field-border-width);
|
|
353
368
|
display: flex;
|
|
354
369
|
align-items: center;
|
|
355
370
|
min-block-size: var(--hjm-control-field-height);
|
|
356
371
|
padding-inline: var(--hjm-space-md);
|
|
357
|
-
border: var(--hjm-field-border-width) solid var(--hjm-color-border-control);
|
|
372
|
+
border: var(--hjm-field-resolved-border-width) solid var(--hjm-color-border-control);
|
|
358
373
|
border-radius: var(--hjm-radius-md);
|
|
359
374
|
background: var(--hjm-color-bg);
|
|
360
375
|
}
|
|
@@ -366,7 +381,9 @@
|
|
|
366
381
|
reads as hue only. The wider ring makes it a shape change like every other control.
|
|
367
382
|
See issue #19. */
|
|
368
383
|
.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); }
|
|
369
|
-
|
|
384
|
+
/* Validation remains visible when availability is disabled; support text and aria-invalid keep their existing contracts. */
|
|
385
|
+
.hjm-field[data-state="invalid"] .hjm-field__control,
|
|
386
|
+
.hjm-field[data-invalid="true"] .hjm-field__control { border-color: var(--hjm-color-danger); --hjm-field-resolved-border-width: var(--hjm-field-invalid-border-width); }
|
|
370
387
|
/* fieldRecipe.disabledScope (2026-10-06): disabled fades the label and the control, not
|
|
371
388
|
the hint or the error, which explain why the field is locked or what to fix. Fading the
|
|
372
389
|
whole frame (the rule before) took their contrast down with it. Every direct child except
|
|
@@ -374,10 +391,11 @@
|
|
|
374
391
|
recipe value (Select, NumberField, OtpField, SearchField, PasswordField) arrives as an
|
|
375
392
|
inline --hjm-field-disabled-opacity on the root. */
|
|
376
393
|
.hjm-field[data-state="disabled"] > :not(.hjm-field__description):not(.hjm-field__error):not([data-hjm-field-error]) { opacity: var(--hjm-field-disabled-opacity); }
|
|
394
|
+
/* The editable minimum excludes both resolved borders, keeping the field footprint stable in invalid state. */
|
|
377
395
|
.hjm-field__input {
|
|
378
396
|
inline-size: 100%;
|
|
379
397
|
min-inline-size: 0;
|
|
380
|
-
min-block-size: calc(var(--hjm-control-field-height) -
|
|
398
|
+
min-block-size: calc(var(--hjm-control-field-height) - 2 * var(--hjm-field-resolved-border-width));
|
|
381
399
|
padding-block: var(--hjm-space-xs);
|
|
382
400
|
border: 0;
|
|
383
401
|
outline: 0;
|
|
@@ -394,7 +412,7 @@
|
|
|
394
412
|
.hjm-field__control--multiline { min-block-size: var(--hjm-field-multiline-min-height); align-items: stretch; }
|
|
395
413
|
.hjm-field__control--multiline textarea {
|
|
396
414
|
min-block-size: max(
|
|
397
|
-
calc(var(--hjm-field-multiline-min-height) -
|
|
415
|
+
calc(var(--hjm-field-multiline-min-height) - 2 * var(--hjm-field-resolved-border-width)),
|
|
398
416
|
calc(var(--hjm-field-min-visible-lines, 0) * var(--hjm-type-body-line-height) + var(--hjm-field-padding-block) * 2)
|
|
399
417
|
);
|
|
400
418
|
max-block-size: calc(
|
|
@@ -412,7 +430,7 @@
|
|
|
412
430
|
so clearing has one localized name, onClear callback and focus-restoration path. */
|
|
413
431
|
.hjm-search-field input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; display: none; }
|
|
414
432
|
.hjm-search-field:has(.hjm-field__input[data-size="large"]) .hjm-field__control { min-block-size: var(--hjm-control-button-large); padding-inline: var(--hjm-search-field-padding-large, var(--hjm-space-md)); gap: var(--hjm-search-field-gap-large, var(--hjm-space-sm)); }
|
|
415
|
-
.hjm-search-field .hjm-field__input[data-size="large"] { min-block-size: calc(var(--hjm-control-button-large) -
|
|
433
|
+
.hjm-search-field .hjm-field__input[data-size="large"] { min-block-size: calc(var(--hjm-control-button-large) - 2 * var(--hjm-field-resolved-border-width)); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
|
|
416
434
|
/* The visible circle is the recipe diameter; ::after extends the hit area by clearHitSlop so the target stays 44. */
|
|
417
435
|
.hjm-search-field__clear { --hjm-search-clear-slop: var(--hjm-search-field-clear-slop-medium, 4px); position: relative; flex: 0 0 auto; inline-size: var(--hjm-search-field-clear-medium, 36px); block-size: var(--hjm-search-field-clear-medium, 36px); display: inline-grid; place-items: center; border: 0; border-radius: 50%; color: inherit; background: transparent; font: inherit; cursor: pointer; }
|
|
418
436
|
.hjm-search-field__clear::after { content: ""; position: absolute; inset: calc(-1 * var(--hjm-search-clear-slop)); border-radius: 50%; }
|
|
@@ -420,7 +438,7 @@
|
|
|
420
438
|
.hjm-search-field__spinner { inline-size: 32px; block-size: 32px; display: inline-grid; place-items: center; color: var(--hjm-color-content-brand); }
|
|
421
439
|
.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; }
|
|
422
440
|
.hjm-password-field--large .hjm-field__control { min-block-size: var(--hjm-control-button-large); padding-inline: var(--hjm-space-lg); }
|
|
423
|
-
.hjm-password-field--large .hjm-field__input { min-block-size: calc(var(--hjm-control-button-large) -
|
|
441
|
+
.hjm-password-field--large .hjm-field__input { min-block-size: calc(var(--hjm-control-button-large) - 2 * var(--hjm-field-resolved-border-width)); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
|
|
424
442
|
.hjm-password-field__toggle {
|
|
425
443
|
position: relative;
|
|
426
444
|
flex: 0 0 var(--hjm-control-min-touch-target);
|
|
@@ -644,7 +662,7 @@
|
|
|
644
662
|
font-variant-numeric: tabular-nums;
|
|
645
663
|
}
|
|
646
664
|
.hjm-number-field[data-size="large"] .hjm-number-field__input {
|
|
647
|
-
min-block-size: calc(var(--hjm-control-button-large) -
|
|
665
|
+
min-block-size: calc(var(--hjm-control-button-large) - 2 * var(--hjm-field-resolved-border-width));
|
|
648
666
|
padding-inline: var(--hjm-space-xs);
|
|
649
667
|
font-size: var(--hjm-type-body-large-size);
|
|
650
668
|
line-height: var(--hjm-type-body-large-line-height);
|
|
@@ -815,16 +833,24 @@
|
|
|
815
833
|
.hjm-choice__copy { display: grid; gap: var(--hjm-space-xxs); padding-block: 2px; }
|
|
816
834
|
.hjm-choice[data-state="checked"] .hjm-choice__copy > :first-child,
|
|
817
835
|
.hjm-choice[data-state="mixed"] .hjm-choice__copy > :first-child { font-weight: var(--hjm-font-weight-semibold); }
|
|
818
|
-
|
|
819
|
-
.hjm-radio-group
|
|
836
|
+
/* Native groups have no outer inset; remove the browser fieldset margin so sibling content shares one edge. */
|
|
837
|
+
.hjm-radio-group { margin: 0; min-inline-size: 0; padding: 0; border: 0; }
|
|
838
|
+
.hjm-radio-group legend { padding: 0; margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
|
|
820
839
|
.hjm-radio-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
|
|
821
840
|
.hjm-radio-group[data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-xxs); }
|
|
822
841
|
.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-bg); }
|
|
823
842
|
.hjm-radio-group[data-orientation="horizontal"] .hjm-radio-group__items { flex-direction: row; flex-wrap: wrap; gap: var(--hjm-space-md); }
|
|
824
843
|
.hjm-radio-group[data-orientation="horizontal"][data-presentation="plain"] .hjm-radio-group__items { gap: var(--hjm-space-sm); }
|
|
825
844
|
.hjm-radio-group[data-orientation="horizontal"][data-presentation="grouped"] .hjm-radio-group__items { gap: 0; }
|
|
845
|
+
/* Radio option actions are siblings of the label, never nested interactive controls. */
|
|
846
|
+
.hjm-choice.hjm-choice--with-action { padding: 0; gap: 0; }
|
|
847
|
+
.hjm-choice__target { display: flex; align-items: center; align-self: stretch; flex: 1; min-inline-size: 0; min-block-size: inherit; gap: var(--hjm-space-sm); padding: var(--hjm-space-sm) var(--hjm-space-md); cursor: inherit; }
|
|
848
|
+
.hjm-choice[data-size="small"] > .hjm-choice__target { gap: var(--hjm-space-xs); padding: var(--hjm-space-xs) var(--hjm-space-sm); }
|
|
849
|
+
.hjm-choice[data-presentation="plain"] > .hjm-choice__target { padding: 0; }
|
|
850
|
+
.hjm-choice__action { flex: 0 0 auto; padding-inline-end: var(--hjm-space-xs); }
|
|
851
|
+
.hjm-choice__target .hjm-choice__copy { min-inline-size: 0; overflow-wrap: anywhere; }
|
|
826
852
|
.hjm-checkbox-group { min-inline-size: 0; margin: 0; padding: 0; border: 0; }
|
|
827
|
-
.hjm-checkbox-group legend { margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
|
|
853
|
+
.hjm-checkbox-group legend { padding: 0; margin-block-end: var(--hjm-space-xs); font-weight: var(--hjm-text-emphasis-medium); }
|
|
828
854
|
.hjm-checkbox-group__items { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
|
|
829
855
|
.hjm-checkbox-group[data-presentation="plain"] .hjm-checkbox-group__items { gap: var(--hjm-space-xxs); }
|
|
830
856
|
.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-bg); }
|
|
@@ -846,6 +872,18 @@
|
|
|
846
872
|
.hjm-switch__copy { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); min-inline-size: 0; text-align: start; overflow-wrap: anywhere; }
|
|
847
873
|
.hjm-switch__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
|
|
848
874
|
.hjm-switch[data-presentation="row"] { display: flex; inline-size: 100%; justify-content: space-between; }
|
|
875
|
+
/* Chip collections retain their native radio/checkbox inputs, including nullable and multi-select values. */
|
|
876
|
+
:is(.hjm-radio-group, .hjm-checkbox-group)[data-presentation="chips"] > :is(.hjm-radio-group__items, .hjm-checkbox-group__items) { flex-direction: row; flex-wrap: wrap; gap: var(--hjm-space-xs); }
|
|
877
|
+
.hjm-choice[data-presentation="chips"] { position: relative; flex: 0 1 auto; min-block-size: var(--hjm-control-min-touch-target); padding: 0 var(--hjm-space-md); border-radius: var(--hjm-radius-full); color: var(--hjm-color-text-muted); font-weight: var(--hjm-text-emphasis-medium); }
|
|
878
|
+
.hjm-choice[data-presentation="chips"][data-size="small"] { min-block-size: 36px; padding-inline: var(--hjm-space-sm); }
|
|
879
|
+
.hjm-choice[data-presentation="chips"][data-size="small"]::after { content: ""; position: absolute; inset: -4px 0; }
|
|
880
|
+
.hjm-choice[data-presentation="chips"].hjm-choice--with-action { padding: 0; }
|
|
881
|
+
.hjm-choice[data-presentation="chips"] > .hjm-choice__target { padding-block: 0; }
|
|
882
|
+
.hjm-choice[data-presentation="chips"] .hjm-choice__indicator { display: none; }
|
|
883
|
+
.hjm-choice[data-presentation="chips"] .hjm-choice__leading { color: inherit; }
|
|
884
|
+
.hjm-choice[data-presentation="chips"] .hjm-choice__copy { min-inline-size: 0; overflow-wrap: anywhere; padding-block: 0; }
|
|
885
|
+
.hjm-choice[data-presentation="chips"][data-state="checked"], .hjm-choice[data-presentation="chips"][data-state="mixed"] { color: var(--hjm-color-content-brand); border-color: var(--hjm-color-content-brand); }
|
|
886
|
+
.hjm-choice[data-presentation="chips"]:has(.hjm-choice__input:focus-visible) { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: var(--hjm-focus-offset); }
|
|
849
887
|
/* A described switch: copy + switchRecipe.rowPaddingVertical 8 on both sides, min rowTwoLineMinHeight 56, same as Native.
|
|
850
888
|
Stacked switch rows carry this spacing themselves; containers add no gap between them (2026-10-17). */
|
|
851
889
|
.hjm-switch[data-two-line="true"] { min-block-size: var(--hjm-switch-row-two-line-min-height); padding-block: var(--hjm-switch-row-padding-vertical); }
|
|
@@ -925,10 +963,10 @@
|
|
|
925
963
|
|
|
926
964
|
.hjm-badge, .hjm-tag { display: inline-flex; align-items: center; gap: var(--hjm-space-xxs); max-inline-size: 100%; overflow-wrap: anywhere; }
|
|
927
965
|
/* Solid status plates mirror badgeRecipe; Tag keeps its independent tint treatment. */
|
|
928
|
-
.hjm-badge { min-block-size: 24px; padding: 2px var(--hjm-space-xs); border: 0; border-radius: var(--hjm-radius-sm); color: var(--hjm-color-on-
|
|
966
|
+
.hjm-badge { min-block-size: 24px; padding: 2px var(--hjm-space-xs); border: 0; border-radius: var(--hjm-radius-sm); color: var(--hjm-color-on-status-fill); background: var(--hjm-color-neutral-fill); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-font-weight-bold); }
|
|
929
967
|
.hjm-badge[data-size="small"] { min-block-size: 20px; }
|
|
930
968
|
.hjm-badge[data-tone="strong"] { background: var(--hjm-color-strong-fill); }
|
|
931
|
-
.hjm-badge[data-tone="brand"] { background: var(--hjm-color-primary); }
|
|
969
|
+
.hjm-badge[data-tone="brand"] { color: var(--hjm-color-on-primary); background: var(--hjm-color-primary); }
|
|
932
970
|
.hjm-badge[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
|
|
933
971
|
.hjm-badge__icon { display: inline-flex; align-items: center; flex: 0 0 auto; }
|
|
934
972
|
.hjm-badge[data-variant="outline"] { background: transparent; border: 1px solid var(--hjm-color-border); color: var(--hjm-color-text-muted); }
|
|
@@ -968,13 +1006,16 @@
|
|
|
968
1006
|
.hjm-counter-badge[data-tone="danger"] { color: var(--hjm-color-on-danger); background: var(--hjm-color-danger-fill); }
|
|
969
1007
|
.hjm-counter-badge[data-variant="floating"] { border: 2px solid var(--hjm-color-bg); }
|
|
970
1008
|
|
|
971
|
-
.hjm-card { overflow: hidden; }
|
|
1009
|
+
.hjm-card { display: flex; flex-direction: column; overflow: hidden; }
|
|
972
1010
|
.hjm-card__media > * { display: block; inline-size: 100%; }
|
|
973
|
-
/*
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
.hjm-card__body
|
|
977
|
-
.hjm-
|
|
1011
|
+
/* Zero inline minima preserve narrow-slot wrapping; body/content relay allocated height to slotted layouts
|
|
1012
|
+
without growing headers or footer commands (Diairy journey overview, 2026-10-20). */
|
|
1013
|
+
.hjm-card__body { display: flex; flex-direction: column; flex: 1; min-inline-size: 0; min-block-size: 0; gap: var(--hjm-space-xs); padding: var(--hjm-space-md); }
|
|
1014
|
+
.hjm-card__body > * { min-inline-size: 0; }
|
|
1015
|
+
.hjm-card__content { display: flex; flex-direction: column; flex: 1; min-block-size: 0; }
|
|
1016
|
+
.hjm-card__media, .hjm-card__actions { flex-shrink: 0; }
|
|
1017
|
+
.hjm-card__header { display: flex; align-items: center; gap: var(--hjm-space-sm); min-inline-size: 0; }
|
|
1018
|
+
.hjm-card__header-actions { position: relative; z-index: 1; display: flex; flex: 0 0 auto; align-items: center; gap: var(--hjm-space-xs); }
|
|
978
1019
|
.hjm-card__leading { flex: 0 0 auto; display: inline-grid; place-items: center; line-height: 1; }
|
|
979
1020
|
.hjm-card__copy { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xs); }
|
|
980
1021
|
/* cardRecipe.title.emphasis "strong": without a weight the h2–h6 element fell back to the UA bold (700). */
|
|
@@ -1072,13 +1113,15 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
1072
1113
|
.hjm-list { min-inline-size: 0; }
|
|
1073
1114
|
.hjm-list[data-appearance="grouped"] { overflow: hidden; padding-inline: var(--hjm-list-grouped-padding-inline); border-radius: var(--hjm-radius-lg); background: var(--hjm-color-bg); }
|
|
1074
1115
|
.hjm-list__item { min-inline-size: 0; }
|
|
1116
|
+
.hjm-list-separator { border-block-start: 1px solid var(--hjm-color-border); flex-shrink: 0; pointer-events: none; }
|
|
1075
1117
|
/* Indent only the divider: moving the row shifted every title after the first
|
|
1076
1118
|
and narrowed its text column in the notification-settings composition. Insets are measured from the list content
|
|
1077
1119
|
edge (where the row text sits) and come from listRecipe.separators: full spans the row surface; indented follows
|
|
1078
1120
|
the text column of the row above (the separator belongs to that row, as Native draws it after the row) — 52 after a
|
|
1079
1121
|
row with leading (ListRow root `data-leading`), 0 after one without, ending on the content edge (2026-10-17). */
|
|
1080
|
-
.hjm-list:is([data-separator="full"], [data-separator="indented"]) > .hjm-list__item + .hjm-list__item { position: relative; }
|
|
1081
|
-
.hjm-list:is([data-separator="full"], [data-separator="indented"]) > .hjm-list__item + .hjm-list__item::before { content: ""; position: absolute; inset-block-start: 0; border-block-start: 1px solid var(--hjm-color-border); pointer-events: none; }
|
|
1122
|
+
.hjm-list:is([data-separator="full"], [data-separator="indented"], [data-separator="content"]) > .hjm-list__item + .hjm-list__item { position: relative; }
|
|
1123
|
+
.hjm-list:is([data-separator="full"], [data-separator="indented"], [data-separator="content"]) > .hjm-list__item + .hjm-list__item::before { content: ""; position: absolute; inset-block-start: 0; border-block-start: 1px solid var(--hjm-color-border); pointer-events: none; }
|
|
1124
|
+
.hjm-list[data-separator="content"] > .hjm-list__item + .hjm-list__item::before { inset-inline: var(--hjm-list-separator-content-start) var(--hjm-list-separator-content-end); }
|
|
1082
1125
|
.hjm-list[data-separator="full"] > .hjm-list__item + .hjm-list__item::before { inset-inline: var(--hjm-list-separator-full-start) var(--hjm-list-separator-full-end); }
|
|
1083
1126
|
.hjm-list[data-separator="indented"] > .hjm-list__item + .hjm-list__item::before { inset-inline: var(--hjm-list-separator-indented-start) var(--hjm-list-separator-indented-end); }
|
|
1084
1127
|
.hjm-list[data-separator="indented"] > .hjm-list__item:has(> [data-leading]) + .hjm-list__item::before { inset-inline-start: var(--hjm-list-separator-indented-leading-start); }
|
|
@@ -1096,7 +1139,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
1096
1139
|
.hjm-statistic__label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
|
|
1097
1140
|
.hjm-statistic[data-density="compact"] .hjm-statistic__label { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
|
|
1098
1141
|
.hjm-statistic__value-row { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--hjm-space-xxs); min-inline-size: 0; }
|
|
1099
|
-
.hjm-statistic__value { color: var(--hjm-color-text); font-size: var(--hjm-type-heading-size); line-height: var(--hjm-type-heading-line-height); font-weight: var(--hjm-font-weight-semibold); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
1142
|
+
.hjm-statistic__value { color: var(--hjm-statistic-value-color, var(--hjm-color-text)); font-size: var(--hjm-type-heading-size); line-height: var(--hjm-type-heading-line-height); font-weight: var(--hjm-font-weight-semibold); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
1100
1143
|
.hjm-statistic[data-density="compact"] .hjm-statistic__value { font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); }
|
|
1101
1144
|
.hjm-statistic__affix { color: var(--hjm-color-text-body); font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); font-weight: var(--hjm-text-emphasis-medium); }
|
|
1102
1145
|
.hjm-statistic__hint { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
|
|
@@ -1109,7 +1152,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
1109
1152
|
.hjm-statistic-group { grid-template-columns: minmax(0, 1fr); }
|
|
1110
1153
|
}
|
|
1111
1154
|
|
|
1112
|
-
.hjm-notice { display: flex; flex-wrap: wrap; align-items:
|
|
1155
|
+
.hjm-notice { display: flex; flex-wrap: wrap; align-items: center; 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-bg); border-color: var(--hjm-color-border); }
|
|
1113
1156
|
.hjm-notice[data-tone="info"] { border-color: var(--hjm-accent-info); }
|
|
1114
1157
|
.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)); }
|
|
1115
1158
|
.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)); }
|
|
@@ -1117,14 +1160,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
1117
1160
|
.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)); }
|
|
1118
1161
|
/* Reserve readable copy; wrap the action instead of crushing its label. */
|
|
1119
1162
|
.hjm-notice__content { flex: 1 1 60%; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
|
|
1120
|
-
/*
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
grow downward; Native keeps the action under the copy (docs/usage/components/notice.md). */
|
|
1124
|
-
.hjm-notice { --hjm-notice-anchor: 1lh; }
|
|
1125
|
-
.hjm-notice:has(> .hjm-notice__action) { --hjm-notice-anchor: var(--hjm-control-button-small); }
|
|
1126
|
-
.hjm-notice__icon { flex: 0 0 auto; display: flex; align-items: center; justify-content: center; min-inline-size: 1.25rem; block-size: var(--hjm-notice-anchor); }
|
|
1127
|
-
.hjm-notice__content > :first-child { margin-block-start: calc((var(--hjm-notice-anchor) - 1lh) / 2); }
|
|
1163
|
+
/* Center the complete copy and action within the row; a first-line offset drifts
|
|
1164
|
+
when the copy wraps or the button's actual height differs from its token. */
|
|
1165
|
+
.hjm-notice__icon { flex: 0 0 auto; display: flex; align-items: center; justify-content: center; min-inline-size: 1.25rem; block-size: 1lh; }
|
|
1128
1166
|
.hjm-notice__action { flex: 0 0 auto; max-inline-size: 100%; }
|
|
1129
1167
|
.hjm-notice__title, .hjm-notice__description { overflow-wrap: anywhere; }
|
|
1130
1168
|
/* noticeRecipe/emptyStateRecipe title weight; the <strong> otherwise draws the UA bold (700). */
|
|
@@ -1172,7 +1210,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
1172
1210
|
/* Copy row above the ring at the start edge, like the linear bar and Native (2026-10-06 follow-up). The ring used to sit
|
|
1173
1211
|
beside the copy (grid auto 1fr), so the same Progress laid out differently per platform. */
|
|
1174
1212
|
.hjm-progress[data-shape="circular"] { justify-items: start; }
|
|
1175
|
-
|
|
1213
|
+
/* Keep one semantic progress target even when decorative segments or the ring paint it. */
|
|
1214
|
+
.hjm-progress[data-shape="circular"] .hjm-progress__native,
|
|
1215
|
+
.hjm-progress[data-segmented] .hjm-progress__native { position: absolute; inline-size: 1px; block-size: 1px; clip-path: inset(50%); overflow: hidden; }
|
|
1216
|
+
.hjm-progress__segments { display: flex; inline-size: 100%; }
|
|
1217
|
+
.hjm-progress__segments > span { flex: 1; min-inline-size: 0; overflow: hidden; border-radius: var(--hjm-radius-full); background: var(--hjm-progress-track); }
|
|
1218
|
+
.hjm-progress__segments > span > i { display: block; block-size: 100%; background: var(--hjm-progress-fill); }
|
|
1176
1219
|
.hjm-progress__ring {
|
|
1177
1220
|
position: relative;
|
|
1178
1221
|
display: grid;
|
|
@@ -2454,7 +2497,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
2454
2497
|
display: grid;
|
|
2455
2498
|
place-items: center;
|
|
2456
2499
|
min-inline-size: var(--hjm-control-min-touch-target);
|
|
2457
|
-
min-block-size: var(--hjm-
|
|
2500
|
+
min-block-size: var(--hjm-control-min-touch-target);
|
|
2458
2501
|
padding: 0;
|
|
2459
2502
|
border: 0;
|
|
2460
2503
|
background: transparent;
|
|
@@ -2707,8 +2750,9 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
2707
2750
|
|
|
2708
2751
|
/* Advanced display ------------------------------------------------------- */
|
|
2709
2752
|
/* timelineRecipe label/description are `body`; binding it here lets the rail and timestamp derive from the same line box. */
|
|
2710
|
-
.hjm-timeline { display: grid; gap: var(--hjm-space-
|
|
2711
|
-
.hjm-timeline__item { min-inline-size: 0; display: grid; grid-template-columns: 1rem minmax(0, 1fr); gap: var(--hjm-space-sm); }
|
|
2753
|
+
.hjm-timeline { display: grid; gap: var(--hjm-space-lg); margin: 0; padding: 0; list-style: none; font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
|
|
2754
|
+
.hjm-timeline__item { padding: var(--hjm-space-sm); border-radius: var(--hjm-radius-md); min-inline-size: 0; display: grid; grid-template-columns: 1rem minmax(0, 1fr); gap: var(--hjm-space-sm); }
|
|
2755
|
+
.hjm-timeline__item[data-emphasized="true"] { background: color-mix(in srgb, var(--hjm-accent-info) 10%, transparent); }
|
|
2712
2756
|
.hjm-timeline__rail { position: relative; display: flex; justify-content: center; }
|
|
2713
2757
|
/* Dot, label first line and timestamp share the label's first line box (2026-10-17 measured audit: centers 396/397/398.5).
|
|
2714
2758
|
The rail inherits the label's line height, so 1lh is that line box. */
|
|
@@ -2716,12 +2760,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
2716
2760
|
.hjm-timeline__item[data-tone="info"] .hjm-timeline__dot { border-color: var(--hjm-accent-info); background: var(--hjm-accent-info); }
|
|
2717
2761
|
.hjm-timeline__item[data-tone="success"] .hjm-timeline__dot { border-color: var(--hjm-accent-success); background: var(--hjm-accent-success); }
|
|
2718
2762
|
.hjm-timeline__item[data-tone="attention"] .hjm-timeline__dot { border-color: var(--hjm-accent-attention); background: var(--hjm-accent-attention); }
|
|
2719
|
-
.hjm-timeline__connector { position: absolute; inset-block: calc((1lh + 0.625rem) / 2) calc(-1 * var(--hjm-space-
|
|
2763
|
+
.hjm-timeline__connector { position: absolute; inset-block: calc((1lh + 0.625rem) / 2) calc(-1 * (var(--hjm-space-lg) + 2 * var(--hjm-space-sm)) - .5lh); inline-size: 1px; background: var(--hjm-color-border); }
|
|
2720
2764
|
.hjm-timeline__content { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-block-end: var(--hjm-space-xxs); }
|
|
2721
|
-
.hjm-timeline__heading { min-inline-size: 0; display: flex; flex-wrap: wrap; align-items: flex-start;
|
|
2765
|
+
.hjm-timeline__heading { min-inline-size: 0; display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--hjm-space-xxs) var(--hjm-space-sm); }
|
|
2722
2766
|
.hjm-timeline__label { color: var(--hjm-color-text); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
|
|
2723
2767
|
/* Baseline sharing put the smaller caption 1.5px under the label's center; center it on the label's first line instead. */
|
|
2724
|
-
.hjm-timeline__timestamp {
|
|
2768
|
+
.hjm-timeline__timestamp { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
|
|
2725
2769
|
.hjm-timeline__description { color: var(--hjm-color-text-body); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
2726
2770
|
.hjm-accordion { border-block-start: 1px solid var(--hjm-color-border); }
|
|
2727
2771
|
.hjm-accordion__item { border-block-end: 1px solid var(--hjm-color-border); }
|
|
@@ -2774,7 +2818,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
2774
2818
|
.hjm-description-list { display: grid; grid-template-columns: repeat(var(--hjm-description-columns), minmax(0, 1fr)); gap: var(--hjm-space-sm); margin: 0; }
|
|
2775
2819
|
.hjm-description-list__item { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
|
|
2776
2820
|
.hjm-description-list__label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-text-emphasis-medium); }
|
|
2777
|
-
.hjm-description-list__value { margin: 0; color: var(--hjm-color-text); overflow-wrap: anywhere; }
|
|
2821
|
+
.hjm-description-list__value { margin: 0; color: var(--hjm-color-text); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
2778
2822
|
.hjm-table-scroll { max-inline-size: 100%; overflow: auto; outline-offset: 2px; }
|
|
2779
2823
|
.hjm-table { inline-size: 100%; border-collapse: collapse; color: var(--hjm-color-text-body); }
|
|
2780
2824
|
.hjm-table__caption { padding: var(--hjm-space-sm); color: var(--hjm-color-text); font-weight: var(--hjm-type-title-weight); text-align: start; }
|
|
@@ -2824,7 +2868,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
2824
2868
|
.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; }
|
|
2825
2869
|
|
|
2826
2870
|
/* Expansion renderers --------------------------------------------------- */
|
|
2827
|
-
.hjm-steps { display: grid; grid-template-columns: repeat(var(--hjm-steps-count
|
|
2871
|
+
.hjm-steps { display: grid; grid-template-columns: repeat(var(--hjm-steps-connector-count), minmax(0, 1fr)) fit-content(calc(100% / var(--hjm-steps-count))); gap: 0; margin: 0; padding: 0; list-style: none; }
|
|
2828
2872
|
.hjm-steps__step { min-inline-size: 0; display: grid; align-content: start; gap: var(--hjm-space-xs); }
|
|
2829
2873
|
.hjm-steps__rail { display: flex; align-items: center; min-inline-size: 0; }
|
|
2830
2874
|
.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-bg); font-size: var(--hjm-type-label-size); font-weight: var(--hjm-text-emphasis-medium); }
|
|
@@ -2832,11 +2876,16 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
2832
2876
|
.hjm-steps__step[data-status="current"] .hjm-steps__indicator { border: 2px solid var(--hjm-color-content-brand); color: var(--hjm-color-content-brand); }
|
|
2833
2877
|
.hjm-steps__step[data-status="complete"] .hjm-steps__indicator { border-color: var(--hjm-accent-success); color: var(--hjm-accent-success); background: var(--hjm-color-bg); }
|
|
2834
2878
|
.hjm-steps__step[data-status="complete"] .hjm-steps__connector { background: var(--hjm-color-content-brand); }
|
|
2879
|
+
/* The terminal incoming segment continues the previous rail across its copy width. */
|
|
2880
|
+
.hjm-steps__connector[data-reached="true"] { background: var(--hjm-color-content-brand); }
|
|
2835
2881
|
.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); }
|
|
2836
2882
|
.hjm-steps__copy { min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); padding-inline-end: var(--hjm-space-sm); }
|
|
2837
2883
|
.hjm-steps__label { color: var(--hjm-color-text); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
|
|
2838
2884
|
.hjm-steps__step[data-status="pending"] .hjm-steps__label { color: var(--hjm-color-text-muted); }
|
|
2839
2885
|
.hjm-steps__step[data-status="error"] .hjm-steps__label { color: var(--hjm-color-danger); }
|
|
2886
|
+
/* Keep the terminal marker at the inline edge instead of an empty trailing step cell. */
|
|
2887
|
+
.hjm-steps__step:last-child .hjm-steps__rail { justify-content: flex-end; }
|
|
2888
|
+
.hjm-steps__step:last-child .hjm-steps__copy { padding-inline-end: 0; text-align: end; }
|
|
2840
2889
|
.hjm-steps__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); overflow-wrap: anywhere; }
|
|
2841
2890
|
/* A step before the cursor is one button over marker and label (Steps onStepPress); the cell keeps its static layout. */
|
|
2842
2891
|
.hjm-steps__press { display: grid; align-content: start; gap: var(--hjm-space-xs); min-inline-size: 0; min-block-size: var(--hjm-steps-press-target); margin: 0; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: start; cursor: pointer; }
|
|
@@ -2992,6 +3041,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
2992
3041
|
/* Intrinsic action columns keep short labels readable at 320px; the title wraps
|
|
2993
3042
|
in the remaining space instead of squeezing actions to equal-width tracks. */
|
|
2994
3043
|
.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); }
|
|
3044
|
+
.hjm-top-bar[data-surface="transparent"] { background: transparent; }
|
|
2995
3045
|
.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); }
|
|
2996
3046
|
.hjm-top-bar__trailing { justify-content: flex-end; }
|
|
2997
3047
|
.hjm-top-bar__title { min-inline-size: 0; text-align: center; overflow-wrap: anywhere; }
|
|
@@ -3005,11 +3055,11 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
3005
3055
|
.hjm-top-bar[data-large-text="true"] .hjm-top-bar__trailing { grid-column: 2; grid-row: 1; }
|
|
3006
3056
|
.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-bg); box-shadow: var(--hjm-bottom-cta-shadow, none); }
|
|
3007
3057
|
.hjm-bottom-cta[data-position="sticky"] { position: sticky; inset-block-end: 0; z-index: var(--hjm-layer-sticky); }
|
|
3008
|
-
/* Inside ScreenLayout
|
|
3058
|
+
/* Inside a padded ScreenLayout or Sheet footer the parent owns padding, surface and safe area; BottomCTA keeps only its copy,
|
|
3009
3059
|
actions and an explicit safeAreaBottom (2026-10-17: the doubled bar inset the buttons twice). */
|
|
3010
|
-
/*
|
|
3060
|
+
/* Each footer passes its actual bottom padding (ScreenLayout max, Sheet additive); an explicit safeAreaBottom adds only
|
|
3011
3061
|
the remainder so the gap is max(footer, inset), not their sum (2026-10-17 "버튼 아래 여백이 많아"). */
|
|
3012
|
-
.hjm-bottom-cta[data-placement="screen-footer"] { position: static; min-block-size: 0; padding: 0 0 max(0px, calc(var(--hjm-bottom-cta-safe-area) -
|
|
3062
|
+
.hjm-bottom-cta[data-placement="screen-footer"] { position: static; box-sizing: border-box; inline-size: 100%; min-inline-size: 0; min-block-size: 0; padding: 0 0 max(0px, calc(var(--hjm-bottom-cta-safe-area) - var(--hjm-bottom-cta-parent-padding))); border: 0; background: none; box-shadow: none; }
|
|
3013
3063
|
.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; }
|
|
3014
3064
|
.hjm-bottom-cta__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-bottom-cta-gap); }
|
|
3015
3065
|
/* bottomCtaRecipe.contentMaxWidth: the surface spans the viewport, its copy and actions stop at the reading width. */
|
|
@@ -3076,7 +3126,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
3076
3126
|
|
|
3077
3127
|
.hjm-anchor { min-inline-size: 0; }
|
|
3078
3128
|
.hjm-anchor__list { display: flex; flex-direction: column; gap: var(--hjm-space-xxs); list-style: none; margin: 0; padding: 0; }
|
|
3079
|
-
.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; }
|
|
3129
|
+
.hjm-anchor__link { display: flex; align-items: center; gap: var(--hjm-space-xs); min-block-size: var(--hjm-control-min-touch-target); min-inline-size: var(--hjm-control-min-touch-target); box-sizing: border-box; padding: var(--hjm-space-xs); border-inline-start: 2px solid transparent; color: var(--hjm-color-text-muted); text-decoration: none; overflow-wrap: anywhere; }
|
|
3080
3130
|
.hjm-anchor__link:hover { text-decoration: underline; text-underline-offset: 0.18em; }
|
|
3081
3131
|
.hjm-anchor__link[aria-current="location"] { color: var(--hjm-color-content-brand); border-color: var(--hjm-color-focus); font-weight: var(--hjm-text-emphasis-strong); }
|
|
3082
3132
|
.hjm-anchor__link:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
|
|
@@ -3099,6 +3149,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
3099
3149
|
/* Disclosure, context menu, menubar --------------------------------------- */
|
|
3100
3150
|
.hjm-collapsible { display: grid; gap: var(--hjm-collapsible-gap); min-inline-size: 0; }
|
|
3101
3151
|
.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; }
|
|
3152
|
+
.hjm-collapsible__header { display: flex; align-items: center; gap: var(--hjm-space-xs); min-block-size: var(--hjm-control-min-touch-target); min-inline-size: 0; }
|
|
3153
|
+
.hjm-collapsible__title { flex: 1; min-inline-size: 0; overflow-wrap: anywhere; }
|
|
3154
|
+
.hjm-collapsible__header[data-titled] > .hjm-collapsible__trigger { inline-size: auto; min-inline-size: var(--hjm-control-min-touch-target); flex: 0 0 auto; }
|
|
3155
|
+
.hjm-collapsible__pending { display: inline-flex; align-items: center; justify-content: center; min-inline-size: var(--hjm-control-min-touch-target); min-block-size: var(--hjm-control-min-touch-target); }
|
|
3156
|
+
.hjm-collapsible__header:not([data-titled]) > .hjm-collapsible__pending { flex: 1; }
|
|
3157
|
+
.hjm-collapsible__header[hidden] { display: none; }
|
|
3102
3158
|
.hjm-collapsible__trigger:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
3103
3159
|
.hjm-collapsible__trigger:focus-visible { outline: 2px solid var(--hjm-color-focus); outline-offset: 2px; }
|
|
3104
3160
|
/* The marker is decoration: aria-expanded carries the state, so it only needs
|
|
@@ -3325,6 +3381,8 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
3325
3381
|
.hjm-message-composer { display: flex; flex-direction: column; gap: var(--hjm-message-composer-gap, var(--hjm-space-sm)); }
|
|
3326
3382
|
.hjm-message-composer__row { display: flex; gap: var(--hjm-message-composer-gap, var(--hjm-space-sm)); align-items: flex-end; }
|
|
3327
3383
|
.hjm-message-composer__row > .hjm-field { flex: 1; min-inline-size: 0; }
|
|
3384
|
+
/* 2026-10-20: numeric composer hints belong at the end; errors keep the field default. */
|
|
3385
|
+
.hjm-message-composer[data-description-align="end"] > .hjm-message-composer__reply-card > .hjm-message-composer__row > .hjm-field > .hjm-field__description { text-align: end; }
|
|
3328
3386
|
.hjm-message-composer__row > .hjm-button { flex-shrink: 0; }
|
|
3329
3387
|
/* 2026-10-16 timeline standard (measured KakaoTalk iOS chat room, chatMessageRecipe): filled borderless
|
|
3330
3388
|
bubbles, one avatar/author/tip per run, time beside the run's last bubble. */
|
|
@@ -3394,7 +3452,7 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
|
|
|
3394
3452
|
|
|
3395
3453
|
.hjm-image-choice { display: flex; flex-direction: column; gap: var(--hjm-space-xs); }
|
|
3396
3454
|
.hjm-image-choice__label { font-weight: var(--hjm-text-emphasis-medium); }
|
|
3397
|
-
.hjm-image-choice__tiles { display:
|
|
3455
|
+
.hjm-image-choice__tiles { display: grid; grid-template-columns: repeat(auto-fit, calc(var(--hjm-image-choice-size) + (var(--hjm-image-choice-ring) + var(--hjm-image-choice-offset)) * 2)); justify-content: space-between; gap: var(--hjm-image-choice-gap); }
|
|
3398
3456
|
/* The button is a column (ring frame, optional item label) so the label shares the tap target; the ring is drawn on
|
|
3399
3457
|
the inner frame (2026-10-18 showItemLabels). */
|
|
3400
3458
|
.hjm-image-choice__tile { display: flex; flex-direction: column; gap: var(--hjm-image-choice-item-label-gap); inline-size: calc(var(--hjm-image-choice-size) + (var(--hjm-image-choice-ring) + var(--hjm-image-choice-offset)) * 2); padding: 0; border: 0; border-radius: calc(var(--hjm-image-choice-radius) + var(--hjm-image-choice-ring) + var(--hjm-image-choice-offset)); background: none; color: inherit; cursor: pointer; }
|
|
@@ -3412,7 +3470,7 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
|
|
|
3412
3470
|
.hjm-image-choice__row { position: absolute; inset-inline: 0; display: flex; gap: var(--hjm-image-choice-gap); }
|
|
3413
3471
|
.hjm-image-choice__tile:focus-visible { outline: 2px solid var(--hjm-color-focus, currentColor); outline-offset: 2px; }
|
|
3414
3472
|
.hjm-image-choice__tile:disabled { opacity: 0.5; cursor: default; }
|
|
3415
|
-
.hjm-image-choice__image { display:
|
|
3473
|
+
.hjm-image-choice__image { display: flex; align-items: center; justify-content: center; inline-size: 100%; block-size: 100%; overflow: hidden; border-radius: var(--hjm-image-choice-radius); background: var(--hjm-color-surface); }
|
|
3416
3474
|
.hjm-image-choice__image > img { inline-size: 100%; block-size: 100%; object-fit: cover; display: block; }
|
|
3417
3475
|
.hjm-image-choice__check { position: absolute; inset-block-start: 0; inset-inline-end: 0; inline-size: var(--hjm-image-choice-check); block-size: var(--hjm-image-choice-check); border-radius: 50%; background: var(--hjm-color-content-brand); color: var(--hjm-color-on-primary); font-size: 12px; line-height: var(--hjm-image-choice-check); text-align: center; }
|
|
3418
3476
|
.hjm-message-composer__leading { flex: 0 0 auto; align-self: center; display: inline-flex; }
|
|
@@ -3534,8 +3592,9 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
|
|
|
3534
3592
|
.hjm-segmented[data-presentation="pills"] { background:transparent; border:0; padding:0; }
|
|
3535
3593
|
/* Keep the inset pill behind the whole line at large text (40px text / 28px fill was observed). Native already includes this inset as vertical padding. */
|
|
3536
3594
|
.hjm-segmented[data-presentation="pills"] .hjm-segmented__items { flex-wrap:wrap; gap:var(--hjm-space-xs); overflow:visible; padding:0; border:0; border-radius:0; background:transparent; }
|
|
3537
|
-
.hjm-segmented[data-presentation="pills"] .hjm-segmented__item { padding-block:var(--hjm-space-
|
|
3538
|
-
.hjm-segmented[data-presentation="pills"] .hjm-segmented__item::before { content:""; position:absolute; inset:var(--hjm-space-
|
|
3595
|
+
.hjm-segmented[data-presentation="pills"] .hjm-segmented__item { padding-block:var(--hjm-space-xxs); position:relative; flex:0 1 auto; min-inline-size:0; min-block-size:max(var(--hjm-control-min-touch-target), calc(var(--hjm-segmented-height) + 2 * var(--hjm-space-xxs))); border:0; border-radius:var(--hjm-radius-full); background:transparent; box-shadow:none; padding-inline:var(--hjm-space-md); color:var(--hjm-color-text-muted); }
|
|
3596
|
+
.hjm-segmented[data-presentation="pills"] .hjm-segmented__item::before { content:""; position:absolute; inset:var(--hjm-space-xxs) 0; border-radius:var(--hjm-radius-full); background:var(--hjm-color-surface-alt); }
|
|
3597
|
+
.hjm-segmented[data-presentation="pills"][data-size="small"] .hjm-segmented__item { padding-inline:var(--hjm-space-sm); }
|
|
3539
3598
|
.hjm-segmented[data-presentation="pills"] .hjm-segmented__item > span { position:relative; overflow-wrap:anywhere; }
|
|
3540
3599
|
.hjm-segmented[data-presentation="pills"] .hjm-segmented__item[data-state="checked"] { color:var(--hjm-color-bg); font-weight:var(--hjm-font-weight-semibold); }
|
|
3541
3600
|
.hjm-segmented[data-presentation="pills"] .hjm-segmented__item[data-state="checked"]::before { background:var(--hjm-color-text-body); }
|
|
@@ -3609,4 +3668,120 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
|
|
|
3609
3668
|
.hjm-description-list[data-layout="inline"] .hjm-description-list__item { grid-template-columns: 24% minmax(0, 1fr); gap: var(--hjm-space-sm); padding-block: var(--hjm-space-sm); }
|
|
3610
3669
|
.hjm-description-list[data-layout="inline"] .hjm-description-list__item + .hjm-description-list__item { border-block-start: 1px solid var(--hjm-color-border); }
|
|
3611
3670
|
|
|
3671
|
+
/* A cover action stays separate from creator/metadata/footer controls in a Card. */
|
|
3672
|
+
.hjm-card__media-action { display: block; position: relative; inline-size: 100%; padding: 0; border: 0; background: transparent; color: inherit; cursor: pointer; text-align: inherit; }
|
|
3673
|
+
.hjm-card__media-action:active { opacity: var(--hjm-card-pressed-opacity); }
|
|
3674
|
+
.hjm-card__media-action:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-primary); outline-offset: calc(-1 * var(--hjm-focus-width)); }
|
|
3675
|
+
.hjm-card__media-action:disabled { cursor: default; }
|
|
3676
|
+
.hjm-card__media-icon { position: absolute; display: flex; align-items: center; justify-content: center; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-full); background: var(--hjm-color-bg); color: var(--hjm-color-text); pointer-events: none; }
|
|
3677
|
+
|
|
3678
|
+
/* Background artwork keeps Card anatomy and independent actions; it is never a second activation target. */
|
|
3679
|
+
.hjm-card[data-background-media="true"] { position: relative; display: flex; flex-direction: column; }
|
|
3680
|
+
.hjm-card__background { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }
|
|
3681
|
+
.hjm-card__background > :first-child { width: 100%; height: 100%; }
|
|
3682
|
+
/* A product gesture host stays behind the common copy/actions; corner badges remain readable. */
|
|
3683
|
+
.hjm-card__background-interaction { position: absolute; inset: 0; }
|
|
3684
|
+
.hjm-card__background-interaction > :first-child { width: 100%; height: 100%; }
|
|
3685
|
+
.hjm-card__media-badges { position: absolute; inset-block-start: var(--hjm-space-sm); inset-inline-end: var(--hjm-space-sm); display: flex; flex-wrap: wrap; gap: var(--hjm-space-xs); z-index: 1; }
|
|
3686
|
+
.hjm-card__scrim { position: absolute; inset: 0; background: var(--hjm-card-background-scrim); }
|
|
3687
|
+
.hjm-card__badges { display: flex; flex-wrap: wrap; gap: var(--hjm-space-xs); }
|
|
3688
|
+
.hjm-card[data-background-media="true"] > .hjm-card__body { position: relative; flex: 0 1 auto; margin-block-start: auto; }
|
|
3689
|
+
.hjm-card[data-background-media="true"] > .hjm-card__actions { position: relative; }
|
|
3690
|
+
.hjm-card[data-background-media="true"] .hjm-card__title,
|
|
3691
|
+
.hjm-card[data-background-media="true"] .hjm-card__description { color: var(--hjm-card-background-foreground); }
|
|
3692
|
+
|
|
3693
|
+
@media (forced-colors: active) {
|
|
3694
|
+
.hjm-card__background { display: none; }
|
|
3695
|
+
.hjm-card[data-background-media="true"] :is(.hjm-card__title, .hjm-card__description) { color: CanvasText; }
|
|
3696
|
+
}
|
|
3697
|
+
|
|
3698
|
+
.hjm-statistic__leading { display: inline-flex; align-items: center; color: var(--hjm-statistic-value-color, var(--hjm-color-text)); }
|
|
3699
|
+
.hjm-statistic-group[data-arrangement="bar"] { grid-template-columns: repeat(var(--hjm-statistic-columns), minmax(0, 1fr)); gap: 0; }
|
|
3700
|
+
.hjm-statistic-group[data-arrangement="bar"] > * { min-inline-size: 0; padding-inline: var(--hjm-space-xs); }
|
|
3701
|
+
.hjm-statistic-group[data-arrangement="bar"] > * + * { border-inline-start: 1px solid var(--hjm-color-border); }
|
|
3702
|
+
.hjm-statistic[data-arrangement="bar"] { align-items: center; text-align: center; gap: var(--hjm-space-xxs); }
|
|
3703
|
+
.hjm-statistic[data-arrangement="bar"] .hjm-statistic__label { order: 1; }
|
|
3704
|
+
.hjm-statistic[data-arrangement="bar"] .hjm-statistic__value-row { justify-content: center; align-items: center; }
|
|
3705
|
+
.hjm-statistic[data-arrangement="bar"] :is(.hjm-statistic__trend, .hjm-statistic__hint) { order: 2; }
|
|
3706
|
+
|
|
3707
|
+
.hjm-quote-card__mark { display: inline-flex; align-items: center; color: var(--hjm-color-content-brand); font-size: var(--hjm-type-heading-size); line-height: var(--hjm-type-heading-line-height); }
|
|
3708
|
+
.hjm-quote-card__body { display: grid; gap: var(--hjm-space-xs); margin: 0; min-inline-size: 0; }
|
|
3709
|
+
|
|
3710
|
+
/* NotificationRow's optional command owns focus and feedback; its passive preview owns all geometry. */
|
|
3711
|
+
.hjm-notification-row-action { appearance: none; display: block; inline-size: 100%; border: 0; padding: 0; margin: 0; background: transparent; color: inherit; font: inherit; text-align: start; cursor: pointer; }
|
|
3712
|
+
.hjm-notification-row-action:disabled { opacity: var(--hjm-notification-disabled-opacity); cursor: not-allowed; }
|
|
3713
|
+
.hjm-notification-row-action:enabled:active { opacity: var(--hjm-notification-pressed-opacity); }
|
|
3714
|
+
.hjm-notification-row-action:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: calc(-1 * var(--hjm-focus-width)); }
|
|
3715
|
+
|
|
3716
|
+
.hjm-search-screen--embedded { display: flex; flex-direction: column; flex: 1; min-block-size: 0; }
|
|
3717
|
+
.hjm-search-screen--embedded > .hjm-stack { flex: 1; min-block-size: 0; }
|
|
3718
|
+
|
|
3719
|
+
/* Independent shortcut/remove targets share a Chip-shaped surface; neither button contains the other. */
|
|
3720
|
+
.hjm-shortcut-rail { display: flex; overflow-x: auto; list-style: none; margin: 0; padding: 4px 0; min-inline-size: 0; }
|
|
3721
|
+
.hjm-shortcut-rail[data-empty] { padding: 0; }
|
|
3722
|
+
.hjm-shortcut-rail__item { position: relative; display: inline-flex; align-items: stretch; flex: 0 0 auto; color: var(--hjm-color-text-body); }
|
|
3723
|
+
.hjm-shortcut-rail__item::before { content: ""; pointer-events: none; position: absolute; inset: 4px 0; border: 1px solid var(--hjm-color-border); border-radius: 999px; background: var(--hjm-color-bg); }
|
|
3724
|
+
.hjm-shortcut-rail[data-size="medium"] .hjm-shortcut-rail__item::before { inset-block: 0; }
|
|
3725
|
+
.hjm-shortcut-rail__action, .hjm-shortcut-rail__remove { position: relative; display: inline-flex; align-items: center; justify-content: center; min-block-size: var(--hjm-control-min-touch-target); min-inline-size: var(--hjm-control-min-touch-target); background: transparent; color: inherit; font: inherit; font-weight: var(--hjm-text-emphasis-medium); border: 0; border-radius: 999px; cursor: pointer; }
|
|
3726
|
+
.hjm-shortcut-rail__action { gap: var(--hjm-space-xxs); padding-inline: var(--hjm-space-sm); white-space: nowrap; }
|
|
3727
|
+
.hjm-shortcut-rail[data-size="medium"] .hjm-shortcut-rail__action { gap: var(--hjm-space-xs); padding-inline: var(--hjm-space-md); }
|
|
3728
|
+
.hjm-shortcut-rail__remove { inline-size: var(--hjm-control-min-touch-target); padding: 0; }
|
|
3729
|
+
.hjm-shortcut-rail__remove > span { font-size: 14px; line-height: 1; }
|
|
3730
|
+
.hjm-shortcut-rail__item[data-disabled] { opacity: 0.5; }
|
|
3731
|
+
.hjm-shortcut-rail button:disabled { cursor: not-allowed; }
|
|
3732
|
+
.hjm-shortcut-rail button:active:not(:disabled) { opacity: 0.7; }
|
|
3733
|
+
.hjm-shortcut-rail:focus-visible, .hjm-shortcut-rail button:focus-visible { outline: var(--hjm-focus-width) solid var(--hjm-color-focus); outline-offset: var(--hjm-focus-offset); }
|
|
3734
|
+
|
|
3735
|
+
/* A filter rail scrolls independently of its trailing action (Spint spot adoption). */
|
|
3736
|
+
.hjm-segmented-rail { display:flex; align-items:center; gap:var(--hjm-space-xs); min-inline-size:0; }
|
|
3737
|
+
.hjm-segmented-rail > :last-child { flex-shrink:0; }
|
|
3738
|
+
.hjm-segmented[data-overflow="scroll"] .hjm-segmented__items { flex-direction:row; flex-wrap:nowrap; inline-size:max-content; min-inline-size:100%; }
|
|
3739
|
+
.hjm-segmented[data-overflow="scroll"] .hjm-segmented__item { flex-shrink:0; }
|
|
3740
|
+
|
|
3741
|
+
/* A destination card uses an anchor; disabled links omit href and share the card's disabled feedback. */
|
|
3742
|
+
.hjm-card__activator[aria-disabled="true"] { cursor:default; }
|
|
3743
|
+
.hjm-card[data-activation="overlay"]:has(> .hjm-card__activator[aria-disabled="true"]) > :is(.hjm-card__media,.hjm-card__body) { opacity:var(--hjm-card-disabled-opacity); }
|
|
3744
|
+
|
|
3745
|
+
.hjm-anchor__leading { display: inline-flex; flex: 0 0 auto; }
|
|
3746
|
+
.hjm-anchor__leading svg { inline-size: 100%; block-size: 100%; }
|
|
3747
|
+
.hjm-shortcut-rail[data-layout="wrap"] { flex-wrap: wrap; overflow-x: visible; }
|
|
3748
|
+
.hjm-shortcut-rail[data-layout="wrap"] .hjm-shortcut-rail__item { max-inline-size: 100%; min-inline-size: 0; }
|
|
3749
|
+
.hjm-shortcut-rail[data-layout="wrap"] .hjm-shortcut-rail__action { white-space: normal; overflow-wrap: anywhere; }
|
|
3750
|
+
|
|
3751
|
+
/* TimePicker: one two-column session; dimensions come from the shared recipe on its panel. */
|
|
3752
|
+
.hjm-time-picker { display: grid; gap: var(--hjm-space-xs); min-inline-size: 0; }
|
|
3753
|
+
.hjm-time-picker[data-disabled] { opacity: .5; }
|
|
3754
|
+
.hjm-time-picker__label { font-weight: 500; }
|
|
3755
|
+
.hjm-time-picker__trigger { display:flex; align-items:center; gap:var(--hjm-space-xs); inline-size:100%; min-block-size:44px; padding:var(--hjm-space-sm); border:1px solid var(--hjm-color-border-control); border-radius:var(--hjm-radius-md); background:var(--hjm-color-bg); color:var(--hjm-color-text); font:inherit; font-variant-numeric:tabular-nums; cursor:pointer; }
|
|
3756
|
+
.hjm-time-picker__trigger[aria-invalid=true] { border-color:var(--hjm-color-danger); }
|
|
3757
|
+
.hjm-time-picker__trigger:disabled { cursor:default; }
|
|
3758
|
+
.hjm-time-picker__panel { display:grid; gap:var(--hjm-space-md); inline-size:100%; min-inline-size:0; }
|
|
3759
|
+
.hjm-time-picker__panel > .hjm-button { inline-size:100%; }
|
|
3760
|
+
.hjm-time-picker__readout { text-align:center; font-size:var(--hjm-time-summary); line-height:var(--hjm-time-summary-line-height); font-weight:500; font-variant-numeric:tabular-nums; direction:ltr; }
|
|
3761
|
+
.hjm-time-picker__readout span { color:var(--hjm-color-text-muted); padding-inline:var(--hjm-space-xs); }
|
|
3762
|
+
.hjm-time-picker__columns { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--hjm-space-sm); }
|
|
3763
|
+
.hjm-time-picker__caption { text-align:center; color:var(--hjm-color-text-muted); margin-block-end:var(--hjm-space-xs); }
|
|
3764
|
+
.hjm-time-picker__list { position:relative; block-size:var(--hjm-time-height); overflow-y:auto; overscroll-behavior:contain; scrollbar-width:thin; }
|
|
3765
|
+
.hjm-time-picker__list button { display:block; inline-size:100%; min-block-size:var(--hjm-time-row); border:0; border-radius:var(--hjm-radius-md); background:transparent; color:var(--hjm-color-text); font:inherit; font-variant-numeric:tabular-nums; cursor:pointer; }
|
|
3766
|
+
.hjm-time-picker__list button[aria-selected=true] { background:var(--hjm-color-surface-accent); color:var(--hjm-color-content-brand); font-weight:500; }
|
|
3767
|
+
.hjm-time-picker__list button:disabled { opacity:.4; cursor:default; }
|
|
3768
|
+
.hjm-time-picker__list button:focus-visible,.hjm-time-picker__trigger:focus-visible { outline:2px solid var(--hjm-color-content-brand); outline-offset:-2px; }
|
|
3769
|
+
.hjm-time-picker__description { color:var(--hjm-color-text-muted); }
|
|
3770
|
+
.hjm-time-picker__error { color:var(--hjm-color-danger); }
|
|
3771
|
+
|
|
3772
|
+
/* IconTile's own target keeps the full artwork width; Button's face padding would squeeze narrow grid cells. */
|
|
3773
|
+
.hjm-icon-tile-action { display: block; box-sizing: border-box; width: 100%; margin: 0; padding: 0; border: 0; border-radius: var(--hjm-radius-md); background: transparent; color: inherit; font: inherit; cursor: pointer; }
|
|
3774
|
+
.hjm-icon-tile-action:focus-visible { outline: 2px solid var(--hjm-color-primary); outline-offset: 2px; }
|
|
3775
|
+
.hjm-icon-tile-action:active:not(:disabled) { opacity: var(--hjm-icon-tile-pressed-opacity); }
|
|
3776
|
+
.hjm-icon-tile-action:disabled { opacity: var(--hjm-icon-tile-disabled-opacity); cursor: default; }
|
|
3777
|
+
|
|
3778
|
+
/* Position-only pager indicators have no small interactive targets; adjacent pager controls own navigation. */
|
|
3779
|
+
.hjm-page-indicator__marker, .hjm-page-indicator__marker > span { display: block; inline-size: var(--hjm-space-xs); block-size: var(--hjm-space-xs); border-radius: var(--hjm-radius-full); }
|
|
3780
|
+
.hjm-page-indicator__marker > span { background: var(--hjm-color-text-weak); }
|
|
3781
|
+
.hjm-page-indicator__marker[data-current="true"] > span { background: var(--hjm-color-content-brand); }
|
|
3782
|
+
|
|
3783
|
+
/* Commands remain independent of the passive record and rail. */
|
|
3784
|
+
.hjm-timeline__item:has(> .hjm-timeline__actions) { grid-template-columns: 1rem minmax(0, 1fr) auto; }
|
|
3785
|
+
.hjm-timeline__actions { align-self: center; display: flex; align-items: center; gap: var(--hjm-space-xs); }
|
|
3786
|
+
|
|
3612
3787
|
}
|
package/dist/task-list.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export type TaskListProps = Readonly<{
|
|
|
7
7
|
onCompletedChange: (id: string, completed: boolean) => void;
|
|
8
8
|
disabled?: boolean;
|
|
9
9
|
emptyContent?: ReactNode;
|
|
10
|
+
/** Use plain rows inside an enclosing surface; omission retains the Checkbox default. */
|
|
11
|
+
itemPresentation?: "plain" | "card";
|
|
10
12
|
/** Independent row action beside the checkbox; apply disabled to the supplied control. */
|
|
11
13
|
renderItemAction?: (context: Readonly<{
|
|
12
14
|
item: TaskItem;
|
|
@@ -20,5 +22,5 @@ export type TaskListProps = Readonly<{
|
|
|
20
22
|
layoutStyle?: HjmCompositionStyleProp;
|
|
21
23
|
}>;
|
|
22
24
|
/** Canonical Checkbox/List own semantics; optional collection composition keeps drag peers out of this entry. */
|
|
23
|
-
export declare function TaskList({ label, items, onCompletedChange, disabled, emptyContent, renderItemAction, renderCollection, layoutStyle }: TaskListProps): import("react").JSX.Element;
|
|
25
|
+
export declare function TaskList({ label, items, onCompletedChange, disabled, emptyContent, itemPresentation, renderItemAction, renderCollection, layoutStyle }: TaskListProps): import("react").JSX.Element;
|
|
24
26
|
//# sourceMappingURL=task-list.d.ts.map
|
package/dist/task-list.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-list.d.ts","sourceRoot":"","sources":["../src/task-list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAI,EAAC,SAAS,EAAC,MAAI,OAAO,CAAC;AAClC,OAAM,EAAe,KAAK,QAAQ,EAAC,MAAI,mCAAmC,CAAC;AAE3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,aAAa,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,SAAS,QAAQ,EAAE,CAAC;IAAA,iBAAiB,EAAC,CAAC,EAAE,EAAC,MAAM,EAAC,SAAS,EAAC,OAAO,KAAG,IAAI,CAAC;IAAA,QAAQ,CAAC,EAAC,OAAO,CAAC;IAAA,YAAY,CAAC,EAAC,SAAS,CAAC;IAC1K,0FAA0F;IAC1F,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,CAAC;QAAC,IAAI,EAAC,QAAQ,CAAC;QAAA,QAAQ,EAAC,OAAO,CAAA;KAAC,CAAC,KAAG,SAAS,CAAC;IAClF,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,CAAC;QAAC,KAAK,EAAC,SAAS,QAAQ,EAAE,CAAC;QAAA,UAAU,EAAC,CAAC,IAAI,EAAC,QAAQ,KAAG,SAAS,CAAA;KAAC,CAAC,KAAG,SAAS,CAAC;IACnH,kIAAkI;IAClI,WAAW,CAAC,EAAC,uBAAuB,CAAA;CAAC,CAAC,CAAC;AACxC,iHAAiH;AACjH,wBAAgB,QAAQ,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,iBAAiB,EAAC,QAAc,EAAC,YAAY,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,WAAW,EAAC,EAAC,aAAa,+
|
|
1
|
+
{"version":3,"file":"task-list.d.ts","sourceRoot":"","sources":["../src/task-list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAI,EAAC,SAAS,EAAC,MAAI,OAAO,CAAC;AAClC,OAAM,EAAe,KAAK,QAAQ,EAAC,MAAI,mCAAmC,CAAC;AAE3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,aAAa,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,SAAS,QAAQ,EAAE,CAAC;IAAA,iBAAiB,EAAC,CAAC,EAAE,EAAC,MAAM,EAAC,SAAS,EAAC,OAAO,KAAG,IAAI,CAAC;IAAA,QAAQ,CAAC,EAAC,OAAO,CAAC;IAAA,YAAY,CAAC,EAAC,SAAS,CAAC;IAC1K,yFAAyF;IACzF,gBAAgB,CAAC,EAAC,OAAO,GAAC,MAAM,CAAC;IACjC,0FAA0F;IAC1F,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,CAAC;QAAC,IAAI,EAAC,QAAQ,CAAC;QAAA,QAAQ,EAAC,OAAO,CAAA;KAAC,CAAC,KAAG,SAAS,CAAC;IAClF,gBAAgB,CAAC,EAAC,CAAC,OAAO,EAAC,QAAQ,CAAC;QAAC,KAAK,EAAC,SAAS,QAAQ,EAAE,CAAC;QAAA,UAAU,EAAC,CAAC,IAAI,EAAC,QAAQ,KAAG,SAAS,CAAA;KAAC,CAAC,KAAG,SAAS,CAAC;IACnH,kIAAkI;IAClI,WAAW,CAAC,EAAC,uBAAuB,CAAA;CAAC,CAAC,CAAC;AACxC,iHAAiH;AACjH,wBAAgB,QAAQ,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,iBAAiB,EAAC,QAAc,EAAC,YAAY,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,WAAW,EAAC,EAAC,aAAa,+BAQhK"}
|
package/dist/task-list.js
CHANGED
|
@@ -3,12 +3,12 @@ import { validateTasks } from '@hjmds/design-contracts/task-list';
|
|
|
3
3
|
import { Checkbox } from './selection.js';
|
|
4
4
|
import { List } from './advanced-display.js';
|
|
5
5
|
/** Canonical Checkbox/List own semantics; optional collection composition keeps drag peers out of this entry. */
|
|
6
|
-
export function TaskList({ label, items, onCompletedChange, disabled = false, emptyContent, renderItemAction, renderCollection, layoutStyle }) {
|
|
6
|
+
export function TaskList({ label, items, onCompletedChange, disabled = false, emptyContent, itemPresentation, renderItemAction, renderCollection, layoutStyle }) {
|
|
7
7
|
validateTasks(items);
|
|
8
8
|
if (!label.trim())
|
|
9
9
|
throw new TypeError('TaskList needs a localized label');
|
|
10
10
|
const renderItem = (item) => {
|
|
11
|
-
const control = _jsx(Checkbox, { label: item.label, checked: item.completed, disabled: disabled || item.disabled === true, onCheckedChange: completed => onCompletedChange(item.id, completed), ...(item.description === undefined ? {} : { description: item.description }) });
|
|
11
|
+
const control = _jsx(Checkbox, { ...(itemPresentation === undefined ? {} : { presentation: itemPresentation }), label: item.label, checked: item.completed, disabled: disabled || item.disabled === true, onCheckedChange: completed => onCompletedChange(item.id, completed), ...(item.description === undefined ? {} : { description: item.description }) });
|
|
12
12
|
const action = renderItemAction?.({ item, disabled: disabled || item.disabled === true });
|
|
13
13
|
// The action sits beside Checkbox, never inside its label (pressing it must not toggle completion); long labels wrap
|
|
14
14
|
// inside the checkbox column. A separate action line made each task two to three lines tall (2026-10-17 review).
|