@hjmds/design-contracts 1.9.0 → 1.11.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 (190) hide show
  1. package/dist/action-session.d.ts +47 -0
  2. package/dist/action-session.d.ts.map +1 -0
  3. package/dist/action-session.js +60 -0
  4. package/dist/action-session.js.map +1 -0
  5. package/dist/activity-heatmap.d.ts +22 -0
  6. package/dist/activity-heatmap.d.ts.map +1 -0
  7. package/dist/activity-heatmap.js +29 -0
  8. package/dist/activity-heatmap.js.map +1 -0
  9. package/dist/auth-screen.d.ts +4 -0
  10. package/dist/auth-screen.d.ts.map +1 -1
  11. package/dist/auth-screen.js +2 -0
  12. package/dist/auth-screen.js.map +1 -1
  13. package/dist/avatar-fallback.d.ts +25 -0
  14. package/dist/avatar-fallback.d.ts.map +1 -0
  15. package/dist/avatar-fallback.js +17 -0
  16. package/dist/avatar-fallback.js.map +1 -0
  17. package/dist/behaviors.d.ts +2 -2
  18. package/dist/bottom-navigation-defaults.d.ts +1 -1
  19. package/dist/bottom-navigation-defaults.d.ts.map +1 -1
  20. package/dist/bottom-navigation-defaults.js.map +1 -1
  21. package/dist/bottom-navigation.d.ts.map +1 -1
  22. package/dist/bottom-navigation.js +5 -1
  23. package/dist/bottom-navigation.js.map +1 -1
  24. package/dist/catalog.d.ts +67 -5
  25. package/dist/catalog.d.ts.map +1 -1
  26. package/dist/code-block.d.ts +23 -0
  27. package/dist/code-block.d.ts.map +1 -0
  28. package/dist/code-block.js +13 -0
  29. package/dist/code-block.js.map +1 -0
  30. package/dist/component-definitions.d.ts +2 -3
  31. package/dist/component-definitions.d.ts.map +1 -1
  32. package/dist/component-definitions.js +1 -2
  33. package/dist/component-definitions.js.map +1 -1
  34. package/dist/component-recipes.d.ts +63 -5
  35. package/dist/component-recipes.d.ts.map +1 -1
  36. package/dist/component-recipes.js +33 -6
  37. package/dist/component-recipes.js.map +1 -1
  38. package/dist/component-references.d.ts +0 -6
  39. package/dist/component-references.d.ts.map +1 -1
  40. package/dist/component-references.js +0 -5
  41. package/dist/component-references.js.map +1 -1
  42. package/dist/content-transition.d.ts +17 -0
  43. package/dist/content-transition.d.ts.map +1 -0
  44. package/dist/content-transition.js +15 -0
  45. package/dist/content-transition.js.map +1 -0
  46. package/dist/duration-field.d.ts +22 -0
  47. package/dist/duration-field.d.ts.map +1 -0
  48. package/dist/duration-field.js +20 -0
  49. package/dist/duration-field.js.map +1 -0
  50. package/dist/effect-surface.d.ts +29 -0
  51. package/dist/effect-surface.d.ts.map +1 -0
  52. package/dist/effect-surface.js +26 -0
  53. package/dist/effect-surface.js.map +1 -0
  54. package/dist/gooey-navigation.d.ts +13 -0
  55. package/dist/gooey-navigation.d.ts.map +1 -0
  56. package/dist/gooey-navigation.js +11 -0
  57. package/dist/gooey-navigation.js.map +1 -0
  58. package/dist/gravity-letters.d.ts +12 -0
  59. package/dist/gravity-letters.d.ts.map +1 -0
  60. package/dist/gravity-letters.js +11 -0
  61. package/dist/gravity-letters.js.map +1 -0
  62. package/dist/grid-reveal.d.ts +8 -0
  63. package/dist/grid-reveal.d.ts.map +1 -0
  64. package/dist/grid-reveal.js +5 -0
  65. package/dist/grid-reveal.js.map +1 -0
  66. package/dist/internal/object-validation.d.ts +3 -0
  67. package/dist/internal/object-validation.d.ts.map +1 -0
  68. package/dist/internal/object-validation.js +12 -0
  69. package/dist/internal/object-validation.js.map +1 -0
  70. package/dist/internal/thinking-orb/braid.d.ts.map +1 -1
  71. package/dist/internal/thinking-orb/braid.js +2 -9
  72. package/dist/internal/thinking-orb/braid.js.map +1 -1
  73. package/dist/internal/thinking-orb/core.d.ts +1 -0
  74. package/dist/internal/thinking-orb/core.d.ts.map +1 -1
  75. package/dist/internal/thinking-orb/core.js +12 -0
  76. package/dist/internal/thinking-orb/core.js.map +1 -1
  77. package/dist/internal/thinking-orb/presentation.d.ts +4 -0
  78. package/dist/internal/thinking-orb/presentation.d.ts.map +1 -0
  79. package/dist/internal/thinking-orb/presentation.js +28 -0
  80. package/dist/internal/thinking-orb/presentation.js.map +1 -0
  81. package/dist/internal/thinking-orb/ribbon.d.ts.map +1 -1
  82. package/dist/internal/thinking-orb/ribbon.js +2 -9
  83. package/dist/internal/thinking-orb/ribbon.js.map +1 -1
  84. package/dist/layout.d.ts +0 -5
  85. package/dist/layout.d.ts.map +1 -1
  86. package/dist/layout.js +0 -7
  87. package/dist/layout.js.map +1 -1
  88. package/dist/otp-field.d.ts +2 -0
  89. package/dist/otp-field.d.ts.map +1 -1
  90. package/dist/otp-field.js.map +1 -1
  91. package/dist/popover.d.ts.map +1 -1
  92. package/dist/popover.js +3 -12
  93. package/dist/popover.js.map +1 -1
  94. package/dist/reactions.d.ts +10 -0
  95. package/dist/reactions.d.ts.map +1 -0
  96. package/dist/reactions.js +20 -0
  97. package/dist/reactions.js.map +1 -0
  98. package/dist/scroll-progress.d.ts +8 -0
  99. package/dist/scroll-progress.d.ts.map +1 -0
  100. package/dist/scroll-progress.js +10 -0
  101. package/dist/scroll-progress.js.map +1 -0
  102. package/dist/task-list.d.ts +7 -0
  103. package/dist/task-list.d.ts.map +1 -0
  104. package/dist/task-list.js +4 -0
  105. package/dist/task-list.js.map +1 -0
  106. package/dist/theme-studio.d.ts +14 -0
  107. package/dist/theme-studio.d.ts.map +1 -0
  108. package/dist/theme-studio.js +16 -0
  109. package/dist/theme-studio.js.map +1 -0
  110. package/dist/thinking-orb.d.ts +4 -2
  111. package/dist/thinking-orb.d.ts.map +1 -1
  112. package/dist/thinking-orb.js +8 -3
  113. package/dist/thinking-orb.js.map +1 -1
  114. package/dist/toast-liquid.d.ts +4 -4
  115. package/dist/toast-liquid.d.ts.map +1 -1
  116. package/dist/toast-liquid.js +11 -10
  117. package/dist/toast-liquid.js.map +1 -1
  118. package/dist/toast.d.ts +4 -4
  119. package/dist/toast.d.ts.map +1 -1
  120. package/dist/toast.js +4 -3
  121. package/dist/toast.js.map +1 -1
  122. package/dist/tooltip.d.ts.map +1 -1
  123. package/dist/tooltip.js +3 -12
  124. package/dist/tooltip.js.map +1 -1
  125. package/dist/version.d.ts +1 -1
  126. package/dist/version.d.ts.map +1 -1
  127. package/dist/version.js +1 -1
  128. package/dist/version.js.map +1 -1
  129. package/dist/voice-note.d.ts +20 -0
  130. package/dist/voice-note.d.ts.map +1 -0
  131. package/dist/voice-note.js +16 -0
  132. package/dist/voice-note.js.map +1 -0
  133. package/docs/action-session.md +73 -0
  134. package/docs/activity-heatmap.md +32 -0
  135. package/docs/anchor.md +1 -1
  136. package/docs/auth-screen.md +44 -4
  137. package/docs/authoring-brief.md +5 -0
  138. package/docs/avatar-fallback.md +74 -0
  139. package/docs/bottom-navigation.md +16 -1
  140. package/docs/breadcrumb.md +1 -1
  141. package/docs/calendar.md +1 -1
  142. package/docs/cascader.md +1 -1
  143. package/docs/code-block.md +32 -0
  144. package/docs/command-palette.md +1 -1
  145. package/docs/compound-controls.md +83 -0
  146. package/docs/confirm-popover.md +1 -1
  147. package/docs/consumer-policy.md +30 -23
  148. package/docs/cross-platform-core-normalization.md +19 -21
  149. package/docs/data-table.md +8 -5
  150. package/docs/dialog.md +2 -0
  151. package/docs/effect-surface.md +50 -0
  152. package/docs/floating-action-button.md +1 -1
  153. package/docs/folder-preview.md +26 -0
  154. package/docs/generated/component-maturity.md +1 -1
  155. package/docs/generated/renderer-evidence.json +3 -3
  156. package/docs/generated/renderer-evidence.md +1 -1
  157. package/docs/generated/showcase-manifest.json +1 -1
  158. package/docs/gooey-navigation.md +36 -0
  159. package/docs/gravity-letters.md +26 -0
  160. package/docs/grid-reveal.md +11 -0
  161. package/docs/icon.md +26 -0
  162. package/docs/image.md +2 -2
  163. package/docs/layout.md +1 -2
  164. package/docs/migration-0.5.md +4 -1
  165. package/docs/migration-native-legacy-removal.md +59 -0
  166. package/docs/navigation-bar.md +28 -0
  167. package/docs/optional-adapters.md +24 -1
  168. package/docs/otp-field.md +15 -0
  169. package/docs/pagination.md +1 -1
  170. package/docs/popover.md +2 -2
  171. package/docs/product-adoption-1.4.md +7 -0
  172. package/docs/product-audit-2026-09-15.md +1 -1
  173. package/docs/provider-button.md +6 -3
  174. package/docs/rating.md +1 -1
  175. package/docs/react-native-completion.md +4 -4
  176. package/docs/screen-chrome.md +1 -1
  177. package/docs/scroll-progress.md +29 -0
  178. package/docs/sheet.md +2 -0
  179. package/docs/sidebar.md +6 -0
  180. package/docs/splitter.md +1 -1
  181. package/docs/step-player.md +16 -0
  182. package/docs/task-list.md +32 -0
  183. package/docs/theme-studio.md +13 -0
  184. package/docs/thinking-orb.md +9 -2
  185. package/docs/time-picker.md +1 -1
  186. package/docs/toast.md +27 -8
  187. package/docs/tour.md +1 -1
  188. package/docs/tree-select.md +2 -2
  189. package/docs/voice-note.md +19 -0
  190. package/package.json +91 -1
