@hjmds/design-contracts 1.21.0 → 1.23.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 (122) hide show
  1. package/dist/version.d.ts +1 -1
  2. package/dist/version.js +1 -1
  3. package/dist/version.js.map +1 -1
  4. package/docs/authoring-tools.md +1 -1
  5. package/docs/collection-editing.md +3 -3
  6. package/docs/communication.md +1 -1
  7. package/docs/data-workflows.md +2 -2
  8. package/docs/generated/component-maturity.md +1 -1
  9. package/docs/generated/renderer-evidence.json +3 -3
  10. package/docs/generated/renderer-evidence.md +1 -1
  11. package/docs/generated/showcase-manifest.json +1 -1
  12. package/docs/media-transport.md +1 -1
  13. package/docs/screen-patterns.md +11 -4
  14. package/docs/social-compositions.md +1 -1
  15. package/docs/streaming-answer.md +1 -1
  16. package/docs/task-controls.md +1 -1
  17. package/docs/toggle-feedback.md +1 -1
  18. package/docs/transfer-task.md +1 -1
  19. package/docs/usage/README.md +13 -12
  20. package/docs/usage/SELECTION.md +36 -23
  21. package/docs/usage/STANDARD.md +5 -0
  22. package/docs/usage/components/button.md +1 -1
  23. package/docs/usage/components/chart.md +1 -1
  24. package/docs/usage/components/comment-thread-screen.md +4 -1
  25. package/docs/usage/components/composition-layout.md +92 -0
  26. package/docs/usage/components/data-table.md +4 -0
  27. package/docs/usage/components/screen-layout.md +1 -0
  28. package/docs/usage/components/search-screen.md +1 -0
  29. package/docs/usage/components/tabs.md +1 -1
  30. package/docs/usage/compositions/action-feedback.md +5 -3
  31. package/docs/usage/compositions/action-recovery-optimistic.md +4 -2
  32. package/docs/usage/compositions/action-recovery-save.md +4 -2
  33. package/docs/usage/compositions/action-recovery-undo.md +4 -2
  34. package/docs/usage/compositions/activity-status.md +3 -1
  35. package/docs/usage/compositions/adaptive-content.md +4 -2
  36. package/docs/usage/compositions/authoring-tools.md +3 -1
  37. package/docs/usage/compositions/collection-detail.md +3 -1
  38. package/docs/usage/compositions/collection-editing.md +4 -2
  39. package/docs/usage/compositions/command-records.md +3 -1
  40. package/docs/usage/compositions/common-message.md +3 -1
  41. package/docs/usage/compositions/common-notification.md +3 -1
  42. package/docs/usage/compositions/communication.md +3 -1
  43. package/docs/usage/compositions/compound-controls.md +4 -2
  44. package/docs/usage/compositions/content-transition-comparison.md +3 -1
  45. package/docs/usage/compositions/context-toolbar.md +4 -2
  46. package/docs/usage/compositions/data-layouts.md +4 -2
  47. package/docs/usage/compositions/data-workflows.md +4 -2
  48. package/docs/usage/compositions/date-entry.md +3 -1
  49. package/docs/usage/compositions/date-time-selection.md +3 -1
  50. package/docs/usage/compositions/design-profile-comparison.md +3 -1
  51. package/docs/usage/compositions/disclosure.md +6 -4
  52. package/docs/usage/compositions/document-resource.md +3 -1
  53. package/docs/usage/compositions/environment-matrix.md +3 -1
  54. package/docs/usage/compositions/expo-interactions.md +4 -2
  55. package/docs/usage/compositions/family-drawer.md +4 -2
  56. package/docs/usage/compositions/field-group.md +3 -1
  57. package/docs/usage/compositions/floating-action-button.md +3 -1
  58. package/docs/usage/compositions/illustrated-outcome.md +3 -1
  59. package/docs/usage/compositions/input-sheet.md +3 -1
  60. package/docs/usage/compositions/interaction-adapters.md +3 -1
  61. package/docs/usage/compositions/interaction-flow-apply.md +3 -1
  62. package/docs/usage/compositions/interaction-flow-draft.md +3 -1
  63. package/docs/usage/compositions/interaction-flow-search.md +3 -1
  64. package/docs/usage/compositions/live-list.md +3 -1
  65. package/docs/usage/compositions/media-transport.md +4 -2
  66. package/docs/usage/compositions/native-renderers.md +3 -1
  67. package/docs/usage/compositions/navigation-bar-collection.md +3 -1
  68. package/docs/usage/compositions/optional-adapters.md +3 -1
  69. package/docs/usage/compositions/optional-motion.md +3 -1
  70. package/docs/usage/compositions/origin-dialog.md +3 -1
  71. package/docs/usage/compositions/paper-surface.md +3 -1
  72. package/docs/usage/compositions/photo-source.md +3 -1
  73. package/docs/usage/compositions/purpose-input-comment.md +8 -2
  74. package/docs/usage/compositions/purpose-input-message.md +4 -2
  75. package/docs/usage/compositions/reference-first.md +3 -1
  76. package/docs/usage/compositions/reference-review.md +3 -1
  77. package/docs/usage/compositions/reference-settings.md +3 -1
  78. package/docs/usage/compositions/selection-motion.md +4 -2
  79. package/docs/usage/compositions/selection-scope.md +3 -1
  80. package/docs/usage/compositions/social-compositions.md +3 -1
  81. package/docs/usage/compositions/stea-event-ticket.md +3 -1
  82. package/docs/usage/compositions/stea-flip-card.md +4 -2
  83. package/docs/usage/compositions/stea-order-progress.md +5 -3
  84. package/docs/usage/compositions/stea-otp-verify.md +5 -3
  85. package/docs/usage/compositions/stea-pixel-empty.md +5 -3
  86. package/docs/usage/compositions/stea-schedule-card.md +5 -3
  87. package/docs/usage/compositions/stea-stat-summary.md +4 -2
  88. package/docs/usage/compositions/streaming-answer.md +3 -1
  89. package/docs/usage/compositions/task-controls.md +4 -2
  90. package/docs/usage/compositions/texture-comparison.md +3 -1
  91. package/docs/usage/compositions/time-selection.md +5 -3
  92. package/docs/usage/compositions/toast-layout.md +3 -1
  93. package/docs/usage/compositions/toggle-feedback.md +3 -1
  94. package/docs/usage/compositions/transfer-task.md +4 -2
  95. package/docs/usage/compositions/upload-recovery.md +4 -2
  96. package/docs/usage/compositions/video-dialog.md +3 -1
  97. package/docs/usage/compositions/visual-foundations.md +5 -3
  98. package/docs/usage/compositions/web-additions.md +6 -4
  99. package/docs/usage/compositions/web-navigation.md +4 -2
  100. package/docs/usage/screens/common-chat.md +3 -1
  101. package/docs/usage/screens/common-comments.md +6 -4
  102. package/docs/usage/screens/common-inbox.md +3 -1
  103. package/docs/usage/screens/common-login.md +3 -1
  104. package/docs/usage/screens/common-profile.md +3 -1
  105. package/docs/usage/screens/common-saved.md +3 -1
  106. package/docs/usage/screens/common-search.md +3 -1
  107. package/docs/usage/screens/common-settings.md +3 -1
  108. package/docs/usage/screens/common-shell.md +3 -1
  109. package/docs/usage/screens/dashboard.md +3 -1
  110. package/docs/usage/screens/discovery-gallery.md +3 -1
  111. package/docs/usage/screens/flow-collection.md +3 -1
  112. package/docs/usage/screens/flow-editor.md +3 -1
  113. package/docs/usage/screens/flow-media.md +3 -1
  114. package/docs/usage/screens/flow-moderation.md +3 -1
  115. package/docs/usage/screens/flow-onboarding.md +3 -1
  116. package/docs/usage/screens/flow-permission.md +3 -1
  117. package/docs/usage/screens/landing.md +4 -2
  118. package/docs/usage/screens/mockup-studio.md +3 -1
  119. package/docs/usage/screens/notification-settings.md +32 -138
  120. package/docs/usage/screens/product-bento.md +3 -1
  121. package/docs/usage/screens/reference-comparison.md +3 -1
  122. package/package.json +1 -1
