@hjmds/react 1.46.1 → 1.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/actions.d.ts +2 -2
  2. package/dist/activity-chip.d.ts +1 -1
  3. package/dist/advanced-display.d.ts +6 -0
  4. package/dist/advanced-display.d.ts.map +1 -1
  5. package/dist/advanced-display.js +4 -2
  6. package/dist/advanced-display.js.map +1 -1
  7. package/dist/advanced-forms.d.ts +2 -2
  8. package/dist/auth-screen.d.ts +1 -1
  9. package/dist/bottom-navigation.d.ts.map +1 -1
  10. package/dist/bottom-navigation.js +1 -1
  11. package/dist/bottom-navigation.js.map +1 -1
  12. package/dist/calendar.d.ts.map +1 -1
  13. package/dist/calendar.js +31 -24
  14. package/dist/calendar.js.map +1 -1
  15. package/dist/carousel.d.ts +5 -1
  16. package/dist/carousel.d.ts.map +1 -1
  17. package/dist/carousel.js +2 -2
  18. package/dist/carousel.js.map +1 -1
  19. package/dist/clipboard.d.ts +2 -2
  20. package/dist/color-picker.d.ts +33 -3
  21. package/dist/color-picker.d.ts.map +1 -1
  22. package/dist/color-picker.js +73 -10
  23. package/dist/color-picker.js.map +1 -1
  24. package/dist/communication.d.ts +6 -1
  25. package/dist/communication.d.ts.map +1 -1
  26. package/dist/communication.js +2 -2
  27. package/dist/communication.js.map +1 -1
  28. package/dist/conversation-row.d.ts +7 -1
  29. package/dist/conversation-row.d.ts.map +1 -1
  30. package/dist/conversation-row.js +4 -2
  31. package/dist/conversation-row.js.map +1 -1
  32. package/dist/date-range.d.ts +24 -3
  33. package/dist/date-range.d.ts.map +1 -1
  34. package/dist/date-range.js +38 -17
  35. package/dist/date-range.js.map +1 -1
  36. package/dist/display.d.ts +28 -0
  37. package/dist/display.d.ts.map +1 -1
  38. package/dist/display.js +11 -9
  39. package/dist/display.js.map +1 -1
  40. package/dist/evidence.d.ts +1 -1
  41. package/dist/evidence.js +1 -1
  42. package/dist/evidence.js.map +1 -1
  43. package/dist/feedback.d.ts +1 -1
  44. package/dist/floating-action-button.d.ts +1 -1
  45. package/dist/follow-list.d.ts +58 -0
  46. package/dist/follow-list.d.ts.map +1 -0
  47. package/dist/follow-list.js +25 -0
  48. package/dist/follow-list.js.map +1 -0
  49. package/dist/forms.d.ts +3 -3
  50. package/dist/image-viewer.d.ts +1 -1
  51. package/dist/index.d.ts +1 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/internal/calendar-paint.d.ts +12 -0
  55. package/dist/internal/calendar-paint.d.ts.map +1 -0
  56. package/dist/internal/calendar-paint.js +3 -0
  57. package/dist/internal/calendar-paint.js.map +1 -0
  58. package/dist/internal/identity-action.d.ts +12 -0
  59. package/dist/internal/identity-action.d.ts.map +1 -0
  60. package/dist/internal/identity-action.js +10 -0
  61. package/dist/internal/identity-action.js.map +1 -0
  62. package/dist/internal.d.ts +1 -1
  63. package/dist/layout.d.ts +1 -1
  64. package/dist/overlays.d.ts +4 -0
  65. package/dist/overlays.d.ts.map +1 -1
  66. package/dist/overlays.js +3 -3
  67. package/dist/overlays.js.map +1 -1
  68. package/dist/provider-button.d.ts +1 -1
  69. package/dist/public-exports.generated.d.ts +3 -0
  70. package/dist/public-exports.generated.d.ts.map +1 -1
  71. package/dist/public-exports.generated.js +9 -0
  72. package/dist/public-exports.generated.js.map +1 -1
  73. package/dist/screen-flows.d.ts +33 -4
  74. package/dist/screen-flows.d.ts.map +1 -1
  75. package/dist/screen-flows.js +25 -10
  76. package/dist/screen-flows.js.map +1 -1
  77. package/dist/screens.d.ts +38 -6
  78. package/dist/screens.d.ts.map +1 -1
  79. package/dist/screens.js +26 -12
  80. package/dist/screens.js.map +1 -1
  81. package/dist/selection.d.ts +1 -1
  82. package/dist/social-compositions.d.ts +10 -0
  83. package/dist/social-compositions.d.ts.map +1 -1
  84. package/dist/social-compositions.js +3 -2
  85. package/dist/social-compositions.js.map +1 -1
  86. package/dist/styles.css +108 -46
  87. package/dist/styles.layered.css +108 -46
  88. package/dist/toast.d.ts +1 -1
  89. package/dist/top-bar.d.ts +1 -1
  90. package/package.json +8 -3
@@ -1052,8 +1052,8 @@
1052
1052
  .hjm-card__header-actions { position: relative; z-index: 1; display: flex; flex: 0 0 auto; align-items: center; gap: var(--hjm-space-xs); }