@@ -1,5 +1,7 @@
1
1
  # Cross-platform core normalization
2
2
 
3
+ 검토일: 2026-10-02 · 2.0 source contract
4
+
3
5
  Text, Surface, Stack, Grid, Button, IconButton, Tag, Card의 공통 의미 축은 contracts가 소유하고 Web과
4
6
  Native renderer는 각 플랫폼 host로 번역한다. 라이브러리 비교와 채택/기각 근거는
5
7
  [library-reference-decisions.md](./library-reference-decisions.md)를 따른다.
@@ -53,7 +55,8 @@ edge를 항상 그린다.
53
55
 
54
56
  ## 0.5 compatibility aliases
55
57
 
56
- 0.6에서 canonical API로 옮길 수 있도록 기존 Native 호출은 당분간 동작한다.
58
+ 아래는 0.6 이관 당시의 before/canonical 비교다. 현재 지원 여부는 각 API 타입을 따른다.
59
+ 아래 before API는 모두 [2.0 이관](./migration-native-legacy-removal.md)에서 제거했다.
57
60
 
58
61
  ```tsx
59
62
  // before
@@ -73,30 +76,25 @@ edge를 항상 그린다.
73
76
  <IconButton label="닫기" tone="ghost"><CloseIcon /></IconButton>
74
77
  ```
75
78
 
76
- - Native `Stack.direction`: `row → inline`, `column → block` deprecated alias
77
- - Native `Button.label`, `Tag.label`: `children` deprecated alias
78
- - Native `Surface.sunken`, `Surface.brand`: 각각 `subtle`, `accent` deprecated alias
79
- - Native `Grid.descriptor`: flat `columns`/`gap`/`minColumnWidth`를 위한 deprecated alias
80
- - Native `IconButton.accessibilityLabel`, `icon`: `label`, `children` deprecated alias
81
- - Native `IconButton tone="link"`: `ghost`로 번역되는 deprecated alias
82
-
83
- 호환 alias는 새 문서와 예제에서 사용하지 않는다. 제거는 major release에서만 한다.
79
+ Native `Surface.sunken`은 공통 recipe에 독립적으로 정의된 tone이며 deprecated alias가 아니다.
80
+ `brand`만 제거하고 `accent`로 이관한다. 1.x의 호환 별칭 지원 설명은 현재 2.0 소스에 적용하지 않는다.
84
81
 
85
82
  ## Collection and state vocabulary
86
83
 
87
- 공통 제품 코드에서 같은 역할은 같은 이름을 사용한다. Web을 기준으로 Native의 비파괴 호환
88
- bridge를 추가했으며, 새 코드는 canonical 열만 사용한다.
84
+ 공통 제품 코드에서 같은 역할은 같은 이름을 사용한다. 1.x에서 제공했던 Native bridge를
85
+ 2.0에서 제거했으므로 아래 canonical API만 사용한다.
89
86
 
