@hjmds/design-contracts 1.34.0 → 1.35.1

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 (158) hide show
  1. package/dist/anchor.d.ts +4 -1
  2. package/dist/anchor.d.ts.map +1 -1
  3. package/dist/anchor.js +3 -3
  4. package/dist/anchor.js.map +1 -1
  5. package/dist/base-recipes.d.ts +15 -1
  6. package/dist/base-recipes.d.ts.map +1 -1
  7. package/dist/base-recipes.js +14 -3
  8. package/dist/base-recipes.js.map +1 -1
  9. package/dist/behaviors.d.ts +22 -0
  10. package/dist/behaviors.d.ts.map +1 -1
  11. package/dist/behaviors.js +2 -0
  12. package/dist/behaviors.js.map +1 -1
  13. package/dist/calendar.d.ts +9 -7
  14. package/dist/calendar.d.ts.map +1 -1
  15. package/dist/calendar.js +31 -2
  16. package/dist/calendar.js.map +1 -1
  17. package/dist/card.d.ts +15 -1
  18. package/dist/card.d.ts.map +1 -1
  19. package/dist/card.js +14 -1
  20. package/dist/card.js.map +1 -1
  21. package/dist/carousel.d.ts +3 -0
  22. package/dist/carousel.d.ts.map +1 -1
  23. package/dist/carousel.js +10 -1
  24. package/dist/carousel.js.map +1 -1
  25. package/dist/catalog.d.ts +147 -17
  26. package/dist/catalog.d.ts.map +1 -1
  27. package/dist/catalog.js +9 -6
  28. package/dist/catalog.js.map +1 -1
  29. package/dist/colors.d.ts +1 -0
  30. package/dist/colors.d.ts.map +1 -1
  31. package/dist/colors.js +2 -0
  32. package/dist/colors.js.map +1 -1
  33. package/dist/component-recipes.d.ts +45 -11
  34. package/dist/component-recipes.d.ts.map +1 -1
  35. package/dist/component-recipes.js +35 -15
  36. package/dist/component-recipes.js.map +1 -1
  37. package/dist/component-references.d.ts +2 -2
  38. package/dist/component-references.js +1 -1
  39. package/dist/component-references.js.map +1 -1
  40. package/dist/design-profile.d.ts +14 -0
  41. package/dist/design-profile.d.ts.map +1 -1
  42. package/dist/design-profile.js +15 -0
  43. package/dist/design-profile.js.map +1 -1
  44. package/dist/index.d.ts +2 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +2 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/progress-recipe.d.ts +6 -0
  49. package/dist/progress-recipe.d.ts.map +1 -1
  50. package/dist/progress-recipe.js +15 -2
  51. package/dist/progress-recipe.js.map +1 -1
  52. package/dist/recipes.d.ts +2 -2
  53. package/dist/recipes.d.ts.map +1 -1
  54. package/dist/recipes.js +2 -2
  55. package/dist/recipes.js.map +1 -1
  56. package/dist/screen-patterns.d.ts +32 -2
  57. package/dist/screen-patterns.d.ts.map +1 -1
  58. package/dist/screen-patterns.js +26 -2
  59. package/dist/screen-patterns.js.map +1 -1
  60. package/dist/semantic-colors.d.ts +5 -0
  61. package/dist/semantic-colors.d.ts.map +1 -1
  62. package/dist/semantic-colors.js +2 -0
  63. package/dist/semantic-colors.js.map +1 -1
  64. package/dist/sheet.d.ts +15 -0
  65. package/dist/sheet.d.ts.map +1 -1
  66. package/dist/sheet.js +11 -0
  67. package/dist/sheet.js.map +1 -1
  68. package/dist/shortcut-rail.d.ts +20 -0
  69. package/dist/shortcut-rail.d.ts.map +1 -0
  70. package/dist/shortcut-rail.js +28 -0
  71. package/dist/shortcut-rail.js.map +1 -0
  72. package/dist/showcase.js +2 -2
  73. package/dist/showcase.js.map +1 -1
  74. package/dist/steps.d.ts +6 -4
  75. package/dist/steps.d.ts.map +1 -1
  76. package/dist/steps.js +3 -0
  77. package/dist/steps.js.map +1 -1
  78. package/dist/time-picker.d.ts +70 -0
  79. package/dist/time-picker.d.ts.map +1 -0
  80. package/dist/time-picker.js +51 -0
  81. package/dist/time-picker.js.map +1 -0
  82. package/dist/timeline.d.ts +13 -1
  83. package/dist/timeline.d.ts.map +1 -1
  84. package/dist/timeline.js +11 -1
  85. package/dist/timeline.js.map +1 -1
  86. package/dist/version.d.ts +1 -1
  87. package/dist/version.js +1 -1
  88. package/dist/version.js.map +1 -1
  89. package/docs/calendar.md +19 -1
  90. package/docs/carousel.md +10 -0
  91. package/docs/collapsible.md +9 -0
  92. package/docs/consumer-policy.md +8 -12
  93. package/docs/design-profile.md +9 -0
  94. package/docs/expansion-roadmap.md +1 -1
  95. package/docs/generated/component-maturity.md +5 -4
  96. package/docs/generated/renderer-evidence.json +141 -16
  97. package/docs/generated/renderer-evidence.md +5 -3
  98. package/docs/generated/showcase-manifest.json +69 -7
  99. package/docs/optional-adapters.md +11 -0
  100. package/docs/stable-core.md +25 -0
  101. package/docs/steps.md +4 -0
  102. package/docs/theme-palette.md +2 -0
  103. package/docs/time-picker.md +22 -114
  104. package/docs/usage/README.md +9 -7
  105. package/docs/usage/SELECTION.md +44 -2
  106. package/docs/usage/components/accordion.md +4 -2
  107. package/docs/usage/components/alert-dialog.md +5 -0
  108. package/docs/usage/components/anchor.md +4 -1
  109. package/docs/usage/components/badge.md +7 -4
  110. package/docs/usage/components/bottom-cta.md +29 -4
  111. package/docs/usage/components/bottom-navigation.md +8 -0
  112. package/docs/usage/components/button.md +42 -2
  113. package/docs/usage/components/calendar.md +8 -1
  114. package/docs/usage/components/card.md +111 -7
  115. package/docs/usage/components/carousel.md +4 -1
  116. package/docs/usage/components/chat-screen.md +1 -1
  117. package/docs/usage/components/checkbox-group.md +33 -3
  118. package/docs/usage/components/checkbox.md +8 -2
  119. package/docs/usage/components/chip.md +5 -0
  120. package/docs/usage/components/collapsible.md +16 -1
  121. package/docs/usage/components/comment-thread-screen.md +12 -3
  122. package/docs/usage/components/composition-layout.md +6 -1
  123. package/docs/usage/components/conversation-row.md +2 -1
  124. package/docs/usage/components/data-table.md +10 -0
  125. package/docs/usage/components/description-list.md +1 -0
  126. package/docs/usage/components/field.md +8 -0
  127. package/docs/usage/components/icon-tile.md +29 -10
  128. package/docs/usage/components/image-choice-group.md +6 -0
  129. package/docs/usage/components/image.md +8 -1
  130. package/docs/usage/components/list-detail-screen.md +10 -4
  131. package/docs/usage/components/list-row.md +3 -0
  132. package/docs/usage/components/list.md +33 -1
  133. package/docs/usage/components/message-composer.md +2 -0
  134. package/docs/usage/components/notice.md +5 -1
  135. package/docs/usage/components/notification-row.md +19 -9
  136. package/docs/usage/components/onboarding-screen.md +3 -0
  137. package/docs/usage/components/page-indicator.md +12 -0
  138. package/docs/usage/components/profile-summary.md +16 -3
  139. package/docs/usage/components/progress.md +24 -0
  140. package/docs/usage/components/radio-group.md +45 -3
  141. package/docs/usage/components/radio.md +8 -2
  142. package/docs/usage/components/repeatable-field-group.md +1 -0
  143. package/docs/usage/components/screen-layout.md +46 -3
  144. package/docs/usage/components/search-screen.md +29 -1
  145. package/docs/usage/components/segmented-control.md +19 -3
  146. package/docs/usage/components/select.md +2 -0
  147. package/docs/usage/components/sheet.md +56 -3
  148. package/docs/usage/components/spinner.md +10 -0
  149. package/docs/usage/components/statistic.md +23 -0
  150. package/docs/usage/components/steps.md +11 -4
  151. package/docs/usage/components/switch.md +5 -0
  152. package/docs/usage/components/tabs.md +4 -0
  153. package/docs/usage/components/time-picker.md +88 -0
  154. package/docs/usage/components/timeline.md +19 -6
  155. package/docs/usage/components/top-bar.md +7 -0
  156. package/docs/usage/compositions/shortcut-rail.md +99 -0
  157. package/docs/usage/compositions/time-selection.md +5 -0
  158. package/package.json +17 -4