1053
1053
  .hjm-card__leading { flex: 0 0 auto; display: inline-grid; place-items: center; line-height: 1; }
1054
1054
  .hjm-card__copy { flex: 1 1 auto; min-inline-size: 0; display: grid; gap: var(--hjm-space-xs); }
1055
- /* cardRecipe.title.emphasis "strong": without a weight the h2–h6 element fell back to the UA bold (700). */
1056
- .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); font-weight: var(--hjm-text-emphasis-strong); overflow-wrap: anywhere; }
1055
+ /* Follow cardRecipe.title: native headings must not fall back to the UA bold weight. */
1056
+ .hjm-card__title { margin: 0; color: var(--hjm-color-text); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-text-emphasis-medium); overflow-wrap: anywhere; }
1057
1057
  .hjm-card__description { margin: 0; overflow-wrap: anywhere; }
1058
1058
  .hjm-card__actions { display: flex; flex-wrap: wrap; gap: var(--hjm-space-xs); padding: 0 var(--hjm-space-md) var(--hjm-space-md); }
1059
1059
  /* Row rhythm reads the recipe density variables so the stylesheet does not
@@ -1119,7 +1119,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1119
1119
  .hjm-section__copy { display: grid; flex: 1 1 auto; gap: var(--hjm-space-xxs); min-inline-size: 0; }
1120
1120
  /* sectionRecipe.title is the `title` variant (18/26 bold) and description the `caption` variant (11/16), as Native draws them.
1121
1121
  Until 2026-10-06 Web inherited body (14) for both, so the same Section header was smaller on Web. */
1122
- .hjm-section__title { margin: 0; color: var(--hjm-color-text-body); font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-type-title-weight); overflow-wrap: anywhere; }
1122
+ .hjm-section__title { margin: 0; color: var(--hjm-color-text-body); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-type-title-weight); overflow-wrap: anywhere; }
1123
1123
  .hjm-section__description { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); overflow-wrap: anywhere; }
1124
1124
  .hjm-section__action { flex: 0 0 auto; }
1125
1125
  .hjm-section__content { min-inline-size: 0; }
@@ -1184,7 +1184,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1184
1184
  .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; }
1185
1185
  .hjm-statistic[data-density="compact"] .hjm-statistic__label { font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
1186
1186
  .hjm-statistic__value-row { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--hjm-space-xxs); min-inline-size: 0; }
1187
- .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; }
1187
+ .hjm-statistic__value { color: var(--hjm-statistic-value-color, var(--hjm-color-text)); font-size: var(--hjm-type-title-size); line-height: var(--hjm-type-title-line-height); font-weight: var(--hjm-font-weight-semibold); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
1188
1188
  .hjm-statistic[data-density="compact"] .hjm-statistic__value { font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); }
1189
1189
  .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); }
1190
1190
  .hjm-statistic__hint { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); }
@@ -1197,14 +1197,16 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1197
1197
  .hjm-statistic-group { grid-template-columns: minmax(0, 1fr); }
1198
1198
  }
1199
1199
 
1200
- .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); }
1201
- .hjm-notice[data-tone="info"] { border-color: var(--hjm-accent-info); }
1202
- .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)); }
1203
- .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)); }
1204
- .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)); }
1205
- .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)); }
1200
+ /* noticeRecipe 2026-10-25: no outline; tone lives in the tint, the leading accentBar and the icon. The bar is
1201
+ positioned in the padding so it spans the whole notice even when the action wraps to a second line. */
1202
+ .hjm-notice { --hjm-notice-accent: var(--hjm-accent-info); position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: var(--hjm-space-sm); padding: var(--hjm-space-md); padding-inline-start: calc(var(--hjm-space-md) + 4px + var(--hjm-space-sm)); border-radius: var(--hjm-radius-md); color: var(--hjm-color-text-body); background: var(--hjm-color-surface-alt); }
1203
+ .hjm-notice[data-appearance="panel"]::before { content: ""; position: absolute; inset-block: var(--hjm-space-md); inset-inline-start: var(--hjm-space-md); inline-size: 4px; border-radius: var(--hjm-radius-full); background: var(--hjm-notice-accent); }
1204
+ .hjm-notice[data-tone="success"] { --hjm-notice-accent: var(--hjm-accent-success); background: color-mix(in srgb, var(--hjm-accent-success) 10%, var(--hjm-color-bg)); }
1205
+ .hjm-notice[data-tone="warning"] { --hjm-notice-accent: var(--hjm-accent-warning); background: color-mix(in srgb, var(--hjm-accent-warning) 10%, var(--hjm-color-bg)); }
1206
+ .hjm-notice[data-tone="attention"] { --hjm-notice-accent: var(--hjm-accent-attention); background: color-mix(in srgb, var(--hjm-accent-attention) 10%, var(--hjm-color-bg)); }
1207
+ .hjm-notice[data-tone="danger"] { --hjm-notice-accent: var(--hjm-color-danger); background: color-mix(in srgb, var(--hjm-color-danger) 10%, var(--hjm-color-bg)); }
1206
1208
  /* Status is placed inside the saved card/form; Badge carries tone without a second surface. */
1207
- .hjm-notice[data-appearance="status"] { padding: 0; border: 0; background: transparent; }
1209
+ .hjm-notice[data-appearance="status"] { padding: 0; background: transparent; }
1208
1210
  .hjm-notice[data-appearance="status"] .hjm-notice__content { justify-items: start; }
