@hjmds/design-contracts 1.27.1 โ†’ 1.28.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 (155) hide show
  1. package/dist/activity-chip.d.ts +1 -1
  2. package/dist/activity-chip.js +1 -1
  3. package/dist/activity-chip.js.map +1 -1
  4. package/dist/auth-screen.d.ts +71 -5
  5. package/dist/auth-screen.d.ts.map +1 -1
  6. package/dist/auth-screen.js +60 -2
  7. package/dist/auth-screen.js.map +1 -1
  8. package/dist/base-recipes.d.ts +9 -1
  9. package/dist/base-recipes.d.ts.map +1 -1
  10. package/dist/base-recipes.js +7 -1
  11. package/dist/base-recipes.js.map +1 -1
  12. package/dist/behaviors.d.ts +1 -1
  13. package/dist/breadcrumb.d.ts +1 -1
  14. package/dist/breadcrumb.js +1 -1
  15. package/dist/breadcrumb.js.map +1 -1
  16. package/dist/calendar.d.ts +1 -1
  17. package/dist/calendar.js +2 -2
  18. package/dist/calendar.js.map +1 -1
  19. package/dist/catalog.d.ts +148 -89
  20. package/dist/catalog.d.ts.map +1 -1
  21. package/dist/component-contracts.d.ts +1 -1
  22. package/dist/component-contracts.js +1 -1
  23. package/dist/component-contracts.js.map +1 -1
  24. package/dist/component-recipes.d.ts +105 -60
  25. package/dist/component-recipes.d.ts.map +1 -1
  26. package/dist/component-recipes.js +138 -69
  27. package/dist/component-recipes.js.map +1 -1
  28. package/dist/conversation-row.d.ts +2 -2
  29. package/dist/conversation-row.d.ts.map +1 -1
  30. package/dist/conversation-row.js +6 -4
  31. package/dist/conversation-row.js.map +1 -1
  32. package/dist/counter-badge-recipe.d.ts +1 -1
  33. package/dist/counter-badge-recipe.js +1 -1
  34. package/dist/counter-badge-recipe.js.map +1 -1
  35. package/dist/data-table.d.ts +4 -4
  36. package/dist/data-table.js +4 -4
  37. package/dist/data-table.js.map +1 -1
  38. package/dist/date-picker.d.ts +1 -1
  39. package/dist/design-profile.d.ts.map +1 -1
  40. package/dist/design-profile.js +19 -16
  41. package/dist/design-profile.js.map +1 -1
  42. package/dist/file-picker.d.ts +1 -1
  43. package/dist/file-picker.js +1 -1
  44. package/dist/file-picker.js.map +1 -1
  45. package/dist/foundations.d.ts +18 -14
  46. package/dist/foundations.d.ts.map +1 -1
  47. package/dist/foundations.js +18 -13
  48. package/dist/foundations.js.map +1 -1
  49. package/dist/heading.d.ts +13 -13
  50. package/dist/heading.js.map +1 -1
  51. package/dist/icon-button-recipe.d.ts +23 -0
  52. package/dist/icon-button-recipe.d.ts.map +1 -1
  53. package/dist/icon-button-recipe.js +20 -1
  54. package/dist/icon-button-recipe.js.map +1 -1
  55. package/dist/number-field.d.ts +1 -1
  56. package/dist/otp-field.d.ts +1 -1
  57. package/dist/password-field.d.ts +1 -1
  58. package/dist/result.d.ts +1 -1
  59. package/dist/result.js +2 -2
  60. package/dist/result.js.map +1 -1
  61. package/dist/screen-patterns.d.ts +12 -1
  62. package/dist/screen-patterns.d.ts.map +1 -1
  63. package/dist/screen-patterns.js +12 -1
  64. package/dist/screen-patterns.js.map +1 -1
  65. package/dist/semantic-colors.d.ts +10 -0
  66. package/dist/semantic-colors.d.ts.map +1 -1
  67. package/dist/semantic-colors.js +6 -0
  68. package/dist/semantic-colors.js.map +1 -1
  69. package/dist/sheet.d.ts +7 -4
  70. package/dist/sheet.d.ts.map +1 -1
  71. package/dist/sheet.js +8 -5
  72. package/dist/sheet.js.map +1 -1
  73. package/dist/side-panel.d.ts +1 -1
  74. package/dist/side-panel.js +2 -2
  75. package/dist/side-panel.js.map +1 -1
  76. package/dist/steps.d.ts +1 -1
  77. package/dist/steps.js +1 -1
  78. package/dist/steps.js.map +1 -1
  79. package/dist/tag.d.ts +1 -1
  80. package/dist/tag.js +1 -1
  81. package/dist/tag.js.map +1 -1
  82. package/dist/timeline.d.ts +1 -1
  83. package/dist/timeline.js +1 -1
  84. package/dist/timeline.js.map +1 -1
  85. package/dist/top.d.ts +4 -4
  86. package/dist/top.d.ts.map +1 -1
  87. package/dist/top.js +3 -1
  88. package/dist/top.js.map +1 -1
  89. package/dist/version.d.ts +1 -1
  90. package/dist/version.js +1 -1
  91. package/dist/version.js.map +1 -1
  92. package/docs/activity-chip.md +5 -1
  93. package/docs/auth-screen.md +2 -0
  94. package/docs/design-profile.md +14 -10
  95. package/docs/generated/component-maturity.md +1 -1
  96. package/docs/generated/renderer-evidence.json +9 -5
  97. package/docs/generated/renderer-evidence.md +1 -1
  98. package/docs/generated/showcase-manifest.json +1 -1
  99. package/docs/heading.md +14 -9
  100. package/docs/sheet.md +2 -0
  101. package/docs/top.md +4 -3
  102. package/docs/usage/README.md +1 -1
  103. package/docs/usage/components/auth-screen-layout.md +26 -9
  104. package/docs/usage/components/bottom-cta.md +6 -2
  105. package/docs/usage/components/bottom-navigation.md +5 -1
  106. package/docs/usage/components/breadcrumb.md +5 -1
  107. package/docs/usage/components/button.md +2 -0
  108. package/docs/usage/components/chat-message.md +6 -2
  109. package/docs/usage/components/checkbox-group.md +5 -1
  110. package/docs/usage/components/collapsible.md +1 -0
  111. package/docs/usage/components/comment-thread-row.md +1 -1
  112. package/docs/usage/components/effect-surface.md +2 -2
  113. package/docs/usage/components/heading.md +14 -12
  114. package/docs/usage/components/icon-button.md +5 -0
  115. package/docs/usage/components/inline-edit.md +1 -1
  116. package/docs/usage/components/list-detail-screen.md +1 -1
  117. package/docs/usage/components/list-row.md +23 -11
  118. package/docs/usage/components/list.md +10 -5
  119. package/docs/usage/components/notice.md +5 -1
  120. package/docs/usage/components/notification-item.md +5 -1
  121. package/docs/usage/components/photo-source-sheet.md +1 -1
  122. package/docs/usage/components/repeatable-field-group.md +1 -1
  123. package/docs/usage/components/saved-items-screen.md +1 -1
  124. package/docs/usage/components/screen-layout.md +10 -6
  125. package/docs/usage/components/search-screen.md +2 -2
  126. package/docs/usage/components/section.md +5 -1
  127. package/docs/usage/components/segmented-control.md +1 -1
  128. package/docs/usage/components/sheet.md +17 -13
  129. package/docs/usage/components/skeleton.md +41 -15
  130. package/docs/usage/components/statistic.md +5 -1
  131. package/docs/usage/components/switch.md +3 -2
  132. package/docs/usage/components/table-column-settings.md +1 -1
  133. package/docs/usage/components/tag.md +5 -1
  134. package/docs/usage/components/text.md +6 -4
  135. package/docs/usage/components/timeline.md +5 -1
  136. package/docs/usage/components/toast.md +10 -1
  137. package/docs/usage/components/top-bar.md +5 -1
  138. package/docs/usage/components/top.md +1 -1
  139. package/docs/usage/components/upload-item.md +1 -1
  140. package/docs/usage/compositions/adaptive-content.md +5 -1
  141. package/docs/usage/compositions/compound-controls.md +2 -1
  142. package/docs/usage/compositions/design-profile-comparison.md +1 -1
  143. package/docs/usage/compositions/family-drawer.md +5 -3
  144. package/docs/usage/compositions/input-sheet.md +1 -1
  145. package/docs/usage/compositions/interaction-flow-apply.md +3 -3
  146. package/docs/usage/compositions/photo-source.md +3 -3
  147. package/docs/usage/compositions/selection-motion.md +5 -1
  148. package/docs/usage/compositions/toast-layout.md +4 -4
  149. package/docs/usage/compositions/visual-foundations.md +5 -4
  150. package/docs/usage/screens/common-login.md +9 -7
  151. package/docs/usage/screens/common-search.md +1 -1
  152. package/docs/usage/screens/landing.md +15 -14
  153. package/docs/usage/screens/notification-settings.md +4 -2
  154. package/docs/usage/tokens/typography.md +21 -13
  155. package/package.json +1 -1
@@ -13,7 +13,7 @@
13
13
  ํ˜„์žฌ ํ™”๋ฉด ์œ„์— ๋ชจ๋‹ฌ๋กœ ๋„์šฐ๋Š” ๋ณด์กฐ ์ž‘์—… ํŒจ๋„์— ์“ด๋‹ค. ์„ค์ • ํ•œ ํ•ญ๋ชฉ ํŽธ์ง‘, ์„ ํƒ ๋ชฉ๋ก(ํ…Œ๋งˆยท์–ธ์–ด),
14
14
  ์งง์€ ์ž…๋ ฅ ํผ, ๊ณต์œ ยท์‚ฌ์ง„ ์ถœ์ฒ˜ ์„ ํƒ์ฒ˜๋Ÿผ ๋๋‚˜๋ฉด ์›๋ž˜ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„์˜ค๋Š” ์ž‘์—…์ด๋‹ค. ๊ธฐ๋ณธ์€ ํ•˜๋‹จ์—์„œ ์˜ฌ๋ผ์˜จ๋‹ค.
15
15
 
16
- ์ œ๋ชฉ ์ •๋ ฌ, ํ‚ค๋ณด๋“œ ๋†’์ด, top inset, ๋ณธ๋ฌธ maxHeight ๋ณด์ •์€ Sheet๊ฐ€ ์†Œ์œ ํ•œ๋‹ค. ์ œํ’ˆ wrapper์—์„œ Modalยทํ‚ค๋ณด๋“œ listenerยท๊ฐ•์ œ maxHeight๋ฅผ
16
+ ์ œ๋ชฉ์€ ํ™”๋ฉด์— ๊ทธ๋ฆฌ์ง€ ์•Š๊ณ  ๋Œ€ํ™”์ƒ์ž์˜ ์ ‘๊ทผ์„ฑ ์ด๋ฆ„์œผ๋กœ๋งŒ ์“ด๋‹ค(2026-10-17). ํ‚ค๋ณด๋“œ ๋†’์ด, top inset, ๋ณธ๋ฌธ maxHeight ๋ณด์ •์€ Sheet๊ฐ€ ์†Œ์œ ํ•œ๋‹ค. ์ œํ’ˆ wrapper์—์„œ Modalยทํ‚ค๋ณด๋“œ listenerยท๊ฐ•์ œ maxHeight๋ฅผ
17
17
  ๋‹ค์‹œ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
18
18
 
19
19
  ## ์“ฐ์ง€ ์•Š์„ ๋•Œ
@@ -83,11 +83,11 @@ import { Sheet } from "@hjmds/react-native/overlays";
83
83
  | `open` ยท `defaultOpen` | `boolean` | ๋น„์ œ์–ด `false` | Web์€ ์ œ์–ดํ•˜๋ฉด `onOpenChange` ํ•„์ˆ˜, ๋น„์ œ์–ด๋ฉด `trigger` ํ•„์ˆ˜ |
84
84
  | `onOpenChange` | `(open: boolean, detail: { reason }) => void` | โ€” | reason: `trigger` ยท `close-action` ยท `escape` ยท `back` ยท `outside` ยท `swipe` ยท `programmatic`. Android ํ•˜๋“œ์›จ์–ด back์€ Native์—์„œ๋งŒ `back` |
85
85
  | `onDismissComplete` | `(detail: { reason }) => void` | โ€” | ํ‘œ๋ฉด์ด ์‹ค์ œ๋กœ ์‚ฌ๋ผ์ง„ ๋’ค ํ•œ ๋ฒˆ. ๋‹ค์Œ modalยทํ™”๋ฉด ์ด๋™์€ ์—ฌ๊ธฐ์„œ |
86
- | `dismissPolicy` | `{ dismissible?, dismissWhileBusy?, outsideDismiss?, escapeOrBackDismiss?, swipeDismiss? }` | `dismissible` true ยท `dismissWhileBusy` false ยท `outsideDismiss` ํ•˜๋‹จ false / ์˜† true ยท `escapeOrBackDismiss` true ยท `swipeDismiss` true(๋ฏธ๊ฒŒ์‹œ ๋ณ€๊ฒฝ, ์ด์ „ false) | ๋‹ซ๊ธฐ ํ—ˆ์šฉ ๋ฒ”์œ„. `resolveSheetDismissPolicy(placement, override)` |
86
+ | `dismissPolicy` | `{ dismissible?, dismissWhileBusy?, outsideDismiss?, escapeOrBackDismiss?, swipeDismiss? }` | `dismissible` true ยท `dismissWhileBusy` false ยท `outsideDismiss` true(๋ชจ๋“  ์œ„์น˜, ๋ฏธ๊ฒŒ์‹œ ๋ณ€๊ฒฝ, ์ด์ „ ํ•˜๋‹จ false) ยท `escapeOrBackDismiss` true ยท `swipeDismiss` true(๋ฏธ๊ฒŒ์‹œ ๋ณ€๊ฒฝ, ์ด์ „ false) | ๋‹ซ๊ธฐ ํ—ˆ์šฉ ๋ฒ”์œ„. `resolveSheetDismissPolicy(placement, override)` |
87
87
  | `keyboardAvoidance` (Native) | `boolean` | `true`(๋ฏธ๊ฒŒ์‹œ ๋ณ€๊ฒฝ, ์ด์ „ `false`) | ๋ชจ๋‹ฌ์ด ํ‚ค๋ณด๋“œ ๋†’์ด๋งŒํผ ๋น„ํ‚จ๋‹ค. ์•ˆ์ชฝ `ScreenLayout`์€ ์ค‘๋ณต ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค |
88
88
  | `showClose` | `boolean` | ํ•˜๋‹จ `false` ยท ์˜† `true`(๋ฏธ๊ฒŒ์‹œ) | ๋จธ๋ฆฌ์˜ ร— ํ‘œ์‹œ. ํ•˜๋‹จ ์‹œํŠธ๋Š” ๋“œ๋ž˜๊ทธ๋กœ ๋‹ซ๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด๋ผ ๋ˆ๋‹ค |
89
89
  | `busy` | `boolean` | `false` | ์‚ฌ์šฉ์ž ๋‹ซ๊ธฐ๋ฅผ ๋ง‰๋Š”๋‹ค |
90
- | `title` ยท `closeLabel` | ๋ฌธ๊ตฌ | ํ•„์ˆ˜ | Native `title`์ด element๋ฉด `accessibilityTitle`(string) ํ•„์ˆ˜ |
90
+ | `title` ยท `closeLabel` | ๋ฌธ๊ตฌ | ํ•„์ˆ˜ | `title`์€ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. Web์€ `aria-labelledby`๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹œ๊ฐ ์ˆจ๊น€ `h2`, Native๋Š” ๋Œ€ํ™”์ƒ์ž `accessibilityLabel`๊ณผ ๋ฐฐ์น˜ ๋ฐ– 1pt ๋จธ๋ฆฌ๊ธ€์ด๋‹ค(๋ฏธ๊ฒŒ์‹œ). Native `title`์ด element๋ฉด `accessibilityTitle`(string) ํ•„์ˆ˜์ด๋ฉฐ element ์ž์ฒด๋Š” ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š”๋‹ค. `closeLabel`์€ ์†์žก์ดยทร—ยท๊ฐ€๋ฆผ๋ง‰ ๋‹ซ๊ธฐ์˜ ์ด๋ฆ„ |
91
91
  | `description` ยท `footer` | ๋…ธ๋“œ(Native `description`์€ `string`) | โ€” | `footer`๋Š” ์Šคํฌ๋กค ๋ฐ– ๊ณ ์ •. ์ €์žฅ ํ–‰๋™์€ ์—ฌ๊ธฐ |
92
92
  | `detents`(Web) ยท `activeDetent` ยท `onDetentChange` | `readonly ("medium" \| "large" \| "full")[]` ยท `(detent) => void` | โ€” | ์‚ฌ์šฉ์ž๊ฐ€ ๋†’์ด๋ฅผ ๋ฐ”๊ฟ€ ๋‹จ๊ณ„. `detentLabels: { expand, collapse }` ํ•„์ˆ˜ |
93
93
  | `keyboardAvoidance` ยท `scrollable`(Native) | `boolean` | `false` | ์ž…๋ ฅ ํผ์€ ๋‘˜ ๋‹ค ์ผ ๋‹ค |
@@ -112,17 +112,17 @@ import { Sheet } from "@hjmds/react-native/overlays";
112
112
  | --- | --- | --- |
113
113
  | ํฌ๊ธฐ | ํ•˜๋‹จ ์‹œํŠธ ๋†’์ด: `auto` ๋‚ด์šฉ ๋†’์ด(์ตœ๋Œ€ ํ™”๋ฉด ๋†’์ด ร— `maxHeightRatio` 0.9), `medium` 60%, `large` 85%, `full` ์œ„ safe area ์•ˆ ์ „์ฒด ๋†’์ด(0.9 ์ƒํ•œ ์—†์Œ). Web ํ•˜๋‹จ ์‹œํŠธ ์ตœ๋Œ€ ํญ 640. ์œ„ ๋‘ ๋ชจ์„œ๋ฆฌ๋งŒ `radius.xl` 24. ์˜† ์‹œํŠธ(`start`ยท`end`): Web ํญ `min(28rem, 100%)`ยท๋†’์ด ํ™”๋ฉด โˆ’ 32, Native ํญ 88%(์ตœ๋Œ€ 420)ยทํ™”๋ฉด ๋†’์ด | `sheetRecipe.sizes`ยท`content`ยท`web`, `.hjm-sheet`, Native `Sheet` |
114
114
  | ๊ฐ„๊ฒฉ | ๋‘ ํ”Œ๋žซํผ ๊ฐ™์€ ๊ฐ’: ์ขŒ์šฐ `content.paddingHorizontal`(`spacing.lg` 20), ์œ„ยท์•„๋ž˜ `content.paddingTop/Bottom`(`spacing.sm` 12, ํ•˜๋‹จ ์‹œํŠธ๋Š” ์•„๋ž˜ safe area๋ฅผ ๋”ํ•จ), ๋จธ๋ฆฌยท๋ณธ๋ฌธยทfooter ์‚ฌ์ด `body.gap`(`spacing.md` 16), footer ์œ„ `footer.paddingTop`(`spacing.sm` 12), ์ œ๋ชฉโ€“๋‹ซ๊ธฐ `header.gap`(`spacing.sm` 12), footer ๋ฒ„ํŠผ ์‚ฌ์ด `footer.gap`(`spacing.sm` 12) | `.hjm-sheet__*`, `sheetRecipe.content`ยท`body`ยท`footer` |