package/docs/carousel.md CHANGED
@@ -161,3 +161,13 @@ Native 페이징 목록)에서 같은 점·같은 끝 멈춤 이동을 쓰게
161
161
  `composeAccessibleName`으로 제품이 짓는다)와 `getPageIndicatorTarget`(순환 없이 끝에서 멈춤)이고 recipe는 `carouselRecipe.dot`
162
162
  그대로다. Carousel도 같은 점 줄을 렌더한다(Web 내부 공유 컴포넌트, Native `PageIndicator`). Native는 줄 하나가 adjustable
163
163
  요소이고 Web은 group 안의 점 버튼이며 ←/→로 한 페이지씩 요청한다.
164
+
165
+
166
+ ### 제품 소유 페이저의 표시 창
167
+
168
+ `PageIndicatorDescriptor.maxVisibleDots`는 현재 페이지를 포함한 연속 위치 창을 계산한다.
169
+ 전체 페이지의 index/position/total과 이동 경계는 유지하며 누락 시 기존처럼 전부 표시한다.
170
+ 양 renderer의 `PageIndicator interactive={false}`는 별도 이전·다음 컨트롤이 있는 곳에 작은
171
+ 위치 표시만 제공한다. 점을 작은 버튼으로 만들지 않으며 기본 대화형 동작은 유지한다.
172
+ 2026-10-19 번뚝의 중복 구현 이관을 위한 checkout 변경으로 미게시다.
173
+ 사용 예와 배치는 [PageIndicator 지침](usage/components/page-indicator.md)을 따른다.
@@ -35,3 +35,12 @@ chrome이 따라오고 그걸 다시 CSS로 지우게 된다. 그래서 별도
35
35
  2026-10-07 테마 전환 시 입력이 사라지는 문제를 피하려고 `presentation="inline"`과 `keepMounted`를 추가했다.
36
36
  inline은 트리거를 숨기고 항상 내용을 펼친다. 기본 disclosure는 기존 open/defaultOpen 규칙을 유지한다.