@@ -4,12 +4,14 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.14.0
7
- - 검토일: 2026-10-07
7
+ - 검토일: 2026-10-15
8
8
  - 근거: `showcase/web/src/patterns/illustrated-outcome-preview.tsx`, `showcase/native/src/illustrated-outcome-preview.tsx`
9
9
  - 스토리북: `배포/구성/피드백과 복구/그림과 시작 안내`
10
10
 
11
11
  승급: 2026-10-07 사용자 승인, [검토 결과](../../../../../docs/qa/2026-10-07-experiment-promotion-release.md). Storybook 분류이며 제품 적용 증거는 별도다.
12
12
 
13
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
14
+
13
15
  ## 언제 쓰나
14
16
 
15
17
  빈 목록에서 시작을 안내하고 짧은 온보딩을 거쳐 결과를 보여 줄 때 쓴다. 3D 그림은 제품 자산이며
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [Sheet 입력 화면과 가용 영역](../../sheet.md), `showcase/web/src/patterns/InputSheet.stories.tsx`, `showcase/native/src/InputSheet.stories.tsx`, `src/component-recipes.ts`(`sheetRecipe`), `packages/react/src/styles.css`(`.hjm-sheet`), `packages/react-native/src/overlays.tsx`(`Sheet`)
9
9
  - 스토리북: `배포/구성/입력과 작성/입력 시트`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  현재 화면 위에 하단 시트를 띄워 짧은 입력(이름 바꾸기, 메모 한 줄)을 받고, 키보드가 올라와도 본문을 스크롤하며
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [Optional interaction adapters](../../../../../docs/interaction-adapters.md), `src/interaction-adapters.ts`, `showcase/web/src/patterns/InteractionAdapters.stories.tsx`, `showcase/native/src/InteractionAdapters.stories.tsx`. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/드래그·스와이프·모션`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/직접 조작과 모션/끌기·밀기·화면 전환`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  순서 바꾸기·행 작업·내용 전환·카드 넘기기·달성 축하·카드 확대 화면 전환 같은 선택형 상호작용 어댑터를 한 화면에서 함께 쓸 때, 각 어댑터를 어디에 놓고 무엇으로 감싸야 하는지 확인하는 구성이다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [제품 상호작용 품질](../../../../../docs/INTERACTION_QUALITY.md), [Sheet 계약](../../sheet.md), `src/component-recipes.ts`(`sheetRecipe`), `showcase/web/src/patterns/interaction-flow-previews.tsx`, `showcase/native/src/interaction-flow-previews.tsx`. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/상호작용 예제/선택 후 적용·취소`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/선택과 필터/선택 후 적용·취소`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  표시 방식·정렬·필터처럼 시트에서 여러 번 바꿔 본 뒤 적용을 눌러야 화면에 반영되고, 취소하거나 닫으면 기존 선택을 유지해야 할 때 쓴다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [제품 상호작용 품질](../../../../../docs/INTERACTION_QUALITY.md), [공통 실행과 실패 복구 · 초안과 실행 취소](../../action-session.md#초안과-실행-취소), [Sheet 계약](../../sheet.md), `showcase/web/src/patterns/interaction-flow-previews.tsx`, `showcase/native/src/interaction-flow-previews.tsx`. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/상호작용 예제/닫았다 열고 초안 이어쓰기`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/입력과 작성/닫았다 열고 초안 이어쓰기`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  메모·댓글처럼 시트에서 쓰던 글을 저장하지 않고 닫았다가 다시 열었을 때, 쓰던 초안을 그대로 이어 쓰게 할 때 쓴다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [공통 실행과 실패 복구](../../action-session.md), [제품 상호작용 품질](../../../../../docs/INTERACTION_QUALITY.md), `src/action-session.ts`, `showcase/web/src/patterns/interaction-flow-previews.tsx`, `showcase/native/src/interaction-flow-previews.tsx`. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/상호작용 예제/늦은 응답보다 최신 검색 유지`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/입력과 작성/늦은 응답보다 최신 검색 유지`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  검색어를 바꿔 다시 검색했을 때 먼저 보낸 요청이 늦게 도착해도 최신 검색 결과를 덮어쓰지 않게 할 때 쓴다.
@@ -4,12 +4,14 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.14.0
7
- - 검토일: 2026-10-07
7
+ - 검토일: 2026-10-15
8
8
  - 근거: `showcase/web/src/patterns/live-list-preview.tsx`, `showcase/native/src/live-list-preview.tsx`
9
9
  - 스토리북: `배포/구성/정보 표시/추가해도 유지되는 목록`
10
10
 
11
11
  승급: 2026-10-07 사용자 승인, [검토 결과](../../../../../docs/qa/2026-10-07-experiment-promotion-release.md). Storybook 분류이며 제품 적용 증거는 별도다.
12
12
 
13
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
14
+
13
15
  ## 언제 쓰나
14
16
 
15
17
  입력 중인 목록에 새 데이터가 추가되거나 순서가 바뀌어도 기존 초안과 항목의 정체성을 유지할 때 쓴다.
@@ -3,11 +3,13 @@
3
3
  - 단계: 구성
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
- - 적용: 미게시(1.20.0 이후)
6
+ - 적용: 1.21.0
7
7
  - 검토일: 2026-10-15
8
8
  - 근거: [미디어 제어 계약](../../media-transport.md), `src/media-transport.ts`, 양 renderer `src/media-transport.tsx`
9
9
  - 스토리북: `배포/구성/직접 조작과 모션/미디어 재생 제어`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  실제 오디오/영상 엔진의 재생·일시 정지·유한 길이 탐색을 같은 구조로 제공할 때 쓴다.
@@ -84,4 +86,4 @@ import { MediaTransport } from "@hjmds/react-native/media-transport";
84
86
  - duration null/0에 가짜 분모나 임의 길이를 넣지 않는다.
85
87
  - active=false는 컨트롤 수명이다. 플레이어 pause/dispose도 제품 adapter에서 수행한다.
86
88
  - 다른 미디어 엔티티로 전환할 때 key를 바꾸고 이전 플레이어·요청을 정리한다.
87
- - Native 재생 모듈 없음 안내를 실제 재생 성공으로 기록하지 않는다. 새 API는 아직 미게시다.
89
+ - Native 재생 모듈 없음 안내를 실제 재생 성공으로 기록하지 않는다. 새 API는 npm 1.21.0에서 제공한다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: `showcase/native/src/NativeRenderers.stories.tsx`, `showcase/native/src/story-registry.ts` `nativeRendererStoryGroups`
9
9
  - 스토리북: `배포/구성/비교와 검증/네이티브 컴포넌트 기기 확인`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  Native 공개 컴포넌트가 실제 기기·시뮬레이터에서 그려지고 눌리는지 범주별로 한 화면에서 확인할 때 쓴다. 화면 설계의 본보기가 아니라
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [BottomNavigation](../../bottom-navigation.md), `src/component-recipes.ts` `bottomNavigationRecipe`, `packages/react/src/styles.css` `.hjm-bottom-navigation`, `showcase/shared/navigation-bar-references.ts`
9
9
  - 스토리북: `배포/구성/비교와 검증/내비게이션 바 비교`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  하단 탭에 목적지 이동과 별개의 행동(작성·전원·기록 추가)을 함께 둘지, 선택한 목적지를 어떻게 보여 줄지 고를 때 이 비교를 본다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [Optional presentation adapters](../../optional-adapters.md#behavior-boundaries), `packages/react-native/src/keyboard-controller.tsx`, `packages/react-native/src/sheet-gesture.tsx`, `showcase/native/src/OptionalAdapters.stories.tsx`. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/이미지·시트·키보드 조작`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/직접 조작과 모션/이미지·시트·키보드 조작`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  Native 앱 한 화면에서 이미지 확대 보기, 끌어서 높이를 바꾸는 시트, OS 길게 누르기 메뉴, 키보드를 따라 올라가는 하단 행동을 함께 쓸 때 provider 중첩 순서와 각 요소의 자리를 확인하는 구성이다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [Statistic](../../statistic.md), [선택 어댑터](../../optional-adapters.md), `showcase/web/src/components/OptionalMotion.stories.tsx`
9
9
  - 스토리북: `배포/구성/직접 조작과 모션/숫자 변화와 메뉴 변형`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  선택 설치 모션(숫자 자리 단위 변화, 메뉴 형태 변환)을 기존 컴포넌트 자리에 끼워 넣을 때 쓴다. 숫자 지표가 사용자 행동으로
@@ -4,12 +4,14 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.14.0
7
- - 검토일: 2026-10-07
7
+ - 검토일: 2026-10-15
8
8
  - 근거: `showcase/web/src/patterns/origin-dialog-preview.tsx`, `showcase/native/src/origin-dialog-preview.tsx`
9
9
  - 스토리북: `배포/구성/입력과 작성/버튼에서 이어지는 편집`
10
10
 
11
11
  승급: 2026-10-07 사용자 승인, [검토 결과](../../../../../docs/qa/2026-10-07-experiment-promotion-release.md). Storybook 분류이며 제품 적용 증거는 별도다.
12
12
 
13
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
14
+
13
15
  ## 언제 쓰나
14
16
 
15
17
  현재 화면의 항목을 짧게 편집하고 돌아올 때 출발 위치를 시각적으로 연결한다. 별도 상태
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.16.0
7
- - 검토일: 2026-10-08
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [EffectSurface 계약](../../effect-surface.md), A-02 종이 표현 후보의 줄무늬 보완
9
9
  - 스토리북: `배포/구성/비교와 검증/종이 줄무늬 비교`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  같은 입력·기록에서 종이 preset의 grain+ruled 상속과 앱이 지정한 평면/줄무늬 표현을 비교한다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 구성 API 지침 참조
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [반복 화면 조합](../../screen-patterns.md); 공통 API와 실제 Web·Native 예제의 슬롯·상태를 대조해 중복 조립 방지. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/사진/촬영과 앨범 선택`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/선택과 필터/사진 촬영과 앨범 선택`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  명시적으로 선택 후 플랫폼 picker 실행 흐름이 필요할 때 쓴다. PhotoSourceSheet의 상태·콜백을 제품 로직에 연결하며 새 데이터 엔진을 만들지 않는다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 구성 API 지침 참조
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [MessageComposer](../components/message-composer.md), [공통 실행과 실패 복구](../../action-session.md), `showcase/web/src/patterns/conversation-previews.tsx`, `showcase/native/src/conversation-previews.tsx`. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/입력과 작성/댓글 작성`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/입력과 작성/댓글 작성`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  게시물·기록 아래에서 댓글이나 특정 댓글에 대한 답글을 남기고, 실패하면 글과 답글 대상을 그대로 남겨 다시 등록하게 할 때 쓴다. 새 입력 엔진을 만들지 않고 MessageComposer를 쓴다.
@@ -75,6 +77,8 @@ import { Text } from "@hjmds/react/layout";
75
77
  <MessageComposer
76
78
  label={t("comments.input")}
77
79
  sendLabel={t("comments.send")}
80
+ sendIcon={<ArrowUpIcon />}
81
+ sendPresentation="circle"
78
82
  value={draft}
79
83
  onValueChange={setDraft}
80
84
  pending={sending}
@@ -92,6 +96,8 @@ import { Text } from "@hjmds/react-native/primitives";
92
96
  <MessageComposer
93
97
  label={t("comments.input")}
94
98
  sendLabel={t("comments.send")}
99
+ sendIcon={<ArrowUpIcon />}
100
+ sendPresentation="circle"
95
101
  value={draft}
96
102
  onValueChange={setDraft}
97
103
  pending={sending}
@@ -106,7 +112,7 @@ import { Text } from "@hjmds/react-native/primitives";
106
112
  ## 함정
107
113
 
108
114
  - 실패 시 글·답글 대상을 지우지 않는다. 성공을 먼저 표시하고 지우면 재전송할 내용이 사라진다.
109
- - Enter 전송을 덧붙이지 않는다. IME 조합 중 Enter를 전송으로 가로채면 한글 마지막 글자가 빠진다.
115
+ - 기본 Enter는 줄바꿈이다. 제품 키 핸들러로 전송을 덧붙이지 않는다. 명시적인 Enter 전송은 MessageComposer의 공개 `submitMode`를 사용해 Web의 Shift+Enter·IME 조합 보호를 유지한다.
110
116
  - 스토리의 "다음 전송 실패시키기"·350ms 지연·예제 사진은 로컬 시연이다. 업로드·서버 저장·권한은 제품이 연결한다.
111
117
 
112
118
  2026-10-13 예제 검수: Web의 원형 전송 버튼이 잠기거나 없어질 때 초점이 body로 빠져나가던 경로를 `inputRef`로 보완했다. 전송 시작 때만 입력에 초점을 두므로 대기 중 사용자가 다른 곳으로 옮긴 초점을 완료 시 다시 가져오지 않는다. 실패 후 수정한 초안으로 재시도하며, 사진·답장 대상은 성공을 확인한 뒤에만 정리한다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 구성 API 지침 참조
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [MessageComposer](../components/message-composer.md), [공통 실행과 실패 복구](../../action-session.md), `showcase/web/src/patterns/conversation-previews.tsx`, `showcase/native/src/conversation-previews.tsx`. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/입력과 작성/메시지 작성`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/입력과 작성/메시지 작성`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  대화 화면 하단에서 글과 사진 여러 장을 함께 보내고, 실패하면 글·사진·답장 대상을 그대로 남겨 다시 보내게 할 때 쓴다. 새 입력 엔진을 만들지 않고 MessageComposer를 쓴다.
@@ -115,7 +117,7 @@ import { Text } from "@hjmds/react-native/primitives";
115
117
  ## 함정
116
118
 
117
119
  - 실패 시 글·사진·답장 대상을 지우지 않는다. 성공을 먼저 표시하고 지우면 재전송할 내용이 사라진다.
118
- - Enter 전송을 덧붙이지 않는다. IME 조합 중 Enter를 전송으로 가로채면 한글 마지막 글자가 빠진다.
120
+ - Enter는 기본 줄바꿈이다. 데스크톱 채팅에서 Enter 전송이 필요하면 [MessageComposer](../components/message-composer.md)의 `submitMode="send"`를 사용한다. Web은 Shift+Enter·IME 조합 중 Enter를 전송하지 않는다. 제품에서 별도 키 핸들러로 전송을 덧붙이면 이 보호를 우회해 한글 마지막 글자가 빠질 수 있다. Native는 별도로 선택하지 않으면 줄바꿈을 유지한다.
119
121
  - 스토리의 "다음 전송 실패시키기"·350ms 지연·예제 사진은 로컬 시연이다. 업로드·서버 저장·권한은 제품이 연결한다.
120
122
 
121
123
  2026-10-13 예제 검수: Web의 원형 전송 버튼이 잠기거나 없어질 때 초점이 body로 빠져나가던 경로를 `inputRef`로 보완했다. 전송 시작 때만 입력에 초점을 두므로 대기 중 사용자가 다른 곳으로 옮긴 초점을 완료 시 다시 가져오지 않는다. 실패 후 수정한 초안으로 재시도하며, 사진·답장 대상은 성공을 확인한 뒤에만 정리한다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 구성 API 지침 참조
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [반복 화면 조합](../../screen-patterns.md); 공통 API와 실제 Web·Native 예제의 슬롯·상태를 대조해 중복 조립 방지. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/시작하기/첫 작업을 만들고 이어하기`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/입력과 작성/첫 작업을 만들고 이어하기`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  첫 기록을 단계별 작성하고 중단한 초안 이어가기 흐름이 필요할 때 쓴다. Steps의 상태·콜백을 제품 로직에 연결하며 새 데이터 엔진을 만들지 않는다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 구성 API 지침 참조
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [반복 화면 조합](../../screen-patterns.md); 공통 API와 실제 Web·Native 예제의 슬롯·상태를 대조해 중복 조립 방지. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/확인/선택 내용 검토와 수정`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/입력과 작성/선택 내용 검토와 수정`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  선택 내용을 검토하고 수정 후 명시적으로 확정 흐름이 필요할 때 쓴다. 입력·단계·저장 세션을 제품 로직에 연결하며 새 데이터 엔진을 만들지 않는다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 구성 API 지침 참조
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [반복 화면 조합](../../screen-patterns.md); 공통 API와 실제 Web·Native 예제의 슬롯·상태를 대조해 중복 조립 방지. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/설정/변경 저장과 이탈 확인`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/피드백과 복구/변경 저장과 이탈 확인`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  저장값과 편집 초안을 비교해 이탈 확인 흐름이 필요할 때 쓴다. 입력·단계·저장 세션을 제품 로직에 연결하며 새 데이터 엔진을 만들지 않는다.
@@ -4,15 +4,17 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.14.0
7
- - 검토일: 2026-10-07
7
+ - 검토일: 2026-10-15
8
8
  - 근거: 공개 API를 사용하는 `showcase/*/reference-adoption-previews.tsx`
9
9
  - 스토리북: `배포/구성/직접 조작과 모션/선택 배경 이동`
10
10
 
11
11
  승급: 2026-10-07 사용자 승인, [검토 결과](../../../../../docs/qa/2026-10-07-experiment-promotion-release.md). Storybook 분류이며 제품 적용 증거는 별도다.
12
12
 
13
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
14
+
13
15
  ## 언제 쓰나
14
16
 
15
- 짧은 단일 선택의 현재 항목을 이어지는 배경으로 보여 줄 때 쓴다. 선택 값·키보드·초점은 기존 SegmentedControl이 소유한다. 별도 신규 wrapper API가 아니라 아래 공개 컴포넌트의 조합 규격이다.
17
+ 짧은 단일 선택의 현재 항목을 이어지는 배경으로 보여 줄 때 쓴다. 선택 값·키보드·초점은 기존 SegmentedControl이 소유한다. 기본 외곽 배치는 CompositionLayout이 제공하고 아래 공개 API가 해당 상호작용을 담당한다.
16
18
 
17
19
  ## 구성 요소
18
20
 
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [제품 상호작용 품질](../../../../../docs/INTERACTION_QUALITY.md), `showcase/web/src/patterns/SelectionScope.stories.tsx`, `showcase/native/src/SelectionScope.stories.tsx`. 2026-10-06 사용자 승인으로 스토리북 배포(이전 `실험/구성/상호작용 예제/대표 항목과 묶음 전체 선택`, [승인 기록](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-전체-승격과-규격-확정))
9
9
  - 스토리북: `배포/구성/선택과 필터/대표 항목과 묶음 전체 선택`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  사진 묶음·스레드처럼 대표 항목 하나와 묶음 전체가 같은 모양으로 보일 때, 공유·삭제·이동 전에 대상 범위와 개수를 고르고 문구로 확인한 뒤 적용하게 할 때 쓴다.
@@ -3,11 +3,13 @@
3
3
  - 단계: 구성
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
- - 적용: 미게시(1.20.0 이후)
6
+ - 적용: 1.21.0
7
7
  - 검토일: 2026-10-15
8
8
  - 근거: [사회적 행동 계약](../../social-compositions.md), 양 renderer의 `src/social-compositions.tsx`
9
9
  - 스토리북: `배포/구성/정보 표시/팔로우 프로필`, `배포/구성/선택과 필터/행사 참석 응답`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  프로필 팔로우나 행사 참석 응답의 실제 요청과 수치의 실패 복구가 필요할 때 사용한다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [QRCode](../../qr-code.md), `packages/react/src/qr-code.tsx`, `packages/react-native/src/qr-code.tsx`, `showcase/web/src/patterns/stea-expression-previews.tsx`(`EventTicket`), `showcase/native/src/stea-expression-previews.tsx`, `showcase/shared/stea-expressions.ts`(`ticketCopy`), `src/qr-code-recipe.ts`, `src/card.ts`
9
9
  - 스토리북: `배포/구성/정보 표시/일정과 식별 정보 티켓`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  공연·예약 입장권처럼 일시·장소·좌석 정보와 함께, 현장에서 보여 줄 QR 코드와 사람이 읽을 예매 번호를 한 카드에 담을 때 쓴다.
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: `showcase/web/src/patterns/stea-expression-previews.tsx`(`FlipInfoCard`), `showcase/native/src/stea-expression-previews.tsx`, `showcase/shared/stea-expressions.ts`(`flipCopy`), `src/content-transition.ts`, `src/card.ts`
9
9
  - 스토리북: `배포/구성/정보 표시/앞면과 상세 정보 전환`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  모임·상품처럼 한 카드에 요약(앞면)과 상세 항목(뒷면)이 있고, 사용자가 버튼 하나로 두 면을 오가게 할 때 쓴다.
@@ -52,7 +54,7 @@
52
54
  | 전환 버튼 | `Button` secondary | 면 아래, 전환되는 면 **밖**, 꽉 찬 폭(Stack 기본 stretch) | 높이 `control.buttonHeight.medium` 44, 면과 `spacing.md` 16 |
53
55
 
54
56
  - 버튼은 두 면 모두에서 같은 자리(면 아래, 면 밖)에 둔다. 면 안에 두면 면이 바뀔 때 포커스한 버튼이 사라진다.
55
- - 두 면의 높이가 다르면 버튼이 위아래로 움직인다. 면 높이를 고정하려면 제품 레이아웃에서 최소 높이를 준다(스토리는 고정하지 않는다).
57
+ - 두 면의 높이가 다르면 버튼이 위아래로 움직인다. 면 높이 전환이 필요하면 HJM ContentTransition의 공개 크기 전환을 사용한다(스토리는 고정하지 않는다).
56
58
  - 전환 버튼은 보기 전환이라 primary가 아니라 secondary다([Button](../components/button.md)).
57
59
 
58
60
  ## 흐름과 상태
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [Steps](../../steps.md), [Timeline](../../timeline.md), `showcase/web/src/patterns/stea-composition-previews.tsx`(`OrderProgressRetry`), `showcase/native/src/stea-composition-previews.tsx`(`OrderProgressRetry`, `Frame`), `showcase/shared/stea-compositions.ts`(`orderReducer`, `orderStepsDescriptor`), `src/steps.ts`, `src/container.ts`
9
9
  - 스토리북: `배포/구성/피드백과 복구/처리 단계와 재시도`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  주문·신청처럼 서버가 단계를 하나씩 확정하는 처리 과정을 보여 주고, 확정에 실패하면 같은 단계를 다시 요청하게 할 때 쓴다.
@@ -55,7 +57,7 @@ Native 화면(ScrollView, 위아래 spacing.lg 20) > Container gutter 16(폭 < 6
55
57
 
56
58
  | 영역 | 컴포넌트 | 위치 | 크기·간격 |
57
59
  | --- | --- | --- | --- |
58
- | 바깥 틀 | Web: 제품 화면 레이아웃(문서 스크롤). Native: `ScrollView` > `Container` | 이 구성은 바깥 폭·여백을 정하지 않는다(스토리는 Card만 그린다). Native는 Card를 `ScrollView` 안 [Container](../components/container.md)에 둔다. 입력이 없어 키보드 처리는 없다. 안전 영역은 화면 골격(내비게이션 헤더·탭 바)이 맡는다 | Native ScrollView 위아래 `spacing.lg` 20, Container gutter 폭 600 미만 `compact` 16 · 이상 `regular` 20(`layout.pagePadding`) |
60
+ | 바깥 틀 | Web: HJM ScreenLayout의 본문. Native: `ScrollView` > `Container` | 이 구성은 바깥 폭·여백을 정하지 않는다(스토리는 Card만 그린다). Native는 Card를 `ScrollView` 안 [Container](../components/container.md)에 둔다. 입력이 없어 키보드 처리는 없다. 안전 영역은 화면 골격(내비게이션 헤더·탭 바)이 맡는다 | Native ScrollView 위아래 `spacing.lg` 20, Container gutter 폭 600 미만 `compact` 16 · 이상 `regular` 20(`layout.pagePadding`) |
59
61
  | 틀 | `Card` | 바깥 틀 안, 스크롤과 함께 | body padding `spacing.md` 16, 안쪽 `Stack gap="lg"` 20 |
60
62
  | 단계 | `Steps` | Card 머리 아래 맨 위 | 단계 사이 `stepsRecipe.gap` `spacing.xs` 8, 표시 원 `glyph.md` |
61
63
  | 진행 | 진행 문구 | 단계 아래 | `spacing.lg` 20 |
@@ -173,7 +175,7 @@ const gutter = resolveWindowClass(width) === "compact" ? "compact" : "regular";
173
175
  | --- | --- | --- |
174
176
  | 진행 문구 자리 | 빈 `role="status"`를 항상 마운트(알림 자리 유지) | 문구가 있을 때만 마운트(iOS는 live region을 무시하고 빈 Text가 틈을 남김, 2026-10-02 시뮬레이터 확인) |
175
177
  | 이벤트 | `onClick` | `onPress` |
176
- | 바깥 틀 | 제품 화면 레이아웃(문서 스크롤) | `ScrollView` > `Container` |
178
+ | 바깥 틀 | HJM ScreenLayout의 본문 | `ScrollView` > `Container` |
177
179
  | 실패 Notice 발표 | `danger`는 늘 `role="alert"` | `announcement="assertive"`를 지정해야 발표(기본 `none`) |
178
180
 
179
181
  ## 함정
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: [OtpField](../../otp-field.md), `showcase/web/src/patterns/stea-composition-previews.tsx`(`OtpVerifyRecover`), `showcase/native/src/stea-composition-previews.tsx`(`OtpVerifyRecover`, `Frame`), `showcase/shared/stea-compositions.ts`(`otpReducer`·`otpErrorMessage`), `src/otp-field.ts`, `src/result.ts`, `src/card.ts`, `src/container.ts`
9
9
  - 스토리북: `배포/구성/입력과 작성/인증번호 확인과 다시 입력`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  문자·메일로 받은 숫자 인증번호를 입력하고 서버 확인을 기다린 뒤, 틀리면 남은 횟수를 보여 주고 다시 받게 하는 흐름에 쓴다.
@@ -61,7 +63,7 @@ Native 화면(ScrollView keyboardShouldPersistTaps="handled", 위아래 spacing.
61
63
 
62
64
  | 영역 | 컴포넌트 | 위치 | 크기·간격 |
63
65
  | --- | --- | --- | --- |
64
- | 바깥 틀 | Web: 제품 화면 레이아웃(문서 스크롤). Native: `ScrollView` > `Container` | 이 구성은 바깥 폭·여백을 정하지 않는다. 스토리는 Card만 그린다. Web 단독 화면이면 [Container](../components/container.md) 같은 읽기 폭 컨테이너는 제품이 고른다. Native는 Card를 `ScrollView`(`keyboardShouldPersistTaps="handled"`) 안 `Container`에 둔다. 입력이 한 칸이라 [KeyboardFormScrollView](../components/keyboard-form-scroll-view.md)(실험, `react-native-keyboard-controller` 설치와 앱 루트 `KeyboardMotionProvider` 필요)는 기본값이 아니며, 여러 필드 폼 안에 이 구성을 넣을 때만 쓴다. 안전 영역은 화면 골격(내비게이션 헤더·탭 바)이 맡는다 | Native ScrollView 위아래 `spacing.lg` 20, Container gutter 폭 600 미만 `compact` 16 · 이상 `regular` 20(`layout.pagePadding`) |
66
+ | 바깥 틀 | Web: HJM ScreenLayout의 본문. Native: `ScrollView` > `Container` | 이 구성은 바깥 폭·여백을 정하지 않는다. 스토리는 Card만 그린다. Web 단독 화면이면 [Container](../components/container.md) 같은 읽기 폭 컨테이너는 제품이 고른다. Native는 Card를 `ScrollView`(`keyboardShouldPersistTaps="handled"`) 안 `Container`에 둔다. 입력이 한 칸이라 [KeyboardFormScrollView](../components/keyboard-form-scroll-view.md)(실험, `react-native-keyboard-controller` 설치와 앱 루트 `KeyboardMotionProvider` 필요)는 기본값이 아니며, 여러 필드 폼 안에 이 구성을 넣을 때만 쓴다. 안전 영역은 화면 골격(내비게이션 헤더·탭 바)이 맡는다 | Native ScrollView 위아래 `spacing.lg` 20, Container gutter 폭 600 미만 `compact` 16 · 이상 `regular` 20(`layout.pagePadding`) |
65
67
  | 틀 | `Card` | 바깥 틀 안, 스크롤과 함께 | body padding `spacing.md` 16, 제목–설명 `spacing.xs` 8 |
66
68
  | 입력 | `OtpField` medium | Card 머리 아래 맨 위 | 칸 `control.minTouchTarget` 44, 칸 사이 `spacing.xs` 8 (`large`: 52 / `spacing.sm` 12) |
67
69
  | 재전송 안내 | Text muted | 입력 아래, 재전송 후·재전송 실패 때만 | `Stack gap="md"` 16 |
@@ -199,7 +201,7 @@ const gutter = resolveWindowClass(width) === "compact" ? "compact" : "regular";
199
201
  | 항목 | Web | Native |
200
202
  | --- | --- | --- |
201
203
  | 제출 | `<form onSubmit>` + `type="submit"` 버튼(Enter 제출) | `onComplete`로 6자리 도달 시 자동 제출 + 확인 버튼 |
202
- | 바깥 틀 | 제품 화면 레이아웃(문서 스크롤) | `ScrollView keyboardShouldPersistTaps="handled"` > `Container` |
204
+ | 바깥 틀 | HJM ScreenLayout의 본문 | `ScrollView keyboardShouldPersistTaps="handled"` > `Container` |
203
205
  | 재전송 후 포커스 | 첫 번째·반복 재전송 모두 입력으로 `focus()` | 입력 ref의 `focus()` 호출 |
204
206
  | 성공 후 포커스 | 사라지는 폼에 초점이 있었으면 `Result`(`tabIndex={-1}`)로 이동. 사용자가 옮긴 외부 초점은 유지 | 결과 행동을 각각 탐색할 수 있게 유지하며 iOS 성공 안내·Android polite live region 연결 |
205
207
  | 성공 뒤 데모 초기화 | 새 입력으로 복귀 | 새 입력 ref의 `focus()` 호출 |
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: `src/component-recipes.ts` `emptyStateRecipe`, `packages/react/src/styles.css` `.hjm-empty-state`, `showcase/shared/stea-expressions.ts`, `showcase/{web/src/patterns,native/src}/stea-expression-previews.tsx`(`PixelEmptyState`, Native `Frame`), `src/container.ts`
9
9
  - 스토리북: `배포/구성/피드백과 복구/캐릭터와 시작 행동`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  아직 만든 것이 없는 첫 빈 화면에 제품 캐릭터를 움직여 보이고 첫 행동 하나로 이끌 때 쓴다. 검색 결과 0건이나 오류처럼
@@ -45,7 +47,7 @@ Native 화면(ScrollView, 위아래 spacing.lg 20) > Container gutter 16(폭 < 6
45
47
 
46
48
  | 영역 | 컴포넌트 | 위치 | 크기·간격 |
47
49
  | --- | --- | --- | --- |
48
- | 바깥 틀 | Web: 제품 화면 레이아웃(문서 스크롤). Native: `ScrollView` > `Container` | 이 구성은 바깥 폭·여백을 정하지 않는다(Web 스토리는 Stack만 그린다). Native는 `ScrollView` 안 [Container](../components/container.md)에 둔다. 입력이 없어 키보드 처리는 없다. 안전 영역은 화면 골격(내비게이션 헤더·탭 바)이 맡는다 | Native ScrollView 위아래 `spacing.lg` 20, Container gutter 폭 600 미만 `compact` 16 · 이상 `regular` 20(`layout.pagePadding`) |
50
+ | 바깥 틀 | Web: HJM ScreenLayout의 본문. Native: `ScrollView` > `Container` | 이 구성은 바깥 폭·여백을 정하지 않는다(Web 스토리는 Stack만 그린다). Native는 `ScrollView` 안 [Container](../components/container.md)에 둔다. 입력이 없어 키보드 처리는 없다. 안전 영역은 화면 골격(내비게이션 헤더·탭 바)이 맡는다 | Native ScrollView 위아래 `spacing.lg` 20, Container gutter 폭 600 미만 `compact` 16 · 이상 `regular` 20(`layout.pagePadding`) |
49
51
  | 빈 상태 | EmptyState `density="regular"` | 본문 가운데 | 위아래 Web `spacing.xxl` 32 / Native `spacing.xxxl` 40, 좌우 `spacing.xl` 24, 슬롯 사이 `spacing.xs` 8 |
50
52
  | 캐릭터 | Web `icon` / Native `illustration` | EmptyState 맨 위 | 96×96(12칸 × `spacing.xs` 8). Native도 그림 노드 자체의 96×96 크기를 사용한다 |
51
53
  | 시작 행동 | Button `primary` | EmptyState `action` | 높이 44, 하나만 |
@@ -131,7 +133,7 @@ const gutter = resolveWindowClass(width) === "compact" ? "compact" : "regular";
131
133
  | 세로 여백 | `.hjm-empty-state` `spacing.xxl` 32 | recipe `spacing.xxxl` 40 |
132
134
  | 일시정지 감지 | `document.hidden` | `AppState` |
133
135
  | 상태 문구 자리 | 빈 `role="status"`를 늘 마운트 | 문구가 있을 때만 마운트 |
134
- | 바깥 틀 | 제품 화면 레이아웃(문서 스크롤) | `ScrollView` > `Container` |
136
+ | 바깥 틀 | HJM ScreenLayout의 본문 | `ScrollView` > `Container` |
135
137
 
136
138
  ## 함정
137
139
 
@@ -4,10 +4,12 @@
4
4
  - 상태: 배포
5
5
  - 지원: Web · Native
6
6
  - 적용: 1.12.1
7
- - 검토일: 2026-10-06
7
+ - 검토일: 2026-10-15
8
8
  - 근거: `showcase/web/src/patterns/stea-composition-previews.tsx`(`ScheduleDayList`), `showcase/native/src/stea-composition-previews.tsx`(`ScheduleDayList`, `Frame`), `showcase/shared/stea-compositions.ts`(`scheduleCopy`), `src/card.ts`, `src/component-recipes.ts`(`segmentedControlRecipe`, `listRowRecipe`), `src/container.ts`
9
9
  - 스토리북: `배포/구성/선택과 필터/날짜 선택과 예정 목록`
10
10
 
11
+ 공통 구조·배치·상태·배지의 소유권은 [화면과 구성 선택](../SELECTION.md#소유권)을 따른다. 앱은 데이터·문구·브랜드·추가 기능을 공개 슬롯과 콜백으로 연결한다. 아래 코드 골격을 앱별 기본 구조 복제의 근거로 사용하지 않는다. 전용 구성 API가 없는 콘텐츠 묶음은 [CompositionLayout](../components/composition-layout.md)의 제목·배지·행동·본문·상태·footer 슬롯을 사용한다.
12
+
11
13
  ## 언제 쓰나
12
14
 
13
15
  한 주처럼 짧은 날짜 범위에서 날짜 하나를 고르면 같은 카드 안의 일정 목록이 그 날짜로 바뀌는 요약 카드에 쓴다.
@@ -48,7 +50,7 @@ Native 화면(ScrollView, 위아래 spacing.lg 20) > Container gutter 16(폭 < 6
48
50
 
49
51
  | 영역 | 컴포넌트 | 위치 | 크기·간격 |
50
52
  | --- | --- | --- | --- |
51
- | 바깥 틀 | Web: 제품 화면 레이아웃(문서 스크롤). Native: `ScrollView` > `Container` | 이 구성은 바깥 폭·여백을 정하지 않는다(스토리는 Card만 그린다). Native는 Card를 `ScrollView` 안 [Container](../components/container.md)에 둔다. 입력이 없어 키보드 처리는 없다. 안전 영역은 화면 골격(내비게이션 헤더·탭 바)이 맡는다 | Native ScrollView 위아래 `spacing.lg` 20, Container gutter 폭 600 미만 `compact` 16 · 이상 `regular` 20(`layout.pagePadding`) |
53
+ | 바깥 틀 | Web: HJM ScreenLayout의 본문. Native: `ScrollView` > `Container` | 이 구성은 바깥 폭·여백을 정하지 않는다(스토리는 Card만 그린다). Native는 Card를 `ScrollView` 안 [Container](../components/container.md)에 둔다. 입력이 없어 키보드 처리는 없다. 안전 영역은 화면 골격(내비게이션 헤더·탭 바)이 맡는다 | Native ScrollView 위아래 `spacing.lg` 20, Container gutter 폭 600 미만 `compact` 16 · 이상 `regular` 20(`layout.pagePadding`) |
52
54
  | 틀 | `Card` | 바깥 틀 안, 스크롤과 함께 | body padding `spacing.md` 16, 안쪽 `Stack gap="md"` 16 |
53
55
  | 날짜 | `SegmentedControl` medium | Card 머리 아래 | 최소 높이 `control.minTouchTarget` 44, 트랙 padding·항목 사이 Native `spacing.xxs` 4 / Web CSS 2px |
54
56
  | 목록 | `List` + `ListRow` | 날짜 아래 | 두 줄 행 최소 `layout.rowHeight.twoLine` 68(comfortable), 날짜와 `spacing.md` 16 |
@@ -160,7 +162,7 @@ const gutter = resolveWindowClass(width) === "compact" ? "compact" : "regular";
160
162
  | `Card`·`List` import | `@hjmds/react/display` | `@hjmds/react-native/data-display` |
161
163
  | 큰 글자 | `data-large-text`에서 세로로 쌓음 | 기준 글자 크기 이상에서 세로로 쌓음 |
162
164
  | 트랙 padding·항목 간격 | CSS 2px | `spacing.xxs` 4 |
163
- | 바깥 틀 | 제품 화면 레이아웃(문서 스크롤) | `ScrollView` > `Container` |
165
+ | 바깥 틀 | HJM ScreenLayout의 본문 | `ScrollView` > `Container` |
164
166
  | 실패 Notice 발표 | `danger`는 늘 `role="alert"` | `announcement="assertive"`를 지정해야 발표(기본 `none`) |
165
167
 
166
168
  ## 함정