90
- | Component | Canonical Web/Native API | Deprecated Native alias |
91
- | --- | --- | --- |
92
- | Switch | `checked`, `defaultChecked`, `onCheckedChange` | `value`, `defaultValue`, `onValueChange` |
93
- | RadioGroup | `items: RadioGroupItem[]` | `options: RadioOption[]` |
94
- | SegmentedControl | `items: SegmentedControlItem[]` | `options: SegmentedControlOption[]` |
95
- | Tabs | `items: TabItem[]`, item key `id` | `options: TabOption[]`, item key `value` |
96
- | Select | `source`/`items`/`sections`, `selectedKey`, `defaultSelectedKey`, `onSelectionChange` | `options`, `value`, `defaultValue`, `onValueChange` |
97
-
98
- 한 인스턴스에서 canonical과 deprecated channel을 함께 전달하면 타입과 runtime 모두 실패한다.
99
- 이 규칙은 TypeScript를 우회하는 JavaScript 소비자에게도 결정적인 상태 모델을 보장한다.
87
+ | Component | Canonical Web/Native API |
88
+ | --- | --- |
89
+ | Switch | `checked`, `defaultChecked`, `onCheckedChange` |
90
+ | RadioGroup | `items: RadioGroupItem[]` |
91
+ | SegmentedControl | `items: SegmentedControlItem[]` |
92
+ | Tabs | `items: TabItem[]`, item key `id` |
93
+ | Select | `source`/`items`/`sections`, `selectedKey`, `defaultSelectedKey`, `onSelectionChange` |
94
+ | Menu | 항목 key `id`, 실행 `onAction`, 선택 `selection.onSelectionChange` |
95
+
96
+ Web Menu의 선택 prop 배치는 Web Menu 타입을 따른다. 두 플랫폼 모두 실행과 선택 변경을
97
+ 구분하며 item-local `onSelect` 또는 Native `onSelect` 호환 콜백은 사용하지 않는다.
100
98
 
101
99
  ## Reference application notes
102
100
 
@@ -84,10 +84,13 @@ async 상태와 narrow long-copy 회귀로 확인하고, 소비 제품의 데이
84
84
  `@hjmds/react/data-table`의 `DataTable`이 이 계약을 실행한다. Web renderer는 전용 keyboard·
85
85
  selection·320px long-copy proof를 통과해 2026-09-29 stable로 승격한다. Native는 `unsupported`다.
86
86
 
87
- - **기존 `Table`과 겹치지 않는다.** `@hjmds/react`의 `Table`(advanced-display)은 열·행을
88
- 그려 주는 표시용이고 선택·tri-state·async 상태·정렬 상태 순환이 없다. DataTable은 그
89
- 상호작용 계약을 실행하는 쪽이다. 단순 표는 계속 `Table`을 쓴다 — 같은 화면에 둘을 겹쳐
90
- 쓰지 않는다.
87
+ - **기존 `Table`과 정렬 기능은 공유한다.** 2026-10-01 중복 조사에서 Table도 정렬 버튼과
88
+ ascending/descending 순환을 제공하는데 표시 전용으로 설명했던 불일치를 확인했다.
89
+ Table은 generic row·caption·emptyState와 두 방향 정렬을 제공하고, DataTable은
90
+ ID 기반 row/column·선택·tri-state·async 상태 및 정렬 해제를 포함하는 세 상태 순환을 제공한다.
91
+ 정렬 전환은 같은 계약 함수, header button은 같은 내부 renderer를 소비한다.
92
+ caption과 단순 generic row 표는 Table, 행 선택·loading/error와 정렬 해제가 필요한 표는
93
+ DataTable을 선택한다. API를 합치면 caption·emptyState·row 모델 호환성을 잃으므로 두 API를 유지한다.
91
94
  - **정렬 버튼은 header 안에 있다.** `th` 자체를 버튼으로 만들지 않고, 방향은
92
95
  `aria-sort`에 그대로 흘린다. 다음 상태는 `getNextDataTableSortState`가 정하고 실제 정렬은
93
96
  제품이 한다.
@@ -103,4 +106,4 @@ selection·320px long-copy proof를 통과해 2026-09-29 stable로 승격한다.
103
106
  - 로컬 검증: `test/data-table.browser.test.tsx` 5개(header 안 정렬 버튼과 aria-sort 3단계,
104
107
  tri-state 선택과 disabled 제외, 단일 선택 radio 의미, 셀당 컨트롤 하나와 기본 tab 순서,
105
108
  async 상태 발표와 footer 조합), `test/data-table.keyboard.browser.test.tsx` 1개(실제 Tab·Enter·Space
106
- 입력), 그리고 `Patterns/CommandPalette`의 표 화면.
109
+ 입력), 그리고 `컴포넌트/탐색/Command Palette`의 표 화면.
package/docs/dialog.md CHANGED
@@ -37,3 +37,5 @@ a narrow viewport. React Native renderer tests cover modal role/name/state,
37
37
  action labels and close requests, back/outside dismissal, busy guards, and long
38
38
  title/description copy. These tests exercise renderer contracts; device and
39
39
  screen-reader behavior remains a separate consumer validation concern.
40
+
41
+ Native accessibility follow-up (2026-10-01): at 200% text scale, the close glyph was clipped inside the fixed IconButton frame. Dialog and Sheet now render that decorative glyph at a fixed icon size, matching Toast; title/body text still scales and the named close action and touch target are preserved. `sheet-viewport.test.tsx` checks both renderers and close callbacks.
@@ -0,0 +1,50 @@
1
+ # Composable decorative surfaces
2
+
3
+ 2026-10-01. Optional Web/Native presentation, independent implementation inspired
4
+ by layered shader composition. No Shaders.com engine, presets or source is shipped.
5
+
6
+ Import `EffectSurface` from the renderer `/effect-surface` entry. The shared
7
+ `/effect-surface` contract accepts unique `layers` (`mesh`, `glow`, `grain`), a
8
+ stable `seed`, `intensity` from 0 to 1, a cycle `period` from 2 to 120 seconds,
9
+ `active` (false by default), and three semantic color references. Web uses local
10
+ SVG/WAAPI; Native requires the existing optional SVG peer and core Animated.
11
+ No WebGPU context, network request or new native animation runtime is required.
12
+
13
+ ```tsx
14
+ <EffectSurface descriptor={{ layers: ['mesh', 'grain'], seed: 'welcome', active: true }}>
15
+ <WelcomeContent />
16
+ </EffectSurface>
17
+ ```
18
+
19
+ Web accepts `className`; Native accepts container `style` and host `visible`.
20
+ Native screen/list owners must pass `visible={false}` when hidden or outside the
21
+ visible list window. Web observes intersection and document visibility. Both
22
+ honor the HJM provider's reduced-motion setting; Native also handles AppState.
23
+ The static seeded geometry and the base theme background stay visible when motion
24
+ stops. Effects never duplicate content, take focus, intercept touches or add an
25
+ accessible name. The content itself stays in normal layout.
26
+
27
+ Noise uses a seeded repeating small-dot tile rather than large spots. Geometry
28
+ is shared, while host rasterization and transform details can differ. This is
29
+ atmospheric parity, not a pixel-identical renderer promise. Motion is opt-in and
30
+ slow by default to avoid adding continuous work to ordinary content screens.
31
+ Use `active` only while an effect matters; avoid many simultaneously moving rows.
32
+
33
+ The component does not automatically guarantee text contrast across arbitrary
34
+ brand colors/intensities. Verify the actual composition or put important text
35
+ and controls on an opaque HJM Surface. The fallback background is the current
36
+ provider background, not an independently selected palette.
37
+
38
+ `갤러리/시각 효과` demonstrates layers separately and together.
39
+ This optional surface is supplemental presentation; it does not add another
40
+ canonical Surface or replace ThinkingOrb's actual-work state semantics.
41
+
42
+
43
+ Host failure fallback (2026-10-02): if Web animation creation is rejected, the SVG
44
+ stays static and no visibility event repeatedly retries it. Native SVG/Animated
45
+ render errors remove only the decoration until the surface remounts; product
46
+ children keep their state and remain interactive on the base theme background.
47
+ A failed Native foreground animation start keeps the static decoration and stops
48
+ retrying for that effect lifecycle. Descriptor validation stays outside this
49
+ fallback so invalid caller input is still reported. This implements integration
50
+ plan §5's requirement that decorative failures must not remove product content.
@@ -109,7 +109,7 @@ FAB는 collection 항목이 아니다. 스크롤 콘텐츠 **뒤**에 오는 고
109
109
 