1209
1211
  /* Reserve readable copy; wrap the action instead of crushing its label. */
1210
1212
  .hjm-notice__content { flex: 1 1 60%; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
@@ -1214,7 +1216,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1214
1216
  .hjm-notice__action { flex: 0 0 auto; max-inline-size: 100%; }
1215
1217
  .hjm-notice__title, .hjm-notice__description { overflow-wrap: anywhere; }
1216
1218
  /* noticeRecipe/emptyStateRecipe title weight; the <strong> otherwise draws the UA bold (700). */
1217
- .hjm-notice__title { font-weight: var(--hjm-type-title-weight); }
1219
+ .hjm-notice__title { font-weight: var(--hjm-type-title-weight); color: var(--hjm-color-text); }
1218
1220
 
1219
1221
  /* emptyStateRecipe.density.regular paddingVertical xxxl 40 (2026-10-06; Web had xxl 32, Native read the recipe). */
1220
1222
  /* Like Native, a regular empty state fills the rest of a flex host and centers in it; compact (cards, sheets) stays content-high. */
@@ -1732,18 +1734,29 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1732
1734
  */
1733
1735
  /* Each hit/hover layer belongs to its own day. Without this containing block
1734
1736
  the last absolute layer covered the whole preview and stole pointer clicks. */
1737
+ /* dateRangeRecipe 2026-10-25: one band between two filled edges (Material 3/Airbnb motif) instead of an underline and
1738
+ outlines; the band is as tall as the date circle and rounds off where a week row starts or ends. */
1739
+ .hjm-date-range { display: grid; gap: var(--hjm-space-md); }
1735
1740
  .hjm-date-range .hjm-calendar__day { position: relative; isolation: isolate; }
1736
1741
  .hjm-date-range .hjm-calendar__day-label { position: relative; z-index: 1; pointer-events: none; }
1737
- .hjm-date-range__cell { position: absolute; inset: 0; border-radius: var(--hjm-radius-sm); pointer-events: auto; }
1738
- .hjm-date-range__cell[data-range="between"] { box-shadow: inset 0 -2px var(--hjm-color-content-brand); background: var(--hjm-color-bg); }
1739
- .hjm-date-range__cell[data-range="start"],
1740
- .hjm-date-range__cell[data-range="end"] { background: var(--hjm-color-bg); outline: 2px solid var(--hjm-color-focus); }
1741
- .hjm-date-range__cell[data-range="none"] { background: transparent; }
1742
+ .hjm-calendar__band { position: absolute; inset-block-start: 0; inset-inline: 0; block-size: var(--hjm-calendar-indicator-size, var(--hjm-calendar-cell-size)); background: color-mix(in srgb, var(--hjm-color-primary) 15%, transparent); pointer-events: none; }
1743
+ .hjm-calendar__day[data-range-band="toEnd"] .hjm-calendar__band { inset-inline-start: 50%; }
1744
+ .hjm-calendar__day[data-range-band="toStart"] .hjm-calendar__band { inset-inline-end: 50%; }
1745
+ .hjm-calendar__day:first-child:not([data-range-band="toEnd"]) .hjm-calendar__band { border-start-start-radius: var(--hjm-radius-full); border-end-start-radius: var(--hjm-radius-full); }
1746
+ .hjm-calendar__day:last-child:not([data-range-band="toStart"]) .hjm-calendar__band { border-start-end-radius: var(--hjm-radius-full); border-end-end-radius: var(--hjm-radius-full); }
1747
+ .hjm-calendar__day[data-today][data-selected] .hjm-calendar__day-label { border-color: transparent; }
1748
+ .hjm-date-range__presets { display: flex; flex-wrap: wrap; gap: var(--hjm-space-xs); }
1749
+ .hjm-date-range__summary { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--hjm-space-xs); }
1750
+ .hjm-date-range__field { display: grid; gap: var(--hjm-space-xxs); min-inline-size: 0; padding: var(--hjm-space-xs) var(--hjm-space-sm); border: 2px solid transparent; border-radius: var(--hjm-radius-md); background: var(--hjm-color-surface-alt); }
1751
+ .hjm-date-range__field[data-active] { border-color: var(--hjm-color-primary); }
1752
+ .hjm-date-range__field-label { color: var(--hjm-color-text-muted); font-size: var(--hjm-type-label-size); line-height: var(--hjm-type-label-line-height); }
1753
+ .hjm-date-range__field-value { overflow: hidden; color: var(--hjm-color-text); font-variant-numeric: tabular-nums; text-overflow: ellipsis; white-space: nowrap; }
1754
+ .hjm-date-range__field[data-empty] .hjm-date-range__field-value { color: var(--hjm-color-text-sub); }
1742
1755
 
1743
1756
  /* AvatarGroup: overlap comes from the recipe ratio, not a per-size pixel value. */
1744
1757
  .hjm-avatar-group { display: inline-flex; align-items: center; }
1745
1758
  .hjm-avatar-group > * + * { margin-inline-start: calc(var(--hjm-avatar-overlap) * -1); }