37
37
  keepMounted가 있어도 닫힌 내용은 포커스·스크린리더·터치 대상에서 제외한다. 단순 read-only 내용은 기존 기본값을 쓴다.
38
+
39
+ ## 제목과 준비 상태 (미게시 로컬 소스, 2026-10-20)
40
+
41
+ 번뚝의 평가 패널은 정적 제목 옆에 펼치기 행동을 두고, 평가 중에는 같은 행동 자리에 로딩을 둔다. 제품마다 헤더·busy·접힘을 다시 조립하지 않도록 `title`과 `pendingLabel`을 기존 Collapsible에 연결했다.
42
+
43
+ - `title`은 trigger 밖에 있으므로 제목의 heading 의미와 행동의 접근성 이름을 각각 유지한다. 제목은 시작 쪽, 행동은 끝 쪽이며 최소 행동 영역은44다.
44
+ - `pendingLabel`이 있으면 한 개의 작은 Spinner가 trigger를 대신하고 본문은 보이지 않으며 root는 busy다. 완료 후 기존 펼침 상태를 사용하고 자동으로 펼치지 않는다.
45
+ - `keepMounted`는 준비 중에도 초안을 보존하며 hidden/접근성 제외를 유지한다. Web에서 준비 전환으로 초점이 있던 본문과 trigger가 사라지면 host로 복구한다. 외부 초점을 가져오지 않는다.
46
+ - 기존 제목 없는 trigger와 inline의 기본 동작은 유지한다. 이 추가 prop은 아직 게시 패키지 제공을 뜻하지 않는다.
@@ -31,11 +31,7 @@
31
31
  뜻하지 않는다. 2026-10-13 실제 package 의존성을 대조해 누락된 Utilverse와 App Release Hub를
32
32
  추가했다. Hub는 정책 사이트 생성에 colors/foundations만 사용하므로 renderer 이관과 구분한다.
33
33
 