115
- | ์ˆœ์„œยท์ •๋ ฌ | ๋จธ๋ฆฌ(์ œ๋ชฉยท์„ค๋ช… + ๋‹ซ๊ธฐ) โ†’ ๋ณธ๋ฌธ โ†’ `footer`. ๋จธ๋ฆฌ ์ตœ์†Œ ๋†’์ด 44(`control.minTouchTarget`), ๋‹ซ๊ธฐ๋Š” ๋ ์ชฝ์—์„œ ์ œ๋ชฉ ์„ธ๋กœ ์ค‘์•™. Web footer๋Š” ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ ๊ฐ€๋กœ ์ค„ [๋ณด์กฐ][์ฃผ]. Native footer๋Š” ์„ธ๋กœ ์—ด์ด๋ผ ๊ฝ‰ ์ฐฌ ํญ ๋ฒ„ํŠผ์„ ์ฃผ ํ–‰๋™ ๋จผ์ € ๋‘”๋‹ค. ํ•˜๋‹จ ์‹œํŠธ๋Š” ํ•ญ์ƒ ์œ„ ๊ฐ€์šด๋ฐ 36ร—4 ์†์žก์ด(ํ„ฐ์น˜ ์ตœ์†Œ ํญ 44)๋ฅผ ๋‘”๋‹ค. `detents`๊ฐ€ ์žˆ์œผ๋ฉด ๋†’์ด ์ „ํ™˜ ๋ฒ„ํŠผ, ์—†์œผ๋ฉด `closeLabel` ์ด๋ฆ„์˜ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์ด๋‹ค. ์†์žก์ดยท๋จธ๋ฆฌ ์˜์—ญ์„ ์•„๋ž˜๋กœ ๋Œ์–ด `sheetDragRecipe.dismissDistanceRatio`(์‹œํŠธ ๋†’์ด์˜ 25%) ๋˜๋Š” `dismissVelocity` 0.5px/ms๋ฅผ ๋„˜๊ธฐ๋ฉด `swipe`๋กœ ๋‹ซ๊ณ , ์•„๋‹ˆ๋ฉด ์ œ์ž๋ฆฌ๋กœ ๋Œ์•„๊ฐ„๋‹ค(๋ฏธ๊ฒŒ์‹œ, WebยทNative ๋™์ผ) | `sheetRecipe.header`ยท`handle`, `.hjm-sheet__footer`, `.hjm-sheet__handle` |
116
- | ๊ณ ์ •ยท์Šคํฌ๋กค | ๋ณธ๋ฌธ๋งŒ ์Šคํฌ๋กค, ๋จธ๋ฆฌยท`footer` ๊ณ ์ •(Native๋Š” `scrollable`์ผ ๋•Œ ScrollView). ๊ณ ์ • ๋†’์ด(`medium`ยท`large`ยท`full`, ์˜† ์‹œํŠธ)์—์„œ๋Š” ๋ณธ๋ฌธ์ด ๋จธ๋ฆฌยทfooter๋ฅผ ๋บ€ ๋‚จ์€ ๋†’์ด๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  `footer`๋Š” ์‹œํŠธ ์•„๋ž˜์— ๋ถ™๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๋ณธ๋ฌธ์˜ `flex: 1` ์ž์‹(SearchScreen, ๋ชฉ๋ก ํ™”๋ฉด)์ด ๊ทธ ๋†’์ด๋ฅผ ์ฑ„์šด๋‹ค(Web `.hjm-sheet__body` `flex: 1 1 auto`, Native ๋ณธ๋ฌธ `flexGrow: 1`ยท`minHeight: 0`, 1.13.1 ๋ณ€๊ฒฝ). `auto`๋Š” ๋‚ด์šฉ ๋†’์ด ๊ทธ๋Œ€๋กœ๋‹ค. ์ €์žฅยทํ™•์ธ์€ `footer`์—. ์•„๋ž˜ ์•ˆ์ „ ์˜์—ญ์€ ์‹œํŠธ๊ฐ€ ์ž๊ธฐ ์—ฌ๋ฐฑ์— ๋”ํ•œ๋‹ค(`spacing.sm` 12 + ์•„๋ž˜ inset, Web์€ `env(safe-area-inset-bottom)`). ์œ„ inset์€ ์‹œํŠธ๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ๋†’์ด๋ฅผ ์ค„์ธ๋‹ค. ์ œํ’ˆ์ด inset์„ ๋‹ค์‹œ ๋”ํ•˜์ง€ ์•Š๋Š”๋‹ค | `.hjm-sheet__body`, `sheetRecipe.safeArea`, Native `Sheet` |
115
+ | ์ˆœ์„œยท์ •๋ ฌ | ์†์žก์ด(ํ•˜๋‹จ) โ†’ ๋จธ๋ฆฌ(์„ค๋ช… + ๋‹ซ๊ธฐ, ๋‘˜ ๋‹ค ์—†์œผ๋ฉด ๊ทธ๋ฆฌ์ง€ ์•Š์Œ) โ†’ ๋ณธ๋ฌธ โ†’ `footer`. ๋ณด์ด๋Š” ์ œ๋ชฉ ์ค„์€ ์—†๋‹ค(๋ฏธ๊ฒŒ์‹œ). ๋จธ๋ฆฌ ์ตœ์†Œ ๋†’์ด 44(`control.minTouchTarget`), ร—๋Š” ์„ค๋ช…์ด ์—†์–ด๋„ ๋ ์ชฝ ๊ฐ™์€ ์ž๋ฆฌ๋‹ค. ๊ธฐ๋ณธ ํ•˜๋‹จ ์‹œํŠธ๋Š” ๋จธ๋ฆฌ๊ฐ€ ์—†์–ด ๋ณธ๋ฌธ์ด ์†์žก์ด ์˜์—ญ ๋ฐ”๋กœ ์•„๋ž˜ `body.gap` 16์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. Web footer๋Š” ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ ๊ฐ€๋กœ ์ค„ [๋ณด์กฐ][์ฃผ]. Native footer๋Š” ์„ธ๋กœ ์—ด์ด๋ผ ๊ฝ‰ ์ฐฌ ํญ ๋ฒ„ํŠผ์„ ์ฃผ ํ–‰๋™ ๋จผ์ € ๋‘”๋‹ค. ํ•˜๋‹จ ์‹œํŠธ๋Š” ํ•ญ์ƒ ์œ„ ๊ฐ€์šด๋ฐ 36ร—4 ์†์žก์ด(ํ„ฐ์น˜ ์ตœ์†Œ ํญ 44)๋ฅผ ๋‘”๋‹ค. `detents`๊ฐ€ ์žˆ์œผ๋ฉด ๋†’์ด ์ „ํ™˜ ๋ฒ„ํŠผ, ์—†์œผ๋ฉด `closeLabel` ์ด๋ฆ„์˜ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์ด๋‹ค. ์†์žก์ดยท๋จธ๋ฆฌ ์˜์—ญ์„ ์•„๋ž˜๋กœ ๋Œ์–ด `sheetDragRecipe.dismissDistanceRatio`(์‹œํŠธ ๋†’์ด์˜ 25%) ๋˜๋Š” `dismissVelocity` 0.5px/ms๋ฅผ ๋„˜๊ธฐ๋ฉด `swipe`๋กœ ๋‹ซ๊ณ , ์•„๋‹ˆ๋ฉด ์ œ์ž๋ฆฌ๋กœ ๋Œ์•„๊ฐ„๋‹ค(๋ฏธ๊ฒŒ์‹œ, WebยทNative ๋™์ผ) | `sheetRecipe.header`ยท`handle`, `.hjm-sheet__footer`, `.hjm-sheet__handle` |
116
+ | ๊ณ ์ •ยท์Šคํฌ๋กค | ๋ณธ๋ฌธ๋งŒ ์Šคํฌ๋กค, ๋จธ๋ฆฌยท`footer` ๊ณ ์ •(Native๋Š” `scrollable`์ผ ๋•Œ ScrollView). ์Šคํฌ๋กค ์˜์—ญ์€ ์‹œํŠธ ์ขŒ์šฐ ์—ฌ๋ฐฑ(`sheetRecipe.content.paddingHorizontal` 20) ๋๊นŒ์ง€ ๋„“๊ณ  ์—ฌ๋ฐฑ์€ ์Šคํฌ๋กค ๋‚ด์šฉ ์•ˆ์ชฝ์— ๋‘”๋‹ค(Web `.hjm-sheet__body` padding, Native ScrollView `marginHorizontal: -20` + ๋‚ด์šฉ `paddingHorizontal: 20`). ๊ทธ๋ž˜์„œ ๋ณธ๋ฌธ ListRow์˜ 8 ํ‘œ๋ฉด์ด ์ž˜๋ฆฌ์ง€ ์•Š๊ณ  ๋‚ด์šฉ ์œ„์น˜๋Š” ๊ทธ๋Œ€๋กœ๋‹ค. ๊ณ ์ • ๋†’์ด(`medium`ยท`large`ยท`full`, ์˜† ์‹œํŠธ)์—์„œ๋Š” ๋ณธ๋ฌธ์ด ๋จธ๋ฆฌยทfooter๋ฅผ ๋บ€ ๋‚จ์€ ๋†’์ด๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  `footer`๋Š” ์‹œํŠธ ์•„๋ž˜์— ๋ถ™๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๋ณธ๋ฌธ์˜ `flex: 1` ์ž์‹(SearchScreen, ๋ชฉ๋ก ํ™”๋ฉด)์ด ๊ทธ ๋†’์ด๋ฅผ ์ฑ„์šด๋‹ค(Web `.hjm-sheet__body` `flex: 1 1 auto`, Native ๋ณธ๋ฌธ `flexGrow: 1`ยท`minHeight: 0`, 1.13.1 ๋ณ€๊ฒฝ). `auto`๋Š” ๋‚ด์šฉ ๋†’์ด ๊ทธ๋Œ€๋กœ๋‹ค. ์ €์žฅยทํ™•์ธ์€ `footer`์—. ์•„๋ž˜ ์•ˆ์ „ ์˜์—ญ์€ ์‹œํŠธ๊ฐ€ ์ž๊ธฐ ์—ฌ๋ฐฑ์— ๋”ํ•œ๋‹ค(`spacing.sm` 12 + ์•„๋ž˜ inset, Web์€ `env(safe-area-inset-bottom)`). ์œ„ inset์€ ์‹œํŠธ๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ๋†’์ด๋ฅผ ์ค„์ธ๋‹ค. ์ œํ’ˆ์ด inset์„ ๋‹ค์‹œ ๋”ํ•˜์ง€ ์•Š๋Š”๋‹ค | `.hjm-sheet__body`, `sheetRecipe.safeArea`, Native `Sheet` |
117
117
  | ์ข์€ ํญยทํฐ ๊ธ€์ž | ํญ < 640์ด๋ฉด ํ•˜๋‹จ ์‹œํŠธ๊ฐ€ ํ™”๋ฉด ํญ์„ ์ฑ„์šด๋‹ค. Web footer๋Š” ์ค„์„ ๋ฐ”๊พผ๋‹ค. ํฐ ๊ธ€์ž๋กœ ๋‚ด์šฉ์ด ๊ธธ์–ด์ง€๋ฉด `auto`๋Š” ์ตœ๋Œ€ 90%์—์„œ ๋ฉˆ์ถ”๊ณ  ๋ณธ๋ฌธ์ด ์Šคํฌ๋กค๋œ๋‹ค(`full`์€ ์œ„ safe area๊นŒ์ง€) | `.hjm-sheet[data-placement="bottom"]`, `maxHeightRatio` |
118
118
 
119
119
  ```text
120
120
  ํญ < 640(๋ชจ๋ฐ”์ผ) Web ๋„“์€ ํญ: ๊ฐ€์šด๋ฐ, ์ตœ๋Œ€ 640
121
121
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
122
- โ”‚ (๋’ค ํ™”๋ฉด + scrim, ๋ˆ„๋ฅด๋ฉด ๋‹ซํž˜)โ”‚ โ”‚ (scrim) โ”‚
122
+ โ”‚ (๋’ค ํ™”๋ฉด + scrim, ๋ˆ„๋ฅด๋ฉด ๋‹ซํž˜) โ”‚ โ”‚ (scrim, ๋ˆ„๋ฅด๋ฉด ๋‹ซํž˜) โ”‚
123
123
  โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
124
- โ”‚ โ”‚ โ–ฌโ–ฌ (Web detents์ผ ๋•Œ) โ”‚ โ”‚ โ”‚ โ”‚ ์ œ๋ชฉ [ร—] โ”‚ โ”‚
125
- โ”‚ โ”‚ ์ œ๋ชฉยท์„ค๋ช… [ร—] โ”‚ โ”‚ โ† ๊ณ ์ • โ”‚ โ”‚ ๋ณธ๋ฌธ(์Šคํฌ๋กค) โ”‚ โ”‚
124
+ โ”‚ โ”‚ โ–ฌโ–ฌ ์†์žก์ด โ”‚ โ”‚ โ”‚ โ”‚ โ–ฌโ–ฌ ์†์žก์ด โ”‚ โ”‚
125
+ โ”‚ โ”‚ (์„ค๋ช…) (showClose์ผ ๋•Œ ร—)โ”‚ โ”‚ โ† ๊ณ ์ • โ”‚ โ”‚ ๋ณธ๋ฌธ(์Šคํฌ๋กค) โ”‚ โ”‚
126
126
  โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ โ”‚ โ”‚ โ”‚ [์ทจ์†Œ] [์ €์žฅ] โ”‚ โ”‚
127
127
  โ”‚ โ”‚ ๋ณธ๋ฌธ โ†• ์Šคํฌ๋กค โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
128
128
  โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ โ”‚
@@ -135,20 +135,21 @@ import { Sheet } from "@hjmds/react-native/overlays";
135
135
 
136
136
  ## ๊ผญ ์ง€ํ‚ฌ ๊ฒƒ
137
137
 
138
- - ํ•˜๋‹จ ์‹œํŠธ๋Š” ๋“œ๋ž˜๊ทธ๋กœ ๋‚ด๋ ค ๋‹ซ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค(ํ•„์ˆ˜). ๋ฐฐ๊ฒฝ ํƒญ ๋‹ซ๊ธฐ์™€ ร—๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๋ˆ๋‹ค. ๋“œ๋ž˜๊ทธ๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์†์žก์ด ๋‹ซ๊ธฐ ๋ฒ„ํŠผ, EscapeยทAndroid back, VoiceOver ๋‹ซ๊ธฐ ์ œ์Šค์ฒ˜๋Š” ์œ ์ง€ํ•œ๋‹ค. `swipeDismiss: false`๋Š” ๊ฒฐ์ œ ํ™•์ธ์ฒ˜๋Ÿผ ์‹ค์ˆ˜๋กœ ๋‹ซํžˆ๋ฉด ์•ˆ ๋˜๋Š” ํ๋ฆ„์—๋งŒ ์“ฐ๊ณ  ์ด์œ ๋ฅผ ์ œํ’ˆ ์ฝ”๋“œ์— ๋‚จ๊ธด๋‹ค.
138
+ - ํ•˜๋‹จ ์‹œํŠธ๋Š” ๋“œ๋ž˜๊ทธ๋กœ ๋‚ด๋ ค ๋‹ซ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค(ํ•„์ˆ˜). ์‹œํŠธ ๋ฐ–(๊ฐ€๋ฆผ๋ง‰)์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ํด๋ฆญํ•ด๋„ ๋‹ซํžŒ๋‹ค(๋ชจ๋“  ์œ„์น˜, ๋ฏธ๊ฒŒ์‹œ). ร—๋Š” ํ•˜๋‹จ ์‹œํŠธ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ๋ˆ๋‹ค. ๋“œ๋ž˜๊ทธ๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์†์žก์ด ๋‹ซ๊ธฐ ๋ฒ„ํŠผ, ๊ฐ€๋ฆผ๋ง‰ ๋‹ซ๊ธฐ(Native๋Š” `closeLabel` ์ด๋ฆ„์˜ ๋ฒ„ํŠผ), EscapeยทAndroid back, VoiceOver ๋‹ซ๊ธฐ ์ œ์Šค์ฒ˜๋Š” ์œ ์ง€ํ•œ๋‹ค. Web์€ ๋ˆ„๋ฆ„์ด ๊ฐ€๋ฆผ๋ง‰์—์„œ ์‹œ์ž‘ํ•  ๋•Œ๋งŒ ๋‹ซ์•„ ์‹œํŠธ ์•ˆ์—์„œ ์‹œ์ž‘ํ•œ ๋“œ๋ž˜๊ทธ ์„ ํƒ์€ ๋‹ซ์ง€ ์•Š๋Š”๋‹ค. `outsideDismiss: false`ยท`swipeDismiss: false`๋Š” ๊ฒฐ์ œ ํ™•์ธ์ฒ˜๋Ÿผ ์‹ค์ˆ˜๋กœ ๋‹ซํžˆ๋ฉด ์•ˆ ๋˜๋Š” ํ๋ฆ„์—๋งŒ ์“ฐ๊ณ  ์ด์œ ๋ฅผ ์ œํ’ˆ ์ฝ”๋“œ์— ๋‚จ๊ธด๋‹ค.
139
+ - ์ €์žฅํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ์„ ๋ฒ„๋ฆด์ง€ ๋ฌป๋Š” ํ๋ฆ„์€ ์ œ์–ดํ˜• `onOpenChange`์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ฐ€๋ฆผ๋ง‰(`outside`)ยท๋“œ๋ž˜๊ทธ(`swipe`)ยทEscapeยทbackยท์†์žก์ด ๋ชจ๋‘ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋ฏ€๋กœ ํ™•์ธ์„ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š๋Š”๋‹ค. ์ €์žฅ ์ค‘ `busy`๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ๋‹ซ๊ธฐ๋ฅผ ๋ง‰๋Š”๋‹ค.
139
140
 
140
141
  - ์ž…๋ ฅ ํผ Native Sheet๋Š” `keyboardAvoidance`์™€ `scrollable`์„ ํ•จ๊ป˜ ์ผœ๊ณ , ์ œํ’ˆ์˜ ํ‚ค๋ณด๋“œ listenerยทmaxHeightยท
141
142
  ์ค‘์ฒฉ ScrollView๋ฅผ ์ง€์šด๋‹ค. ๋ณธ๋ฌธ์ด FlatList ๋“ฑ ๊ฐ€์ƒํ™” ๋ชฉ๋ก์ด๋ฉด `scrollable={false}`๋กœ ๋‘”๋‹ค.
142
143
  - ์ €์žฅ ๋ฒ„ํŠผ์€ `footer`์— ๋‘”๋‹ค. ์ €์žฅ ์ค‘์—๋Š” `busy`๋กœ ๋‹ซ๊ธฐ๋ฅผ ๋ง‰๋Š”๋‹ค.
143
144
  - ๋‹ซํžŒ ๋’ค ๋‹ค๋ฅธ modal์„ ์—ด๊ฑฐ๋‚˜ ํ™”๋ฉด ์ด๋™์€ `onDismissComplete`์—์„œ ํ•œ๋‹ค. ๋‘ modal์„ ๋™์‹œ์— ๋„์šฐ์ง€ ์•Š๋Š”๋‹ค.
144
- - ๋ฌธ๊ตฌ(`title`, `closeLabel`, ๋ณธ๋ฌธ)๋Š” i18n ํ‚ค๋กœ ๋„ฃ๋Š”๋‹ค. ์ œ๋ชฉ ์ •๋ ฌ์„ ์œ„ํ•ด `as unknown as string` ์บ์ŠคํŠธ๋‚˜
145
+ - ๋ฌธ๊ตฌ(`title`, `closeLabel`, ๋ณธ๋ฌธ)๋Š” i18n ํ‚ค๋กœ ๋„ฃ๋Š”๋‹ค. ๋ณด์ด์ง€ ์•Š๋Š” `title`๋„ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๊ฐ€ ์ฝ์œผ๋ฏ€๋กœ ๋ฒˆ์—ญํ•œ๋‹ค. `as unknown as string` ์บ์ŠคํŠธ๋‚˜
145
146
  `.hjm-sheet__header` CSS ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
146
147
  - Native `contentStyle`์€ ๋ฐฐ์น˜ key๋งŒ ์“ด๋‹ค. ๋†’์ด๋Š” `size`๋กœ ์ •ํ•œ๋‹ค(`contentStyle={{ height }}` ๊ธˆ์ง€, ๋ฐฐ์น˜ ๋ฐ– key๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Œ).
147
148
  - Web Sheet๋Š” `layoutStyle`์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค(Web `layoutStyle` ์ œ์™ธ 15๊ฐœ ์ค‘ ํ•˜๋‚˜). ํ‘œ๋ฉด ์œ„์น˜ยทํฌ๊ธฐ๋Š” `placement`ยท`size`๊ฐ€ ์ •ํ•œ๋‹ค.
148
149
 
149
150
  ## ํ”Œ๋žซํผ ์ฐจ์ด
150
151
 
151
- Flutter ์ œํ’ˆ์€ `showModalBottomSheet` ๋Œ€์‹  `showHjmBottomSheet`(`hjm_flutter`)๋กœ ์—ฐ๋‹ค. ๊ฐ™์€ ๊ธฐ๋ณธ๊ฐ’(๋“œ๋ž˜๊ทธ ๋‹ซ๊ธฐยท์†์žก์ด ํ‘œ์‹œยท๋ฐฐ๊ฒฝ ํƒญ ๋‹ซ๊ธฐ ๋”ยทร— ์—†์Œ)์„ ์ ์šฉํ•˜๊ณ  ๋ณธ๋ฌธ์€ `HjmSheetLayout`์„ ์“ด๋‹ค(๋ฏธ๊ฒŒ์‹œ).
152
+ Flutter ์ œํ’ˆ์€ `showModalBottomSheet` ๋Œ€์‹  `showHjmBottomSheet`(`hjm_flutter`)๋กœ ์—ฐ๋‹ค. ๊ฐ™์€ ๊ธฐ๋ณธ๊ฐ’(๋“œ๋ž˜๊ทธ ๋‹ซ๊ธฐยท์†์žก์ด ํ‘œ์‹œยท๋ฐฐ๊ฒฝ ํƒญ ๋‹ซ๊ธฐ ๋”ยทร— ์—†์Œ)์„ ์ ์šฉํ•˜๊ณ  ๋ณธ๋ฌธ์€ `HjmSheetLayout`์„ ์“ด๋‹ค(๋ฏธ๊ฒŒ์‹œ). 2026-10-17์˜ ์ œ๋ชฉ ์ˆจ๊น€ยท๊ฐ€๋ฆผ๋ง‰ ๋‹ซ๊ธฐ ๊ฒฐ์ •์€ ์•„์ง Flutter์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š์•˜๋‹ค.
152
153
 
153
154
  | ํ•ญ๋ชฉ | Web | Native |
154
155
  | --- | --- | --- |
@@ -158,12 +159,12 @@ Flutter ์ œํ’ˆ์€ `showModalBottomSheet` ๋Œ€์‹  `showHjmBottomSheet`(`hjm_flutte
158
159
  | ๊ณ ์ • ๋†’์ด ๋ณธ๋ฌธ ์ฑ„์šฐ๊ธฐ | ํ•ญ์ƒ `flex: 1 1 auto` | `size`๊ฐ€ `auto`๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์˜† ์‹œํŠธ์ผ ๋•Œ `flexGrow: 1`(1.13.1๋ถ€ํ„ฐ). `scrollable`์ด๋ฉด ScrollView ์ž์ฒด๋งŒ ๋Š˜๊ณ  ๊ทธ ์•ˆ ๋‚ด์šฉ์€ ๋‚ด์šฉ ๋†’์ด๋‹ค |
159
160
  | ์ดˆ์  | `initialFocusRef`, `returnFocusRef`, focus trap | `returnFocusRef` |
160
161
  | ๊ฒน์นจ ์ˆœ์„œ | `modalPriority`, `portalContainer` | RN `Modal` props(`testID` ๋“ฑ) |
161
- | `title` ํƒ€์ž… | `ReactNode` | `string` ๋˜๋Š” element + `accessibilityTitle` |
162
+ | `title` ํƒ€์ž…(๋ณด์ด์ง€ ์•Š์Œ) | `ReactNode`(์‹œ๊ฐ ์ˆจ๊น€ `h2` ์•ˆ) | `string` ๋˜๋Š” element + `accessibilityTitle`(element๋Š” ๊ทธ๋ฆฌ์ง€ ์•Š์Œ) |
162
163
 
163
164
  ### GestureSheet(Native optional)
164
165
 
165
166
  - controlled `open`/`onOpenChange(open)`๋งŒ ์žˆ๋‹ค. `title`ยท`closeLabel`ยท`children` ํ•„์ˆ˜, `snapPoints` ๊ธฐ๋ณธ `["50%", "90%"]`,
166
- `initialIndex` ๊ธฐ๋ณธ `0`, `busy`๋ฉด ๋Œ์–ด ๋‹ซ๊ธฐยทbackdrop ๋‹ซ๊ธฐ๋ฅผ ๋ง‰๋Š”๋‹ค. ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์ด ๋ณธ๋ฌธ ๋์— ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
167
+ `initialIndex` ๊ธฐ๋ณธ `0`, backdrop์„ ๋ˆ„๋ฅด๋ฉด ๋‹ซํžˆ๊ณ  `busy`๋ฉด ๋Œ์–ด ๋‹ซ๊ธฐยทbackdrop ๋‹ซ๊ธฐ๋ฅผ ๋ง‰๋Š”๋‹ค. `title`์€ ๋ณด์ด์ง€ ์•Š๋Š” ๋จธ๋ฆฌ๊ธ€ยท์ ‘๊ทผ์„ฑ ์ด๋ฆ„์ด๋‹ค(๋ฏธ๊ฒŒ์‹œ). ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์ด ๋ณธ๋ฌธ ๋์— ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
167
168
  - ํ™”๋ฉด์„ `GestureHandlerRootView` ์•ˆ์˜ `GestureSheetProvider`๋กœ ๊ฐ์‹ผ๋‹ค. ์ž…๋ ฅ์€ `GestureSheetInput`์„ ์“ด๋‹ค.