110
110
  ## 검증 화면
111
111
 
112
- 2026-09-16: React/RN `Patterns/Floating action button`에 스크롤 목록 → 기록 작성
112
+ 2026-09-16: React/RN `패턴/빠른 메모 작성`에 스크롤 목록 → 기록 작성
113
113
  Dialog → 새 기록 추가 흐름을 구현했다. Flutter 앱은 이번 이관 범위에서 제외한다.
114
114
 
115
115
  ## React / React Native 공개 API
@@ -0,0 +1,26 @@
1
+ # Folder preview
2
+
3
+ Reviewed: 2026-10-01. Both renderers expose FolderPreview through `/folder-preview`.
4
+ It is an optional Collapsible composition for collections with a decorative cover,
5
+ not a new navigation or overlay controller. Pass localized `label`, controlled
6
+ `open`, `onOpenChange`, up to three useful `previews`, actual `children`, and optional
7
+ `disabled`. Further preview nodes are intentionally not rendered.
8
+
9
+ Previews are decorative snapshots, not interactive controls. Their wrapper is inert
10
+ on Web and hides descendants from Native accessibility/touch. Use existing Asset or
11
+ Image components in slots when artwork is needed, and repeat meaningful item names
12
+ and actions in expanded children. The label should describe the collection/count.
13
+ The existing Collapsible owns expanded state and unmounts closed content.
14
+
15
+ The bounded 260×160 artwork uses overlapping cards that fan out when opened. Web
16
+ transitions transforms and respects reduced motion. Native uses the existing
17
+ ContentTransition around the artwork, inheriting its reduced-motion/AppState rules.
18
+ Labels and real content remain fluid; the illustration is not their sizing model.
19
+
20
+ Both showcases register 컴포넌트/데이터 표시/Folder Preview with Default, Dark and
21
+ LargeText. Tests cover controlled expansion and decorative accessibility boundaries.
22
+ [Native and Web LargeText flow evidence](../../../docs/evidence/component-flows-2026-10-01/README.md)
23
+ verifies opening/closing and readable expanded content. The examples use document line
24
+ artwork in decorative slots: enlarged text there previously overlapped inside the fixed
25
+ illustration. Actual item names remain in the fluid content below. Physical-device and
26
+ manually heard screen-reader verification remain separate.
@@ -1,6 +1,6 @@
1
1
  # Component maturity and evidence manifest
2
2
 
3
- > Generated from `@hjmds/design-contracts` 1.9.0. Do not edit this file directly; run `pnpm contracts:sync`.
3
+ > Generated from `@hjmds/design-contracts` 1.11.0. Do not edit this file directly; run `pnpm contracts:sync`.
4
4
 
5
5
  This document is the human-readable projection of the same catalog and Showcase manifest consumed by product CI.
6
6
 
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "designSystemVersion": "1.9.0",
3
+ "designSystemVersion": "1.11.0",
4
4
  "source": "packages/design-contracts/docs/generated/showcase-manifest.json",