34
- 기존 Flutter 제품은 별도 `hjm_flutter` beta renderer를 사용한다. npm fixed train에 포함되지
35
- 않으며, 검토한 Git SHA와 `packages/flutter` 경로를 pubspec/lock에 고정한다. 공개 API와 지원
36
- 범위는 [고정 source의 Flutter README](https://github.com/jim1286/hjm-design-system/blob/dfe74c171809dd43e43aa08f127de20932cb8257/packages/flutter/README.md), 버전·SDK는 해당 pubspec이 소유한다.
37
- 2026-10-17 선택의창의 실제 Dart 소비를 대조해 module 계약에 Flutter 인터페이스와 소비자를
38
- 추가했다. pub.dev 게시나 npm renderer의 전체 API parity, 기기 검증 완료를 뜻하지 않는다.
34
+ Flutter renderer는 2026-10-18 전사 제거 요청으로 퇴역했다. 과거 소스는 저장소 `docs/FLUTTER_LEGACY.md`의 Git 기준에서 조회하며 현재 소비 경로는 React·React Native다.
39
35
 
40
36
  ## 2. 성숙도별 채택
41
37
 
@@ -60,9 +56,7 @@
60
56
  [Stable Core 기록](stable-core.md)에 보존한다. 현재 규칙에 이전 버전의 개수나 임시 foundation
61
57
  bridge를 복제하지 않는다. 구버전 소비자는 설치된 정책·profile과 해당 이관표를 확인한다.
62
58
 
63
- 화면은 [선택 기준](usage/SELECTION.md)에 따라 그대로 사용, 공개 슬롯 확장, 공통 API 보완, 제품 고유 기능 연결 중 고른다.
64
- 제품의 저장·권한 흐름은 제품이 연결하되, 공통 배치·상태 엔진이 부족하면 HJM API를 보완한다.
65
- `children`·header·footer 슬롯이 있다는 이유로 공통 구조를 제품에서 다시 만들지 않는다.
59
+ 화면의 수정 위치·API 선택·합성 경계는 [선택 기준](usage/SELECTION.md)을 따른다.
66
60
 
67
61
  ## 3. 코드 경계
68
62
 
@@ -141,12 +135,14 @@ OS 최대 글자 및 그 최대값 모사는 설계·검증·후속 조건에서
141
135
  ## 6. 예외와 변경 절차
142
136
 
143
137
  계약 변경이나 예외의 이유·영향·검사 결과·미확인 범위는 기존 계약 문서, TASKS 또는 커밋에 남긴다.
144
- 작은 수정에 별도 ADR, 고정 항목 수, 중복 승인을 요구하지 않는다. 임시 우회에는 제거 조건을 적는다.
138
+ 작은 수정에 별도 ADR, 고정 항목 수, 중복 승인을 요구하지 않는다.
139
+ 2026-10-18 지침 정리: 제거 조건만 적으면 임시 우회를 허용하는 것으로 읽히던 문장을 제거했다.
140
+ 원인을 소유한 구현·설정·계약을 직접 수정하며, 원인을 남긴 우회는 제거 조건이 있어도 허용하지 않는다.
145
141
  공개 API·데이터·호환성을 바꾸면 해당 계약과 migration을 갱신한다.
146
142
 
147
- 공통 API를 바꾸는 것이 한 제품의 local override보다 적절하면 제품 코드를 복제하지 않고
148
- HJM에 Changeset과 Web/RN evidence를 먼저 제출합니다. 반대로 제품 의미가 들어가면 공통
149
- package로 승격하지 않습니다.
143
+ 공통 구조의 계약 공백은 [선택 기준](usage/SELECTION.md)에 따라 HJM에서 보완한다.
144
+ HJM 변경의 문서·검사·Changeset 범위는 checkout의 `CONTRIBUTING.md`를 따른다.
145
+ 제품 의미가 들어간 도메인 로직은 공통 package로 옮기지 않는다.
150
146
 
151
147
  ## 7. 신규 앱 완료 조건
152
148
 
@@ -328,3 +328,12 @@ theme에서 역할을 읽는다. 다중 선택·비활성·같은 항목/초점
328
328
  Web 10종 light/dark 실제 스타일·키보드와 Native 모의 호스트의 상태 유지, 명시적 중첩
329
329
  profile/neutral 복귀를 검증했다. 이 수정의 실제 Native 기기·AT·Release 성능·npm 게시는
330
330
  [QA](../../../docs/qa/2026-10-07-design-profile-research.md)와 구분하는 미확인 범위다.
331
+
332
+ ### 일반 버튼 기본값 (미게시)
333
+
334
+ `controls.button?: { appearance?: "flat" | "raised"; shape?: "rounded" | "pill" }`은 제품의 공통 버튼 표현을 한 번 선택한다.
335
+ 생략하면 기존 프로필/기본값을 유지한다. 정규화된 button에는 두 값이 모두 있고 개별 Button prop이 이를 이긴다.
336
+ 이 데이터는 frame 선택만 소유하며 disabled/loading/선택/실행·포커스·측정은 기존 HJM Button이 계속 맡는다.
337
+ 입체 버튼이 필요했던 다에리의 제품 상태 엔진을 없애기 위해 추가했다. 앱 자체의 햅틱 허용/전송 요청은 제품에 남긴다.
338
+ Native에서 controls만 선택하는 neutral 서체 프로필은 호스트의 `fonts="pretendard"` 설정을 유지하고,
339
+ 프로필에 별도 UI 서체를 명시하면 그 서체를 우선한다.
@@ -256,7 +256,7 @@ Yajalal의 날짜 레일을 DatePicker 채택으로 세지 않는다. 성숙도
256
256
  ### Batch 3 — 복합 데이터와 파일
257
257
 
258
258
  - beta: Timeline, UploadItem, DatePicker, Calendar, FilePicker
259
- - composed: TimePicker (Web/RN 시·분 선택·확정 예제 제공, 독립 renderer는 없음)
259
+ - implemented: TimePicker (2026-10-19: Web/RN 통합 두 열·확정 및 인라인 renderer 제공; 기존 Select 합성 판단 대체)
260
260
  - web: DataTable, Tree, ColorPicker, CommandPalette, SidePanel, Popover
261
261
 
262
262
  FilePicker는 파일 선택 의도만 소유합니다. 업로드 요청·재시도·서버 상태는 제품이 소유하고,
@@ -1,12 +1,12 @@
1
1
  # Component maturity and evidence manifest
2
2
 
3
- > Generated from `@hjmds/design-contracts` 1.34.0. Do not edit this file directly; run `pnpm contracts:sync`.
3
+ > Generated from `@hjmds/design-contracts` 1.35.1. 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
 
7
- - Contract: stable 125 · beta 5
8
- - Web renderer: stable 125 · beta 5
9
- - Native renderer: stable 105 · beta 7 · unsupported 18
7
+ - Contract: stable 126 · beta 5
8
+ - Web renderer: stable 126 · beta 5
9
+ - Native renderer: stable 106 · beta 7 · unsupported 18
10
10
 
11
11
  | Component | Canonical story ID | Contract | Web | Native | Documentation | Required evidence |
12
12
  | --- | --- | --- | --- | --- | --- | --- |
@@ -51,6 +51,7 @@ This document is the human-readable projection of the same catalog and Showcase
51
51
  | NumberField | `input/number-field` | stable | stable | stable | [authored](../number-field.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions |
52
52
  | Select | `input/select` | stable | stable | stable | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions |
53
53
  | Combobox | `input/combobox` | stable | stable | stable | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions |
54
+ | TimePicker | `input/time-picker` | stable | stable | stable | [authored](../time-picker.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions |
54
55
  | DatePicker | `input/date-picker` | stable | stable | stable | [authored](../date-picker.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions |
55
56
  | DateRangePicker | `input/date-range-picker` | stable | stable | stable | generated only | contract: contract; web: default, dark, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, large-text, rtl, reduced-motion, accessibility, native-actions |
56
57
  | ColorPicker | `input/color-picker` | stable | stable | unsupported | [authored](../color-picker.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "designSystemVersion": "1.34.0",
3
+ "designSystemVersion": "1.35.1",
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.34.0",
9
- "activeComponents": 130,
10
- "claimedComponents": 130,
11
- "completeScenarioComponents": 129,
8
+ "packageVersion": "1.35.1",
9
+ "activeComponents": 131,
10
+ "claimedComponents": 131,
11
+ "completeScenarioComponents": 130,
12
12
  "components": [
13
13
  {
14
14
  "componentId": "text",
@@ -779,7 +779,8 @@
779
779
  "claimed": true,
780
780
  "subpath": "./actions",
781
781
  "exportNames": [
782
- "Button"
782
+ "Button",
783
+ "ButtonLink"
783
784
  ],
784
785
  "proofs": [
785
786
  {
@@ -2241,6 +2242,65 @@
2241
2242
  ],
2242
2243
  "missingScenarios": []
2243
2244
  },
2245
+ {
2246
+ "componentId": "time-picker",
2247
+ "name": "TimePicker",
2248
+ "status": "stable",
2249
+ "claimed": true,
2250
+ "subpath": "./time-picker",
2251
+ "exportNames": [
2252
+ "TimePicker"
2253
+ ],
2254
+ "proofs": [
2255
+ {
2256
+ "scenarios": [
2257
+ "default"
2258
+ ],
2259
+ "file": "test/default-render.ssr.test.tsx",
2260
+ "caseId": "time-picker"
2261
+ },
2262
+ {
2263
+ "scenarios": [
2264
+ "dark",
2265
+ "long-copy",
2266
+ "large-text",
2267
+ "rtl",
2268
+ "reduced-motion",
2269
+ "accessibility"
2270
+ ],
2271
+ "file": "test/scenario-matrix.browser.test.tsx",
2272
+ "caseId": "time-picker"
2273
+ },
2274
+ {
2275
+ "scenarios": [
2276
+ "keyboard"
2277
+ ],
2278
+ "file": "test/time-picker.browser.test.tsx",
2279
+ "caseId": "time-picker"
2280
+ }
2281
+ ],
2282
+ "requiredScenarios": [
2283
+ "default",
2284
+ "dark",
2285
+ "long-copy",
2286
+ "large-text",
2287
+ "rtl",
2288
+ "reduced-motion",
2289
+ "accessibility",
2290
+ "keyboard"
2291
+ ],
2292
+ "claimedScenarios": [
2293
+ "default",
2294
+ "dark",
2295
+ "long-copy",
2296
+ "large-text",
2297
+ "rtl",
2298
+ "reduced-motion",
2299
+ "accessibility",
2300
+ "keyboard"
2301
+ ],
2302
+ "missingScenarios": []
2303
+ },
2244
2304
  {
2245
2305
  "componentId": "date-picker",
2246
2306
  "name": "DatePicker",
@@ -3702,7 +3762,8 @@
3702
3762
  "claimed": true,
3703
3763
  "subpath": "./display",
3704
3764
  "exportNames": [
3705
- "Card"
3765
+ "Card",
3766
+ "QuoteCard"
3706
3767
  ],
3707
3768
  "proofs": [
3708
3769
  {
@@ -3752,7 +3813,8 @@
3752
3813
  "claimed": true,
3753
3814
  "subpath": "./display",
3754
3815
  "exportNames": [
3755
- "List"
3816
+ "List",
3817
+ "ListSeparator"
3756
3818
  ],
3757
3819
  "proofs": [
3758
3820
  {
@@ -4870,7 +4932,8 @@
4870
4932
  "claimed": true,
4871
4933
  "subpath": "./feedback",
4872
4934
  "exportNames": [
4873
- "Spinner"
4935
+ "Spinner",
4936
+ "PendingContent"
4874
4937
  ],
4875
4938
  "proofs": [
4876
4939
  {
@@ -6999,10 +7062,10 @@
6999
7062
  },
7000
7063
  "native": {
7001
7064
  "packageName": "@hjmds/react-native",
7002
- "packageVersion": "1.34.0",
7003
- "activeComponents": 112,
7004
- "claimedComponents": 112,
7005
- "completeScenarioComponents": 109,
7065
+ "packageVersion": "1.35.1",
7066
+ "activeComponents": 113,
7067
+ "claimedComponents": 113,
7068
+ "completeScenarioComponents": 110,
7006
7069
  "components": [
7007
7070
  {
7008
7071
  "componentId": "text",
@@ -9115,6 +9178,65 @@
9115
9178
  ],
9116
9179
  "missingScenarios": []
9117
9180
  },
9181
+ {
9182
+ "componentId": "time-picker",
9183
+ "name": "TimePicker",
9184
+ "status": "stable",
9185
+ "claimed": true,
9186
+ "subpath": "./time-picker",
9187
+ "exportNames": [
9188
+ "TimePicker"
9189
+ ],
9190
+ "proofs": [
9191
+ {
9192
+ "scenarios": [
9193
+ "default"
9194
+ ],
9195
+ "file": "test/default-render.test.tsx",
9196
+ "caseId": "time-picker"
9197
+ },
9198
+ {
9199
+ "scenarios": [
9200
+ "dark",
9201
+ "long-copy",
9202
+ "large-text",
9203
+ "rtl",
9204
+ "reduced-motion",
9205
+ "accessibility"
9206
+ ],
9207
+ "file": "test/scenario-matrix.test.tsx",
9208
+ "caseId": "time-picker"
9209
+ },
9210
+ {
9211
+ "scenarios": [
9212
+ "native-actions"
9213
+ ],
9214
+ "file": "test/time-picker.test.tsx",
9215
+ "caseId": "time-picker"
9216
+ }
9217
+ ],
9218
+ "requiredScenarios": [
9219
+ "default",
9220
+ "dark",
9221
+ "long-copy",
9222
+ "large-text",
9223
+ "rtl",
9224
+ "reduced-motion",
9225
+ "accessibility",
9226
+ "native-actions"
9227
+ ],
9228
+ "claimedScenarios": [
9229
+ "default",
9230
+ "dark",
9231
+ "long-copy",
9232
+ "large-text",
9233
+ "rtl",
9234
+ "reduced-motion",
9235
+ "accessibility",
9236
+ "native-actions"
9237
+ ],
9238
+ "missingScenarios": []
9239
+ },
9118
9240
  {
9119
9241
  "componentId": "date-picker",
9120
9242
  "name": "DatePicker",
@@ -10216,7 +10338,8 @@
10216
10338
  "claimed": true,
10217
10339
  "subpath": "./data-display",
10218
10340
  "exportNames": [
10219
- "Card"
10341
+ "Card",
10342
+ "QuoteCard"
10220
10343
  ],
10221
10344
  "proofs": [
10222
10345
  {
@@ -10266,7 +10389,8 @@
10266
10389
  "claimed": true,
10267
10390
  "subpath": "./data-display",
10268
10391
  "exportNames": [
10269
- "List"
10392
+ "List",
10393
+ "ListSeparator"
10270
10394
  ],
10271
10395
  "proofs": [
10272
10396
  {
@@ -11260,7 +11384,8 @@
11260
11384
  "claimed": true,
11261
11385
  "subpath": "./feedback",
11262
11386
  "exportNames": [
11263
- "Spinner"
11387
+ "Spinner",
11388
+ "PendingContent"
11264
11389
  ],
11265
11390
  "proofs": [
11266
11391
  {
@@ -1,11 +1,11 @@
1
1
  # Renderer evidence coverage
2
2
 
3
- > Generated for HJM 1.34.0. Do not edit directly; run `pnpm evidence:sync`.
3
+ > Generated for HJM 1.35.1. 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
 
7
- - web: 130/130 active implementations; 129/130 required scenario sets
8
- - native: 112/112 active implementations; 109/112 required scenario sets
7
+ - web: 131/131 active implementations; 130/131 required scenario sets
8
+ - native: 113/113 active implementations; 110/113 required scenario sets
9
9
 
10
10
  | Component | Surface | Maturity | Renderer package | Export | Claimed scenarios | Missing required scenarios | Executable proofs |
11
11
  | --- | --- | --- | --- | --- | --- | --- | --- |
@@ -50,6 +50,7 @@ This projection joins the canonical surface maturity manifest with first-party r
50
50
  | NumberField | web | stable | @hjmds/react | ./number-field | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard | none | test/default-render.ssr.test.tsx#number-field, test/scenario-matrix.browser.test.tsx#number-field, test/stable-core.browser.test.tsx#number-field |
51
51
  | Select | web | stable | @hjmds/react | ./forms | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard | none | test/default-render.ssr.test.tsx#select, test/scenario-matrix.browser.test.tsx#select, test/stable-core.browser.test.tsx#select |
52
52
  | Combobox | web | stable | @hjmds/react | ./forms | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard | none | test/default-render.ssr.test.tsx#combobox, test/scenario-matrix.browser.test.tsx#combobox, test/stable-core.browser.test.tsx#combobox |
53
+ | TimePicker | web | stable | @hjmds/react | ./time-picker | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard | none | test/default-render.ssr.test.tsx#time-picker, test/scenario-matrix.browser.test.tsx#time-picker, test/time-picker.browser.test.tsx#time-picker |
53
54
  | DatePicker | web | stable | @hjmds/react | ./date-picker | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard | none | test/default-render.ssr.test.tsx#date-picker, test/scenario-matrix.browser.test.tsx#date-picker, test/stable-core.browser.test.tsx#date-picker |
54
55
  | DateRangePicker | web | stable | @hjmds/react | ./date-range | default, dark, large-text, rtl, reduced-motion, accessibility, keyboard | none | test/default-render.ssr.test.tsx#date-range-picker, test/scenario-matrix.browser.test.tsx#date-range-picker, test/date-range.keyboard.browser.test.tsx#date-range-picker |
55
56
  | ColorPicker | web | stable | @hjmds/react | ./color-picker | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard | none | test/default-render.ssr.test.tsx#color-picker, test/scenario-matrix.browser.test.tsx#color-picker, test/web-additions.browser.test.tsx#color-picker |
@@ -178,6 +179,7 @@ This projection joins the canonical surface maturity manifest with first-party r
178
179
  | NumberField | native | stable | @hjmds/react-native | ./number-field | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions | none | test/default-render.test.tsx#number-field, test/scenario-matrix.test.tsx#number-field, test/stable-core.test.tsx#number-field |
179
180
  | Select | native | stable | @hjmds/react-native | ./forms | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions | none | test/default-render.test.tsx#select, test/scenario-matrix.test.tsx#select, test/stable-core.test.tsx#select |
180
181
  | Combobox | native | stable | @hjmds/react-native | ./forms | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions | none | test/default-render.test.tsx#combobox, test/scenario-matrix.test.tsx#combobox, test/stable-core.test.tsx#combobox |
182
+ | TimePicker | native | stable | @hjmds/react-native | ./time-picker | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions | none | test/default-render.test.tsx#time-picker, test/scenario-matrix.test.tsx#time-picker, test/time-picker.test.tsx#time-picker |
181
183
  | DatePicker | native | stable | @hjmds/react-native | ./date-picker | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions | none | test/default-render.test.tsx#date-picker, test/scenario-matrix.test.tsx#date-picker, test/stable-core.test.tsx#date-picker |
182
184
  | DateRangePicker | native | stable | @hjmds/react-native | ./date-range | default, dark, large-text, rtl, reduced-motion, accessibility, native-actions | none | test/default-render.test.tsx#date-range-picker, test/scenario-matrix.test.tsx#date-range-picker, test/date-range-actions.test.tsx#date-range-picker |
183
185
  | FilePicker | native | stable | @hjmds/react-native | ./file-picker | default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, native-actions | none | test/default-render.test.tsx#file-picker, test/scenario-matrix.test.tsx#file-picker, test/file-picker-host-action.test.tsx#file-picker |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "designSystemVersion": "1.34.0",
3
+ "designSystemVersion": "1.35.1",
4
4
  "packageName": "@hjmds/design-contracts",
5
5
  "components": [
6
6
  {
@@ -752,7 +752,8 @@
752
752
  "name": "Button",
753
753
  "label": "버튼",
754
754
  "companions": [
755
- "ClipboardButton"
755
+ "ClipboardButton",
756
+ "ButtonLink"
756
757
  ],
757
758
  "extensions": [
758
759
  "ReactionPicker",
@@ -1656,7 +1657,9 @@
1656
1657
  "storyId": "input/chip",
1657
1658
  "name": "Chip",
1658
1659
  "label": "선택 칩",
1659
- "companions": [],
1660
+ "companions": [
1661
+ "ShortcutRail"
1662
+ ],
1660
1663
  "extensions": [],
1661
1664
  "category": "input",
1662
1665
  "platform": "shared",
@@ -2128,6 +2131,59 @@
2128
2131
  "authored": null
2129
2132
  }
2130
2133
  },
2134
+ {
2135
+ "id": "time-picker",
2136
+ "storyId": "input/time-picker",
2137
+ "name": "TimePicker",
2138
+ "label": "시각 선택",
2139
+ "companions": [],
2140
+ "extensions": [],
2141
+ "category": "input",
2142
+ "platform": "adaptive",
2143
+ "contractStatus": "stable",
2144
+ "surfaces": {
2145
+ "web": "stable",
2146
+ "native": "stable"
2147
+ },
2148
+ "requirements": [
2149
+ {
2150
+ "surface": "contract",
2151
+ "scenarios": [
2152
+ "contract"
2153
+ ]
2154
+ },
2155
+ {
2156
+ "surface": "web",
2157
+ "scenarios": [
2158
+ "default",
2159
+ "dark",
2160
+ "long-copy",
2161
+ "large-text",
2162
+ "rtl",
2163
+ "reduced-motion",
2164
+ "accessibility",
2165
+ "keyboard"
2166
+ ]
2167
+ },
2168
+ {
2169
+ "surface": "native",
2170
+ "scenarios": [
2171
+ "default",
2172
+ "dark",
2173
+ "long-copy",
2174
+ "large-text",
2175
+ "rtl",
2176
+ "reduced-motion",
2177
+ "accessibility",
2178
+ "native-actions"
2179
+ ]
2180
+ }
2181
+ ],
2182
+ "documentation": {
2183
+ "generated": "docs/generated/component-maturity.md",
2184
+ "authored": "docs/time-picker.md"
2185
+ }
2186
+ },
2131
2187
  {
2132
2188
  "id": "date-picker",
2133
2189
  "storyId": "input/date-picker",
@@ -3424,7 +3480,9 @@
3424
3480
  "storyId": "data-display/card",
3425
3481
  "name": "Card",
3426
3482
  "label": "카드",
3427
- "companions": [],
3483
+ "companions": [
3484
+ "QuoteCard"
3485
+ ],
3428
3486
  "extensions": [
3429
3487
  "DocumentResource"
3430
3488
  ],
@@ -3478,7 +3536,8 @@
3478
3536
  "name": "List",
3479
3537
  "label": "목록",
3480
3538
  "companions": [
3481
- "CollectionRail"
3539
+ "CollectionRail",
3540
+ "ListSeparator"
3482
3541
  ],
3483
3542
  "extensions": [
3484
3543
  "TaskList"
@@ -4564,7 +4623,9 @@
4564
4623
  "storyId": "feedback/spinner",
4565
4624
  "name": "Spinner",
4566
4625
  "label": "로딩 표시",
4567
- "companions": [],
4626
+ "companions": [
4627
+ "PendingContent"
4628
+ ],
4568
4629
  "extensions": [],
4569
4630
  "category": "feedback",
4570
4631
  "platform": "shared",
@@ -4971,7 +5032,8 @@
4971
5032
  "companions": [],
4972
5033
  "extensions": [
4973
5034
  "GestureSheet",
4974
- "GestureSheetProvider"
5035
+ "GestureSheetProvider",
5036
+ "SheetPanel"
4975
5037
  ],
4976
5038
  "category": "overlay",
4977
5039
  "platform": "adaptive",
@@ -176,3 +176,14 @@ that the earlier device evidence covers Blobatar.
176
176
  ### 사진 앨범 탐색과 로딩 (2026-10-12)
177
177
 
178
178
  `CarouselMotion`의 선택적 `navigation="counter"`는 이전·현재/전체·다음 한 줄 컨트롤을 Web/Native에 제공한다. 기존 기본 버튼 탐색·유한한 keyed selection·숨겨진 항목의 초점 차단·동작 줄이기 계약은 유지한다. 번뚝의 사진 넘김을 기존 모션 어댑터에 연결하기 위한 표현이며 새 어댑터/peer를 만들지 않는다. `ImageViewer`의 loading 상태는 액자 중앙 Spinner와 접근성 전용 loadingLabel을 사용한다. 제품의 private query·Expo onDisplay·cachePolicy=none은 host 책임이다.
179
+
180
+
181
+ ## Persistent map panel — 2026-10-20 (unpublished)
182
+
183
+ `@hjmds/react-native/sheet-panel` exports `SheetPanel`, an optional Sheet extension using
184
+ Gesture Handler, Reanimated and Worklets already declared by the native adapter. Unlike
185
+ GestureSheet it has no Gorhom dependency, backdrop, modal provider or modal focus boundary.
186
+ It owns the shared sheet frame, fold/unfold handle, cancellation, resize snap preservation and
187
+ scroll-versus-drag arbitration. Products supply map geometry, content and domain paging through
188
+ public slots. Web inline map content uses Card; this native gesture adapter has no Web export.
189
+ See [Sheet usage](usage/components/sheet.md#지도와-함께-조작하는-하단-패널--미게시).
@@ -1,5 +1,30 @@
1
1
  # Stable Core
2
2
 
3
+ ## 2026-10-19 TimePicker 개발 소스 승격
4
+
5
+ 사용자가 승인한 통합 시·분 열 디자인으로 `TimePicker`를 canonical catalog에 등록하고 계약·Web·Native
6
+ surface를 stable로 승격했다. 양쪽 개별 Storybook은 `배포/컴포넌트/입력/시각 선택`이다.
7
+ 필드 한 개와 Popover/Sheet 한 개의 초안·확정·취소, 기존 폼 안에 넣는 inline 모드,
8
+ `HH:mm | null` 값·분 간격·선택 불가 시간·비활성/읽기 전용을 공통으로 제공한다.
9
+ 과거 Select 두 개의 합성만 제공한다는 판단은 실제 선택의창 요구와 사용자 승인으로 대체됐다.
10
+
11
+ 변경 범위 검사: contracts 16건(핵심 helper 3건과 기존 참조/상태 검사 13건), Web 동작 10건,
12
+ Native host 동작 7건, Web TimePicker matrix 5건·SSR 1건, Native matrix/default 6건 통과.
13
+ 최대 글자 조건은 범위 제외다. 두 renderer build·typecheck, 두 Showcase typecheck,
14
+ 공개 API map 및 선택한 사용 지침 2개 검사도 통과했다. 실제 Web inline 렌더링을 캡처·확인했다.
15
+ 선택의창 local-source 타입 검사와 iOS/Android 개발 번들 HTTP 200 및 새 TimePicker 모듈 포함을 확인했다.
16
+ 실제 iOS/Android 화면 조작·VoiceOver/TalkBack 기기 검증으로 해석하지 않는다.
17
+
18
+ 새 granular TimePicker entry의 import graph는 Web 9개·Native 21개 로컬 모듈이며 root barrel,
19
+ metadata, optional peer 유입이 없다. 기존 전체 renderer 경계 검사는 Web `social-compositions`·
20
+ `toggle-feedback`의 `@number-flow/react` 선택 의존성 유입으로 실패하여 전체 통과로 보고하지 않는다.
21
+ 이 별도 소스는 이번 TimePicker 범위에서 수정하지 않았다.
22
+
23
+ 최신 사용자 지시로 개발 소스에서만 확인했다. 세 패키지 버전은 1.34.0으로 유지하며
24
+ release:version·npm 게시·공개 Storybook 배포·앱 릴리즈·커밋·push를 실행하지 않았다.
25
+ 선택의창은 기존 개발 소스 adapter로 소비하며 설치된 1.34.0 패키지에 새 API가 있다고 주장하지 않는다.
26
+
27
+
3
28
  ## 2026-10-18 화면·구성 22종 승격
4
29
 
5
30
  ScreenLayout, CompositionLayout, SettingsScreen, SearchScreen, EditorScreen, PermissionScreen,
package/docs/steps.md CHANGED
@@ -120,3 +120,7 @@ first-party Web·Native renderer와 상태 파생·환경 matrix 증거는 연
120
120
  후보로는 남기되, "이미 대체 대상으로 정해진 화면"처럼 적지 않는다 — 지금은 제품이 그
121
121
  화면을 진행바로 계속 쓰고 있다는 사실만 정확하다. BurnTok 가입 흐름은 이번 재검증에서
122
122
  직접 확인하지 않았다.
123
+
124
+ ## 읽기 흐름의 자유 이동 — 2026-10-19
125
+
126
+ 포트폴리오 설계·운영 설명은 단계 선택으로 해당 본문을 읽는 흐름이므로 `StepsDescriptor.navigationMode: "free"`에서 `onStepPress`가 모든 단계에 동작한다. 기본 `linear`는 기존 검증형 작성 흐름처럼 이전 단계만 허용한다. 이 절이 기존 앞으로 이동 배제 설명의 읽기 흐름 예외다. 단일 currentStepId와 앞/뒤 상태 도출은 유지하며 제품은 상태 문구를 읽기 맥락에 맞춘다.
@@ -93,3 +93,5 @@ Ant의 원시 색상이나 낮은 테두리 대비까지 복제하지 않고, HJ
93
93
  ## 단색 배지 판 (2026-10-18)
94
94
 
95
95
  사용자가 제시한 오늘야구 경기 상태 배지의 단색 판과 흰 글자를 양 테마에서 유지하도록 `neutralFill`(#4e5968)·`strongFill`(#333d4b)을 추가했다. 기존 textMuted/text는 다크 모드에서 밝아지므로 판에 재사용하지 않는다. 상태색은 기존 `accentFill`과 `dangerFill`, 브랜드는 primary를 사용한다. 일반 본문과 Tag의 색 계약은 유지한다.
96
+
97
+ 선택의창의 밝은 다크 브랜드 primary는 어두운 `onPrimary`를 사용하므로 이를 상태 배지의 회색·성공색 위에 재사용하면 대비가 무너진다. `onStatusFill`을 별도 역할로 두고 상태 채움의 글자와 아이콘에 함께 적용한다. 브랜드와 위험 채움은 각각 기존 `onPrimary`·`onDanger` 짝을 유지한다.