168
169
  - RN `Modal` ์•ˆ์— GestureSheet๋ฅผ ๋‘๋ฉด Android back์ด `onRequestClose`๋กœ๋งŒ ๊ฐ„๋‹ค. ๊ทธ host๋Š”
169
170
  `dismissTopGestureSheet()`๋ฅผ ๋จผ์ € ๋ถ€๋ฅด๊ณ  `false`์ผ ๋•Œ๋งŒ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ซ๋Š”๋‹ค.
@@ -180,6 +181,9 @@ Flutter ์ œํ’ˆ์€ `showModalBottomSheet` ๋Œ€์‹  `showHjmBottomSheet`(`hjm_flutte
180
181
 
181
182
  ## ๊ทผ๊ฑฐ
182
183
 
184
+ - ์‹œํŠธ์— ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์Œ: 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ • โ€” ์‹œํŠธ ์œ„์ชฝ ์ œ๋ชฉ ์ค„(์˜ˆ: SearchScreen ํ•„ํ„ฐ ์‹œํŠธ์˜ "ํ•„ํ„ฐ")์„ ๋ชจ๋“  ์‹œํŠธ์—์„œ ์—†์•ค๋‹ค. `title`์€ ๋Œ€ํ™”์ƒ์ž ์ ‘๊ทผ์„ฑ ์ด๋ฆ„์œผ๋กœ ๋‚จ๋Š”๋‹ค. Native SelectยทCombobox ์„ ํƒ ์‹œํŠธ์™€ GestureSheet๋„ ๊ฐ™๋‹ค. ๊ฐ™์€ ์ž‘์—…์—์„œ ๋จธ๋ฆฌ๊ฐ€ ์†์žก์ด ์˜์—ญ(`.hjm-sheet__drag`, 2026-10-16) ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€ `.hjm-sheet > .hjm-sheet__header` ์„ ํƒ์ž๊ฐ€ ๋งž์ง€ ์•Š์•„ Dialog ์œ„ ์—ฌ๋ฐฑ 20์ด ์„ž์ด๋˜ Web ๊ฒฐํ•จ์„ ๊ณ ์ณค๋‹ค.
185
+ - ๊ฐ€๋ฆผ๋ง‰ ๋ˆ„๋ฅด๋ฉด ๋‹ซํž˜: 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ • โ€” ํ•˜๋‹จ ์‹œํŠธ๋„ ์‹œํŠธ ๋ฐ–์„ ๋ˆ„๋ฅด๋ฉด ๋‹ซํžŒ๋‹ค(2026-10-16์˜ ๋“œ๋ž˜๊ทธ ์ „์šฉ ๊ธฐ๋ณธ์„ ๋Œ€์ฒด). ๋‹ซ๊ธฐ ๊ฒฝ๋กœ๋Š” ์†์žก์ดยท๋“œ๋ž˜๊ทธ์™€ ๊ฐ™์€ `requestClose`๋ผ `busy`ยท`dismissPolicy`ยท์ œ์–ดํ˜• owner์˜ ํ™•์ธ์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅธ๋‹ค.
186
+ - ์Šคํฌ๋กค ์˜์—ญ์„ ์‹œํŠธ ์—ฌ๋ฐฑ ๋๊นŒ์ง€: 2026-10-17 1.27.2 ์ฑ„ํƒ ์ ๊ฒ€. utilverse ํ…Œ๋งˆยท์–ธ์–ด ์‹œํŠธ(Native `scrollable`)์—์„œ ์—ฌ๋ฐฑ 20์ด ScrollView ๋ฐ”๊นฅ์— ์žˆ์–ด ListRow ์„ ํƒ ํ‘œ๋ฉด์˜ ์–‘์˜†์ด ์ž˜๋ ธ๋‹ค(3x ์ธก์ •: ์„ ํƒ ํ…Œ๋‘๋ฆฌ ์˜† ์„  ์—†์Œ, ์œ„ ์„  21โ€“381pt). Web์€ ๋ณธ๋ฌธ ์Šคํฌ๋กค ์ƒ์ž๊ฐ€ ์ด๋ฏธ ์—ฌ๋ฐฑ์„ ์•ˆ์ชฝ์— ๋‘์–ด ์ž˜๋ฆผ 0(402ยท1280, LTRยทRTL)์ด์—ˆ๊ณ  Native๋ฅผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋งž์ท„๋‹ค(์ˆ˜์ • ํ›„ ์˜† ์„  13ptยท๋ 13pt).
183
187
  - Sheet๊ฐ€ ์ œ๋ชฉ ์ •๋ ฌยทํ‚ค๋ณด๋“œยทtop insetยทmaxHeight ๋ณด์ • ์†Œ์œ : 2026-09-23 ์†Œ๋น„ ๊ฐ์‚ฌ์—์„œ ์ œํ’ˆ๋งˆ๋‹ค Sheet๋ฅผ ์ง์ ‘ ์กฐ๋ฆฝํ•˜๋ฉฐ ์ด ๊ฐ’์„ ๋”ฐ๋กœ ๋ณด์ •ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
184
188
  - Native `keyboardAvoidance` ๊ธฐ๋ณธ true: 2026-10-16 ํ‚ค๋ณด๋“œ ์ „์ˆ˜ ์กฐ์‚ฌ โ€” ์ž…๋ ฅ ์‹œํŠธ๊ฐ€ ์˜ต์…˜์„ ๋น ๋œจ๋ ค ํ‚ค๋ณด๋“œ์— ๊ฐ€๋ ค์กŒ๋‹ค.
185
189
  - ๋””์ž์ธ ํ”„๋กœํ•„ ์ƒ์†(radiusยทfloating shadow): 2026-10-07 ํ…Œ๋งˆ ์†Œ๋น„ ๊ฒฝ๋กœ ์ ๊ฒ€์—์„œ ๊ณ ์ • foundation/recipe ๊ฐ’์ด ๋‚จ์€ ๊ณณ์„ ๋ณด์™„ํ–ˆ๋‹ค.
@@ -4,8 +4,8 @@
4
4
  - ์ƒํƒœ: ๋ฐฐํฌ
5
5
  - ์ง€์›: Web ยท Native
6
6
  - ์ ์šฉ: 1.12.1
7
- - ๊ฒ€ํ† ์ผ: 2026-10-06
8
- - ๊ทผ๊ฑฐ: `src/component-recipes.ts`(`skeletonRecipe`), `src/foundations.ts`(`glyph`)
7
+ - ๊ฒ€ํ† ์ผ: 2026-10-17
8
+ - ๊ทผ๊ฑฐ: `src/component-recipes.ts`(`skeletonRecipe`), `src/semantic-colors.ts`(`surface.placeholder`), `src/foundations.ts`(`glyph`ยท`control`)
9
9
  - ์Šคํ† ๋ฆฌ๋ถ: `๋ฐฐํฌ/์ปดํฌ๋„ŒํŠธ/์ƒํƒœ์™€ ์•Œ๋ฆผ/์Šค์ผˆ๋ ˆํ†ค`
10
10
 
11
11
  ## ์–ธ์ œ ์“ฐ๋‚˜
@@ -37,27 +37,38 @@
37
37
  // Web
38
38
  import { Skeleton } from "@hjmds/react/feedback";
39
39
 
40
- <>
41
- <Skeleton shape="circle" />
42
- <Skeleton shape="text" width="60%" />
43
- </>
40
+ // ์˜์—ญ์—์„œ ํ•œ ๋ฒˆ๋งŒ ์•Œ๋ฆฐ๋‹ค. Skeleton ์ž์ฒด๋Š” aria-hidden์ด๋‹ค.
41
+ <Stack gap="sm" role="status" aria-label={t("profile.loading")} aria-busy="true">
42
+ <Stack axis="inline" gap="sm" align="center">
43
+ <Skeleton shape="circle" />
44
+ <Skeleton shape="text" lines={2} layoutStyle={{ flex: 1 }} />
45
+ </Stack>
46
+ <Skeleton shape="media" />
47
+ </Stack>
44
48
  ```
45
49
 
46
50
  ```tsx
47
51
  // Native
48
52
  import { Skeleton } from "@hjmds/react-native/feedback";
49
53
 
50
- <>
51
- <Skeleton shape="circle" accessibilityLabel={t("profile.loading")} />
52
- <Skeleton shape="text" width="60%" />
53
- </>
54
+ <Stack gap="sm" accessible accessibilityLabel={t("profile.loading")} accessibilityState={{ busy: true }}>
55
+ <Stack axis="inline" gap="sm" align="center">
56
+ <Skeleton shape="circle" />
57
+ <Skeleton shape="text" lines={2} layoutStyle={{ flex: 1 }} />
58
+ </Stack>
59
+ <Skeleton shape="media" />
60
+ </Stack>
54
61
  ```
55
62
 
63
+ ๋ชฉ๋ก ํ–‰ ํ•˜๋‚˜๋ฅผ ๋Œ€์‹ ํ•  ๋•Œ๋Š” Skeleton์„ ์กฐ๋ฆฝํ•˜์ง€ ๋ง๊ณ  [ListRow](list-row.md)์˜ `loading`์„ ์“ด๋‹ค. ํ–‰ ๋†’์ดยท์Šฌ๋กฏ
64
+ ๋ฐฐ์น˜๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ  ๊ฐ™์€ ์ฑ„์›€์ƒ‰์„ ์“ด๋‹ค.
65
+
56
66
  ## ์ถ•๊ณผ ๊ธฐ๋ณธ๊ฐ’
57
67
 
58
68
  | prop | ๊ฐ’ | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
59
69
  | --- | --- | --- | --- |
60
- | `shape` | `block`(๋†’์ด `spacing.xxl`ยทradius `md`) ยท `text`(`spacing.md`ยท`sm`) ยท `circle`(`glyph.xxl` ์ง€๋ฆ„ยท`full`) | `block` | ๋ชจ์–‘๊ณผ ๊ธฐ๋ณธ ํฌ๊ธฐ |
70
+ | `shape` | `block`(๋†’์ด `spacing.xxl` 32ยทradius `md`) ยท `text`(`spacing.md` 16ยท`sm`) ยท `circle`(`glyph.xxl` 44 ์ง€๋ฆ„ยท`full`) ยท `media`(ํญ 100%ยท16:9ยท`md`) ยท `button`(`control.buttonHeight.medium` 44ยท`md`) | `block` | ๋ชจ์–‘๊ณผ ๊ธฐ๋ณธ ํฌ๊ธฐ. `media`ยท`button`์€ 2026-10-17 ์ถ”๊ฐ€ |
71
+ | `lines` | ์–‘์˜ ์ •์ˆ˜ | `1` | `text` ์ „์šฉ. ์ค„ ์ˆ˜๋งŒํผ ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ ์ค„์€ 60%(`skeletonRecipe.lines.lastLineWidthPercent`), ์ค„ ๊ฐ„๊ฒฉ `spacing.xs` 8. ํŽ„์Šค๋Š” ๋ฌถ์Œ ํ•˜๋‚˜๋กœ ๋ˆ๋‹ค. `width`๋Š” ๋ฌถ์Œ ์ „์ฒด ํญ |
61
72
  | `animated` | `boolean` | `true`(ํŽ„์Šค) | 0.9.12๊นŒ์ง€๋Š” `false`์˜€๋‹ค. ์ •์ง€ ๋ธ”๋ก์ด ํ•„์š”ํ•˜๋ฉด `animated={false}`๋ฅผ ๋ช…์‹œํ•œ๋‹ค. reduced motion์ด๋ฉด ๋‘ renderer ๋ชจ๋‘ ํŽ„์Šค๋ฅผ ๋ฉˆ์ถ”๊ณ  ๋ถˆํˆฌ๋ช…ํ•œ ๋ ๊ฐ’์œผ๋กœ ๊ทธ๋ฆฐ๋‹ค(recipe `reducedMotion: "static"`) |
62
73
  | `width` | Web `string \| number` ยท Native `ViewStyle["width"]` | ํญ 100%(circle์€ ์ง€๋ฆ„) | โ€” |
63
74
  | `height` | Web `string \| number` ยท Native `number` | shape ๊ธฐ๋ณธ๊ฐ’ | โ€” |
@@ -80,9 +91,10 @@ import { Skeleton } from "@hjmds/react-native/feedback";
80
91
 
81
92
  | ํ•ญ๋ชฉ | ๊ฐ’ | ๊ทผ๊ฑฐ |
82
93
  | --- | --- | --- |
83
- | ํฌ๊ธฐ | `block` ํญ 100% ยท ๋†’์ด `spacing.xxl` 32, `text` ๋†’์ด `spacing.md` 16, `circle` ์ง€๋ฆ„ `glyph.xxl` 44. ํ…์ŠคํŠธ ๋งˆ์ง€๋ง‰ ์ค„์€ `width="60%"`์ฒ˜๋Ÿผ ์งง๊ฒŒ | `skeletonRecipe.shapes`, `.hjm-skeleton` |
94
+ | ํฌ๊ธฐ | `block` ํญ 100% ยท ๋†’์ด 32, `text` ๋†’์ด 16, `circle` ์ง€๋ฆ„ 44, `media` ํญ 100% ยท 16:9, `button` ๋†’์ด 44. ์—ฌ๋Ÿฌ ์ค„ ๋ณธ๋ฌธ์€ `lines`๋กœ(๋งˆ์ง€๋ง‰ ์ค„ 60%) | `skeletonRecipe.shapes`ยท`.lines`, `.hjm-skeleton` |
95
+ | ์ƒ‰ | `semanticColors.surface.placeholder`(`text` 12% ํˆฌ๋ช…๋„) ์ฑ„์›€, ํ…Œ๋‘๋ฆฌ ์—†์Œ. ๋†“์ธ ๋ฉด(canvasยทCardยทํ”„๋กœํ•„ ํ…Œ๋งˆ)์„ ๊ธฐ์ค€์œผ๋กœ ์ง„ํ•ด์ง„๋‹ค | `skeletonRecipe.background`, `--hjm-skeleton-background` |
84
96
  | ๊ฐ„๊ฒฉ | ์‹ค์ œ ์ฝ˜ํ…์ธ ์˜ ๊ฐ„๊ฒฉ ํ† ํฐ์„ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค(์˜ˆ: [Stack](stack.md) `spacing.xs` 8). Skeleton์— margin์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค | โ€” |
85
- | ์ˆœ์„œยท์ •๋ ฌ | ๋กœ๋“œ ๋’ค ์‹ค์ œ ์ฝ˜ํ…์ธ ๊ฐ€ ๋†“์ผ ์ž๋ฆฌ์— ๊ฐ™์€ ์ˆœ์„œ๋กœ. ๋ชฉ๋ก์ด๋ฉด ํ–‰ ๊ตฌ์กฐ(์› + ํ…์ŠคํŠธ ์ค„ ๋‘˜)๋ฅผ ํ–‰ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต | โ€” |
97
+ | ์ˆœ์„œยท์ •๋ ฌ | ๋กœ๋“œ ๋’ค ์‹ค์ œ ์ฝ˜ํ…์ธ ๊ฐ€ ๋†“์ผ ์ž๋ฆฌ์— ๊ฐ™์€ ์ˆœ์„œ๋กœ. ๋ชฉ๋ก ํ–‰์€ ListRow `loading`, ์นด๋“œ๋Š” `media` + `text lines={2}` + `button` | โ€” |
86
98
  | ๊ณ ์ •ยท์Šคํฌ๋กค | ์Šคํฌ๋กค ์˜์—ญ ์•ˆ์˜ ์ฝ˜ํ…์ธ ๋งŒ ๋Œ€์‹ ํ•œ๋‹ค. ๊ณ ์ • ๋ฐ”(TopBarยทBottomCTA)๋Š” ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค | โ€” |
87
99
  | ์ข์€ ํญยทํฐ ๊ธ€์ž | `block`ยท`text`๋Š” ํญ 100%๋ผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ๋†’์ด๋Š” ๊ธ€์ž ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•œ ๊ณ ์ •๊ฐ’์ด๋‹ค | `.hjm-skeleton` |
88
100
 
@@ -93,13 +105,13 @@ import { Skeleton } from "@hjmds/react-native/feedback";
93
105
  Native `style`์€ ์ œ๊ฑฐ๋œ ์†์„ฑ์ด๋‹ค.
94
106
  - Web Skeleton์€ `aria-hidden`์ด๋‹ค. ๋กœ๋”ฉ ์‚ฌ์‹ค์„ ์•Œ๋ ค์•ผ ํ•˜๋ฉด ์˜์—ญ ๋‹จ์œ„๋กœ ํ•œ ๋ฒˆ ์•Œ๋ฆฐ๋‹ค
95
107
  (์˜ˆ: ๊ฐ์‹ผ ์˜์—ญ์˜ `aria-busy`, ๋˜๋Š” Spinner ํ•˜๋‚˜). Skeleton๋งˆ๋‹ค ๋ผ๋ฒจ์„ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.
96
- - Web์€ `HjmProvider` ์•ˆ์—์„œ ๋ Œ๋”ํ•œ๋‹ค. ์› ์ง€๋ฆ„ยทํŽ„์Šค ๊ฐ’์„ provider๊ฐ€ ๋‚ด๋ณด๋‚ด๋Š” `--hjm-skeleton-*` ๋ณ€์ˆ˜๋กœ ์ฝ๋Š”๋‹ค.
108
+ - Web์€ `HjmProvider` ์•ˆ์—์„œ ๋ Œ๋”ํ•œ๋‹ค. ์ฑ„์›€์ƒ‰ยท์› ์ง€๋ฆ„ยท๋ฒ„ํŠผ ๋†’์ดยทmedia ๋น„์œจยท์ค„ ๊ฐ„๊ฒฉยทํŽ„์Šค ๊ฐ’์„ provider๊ฐ€ ๋‚ด๋ณด๋‚ด๋Š” `--hjm-skeleton-*` ๋ณ€์ˆ˜๋กœ ์ฝ๋Š”๋‹ค.
97
109
 
98
110
  ## ํ”Œ๋žซํผ ์ฐจ์ด
99
111
 
100
112
  | ํ•ญ๋ชฉ | Web | Native |
101
113
  | --- | --- | --- |
102
- | ์ ‘๊ทผ์„ฑ | ํ•ญ์ƒ `aria-hidden` | `accessibilityLabel`์„ ์ฃผ๋ฉด `busy` ์ƒํƒœ๋กœ ์ฝํž˜, ์—†์œผ๋ฉด ์ˆจ๊น€ |
114
+ | ์ ‘๊ทผ์„ฑ | ํ•ญ์ƒ `aria-hidden` | `accessibilityLabel`์„ ์ฃผ๋ฉด `busy` ์ƒํƒœ๋กœ ์ฝํž˜, ์—†์œผ๋ฉด ์ˆจ๊น€(Android `no-hide-descendants`) |
103
115
  | ๋†’์ด | `string \| number` | `number`๋งŒ |
104
116
  | ๋ชจ์„œ๋ฆฌ ์ง์ ‘ ์ง€์ • | ์—†์Œ | `radius`(0.9 ํ˜ธํ™˜์šฉ, `shape`๋ณด๋‹ค ์šฐ์„ ) |
105
117
  | reduced motion ํŒ๋‹จ | `prefers-reduced-motion`ยท`.hjm-root[data-motion="reduced"]` | provider `environment.reducedMotion` |
@@ -112,3 +124,17 @@ import { Skeleton } from "@hjmds/react-native/feedback";
112
124
  `{...(first ? { accessibilityLabel: t("โ€ฆ") } : {})}`์ฒ˜๋Ÿผ ์กฐ๊ฑด๋ถ€ spread๋กœ ๋„˜๊ธด๋‹ค.
113
125
  - ํ˜„์žฌ Web `style`์€ `width`ยท`height` prop ๊ฐ’ ๋’ค์— ํŽผ์ณ์ ธ ํฌ๊ธฐยท๋ฐฐ๊ฒฝ์„ ๋ฎ์„ ์ˆ˜ ์žˆ๋‹ค(ํƒ€์ž…์ด ๋ง‰์ง€ ์•Š๋Š”๋‹ค). ํฌ๊ธฐ๋Š” `width`ยท`height`,
114
126
  ๋ฐฐ์น˜๋Š” `layoutStyle`๋กœ ์ค€๋‹ค.
127
+
128
+ ## ๊ทผ๊ฑฐ
129
+
130
+ - 2026-10-17 ์‚ฌ์šฉ์ž ์š”์ฒญ("์Šค์ผˆ๋ ˆํ†ค ์œ ์•„์ด ๊ฐœ์„ ํ•ด์ค˜"): Native ์Šคํ† ๋ฆฌ๊ฐ€ ํฐ ๋ฐ”ํƒ• ์œ„ ์˜…์€ ํ…Œ๋‘๋ฆฌ ๋ง‰๋Œ€ ํ•˜๋‚˜๋กœ๋งŒ ๋ณด์˜€๋‹ค.
131
+ ์›์ธ์€ `skeletonRecipe.background`๊ฐ€ ํ™”๋ฉด ๋ฐ”ํƒ•๊ณผ ๊ฐ™์€ `semanticColors.canvas`์˜€๊ณ , ๋‘ renderer๊ฐ€ ๊ทธ ์œ„์— 1px
132
+ ํ…Œ๋‘๋ฆฌ๋ฅผ ์ง์ ‘ ๊ทธ๋ฆฐ ๊ฒƒ์ด๋‹ค. 2026-09-29 "๋„“์€ ํšŒ์ƒ‰ยท์—ฐํŒŒ๋ž‘ ๋ฉด์€ canvas + ํ…Œ๋‘๋ฆฌ" ๋ฐฉํ–ฅ์„ Skeleton์—๋„ ์ ์šฉํ–ˆ์ง€๋งŒ,
133
+ ์ž๋ฆฌํ‘œ์‹œ๋Š” ์ฑ„์šด ๋ฉด์ด์–ด์•ผ ๋ชจ์–‘์ด ์ฝํžˆ๋ฏ€๋กœ SkeletonยทListRow `loading`์„ ๊ทธ ๋ฐฉํ–ฅ์˜ ์˜ˆ์™ธ๋กœ ๋‘”๋‹ค.
134
+ - ์ฑ„์›€์€ ๋ถˆํˆฌ๋ช… `surfaceAlt` ๋Œ€์‹  `text` 12% ํˆฌ๋ช…๋„๋‹ค. ๋Œ€๋น„(๋ฐ”ํƒ• ๋Œ€๋น„, ํŽ„์Šค ์ตœ๊ณ ์ ): ๊ธฐ๋ณธ ๋ฐ์€ ํ…Œ๋งˆ ์•ฝ 1.27:1(ํŽ„์Šค ์ตœ์ €์  1.14),
135
+ ์–ด๋‘์šด ํ…Œ๋งˆ ์•ฝ 1.36:1(1.16). ๋ถˆํˆฌ๋ช… `surfaceAlt`๋Š” 1.23 / 1.20, Card ๋ฉด(`surface`) ์œ„์—์„œ๋Š” 1.12 / 1.10์ด์—ˆ๊ณ , `surfaceAlt`๊ฐ€ `bg`๋งŒํผ ๋ฐ์€
136
+ ํ”„๋กœํ•„ ํŒ”๋ ˆํŠธ์—์„œ๋Š” ๊ฑฐ์˜ ๋ณด์ด์ง€ ์•Š์•˜๋‹ค. ์žฅ์‹ ์š”์†Œ๋ผ ํ…์ŠคํŠธ ๋Œ€๋น„ ๊ธฐ์ค€์€ ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
137
+ - `media`ยท`button`ยท`lines`๋Š” ์นด๋“œยท๋ณธ๋ฌธ ์ž๋ฆฌํ‘œ์‹œ๋ฅผ ์ œํ’ˆ๋งˆ๋‹ค ๋ง‰๋Œ€๋กœ ๋‹ค์‹œ ์กฐ๋ฆฝํ•˜๋˜ ์ผ์„ ์ค„์ด๋ ค๊ณ  ์ถ”๊ฐ€ํ–ˆ๋‹ค. ๋ชฉ๋ก ํ–‰์€
138
+ ๊ธฐ์กด ListRow `loading`์ด ๋งก์œผ๋ฏ€๋กœ ๋ณ„๋„ ์กฐํ•ฉ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‘์ง€ ์•Š๋Š”๋‹ค.
139
+ - ์›€์ง์ž„์€ ๊ธฐ์กด ๋ถˆํˆฌ๋ช…๋„ ํŽ„์Šค(0.56โ†”1)๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ๋น› ๋ (shimmer)๋Š” Native์— ๊ทธ๋ผ๋ฐ์ด์…˜ peer๊ฐ€ ํ•„์š”ํ•˜๊ณ  reduced
140
+ motion์—์„œ๋Š” ์–ด์ฐจํ”ผ ์ •์ง€ํ•ด์•ผ ํ•œ๋‹ค.
@@ -93,7 +93,7 @@ Native ํ”„๋ ˆ์ž„์˜ ๋ชจ์„œ๋ฆฌ๋Š” `statisticRecipe.presentations`์˜ ์—ญํ• ์„ Pr
93
93
  | ํ•ญ๋ชฉ | ๊ฐ’ | ๊ทผ๊ฑฐ |
94
94
  | --- | --- | --- |
95
95
  | ํฌ๊ธฐ | `presentation="surface"`์˜ ์•ˆ์ชฝ ์—ฌ๋ฐฑ: `comfortable` `spacing.md` 16 ยท `compact` `spacing.sm` 12(๋‘ ํ”Œ๋žซํผ). ํ…Œ๋‘๋ฆฌ `stroke.default` 1, radius `md` 12 | `statisticRecipe.density`ยท`presentations`, `styles.css` `.hjm-statistic[data-presentation="surface"]` |
96
- | ๊ธ€์ž | ๋ผ๋ฒจ `label` 12 semibold(`compact` `caption` 11), ๊ฐ’ `heading` 24 heavy(`compact` `title` 18), prefixยทsuffix `body` 14 semibold ๋ณธ๋ฌธ์ƒ‰, hint `caption`, ์ถ”์„ธ `caption` bold(๋‘ ํ”Œ๋žซํผ). 2026-10-06๊นŒ์ง€ Web์€ ๋ผ๋ฒจ ๋ณธ๋ฌธ 14 medium, ๊ฐ’์€ ๋ฐ€๋„์™€ ๊ด€๊ณ„์—†์ด 18, prefixยทsuffix๋Š” ํ๋ฆฐ์ƒ‰์ด์—ˆ๋‹ค(1.13.0 ๋ณ€๊ฒฝ) | `statisticRecipe.density`ยท`label`ยท`value`ยท`affix`ยท`hint`ยท`trend`, `.hjm-statistic__*` |
96
+ | ๊ธ€์ž | ๋ผ๋ฒจ `label` 12 medium(`compact` `caption` 11), ๊ฐ’ `heading` 24 semibold(`fontWeight.semibold`, `compact` `title` 18. 2026-10-17 ํฐ ๊ธ€์ž ๋‹จ๊ณ„ ํ์ง€๋กœ `heading.level2` ๊ตต๊ธฐ ์ฐธ์กฐ๋ฅผ ๋Š์Œ), prefixยทsuffix `body` 14 medium ๋ณธ๋ฌธ์ƒ‰, hint `caption`, ์ถ”์„ธ `caption` medium(๋‘ ํ”Œ๋žซํผ). 2026-10-06๊นŒ์ง€ Web์€ ๋ผ๋ฒจ ๋ณธ๋ฌธ 14 medium, ๊ฐ’์€ ๋ฐ€๋„์™€ ๊ด€๊ณ„์—†์ด 18, prefixยทsuffix๋Š” ํ๋ฆฐ์ƒ‰์ด์—ˆ๋‹ค(1.13.0 ๋ณ€๊ฒฝ) | `statisticRecipe.density`ยท`label`ยท`value`ยท`affix`ยท`hint`ยท`trend`, `.hjm-statistic__*` |
97
97
  | ๊ฐ„๊ฒฉ | ๊ทธ๋ฃน ๊ฐ„๊ฒฉ `statisticRecipe.group.gap` = `spacing.xs` 8. ์ง€ํ‘œ ์•ˆ ์ค„ ๊ฐ„๊ฒฉ(๋ผ๋ฒจยท๊ฐ’ยท์ถ”์„ธ) `comfortable` `spacing.xs` 8 ยท `compact` `spacing.xxs` 4(๋‘ ํ”Œ๋žซํผ) | `styles.css` `.hjm-statistic`ยท`.hjm-statistic-group`, `statisticRecipe` |
98
98
  | ์ˆœ์„œยท์ •๋ ฌ | ํ™”๋ฉด ์œ„์ชฝ ์š”์•ฝ ์˜์—ญ์ด๋‚˜ ์นด๋“œ ์•ˆ์— ๋‘”๋‹ค. ์ง€ํ‘œ ์—ฌ๋Ÿฌ ๊ฐœ๋Š” [Grid](grid.md)๋ฅผ ์ง์ ‘ ์งœ์ง€ ๋ง๊ณ  `StatisticGroup`์œผ๋กœ ๋ฌถ๋Š”๋‹ค | โ€” |
99
99
  | ๊ณ ์ •ยท์Šคํฌ๋กค | โ€” | โ€” |
@@ -135,3 +135,7 @@ Native ํ”„๋ ˆ์ž„์˜ ๋ชจ์„œ๋ฆฌ๋Š” `statisticRecipe.presentations`์˜ ์—ญํ• ์„ Pr
135
135
  ์–‘์ชฝ ์›€์ง์ด๋Š” ์ˆ˜์น˜ Storybook์— ์†Œ์ˆ˜์™€ ์Œ์ˆ˜(de-DE), ๋น„๋ผํ‹ด ์ˆซ์ž(ar-EG), ์ง€์ˆ˜ ํ‘œ๊ธฐ(en-US),
136
136
  ๋™์ž‘ ์ค„์ด๊ธฐ์™€ RTL ๋น„๊ต๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์†Œ์ˆ˜ยท์Œ์ˆ˜ ์˜ˆ์ œ๋Š” ๊ธฐ๋ก ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ธก์ •๊ฐ’์ด๋‹ค.
137
137
  Web์€ ์ž๋ฆฌ ๋‹จ์œ„ ์ „ํ™˜, Native๋Š” ์ง€ํ‘œ ์ „์ฒด ์ „ํ™˜์ด๋ฉฐ ๊ฐ™์€ ์‹œ๊ฐ ํšจ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
138
+
139
+ ## ๊ทผ๊ฑฐ
140
+
141
+ 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •("๊ตต๊ธฐ ์ข€๋” ์ค„์—ฌ"): ๋ชจ๋“  ๊ธ€์ž ๊ตต๊ธฐ๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์ท„๋‹ค. ํฐ ์ˆซ์žยท์„ ํƒ ์ƒํƒœ 600(ํฐ ์ œ๋ชฉ ๋‹จ๊ณ„๋Š” ๊ฐ™์€ ๋‚  ํ์ง€), ์ œ๋ชฉยท๊ฐ•์กฐ 500, label 500, ๋ณธ๋ฌธ 400์ด๋ฉฐ ์ •๋ณธ์€ [ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ](../tokens/typography.md)๋‹ค.
@@ -77,8 +77,8 @@ import { Switch } from "@hjmds/react-native/inputs";
77
77
 
78
78
  | ํ•ญ๋ชฉ | ๊ฐ’ | ๊ทผ๊ฑฐ |
79
79
  | --- | --- | --- |
80
- | ํฌ๊ธฐ | ํŠธ๋ž™ `small` 44ร—26(thumb 22) ยท `medium` 52ร—32(thumb 28), ์•ˆ์ชฝ ์—ฌ๋ฐฑ 2. iOS Native๋Š” `UISwitch` ๊ณ ์œ  ํฌ๊ธฐ. ๋ฃจํŠธ ์ตœ์†Œ ๋†’์ด 44(`control.minTouchTarget`). ํ–‰ ๋†’์ด๋Š” ์„ค๋ช…์ด ์—†์œผ๋ฉด 44, Native๋Š” ์„ค๋ช…์ด ์žˆ์œผ๋ฉด 68(`rowTwoLineMinHeight`, ListRow ๋‘ ์ค„ ํ–‰๊ณผ ๊ฐ™๋‹ค). Web์€ 68์„ ๊ณ ์ •ํ•˜์ง€ ์•Š๊ณ  ๋‚ด์šฉ ๋†’์ด๋ฅผ ๋”ฐ๋ฅธ๋‹ค | `switchRecipe.sizes`ยท`rowMinHeight`ยท`rowTwoLineMinHeight`, `styles.css` `.hjm-switch`, `react-native/src/inputs.tsx` |
81
- | ๊ฐ„๊ฒฉ | ์ด๋ฆ„๊ณผ ํŠธ๋ž™ ์‚ฌ์ด `spacing.sm` 12, ์ด๋ฆ„๊ณผ ์„ค๋ช… ์‚ฌ์ด `spacing.xxs` 4. ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์Œ“์„ ๋•Œ๋Š” [List](list.md)ยท[ListRow](list-row.md) ํ–‰ ๊ตฌ๋ถ„์„ ๋”ฐ๋ฅด๊ณ  Switch ์‚ฌ์ด์— ์—ฌ๋ฐฑ์„ ๋”ํ•˜์ง€ ์•Š๋Š”๋‹ค | `styles.css` `.hjm-switch`ยท`.hjm-switch__copy`, `react-native/src/inputs.tsx` |
80
+ | ํฌ๊ธฐ | ํŠธ๋ž™ `small` 44ร—26(thumb 22) ยท `medium` 52ร—32(thumb 28), ์•ˆ์ชฝ ์—ฌ๋ฐฑ 2. iOS Native๋Š” `UISwitch` ๊ณ ์œ  ํฌ๊ธฐ. ๋ฃจํŠธ ์ตœ์†Œ ๋†’์ด 44(`control.minTouchTarget`). ํ–‰ ๋†’์ด๋Š” ์„ค๋ช…์ด ์—†์œผ๋ฉด 44. ์„ค๋ช…์ด ๋ณด์ด๋Š” ํ–‰์€ ์œ„์•„๋ž˜ ์•ˆ์ชฝ ์—ฌ๋ฐฑ 8(`rowPaddingVertical`, ListRow comfortable๊ณผ ๊ฐ™๋‹ค)์— ์ตœ์†Œ 56(`rowTwoLineMinHeight` = ์ด๋ฆ„ 20 + 4 + ์„ค๋ช… 16 + 8ร—2). WebยทNative ๊ฐ™๋‹ค. `labelVisibility="hidden"`์ด๋ฉด ์„ค๋ช…์ด ์žˆ์–ด๋„ 44 | `switchRecipe.sizes`ยท`rowMinHeight`ยท`rowPaddingVertical`ยท`rowTwoLineMinHeight`, `styles.css` `.hjm-switch[data-two-line]`, `react-native/src/inputs.tsx` |
81
+ | ๊ฐ„๊ฒฉ | ์ด๋ฆ„๊ณผ ํŠธ๋ž™ ์‚ฌ์ด `spacing.sm` 12, ์ด๋ฆ„๊ณผ ์„ค๋ช… ์‚ฌ์ด `spacing.xxs` 4. ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์Œ“์„ ๋•Œ๋Š” [List](list.md)(`separator`๋กœ ๊ตฌ๋ถ„์„  ์„ ํƒ)์— ๋„ฃ๊ณ  Switch ์‚ฌ์ด์— Stack gap ๊ฐ™์€ ์—ฌ๋ฐฑ์„ ๋”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ–‰ ๊ฐ„๊ฒฉ์€ ํ–‰์˜ ์ตœ์†Œ ๋†’์ดยท์•ˆ์ชฝ ์—ฌ๋ฐฑ์ด ๋งก๋Š”๋‹ค(์„ค๋ช… ์žˆ๋Š” ํ–‰ ๊ฐ„๊ฒฉ 56) | `styles.css` `.hjm-switch`ยท`.hjm-switch__copy`, `react-native/src/inputs.tsx` |
82
82
  | ์ˆœ์„œยท์ •๋ ฌ | ์„ค์ • ๋ชฉ๋ก์—์„œ๋Š” `presentation="row"`๋กœ ํ–‰ ์ „์ฒด ํญ์„ ์“ฐ๊ณ  ์ด๋ฆ„ยท์„ค๋ช…์ด ์•ž(์™ผ์ชฝ), ํŠธ๋ž™์ด ๋(์˜ค๋ฅธ์ชฝ) | `styles.css` `.hjm-switch[data-presentation="row"]` |
83
83
  | ๊ณ ์ •ยท์Šคํฌ๋กค | โ€” | โ€” |
84
84
  | ์ข์€ ํญยทํฐ ๊ธ€์ž | ๊ธ€์ž ๋ฐฐ์œจ โ‰ฅ 1.6(`largeTextThreshold`)์ด๋ฉด `row`๋Š” ์ด๋ฆ„ยท์„ค๋ช… ์•„๋ž˜๋กœ ํŠธ๋ž™์„ ๋‚ด๋ฆฐ๋‹ค | `switchRecipe.stackedTextScale`, `styles.css` `.hjm-root[data-large-text="true"]` |
@@ -130,3 +130,4 @@ presentation="row" ํฐ ๊ธ€์ž(โ‰ฅ1.6)
130
130
  ## ๊ทผ๊ฑฐ
131
131
 
132
132
  - ๊ธฐ๋ณธ `row` ํ†ต์ผ: 2026-10-17 ์›นยท์•ฑ ๋น„๊ต ๋„๊ตฌ์—์„œ ๊ฐ™์€ ์„ค์ • ์Šค์œ„์น˜๊ฐ€ Web์€ ํŠธ๋ž™ ๋จผ์ €(inline), Native๋Š” ์ด๋ฆ„ ๋จผ์ €(row)๋กœ ๊ฑฐ์šธ์ฒ˜๋Ÿผ ๊ทธ๋ ค์กŒ๋‹ค.
133
+ - ์„ค๋ช… ์žˆ๋Š” ํ–‰ 56ยท์—ฌ๋ฐฑ 8, ์Œ“์„ ๋•Œ gap ์—†์Œ: 2026-10-17 ์‚ฌ์šฉ์ž ๋ณด๊ณ (์•Œ๋ฆผ ์„ค์ • "๊ฐ„๊ฒฉ์ด ์ปค") โ€” ๊ธ€์ž 40์— ListRow ๋‘ ์ค„ 68์„ ๋นŒ๋ฆฐ ์ตœ์†Œ ๋†’์ด์™€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์˜ Stack gap 16์ด ๊ฒน์ณ ํ–‰ ๊ฐ„๊ฒฉ์ด 84์˜€๋‹ค.
@@ -66,7 +66,7 @@ import { TableColumnSettings } from "@hjmds/react-native/collection-editing";
66
66
  | --- | --- | --- |
67
67
  | ํฌ๊ธฐ | ์ฒดํฌ๋ฐ•์Šค๋Š” [Checkbox](checkbox.md) ๊ธฐ๋ณธ `medium`, ์ด๋™ ๋ฒ„ํŠผ์€ `ghost` [Button](button.md) ๊ธฐ๋ณธ `medium`(๋†’์ด 44) | `collection-editing.tsx` |
68
68
  | ๊ฐ„๊ฒฉ | ์—ด ์‚ฌ์ดยท์ฒดํฌ๋ฐ•์Šค์™€ ๋ฒ„ํŠผ ์ค„ ์‚ฌ์ดยท๋ฒ„ํŠผ ์‚ฌ์ด ๋ชจ๋‘ `spacing.sm` 12 | `Stack gap="sm"` |
69
- | ์ˆœ์„œยท์ •๋ ฌ | ์ œ๋ชฉ โ†’ ์—ด๋งˆ๋‹ค [์ฒดํฌ๋ฐ•์Šค] ๋‹ค์Œ ์ค„ [์•ž์œผ๋กœ] [๋’ค๋กœ], `columns` ์ˆœ์„œ๋Œ€๋กœ | ์–‘ renderer |
69
+ | ์ˆœ์„œยท์ •๋ ฌ | ์ œ๋ชฉ โ†’ ์—ด๋งˆ๋‹ค [์ฒดํฌ๋ฐ•์Šค] ๋‹ค์Œ ์ค„ [์•ž์œผ๋กœ] [๋’ค๋กœ], `columns` ์ˆœ์„œ๋Œ€๋กœ ๋งˆ์ง€๋ง‰ [๋’ค๋กœ]๋Š” `edge="end"`๋กœ ์•„์ด์ฝ˜ ์นธ์ด ๋ฌถ์Œ ๋์— ์˜จ๋‹ค(์ „์—๋Š” 10 ์•ˆ์ชฝ, 2026-10-17 ์‹ค์ธก ๊ฐ์‚ฌ, [IconButton `edge`](icon-button.md#๋ฐฐ์น˜)) | ์–‘ renderer |
70
70
  | ๊ณ ์ •ยท์Šคํฌ๋กค | ์ž์ฒด ์Šคํฌ๋กค ์—†์Œ. ์‹œํŠธยทํŒ์˜ค๋ฒ„ ๋“ฑ ๋†“๋Š” ์˜์—ญ์ด ์†Œ์œ ํ•œ๋‹ค | โ€” |
71
71
  | ์ข์€ ํญยทํฐ ๊ธ€์ž | ์ด๋™ ๋ฒ„ํŠผ ์ค„์ด `wrap`์œผ๋กœ ์ค„๋ฐ”๊ฟˆ | `Stack axis="inline" wrap` |
72
72
 
@@ -55,7 +55,7 @@ import { Tag } from "@hjmds/react-native/data-display";
55
55
  | `accessibilityLabel`(Native) | `string` | ๋ผ๋ฒจ | โ€” |
56
56
  | `style`ยท`labelStyle`(Native) | ์ง€์›ํ•˜์ง€ ์•Š์Œ | โ€” | ์ œ๊ฑฐ๋œ ์†์„ฑ โ€” `layoutStyle` ๋˜๋Š” `tone`. ํ˜„์žฌ ๊ณต๊ฐœ props์—์„œ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค |
57
57
 
58
- ๋ชจ์–‘์€ radius `sm` ์‚ฌ๊ฐํ˜•, ์ตœ์†Œ ๋†’์ด 20(ํฐ ๊ธ€์ž์—์„œ ๋Š˜์–ด๋‚จ), caption ํฌ๊ธฐ semibold ๊ธ€์ž๋‹ค.
58
+ ๋ชจ์–‘์€ radius `sm` ์‚ฌ๊ฐํ˜•, ์ตœ์†Œ ๋†’์ด 20(ํฐ ๊ธ€์ž์—์„œ ๋Š˜์–ด๋‚จ), caption ํฌ๊ธฐ medium(500) ๊ธ€์ž๋‹ค.
59
59
 
60
60
  ## ๋ฐฐ์น˜
61
61
 
@@ -84,3 +84,7 @@ Native์˜ ๋ชจ์„œ๋ฆฌ๋Š” Provider์˜ `tokens.radius.sm`์ด๋‹ค. metadata ์˜๋ฏธ์™€
84
84
  | ์ถ”๊ฐ€ style prop | `className`ยท`style`(HTML ์†์„ฑ) | `style`ยท`labelStyle`(์ œ๊ฑฐ๋œ ์†์„ฑ) |
85
85
  | ref | `forwardRef`(`span`) | ์—†์Œ |
86
86
  | import ๊ฒฝ๋กœ | `/display` | `/data-display` |
87
+
88
+ ## ๊ทผ๊ฑฐ
89
+
90
+ 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •("๊ตต๊ธฐ ์ข€๋” ์ค„์—ฌ"): ๋ชจ๋“  ๊ธ€์ž ๊ตต๊ธฐ๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์ท„๋‹ค. ํฐ ์ˆซ์žยท์„ ํƒ ์ƒํƒœ 600(ํฐ ์ œ๋ชฉ ๋‹จ๊ณ„๋Š” ๊ฐ™์€ ๋‚  ํ์ง€), ์ œ๋ชฉยท๊ฐ•์กฐ 500, label 500, ๋ณธ๋ฌธ 400์ด๋ฉฐ ์ •๋ณธ์€ [ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ](../tokens/typography.md)๋‹ค.
@@ -18,7 +18,7 @@
18
18
  | ์ƒํ™ฉ | ๋Œ€์‹  ์“ธ ๊ฒƒ |
19
19
  | --- | --- |
20
20
  | ์งง์€ ์ƒํƒœยท๊ฒฐ๊ณผ ๋ฌธ๊ตฌ๋ฅผ ๋ณ€๊ฒฝ ์•Œ๋ฆผ์œผ๋กœ ์ „๋‹ฌ | [StatusText](#statustext) |
21
- | ๋ฌธ์„œ ์ œ๋ชฉ ๋‹จ๊ณ„(`h1`~)๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ 24px๋ณด๋‹ค ํฐ ์ œ๋ชฉ | [Heading](heading.md) |
21
+ | ๋ฌธ์„œ ์ œ๋ชฉ ๋‹จ๊ณ„(`h1`~)๊ฐ€ ํ•„์š”ํ•œ ์ œ๋ชฉ(ํฌ๊ธฐ๋Š” Text์™€ ๊ฐ™์€ ๋‹จ๊ณ„, ์ตœ๋Œ€ 24px) | [Heading](heading.md) |
22
22
  | ํ™”๋ฉด ์ฒซ ์ž๋ฆฌ์˜ ์ œ๋ชฉ ๋ธ”๋ก(๋ณด์กฐ ๋ฌธ์žฅยทํ–‰๋™ ํฌํ•จ) | [Top](top.md) |
23
23
  | ๋ณธ๋ฌธ ๋ฌถ์Œ์˜ ํ—ค๋” ํ–‰ | [Section](section.md) |
24
24
  | ์ˆซ์ž ์ง€ํ‘œ์™€ ๊ทธ ๋ผ๋ฒจ | [Statistic](statistic.md) |
@@ -61,7 +61,7 @@ import { Text } from "@hjmds/react-native/primitives";
61
61
  | --- | --- | --- | --- |
62
62
  | `variant` | `caption`(11) ยท `label`(12) ยท `body`(14) ยท `bodyLarge`(16) ยท `title`(18) ยท `titleLarge`(20) ยท `heading`(24) | `body` | ํ™”๋ฉดยท์„น์…˜ ์ œ๋ชฉ์€ ๋ชจ์–‘์ด ์•„๋‹ˆ๋ผ [Heading](heading.md)์œผ๋กœ ์“ด๋‹ค |
63
63
  | `fontRole` | `ui` ยท `display` ยท `reading` ยท `code` | ์ œ๋ชฉ variant๋Š” display, ๋ณธ๋ฌธ์€ reading, caption/label์€ ui | ๋ช…์‹œ๊ฐ’์ด ๊ธฐ๋ณธ์„ ๋ฎ๋Š”๋‹ค. [์—ญํ•  ์ง€์นจ](../tokens/font-roles.md), 1.16.0 ๋ณ€๊ฒฝ |
64
- | `emphasis` | `regular` ยท `medium`(semibold) ยท `strong`(bold) | ํ”„๋กœํ•„์ด ์žˆ์œผ๋ฉด variant ๊ตต๊ธฐ, ์—†์œผ๋ฉด `regular`. `label`์€ ํ”„๋กœํ•„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ variant ๊ตต๊ธฐ 500 | ๋ช…์‹œ๊ฐ’์ด ํ”„๋กœํ•„๊ณผ variant๋ณด๋‹ค ์šฐ์„  |
64
+ | `emphasis` | `regular` 400 ยท `medium` 500 ยท `strong` 500(์ œ๋ชฉ ๊ตต๊ธฐ) | ํ”„๋กœํ•„์ด ์žˆ์œผ๋ฉด variant ๊ตต๊ธฐ, ์—†์œผ๋ฉด `regular`. `label`์€ ํ”„๋กœํ•„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ variant ๊ตต๊ธฐ 500 | ๋ช…์‹œ๊ฐ’์ด ํ”„๋กœํ•„๊ณผ variant๋ณด๋‹ค ์šฐ์„  |
65
65
  | `tone` | `primary` ยท `body` ยท `muted` ยท `subtle` ยท `weak` ยท `brand` ยท `danger` ยท `inverse` | `primary` | โ€” |
66
66
  | `as` | `span` ยท `p` ยท `div` ยท `strong` ยท `small` | `span` | Web๋งŒ. ๋ฌธ๋‹จ์€ `as="p"` |
67
67
  | `align` | `TextStyle["textAlign"]` | ์“ฐ๊ธฐ ๋ฐฉํ–ฅ์˜ ์‹œ์ž‘ ์ชฝ | Native๋งŒ |
@@ -103,13 +103,13 @@ Native๋Š” Text์˜ ์—ญํ• ์„ ํ•ด๋‹น stack์—, ์ž…๋ ฅ/์กฐ์ž‘ host๋Š” ์ œํ’ˆ ํ”„๋กœ
103
103
  ## ํ•จ์ •
104
104
 
105
105
  - `emphasis`๋ฅผ ๋ช…์‹œํ•˜๋ฉด `variant`์˜ ๊ตต๊ธฐ๋ฅผ ๋ฎ๋Š”๋‹ค. `designProfile`์ด ์žˆ์œผ๋ฉด ์ƒ๋žตํ•œ `emphasis`๋Š” ํ•ด๋‹น ํ”„๋กœํ•„์˜ `tokens.typography[variant].fontWeight`๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ํ”„๋กœํ•„์ด ์—†์œผ๋ฉด ๊ธฐ์กด ๊ธฐ๋ณธ๊ฐ’ `regular`๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ `variant="title"`๋„ ๋ณดํ†ต ๊ตต๊ธฐ๋กœ ๊ทธ๋ ค์ง„๋‹ค. ๊ทธ ๊ฒฝ์šฐ ๊ตต์€ ์ œ๋ชฉ์€ `emphasis="strong"`์œผ๋กœ ์ง€์ •ํ•œ๋‹ค(๋‘ renderer ๋™์ผ).
106
- - `variant="label"`์€ ์˜ˆ์™ธ๋กœ, ํ”„๋กœํ•„์ด ์—†์–ด๋„ ์ƒ๋žตํ•œ `emphasis`๊ฐ€ `typography.label` ๊ตต๊ธฐ 500(medium)์œผ๋กœ ๊ทธ๋ ค์ง„๋‹ค. 500์€ `emphasis` ๋‹จ๊ณ„์— ์—†์œผ๋ฏ€๋กœ(`medium`์€ 600) label์„ 400์œผ๋กœ ๊ทธ๋ฆฌ๋ ค๋ฉด `emphasis="regular"`๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
106
+ - `variant="label"`์€ ์˜ˆ์™ธ๋กœ, ํ”„๋กœํ•„์ด ์—†์–ด๋„ ์ƒ๋žตํ•œ `emphasis`๊ฐ€ `typography.label` ๊ตต๊ธฐ 500(medium)์œผ๋กœ ๊ทธ๋ ค์ง„๋‹ค. label์„ 400์œผ๋กœ ๊ทธ๋ฆฌ๋ ค๋ฉด `emphasis="regular"`๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
107
107
  Web์€ ์ด ๊ธฐ๋ณธ ๊ตต๊ธฐ๋ฅผ inline `font-weight`๋กœ ์ฃผ๋ฉฐ `data-emphasis`๋Š” `regular`๋กœ ๋‚จ๋Š”๋‹ค. Native๋Š” `fonts="pretendard"`์ผ ๋•Œ `Pretendard-Medium` face๋กœ ๊ทธ๋ฆฐ๋‹ค.
108
108
 
109
109
 
110
110
  ## ๊ทผ๊ฑฐ
111
111
 
112
- 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •: ํผ ๋ผ๋ฒจยท์„น์…˜ ๋ถ€์ œ๋ชฉ์ด ๋ณธ๋ฌธ ๋Œ€๋น„ ์•ฝํ•ด `label` ๊ธฐ๋ณธ ๊ตต๊ธฐ๋ฅผ 500์œผ๋กœ ์ •ํ–ˆ๋‹ค(๋ณธ๋ฌธ 400๊ณผ ์ œ๋ชฉ 600 ์‚ฌ์ด). ์ด์ „์—๋Š” ํ† ํฐ์ด 600์ด์—ˆ์ง€๋งŒ ํ”„๋กœํ•„ ์—†๋Š” Text๋Š” 400์œผ๋กœ ๊ทธ๋ ธ๋‹ค. ๋‘ renderer๋Š” `resolveTextDefaultWeight`(`src/component-recipes.ts`) ํ•˜๋‚˜๋กœ ๊ธฐ๋ณธ ๊ตต๊ธฐ๋ฅผ ๊ณ ๋ฅธ๋‹ค.
112
+ 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •: ํผ ๋ผ๋ฒจยท์„น์…˜ ๋ถ€์ œ๋ชฉ์ด ๋ณธ๋ฌธ ๋Œ€๋น„ ์•ฝํ•ด `label` ๊ธฐ๋ณธ ๊ตต๊ธฐ๋ฅผ 500์œผ๋กœ ์ •ํ–ˆ๋‹ค(๋‹น์‹œ ๋ณธ๋ฌธ 400๊ณผ ์ œ๋ชฉ 600 ์‚ฌ์ด, ์ œ๋ชฉ์ด 500์œผ๋กœ ๋‚ด๋ ค๊ฐ„ ๋’ค์—๋„ 500 ์œ ์ง€). ์ด์ „์—๋Š” ํ† ํฐ์ด 600์ด์—ˆ์ง€๋งŒ ํ”„๋กœํ•„ ์—†๋Š” Text๋Š” 400์œผ๋กœ ๊ทธ๋ ธ๋‹ค. ๋‘ renderer๋Š” `resolveTextDefaultWeight`(`src/component-recipes.ts`) ํ•˜๋‚˜๋กœ ๊ธฐ๋ณธ ๊ตต๊ธฐ๋ฅผ ๊ณ ๋ฅธ๋‹ค.
113
113
 
114
114
  ## StatusText
115
115
 
@@ -189,3 +189,5 @@ Native Android๋Š” `accessibilityLiveRegion`๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. iOS๋Š” ์•ฑ์ด activ
189
189
  ๋™์ผ ๊ฒฐ๊ณผ๋ฅผ ๋งค ๋ Œ๋” ๋‹ค์‹œ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด key๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค. ToastยทNotice์—์„œ ์ด๋ฏธ ์•Œ๋ฆฌ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ค‘๋ณต ์•Œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
190
190
  Showcase์˜ `PatternStatus`๋Š” ์ด ๊ณต๊ฐœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‚ด๋ถ€ ๋ณ„์นญ์ผ ๋ฟ์ด๋ฉฐ ์ œํ’ˆ์—์„œ Showcase ํŒŒ์ผ์„ importํ•˜์ง€ ์•Š๋Š”๋‹ค.
191
191
  DOM ์†์„ฑยทNative host ํ˜ธ์ถœ ๊ฒ€์‚ฌ๋Š” ์‹ค์ œ VoiceOverยทTalkBack์˜ ๋‚ญ๋… ํ™•์ธ๊ณผ ๊ตฌ๋ถ„ํ•œ๋‹ค.
192
+ - 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •("์™œ ํฐํŠธ๊ฐ€ ์ง„ํ•ด"): ์ œ๋ชฉ์„ 600์œผ๋กœ ๋‚ด๋ฆฐ ๋’ค์—๋„ `strong`์ด 700์ด๋ผ ์ฝ์ง€ ์•Š์€ ์•Œ๋ฆผ ์ œ๋ชฉยท๋ผ๋ฒจ 25๊ณณ์ด ์ œ๋ชฉ๋ณด๋‹ค ๊ตต์—ˆ๋‹ค. ๊ฐ•์กฐ ๋‹จ๊ณ„๋ฅผ 400ยท500ยท600์œผ๋กœ ๋‚ฎ์ท„๋‹ค.
193
+ - ๊ฐ™์€ ๋‚  ๋‘ ๋ฒˆ์งธ ๊ฒฐ์ •("๊ตต๊ธฐ ์ข€๋” ์ค„์—ฌ"): ์ œ๋ชฉ์„ 500, ํฐ ์ œ๋ชฉ(level1ยท2)์„ 600์œผ๋กœ ํ•œ ๋‹จ๊ณ„์”ฉ ๋” ๋‚ฎ์ท„๋‹ค. `strong`์€ ์ œ๋ชฉ ๊ตต๊ธฐ๋ฅผ ๋”ฐ๋ผ 500์ด ๋˜์–ด `medium`๊ณผ ๊ฐ™๋‹ค(`typography.title.fontWeight` ์ฐธ์กฐ). 600์€ ํฐ ์ˆซ์žยท์„ ํƒ ์ƒํƒœ์—๋งŒ ์“ด๋‹ค(ํฐ ์ œ๋ชฉ 600 ๋‹จ๊ณ„๋Š” ๊ฐ™์€ ๋‚  ํฐ ๊ธ€์ž ๋‹จ๊ณ„์™€ ํ•จ๊ป˜ ํ์ง€).
@@ -84,7 +84,7 @@ import { Timeline } from "@hjmds/react-native/data-display";
84
84
  | --- | --- | --- |
85
85
  | ํฌ๊ธฐ | ๊ฐ ํ•ญ๋ชฉ์€ [๋ ˆ์ผ 16][๋ณธ๋ฌธ] ๋‘ ์—ด. ๋ ˆ์ผ์€ ์ง€๋ฆ„ 10์˜ dot๊ณผ ๋‹ค์Œ ํ•ญ๋ชฉ๊นŒ์ง€ ์ด์–ด์ง€๋Š” 1px connector. ํ•ญ๋ชฉ์€ ๋ˆ„๋ฅผ ์ˆ˜ ์—†์–ด ํ„ฐ์น˜ ์˜์—ญ ์š”๊ตฌ๊ฐ€ ์—†๊ณ  ํ–‰ ์•ˆ์— ๋ฒ„ํŠผ์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค | `timelineRecipe`, `.hjm-timeline__item`ยท`__dot`ยท`__connector` |
86
86
  | ๊ฐ„๊ฒฉ | ํ•ญ๋ชฉ ์‚ฌ์ด `spacing.md` 16, ๋ ˆ์ผ๊ณผ ๋ณธ๋ฌธ ์—ด ๊ฐ„๊ฒฉ `spacing.sm` 12, ๋ณธ๋ฌธ ์ค„ ๊ฐ„๊ฒฉ `spacing.xxs` 4 | `timelineRecipe.gap`, `.hjm-timeline*` |
87
- | ์ˆœ์„œยท์ •๋ ฌ | ๋ณธ๋ฌธ์€ labelยทtimestamp ์ค„ โ†’ description. Web์€ label๊ณผ timestamp๋ฅผ ํ•œ ์ค„ ์–‘ ๋์— ๋‘”๋‹ค | `.hjm-timeline__heading` |
87
+ | ์ˆœ์„œยท์ •๋ ฌ | ๋ณธ๋ฌธ์€ labelยทtimestamp ์ค„ โ†’ description. Web์€ label๊ณผ timestamp๋ฅผ ํ•œ ์ค„ ์–‘ ๋์— ๋‘”๋‹ค. dotยทlabel ์ฒซ ์ค„ยทtimestamp๋Š” label ์ฒซ ์ค„(`body` ์ค„ ๋†’์ด)์˜ ๊ฐ€์šด๋ฐ์— ๋งž์ถ˜๋‹ค(Web `1lh`, Native ํ† ํฐร—๊ธ€์ž ๋ฐฐ์œจ). label์ด ์—ฌ๋Ÿฌ ์ค„์ด๋ฉด dotยทtimestamp๋Š” ์ฒซ ์ค„ ์˜†์— ๋‚จ๋Š”๋‹ค | `.hjm-timeline__heading`ยท`__dot`ยท`__timestamp`, Native `Timeline` |
88
88
  | ๊ณ ์ •ยท์Šคํฌ๋กค | ๋ณธ๋ฌธ ์Šคํฌ๋กค ์˜์—ญ ์•ˆ์˜ ํ•œ ์„น์…˜์œผ๋กœ ํญ์„ ๊ฝ‰ ์ฑ„์šด๋‹ค. ๋” ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋Š” Timeline ์•„๋ž˜์— [LoadMore](load-more.md) | โ€” |
89
89
  | ์ข์€ ํญยทํฐ ๊ธ€์ž | Web์€ ์ข์œผ๋ฉด timestamp๊ฐ€ ๋‹ค์Œ ์ค„๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค(`flex-wrap`). ํฐ ๊ธ€์ž์—์„œ๋„ ๊ธ€์„ ์ž๋ฅด์ง€ ์•Š๋Š”๋‹ค | `.hjm-timeline__heading`ยท`__label` |
90
90
 
@@ -103,3 +103,7 @@ import { Timeline } from "@hjmds/react-native/data-display";
103
103
  | ๊ตฌ์กฐ | `<ol>` / `<li>`, dotยทconnector `aria-hidden` | `View` ํ–‰, railยท๋ณธ๋ฌธ์€ ์ ‘๊ทผ์„ฑ ํŠธ๋ฆฌ์—์„œ ์ˆจ๊น€ |
104
104
  | ํ•ญ๋ชฉ ์ ‘๊ทผ ์ด๋ฆ„ | `<li aria-label={accessibleName}>` | `accessibleName, timestamp, description`์„ ์ด์–ด ๋ถ™์ธ `accessibilityLabel` |
105
105
  | ref | `HTMLOListElement`๋กœ ์ „๋‹ฌ | ์—†์Œ(ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ) |
106
+
107
+ ## ๊ทผ๊ฑฐ
108
+
109
+ - ์ฒซ ์ค„ ๊ฐ€์šด๋ฐ: 2026-10-17 ์ •๋ ฌ ์‹ค์ธก(Web 402). dot 396 ยท label 397 ยท timestamp 398.5๋กœ ์–ด๊ธ‹๋‚ฌ๋‹ค(dot์€ 4px ๊ณ ์ • ์—ฌ๋ฐฑ, timestamp๋Š” ์ž‘์€ ๊ธ€์ž๊ฐ€ ๊ธฐ์ค€์„ ์„ ๊ณต์œ ). Native๋Š” dot์ด ๋งจ ์œ„์— ๋ถ™์—ˆ๋‹ค. ์ˆ˜์ • ํ›„ Web 402ยท1280์—์„œ ์„ธ ์š”์†Œ๊ฐ€ 397/397/397, 377/377/377๋กœ ์ธก์ •๋๋‹ค.
@@ -4,7 +4,7 @@
4
4
  - ์ƒํƒœ: ๋ฐฐํฌ
5
5
  - ์ง€์›: Web ยท Native
6
6
  - ์ ์šฉ: 1.12.1
7
- - ๊ฒ€ํ† ์ผ: 2026-10-13
7
+ - ๊ฒ€ํ† ์ผ: 2026-10-17
8
8
  - ๊ทผ๊ฑฐ: [Toast](../../toast.md), [Liquid Toast](../../../../react-native/docs/liquid-toast.md), `src/component-recipes.ts`(`toastRecipe`)
9
9
  - ์Šคํ† ๋ฆฌ๋ถ: `๋ฐฐํฌ/์ปดํฌ๋„ŒํŠธ/์ƒํƒœ์™€ ์•Œ๋ฆผ/ํ† ์ŠคํŠธ`, `๋ฐฐํฌ/์ปดํฌ๋„ŒํŠธ/์ƒํƒœ์™€ ์•Œ๋ฆผ/๋ฆฌํ€ด๋“œ ํ† ์ŠคํŠธ`, `๋ฐฐํฌ/๊ตฌ์„ฑ/ํ”ผ๋“œ๋ฐฑ๊ณผ ๋ณต๊ตฌ/๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ƒํƒœ`
10
10
 
@@ -119,6 +119,8 @@ Native์˜ ์„ ํƒํ˜• `/toast-liquid`๋„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ”„๋กœํ•„์˜ `radius.xl`
119
119
  | ํ•ญ๋ชฉ | ๊ฐ’ | ๊ทผ๊ฑฐ |
120
120
  | --- | --- | --- |
121
121
  | ํฌ๊ธฐ | ์นด๋“œ ์ตœ๋Œ€ ํญ 420(Web `min(420px, 100vw โˆ’ 2ร—spacing.md)`, Native ํ™”๋ฉด ํญ โˆ’ ์•ˆ์ „ ์˜์—ญ โˆ’ 2ร—16์—์„œ 420์œผ๋กœ ์ž๋ฆ„). ์ตœ์†Œ ๋†’์ด 56(`layout.rowHeight.singleLine`). ๋ชจ์„œ๋ฆฌ `radius.xl` 24(ํŒจ๋„, ๋ฏธ๊ฒŒ์‹œ 1.17.2 ์ดํ›„. ๊ทธ์ „ `lg` 16). ์—ด์€ [์•„์ด์ฝ˜ ๋ฐฐ์ง€ 32 ๋˜๋Š” `media` 44][๋ฌธ๊ตฌ][๋‹ซ๊ธฐ 44]. `action`์€ ๋†’์ด 44(`control.minTouchTarget`), ์ขŒ์šฐ ์—ฌ๋ฐฑ `spacing.md` 16์˜ pill. `progress` ์  6(ํ˜„์žฌ ๋‹จ๊ณ„ 1.4๋ฐฐ) | `toastRecipe.viewport`ยท`surface`ยท`icon`ยท`action`, `.hjm-toast`, `react-native/src/feedback.tsx` |
122
+ | ์•ˆ์ชฝ ์—ฌ๋ฐฑ | ์นด๋“œ ์œ„์•„๋ž˜ `spacing.sm` 12, ์ขŒ์šฐ ์–‘์ชฝ `spacing.md` 16(`toastRecipe.surface.padding`, ๋ฏธ๊ฒŒ์‹œ). ๋‹ซ๊ธฐ๋Š” 44 ํ„ฐ์น˜ ์˜์—ญ์„ ์œ ์ง€ํ•˜๋˜ ๋ ์ชฝ์œผ๋กœ (44 โˆ’ ๊ธ€๋ฆฌํ”„ 14)/2 = 15๋งŒํผ ์—ฌ๋ฐฑ์— ๊ฒน์ณ(`close.inlineOverhang`) ร— ๊ธ€๋ฆฌํ”„ ๋์ด ์นด๋“œ ๋์—์„œ 16 โ€” ๋ฐฐ์ง€์˜ ์‹œ์ž‘ ์—ฌ๋ฐฑ 16๊ณผ ๊ฐ™๋‹ค. RTL์—์„œ๋„ ๋…ผ๋ฆฌ ๋ฐฉํ–ฅ(์‹œ์ž‘ยท๋)์œผ๋กœ ๋Œ€์นญ์ด๋‹ค. `action`ยท`progress`๋Š” ๋ฌธ๊ตฌ ์—ด์— ๋งž์ถ˜๋‹ค | `toastRecipe.surface`ยท`close`, `.hjm-toast`ยท`.hjm-toast__close`, `react-native/src/feedback.tsx` |
123
+ | ์ฒซ ์ค„ ๊ธฐ์ค€ | ๋ฐฐ์ง€ 32 ์ƒ์ž(`toastRecipe.anchor.blockSize`)๊ฐ€ ๊ธฐ์ค€์„ ์ด๋‹ค. ์ฒซ ์ค„(์ œ๋ชฉ, ์—†์œผ๋ฉด ์„ค๋ช…)์€ (32 โˆ’ ๊ทธ ์ค„์˜ ํ–‰๊ฐ„)/2๋งŒํผ ๋‚ด๋ ค ๋ฐฐ์ง€ ๊ฐ€์šด๋ฐ์— ๋งž์ถ”๊ณ , ๋‹ซ๊ธฐ๋Š” ์œ„์•„๋ž˜ โˆ’(44 โˆ’ 32)/2 = โˆ’6(`close.blockOverhang`)์œผ๋กœ ๊ฐ™์€ ๊ฐ€์šด๋ฐ์— ๋‘” ์ฑ„ ํ–‰์„ ๋Š˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ํ•œ ์ค„์ด๋ฉด 12 + 32 + 12 = 56์— ๋ฐฐ์ง€ยท๊ธ€์žยท๋‹ซ๊ธฐ ๊ฐ€์šด๋ฐ๊ฐ€ ๋ชจ๋‘ 28. ์—ฌ๋Ÿฌ ์ค„์ด๋ฉด ๋ฐฐ์ง€ยท๋‹ซ๊ธฐ๋Š” ์ฒซ ์ค„ ์˜†์— ๋‚จ๊ณ  ๋‚˜๋จธ์ง€ ์ค„์€ ์•„๋ž˜๋กœ ์ž๋ž€๋‹ค(๋ฌธ๊ตฌ ๋ฉ์–ด๋ฆฌ ์ „์ฒด์˜ ๊ฐ€์šด๋ฐ์— ๋งž์ถ”์ง€ ์•Š๋Š”๋‹ค). `media` 44๋Š” ๊ฐ™์€ ์œ„์ชฝ์—์„œ ์‹œ์ž‘ํ•˜๊ณ  ๊ธฐ์ค€ ์ƒ์ž๊ฐ€ ์•„๋‹ˆ๋‹ค โ€” ์ œ๋ชฉ์„ media ๊ฐ€์šด๋ฐ์— ๋งž์ถ”๋ฉด ์„ค๋ช…์ด ์•„๋ฐ”ํƒ€ ์•„๋ž˜๋กœ ๋ฐ€๋ ค๋‚˜์„œ๋‹ค. Web์€ ์ฒซ ์ค„์˜ `1lh`, Native๋Š” body ํ† ํฐ ํ–‰๊ฐ„ ร— ํ˜„์žฌ ๊ธ€์ž ๋ฐฐ์œจ๋กœ ๊ณ„์‚ฐํ•ด ํ”„๋กœํ•„ยท๊ธ€์ž ํ™•๋Œ€์—์„œ๋„ ๋งž๋Š”๋‹ค | `toastRecipe.anchor`ยท`close`, `.hjm-toast__content`, `react-native/src/feedback.tsx` |
122
124
  | ๊ฐ„๊ฒฉ | ํ™”๋ฉด ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ `spacing.md` 16 + ์•ˆ์ „ ์˜์—ญ(`safeAreaMode: "additive"`). ์—ฌ๋Ÿฌ ์žฅ ์‚ฌ์ด `spacing.sm` 12. ์นด๋“œ ์•ˆ ์—ด ๊ฐ„๊ฒฉ `spacing.sm` 12 | `toastRecipe.viewport`, `.hjm-toast-viewport` |
123
125
  | ์ˆœ์„œยท์ •๋ ฌ | ๊ธฐ๋ณธ์€ ์•„๋ž˜ ๊ฐ€์šด๋ฐ(`placement="bottom"`). ์œ„์ชฝ ๋ฐฐ์น˜๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ, ์•„๋ž˜์ชฝ ๋ฐฐ์น˜๋Š” ๊ฐ€์žฅ์ž๋ฆฌ๋ถ€ํ„ฐ ์œ„๋กœ ์Œ“์ธ๋‹ค. ๋ฌธ๊ตฌ ์—ด ์•ˆ ์ˆœ์„œ๋Š” ์ œ๋ชฉ โ†’ ์„ค๋ช… โ†’ `progress` โ†’ `action`. `action`์€ ๋ฌธ๊ตฌ ์•„๋ž˜ ์‹œ์ž‘ ์ชฝ(`toastRecipe.action.align` `start`, ๋ฏธ๊ฒŒ์‹œ 1.17.2 ์ดํ›„. ๊ทธ์ „ ๋‘˜์งธ ์ค„ ๋) | `toastRecipe.placements`, `.hjm-toast__action` |
124
126
  | ๊ณ ์ •ยท์Šคํฌ๋กค | ํ™”๋ฉด ํ๋ฆ„ ๋ฐ–์— ๋–  ์žˆ๋Š” ์ธต์ด๋ผ ๋ณธ๋ฌธ ๋ ˆ์ด์•„์›ƒ์— ์ž๋ฆฌ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ํ•˜๋‹จ ๊ณ ์ • ๋ฐ”(BottomNavigationยทBottomCTA)๊ฐ€ ์žˆ์œผ๋ฉด Web `bottomOffset`(px ๋˜๋Š” CSS ๊ธธ์ด), Native `keyboardOffset`์œผ๋กœ ๊ทธ ์œ„์— ๋„์šด๋‹ค. Native ์•„๋ž˜์ชฝ ๋ฐฐ์น˜๋Š” `avoidKeyboard`(๊ธฐ๋ณธ true)๋กœ ํ‚ค๋ณด๋“œ ์œ„์— ์„ ๋‹ค | `react/src/toast.tsx`, `react-native/src/feedback.tsx`(`ToastRegion`) |
@@ -202,3 +204,10 @@ Native์˜ ์„ ํƒํ˜• `/toast-liquid`๋„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ”„๋กœํ•„์˜ `radius.xl`
202
204
  Web์€ ์ „์ฒด ์˜์—ญ์˜ ํˆฌ๋ช…ํ•œ button๊ณผ ๋‘ ์ œ์–ด ๋ฒ„ํŠผ์„ ํ˜•์ œ๋กœ, Native๋Š” ๋’ค์ชฝ Pressable๊ณผ ์œ„์ชฝ ์ œ์–ด ๋ฒ„ํŠผ์„
203
205
  ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค. label์€ ๋™์ž‘ ์ด๋ฆ„, ์„ค๋ช…์€ ๊ธฐ์กด ์•Œ๋ฆผ ๋ฌธ๊ตฌ์ด๋ฉฐ ๊ธฐ๋ณธ ์นด๋“œ ๋ฐฐ์น˜์™€ ํฌ๊ธฐ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.
204
206
  ๋ผ์šฐํ„ฐ๋Š” HJM์ด ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ์ œํ’ˆ ์ฝœ๋ฐฑ์ด ์‹คํ–‰ํ•œ๋‹ค. ํ™”๋ฉด ์ด๋™ ๋’ค provider๊ฐ€ ์—†์–ด์ ธ๋„ ์ค‘๋ณต ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
207
+
208
+ ## ๊ทผ๊ฑฐ
209
+
210
+ 2026-10-17 ์‚ฌ์šฉ์ž ์ง€์ ("๊ธฐ๋ณธ ํ† ์ŠคํŠธ ์ขŒ์šฐ๋ž‘ ๊ธ€์ž ๋ผ์ธ์ด ์•ˆ๋งž๋Š”๋ฐ"). Web 402 ํ•œ ์ค„ ์•Œ๋ฆผ์—์„œ ์นด๋“œ ์•ˆ์ชฝ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์ง€ ๊ฐ€์šด๋ฐ 28, ๊ธ€์ž 32~33,
211
+ ๋‹ซ๊ธฐ ๊ธ€๋ฆฌํ”„ 30์ด ์„œ๋กœ ๋‹ฌ๋ž๊ณ (๋ฐฐ์ง€ `start`ยท๋ฌธ๊ตฌ `center`ยท๋‹ซ๊ธฐ `start`โˆ’4์˜ ์„ธ ์ •๋ ฌ), ์‹œ์ž‘ ์—ฌ๋ฐฑ 16๊ณผ ๋‹ซ๊ธฐ ๊ธ€๋ฆฌํ”„ ๋ ์—ฌ๋ฐฑ 22๊ฐ€ ๋น„๋Œ€์นญ์ด์—ˆ๋‹ค
212
+ (์—ฌ๋ฐฑ 12/8/12/16 ์•ˆ์— 44 ํ„ฐ์น˜ ์˜์—ญ). Native๋Š” ์‚ฌ๋ฐฉ 16 ์—ฌ๋ฐฑ๊ณผ ๋ฌธ๊ตฌ `center` ์ •๋ ฌ๋กœ ๋”ฐ๋กœ ์–ด๊ธ‹๋‚ฌ๋‹ค. ์ฒซ ์ค„ ๊ธฐ์ค€๊ณผ ๋Œ€์นญ ์—ฌ๋ฐฑ์„ recipe ๊ฐ’์œผ๋กœ ๋‘๊ณ 
213
+ ๋‘ renderer๊ฐ€ ๊ฐ™์€ ๊ฐ’์„ ์ฝ๊ฒŒ ๋ฐ”๊ฟจ๋‹ค. ์ˆ˜์ • ํ›„ ํ•œ ์ค„ยท์—ฌ๋Ÿฌ ์ค„ยทactionยทmediaยทRTL ๋ชจ๋‘ ๊ฐ€์šด๋ฐ 28(ํ…Œ๋‘๋ฆฌ ํฌํ•จ 29), ์–‘์ชฝ ์—ฌ๋ฐฑ 16์œผ๋กœ ์ธก์ •๋๋‹ค.
@@ -86,7 +86,7 @@ NavigationBar์˜ Native ํ”„๋ ˆ์ž„ ๋ชจ์„œ๋ฆฌ๋Š” Provider์˜ `tokens.radius.xl`์„
86
86
  | ํ•ญ๋ชฉ | ๊ฐ’ | ๊ทผ๊ฑฐ |
87
87
  | --- | --- | --- |
88
88
  | ํฌ๊ธฐ | ์ตœ์†Œ ๋†’์ด `control.buttonHeight.large` 52 + ์œ„์ชฝ ์•ˆ์ „ ์˜์—ญ. Web์€ `max(env(safe-area-inset-top), safeAreaTop)`์„ ์œ„ ์—ฌ๋ฐฑ์œผ๋กœ, Native๋Š” `safeAreaTop`์„ `paddingTop`๊ณผ `minHeight`(52 + `safeAreaTop`)์— ๋”ํ•œ๋‹ค. ์ขŒ์šฐ ์—ด ์ตœ์†Œ ํญ `control.minTouchTarget` 44, Native `TopBarAction` ์ตœ์†Œ 44ร—44 | `topBarRecipe.minHeight`ยท`sideMinWidth`ยท`action`, `.hjm-top-bar` |
89
- | ๊ฐ„๊ฒฉ | ์ขŒ์šฐ ์—ฌ๋ฐฑ `spacing.md` 16, ์Šฌ๋กฏ ์‚ฌ์ดยท์Šฌ๋กฏ ์•ˆ ํ–‰๋™ ์‚ฌ์ด `spacing.xs` 8. `TopBarAction` ์•„์ด์ฝ˜โ€“๋ผ๋ฒจ `spacing.xxs` 4, ์ขŒ์šฐ ์—ฌ๋ฐฑ 4. ๋ฐฐ๊ฒฝ `canvas` | `topBarRecipe.paddingHorizontal`ยท`gap`ยท`action` |
89
+ | ๊ฐ„๊ฒฉ | ์ขŒ์šฐ ์—ฌ๋ฐฑ `spacing.md` 16, ์Šฌ๋กฏ ์‚ฌ์ดยท์Šฌ๋กฏ ์•ˆ ํ–‰๋™ ์‚ฌ์ด `spacing.xs` 8. `NavigationBar`๋Š” ๋ฐ” ์•ˆ์ชฝ ์—ฌ๋ฐฑ `spacing.sm` 12๋ฅผ ๋ธŒ๋žœ๋“œ ์‹œ์ž‘๊ณผ ๋ ํ–‰๋™์— ๋˜‘๊ฐ™์ด ์“ฐ๊ณ  ๋ธŒ๋žœ๋“œ์— ๋ณ„๋„ inset์„ ๋‘์ง€ ์•Š๋Š”๋‹ค(WebยทNative). `TopBarAction` ์•„์ด์ฝ˜โ€“๋ผ๋ฒจ `spacing.xxs` 4, ์ขŒ์šฐ ์—ฌ๋ฐฑ 4. ๋ฐฐ๊ฒฝ `canvas` | `topBarRecipe.paddingHorizontal`ยท`gap`ยท`action` |
90
90
  | ์ˆœ์„œยท์ •๋ ฌ | ์„ธ ์—ด: `leading`(๋’ค๋กœยท๋‹ซ๊ธฐ) ยท ์ œ๋ชฉ ยท `actions`(๋ ์ •๋ ฌ). `centered`(๊ธฐ๋ณธ `true`)๋Š” ๋‚จ์€ ์ œ๋ชฉ ์˜์—ญ ์•ˆ์—์„œ ๊ฐ€์šด๋ฐ ์ •๋ ฌ. ์™ผ์ชฝ ์ •๋ ฌ์€ `centered={false}`๋กœ ๊ณ ๋ฅธ๋‹ค. ํ–‰๋™์€ 1~2๊ฐœ๋งŒ ๋ ์—ด์—, ๋„˜์น˜๋ฉด ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ๊ณ  [Menu](menu.md)๋กœ ๋ฌถ๋Š”๋‹ค. ์ฃผ ํ–‰๋™(์ €์žฅยท์™„๋ฃŒ)์€ ๋ ์—ด์˜ ๋งˆ์ง€๋ง‰ | `.hjm-top-bar` grid, Native `TopBar` |
91
91
  | ๊ณ ์ •ยท์Šคํฌ๋กค | ํ™”๋ฉด ๋งจ ์œ„, ์Šคํฌ๋กค ์˜์—ญ **๋ฐ–**์— ๋‘”๋‹ค. TopBar ์ž์ฒด๋Š” `position: sticky`/๊ณ ์ •์„ ๊ฑธ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ™”๋ฉด ๊ณจ๊ฒฉ์ด ๊ทธ ์•„๋ž˜์— ์Šคํฌ๋กค ์˜์—ญ์„ ๋‘ฌ์•ผ ๊ณ ์ •๋œ๋‹ค. ๋ฐ”๋กœ ์•„๋ž˜ ๋ณธ๋ฌธ ์ฒซ ๋ธ”๋ก์€ [Top](top.md) | `.hjm-top-bar`(position ์—†์Œ) |
92
92
  | ์ข์€ ํญยทํฐ ๊ธ€์ž | ๊ธ€์ž ๋ฐฐ์œจ โ‰ฅ `largeTextThreshold` 1.6: Web์€ ์ฒซ ํ–‰ leadingยทํ–‰๋™, ๋‘˜์งธ ํ–‰ ์ œ๋ชฉ(์‹œ์ž‘ ์ •๋ ฌ, ์œ„์•„๋ž˜ `spacing.xs` 8). Native๋Š” ์ฒซ ํ–‰ leading+์ œ๋ชฉ, ๋‘˜์งธ ํ–‰ ํ–‰๋™(๋ ์ •๋ ฌ, ์ค„๋ฐ”๊ฟˆ ํ—ˆ์šฉ) | `.hjm-top-bar[data-large-text]`, `react-native/src/navigation.tsx` `TopBar` |
@@ -130,3 +130,7 @@ NavigationBar์˜ Native ํ”„๋ ˆ์ž„ ๋ชจ์„œ๋ฆฌ๋Š” Provider์˜ `tokens.radius.xl`์„
130
130
  `title`, `subtitle`, `titleLeading`, ์ œ๋ชฉ ํด๋ฆญ/์ ‘๊ทผ์„ฑ props์™€ ํ•จ๊ป˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
131
131
  ์‹คํ–‰ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์˜ ํŽผ์นจ ์นฉ์„ ์•ฑ์ด ์ž์ฒด ํ—ค๋”๋กœ ๋‹ค์‹œ ์กฐ๋ฆฝํ•˜๋˜ ๋ฌธ์ œ๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ–ˆ๋‹ค.
132
132
  ์ƒ‰์€ ๊ธฐ์กด provider์˜ ๋ธŒ๋žœ๋“œ/semantic palette ๋ฒ”์œ„๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
133
+
134
+ ## ๊ทผ๊ฑฐ
135
+
136
+ - NavigationBar ์–‘๋ ์—ฌ๋ฐฑ: 2026-10-17 ์ •๋ ฌ ์‹ค์ธก(Web 1280). ๋ธŒ๋žœ๋“œ์— `spacing.xs` 8์ด ๋”ํ•ด์ ธ ์‹œ์ž‘ 21, ๋ ํ–‰๋™ 13์œผ๋กœ ๋น„๋Œ€์นญ์ด์—ˆ๋‹ค. Native ๋ธŒ๋žœ๋“œ์—๋Š” ์ถ”๊ฐ€ inset์ด ์—†์—ˆ๋‹ค. Web ๋ธŒ๋žœ๋“œ inset์„ ์—†์•ค ๋’ค ์–‘๋ 13/13์œผ๋กœ ์ธก์ •๋๋‹ค.
@@ -90,6 +90,6 @@ import { Top } from "@hjmds/react-native/top";
90
90
 
91
91
  ### ํ”„๋กœํ•„ ๋ชจ์„œ๋ฆฌยท์ œ๋ชฉ ์†Œ๋น„
92
92
 
93
- 2026-10-07 ์†Œ๋น„ ๊ฐ์‚ฌ์—์„œ ๋‘ renderer์˜ ์ œ๋ชฉ ํฌ๊ธฐยทํ–‰๊ฐ„ยท๊ตต๊ธฐ๊ฐ€ foundation์œผ๋กœ ํ™•์ •๋œ recipe๋ฅผ ์ง์ ‘ ์ฝ์–ด ํ”„๋กœํ•„์„ ์šฐํšŒํ–ˆ๋‹ค. `large`๋Š” ๊ฐ€๊นŒ์šด ํ”„๋กœํ•„์˜ `heading.level2`, `medium`์€ `typography.titleLarge`๋ฅผ ์ฝ๊ณ  ํ”„๋กœํ•„์ด ์—†์œผ๋ฉด ๊ธฐ์กด recipe๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์‹œ๊ฐ ์—ญํ• ์€ `headingLevel`๊ณผ ๋…๋ฆฝ์ด๋ฉฐ display ์„œ์ฒดยท์ œ๋ชฉ ์˜๋ฏธยท๋ณด์กฐ ํ–‰๋™ยท์ดˆ์ ์€ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.
93
+ 2026-10-07 ์†Œ๋น„ ๊ฐ์‚ฌ์—์„œ ๋‘ renderer์˜ ์ œ๋ชฉ ํฌ๊ธฐยทํ–‰๊ฐ„ยท๊ตต๊ธฐ๊ฐ€ foundation์œผ๋กœ ํ™•์ •๋œ recipe๋ฅผ ์ง์ ‘ ์ฝ์–ด ํ”„๋กœํ•„์„ ์šฐํšŒํ–ˆ๋‹ค. `large`๋Š” ๊ฐ€๊นŒ์šด ํ”„๋กœํ•„์˜ `heading.level3`(24, 2026-10-17 ํฐ ๊ธ€์ž ๋‹จ๊ณ„ ํ์ง€ ์ „์—๋Š” `level2` 32), `medium`์€ `typography.titleLarge`๋ฅผ ์ฝ๊ณ  ํ”„๋กœํ•„์ด ์—†์œผ๋ฉด ๊ธฐ์กด recipe๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์‹œ๊ฐ ์—ญํ• ์€ `headingLevel`๊ณผ ๋…๋ฆฝ์ด๋ฉฐ display ์„œ์ฒดยท์ œ๋ชฉ ์˜๋ฏธยท๋ณด์กฐ ํ–‰๋™ยท์ดˆ์ ์€ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.
94
94
 
95
95
  ํ”„๋กœํ•„ ์—ฐ๊ฒฐ์€ 1.16.0 ๋ณ€๊ฒฝ์ด๋ฉฐ, ๊ธฐ๋ณธ ๋ฐฐํฌ ๊ณ„์•ฝ๊ณผ ์‹ค์ œ Native ๊ธฐ๊ธฐ ๊ฒ€์ฆ์€ ๊ตฌ๋ถ„ํ•œ๋‹ค.
@@ -78,7 +78,7 @@ import { UploadItem } from "@hjmds/react-native/upload-item";
78
78
  | --- | --- | --- |
79
79
  | ํฌ๊ธฐ | ์ตœ์†Œ ๋†’์ด `layout.rowHeight.twoLine` 68, ์œ„์•„๋ž˜ ์—ฌ๋ฐฑ `row.paddingVertical` `spacing.xs` 8(๋‘ ํ”Œ๋žซํผ). ํ–‰๋™ ๋ฒ„ํŠผ ์ตœ์†Œ 44ร—44. ํ…Œ๋‘๋ฆฌ 1px, `radius.md` 12์ธ ์นด๋“œ ๋ชจ์–‘ | `uploadItemRecipe.row`, `.hjm-upload-item`, `react-native/src/upload-item.tsx` |
80
80
  | ๊ฐ„๊ฒฉ | ์š”์†Œ ์‚ฌ์ด `spacing.sm` 12, ์ขŒ์šฐ ์—ฌ๋ฐฑ `spacing.md` 16. ํ–‰ ์‚ฌ์ด ๊ฐ„๊ฒฉยท๋ชฉ๋ก ํ‹€์€ ์ œํ’ˆ์ด ์ •ํ•œ๋‹ค(HJM ๋ชฉ๋ก ๋ ˆ์ด์•„์›ƒ ์—†์Œ) | `uploadItemRecipe.row` |
81
- | ์ˆœ์„œยท์ •๋ ฌ | `leading`(์•„์ด์ฝ˜ยท์ธ๋„ค์ผ) โ†’ ์ด๋ฆ„ยท๋ฉ”ํƒ€ยท์ง„ํ–‰/์ƒํƒœ โ†’ ๋์˜ ํ–‰๋™ ๋ฒ„ํŠผ(์ทจ์†Œยท์žฌ์‹œ๋„). ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด ๊ณ ๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์„ธ๋กœ๋กœ ์Œ“๋Š”๋‹ค | `react/src/upload-item.tsx`, `.hjm-upload-item__action`(margin-inline-start: auto) |
81
+ | ์ˆœ์„œยท์ •๋ ฌ | `leading`(์•„์ด์ฝ˜ยท์ธ๋„ค์ผ) โ†’ ์ด๋ฆ„ยท๋ฉ”ํƒ€ยท์ง„ํ–‰/์ƒํƒœ โ†’ ๋์˜ ํ–‰๋™ ๋ฒ„ํŠผ(์ทจ์†Œยท์žฌ์‹œ๋„). ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด ๊ณ ๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์„ธ๋กœ๋กœ ์Œ“๋Š”๋‹ค ๋ ํ–‰๋™ ๋ฒ„ํŠผ์€ `edge="end"`๋ผ ์•„์ด์ฝ˜ ์นธ์ด ๋ ์—ฌ๋ฐฑ 16์— ์™€์„œ ์‹œ์ž‘ ์ชฝ ์ด๋ฆ„ ์—ฌ๋ฐฑ๊ณผ ๊ฐ™๋‹ค(Web 26 โ†’ 16, Native ์•ฝ 33 โ†’ 16). Native ์•„์ด์ฝ˜์€ ๊ธ€๊ผด "ร—"ยท"โ†ป" ๋Œ€์‹  ๊ทธ๋ฆฐ closeยทrefresh๋กœ ๋ฒ„ํŠผ ๊ฐ€์šด๋ฐ์— ์˜จ๋‹ค(์ „์—๋Š” ์นด๋“œ ๊ฐ€์šด๋ฐ๋ณด๋‹ค ์•ฝ 5 ์•„๋ž˜, 2026-10-17 ์‹ค์ธก ๊ฐ์‚ฌ, [IconButton `edge`](icon-button.md#๋ฐฐ์น˜)) | `react/src/upload-item.tsx`, `.hjm-upload-item__action`(margin-inline-start: auto) |
82
82
  | ๊ณ ์ •ยท์Šคํฌ๋กค | ํŒŒ์ผ์„ ๊ณ ๋ฅด๋Š” [FilePicker](file-picker.md) ๋ฐ”๋กœ ์•„๋ž˜, ๋ณธ๋ฌธ๊ณผ ํ•จ๊ป˜ ์Šคํฌ๋กค | โ€” |
83
83
  | ์ข์€ ํญยทํฐ ๊ธ€์ž | Web์€ ๋ณธ๋ฌธ ๋ธ”๋ก์ด 14rem ์•„๋ž˜๋กœ ์ค„๋ฉด ํ–‰๋™ ๋ฒ„ํŠผ์ด ๋‹ค์Œ ์ค„ ๋์œผ๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค. Native๋Š” ํ•œ ์ค„์„ ์œ ์ง€ํ•˜๊ณ  ์ด๋ฆ„์ด ์ค„๋ฐ”๊ฟˆ๋œ๋‹ค | `.hjm-upload-item__body`(flex: 1 1 14rem), `.hjm-upload-item`(flex-wrap) |
84
84
 
@@ -33,7 +33,7 @@
33
33
  | ์˜์—ญ | ์ปดํฌ๋„ŒํŠธ | ์œ„์น˜ | ํฌ๊ธฐยท๊ฐ„๊ฒฉ |
34
34
  | --- | --- | --- | --- |
35
35
  | ๋ฐ”๊นฅ ํ‹€ | Stack. Web์€ ์ œํ’ˆ ํ™”๋ฉด์˜ `Container size="reading"` ์•ˆ | ํ™”๋ฉด์˜ ๋ณธ๋ฌธ ํ๋ฆ„ | gap md=16px, ํญ์€ Container๋ฅผ ๋”ฐ๋ฅธ๋‹ค(Web ์ตœ๋Œ€ `layout.readingMaxWidth` 720) |
36
- | ํŒจ๋„ ์ œ๋ชฉ | `Heading level="level5"` | ํŒจ๋„ Surface ๋งจ ์œ„ | `title` ๊ธ€์ž ํฌ๊ธฐยทsemibold |
36
+ | ํŒจ๋„ ์ œ๋ชฉ | `Heading level="level5"` | ํŒจ๋„ Surface ๋งจ ์œ„ | `title` ๊ธ€์ž ํฌ๊ธฐยทmedium(500) |
37
37
  | ๋‚ด์šฉ | ํ•ด๋‹น ๊ณต๊ฐœ API | ์ž…๋ ฅ๊ณผ ํ–‰๋™ ์‚ฌ์ด | ์ž์ฒด recipe ํฌ๊ธฐ, ์ค„๋ฐ”๊ฟˆ ํ—ˆ์šฉ |
38
38
  | ํ–‰๋™ | Button/๊ธฐ์กด ์ปจํŠธ๋กค | ๊ด€๋ จ ํ•ญ๋ชฉ ๋ฐ”๋กœ ๋’ค | inline์ผ ๋•Œ wrap, md=16px |
39
39
 
@@ -82,3 +82,7 @@ Storybook์˜ ๊ธฐ์กด gutter ๋•Œ๋ฌธ์— contentInset=none์„ ์“ฐ๊ณ , ๋งˆ์ง€๋ง‰ ์ž…
82
82
  ์Šคํฌ๋กค ๊ฒฝ๊ณ„์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋„๋ก ๋ณธ๋ฌธ ๋์— spacing.md(16) ์—ฌ๋ฐฑ์„ ๋‘”๋‹ค.
83
83
  ๋ณธ๋ฌธ ์กฐํ•ฉ ์ž์ฒด์— ๋‘ ๋ฒˆ์งธ scroll view๋ฅผ ๋งŒ๋“ค์ง€ ๋ง๊ณ  ์ œํ’ˆ์˜ ๊ธฐ์กด ํ™”๋ฉด host๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
84
84
  KeyboardAvoiding์€ ์•„๋ž˜ ์—ฌ๋ฐฑ์„ ์ œ๊ณตํ•˜๋ฉฐ ํฌ์ปค์Šค๋œ ํ•„๋“œ๋ฅผ ์ž๋™ ํƒ์ƒ‰ํ•˜๋Š” API๋Š” ์•„๋‹ˆ๋‹ค.
85
+
86
+ ## ๊ทผ๊ฑฐ
87
+
88
+ 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •("๊ตต๊ธฐ ์ข€๋” ์ค„์—ฌ"): ๋ชจ๋“  ๊ธ€์ž ๊ตต๊ธฐ๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์ท„๋‹ค. ํฐ ์ˆซ์žยท์„ ํƒ ์ƒํƒœ 600(ํฐ ์ œ๋ชฉ ๋‹จ๊ณ„๋Š” ๊ฐ™์€ ๋‚  ํ์ง€), ์ œ๋ชฉยท๊ฐ•์กฐ 500, label 500, ๋ณธ๋ฌธ 400์ด๋ฉฐ ์ •๋ณธ์€ [ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ](../tokens/typography.md)๋‹ค.
@@ -64,7 +64,7 @@
64
64
  | ์†Œ์š” ์‹œ๊ฐ„ | DurationField | ์„ค๋ช… ์•„๋ž˜ | NumberField ์„ธ ์นธ, ์นธ ์‚ฌ์ด `spacing.md` 16. ์„ธ ์นธ์ด ๋ชจ๋‘ ๋“ค์–ด๊ฐ€๋ฉด ํ•œ ์ค„(์นธ ์ตœ๋Œ€ `fieldGroupRecipe.inline.maxWidth`), ์•„๋‹ˆ๋ฉด ์„ธ ์นธ ๋ชจ๋‘ ์„ธ๋กœ([FieldGroup](field-group.md)) |
65
65
  | ํ™•์ธ | InlineConfirm | ํŠธ๋ฆฌ๊ฑฐ ์ž๋ฆฌ ๊ทธ๋Œ€๋กœ | ํŠธ๋ฆฌ๊ฑฐ์™€ ํ™•์ธ ํ–‰๋™์ด ๊ฐ™์€ ์ž๋ฆฌ, Button ๋†’์ด 44, ์งˆ๋ฌธยท๋ฒ„ํŠผ ์ค„ ์‚ฌ์ด์™€ ๋‘ ๋ฒ„ํŠผ ์‚ฌ์ด `spacing.sm` 12 |
66
66
  | ๋ฐ˜์‘ | ReactionPicker | ์ œ๋ชฉ ์•„๋ž˜ | `ghost` `pill` Button ๋ฌถ์Œ, ์‚ฌ์ด `spacing.xs` 8, ๋„˜์น˜๋ฉด ์ค„๋ฐ”๊ฟˆ |
67
- | ์•Œ๋ฆผ ์ข… | NotificationBell | ๋ธ”๋ก ๋งจ ์œ„, ์‹œ์ž‘ ์ชฝ ์ •๋ ฌ | IconButton(๊ธฐ๋ณธ `medium` 44) + CounterBadge `floating`(๋ยท์œ„ ๋ชจ์„œ๋ฆฌ) |
67
+ | ์•Œ๋ฆผ ์ข… | NotificationBell | ๋ธ”๋ก ๋งจ ์œ„, ์‹œ์ž‘ ์ชฝ ์ •๋ ฌ. TopBarยทํ—ค๋” ๋์— ๋‘˜ ๋•Œ๋Š” `edge="end"` | IconButton(๊ธฐ๋ณธ `medium` 44) + CounterBadge `floating`(๋ยท์œ„ ๋ชจ์„œ๋ฆฌ). `edge`(`start`ยท`end`ยท`both`)๋Š” IconButton `edge`์™€ ๊ฐ™์€ ๊ฐ’(`resolveIconButtonEdgeOverhang`, 44โˆ’24)/2 = 10์„ ๋ฒจ ๋ฃจํŠธ์— ์ ์šฉํ•ด glyph ์นธ์ด ์—ฌ๋ฐฑ ์„ (TopBar 16)์— ์˜ค๊ณ  ๋ฐฐ์ง€๋Š” ์•„์ด์ฝ˜ ๋ชจ์„œ๋ฆฌ๋ฅผ ์ง€ํ‚จ๋‹ค |
68
68
 
69
69
  ## ํ๋ฆ„๊ณผ ์ƒํƒœ
70
70
 
@@ -197,4 +197,5 @@ function CompoundBlocks() {
197
197
 
198
198
  ## ๊ทผ๊ฑฐ
199
199
 
200
+ - NotificationBell `edge`: 2026-10-17 1.27.2 ์ฑ„ํƒ ์ ๊ฒ€. Spint ํ™ˆยทํƒ์ƒ‰ TopBar ๋์˜ ๋ฒจ์€ IconButton์„ ๊ฐ์‹ธ์ง€๋งŒ `edge`๊ฐ€ ์—†์–ด glyph ์นธ์ด ๋ฐ” ๋์—์„œ 26์— ๋†“์˜€๋‹ค(Web 402ยท1280, LTRยทRTL ์ธก์ • 26 โ†’ 16, Native 3x ํ”„๋ ˆ์ž„: ๋ฒ„ํŠผ ๋ 386 ๊ธฐ์ค€ 15.7). ๋„˜์นจ์€ ์•ˆ์ชฝ ๋ฒ„ํŠผ์ด ์•„๋‹ˆ๋ผ ๋ฒจ ๋ฃจํŠธ์— ์ค€๋‹ค. ๋ฒ„ํŠผ์— ์ฃผ๋ฉด ๋ฃจํŠธ๊ฐ€ 10 ์ค„์–ด ๋์— ๋ถ™์€ ๋ฐฐ์ง€๊ฐ€ ์•„์ด์ฝ˜์—์„œ 10 ์•ˆ์ชฝ์œผ๋กœ ๋ฐ€๋ฆฐ๋‹ค(์ธก์ •: ๋ฐฐ์ง€ ๋ โˆ’ ๋ฒ„ํŠผ ๋ 0 ์œ ์ง€).
200
201
  - 2026-10-17 ๊ตฌ์„ฑ ๋ฆฌ๋ทฐ: ์†Œ์š” ์‹œ๊ฐ„ ์นธ์ด ๋ฐ์Šคํฌํ†ฑ์—์„œ ๋Š˜์–ด๋‚˜๊ณ  ์ข์€ ํญ์—์„œ ํ•œ ์นธ๋งŒ ๋‹ค์Œ ์ค„๋กœ ๋Š๊ฒจ FieldGroup recipe์˜ inline ๊ทœ์น™์„ ๋ฐ”๊ฟจ๋‹ค.
@@ -63,7 +63,7 @@
63
63
  | ํ…Œ๋งˆ | ๋ฐ์€ ๋ชจ๋“œ์—์„œ ๋ณด์ด๋Š” ์ฐจ์ด |
64
64
  | --- | --- |
65
65
  | ๋ฏธ๋‹ˆ๋ฉ€ | ํฐ ๋ฐ”ํƒ•ยท๋ฌด์ฑ„์ƒ‰ hairline, ๊ทธ๋ฆผ์ž ์—†์Œ, ๊ตต๊ธฐ 500 ์ œ๋ชฉ๊ณผ ๋„‰๋„‰ํ•œ ํ–‰๊ฐ„, ๋„“์€ ์•ˆ์ชฝ ์—ฌ๋ฐฑ์˜ ํ…Œ๋‘๋ฆฌ ์นด๋“œ(cards) |
66
- | ์—๋””ํ† ๋ฆฌ์–ผ | ์‹œ์Šคํ…œ serif ์ œ๋ชฉยท๋ณธ๋ฌธ, ๊ฐ€์žฅ ํฐ ์ œ๋ชฉ ๋‹จ๊ณ„(56/42/30px), ๋”ฐ๋œปํ•œ ์ž‰ํฌ์ƒ‰๊ณผ ์™€์ธ ๊ฐ•์กฐ, ๊ฐ์ง„ ๋ชจ์„œ๋ฆฌ, ๊ทœ์น™์„ ์œผ๋กœ ๋‚˜๋ˆˆ rows |
66
+ | ์—๋””ํ† ๋ฆฌ์–ผ | ์‹œ์Šคํ…œ serif ์ œ๋ชฉยท๋ณธ๋ฌธ(์ œ๋ชฉ ํฌ๊ธฐ๋Š” ๊ณตํ†ต ๋‹จ๊ณ„, 2026-10-17 56/42/30px ํ™•๋Œ€ ์ œ๋ชฉ ํ์ง€), ๋”ฐ๋œปํ•œ ์ž‰ํฌ์ƒ‰๊ณผ ์™€์ธ ๊ฐ•์กฐ, ๊ฐ์ง„ ๋ชจ์„œ๋ฆฌ, ๊ทœ์น™์„ ์œผ๋กœ ๋‚˜๋ˆˆ rows |
67
67
  | ํ„ฐ๋ฏธ๋„ | ๋ชจ๋“  ๊ธ€์ž monospace, ๋ชจ์„œ๋ฆฌ 0, ๊ทธ๋ฆผ์ž ์—†์Œ, ๋…นํšŒ์ƒ‰ ๋ฐ”ํƒ•ยท์ง™์€ ๋…น์ƒ‰ ํ–‰๋™ยทํ˜ธ๋ฐ•์ƒ‰ ๊ฐ•์กฐ, ๊ทœ์น™์„  rows. ์–ด๋‘์šด ๋ชจ๋“œ๋Š” ๊ฒ€์ • ์ฝ˜์†” |
68
68
 
69
69
  ## ํ๋ฆ„๊ณผ ์ƒํƒœ
@@ -20,9 +20,9 @@
20
20
  | ์ปดํฌ๋„ŒํŠธ | ์—ญํ•  | ์ง€์นจ |
21
21
  | --- | --- | --- |
22
22
  | `Container` ยท `ScrollView` | ์‹œ์ž‘ ํ™”๋ฉด์˜ ๋ฐ”๊นฅ ํ‹€. HJM ํ™”๋ฉด ๊ณจ๊ฒฉ์ด ์†Œ์œ ํ•œ๋‹ค | [Container](../components/container.md), [ํ™”๋ฉด ์—ฌ๋ฐฑ](../tokens/layout.md) |
23
- | `Heading level="level3"`, `Text` | ์‹œ์ž‘ ํ™”๋ฉด์˜ ์ œ๋ชฉยท์„ค๋ช…. ํ™”๋ฉด ์ œ๋ชฉ์€ semibold `level3`์ด๋ฉฐ bold ํ‘œ์‹œ ์—ญํ•  `level1`ยท`level2`๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค | [Heading](../components/heading.md), [Text](../components/text.md) |
23
+ | `Heading level="level3"`, `Text` | ์‹œ์ž‘ ํ™”๋ฉด์˜ ์ œ๋ชฉยท์„ค๋ช…. ํ™”๋ฉด ์ œ๋ชฉ์€ medium(500) `level3`(24, HJM ๊ธ€์ž ์ƒํ•œ)์ด๋‹ค | [Heading](../components/heading.md), [Text](../components/text.md) |
24
24
  | `Button` primary | ์‹œํŠธ๋ฅผ ์—ฌ๋Š” ํŠธ๋ฆฌ๊ฑฐ(์‹œ์ž‘ ํ™”๋ฉด์˜ ์ฃผ ํ–‰๋™) | [Button](../components/button.md) |
25
- | `Sheet` | ํ•˜๋‹จ ์‹œํŠธ. ์ œ๋ชฉยท๋‹ซ๊ธฐยท`footer`, ์•ˆ์ „ ์˜์—ญยท์Šคํฌ๋กคยท`busy` | [Sheet](../components/sheet.md) |
25
+ | `Sheet` | ํ•˜๋‹จ ์‹œํŠธ. ์ ‘๊ทผ์„ฑ ์ด๋ฆ„(`title`, ๋ณด์ด์ง€ ์•Š์Œ)ยท๋‹ซ๊ธฐยท`footer`, ์•ˆ์ „ ์˜์—ญยท์Šคํฌ๋กคยท`busy` | [Sheet](../components/sheet.md) |
26
26
  | `Steps` | ํ˜„์žฌ ๋‹จ๊ณ„์™€ ์ „์ฒด ๋‹จ๊ณ„ ์ˆ˜, ์‹คํŒจํ•˜๋ฉด ํ˜„์žฌ ๋‹จ๊ณ„ `error` | [Steps](../components/steps.md) |
27
27
  | `ContentTransition preset="slide"` | ๋‹จ๊ณ„ ๋ณธ๋ฌธ ๊ต์ฒด | [ContentTransition](../components/content-transition.md) |
28
28
  | `Heading level="level3"`, `Text` | ๋‹จ๊ณ„ ๋ณธ๋ฌธ | [Heading](../components/heading.md), [Text](../components/text.md) |
@@ -57,7 +57,7 @@
57
57
  | ๋ฐ”๊นฅ ํ‹€ | ์‹œ์ž‘ ํ™”๋ฉด: Web ๋ฌธ์„œ ์Šคํฌ๋กค > `Container size="reading"`, Native `ScrollView` > `Container size="reading"`. ์‹œํŠธ: `Sheet`๊ฐ€ Modal๋กœ ํ™”๋ฉด ์œ„์— ๋œจ๋ฉฐ ์Šคํฌ๋กคยท์•ˆ์ „ ์˜์—ญยทํ‚ค๋ณด๋“œ๋ฅผ ์†Œ์œ  | ์‹œ์ž‘ ํ™”๋ฉด์€ ์ œํ’ˆ ํ™”๋ฉด ๋ณธ๋ฌธ. ์ƒ๋‹จ ์•ˆ์ „ ์˜์—ญ์€ ํ—ค๋”(๋˜๋Š” [TopBar](../components/top-bar.md))๊ฐ€ ๋งก๋Š”๋‹ค | ์ขŒ์šฐ `Container gutter`: ํญ 600 ๋ฏธ๋งŒ `compact` 16, ์ด์ƒ `regular` 20([ํ™”๋ฉด ์—ฌ๋ฐฑ](../tokens/layout.md)). Native ์œ„์•„๋ž˜ `contentContainerStyle` `paddingVertical: spacing.lg` 20. ์‹œํŠธ ์•ˆ inset์€ ์ œํ’ˆ์ด ๋‹ค์‹œ ๋”ํ•˜์ง€ ์•Š๋Š”๋‹ค |
58
58
  | ์‹œ์ž‘ ํ™”๋ฉด | `Stack gap="xl"` | ๋ณธ๋ฌธ ํ๋ฆ„ ์•ˆ | ์ž์‹ ์‚ฌ์ด `spacing.xl` 24 |
59
59
  | ์‹œํŠธ ํ‘œ๋ฉด | `Sheet placement="bottom" size="auto"`(๊ธฐ๋ณธ๊ฐ’) | ํ™”๋ฉด ์•„๋ž˜์—์„œ ์˜ฌ๋ผ์˜ด, ๋‚ด์šฉ ๋†’์ด | radius `xl` 24, ์ตœ๋Œ€ ๋†’์ด 90%. ์ขŒ์šฐ `spacing.lg` 20ยท์œ„์•„๋ž˜ `spacing.sm` 12(๋‘ ํ”Œ๋žซํผ, `sheetRecipe.content`), Web ์ตœ๋Œ€ ํญ 640 |
60
- | ์‹œํŠธ ๋จธ๋ฆฌ | Sheet `title`ยท`closeLabel` | ์‹œํŠธ ๋งจ ์œ„ ๊ณ ์ • | ์ตœ์†Œ ๋†’์ด `control.minTouchTarget` 44 |
60
+ | ์‹œํŠธ ๋จธ๋ฆฌ | Sheet ์†์žก์ด, `title`์€ ๋ณด์ด์ง€ ์•Š๋Š” ์ ‘๊ทผ์„ฑ ์ด๋ฆ„ | ์‹œํŠธ ๋งจ ์œ„ ๊ณ ์ • | ๋ณด์ด๋Š” ์ œ๋ชฉ ์ค„ ์—†์Œ(2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •: ์‹œํŠธ๋Š” ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์ด `title`์„ ์ ‘๊ทผ์„ฑ ์ด๋ฆ„์œผ๋กœ๋งŒ ์“ด๋‹ค) |
61
61
  | ๋‹จ๊ณ„ ํ‘œ์‹œ | `Steps` | ๋ณธ๋ฌธ ๋งจ ์œ„ | ํ•ญ์ƒ ๊ฐ€๋กœ ํ•œ ์ค„, ์•„๋ž˜ `spacing.xl` 24 |
62
62
  | ๋‹จ๊ณ„ ๋ณธ๋ฌธ | `ContentTransition` > `Stack gap="md"` | Steps ์•„๋ž˜, ๋ณธ๋ฌธ ์Šคํฌ๋กค | ์ œ๋ชฉยท์„ค๋ช… ์‚ฌ์ด `spacing.md` 16, `slide` ๊ฐ€๋กœ 16 ์ด๋™ |
63
63
  | ํ–‰๋™ | Sheet `footer` + Button ร—2 | ์‹œํŠธ ์•„๋ž˜ ๊ณ ์ •(์Šคํฌ๋กค ๋ฐ–) | Web ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ ๊ฐ€๋กœ [์ด์ „ ghost][๊ณ„์† primary], ์‚ฌ์ด `spacing.sm` 12. Native ์„ธ๋กœ ์—ด ๊ฝ‰ ์ฐฌ ํญ [๊ณ„์†]โ†’[์ด์ „], ์‚ฌ์ด `spacing.sm` 12, ์œ„ `spacing.sm` 12. ๋†’์ด 44 |
@@ -209,4 +209,6 @@ import { Steps } from "@hjmds/react-native/steps";
209
209
 
210
210
  ## ๊ทผ๊ฑฐ
211
211
 
212
+ 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •("๊ตต๊ธฐ ์ข€๋” ์ค„์—ฌ"): ๋ชจ๋“  ๊ธ€์ž ๊ตต๊ธฐ๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์ท„๋‹ค. ํฐ ์ˆซ์žยท์„ ํƒ ์ƒํƒœ 600(ํฐ ์ œ๋ชฉ ๋‹จ๊ณ„๋Š” ๊ฐ™์€ ๋‚  ํ์ง€), ์ œ๋ชฉยท๊ฐ•์กฐ 500, label 500, ๋ณธ๋ฌธ 400์ด๋ฉฐ ์ •๋ณธ์€ [ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ](../tokens/typography.md)๋‹ค.
213
+
212
214
  - 2026-10-17 ๊ตฌ์„ฑ ๋ฆฌ๋ทฐ: ์‹œ์ž‘ ํ™”๋ฉด ์ œ๋ชฉ์ด heavy 800 `level2`๋กœ ํ™”๋ฉด ์ œ๋ชฉ ๊ทœ์น™(semibold)๋ณด๋‹ค ๋ฌด๊ฑฐ์› ๊ณ , ๋ฐ์Šคํฌํ†ฑ์—์„œ ๋ฒ„ํŠผ๊ณผ ๋ฌธ๊ตฌ๊ฐ€ 1280 ํญ ์ „์ฒด๋กœ ๋Š˜์–ด๋‚ฌ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๋ชฉ์„ `level3`์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ์Šคํ† ๋ฆฌ์— ์ฝ๊ธฐ ํญ Container๋ฅผ ์ ์šฉํ–ˆ๋‹ค.
@@ -51,7 +51,7 @@ Native(ํ•˜๋‹จ ์‹œํŠธ, ํ‚ค๋ณด๋“œ ์˜ฌ๋ผ์˜ด) Web(ํ•˜๋‹จ ์‹œํŠธ)
51
51
  | --- | --- | --- | --- |
52
52
  | ๋ฐ”๊นฅ ํ‹€ | ์‹œํŠธ ์•ˆ: `Sheet`(Modal)๊ฐ€ backdropยท๋ณธ๋ฌธ ์Šคํฌ๋กค(Native `scrollable`)ยทํ‚ค๋ณด๋“œ(Native `keyboardAvoidance`)ยท์•ˆ์ „ ์˜์—ญ์„ ์†Œ์œ . ํŠธ๋ฆฌ๊ฑฐ: ์ œํ’ˆ ํ™”๋ฉด์˜ ๋ฐ”๊นฅ ํ‹€(Web ๋ฌธ์„œ ์Šคํฌ๋กค > `Container`, Native `ScrollView` > `Container`) | ์‹œํŠธ๋Š” ํ™”๋ฉด ์œ„ ์˜ค๋ฒ„๋ ˆ์ด, ํŠธ๋ฆฌ๊ฑฐ๋Š” ํ™”๋ฉด ๋ณธ๋ฌธ | ์‹œํŠธ ์•ˆ ์—ฌ๋ฐฑ์€ ์•„๋ž˜ ํ–‰๋“ค(Sheet ์†Œ์œ , ์ œํ’ˆ์ด insetยทํ‚ค๋ณด๋“œ ์—ฌ๋ฐฑ์„ ๋‹ค์‹œ ๋”ํ•˜์ง€ ์•Š๋Š”๋‹ค). ํŠธ๋ฆฌ๊ฑฐ ํ™”๋ฉด ์ขŒ์šฐ๋Š” `Container gutter` ํญ 600 ๋ฏธ๋งŒ `compact` 16 ยท ์ด์ƒ `regular` 20([ํ™”๋ฉด ์—ฌ๋ฐฑ](../tokens/layout.md)) |
53
53
  | ์‹œํŠธ ํ‹€ | `Sheet` placement `bottom` | ํ™”๋ฉด ํ•˜๋‹จ์— ๋ถ™๊ณ  ์œ„ ๋ชจ์„œ๋ฆฌ๋งŒ ๋‘ฅ๊ธ€๋‹ค | radius `xl` 24, ์ตœ๋Œ€ ๋†’์ด `maxHeightRatio` 0.9(๋ทฐํฌํŠธ์˜ 90%), Web ์ตœ๋Œ€ ํญ 640 |
54
- | ๋จธ๋ฆฌ | ์ œ๋ชฉ + ๋‹ซ๊ธฐ IconButton | ์‹œํŠธ ๋งจ ์œ„, ๊ณ ์ • | Native ์ตœ์†Œ ๋†’์ด `control.minTouchTarget` 44ยท์ขŒ์šฐ `spacing.lg` 20(+์ขŒ์šฐ inset)ยท์œ„ `spacing.sm` 12. Web padding `spacing.lg` 20(์•„๋ž˜ 0), ์ œ๋ชฉโ€“๋‹ซ๊ธฐ `spacing.md` 16 |
54
+ | ๋จธ๋ฆฌ | ์†์žก์ด(+ `showClose`์ผ ๋•Œ ๋ ร— IconButton). ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์Œ, `title`์€ ์ ‘๊ทผ์„ฑ ์ด๋ฆ„(2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •: ์‹œํŠธ๋Š” ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์ด `title`์„ ์ ‘๊ทผ์„ฑ ์ด๋ฆ„์œผ๋กœ๋งŒ ์“ด๋‹ค) | ์‹œํŠธ ๋งจ ์œ„, ๊ณ ์ • | ร— ๋จธ๋ฆฌ ์ตœ์†Œ ๋†’์ด `control.minTouchTarget` 44ยท์ขŒ์šฐ `spacing.lg` 20(+์ขŒ์šฐ inset)ยท์œ„ `spacing.sm` 12(๋‘ ํ”Œ๋žซํผ ๊ฐ™์Œ) |
55
55
  | ์‹คํŒจ ์•Œ๋ฆผ | `Notice tone="danger"` | ๋ณธ๋ฌธ ๋งจ ์œ„(์ž…๋ ฅ ์œ„), ์‹คํŒจํ–ˆ์„ ๋•Œ๋งŒ, ์Šคํฌ๋กค | ๋ณธ๋ฌธ ํ•ญ๋ชฉ ์‚ฌ์ด `spacing.md` 16 |
56
56
  | ๋ณธ๋ฌธ | `TextField` + ์„ค๋ช… | ๋จธ๋ฆฌ ์•„๋ž˜, **์Šคํฌ๋กค** | ํ•ญ๋ชฉ ์‚ฌ์ด `sheetRecipe.body.gap` `spacing.md` 16. Web body padding `spacing.lg` 20 |
57
57
  | ์™„๋ฃŒ | footer `Button`(primary) | ๋ณธ๋ฌธ ์•„๋ž˜, **๊ณ ์ •**(์Šคํฌ๋กค ๋ฐ–) | ๋†’์ด `medium` 44. Native ์œ„ `spacing.sm` 12, footer ์„ธ๋กœ ์—ด์ด๋ผ ๊ฝ‰ ์ฐฌ ํญ(`fullWidth` ๋ถˆํ•„์š”). Web ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ, ๋ฒ„ํŠผ ์‚ฌ์ด `spacing.sm` 12, padding 0 `spacing.lg` 20 `spacing.lg` 20 |
@@ -64,8 +64,8 @@
64
64
  | ์ œ๋ชฉ | `Heading level="level3"` | ๋ฌถ์Œ ๋งจ ์œ„ | 24/32(`heading.level3`), ๋ฌถ์Œ ์•ˆ ๊ฐ„๊ฒฉ `layout.contentGap` 16(`Stack gap="md"`) |
65
65
  | ํ˜„์žฌ ๊ฐ’ | `Text` | ์ œ๋ชฉ ์•„๋ž˜, ํŠธ๋ฆฌ๊ฑฐ ์œ„ | `spacing.md` 16 |
66
66
  | ํŠธ๋ฆฌ๊ฑฐ | `Button`(primary) | ํ˜„์žฌ ๊ฐ’ ์•„๋ž˜ | `medium` 44(`control.buttonHeight`) |
67
- | ์‹œํŠธ ๋จธ๋ฆฌ | `Sheet` header | ์‹œํŠธ ์œ„ ๊ณ ์ • | Native ์ตœ์†Œ ๋†’์ด `control.minTouchTarget` 44, ์ œ๋ชฉโ€“๋‹ซ๊ธฐ `spacing.sm` 12; Web ์—ฌ๋ฐฑ `spacing.lg` 20, ์ œ๋ชฉโ€“๋‹ซ๊ธฐ `spacing.md` 16 |
68
- | ์„ ํƒ์ง€ | `RadioGroup`(`presentation="card"`, `accessibilityLabel` = ์‹œํŠธ ์ œ๋ชฉ) | ์‹œํŠธ body, ์Šคํฌ๋กค | ํ–‰ ์ตœ์†Œ ๋†’์ด 56(`layout.rowHeight.singleLine`), ํ•ญ๋ชฉ ์‚ฌ์ด `spacing.xs` 8(`selectionGroupRecipe`). ์•ˆ๋‚ด ๋ฌธ๊ตฌ์™€๋Š” `Stack gap="md"` 16. ์„ค์น˜ํ•œ ๋ฒ„์ „์˜ Sheet body gap๊ณผ ์ค‘์ฒฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ฉฐ checkout ์ƒํƒœ๋ฅผ npm ๊ฒŒ์‹œ ์ฆ๊ฑฐ๋กœ ์‚ผ์ง€ ์•Š๋Š”๋‹ค |
67
+ | ์‹œํŠธ ๋จธ๋ฆฌ | `Sheet` ์†์žก์ด(+ `showClose`์ผ ๋•Œ ๋ ร—) | ์‹œํŠธ ์œ„ ๊ณ ์ • | ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์Œ, `title`์€ ์ ‘๊ทผ์„ฑ ์ด๋ฆ„(2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •: ์‹œํŠธ๋Š” ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์ด `title`์„ ์ ‘๊ทผ์„ฑ ์ด๋ฆ„์œผ๋กœ๋งŒ ์“ด๋‹ค). ร— ๋จธ๋ฆฌ ์ตœ์†Œ ๋†’์ด `control.minTouchTarget` 44 |
68
+ | ์„ ํƒ์ง€ | `RadioGroup`(`presentation="card"`, `accessibilityLabel` = ์‹œํŠธ `title`) | ์‹œํŠธ body, ์Šคํฌ๋กค | ํ–‰ ์ตœ์†Œ ๋†’์ด 56(`layout.rowHeight.singleLine`), ํ•ญ๋ชฉ ์‚ฌ์ด `spacing.xs` 8(`selectionGroupRecipe`). ์•ˆ๋‚ด ๋ฌธ๊ตฌ์™€๋Š” `Stack gap="md"` 16. ์„ค์น˜ํ•œ ๋ฒ„์ „์˜ Sheet body gap๊ณผ ์ค‘์ฒฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ฉฐ checkout ์ƒํƒœ๋ฅผ npm ๊ฒŒ์‹œ ์ฆ๊ฑฐ๋กœ ์‚ผ์ง€ ์•Š๋Š”๋‹ค |
69
69
  | ํ–‰๋™ | `Button` ์ ์šฉยท์ทจ์†Œ | ์‹œํŠธ footer, ์Šคํฌ๋กค ๋ฐ– ๊ณ ์ • | ๊ฐ„๊ฒฉ `spacing.sm` 12(`sheetRecipe.footer.gap`), Native ์œ„ ์—ฌ๋ฐฑ `spacing.sm` 12 |
70
70
  | ์‹œํŠธ ํ‹€ | `Sheet` | ํ•˜๋‹จ, ๋ชจ๋‹ฌ | Web ์ตœ๋Œ€ ํญ 640(`sheetRecipe.web.maxWidth`)ยท์ตœ๋Œ€ ๋†’์ด 90%, Native ๊ฐ€๋กœ ์—ฌ๋ฐฑ `spacing.lg` 20ยท์ตœ๋Œ€ ๋†’์ด 90%(`maxHeightRatio` 0.9), ํ•˜๋‹จ ์•ˆ์ „ ์˜์—ญ ์ถ”๊ฐ€ |
71
71
 
@@ -199,7 +199,7 @@ Web `gutter`๋Š” [ํ™”๋ฉด ์—ฌ๋ฐฑ๊ณผ ๋„ˆ๋น„](../tokens/layout.md)์ฒ˜๋Ÿผ ํญ ๊ตฌ๊ฐ„
199
199
  | ํ•ญ๋ชฉ | Web | Native |
200
200
  | --- | --- | --- |
201
201
  | ํŠธ๋ฆฌ๊ฑฐ ref | `Button ref` | `View ref collapsable={false}`๋กœ ๊ฐ์Œˆ |
202
- | ์‹œํŠธ ๋จธ๋ฆฌ | ์—ฌ๋ฐฑ `spacing.lg` 20, ์ œ๋ชฉโ€“๋‹ซ๊ธฐ `spacing.md` 16 | ์ตœ์†Œ ๋†’์ด 44, ์ œ๋ชฉโ€“๋‹ซ๊ธฐ `spacing.sm` 12 |
202
+ | ์‹œํŠธ ๋จธ๋ฆฌ | ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์Œ(์‹œ๊ฐ ์ˆจ๊น€ `h2`) | ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์Œ(์ ‘๊ทผ์„ฑ ๋จธ๋ฆฌ๊ธ€) |
203
203
  | footer | ๊ฐ€๋กœ flex(wrap, ๋ ์ •๋ ฌ), [์ทจ์†Œ][์ ์šฉ] | ์„ธ๋กœ View, ์œ„ ์—ฌ๋ฐฑ `spacing.sm` 12, [์ ์šฉ] ์œ„ [์ทจ์†Œ] ์•„๋ž˜ |
204
204
  | ์ดˆ์  | focus trap + `returnFocusRef` | `returnFocusRef` |
205
205
  | ์ƒํƒœ ์•Œ๋ฆผ | `role="status"` | live region(Android) + iOS ์•Œ๋ฆผ ํ˜ธ์ถœ |
@@ -25,13 +25,13 @@
25
25
 
26
26
  ```text
27
27
  ๋ถ€๋ชจ ํ™”๋ฉด์˜ ๊ณต๊ฐœ ์Šฌ๋กฏ
28
- โ””โ”€ ์ œ๋ชฉ โ†’ ์•จ๋ฒ” โ†’ ์ดฌ์˜
28
+ โ””โ”€ ์†์žก์ด โ†’ ์•จ๋ฒ” โ†’ ์ดฌ์˜ (์ œ๋ชฉ์€ ์ ‘๊ทผ์„ฑ ์ด๋ฆ„๋งŒ)
29
29
  ```
30
30
 
31
31
  | ์˜์—ญ | ์ปดํฌ๋„ŒํŠธ | ์œ„์น˜ | ํฌ๊ธฐยท๊ฐ„๊ฒฉ |
32
32
  | --- | --- | --- | --- |
33
33
  | ๋ฐ”๊นฅ ํ‹€ | PhotoSourceSheet ๋˜๋Š” ํฌํ•จ Surface | ๋ถ€๋ชจ ํ™”๋ฉด์˜ ํ•ด๋‹น ์Šฌ๋กฏ | [๋ฐฐ์น˜](../components/photo-source-sheet.md#๋ฐฐ์น˜)์— ๋”ฐ๋ฅธ๋‹ค |
34
- | ๋‚ด์šฉ | PhotoSourceSheet ๋‚ด๋ถ€ ์Šฌ๋กฏ | ์ œ๋ชฉ โ†’ ์•จ๋ฒ” โ†’ ์ดฌ์˜ | spacing ํ† ํฐ๊ณผ ํฌํ•จ ์ปดํฌ๋„ŒํŠธ recipe |
34
+ | ๋‚ด์šฉ | PhotoSourceSheet ๋‚ด๋ถ€ ์Šฌ๋กฏ | ์•จ๋ฒ” โ†’ ์ดฌ์˜(๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์Œ(2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •: ์‹œํŠธ๋Š” ๋ณด์ด๋Š” ์ œ๋ชฉ ์—†์ด `title`์„ ์ ‘๊ทผ์„ฑ ์ด๋ฆ„์œผ๋กœ๋งŒ ์“ด๋‹ค)) | spacing ํ† ํฐ๊ณผ ํฌํ•จ ์ปดํฌ๋„ŒํŠธ recipe |
35
35
  | ํ–‰๋™ | Button ๋˜๋Š” ๊ณต๊ฐœ ์ฝœ๋ฐฑ | ๋‚ด์šฉ๊ณผ ๊ฐ€๊นŒ์šด ๋ช…์‹œ ์ง„์ž…์  | ์ฃผ ํ–‰๋™ ํ•˜๋‚˜, ๋ณด์กฐ ํ–‰๋™๊ณผ ๊ตฌ๋ถ„ |
36
36
 
37
37
  ## ํ๋ฆ„๊ณผ ์ƒํƒœ
@@ -42,7 +42,7 @@
42
42
 
43
43
  | ์ƒํƒœ | ๋ชจ์Šต | ํฌ์ปค์Šคยท์•Œ๋ฆผ |
44
44
  | --- | --- | --- |
45
- | ๊ธฐ๋ณธ | ์ œ๋ชฉ โ†’ ์•จ๋ฒ” โ†’ ์ดฌ์˜ | ์ด๋ฆ„ยท์„ ํƒ ์—ฌ๋ถ€๋ฅผ ๋ณด์กฐ๊ณตํ•™์— ๋…ธ์ถœ |
45
+ | ๊ธฐ๋ณธ | ์•จ๋ฒ” โ†’ ์ดฌ์˜(์‹œํŠธ ์ด๋ฆ„ = `labels.title`) | ์ด๋ฆ„ยท์„ ํƒ ์—ฌ๋ถ€๋ฅผ ๋ณด์กฐ๊ณตํ•™์— ๋…ธ์ถœ |
46
46
  | ์ง„ํ–‰ ์ค‘ | ํ•ด๋‹น ์ž‘์—… pending, ์ž…๋ ฅยท๊ธฐ์กด ๊ฒฐ๊ณผ ๋ณด์กด | ์ค‘๋ณต ์š”์ฒญ ์ฐจ๋‹จ, ๋กœ๋”ฉ์— ํฌ์ปค์Šค๋ฅผ ์˜ฎ๊ธฐ์ง€ ์•Š์Œ |
47
47
  | ์‹คํŒจ | ๊ถŒํ•œ ๊ฑฐ๋ถ€ยท์ทจ์†Œ๋Š” ๊ธฐ์กด ์„ ํƒ ์œ ์ง€ | ์˜ค๋ฅ˜ ๊ทผ์ฒ˜ ์žฌ์‹œ๋„, ํ•„์š”ํ•  ๋•Œ๋งŒ ์˜ค๋ฅ˜ ์ฝ๊ธฐ |
48
48
 
@@ -33,7 +33,7 @@
33
33
  | ์˜์—ญ | ์ปดํฌ๋„ŒํŠธ | ์œ„์น˜ | ํฌ๊ธฐยท๊ฐ„๊ฒฉ |
34
34
  | --- | --- | --- | --- |
35
35
  | ๋ฐ”๊นฅ ํ‹€ | Stack. Web์€ ์ œํ’ˆ ํ™”๋ฉด์˜ `Container size="reading"` ์•ˆ | ํ™”๋ฉด์˜ ๋ณธ๋ฌธ ํ๋ฆ„ | gap lg=20px, ํญ์€ Container๋ฅผ ๋”ฐ๋ฅธ๋‹ค(Web ์ตœ๋Œ€ `layout.readingMaxWidth` 720) |
36
- | ์ œ๋ชฉ | `Heading level="level3"` | ์„ ํƒ ์œ„ | `heading` ๊ธ€์ž ํฌ๊ธฐยทsemibold |
36
+ | ์ œ๋ชฉ | `Heading level="level3"` | ์„ ํƒ ์œ„ | `heading` ๊ธ€์ž ํฌ๊ธฐยทmedium(500) |
37
37
  | ์„ ํƒ | SegmentedControl 2๊ฐœ | ์ œ๋ชฉ ์•„๋ž˜, ์—ฐ๊ฒฐํ˜• ๋‹ค์Œ ํ•„ํ„ฐํ˜• | ๊ธฐ๋ณธ 44px ํ„ฐ์น˜ ์˜์—ญ, ์‹ค์ œ ๊ธ€์ž์— ๋”ฐ๋ฅธ ๋†’์ด |
38
38
  | ๊ฒฐ๊ณผยท๋ฉ”๋ชจ | Text ยท TextField | ์„ ํƒ ์ปจํŠธ๋กค ์•„๋ž˜ | ์„ ํƒ ๋ณ€๊ฒฝ ์‹œ ํ•„๋“œ ์žฌ์ƒ์„ฑ ์—†์Œ |
39
39
  | Native ํ™”๋ฉด host | ScreenLayout ยท KeyboardAvoiding | ๋ณธ๋ฌธ ์Šคํฌ๋กค๊ณผ ๋ฐ”๊นฅ ํ‚ค๋ณด๋“œ ์—ฌ๋ฐฑ | flex 1, ๋ ์—ฌ๋ฐฑ spacing.md=16 |
@@ -74,3 +74,7 @@ Web์€ `@hjmds/react`์˜ ํ•ด๋‹น granular entry, Native๋Š” `@hjmds/react-native`
74
74
  | --- | --- | --- |
75
75
  | ๋ฐฐ์น˜/ํ…Œ๋งˆ | Stack๊ณผ HjmProvider | Stack๊ณผ HjmNativeProvider |
76
76
  | ํฐ ๊ธ€์žยท์ข์€ ํญ | ์ค„๋ฐ”๊ฟˆยท๋‹จ์ผ ๋‚ด์šฉ | ๊ฐ™์€ ์ˆœ์„œ, OS ํ™”๋ฉด ๊ฒ€์ฆ์€ ๋ณ„๋„ |
77
+
78
+ ## ๊ทผ๊ฑฐ
79
+
80
+ 2026-10-17 ์‚ฌ์šฉ์ž ๊ฒฐ์ •("๊ตต๊ธฐ ์ข€๋” ์ค„์—ฌ"): ๋ชจ๋“  ๊ธ€์ž ๊ตต๊ธฐ๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์ท„๋‹ค. ํฐ ์ˆซ์žยท์„ ํƒ ์ƒํƒœ 600(ํฐ ์ œ๋ชฉ ๋‹จ๊ณ„๋Š” ๊ฐ™์€ ๋‚  ํ์ง€), ์ œ๋ชฉยท๊ฐ•์กฐ 500, label 500, ๋ณธ๋ฌธ 400์ด๋ฉฐ ์ •๋ณธ์€ [ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ](../tokens/typography.md)๋‹ค.