5
5
  "surfaces": {
6
6
  "web": {
7
7
  "packageName": "@hjmds/react",
8
- "packageVersion": "1.9.0",
8
+ "packageVersion": "1.11.0",
9
9
  "activeComponents": 103,
10
10
  "claimedComponents": 103,
11
11
  "completeScenarioComponents": 103,
@@ -5642,7 +5642,7 @@
5642
5642
  },
5643
5643
  "native": {
5644
5644
  "packageName": "@hjmds/react-native",
5645
- "packageVersion": "1.9.0",
5645
+ "packageVersion": "1.11.0",
5646
5646
  "activeComponents": 83,
5647
5647
  "claimedComponents": 83,
5648
5648
  "completeScenarioComponents": 83,
@@ -1,6 +1,6 @@
1
1
  # Renderer evidence coverage
2
2
 
3
- > Generated for HJM 1.9.0. Do not edit directly; run `pnpm evidence:sync`.
3
+ > Generated for HJM 1.11.0. Do not edit directly; run `pnpm evidence:sync`.
4
4
 
5
5
  This projection joins the canonical surface maturity manifest with first-party renderer claims. Missing scenarios are explicit beta promotion debt; stable surfaces are blocked by CI until none remain.
6
6
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "designSystemVersion": "1.9.0",
3
+ "designSystemVersion": "1.11.0",
4
4
  "packageName": "@hjmds/design-contracts",
5
5
  "components": [
6
6
  {
@@ -0,0 +1,36 @@
1
+ # Gooey navigation
2
+
3
+ Reviewed: 2026-10-01
4
+
5
+ Use the existing `Tabs` from `@hjmds/react/navigation` or
6
+ `@hjmds/react-native/navigation` with `appearance="gooey"`. The default remains
7
+ `standard`. A new navigation controller would duplicate existing selection,
8
+ keyboard, disabled-item and panel contracts, so only the selected indicator is
9
+ extended. Vertical tabs deliberately retain the standard line: stretching a
10
+ horizontal bridge across a vertical list would obscure unrelated items.
11
+
12
+ `@hjmds/design-contracts/gooey-navigation` owns the measured source/destination
13
+ bridge. It expands to the union of their edges at 45% progress, then contracts to
14
+ the destination over 320ms. This independently authored elastic presentation
15
+ uses no copied effects, shader or physics engine. Six-point indicator height is
16
+ decorative geometry; colors and corner radius reuse tokens. Text and hit targets
17
+ never transform. On Web, selected-tab measurements and ResizeObserver track
18
+ font/viewport changes; Native uses tab onLayout measurements. Measured physical
19
+ coordinates also support RTL and horizontal scrolling.
20
+
21
+ Reduced motion, backgrounding and cleanup settle the indicator without changing
22
+ selection. Native width animation uses Core Animated's JS driver because width
23
+ cannot use the native transform driver without distorting corner radii. No new
24
+ optional animation dependency is introduced. Rapid re-selection targets the last
25
+ selected tab; this is deterministic selection feedback, not a physics simulation.
26
+
27
+ Both Storybooks expose `컴포넌트 / 탐색 / Gooey Navigation` with Default,
28
+ Dark and LargeText plus a direction toggle. Disabled tabs, existing activation
29
+ mode and panel associations remain canonical. The Native renderer is tested with
30
+ mock layout events; actual device appearance remains to be verified.
31
+
32
+ Native horizontal scrollable Tabs centers the selected measured tab within the scroll
33
+ content bounds when selection, direction or viewport width changes. This corrects a
34
+ LargeText RTL selected-label clipping issue found in the [device flow audit](../../../docs/evidence/component-flows-2026-10-01/README.md).
35
+ The standard appearance shares this behavior; fitted and non-scrollable lists do not
36
+ programmatically scroll. Selection semantics and the host's panel ownership are unchanged.
@@ -0,0 +1,26 @@
1
+ # Gravity Letters
2
+
3
+ Reviewed: 2026-10-01
4
+
5
+ Optional `@hjmds/react/gravity-letters` and `@hjmds/react-native/gravity-letters`
6
+ provide an independently authored promotional drop/rebound accent. This is not a
7
+ replacement for Text or ContentTransition: the whole effect is decorative and
8
+ hidden from accessibility APIs. Keep the meaningful static heading outside it.
9
+ The Web presentation inherits typography; Native uses canonical heading Text.
10
+
11
+ Pass `glyphs` as host-segmented graphemes/words (at most 32 nonempty single-line
12
+ strings). Never split emoji or complex scripts with UTF-16 `split("")`. Spaces
13
+ are preserved. The bound prevents a headline effect becoming paragraph-scale
14
+ animation work. `active` defaults to false; set true and change `replayKey` for an
15
+ explicit replay. No timer, physics dependency or pointer gesture is installed.
16
+
17
+ The contract owns the 36-point drop, small rebound, alternating tilt and 24ms
18
+ stagger. These are decorative geometry, not layout spacing tokens. The reserved
19
+ upper inset keeps the drop inside the component bounds. Web WAAPI and Native Core
20
+ Animated cancel on inactivity, reduced motion, backgrounding, replacement or
21
+ unmount; text rests at its final position. Foregrounding alone does not replay.
22
+
23
+ Both Storybooks: `컴포넌트 / Display / Gravity Letters`, with Default, Dark
24
+ and LargeText. Web glyph typography can be inherited from a surrounding heading
25
+ Text. Renderer behavior tests cover explicit replay and motion bypass; Native
26
+ mock tests do not prove actual device rendering.
@@ -0,0 +1,11 @@
1
+ # GridReveal
2
+
3
+ 검토일: 2026-10-01.
4
+
5
+ `@hjmds/react/grid-reveal`, `@hjmds/react-native/grid-reveal`는 기존 Image 주위에 합성하는 장식 마스크다. `ready`를 Image의 `onLoadStatusChange`가 loaded일 때만 true로 두고, 이미지 소스 변경/재시도 전에는 false로 초기화한다. 오류일 때는 false로 돌린다. Image의 크기 예약·접근성 이름·로딩·실패·재시도 동작은 그대로 유지한다.
6
+
7
+ `children`이 실제 콘텐츠를 소유한다. `active=false`는 숨겨진 화면의 효과를 중단한다. 격자 4×4와 최대 180ms 지연, 기존 normal 지속 시간을 공유한다. 마스크만 투명해지며 이미지 픽셀·터치 대상·접근성 트리를 복제하지 않는다. 모션 줄이기에서는 마스크를 생략하고 이미지를 바로 보여준다. 웹 문서 숨김 또는 Native AppState 비활성에서도 마스크를 지운다.
8
+
9
+ Web은 WAAPI, Native는 Core Animated를 사용한다. Native 화면이 mounted인 채 가려지면 제품이 active=false를 전달해야 한다. 부모를 이미지 크기에 맞게 배치하며, 둥근 이미지 모서리가 필요하면 동일한 클리핑 프레임으로 둘을 감싼다.
10
+
11
+ 양쪽 Storybook 컴포넌트/시각 효과/Grid Reveal에서 Default/Dark/LargeText, 다시 보기와 이미지 실패/재시도를 제공한다. 예제 풍경은 코드로 만든 자체 이미지다. [Native 후속 검증](../../../docs/evidence/component-flows-2026-10-01/README.md)에서 기존 iPhone 17 / iOS 27 시뮬레이터의 큰 글씨 오류·재시도 화면을 실제 조작하고 확인했다. Image 계약에 따라 오류 전후 같은 이미지 설명을 유지하며, 시각적 오류 문구는 중복 접근성 이름으로 읽지 않는다. 물리 기기의 GPU 비용과 프레임별 효과 타이밍 검증은 별도다.
package/docs/icon.md CHANGED
@@ -20,3 +20,29 @@ name을 제품 adapter가 Web SVG 또는 React Native glyph로 번역해, 아이
20
20
 
21
21
  WAI의 기준처럼 주변 텍스트와 중복되는 그림은 장식으로 숨기고, 기능을 단독으로 전달하는
22
22
  그림은 모양 이름이 아니라 동작/목적을 접근성 이름으로 제공합니다.
23
+
24
+ ## Lucide adapter — 2026-10-01
25
+
26
+ `createLucideGlyph` from either renderer `/icon-lucide` entry accepts named
27
+ Lucide imports mapped to semantic names. This keeps only the selected glyphs
28
+ reachable; it never loads a dynamic full-library dictionary.
29
+
30
+ ```tsx
31
+ import { Search, ArrowLeft } from 'lucide-react';
32
+ import { createLucideGlyph } from '@hjmds/react/icon-lucide';
33
+ const renderGlyph = createLucideGlyph({ search: Search, back: ArrowLeft });
34
+ // Web: <Icon name="search" renderGlyph={renderGlyph} />
35
+ // Native: use lucide-react-native and <Icon descriptor={{name:'search'}} renderGlyph={renderGlyph}/>
36
+ ```
37
+
38
+ Web now supports an optional `renderGlyph` inside its existing SVG frame. Omit it
39
+ or return null to preserve the built-in glyph. Its callback receives a 24-unit
40
+ viewBox size and currentColor; the outer frame resolves the actual token size.
41
+ Native receives resolved numeric size/color/stroke and retains its existing
42
+ renderGlyph contract. Both adapters hide artwork and leave naming, directionality
43
+ and mirroring on Icon. Missing map entries throw to reveal product mapping errors.
44
+
45
+ Lucide 1.49.0 is the verified development/showcase version and optional peer.
46
+ The Native factory uses a scalar-only component interface instead of exporting
47
+ one host version's RN StyleProp types, keeping consumers on supported newer RN
48
+ versions structurally compatible. This does not replace provider/brand logos.
package/docs/image.md CHANGED
@@ -75,8 +75,8 @@ intrinsic ratio 예약, 장식/정보 이미지의 alt 의미, load/error 상태
75
75
  `nativeResizeModes`로 fit을 번역하며, 장식 기본값·정보 이미지의 fallback 이름 유지·built-in
76
76
  fallback·`src` 변경 후 재시도를 component test로 검증한다. `sourceAdapter`와 `renderImage`
77
77
  경계로 bare RN의 `ImageSourcePropType` 및 `expo-image` 같은 optimized host를 연결할 수 있다.
78
- 이전 RN `source` API는 마이그레이션 호환용 deprecated 경계일 뿐 intrinsic-size 계약의
79
- 증거로 세지 않는다.
78
+ 이전 RN `source` 호환 경로는 다음 major 소스에서 제거했다. 이관은
79
+ [Native 호환 별칭 제거](./migration-native-legacy-removal.md)를 따른다.
80
80
 
81
81
  이전 후보였던 야잘알 팀 엠블럼은 여전히 Avatar 성격이므로 Image의 제품 증거로 세지 않고,
82
82
  BurnTok의 data URI 아이콘도 network failure 증거로 세지 않는다. 실제 network asset의
package/docs/layout.md CHANGED
@@ -22,8 +22,7 @@ stable)이다. `Layout`이 그 콘텐츠나 상태를 다시 계약하면 두
22
22
  Web 전용 `validateLayoutWebDescriptor`가 이 규칙을 강제한다 — `hasHeader`나
23
23
  `sidebar`가 있는데 `skipLinkLabel`이 없으면 던진다. 공통
24
24
  `validateLayoutRegions`는 region/sidebar 구조만 검사하므로, bypass-link 개념이
25
- 없는 Native에 Web 요구를 강제하지 않는다. 기존 `validateLayoutDescriptor`는
26
- Web validator의 호환 alias다.
25
+ 없는 Native에 Web 요구를 강제하지 않는다. 기존 `validateLayoutDescriptor` 호환 alias는 2.0에서 제거했다.
27
26
  - **플랫폼 번역**: 성립하지만 비대칭적으로 성립한다. Web은 실제 랜드마크
28
27
  엘리먼트(`<header>`/`<nav>`/`<main>`/`<footer>`)가 있다. Native는 랜드마크
29
28
  개념 자체가 없다 — `accessibilityRole`은 heading/control용이지 페이지 영역용이
@@ -1,5 +1,8 @@
1
1
  # v0.5 migration
2
2
 
3
+ 이 문서는 0.5 당시의 이관 기록이다. 여기서 유지한다고 설명한 coverage 별칭은
4
+ [2.0 이관](migration-native-legacy-removal.md)에서 제거했으며 현재 API 지원을 뜻하지 않는다.
5
+
3
6
  v0.4 → v0.5는 기존 foundation/recipe 런타임 값을 유지하는 additive release입니다. 다만
4
7
  catalog status를 그대로 열거하거나 Showcase route 존재를 renderer 증거로 사용한 소비자는
5
8
  아래 두 가지를 확인해야 합니다.
@@ -65,7 +68,7 @@ value.palette;
65
68
 
66
69
  - 91개 canonical route를 Web reference, contract-only, Web unsupported로 분리합니다.
67
70
  - planned route는 구현된 것처럼 보이는 JSX를 렌더링하지 않습니다.
68
- - Home/Explorer 수치는 실제 evidence registry에서 계산합니다.
71
+ - 시작하기/Explorer 수치는 실제 evidence registry에서 계산합니다.
69
72
  - Storybook manager와 preview가 foundation token을 사용합니다.
70
73
  - token-boundary 검사와 static classification 검사가 Showcase check에 포함됩니다.
71
74
  - Ant Design reference는 6.6.1로 고정됩니다. v0.7부터 외부 registry drift 검사는 자동 CI가
@@ -0,0 +1,59 @@
1
+ # 1.11 호환 API 제거와 소비 이관
2
+
3
+ 검토일: 2026-10-02 · 1.11 minor 소스 변경 · npm 게시와 소비 설치는 별도 확인
4
+
5
+ 사용자가 전체 소비 앱을 함께 버전업하므로 구형 호환 API도 제거하라고 요청했다.
6
+ 별칭과 deprecated 스타일 통로를 유지하는 대신 기존 canonical API로 이관한다.
7
+ 2026-10-02 사용자 결정에 따라 호환 API 제거를 1.11.0 minor Changeset에 포함한다.
8
+ 기존 1.x 소비자는 정확한 버전을 고정한 상태에서 이 이관표를 적용한 뒤 올려야 한다.
9
+
10
+ | 제거 | 대체 |
11
+ | --- | --- |
12
+ | Native Switch `value` / `defaultValue` / `onValueChange` | `checked` / `defaultChecked` / `onCheckedChange` |
13
+ | Native Button·Tag `label` | `children` |
14
+ | Native IconButton `icon`, 접근성 이름용 `accessibilityLabel`, `link` tone | `children`, `label`, `ghost` tone |
15
+ | Native Image `source`, `LegacyImageRenderProps`, adapter `legacySource` | `src`·`width`·`height`, `ImageRenderProps`, `sourceAdapter` |
16
+ | Native ToastRegionController `show` | `publish` |
17
+ | Native RadioGroup·SegmentedControl `options`와 Option 타입 | `items`와 Item 타입 |
18
+ | Native Tabs `options`, TabOption `value` | `items`, TabItem `id` |
19
+ | Native Select `options`, `value`, `defaultValue`, `onValueChange`, SelectOption | `items`/`sections`/`source`, `selectedKey`, `defaultSelectedKey`, `onSelectionChange`, CollectionItemDescriptor |
20
+ | Native Menu item `value`·`icon`·`accessibilityHint`, `onSelect` | `id`, `renderLeading`, `description`, `onAction` |
21
+ | Web Menu·MenuMorph item `onSelect` | 컴포넌트 `onAction(id)` |
22
+ | Web/Native Tabs와 Web Select leading `glyphSize` | `size` |
23
+ | Native Stack `direction`, Grid `descriptor` | `axis`, 직접 `columns`·`gap`·`minColumnWidth` |
24
+ | Native Surface `brand` tone, 숫자 padding/radius | `accent` tone, spacing/radius 토큰 |
25
+ | Native Layout `skipLinkLabel` | 삭제: Web 전용 속성 |
26
+ | Native 입력 `supportText`, ListRow `badge` | `description`, `titleMetadata` |
27
+ | Native Button `style`·`labelStyle`, Surface/Card·Field·AuthScreenLayout·Chip·ListRow·LoadMore `style` | 배치만 `layoutStyle`, 시각 값은 semantic props/recipe |
28
+ | Native 입력 `inputStyle`·`containerStyle`, Image `containerStyle`, Section `titleStyle`·`descriptionStyle` | 배치는 `layoutStyle`, 입력 크기는 `size`, 문구는 typography recipe |
29
+ | Contracts `validateLayoutDescriptor` | `validateLayoutWebDescriptor` 또는 `validateLayoutRegions` |
30
+ | Catalog summary `fullyPreviewable`·`partiallyPreviewable`·`contractOnly` | `fullyMature`·`partiallyMature`·`plannedOnly` |
31
+
32
+ Select의 `onSelectionChange`에는 선택 해제를 뜻하는 null이 올 수 있다. 이전 비-null
33
+ handler를 이관할 때는 null 처리 방침을 제품에서 명시한다. 메뉴의 실행과 선택 상태 변경은
34
+ 각각 `onAction`과 `selection.onSelectionChange`로 구분한다. 항목별 실행 콜백을 섞지 않는다.
35
+
36
+ Image의 `sourceAdapter(descriptor)`는 유지한다. 인증 header·캐시 옵션이 있는 RN source나
37
+ 번들 자산은 이 경계로 넘기되 실제 크기와 canonical src를 제공한다. 이미지 크기를 임의로
38
+ 추정하지 않는다. React Native 자체의 Image·Switch API는 HJM 이관 대상이 아니다.
39
+
40
+ ## 스타일 경계
41
+
42
+ 제거 대상은 위 표에 열거한 deprecated 공개 통로다. 플랫폼 host의 정식 `style`,
43
+ renderer에 주입하는 이미지 스타일, 제품 소유 슬롯과 private recipe 스타일까지 일괄 삭제하는
44
+ 변경은 아니다. 배치에 paint 값을 넣어 타입을 우회하지 않는다. FloatingActionButton과
45
+ LoadMore의 내부 Button 조합은 비공개 RecipeButton을 써서 recipe의 크기·색·그림자를 보존한다.
46
+ 해당 구현을 패키지 entry에서 export하지 않는다.
47
+
48
+ ## 관리 소비 저장소
49
+
50
+ 번뚝·다에리·비행중·모펀의 직접 호출과 제품 래퍼를 함께 이관한다. 스핀트·유틸버스·포트폴리오
51
+ 사이트·App Release Hub도 새 공개 타입으로 검사한다. 웹과 앱이 있는 제품은 양쪽을 확인한다.
52
+ 소스 검사, 새 패키지 설치/lock 갱신, 기기 검증, npm 게시·운영 배포는 별개의 단계다.
53
+ 로컬 후보 선언을 연결한 검사만으로 게시된 1.11 소비 설치를 주장하지 않는다.
54
+
55
+ ## Storybook
56
+
57
+ Web/Native 프로필 편집은 기본·어두운 테마·큰 글자를 유지한다. 중복 Playground 링크는
58
+ `patterns-profile-studio--default`로 바꾼다. Web showcase 색상 변수는 `--hjm-color-*`만 쓴다.
59
+ 이 내부 변수 이관은 공개 renderer CSS 토큰 변경이 아니다. 모든 예제는 위 canonical API로 갱신한다.
@@ -0,0 +1,28 @@
1
+ # NavigationBar — 글래스 네비게이션 바
2
+
3
+ 검토일: 2026-10-01
4
+
5
+ `NavigationBar`는 브랜드·탐색·검색/계정 행동을 배치하는 상단 탐색 조합입니다.
6
+ `@hjmds/react/navigation-bar`, `@hjmds/react-native/navigation-bar`에서 가져옵니다.
7
+
8
+ ```tsx
9
+ <NavigationBar label="사이트 탐색" brand={<Text>브랜드</Text>} actions={<SearchField /* 제품의 현지화된 필드 props */ />}>
10
+ {/* 제품의 Link, Menu, Button 등 탐색 항목 */}
11
+ </NavigationBar>
12
+ ```
13
+
14
+ - 필수 `label`, `brand`, `children`, 선택 `actions` 슬롯을 받습니다.
15
+ - Web은 이름이 있는 nav와 줄바꿈되는 세 슬롯, Native는 큰 글씨에서도 늘어나는 두 행입니다.
16
+ - Web은 배경 흐림이 지원되면 92% 불투명 semantic surface와 blur를 사용합니다.
17
+ 미지원/투명도 줄이기/강제 색상에서는 불투명 배경을 유지합니다.
18
+ - Native는 core renderer에 필수 blur 의존성을 추가하지 않고 불투명 semantic surface로
19
+ 대체합니다. 실제 iOS 유리 굴절 효과를 구현했다고 주장하지 않습니다.
20
+ - 메뉴의 초점·키보드·닫힘과 검색/계정 상태는 기존 Menu/SearchField 및 제품이 소유합니다.
21
+ 슬롯을 하나의 접근성 요소로 합치지 않습니다. 브랜드/목적지는 앱에서 Link로 전달할 수 있습니다.
22
+ - `TopBar`는 화면 제목·뒤로가기·소수 행동을 위한 chrome, `BottomNavigation`은 최상위 route,
23
+ `NavigationBar`는 사이트 탐색의 다중 슬롯 조합입니다. 같은 선택 상태를 중복 보관하지 않습니다.
24
+
25
+ 근거: 사용자가 제공한 [Glassy Navbar 릴](https://www.instagram.com/reel/Dd8_OYaTwmG/)의
26
+ 브랜드·드롭다운·검색·계정 배치를 관찰해 독립 구현했습니다. 원본 소스/에셋은 가져오지 않았습니다.
27
+ Storybook: **컴포넌트 → 탐색 → 글래스 네비게이션 바**, Default/Dark/LargeText.
28
+ 구현·검증 기록은 [같은 변경의 증거](../../../docs/evidence/navigation-references-2026-10-01/README.md)를 따릅니다.
@@ -93,7 +93,7 @@ Expo Go cannot verify these linked native modules.
93
93
 
94
94
  ## Evidence and promotion
95
95
 
96
- Web stories: Patterns/Optional Motion. Native stories: Experimental/Optional Adapters.
96
+ Web stories: 갤러리/모션 연동. Native stories: 실험실/선택적 연동.
97
97
  Tests cover adaptation logic and web browser behavior; native mocks cannot prove OS gestures,
98
98
  keyboard animation, accessibility focus, native linking or installed-device health. Keep native
99
99
  adapters experimental until iOS/Android device evidence exists. No consumer migration or publication
@@ -124,3 +124,26 @@ product image/menu behavior and removes the matching peers. There is no persiste
124
124
  reports transitive UI packages expecting Storybook 10.6 and safe-area-context 5.8 versus 5.7.
125
125
  Builds passing do not erase these warnings or prove device compatibility.
126
126
  - No npm publication, consumer migration, native binary build, commit or push was performed.
127
+
128
+ ## Shared behavior after the component overlap audit
129
+
130
+ The 2026-10-01 audit found independent typeahead policies in Menu, MorphingMenu and ContextMenu.
131
+ Their Web item searches now share the base Menu's 500ms reset, declared textValue, circular search
132
+ and repeated-character cycling. Menu opening, OS context-menu behavior and presentation stay host-owned.
133
+
134
+ CarouselMotion now resolves slide IDs, selected/inert state, accessible names and finite navigation
135
+ through the canonical Carousel contract in both renderers. Its optional composeAccessibleName
136
+ accepts the same localized position/name composer as Carousel; omitting it preserves the slide label.
137
+ It remains a controlled swipe/motion presentation without autoplay or uncontrolled defaults.
138
+
139
+ Native Field and built-in text inputs share a recipe-owned label/support/error frame.
140
+ GestureSheetInput retains BottomSheetTextInput's keyboard tracking but now uses the base field's
141
+ input geometry, typography, placeholder and provider font scaling instead of separate constants.
142
+
143
+ ## Static Avatar fallback — 2026-10-01
144
+
145
+ Both renderer `/avatar-blobatar` entries now provide `createBlobatarFallback` for
146
+ existing Avatar. They are optional factories, not new canonical components or
147
+ root exports. See the [fallback contract](avatar-fallback.md) for installation,
148
+ source recovery and identity/accessibility rules. This addition does not imply
149
+ that the earlier device evidence covers Blobatar.
package/docs/otp-field.md CHANGED
@@ -102,3 +102,18 @@ Backspace → 앞 칸으로)도 이 모델에서는 별도 로직이 필요 없
102
102
 
103
103
  이 조사 당시 제품 채택은 미확인이었다. 2026-09-29부터 제품 채택은 관측으로 분리하며,
104
104
  현재 성숙도는 catalog와 [승격 기준](stable-promotion.md)을 따른다.
105
+
106
+ ## Presentation options (2026-10-01)
107
+
108
+ Web and Native accept `presentation="boxes" | "underline"`; boxes remains the
109
+ compatible default. Underline removes the side/top slot outlines and keeps a
110
+ strong bottom border with the same focus, filled and error colors. This changes
111
+ only decorative slots: one actual input still owns selection, paste, numeric
112
+ sanitization, SMS autocomplete and the completion callback. Never replace it with
113
+ six separately focused fields to obtain this appearance.
114
+
115
+ Both showcases place the interactive preview under 컴포넌트/입력/OtpField
116
+ with Default, Dark and LargeText. The two presentations share a controlled sample
117
+ value and an explicit error toggle. “Input complete” means six characters entered,
118
+ not a successful server verification. Existing input behavior tests now exercise
119
+ both presentations on Web and Native; actual device autofill remains separate QA.
@@ -138,7 +138,7 @@ Steps와 같은 이유다: 순서를 나타내는 문장의 어순과 조사는
138
138
  필수입니다. 상태·데이터 요청·결과 교체와 URL 동기화는 제품이 소유합니다.
139
139
 
140
140
  2026-09-16 사용자의 명시적 확장 요청으로 라이브러리 beta를 제공하고 제품 채택은 별도로
141
- 추적합니다. `Patterns/WebNavigation`에서 125개 로컬 기록의 실제 페이지별 목록과 표시 범위가
141
+ 추적합니다. `갤러리/웹 탐색`에서 125개 로컬 기록의 실제 페이지별 목록과 표시 범위가
142
142
  바뀝니다. 서버 요청이나 제품 적용을 검증한 것은 아닙니다.
143
143
 
144
144
  [MUI Pagination](https://mui.com/material-ui/react-pagination/)의 명시적 페이지 탐색과
package/docs/popover.md CHANGED
@@ -37,7 +37,7 @@ label/textValue, selection mode)을 따르는 항목 **목록**이고 그 role/k
37
37
  catalog에 별도 `planned` 항목으로 있는 `ConfirmPopover`(antd `Popconfirm`,
38
38
  `relationship: "adapted"`)는 이 Popover 위의 **조합**이다 — Popover의 anchored
39
39
  비모달 surface에 되돌릴 수 있는 행동의 확인·취소를 얹은 조합이다. 파괴적 동작은
40
- AlertDialog를 사용한다. `Patterns/Popover/ReversibleConfirmation`은 기록 보관·취소가
40
+ AlertDialog를 사용한다. `컴포넌트/오버레이/Popover/ReversibleConfirmation`은 기록 보관·취소가
41
41
  작동하는 예제이며 새 독립 renderer 수에 더하지 않는다.
42
42
 
43
43
  ## 일반화한 계약
@@ -142,7 +142,7 @@ Dialog 안의 Popover는 첫 Escape를 소유한다. 내부 Menu가 Escape를
142
142
 
143
143
  2026-09-16 사용자의 확장 요청으로 Web beta를 제공했다. 2026-09-29 focus/keyboard·hover/touch·
144
144
  320px long-copy browser proof를 확인해 stable로 승격한다. Native는 `unsupported`; 제품 채택은 별도다.
145
- `Patterns/Popover/Filters`는 제목·즐겨찾기 조건 적용/취소/초기화와 실제 목록 교체를 제공한다.
145
+ `컴포넌트/오버레이/Popover/Filters`는 제목·즐겨찾기 조건 적용/취소/초기화와 실제 목록 교체를 제공한다.
146
146
  `ReversibleConfirmation`은 보관 후 취소 버튼으로 초점을 옮기며 실제로 복원한다.
147
147
 
148
148
  [Radix Popover](https://www.radix-ui.com/primitives/docs/components/popover)의 비모달 focus·
@@ -13,6 +13,13 @@ Native의 외부 배치는 `layoutStyle`, UI 식별은 `testID`를 사용한다.
13
13
  Web의 상위 앱 셸에 이미 main landmark가 있으면 `as="section"`을 사용한다. 이 옵션은
14
14
  다에리 WebShell의 main 안에 로그인 레이아웃을 채택할 때 중첩 main을 피하기 위해 추가했다.
15
15
 
16
+ 2026-10-01 로그인 조합 변경은 [로그인 화면 계약](auth-screen.md)의 mainCard와 pendingLabel을
17
+ 사용한다. 제공자 버튼 label은 지역화 카탈로그에서 이름만 남기고, 인증 시작부터 완료·취소·실패까지
18
+ 같은 main 내용을 유지한 채 pendingLabel만 켜고 끈다. 기존 제품 카드 wrapper를 제거하고 mainCard로
19
+ 옮기면 배경까지 유지된다. 버튼마다 busy를 켜는 기존 연결은 이 카드 상태로 옮긴다.
20
+ HJM npm 게시만으로 이 변경이 제품에 자동 적용되지는 않는다. exact dependency·lock·계약을
21
+ 업데이트하고 제품의 상태 연결과 문구를 바꾼 뒤 웹·앱을 함께 검증한다.
22
+
16
23
  ## 설정 한 행
17
24
 
18
25
  `Switch presentation="row"`에 label/description/checked/onCheckedChange를 전달하면 행 전체가
@@ -54,7 +54,7 @@ Yajalal과 Choose Window의 현재 제품은 Flutter이므로 JS renderer 소비
54
54
  dark/long-copy/large-text/rtl 환경으로 직접 실행한다.
55
55
  - Showcase 격리: `packages/react/test/showcase-style-isolation.browser.test.tsx`.
56
56
  SSR class 확인만으로 발견되지 않은 Tabs 가로 배치와 버튼 모양을 실제 browser로 검사한다.
57
- - Review: `Patterns/Toast layout`, 기존 Button/IconButton/Tabs/Notice story.
57
+ - Review: `패턴/토스트 배치`, 기존 Button/IconButton/Tabs/Notice story.
58
58
  - Toast는 1280px 창의 420px 카드에서도 액션 행을 유지한다. 창 breakpoint만으로 판단하면
59
59
  실제 provider의 좁은 카드에서 큰 글자 버튼이 다시 압축되므로 grid를 카드 기본 구조로 둔다.
60
60
  - NativeProvider: `packages/react/test/native-provider-hydration.browser.test.tsx`5개와
@@ -1,6 +1,6 @@
1
1
  # AuthProviderButton contract
2
2
 
3
- **문제.** "Google로 계속하기", "카카오로 계속하기" 같은 소셜 로그인 버튼. BurnTok이
3
+ **문제.** 제공자 브랜드 규정을 따르는 소셜 로그인 버튼. BurnTok이
4
4
  `.hjm-button.bt-provider-google` 네 줄로 HJM 버튼을 덮어 쓰던 자리다.
5
5
 
6
6
  **왜 Button의 tone이 아닌가.** HJM의 tone은 **의미**다 — primary/secondary/danger는
@@ -26,8 +26,11 @@
26
26
  **포커스 링은 바깥에 그린다.** `#FEE500`부터 `#000000`까지 어떤 배경 위에서도 보여야
27
27
  하므로 `focusOutlineOffset`으로 fill 밖에 둔다.
28
28
 
29
- **busy는 라벨을 지우지 않는다.** 스피너만 옆에 붙고 폭도 유지한다 — 버튼이 줄어들면
30
- 그 아래 제공자 버튼들이 밀린다.
29
+ **로그인 화면의 진행 상태는 카드가 소유한다.** 2026-10-01 사용자 요청으로 로그인 조합은
30
+ `AuthScreenLayout`의 pendingLabel을 사용한다. 모든 제공자 버튼을 숨기고 기존 카드 크기에서
31
+ 중앙 로딩 하나만 보여 준다([로그인 화면 계약](auth-screen.md)). 버튼 label은 제품이 제공자
32
+ 이름만 전달한다. 이전 버전 소비와 단독 버튼의 호환성을 위해 descriptor.busy는 유지하며,
33
+ 카드 진행 상태와 동시에 사용하지 않는다.
31
34
 
32
35
  **값의 출처.** 각 제공자의 공개 브랜드 가이드라인(2026-09 확인). 가이드라인이 바뀌면
33
36
  `authProviderPalettes` 한 곳만 고친다.