1746
- .hjm-avatar-group > .hjm-avatar { border: 2px solid var(--hjm-color-bg); border-radius: var(--hjm-radius-full); }
1759
+ .hjm-avatar-group > .hjm-avatar, .hjm-avatar-group > .hjm-identity-action .hjm-avatar { border: 2px solid var(--hjm-color-bg); border-radius: var(--hjm-radius-full); }
1747
1760
  .hjm-avatar-group__overflow {
1748
1761
  display: grid;
1749
1762
  place-items: center;
@@ -1776,7 +1789,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
1776
1789
  font-family: var(--hjm-font-family-code, ui-monospace, SFMono-Regular, Consolas, monospace);
1777
1790
  }
1778
1791
  .hjm-text-format[data-kind="kbd"] {
1779
- border: 1px solid var(--hjm-color-border);
1792
+ border: 1px solid color-mix(in srgb, var(--hjm-color-border-control) 50%, transparent);
1780
1793
  color: var(--hjm-color-text-body);
1781
1794
  font-size: var(--hjm-type-label-size);
1782
1795
  }
@@ -2091,7 +2104,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2091
2104
  max-block-size: 12rem;
2092
2105
  margin: var(--hjm-space-xxs) 0 0;
2093
2106
  padding: var(--hjm-space-xxs);
2094
- border: 1px solid var(--hjm-color-border);
2107
+ border: 1px solid color-mix(in srgb, var(--hjm-color-border-control) 50%, transparent);
2095
2108
  border-radius: var(--hjm-radius-md);
2096
2109
  background: var(--hjm-color-bg);
2097
2110
  list-style: none;
@@ -2579,7 +2592,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2579
2592
  block-size: 100dvh;
2580
2593
  min-inline-size: 0;
2581
2594
  overflow: hidden;
2582
- border: 1px solid var(--hjm-color-border);
2595
+ border: 1px solid color-mix(in srgb, var(--hjm-color-border-control) 50%, transparent);
2583
2596
  border-radius: 0;
2584
2597
  color: var(--hjm-color-text);
2585
2598
  background: var(--hjm-color-bg);
@@ -2653,7 +2666,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2653
2666
  overscroll-behavior: contain;
2654
2667
  box-sizing: border-box;
2655
2668
  padding: var(--hjm-space-md);
2656
- border: 1px solid var(--hjm-color-border);
2669
+ border: 1px solid color-mix(in srgb, var(--hjm-color-border-control) 50%, transparent);
2657
2670
  border-radius: var(--hjm-radius-md);
2658
2671
  color: var(--hjm-color-text);
2659
2672
  background: var(--hjm-color-bg);
@@ -2696,7 +2709,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2696
2709
  /* menuRecipe.surface (floatingSurfaceContract) padding spacing.xs 8. Until 2026-10-06 Web drew 4 here and in the
2697
2710
  Select/Combobox/ContextMenu popups that share the same surface contract. */
2698
2711
  padding: var(--hjm-menu-padding, var(--hjm-space-xs));
2699
- border: 1px solid var(--hjm-color-border);
2712
+ border: 1px solid color-mix(in srgb, var(--hjm-color-border-control) 50%, transparent);
2700
2713
  border-radius: var(--hjm-radius-md);
2701
2714
  background: var(--hjm-color-bg);
2702
2715
  box-shadow: var(--hjm-shadow-floating);
@@ -2768,7 +2781,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2768
2781
  .hjm-select__indicator { flex: 0 0 auto; color: var(--hjm-color-text-muted); pointer-events: none; }
2769
2782
  .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; }
2770
2783
  .hjm-select__native + .hjm-select__indicator { margin-inline-start: calc(-1 * var(--hjm-space-lg)); }
2771
- .hjm-select__listbox { position: fixed; z-index: var(--hjm-layer-dropdown); max-inline-size: min(26.25rem, calc(100vw - (2 * var(--hjm-space-md)))); max-block-size: 22.5rem; overflow: auto; padding: var(--hjm-select-popover-padding, var(--hjm-space-xs)); /* selectRecipe.popover.padding 8 (was 4 until 2026-10-06) */ border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); box-shadow: var(--hjm-shadow-floating); }
2784
+ .hjm-select__listbox { position: fixed; z-index: var(--hjm-layer-dropdown); max-inline-size: min(26.25rem, calc(100vw - (2 * var(--hjm-space-md)))); max-block-size: 22.5rem; overflow: auto; padding: var(--hjm-select-popover-padding, var(--hjm-space-xs)); /* selectRecipe.popover.padding 8 (was 4 until 2026-10-06) */ border: 1px solid color-mix(in srgb, var(--hjm-color-border-control) 50%, transparent); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); box-shadow: var(--hjm-shadow-floating); }
2772
2785
  .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-text-emphasis-medium); }
2773
2786
  .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; }
2774
2787
  .hjm-select[data-density="comfortable"] .hjm-select__option,
@@ -2798,7 +2811,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2798
2811
  max-block-size: 22.5rem;
2799
2812
  overflow: auto;
2800
2813
  padding: var(--hjm-combobox-popover-padding, var(--hjm-space-xs)); /* comboboxRecipe.popover = selectRecipe.popover, 8 (was 4 until 2026-10-06) */
2801
- border: 1px solid var(--hjm-color-border);
2814
+ border: 1px solid color-mix(in srgb, var(--hjm-color-border-control) 50%, transparent);
2802
2815
  border-radius: var(--hjm-radius-md);
2803
2816
  background: var(--hjm-color-bg);
2804
2817
  box-shadow: var(--hjm-shadow-floating);
@@ -2884,7 +2897,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
2884
2897
  place-items: center;
2885
2898
  inline-size: var(--hjm-avatar-size, 2.5rem);
2886
2899
  block-size: var(--hjm-avatar-size, 2.5rem);
2887
- border: 1px solid var(--hjm-color-border);
2900
+ border: 1px solid color-mix(in srgb, var(--hjm-color-border-control) 50%, transparent);
2888
2901
  border-radius: 50%;
2889
2902
  color: var(--hjm-color-text-muted);
2890
2903
  background: var(--hjm-color-bg);
@@ -3341,25 +3354,40 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
3341
3354
  .hjm-menu-morph__item[data-tone="danger"] { color: var(--hjm-color-danger); }
3342
3355
  .hjm-menu-morph__item:disabled { opacity: 0.5; cursor: not-allowed; }
3343
3356
 
3344
- /* Selected colors are user data; control surfaces keep the same canvas tokens as other inputs. */
3345
- .hjm-color-picker { border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); color: var(--hjm-color-text); padding: 1rem; margin: 0; min-inline-size: 0; overflow-wrap: anywhere; }
3346
- .hjm-color-picker legend { max-inline-size: 100%; overflow-wrap: anywhere; }
3347
- .hjm-color-picker__row { display: flex; flex-wrap: wrap; gap: 0.75rem; }
3348
- .hjm-color-picker label { display: flex; flex-direction: column; gap: 0.5rem; min-inline-size: 0; }
3349
- .hjm-color-picker__hex { flex: 1 1 10rem; }
3350
- .hjm-color-picker input { box-sizing: border-box; min-block-size: var(--hjm-color-picker-target); min-inline-size: 0; max-inline-size: 100%; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); color: var(--hjm-color-text); font: inherit; }
3351
- .hjm-color-picker input[type="text"] { inline-size: 100%; padding-inline: 0.5rem; }
3352
- .hjm-color-picker input[type="color"] { inline-size: 3rem; padding: 0.25rem; }
3353
- .hjm-color-picker__opacity { margin-block-start: 0.75rem; }
3354
- .hjm-color-picker__opacity input[type="range"] { accent-color: var(--hjm-color-primary); }
3355
- .hjm-color-picker__preview { block-size: 1.5rem; margin-block-start: 0.75rem; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); }
3356
- .hjm-color-picker__presets { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-block-start: 0.75rem; }
3357
- .hjm-color-picker__presets button { display: inline-flex; align-items: center; gap: 0.5rem; min-block-size: var(--hjm-color-picker-target); max-inline-size: 100%; overflow-wrap: anywhere; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); padding: 0.5rem; background: var(--hjm-color-bg); color: var(--hjm-color-text); font: inherit; cursor: pointer; }
3358
- .hjm-color-picker__presets button[aria-pressed="true"] { border-color: var(--hjm-color-primary); }
3359
- .hjm-color-picker__swatch { inline-size: 1rem; block-size: 1rem; flex-shrink: 0; border: 1px solid var(--hjm-color-border); }
3360
- .hjm-color-picker :is(input, button):focus-visible { outline: 2px solid var(--hjm-color-primary); outline-offset: 2px; }
3361
- .hjm-color-picker__error { color: var(--hjm-color-danger); margin-block: 0.5rem; }
3357
+ /* Selected colors are user data; control surfaces keep the same canvas tokens as other inputs. The 2026-10-25 redesign
3358
+ edits HSV: a saturation/brightness area over the hue colour, then hue and opacity bars (Figma/Procreate Classic). */
3359
+ .hjm-color-picker { --hjm-color-picker-checker: repeating-conic-gradient(#d6d6d6 0% 25%, #ffffff 0% 50%) 0 0 / 12px 12px; display: grid; gap: var(--hjm-space-md); border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); color: var(--hjm-color-text); padding: 1rem; margin: 0; min-inline-size: 0; overflow-wrap: anywhere; }
3360
+ .hjm-color-picker legend { max-inline-size: 100%; overflow-wrap: anywhere; padding-inline: 0.25rem; }
3361
+ .hjm-color-picker__area { position: relative; aspect-ratio: var(--hjm-color-picker-area-ratio); border-radius: var(--hjm-radius-md); background: linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, transparent), var(--hjm-color-picker-hue); touch-action: none; cursor: crosshair; user-select: none; }
3362
+ .hjm-color-picker__area[data-disabled] { cursor: not-allowed; }
3363
+ .hjm-color-picker__area:focus-within { outline: var(--hjm-focus-width, 2px) solid var(--hjm-color-focus); outline-offset: 2px; }
3364
+ .hjm-color-picker__area-thumb { position: absolute; inline-size: var(--hjm-color-picker-area-thumb); block-size: var(--hjm-color-picker-area-thumb); box-sizing: border-box; translate: -50% -50%; border: 3px solid #fff; border-radius: 50%; background: var(--hjm-color-picker-opaque); box-shadow: 0 0 0 1px rgb(0 0 0 / 0.3), 0 1px 4px rgb(0 0 0 / 0.35); pointer-events: none; }
3365
+ .hjm-color-picker__bar { appearance: none; -webkit-appearance: none; display: block; inline-size: 100%; block-size: var(--hjm-color-picker-target); margin: 0; background: transparent; cursor: pointer; }
3366
+ .hjm-color-picker__bar::-webkit-slider-runnable-track { block-size: var(--hjm-color-picker-bar); border-radius: 999px; background: var(--hjm-color-picker-bar-fill); box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.12); }
3367
+ .hjm-color-picker__bar::-moz-range-track { block-size: var(--hjm-color-picker-bar); border-radius: 999px; background: var(--hjm-color-picker-bar-fill); box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.12); }
3368
+ .hjm-color-picker__bar::-webkit-slider-thumb { -webkit-appearance: none; inline-size: var(--hjm-color-picker-bar-thumb); block-size: var(--hjm-color-picker-bar-thumb); margin-block-start: calc((var(--hjm-color-picker-bar) - var(--hjm-color-picker-bar-thumb)) / 2); box-sizing: border-box; border: 3px solid #fff; border-radius: 50%; background: var(--hjm-color-picker-bar-thumb-fill); box-shadow: 0 0 0 1px rgb(0 0 0 / 0.3), 0 1px 4px rgb(0 0 0 / 0.35); }
3369
+ .hjm-color-picker__bar::-moz-range-thumb { inline-size: var(--hjm-color-picker-bar-thumb); block-size: var(--hjm-color-picker-bar-thumb); box-sizing: border-box; border: 3px solid #fff; border-radius: 50%; background: var(--hjm-color-picker-bar-thumb-fill); box-shadow: 0 0 0 1px rgb(0 0 0 / 0.3), 0 1px 4px rgb(0 0 0 / 0.35); }
3370
+ .hjm-color-picker__bar--hue { --hjm-color-picker-bar-fill: var(--hjm-color-picker-hue-gradient); --hjm-color-picker-bar-thumb-fill: var(--hjm-color-picker-hue); }
3371
+ .hjm-color-picker__bar--alpha { --hjm-color-picker-bar-fill: linear-gradient(to right, transparent, var(--hjm-color-picker-opaque)), var(--hjm-color-picker-checker); --hjm-color-picker-bar-thumb-fill: linear-gradient(var(--hjm-color-picker-current), var(--hjm-color-picker-current)), var(--hjm-color-picker-checker); }
3372
+ .hjm-color-picker__bar:focus-visible { outline: var(--hjm-focus-width, 2px) solid var(--hjm-color-focus); outline-offset: 2px; border-radius: 999px; }
3373
+ .hjm-color-picker__row { display: flex; align-items: flex-end; gap: 0.75rem; }
3374
+ .hjm-color-picker__preview { flex-shrink: 0; inline-size: var(--hjm-color-picker-preview); block-size: var(--hjm-color-picker-preview); border-radius: 50%; background: linear-gradient(var(--hjm-color-picker-current), var(--hjm-color-picker-current)), var(--hjm-color-picker-checker); box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.15); }
3375
+ .hjm-color-picker__hex { display: flex; flex: 1 1 8rem; flex-direction: column; gap: 0.25rem; min-inline-size: 0; }
3376
+ .hjm-color-picker__hex input { box-sizing: border-box; inline-size: 100%; min-block-size: var(--hjm-color-picker-target); padding-inline: 0.5rem; border: 1px solid var(--hjm-color-border); border-radius: var(--hjm-radius-md); background: var(--hjm-color-bg); color: var(--hjm-color-text); font: inherit; font-variant-numeric: tabular-nums; }
3377
+ .hjm-color-picker__hex input:focus-visible { outline: var(--hjm-focus-width, 2px) solid var(--hjm-color-focus); outline-offset: 2px; }
3378
+ .hjm-color-picker__opacity { min-block-size: var(--hjm-color-picker-target); display: inline-flex; align-items: center; font-variant-numeric: tabular-nums; color: var(--hjm-color-text-muted, inherit); }
3379
+ .hjm-color-picker__error { color: var(--hjm-color-danger); margin: 0; }
3362
3380
  .hjm-color-picker:disabled { opacity: 0.5; }
3381
+ .hjm-color-picker:disabled .hjm-color-picker__bar { cursor: not-allowed; }
3382
+ .hjm-color-swatches { border: 0; margin: 0; padding: 0; min-inline-size: 0; }
3383
+ .hjm-color-swatches legend { padding: 0; margin-block-end: 0.5rem; }
3384
+ .hjm-color-swatches__list { display: flex; flex-wrap: wrap; gap: 0.25rem; }
3385
+ .hjm-color-swatches[data-layout="scroll"] .hjm-color-swatches__list { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; overscroll-behavior-x: contain; }
3386
+ .hjm-color-swatches__item { position: relative; display: inline-grid; place-items: center; flex-shrink: 0; inline-size: var(--hjm-color-swatch-target); block-size: var(--hjm-color-swatch-target); cursor: pointer; }
3387
+ .hjm-color-swatches__swatch { inline-size: var(--hjm-color-swatch-size); block-size: var(--hjm-color-swatch-size); border-radius: 50%; background: linear-gradient(var(--hjm-color-swatch), var(--hjm-color-swatch)), repeating-conic-gradient(#d6d6d6 0% 25%, #ffffff 0% 50%) 0 0 / 10px 10px; box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.15); }
3388
+ .hjm-color-swatches__item input:checked + .hjm-color-swatches__swatch { box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.15), 0 0 0 var(--hjm-color-swatch-gap) var(--hjm-color-bg), 0 0 0 calc(var(--hjm-color-swatch-gap) + var(--hjm-color-swatch-ring)) var(--hjm-color-text); }
3389
+ .hjm-color-swatches__item input:focus-visible + .hjm-color-swatches__swatch { outline: var(--hjm-focus-width, 2px) solid var(--hjm-color-focus); outline-offset: calc(var(--hjm-color-swatch-gap) + var(--hjm-color-swatch-ring) + 2px); }
3390
+ .hjm-color-swatches:disabled .hjm-color-swatches__item { cursor: not-allowed; opacity: 0.5; }
3363
3391
  /* SVG labels are decorative and print with the content; neither selection nor pointer input is intercepted. */
3364
3392
  .hjm-watermark { position: relative; isolation: isolate; }
3365
3393
  .hjm-watermark__content { position: relative; z-index: 0; overflow-wrap: anywhere; }
@@ -3664,8 +3692,8 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3664
3692
  (--hjm-comment-anchor-line, set per row), so like/more glyphs share the author line's centre instead of sitting
3665
3693
  12px below it. When HJM's own like/more is the last control (data-edge), the whole column takes the IconButton edge
3666
3694
  overhang: the 44-wide like count under the heart shares the column, so a margin on the button alone was absorbed. */
3667
- .hjm-comment-row__like { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-start; margin-block-start: calc((var(--hjm-comment-anchor-line) - var(--hjm-control-button-medium)) / 2); }
3668
- .hjm-comment-row__like[data-edge="end"] { margin-inline-end: calc(-1 * var(--hjm-icon-button-edge-medium)); }
3695
+ .hjm-comment-row__like { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-start; margin-block-start: calc((var(--hjm-comment-anchor-line) - var(--hjm-control-button-small)) / 2); }
3696
+ .hjm-comment-row__like[data-edge="end"] { margin-inline-end: calc(-1 * var(--hjm-icon-button-edge-small)); }
3669
3697
  .hjm-comment-row__like-count { text-align: center; }
3670
3698
  .hjm-comment-row__action { align-self: flex-start; padding: 0; border: 0; background: none; color: var(--hjm-color-text-muted); font: inherit; font-size: var(--hjm-type-caption-size); line-height: var(--hjm-type-caption-line-height); font-weight: var(--hjm-text-emphasis-medium); cursor: pointer; }
3671
3699
  .hjm-comment-row__action:disabled { opacity: 0.5; cursor: default; }
@@ -3790,6 +3818,7 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3790
3818
 
3791
3819
  /* Full destination cards keep all names and widths stable; colors remain product semantic roles. */
3792
3820
  .hjm-bottom-navigation[data-selection="tile"] .hjm-bottom-navigation__surface { background: var(--hjm-color-surface-accent); }
3821
+ .hjm-bottom-navigation[data-selection="tile"][data-tone="neutral"] .hjm-bottom-navigation__surface { background: var(--hjm-color-surface); }
3793
3822
  .hjm-bottom-navigation[data-selection="tile"] .hjm-bottom-navigation__list { padding: var(--hjm-space-xxs); gap: var(--hjm-space-xxs); }
3794
3823
  .hjm-bottom-navigation[data-selection="tile"] .hjm-bottom-navigation__item[data-state="selected"] { background: var(--hjm-color-primary); color: var(--hjm-color-on-primary); }
3795
3824
  .hjm-bottom-navigation[data-selection="tile"] .hjm-bottom-navigation__item:not([data-state="selected"]):active { background: var(--hjm-bottom-navigation-pressed-background); }
@@ -3989,4 +4018,37 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3989
4018
  .hjm-chat-room__selected-name { max-inline-size:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
3990
4019
  :is(.hjm-chat-room__tool,.hjm-chat-room__photo,.hjm-chat-room__selected-item):focus-visible { outline:2px solid var(--hjm-color-content-brand); outline-offset:2px; }
3991
4020
 
4021
+ /* FollowListScreen already receives the screen body inset; external tab panels add no second gutter. */
4022
+ .hjm-follow-list__panel { padding-block: 0; }
4023
+
4024
+ /* Narrow pager placement without shrinking the vertical tap target or overlapping adjacent buttons. */
4025
+ .hjm-page-indicator[data-density="compact"][data-interactive="true"] { gap: 0; }
4026
+ .hjm-page-indicator[data-density="compact"] .hjm-page-indicator__dot { min-inline-size: var(--hjm-space-lg); inline-size: var(--hjm-space-lg); padding-inline: 0; }
4027
+
4028
+ /* Identity navigation preserves small avatar geometry while exposing a keyboard/touch target. */
4029
+ .hjm-identity-action { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; min-inline-size: var(--hjm-identity-target); min-block-size: var(--hjm-identity-target); margin: 0; padding: 0; border: 0; border-radius: var(--hjm-radius-full, 9999px); background: transparent; color: inherit; cursor: pointer; }
4030
+ .hjm-identity-action > span { display: inline-flex; }
4031
+ .hjm-identity-action:focus-visible { outline: 2px solid var(--hjm-color-content-brand); outline-offset: 2px; }
4032
+ .hjm-identity-action:active { opacity: var(--hjm-identity-pressed-opacity); }
4033
+ .hjm-identity-action:disabled { cursor: default; }
4034
+
4035
+ /* Independent identity navigation is a sibling of row commands, including links. */
4036
+ .hjm-list-row__profile { display: flex; flex: 0 0 auto; padding-inline-start: var(--hjm-list-row-inline); }
4037
+ .hjm-list-row-frame[data-leading-action] > .hjm-list-row { padding-inline-start: 0; }
4038
+ .hjm-list-row-frame[data-leading-action]:not([data-trailing-action]) > .hjm-list-row { padding-inline-end: var(--hjm-list-row-inline); }
4039
+
4040
+ .hjm-card[data-activation="overlay"] .hjm-card__leading[data-interactive] { position: relative; z-index: 1; }
4041
+
4042
+ /* Header dismissal keeps a single modal surface and leaves the action viewport scrollable. */
4043
+ .hjm-menu__content[data-presentation="bottom"][data-dismiss-placement="header"] { background: var(--hjm-color-bg); padding: var(--hjm-space-sm); }
4044
+ .hjm-menu__header { display: flex; align-items: center; gap: var(--hjm-space-sm); flex-shrink: 0; }
4045
+ .hjm-menu__heading { flex: 1; min-inline-size: 0; display: grid; gap: var(--hjm-space-xxs); }
4046
+ .hjm-menu__title { font-weight: var(--hjm-text-emphasis-strong); }
4047
+ .hjm-menu__subtitle { font-size: var(--hjm-type-label-size); color: var(--hjm-color-text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
4048
+
4049
+ /* Relationship lists use the large Avatar (48) and 64px rows so identity stays legible beside actions. */
4050
+ .hjm-follow-list__person { min-block-size: 64px; }
4051
+ .hjm-list-row__leading[data-size="large"] { inline-size: 48px; block-size: 48px; }
4052
+ .hjm-follow-list__relationship { min-inline-size: 108px; }
4053
+
3992
4054
  }
package/dist/toast.d.ts CHANGED
@@ -6,7 +6,7 @@ export type ToastProps = Omit<HTMLAttributes<HTMLDivElement>, "children" | "titl
6
6
  onDismissRequest: (reason: ToastDismissReason) => void;
7
7
  }>;
8
8
  /** Controlled single-toast renderer; ToastProvider supplies the full FIFO lifecycle. */
9
- export declare const Toast: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "title" | "children"> & Readonly<{
9
+ export declare const Toast: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "children" | "title"> & Readonly<{
10
10
  descriptor: ToastDescriptor;
11
11
  onDismissRequest: (reason: ToastDismissReason) => void;
12
12
  }> & import("react").RefAttributes<HTMLDivElement>>;
package/dist/top-bar.d.ts CHANGED
@@ -24,7 +24,7 @@ export type TopBarProps = Omit<HTMLAttributes<HTMLDivElement>, "title" | "childr
24
24
  layoutStyle?: HjmCompositionStyleProp;
25
25
  }>;
26
26
  /** Screen chrome stays composable inside pages and dialogs, without adding a second banner landmark. */
27
- export declare const TopBar: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "title" | "children"> & Readonly<{
27
+ export declare const TopBar: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "children" | "title"> & Readonly<{
28
28
  title?: string;
29
29
  /** Product control in the shared title slot; exclusive with text title affordances. */
30
30
  titleContent?: ReactNode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hjmds/react",
3
- "version": "1.46.1",
3
+ "version": "1.47.0",
4
4
  "description": "Accessible React 19 renderers for HJM design contracts.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -613,6 +613,11 @@
613
613
  "types": "./dist/image-viewer.d.ts",
614
614
  "import": "./dist/image-viewer.js",
615
615
  "default": "./dist/image-viewer.js"
616
+ },
617
+ "./follow-list": {
618
+ "types": "./dist/follow-list.d.ts",
619
+ "import": "./dist/follow-list.js",
620
+ "default": "./dist/follow-list.js"
616
621
  }
617
622
  },
618
623
  "files": [
@@ -623,7 +628,7 @@
623
628
  "THIRD_PARTY_NOTICES.md"
624
629
  ],
625
630
  "peerDependencies": {
626
- "@hjmds/design-contracts": ">=1.46.0 <1.47.0",
631
+ "@hjmds/design-contracts": ">=1.47.0 <1.48.0",
627
632
  "react": ">=19.0.0",
628
633
  "react-dom": ">=19.0.0",
629
634
  "@number-flow/react": "0.6.2",
@@ -661,7 +666,7 @@
661
666
  "@blobatar/react": "2.7.0",
662
667
  "lucide-react": "1.59.0",
663
668
  "vite": "8.3.4",
664
- "@hjmds/design-contracts": "1.46.1"
669
+ "@hjmds/design-contracts": "1.47.0"
665
670
  },
666
671
  "peerDependenciesMeta": {
667
672
  "@number-flow/react": {