@hjmds/design-contracts 1.1.1 โ†’ 1.3.4

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 (199) hide show
  1. package/dist/agreement.d.ts +183 -0
  2. package/dist/agreement.d.ts.map +1 -0
  3. package/dist/agreement.js +137 -0
  4. package/dist/agreement.js.map +1 -0
  5. package/dist/anchor.d.ts +62 -0
  6. package/dist/anchor.d.ts.map +1 -0
  7. package/dist/anchor.js +43 -0
  8. package/dist/anchor.js.map +1 -0
  9. package/dist/asset.d.ts +94 -0
  10. package/dist/asset.d.ts.map +1 -0
  11. package/dist/asset.js +60 -0
  12. package/dist/asset.js.map +1 -0
  13. package/dist/auth-screen.d.ts +119 -0
  14. package/dist/auth-screen.d.ts.map +1 -0
  15. package/dist/auth-screen.js +87 -0
  16. package/dist/auth-screen.js.map +1 -0
  17. package/dist/base-recipes.d.ts +19 -0
  18. package/dist/base-recipes.d.ts.map +1 -1
  19. package/dist/base-recipes.js +17 -0
  20. package/dist/base-recipes.js.map +1 -1
  21. package/dist/behaviors.d.ts +363 -3
  22. package/dist/behaviors.d.ts.map +1 -1
  23. package/dist/behaviors.js +37 -1
  24. package/dist/behaviors.js.map +1 -1
  25. package/dist/bottom-info.d.ts +58 -0
  26. package/dist/bottom-info.d.ts.map +1 -0
  27. package/dist/bottom-info.js +48 -0
  28. package/dist/bottom-info.js.map +1 -0
  29. package/dist/carousel.d.ts +3 -3
  30. package/dist/carousel.js +1 -1
  31. package/dist/carousel.js.map +1 -1
  32. package/dist/catalog.d.ts +1315 -245
  33. package/dist/catalog.d.ts.map +1 -1
  34. package/dist/catalog.js +67 -25
  35. package/dist/catalog.js.map +1 -1
  36. package/dist/collapsible.d.ts +56 -0
  37. package/dist/collapsible.d.ts.map +1 -0
  38. package/dist/collapsible.js +37 -0
  39. package/dist/collapsible.js.map +1 -0
  40. package/dist/component-definitions.d.ts +17 -0
  41. package/dist/component-definitions.d.ts.map +1 -1
  42. package/dist/component-definitions.js +17 -0
  43. package/dist/component-definitions.js.map +1 -1
  44. package/dist/component-recipes.d.ts +20 -3
  45. package/dist/component-recipes.d.ts.map +1 -1
  46. package/dist/component-recipes.js +24 -1
  47. package/dist/component-recipes.js.map +1 -1
  48. package/dist/context-menu.d.ts +53 -0
  49. package/dist/context-menu.d.ts.map +1 -0
  50. package/dist/context-menu.js +44 -0
  51. package/dist/context-menu.js.map +1 -0
  52. package/dist/counter-badge-recipe.d.ts +5 -0
  53. package/dist/counter-badge-recipe.d.ts.map +1 -1
  54. package/dist/counter-badge-recipe.js +5 -0
  55. package/dist/counter-badge-recipe.js.map +1 -1
  56. package/dist/dataviz.d.ts +76 -0
  57. package/dist/dataviz.d.ts.map +1 -0
  58. package/dist/dataviz.js +58 -0
  59. package/dist/dataviz.js.map +1 -0
  60. package/dist/date-range.d.ts +56 -0
  61. package/dist/date-range.d.ts.map +1 -0
  62. package/dist/date-range.js +79 -0
  63. package/dist/date-range.js.map +1 -0
  64. package/dist/design-system-provider.d.ts +24 -0
  65. package/dist/design-system-provider.d.ts.map +1 -1
  66. package/dist/design-system-provider.js +21 -0
  67. package/dist/design-system-provider.js.map +1 -1
  68. package/dist/floating-action-button.d.ts +1 -1
  69. package/dist/floating-action-button.d.ts.map +1 -1
  70. package/dist/floating-action-button.js +3 -1
  71. package/dist/floating-action-button.js.map +1 -1
  72. package/dist/formatters.d.ts +37 -0
  73. package/dist/formatters.d.ts.map +1 -0
  74. package/dist/formatters.js +69 -0
  75. package/dist/formatters.js.map +1 -0
  76. package/dist/heading.d.ts +82 -0
  77. package/dist/heading.d.ts.map +1 -0
  78. package/dist/heading.js +48 -0
  79. package/dist/heading.js.map +1 -0
  80. package/dist/index.d.ts +20 -0
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +20 -0
  83. package/dist/index.js.map +1 -1
  84. package/dist/menubar.d.ts +133 -0
  85. package/dist/menubar.d.ts.map +1 -0
  86. package/dist/menubar.js +80 -0
  87. package/dist/menubar.js.map +1 -0
  88. package/dist/native-platform.d.ts +88 -0
  89. package/dist/native-platform.d.ts.map +1 -0
  90. package/dist/native-platform.js +70 -0
  91. package/dist/native-platform.js.map +1 -0
  92. package/dist/popover.d.ts +19 -4
  93. package/dist/popover.d.ts.map +1 -1
  94. package/dist/popover.js +3 -0
  95. package/dist/popover.js.map +1 -1
  96. package/dist/progress-recipe.d.ts +14 -0
  97. package/dist/progress-recipe.d.ts.map +1 -1
  98. package/dist/progress-recipe.js +14 -1
  99. package/dist/progress-recipe.js.map +1 -1
  100. package/dist/provider-button.d.ts +140 -0
  101. package/dist/provider-button.d.ts.map +1 -0
  102. package/dist/provider-button.js +83 -0
  103. package/dist/provider-button.js.map +1 -0
  104. package/dist/recipes.d.ts +16 -1
  105. package/dist/recipes.d.ts.map +1 -1
  106. package/dist/recipes.js +15 -0
  107. package/dist/recipes.js.map +1 -1
  108. package/dist/sheet.d.ts +16 -0
  109. package/dist/sheet.d.ts.map +1 -1
  110. package/dist/sheet.js +33 -0
  111. package/dist/sheet.js.map +1 -1
  112. package/dist/sidebar.d.ts +168 -0
  113. package/dist/sidebar.d.ts.map +1 -0
  114. package/dist/sidebar.js +98 -0
  115. package/dist/sidebar.js.map +1 -0
  116. package/dist/skip-nav.d.ts +67 -0
  117. package/dist/skip-nav.d.ts.map +1 -0
  118. package/dist/skip-nav.js +47 -0
  119. package/dist/skip-nav.js.map +1 -0
  120. package/dist/tags-input.d.ts +157 -0
  121. package/dist/tags-input.d.ts.map +1 -0
  122. package/dist/tags-input.js +108 -0
  123. package/dist/tags-input.js.map +1 -0
  124. package/dist/text-formats.d.ts +85 -0
  125. package/dist/text-formats.d.ts.map +1 -0
  126. package/dist/text-formats.js +43 -0
  127. package/dist/text-formats.js.map +1 -0
  128. package/dist/toggle-group.d.ts +111 -0
  129. package/dist/toggle-group.d.ts.map +1 -0
  130. package/dist/toggle-group.js +78 -0
  131. package/dist/toggle-group.js.map +1 -0
  132. package/dist/top.d.ts +113 -0
  133. package/dist/top.d.ts.map +1 -0
  134. package/dist/top.js +72 -0
  135. package/dist/top.js.map +1 -0
  136. package/dist/version.d.ts +1 -1
  137. package/dist/version.js +1 -1
  138. package/dist/version.js.map +1 -1
  139. package/docs/agreement.md +33 -0
  140. package/docs/anchor.md +59 -59
  141. package/docs/ant-design-coverage.md +5 -3
  142. package/docs/asset.md +26 -0
  143. package/docs/auth-screen.md +65 -0
  144. package/docs/bottom-info.md +15 -0
  145. package/docs/breadcrumb.md +15 -15
  146. package/docs/button-label.md +20 -0
  147. package/docs/calendar.md +82 -154
  148. package/docs/carousel.md +27 -2
  149. package/docs/cascader.md +17 -0
  150. package/docs/chart.md +33 -0
  151. package/docs/clipboard.md +13 -0
  152. package/docs/collapsible.md +19 -0
  153. package/docs/command-palette.md +19 -0
  154. package/docs/confirm-popover.md +11 -1
  155. package/docs/context-menu.md +23 -0
  156. package/docs/data-table.md +22 -0
  157. package/docs/date-range.md +31 -0
  158. package/docs/density.md +52 -0
  159. package/docs/expansion-roadmap.md +16 -3
  160. package/docs/floating-action-button.md +35 -3
  161. package/docs/formatters.md +18 -0
  162. package/docs/generated/component-maturity.md +40 -23
  163. package/docs/generated/renderer-evidence.json +3029 -652
  164. package/docs/generated/renderer-evidence.md +55 -6
  165. package/docs/generated/showcase-manifest.json +1156 -81
  166. package/docs/heading.md +25 -0
  167. package/docs/identity.md +5 -0
  168. package/docs/layout.md +1 -1
  169. package/docs/library-gap-analysis.md +29 -9
  170. package/docs/list-row.md +14 -0
  171. package/docs/mentions.md +18 -0
  172. package/docs/menubar.md +22 -0
  173. package/docs/native-platform.md +36 -0
  174. package/docs/overlay-stack.md +24 -0
  175. package/docs/pagination.md +16 -8
  176. package/docs/popover.md +42 -13
  177. package/docs/product-audit-2026-09-15.md +88 -0
  178. package/docs/progress.md +16 -0
  179. package/docs/provider-button.md +33 -0
  180. package/docs/rating.md +19 -0
  181. package/docs/react-native-completion.md +347 -0
  182. package/docs/screen-chrome.md +52 -0
  183. package/docs/side-panel.md +23 -2
  184. package/docs/sidebar.md +30 -0
  185. package/docs/skip-nav.md +20 -0
  186. package/docs/splitter.md +22 -2
  187. package/docs/stable-promotion.md +51 -0
  188. package/docs/tags-input.md +25 -0
  189. package/docs/text-formats.md +15 -0
  190. package/docs/theming.md +84 -0
  191. package/docs/time-picker.md +22 -1
  192. package/docs/toast.md +18 -0
  193. package/docs/toggle-group.md +21 -0
  194. package/docs/top.md +32 -0
  195. package/docs/tour.md +23 -2
  196. package/docs/transfer-list.md +20 -0
  197. package/docs/tree-select.md +18 -0
  198. package/docs/tree.md +21 -0
  199. package/package.json +126 -6
package/dist/top.js ADDED
@@ -0,0 +1,72 @@
1
+ import { heading, spacing, typography } from "./foundations.js";
2
+ import { semanticColors } from "./semantic-colors.js";
3
+ export const topDefaults = {
4
+ size: "large",
5
+ headingLevel: 1,
6
+ };
7
+ function assertNonEmpty(value, field) {
8
+ if (typeof value !== "string" || value.trim().length === 0) {
9
+ throw new TypeError(`Top ${field} must not be empty`);
10
+ }
11
+ }
12
+ export function validateTopDescriptor(descriptor) {
13
+ if (descriptor === null || typeof descriptor !== "object") {
14
+ throw new TypeError("Top descriptor must be an object");
15
+ }
16
+ assertNonEmpty(descriptor.title, "title");
17
+ if (descriptor.eyebrow !== undefined)
18
+ assertNonEmpty(descriptor.eyebrow, "eyebrow");
19
+ if (descriptor.description !== undefined) {
20
+ assertNonEmpty(descriptor.description, "description");
21
+ }
22
+ if (descriptor.size !== undefined && descriptor.size !== "medium" && descriptor.size !== "large") {
23
+ throw new TypeError(`Unsupported Top size: ${String(descriptor.size)}`);
24
+ }
25
+ if (descriptor.headingLevel !== undefined &&
26
+ ![1, 2, 3].includes(descriptor.headingLevel)) {
27
+ throw new TypeError(`Unsupported Top headingLevel: ${String(descriptor.headingLevel)}`);
28
+ }
29
+ }
30
+ /**
31
+ * `large`๋Š” ํ™”๋ฉด์˜ ์ฒซ ์ œ๋ชฉ, `medium`์€ ์‹œํŠธยท๋ชจ๋‹ฌ ์•ˆ์˜ ์ฒซ ์ œ๋ชฉ์ด๋‹ค. ๋‘ ๋‹จ๊ณ„๋ฟ์ธ ์ด์œ ๋Š”
32
+ * ์„ธ ๋ฒˆ์งธ๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š” ์ž๋ฆฌ๊ฐ€ ๊ณง `Section`์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค โ€” ํฌ๊ธฐ๋ฅผ ๋” ๋Š˜๋ฆฌ๋Š” ๋Œ€์‹  ๋‹ค๋ฅธ
33
+ * ์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ฐ๋ผ๋Š” ์‹ ํ˜ธ๋กœ ๋‘”๋‹ค.
34
+ */
35
+ export const topRecipe = {
36
+ slots: ["root", "eyebrow", "title", "description", "trailing"],
37
+ defaults: { size: topDefaults.size },
38
+ sizes: {
39
+ medium: { title: typography.titleLarge, paddingTop: spacing.md, paddingBottom: spacing.sm },
40
+ large: { title: heading.level2, paddingTop: spacing.xl, paddingBottom: spacing.md },
41
+ },
42
+ eyebrow: {
43
+ color: semanticColors.content.brand,
44
+ textVariant: "label",
45
+ marginBottom: spacing.xxs,
46
+ },
47
+ title: { color: semanticColors.content.primary },
48
+ description: {
49
+ color: semanticColors.content.body,
50
+ textVariant: "body",
51
+ marginTop: spacing.xs,
52
+ },
53
+ /** ์ œ๋ชฉ ์ค„ ์˜ค๋ฅธ์ชฝ ๋ณด์กฐ ํ–‰๋™. ๋ณธ๋ฌธ์ด๋ฏ€๋กœ TopBar์ฒ˜๋Ÿผ ์•„์ด์ฝ˜ ์ „์šฉ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. */
54
+ trailing: { gap: spacing.xs },
55
+ gap: spacing.xs,
56
+ };
57
+ export const topBehavior = {
58
+ /** ์ƒํƒœ ์ถ•์ด ์—†๋‹ค โ€” ํ™”๋ฉด์ด ์ œ๋ชฉ์„ ๋ฐ”๊พธ๋ฉด ๊ทธ๋ƒฅ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ๋„˜๊ธด๋‹ค. */
59
+ controlled: [],
60
+ inputs: ["title", "eyebrow", "description", "size", "headingLevel"],
61
+ stateAxes: {},
62
+ web: { roles: ["heading"], keyboard: [], focus: "none" },
63
+ native: { roles: ["header"], states: [], actions: [] },
64
+ scenarios: [
65
+ "the-title-is-a-real-heading-element-at-the-declared-level-not-styled-text",
66
+ "top-is-body-content-that-scrolls-away-while-topbar-is-fixed-chrome",
67
+ "description-wraps-instead-of-truncating-so-large-text-never-hides-the-question",
68
+ "a-trailing-action-shares-the-title-row-and-drops-below-it-when-space-runs-out",
69
+ "eyebrow-never-carries-information-the-title-does-not-repeat-in-some-form",
70
+ ],
71
+ };
72
+ //# sourceMappingURL=top.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"top.js","sourceRoot":"","sources":["../src/top.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BehaviorContract } from \"./behaviors.js\";\nimport type { ColorReference } from \"./color-references.js\";\nimport { heading, spacing, typography } from \"./foundations.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\n\n/**\n * ํ™”๋ฉด ๋ณธ๋ฌธ์˜ **์ฒซ ๋ธ”๋ก**์ด๋‹ค. `TopBar`(์ƒ๋‹จ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ”)์™€ ๋‹ค๋ฅธ ์ž๋ฆฌ์ด๊ณ , ๊ทธ ์ฐจ์ด๊ฐ€\n * ์ด ๊ณ„์•ฝ์˜ ์กด์žฌ ์ด์œ ๋‹ค.\n *\n * - `TopBar`๋Š” ํ™”๋ฉด์— ๊ณ ์ •๋œ ํฌ๋กฌ์ด๋‹ค โ€” ๋’ค๋กœ๊ฐ€๊ธฐ, ํ™”๋ฉด ์ด๋ฆ„, ์•ก์…˜. ์Šคํฌ๋กค๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ\n * ๋ถ™์–ด ์žˆ๊ณ  safe area๋ฅผ ๋‹ค๋ฃฌ๋‹ค.\n * - `Top`์€ ๋ณธ๋ฌธ์ด๋‹ค โ€” ์Šคํฌ๋กค๊ณผ ํ•จ๊ป˜ ์˜ฌ๋ผ๊ฐ€๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ \"์ด ํ™”๋ฉด์ด ๋ฌด์—‡์„ ๋ฌป๋Š”์ง€\"\n * ์ฝ๋Š” ๋ฌธ์žฅ์ด ์—ฌ๊ธฐ ์žˆ๋‹ค. ํ† ์Šค TDS๊ฐ€ \"Top๊ณผ ListRow๋กœ ํ™”๋ฉด ๋Œ€๋ถ€๋ถ„์„ ๋งŒ๋“ ๋‹ค\"๊ณ \n * ๋งํ•˜๋Š” ๊ทธ Top์ด๊ณ , ์ง€๊ธˆ๊นŒ์ง€ BurnTok `AppScreenHeader`ยทTaground `screen-shell`ยท\n * Diairy `DetailPanel`์ด ๊ฐ์ž ๋‹ค์‹œ ๋งŒ๋“ค๋˜ ๋ธ”๋ก์ด๋‹ค.\n *\n * `Section`๊ณผ๋„ ๋‹ค๋ฅด๋‹ค. Section์€ ๋ณธ๋ฌธ **์ค‘๊ฐ„**์˜ ๋ฌถ์Œ ์ œ๋ชฉ์ด๋ผ heading level์ด ํ™”๋ฉด\n * ๊ตฌ์กฐ์— ์ข…์†๋˜์ง€๋งŒ, Top์€ ํ™”๋ฉด๋‹น ํ•˜๋‚˜๋ฟ์ธ ์ฒซ ์ œ๋ชฉ์ด๋ผ ๊ธฐ๋ณธ์ด `h1`์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‘\n * ๊ณ„์•ฝ์„ ํ•ฉ์น˜์ง€ ์•Š์•˜๋‹ค โ€” ํ•ฉ์น˜๋ฉด \"์ด Section์ด ํ™”๋ฉด์˜ h1์ธ๊ฐ€\"๋ฅผ ๋งค๋ฒˆ ๋ฌผ์–ด์•ผ ํ•œ๋‹ค.\n */\nexport type TopSize = \"medium\" | \"large\";\n\nexport type TopDescriptor = Readonly<{\n title: string;\n /** ์ œ๋ชฉ ์œ„ ํ•œ ์ค„. ์นดํ…Œ๊ณ ๋ฆฌยท๋‹จ๊ณ„์ฒ˜๋Ÿผ ์ œ๋ชฉ์„ ํ•œ์ •ํ•˜๋Š” ์งง์€ ๋ง. */\n eyebrow?: string;\n /** ์ œ๋ชฉ ์•„๋ž˜ ๋ณด์กฐ ๋ฌธ์žฅ. ๊ธธ๋ฉด ์ค„๋ฐ”๊ฟˆ๋˜๋ฉฐ ์ž˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. */\n description?: string;\n size?: TopSize;\n /**\n * ๋ฌธ์„œ ๊ตฌ์กฐ์ƒ์˜ ์ œ๋ชฉ ๋‹จ๊ณ„. ํ™”๋ฉด๋‹น ํ•˜๋‚˜์ธ Top์€ `1`์ด ๊ธฐ๋ณธ์ด์ง€๋งŒ, ํ•œ ๋ผ์šฐํŠธ๊ฐ€\n * ์—ฌ๋Ÿฌ ํ™”๋ฉด์„ ๋‹ด๋Š” ๊ฒฝ์šฐ(์‹œํŠธ ์•ˆ์˜ ํ™”๋ฉด ๋“ฑ) ์ œํ’ˆ์ด ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.\n */\n headingLevel?: 1 | 2 | 3;\n}>;\n\nexport const topDefaults = {\n size: \"large\",\n headingLevel: 1,\n} as const satisfies Readonly<{ size: TopSize; headingLevel: 1 | 2 | 3 }>;\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`Top ${field} must not be empty`);\n }\n}\n\nexport function validateTopDescriptor(descriptor: TopDescriptor): void {\n if (descriptor === null || typeof descriptor !== \"object\") {\n throw new TypeError(\"Top descriptor must be an object\");\n }\n assertNonEmpty(descriptor.title, \"title\");\n if (descriptor.eyebrow !== undefined) assertNonEmpty(descriptor.eyebrow, \"eyebrow\");\n if (descriptor.description !== undefined) {\n assertNonEmpty(descriptor.description, \"description\");\n }\n if (descriptor.size !== undefined && descriptor.size !== \"medium\" && descriptor.size !== \"large\") {\n throw new TypeError(`Unsupported Top size: ${String(descriptor.size)}`);\n }\n if (\n descriptor.headingLevel !== undefined &&\n ![1, 2, 3].includes(descriptor.headingLevel)\n ) {\n throw new TypeError(`Unsupported Top headingLevel: ${String(descriptor.headingLevel)}`);\n }\n}\n\n/**\n * `large`๋Š” ํ™”๋ฉด์˜ ์ฒซ ์ œ๋ชฉ, `medium`์€ ์‹œํŠธยท๋ชจ๋‹ฌ ์•ˆ์˜ ์ฒซ ์ œ๋ชฉ์ด๋‹ค. ๋‘ ๋‹จ๊ณ„๋ฟ์ธ ์ด์œ ๋Š”\n * ์„ธ ๋ฒˆ์งธ๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š” ์ž๋ฆฌ๊ฐ€ ๊ณง `Section`์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค โ€” ํฌ๊ธฐ๋ฅผ ๋” ๋Š˜๋ฆฌ๋Š” ๋Œ€์‹  ๋‹ค๋ฅธ\n * ์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ฐ๋ผ๋Š” ์‹ ํ˜ธ๋กœ ๋‘”๋‹ค.\n */\nexport const topRecipe = {\n slots: [\"root\", \"eyebrow\", \"title\", \"description\", \"trailing\"] as const,\n defaults: { size: topDefaults.size },\n sizes: {\n medium: { title: typography.titleLarge, paddingTop: spacing.md, paddingBottom: spacing.sm },\n large: { title: heading.level2, paddingTop: spacing.xl, paddingBottom: spacing.md },\n },\n eyebrow: {\n color: semanticColors.content.brand,\n textVariant: \"label\" as const,\n marginBottom: spacing.xxs,\n },\n title: { color: semanticColors.content.primary },\n description: {\n color: semanticColors.content.body,\n textVariant: \"body\" as const,\n marginTop: spacing.xs,\n },\n /** ์ œ๋ชฉ ์ค„ ์˜ค๋ฅธ์ชฝ ๋ณด์กฐ ํ–‰๋™. ๋ณธ๋ฌธ์ด๋ฏ€๋กœ TopBar์ฒ˜๋Ÿผ ์•„์ด์ฝ˜ ์ „์šฉ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. */\n trailing: { gap: spacing.xs },\n gap: spacing.xs,\n} as const satisfies {\n slots: readonly [\"root\", \"eyebrow\", \"title\", \"description\", \"trailing\"];\n defaults: { size: TopSize };\n sizes: Readonly<{\n medium: { title: typeof typography.titleLarge; paddingTop: number; paddingBottom: number };\n large: { title: typeof heading.level2; paddingTop: number; paddingBottom: number };\n }>;\n eyebrow: { color: ColorReference; textVariant: \"label\"; marginBottom: number };\n title: { color: ColorReference };\n description: { color: ColorReference; textVariant: \"body\"; marginTop: number };\n trailing: { gap: number };\n gap: number;\n};\n\nexport const topBehavior = {\n /** ์ƒํƒœ ์ถ•์ด ์—†๋‹ค โ€” ํ™”๋ฉด์ด ์ œ๋ชฉ์„ ๋ฐ”๊พธ๋ฉด ๊ทธ๋ƒฅ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ๋„˜๊ธด๋‹ค. */\n controlled: [],\n inputs: [\"title\", \"eyebrow\", \"description\", \"size\", \"headingLevel\"],\n stateAxes: {},\n web: { roles: [\"heading\"], keyboard: [], focus: \"none\" },\n native: { roles: [\"header\"], states: [], actions: [] },\n scenarios: [\n \"the-title-is-a-real-heading-element-at-the-declared-level-not-styled-text\",\n \"top-is-body-content-that-scrolls-away-while-topbar-is-fixed-chrome\",\n \"description-wraps-instead-of-truncating-so-large-text-never-hides-the-question\",\n \"a-trailing-action-shares-the-title-row-and-drops-below-it-when-space-runs-out\",\n \"eyebrow-never-carries-information-the-title-does-not-repeat-in-some-form\",\n ],\n} as const satisfies BehaviorContract;\n"]}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package release shown by documentation surfaces. Kept in sync by a test. */
2
- export declare const designSystemVersion: "1.1.1";
2
+ export declare const designSystemVersion: "1.3.4";
3
3
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package release shown by documentation surfaces. Kept in sync by a test. */
2
- export const designSystemVersion = "1.1.1";
2
+ export const designSystemVersion = "1.3.4";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAgB,CAAC","sourcesContent":["/** Package release shown by documentation surfaces. Kept in sync by a test. */\nexport const designSystemVersion = \"1.1.1\" as const;\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAgB,CAAC","sourcesContent":["/** Package release shown by documentation surfaces. Kept in sync by a test. */\nexport const designSystemVersion = \"1.3.4\" as const;\n"]}
@@ -0,0 +1,33 @@
1
+ # Agreement contract
2
+
3
+ **๋ฌธ์ œ.** ๊ฐ€์ž…ยท๊ฒฐ์ œ ์•ž์— ์„œ๋Š” ์•ฝ๊ด€ ๋™์˜ ๋ฌถ์Œ์ด๋‹ค. ์ „์ฒด ๋™์˜ ํ•œ ์ค„๊ณผ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ๋“ค,
4
+ ํ•„์ˆ˜/์„ ํƒ ๊ตฌ๋ถ„, ๊ฐ ํ•ญ๋ชฉ์˜ ์ „๋ฌธ ๋ณด๊ธฐ๊ฐ€ ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ์›€์ง์ธ๋‹ค.
5
+
6
+ **์™œ CheckboxGroup์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€๊ฐ€.** ์„ธ ๊ฐ€์ง€๊ฐ€ ์ฒดํฌ๋ฐ•์Šค ๋ชฉ๋ก์ด ์•„๋‹ˆ๋ผ ์ ˆ์ฐจ์ด๊ธฐ
7
+ ๋•Œ๋ฌธ์ด๋‹ค.
8
+
9
+ 1. **ํ•„์ˆ˜/์„ ํƒ์ด ์ œ์ถœ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์ •ํ•œ๋‹ค.** CheckboxGroup์€ "๋ช‡ ๊ฐœ ๊ณจ๋ž๋Š”๊ฐ€"๋งŒ ์•Œ๊ณ 
10
+ "์ด ํ™”๋ฉด์ด ์ง„ํ–‰ ๊ฐ€๋Šฅํ•œ๊ฐ€"๋Š” ๋ชจ๋ฅธ๋‹ค. `resolveAgreementState`์˜ `satisfied`์™€
11
+ `missingRequiredIds`๊ฐ€ ๊ทธ ํŒ์ •์ด๊ณ , ์ œํ’ˆ์˜ ์ œ์ถœ ๋ฒ„ํŠผ์ด ๊ทธ๊ฒƒ๋งŒ ์ฝ๋Š”๋‹ค.
12
+ 2. **์ „์ฒด ๋™์˜๋Š” ํŒŒ์ƒ์ด๋‹ค.** ์ €์žฅ๋˜๋Š” ๊ฐ’์€ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ๋ฟ์ด๊ณ  ์ „์ฒด ํ–‰์€ tri-state๋กœ
13
+ ๊ทธ๋ ค์ง„๋‹ค โ€” DataTable ๋จธ๋ฆฌ๊ธ€(`resolveDataTableSelectAllState`)ยทTreeSelect ๋ถ€๋ชจ
14
+ (`resolveTreeCheckedStates`)์™€ ๊ฐ™์€ ๊ด€๊ณ„๋‹ค. ์ „์ฒด ๋™์˜๋ฅผ ๋ณ„๋„ ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๋ฉด
15
+ "์ „์ฒด ๋™์˜ํ–ˆ์ง€๋งŒ ๊ฐœ๋ณ„์€ ๋‘ ๊ฐœ๋งŒ ์ฒดํฌ๋จ" ๊ฐ™์€ ๋ชจ์ˆœ์ด ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
16
+ 3. **์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผ ๋™์˜๋‹ค.** ์ „๋ฌธ ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ๋™์˜ ํ•ญ๋ชฉ์€ ๋งŒ๋“ค ์ˆ˜ ์—†๊ฒŒ ๋‘์ง€๋Š” ์•Š์ง€๋งŒ,
17
+ `detail`์„ ๊ณ„์•ฝ๋œ ํ–‰๋™์œผ๋กœ ๋‘ฌ์„œ renderer๊ฐ€ ์žฅ์‹ ํ™”์‚ดํ‘œ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ๋‹ค.
18
+ ๊ทธ ์ปจํŠธ๋กค์€ ์ฒดํฌ๋ฐ•์Šค์™€ **๋‹ค๋ฅธ tab stop**์ด๊ณ  ๋ˆ„๋ฅด๋ฉด ์ ˆ๋Œ€ ์ฒดํฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
19
+
20
+ **๋ง‰์•„ ๋‘” ์กฐํ•ฉ.** ํ•„์ˆ˜์ด๋ฉด์„œ ๋น„ํ™œ์„ฑ์ธ ํ•ญ๋ชฉ์€ descriptor ๋‹จ๊ณ„์—์„œ ๊ฑฐ์ ˆํ•œ๋‹ค. ํ—ˆ์šฉํ•˜๋ฉด
21
+ ์‚ฌ์šฉ์ž๊ฐ€ ์˜์›ํžˆ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ํ™”๋ฉด์ด ์กฐ์šฉํžˆ ๋งŒ๋“ค์–ด์ง€๊ณ , "๋ฒ„ํŠผ์ด ์™œ ์•ˆ ๋ˆŒ๋ฆฌ๋Š”๊ฐ€"๋ฅผ
22
+ ์•„๋ฌด๋„ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋‹ค.
23
+
24
+ **๋น„ํ™œ์„ฑ ํ•ญ๋ชฉ์˜ ํšŒ๊ณ„.** ์ „์ฒด ๋™์˜์˜ ๋ถ„๋ชจ์—์„œ ๋บ€๋‹ค โ€” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ "๋œ
25
+ ๋™์˜ํ–ˆ๋‹ค"๊ณ  ์…€ ์ˆ˜ ์—†๋‹ค. ํ•„์ˆ˜๋Š” ๋น„ํ™œ์„ฑ์ผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ `satisfied` ํŒ์ •์—๋Š” ์ด ์˜ˆ์™ธ๊ฐ€ ์—†๋‹ค.
26
+
27
+ **์ œํ’ˆ์ด ์†Œ์œ ํ•˜๋Š” ๊ฒƒ.** ๋ฌธ๊ตฌ, ๋งํฌ ์ฃผ์†Œ, ๋ฒ•์  ์œ ํšจ์„ฑ, ๋™์˜ ๊ธฐ๋ก์˜ ์ €์žฅยท์ฆ๋น™. HJM์€
28
+ ํŒ์ •๊ณผ ๋ฐฐ์น˜๋งŒ ๊ฐ–๋Š”๋‹ค. ์•ฝ๊ด€ ๋‚ด์šฉ์„ ์–ด๋””์— ๋ณด์—ฌ์ค„์ง€(๋งํฌยท์‹œํŠธยท์ƒˆ ํ™”๋ฉด)๋„ ์ œํ’ˆ ๊ฒฐ์ •์ด๋ผ
29
+ `detail.href`๋Š” ์„ ํƒ์ด๊ณ , ์—†์œผ๋ฉด renderer๊ฐ€ ๋ฒ„ํŠผ์œผ๋กœ ๋‚ธ๋‹ค.
30
+
31
+ **ํ”Œ๋žซํผ ๋ฒˆ์—ญ.** Web์€ `group` + `checkbox` + ๋ณ„๋„ ๋งํฌ/๋ฒ„ํŠผ, Native๋Š” checkbox
32
+ accessibility state์™€ `openDetail` action์ด๋‹ค. ๋‘ ํ‘œ๋ฉด ๋ชจ๋‘ ์ „์ฒด ๋™์˜ ํ–‰์ด ๋ชฉ๋ก์˜ ์ œ๋ชฉ
33
+ ์—ญํ• ์„ ํ•˜๋„๋ก `surface.sunken` ์œ„์— ๋†“๋Š”๋‹ค.
package/docs/anchor.md CHANGED
@@ -1,59 +1,59 @@
1
- # Anchor โ€” ๊ณ„์•ฝ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค
2
-
3
- ## ๋ฌธ์ œ๋กœ ์ œ๊ธฐ๋œ ๊ฒƒ
4
-
5
- Ant Design `Anchor`๋Š” ๊ธด ๋ฌธ์„œ ์•ˆ์˜ ๋ชฉ์ฐจ ๋งํฌ๋ฅผ ์Šคํฌ๋กค ์œ„์น˜์™€ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€ํ† 
6
- ๊ด€์ฐฐ์€, ์ง„์งœ ๊ณ„์•ฝ์€ **ํ˜„์žฌ ์œ„์น˜ ํ‘œ์‹œ**(`aria-current`), **์Šคํฌ๋กค ๋™๊ธฐํ™”**,
7
- **reduced motion์—์„œ ๋ถ€๋“œ๋Ÿฌ์šด ์Šคํฌ๋กค์„ ๋„๋Š” ๊ฒƒ**์ด๋ผ๋Š” ๊ฒƒ๊ณผ, ๋‘ ์ œํ’ˆ์— ๊ธด ๋ฌธ์„œ ํ™”๋ฉด์ด
8
- ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ผ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
9
-
10
- ## ํŒ์ •: ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค
11
-
12
- ### 1. ๋‘ ์ œํ’ˆ ์ค‘ ์–ด๋””์—๋„ ๋ชฉ์ฐจ๊ฐ€ ํ•„์š”ํ•œ ๊ธด ๋‹จ์ผ ๋ฌธ์„œ ํ™”๋ฉด์ด ์—†๋‹ค
13
-
14
- - **Yajalal RN**: `์•ฝ๊ด€`/`๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ`/`์ด์šฉ์•ฝ๊ด€` ๋ฅ˜ ํ™”๋ฉด, ๋˜๋Š” ์„น์…˜์ด ์—ฌ๋Ÿฟ์ธ ๊ธด
15
- ์Šคํฌ๋กค ๋ฌธ์„œ ํ™”๋ฉด์„ ์ „์ˆ˜ ๊ฒ€์ƒ‰ํ–ˆ์ง€๋งŒ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. `modules/app-rn/src/lib/copy/terms.ts`๋Š”
16
- ์ด๋ฆ„๊ณผ ๋‹ฌ๋ฆฌ ๋ฒ•์  ์•ฝ๊ด€์ด ์•„๋‹ˆ๋ผ "๊ฐ™์€ ๊ฐœ๋…์—๋Š” ํ•˜๋‚˜์˜ ๋‹จ์–ด"๋ฅผ ๊ฐ•์ œํ•˜๋Š” **์นดํ”ผ ์šฉ์–ด
17
- ๋‹จ์ผ ์ถœ์ฒ˜**(๊ตฌ๋‹จยท๊ฒฝ๊ธฐ์ฐจ ํ‘œ๊ธฐ ๋“ฑ)์ผ ๋ฟ, ๋ชฉ์ฐจ ๋‚ด๋น„๊ฒŒ์ด์…˜์ด ํ•„์š”ํ•œ ๋ฌธ์„œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
18
- ํ™”๋ฉด ๊ตฌ์กฐ๋„ DESIGN_SYSTEM.md๊ฐ€ "48pt ์ƒ๋‹จ๋ฐ” + overlineยท๋Œ€ํ˜• ์ œ๋ชฉยท์„ค๋ช… ๋ฌธ์žฅ์œผ๋กœ ์ด๋ฃจ์–ด์ง„
19
- ํŽ˜์ด์ง€ ํ—ค๋”๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค"๋กœ ๊ทœ์ •ํ•ด, ์• ์ดˆ์— ์Šคํฌ๋กค ๋ชฉ์ฐจ๊ฐ€ ๋ถ™๋Š” ๊ธด article ๋ ˆ์ด์•„์›ƒ์„
20
- ํ”ผํ•˜๋Š” ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค.
21
- - **BurnTok**: `apps/web/src/app`์˜ ์ตœ์ƒ์œ„ ๋ผ์šฐํŠธ(`feed`, `messages`, `notifications`,
22
- `u/[id]`, `c/[id]`, `create`, `ideas`, `run` ๋“ฑ)๋ฅผ ์ „์ˆ˜ ํ™•์ธํ–ˆ์ง€๋งŒ ์•ฝ๊ด€ยท๋„์›€๋งยท๋ธ”๋กœ๊ทธ
23
- ๊ฐ™์€ ๊ธด ๋ฌธ์„œ ํŽ˜์ด์ง€ ์ž์ฒด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•ฑ์˜ ์„ฑ๊ฒฉ(ํ”ผ๋“œํ˜• ์†Œ์…œ/์˜์ƒ)์ƒ ์Šคํฌ๋กค ๋ชฉ์ฐจ๊ฐ€
24
- ๋ถ™์„ ๋งŒํ•œ ๋‹จ์ผ ๊ธด ๋ฌธ์„œ ํ™”๋ฉด์ด ์—†์Šต๋‹ˆ๋‹ค.
25
- - `anchor`๋กœ ๋‘ ์ €์žฅ์†Œ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ๋‚˜์˜จ ์œ ์ผํ•œ ์‹ค์ œ ์ฝ”๋“œ ๋งค์น˜๋Š” BurnTok
26
- `AppTooltip.tsx`/`anchored-overlay.ts`์˜ "anchor element"์˜€๋Š”๋ฐ, ์ด๋Š” ํˆดํŒ์ด ๋ถ™๋Š”
27
- ๊ธฐ์ค€ ์š”์†Œ๋ฅผ ๋œปํ•˜๋Š” **์˜ค๋ฒ„๋ ˆ์ด ์œ„์น˜ ๊ณ„์‚ฐ ์šฉ์–ด**๋กœ, antd `Anchor`(๋ฌธ์„œ ๋‚ด ๋ชฉ์ฐจ)์™€๋Š”
28
- ์ด๋ฆ„๋งŒ ๊ฐ™๊ณ  ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
29
-
30
- ### 2. ๊ณ„์•ฝํ•  ์ƒํƒœ ์ถ•์€ ์œ ํšจํ•˜์ง€๋งŒ, ์ง€๊ธˆ ์ฑ„์šธ ํ™”๋ฉด์ด ์—†๋‹ค
31
-
32
- ๊ด€์ฐฐ์ด ์งš์€ ์„ธ ๊ณ„์•ฝ(`aria-current` ํ˜„์žฌ ์œ„์น˜, ์Šคํฌ๋กค ๋™๊ธฐํ™”, reduced motion์—์„œ smooth
33
- scroll ๋„๊ธฐ)์€ ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด ํ”Œ๋žซํผ ์ค‘๋ฆฝ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค โ€” `BottomNavigation`์˜
34
- `aria-current="page"`(`docs/architecture.md` BottomNavigation ์ ˆ)์™€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ "ํ˜„์žฌ
35
- ์œ„์น˜" ํ‘œ์‹œ์ด๊ณ , `Toast`/`Sheet`์˜ Reduce Motion ์ฒ˜๋ฆฌ์™€๋„ ๋‹ค๋ฅธ ๋Œ€์ƒ(์Šคํฌ๋กค ์• ๋‹ˆ๋ฉ”์ด์…˜)์—
36
- ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. `Notification`/`Dropdown`/`VirtualList`์ฒ˜๋Ÿผ "๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—
37
- ํก์ˆ˜๋๋‹ค"๋Š” ํŒ์ •์€ ์•„๋‹™๋‹ˆ๋‹ค โ€” ํก์ˆ˜ํ•  ๊ณณ์ด ์—†๊ณ , ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€
38
- ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
39
-
40
- ๊ทธ๋Ÿผ์—๋„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์ˆœ์ „ํžˆ **์ธก์ •๋œ ์ˆ˜์š” ๋ถ€์žฌ**์ž…๋‹ˆ๋‹ค. ๋ชฉ์ฐจ์™€ ๋™๊ธฐํ™”ํ•  ๊ธด
41
- ๋ฌธ์„œ ์ž์ฒด๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ ์Šคํฌ๋กค ๋™๊ธฐํ™” ๋กœ์ง์„ ๋จผ์ € ์„ค๊ณ„ํ•˜๋ฉด, ์‹ค์ œ ๋ฌธ์„œ ๊ตฌ์กฐ(์„น์…˜
42
- ๊ฐœ์ˆ˜, ์ค‘์ฒฉ ๊นŠ์ด, ๋ชจ๋ฐ”์ผ์—์„œ ์„ธ๋กœ ๋ชฉ์ฐจ๋ฅผ ์–ด๋–ป๊ฒŒ ์ ‘์„์ง€)๋ฅผ ๋ชจ๋ฅธ ์ฑ„ API๋ฅผ ๊ณ ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
43
- `docs/authoring-brief.md`์™€ ๋กœ๋“œ๋งต์ด ๋ฐ˜๋ณตํ•ด์„œ ์š”๊ตฌํ•˜๋Š” "์‹ค์ œ ์ œํ’ˆ vertical slice ์—†์ด
44
- ์Šน๊ฒฉํ•˜์ง€ ์•Š๋Š”๋‹ค"๋Š” gate ์ด์ „์—, **์• ์ดˆ์— ๊ณ„์•ฝ์„ ๊ฒ€์ฆํ•  ํ™”๋ฉด์ด ์—†๋Š”** ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
45
-
46
- ## ๋งŒ๋“ค์ง€ ์•Š์€ ๊ฒƒ
47
-
48
- `src/anchor.ts`, `test/anchor.test.ts`๋Š” ์—†์Šต๋‹ˆ๋‹ค. `componentCatalog`์˜
49
- `{ name: "Anchor", category: "navigation", platform: "web", status: "planned" }` ํ–‰๊ณผ
50
- crosswalk์˜ `Anchor โ†’ Anchor` direct ๊ด€๊ณ„(`src/component-references.ts:64`)๋Š” ๊ฑด๋“œ๋ฆฌ์ง€
51
- ์•Š์Šต๋‹ˆ๋‹ค.
52
-
53
- ## ๋’ค์ง‘ํž ์กฐ๊ฑด
54
-
55
- 1. BurnTok ๋˜๋Š” Yajalal(Web ์šฐ์„ , `platform: "web"` ๊ทธ๋Œ€๋กœ ์œ ์ง€ ๊ฐ€๋Šฅ)์— ์—ฌ๋Ÿฌ ์„น์…˜์„ ๊ฐ€์ง„
56
- ๊ธด ๋‹จ์ผ ๋ฌธ์„œ ํ™”๋ฉด(์•ฝ๊ด€, ๋„์›€๋ง, ๊ฐ€์ด๋“œ ๋“ฑ)์ด ์‹ค์ œ๋กœ ์ƒ๊ธด๋‹ค.
57
- 2. ๊ทธ ํ™”๋ฉด์—์„œ `aria-current` ๊ธฐ๋ฐ˜ ํ˜„์žฌ ์„น์…˜ ํ‘œ์‹œ, ์Šคํฌ๋กค ๋™๊ธฐํ™”, reduced motion์˜ ์ฆ‰์‹œ
58
- ์ด๋™(auto) ์ „ํ™˜์ด ์‹ค์ œ๋กœ ์š”๊ตฌ๋˜๋Š” vertical slice๊ฐ€ ์ธก์ •๋œ๋‹ค โ€” ๊ทธ๋•Œ ์ด ์„ธ ์ถ•์„ ๊ณต๊ฐœ
59
- ์ƒํƒœ ์ถ•์œผ๋กœ ๊ณ„์•ฝํ•œ๋‹ค.
1
+ # Anchor โ€” ๊ฐ™์€ ๋ฌธ์„œ ์•ˆ์˜ ๋ชฉ์ฐจ
2
+
3
+ 2026-09-16 React/RN ํ™•์žฅ ์š”์ฒญ์— ๋”ฐ๋ผ Web ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ beta๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์‹ค์ œ ์ œํ’ˆ์˜
4
+ ๊ธด ๋ฌธ์„œ ์ˆ˜์š”๊ฐ€ ์—†์–ด planned์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ž‘๋™ํ•˜๋Š” ๋ฌธ์„œ ์˜ˆ์ œ์™€ ๋ธŒ๋ผ์šฐ์ € ๊ฒ€์ฆ๊นŒ์ง€
5
+ ์ œ๊ณตํ•˜๋ฉฐ ์ œํ’ˆ ์ฑ„ํƒยท๋ณด์กฐ๊ธฐ๊ธฐ ๊ฒ€์ฆยทstable ์Šน๊ฒฉ์€ ๋ณ„๋„๋กœ ๋‚จ๊น๋‹ˆ๋‹ค.
6
+
7
+ [Ant Design Anchor](https://ant.design/components/anchor/)์˜ ๋ฌธ์„œ ๋‚ด ๋งํฌยทํ˜„์žฌ ์œ„์น˜ยท์Šคํฌ๋กค
8
+ ์˜์—ญ ๊ตฌ๋ถ„์„ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค. HJM์€ content-brand ๊ธ€์ž์™€ ์–‡์€ ๋…ผ๋ฆฌ ๋ฐฉํ–ฅ ํ‘œ์‹œ์„ ์œผ๋กœ ์œ„์น˜๋ฅผ
9
+ ๋ณด์—ฌ์ฃผ๋ฉฐ ๋ณ„๋„ ์นด๋“œ๋‚˜ ์ฃผ์š” ํ–‰๋™ ๋ฒ„ํŠผ์œผ๋กœ ๊ฐ•์กฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. API ํ˜ธํ™˜์„ ์•ฝ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
10
+
11
+ ## ์‚ฌ์šฉ๋ฒ•
12
+
13
+ ```tsx
14
+ import { Anchor } from "@hjmds/react/anchor";
15
+
16
+ <Anchor label="๊ฐ€์ด๋“œ ๋ชฉ์ฐจ" items={[
17
+ { id: "start", label: "์‹œ์ž‘ํ•˜๊ธฐ" },
18
+ { id: "next", label: "๋‹ค์Œ ๋‹จ๊ณ„" },
19
+ ]} offset={64} />
20
+ // ๊ฐ™์€ ๋ฌธ์„œ์— ๊ณ ์œ  ID๋ฅผ ๊ฐ€์ง„ <section id="start">, <section id="next">๋ฅผ ๋‘ก๋‹ˆ๋‹ค.
21
+ ```
22
+
23
+ - `items`๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ `{ id, label }` ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ID๋Š” ๊ณต๋ฐฑ ์—†์ด ๋ฌธ์„œ ์•ˆ์—์„œ ๊ณ ์œ ํ•ด์•ผ
24
+ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต IDยท๋นˆ label์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. fragment๋Š” ID๋ฅผ URL encodeํ•ด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
25
+ - `container` ์ƒ๋žต ์‹œ ๋ฌธ์„œ ์Šคํฌ๋กค์„ ๊ด€์ฐฐํ•ฉ๋‹ˆ๋‹ค. `HTMLElement`๋ฅผ ๋„˜๊ธฐ๋ฉด ํ•ด๋‹น ์˜์—ญ ๋‚ด๋ถ€๋งŒ
26
+ ๊ด€์ฐฐํ•ฉ๋‹ˆ๋‹ค. ref๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” `null`์—์„œ๋Š” ๊ด€์ฐฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
27
+ - `offset`์€ ์ƒ๋‹จ ๊ณ ์ • ํ—ค๋” ์•„๋ž˜์— ๋‚จ๊ธธ CSS px์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ 0์ด๊ณ  ์œ ํ•œํ•œ ์Œ์ด ์•„๋‹Œ ์ˆ˜๋งŒ
28
+ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„ ์Šคํฌ๋กค ์˜์—ญ์˜ border์™€ scrollTop์„ ํฌํ•จํ•ด ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
29
+ - `orientation`์€ `vertical` ๊ธฐ๋ณธ๊ฐ’ ๋˜๋Š” `horizontal`์ž…๋‹ˆ๋‹ค. ์ข์€ ํญ์—์„œ ๋งํฌ๊ฐ€ ์ค„๋ฐ”๊ฟˆํ•˜๋ฉฐ
30
+ ๊ธด label์„ ์ž๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชฉ์ฐจ์˜ sticky ๋ฐฐ์น˜์™€ ๋ฌธ์„œ ๋ ˆ์ด์•„์›ƒ์€ ํ˜ธ์ŠคํŠธ๊ฐ€ ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค.
31
+ - `historyMode`๋Š” `push` ๊ธฐ๋ณธ๊ฐ’, `replace`, `none`์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋‘˜์€ ๊ธฐ์กด history.state๋ฅผ
32
+ ๋ณด์กดํ•˜๋ฉฐ fragment๋งŒ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. `none`์€ URL์„ ์“ฐ์ง€ ์•Š๋Š” ๋‚ด์žฅ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
33
+ - `onNavigate(id, event)`์—์„œ `preventDefault()`๋กœ ์•ฑ ๋ผ์šฐํ„ฐ ๋“ฑ์— ๋™์ž‘์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
34
+ ์ƒˆ ํƒญ์„ ์—ฌ๋Š” modifier ํด๋ฆญ์€ ๋ธŒ๋ผ์šฐ์ €์— ๋งก๊น๋‹ˆ๋‹ค. `ref`๋Š” nav ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
35
+
36
+ ## ์Šคํฌ๋กคยท์ดˆ์  ๊ณ„์•ฝ
37
+
38
+ `nav > ul > li > a`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ˜„์žฌ ๋งํฌ ํ•˜๋‚˜์— `aria-current="location"`์„ ๋‘ก๋‹ˆ๋‹ค.
39
+ ๋Œ€์ƒ์ด DOM์— ์—†๋Š” ๋งํฌ๋Š” ํ˜„์žฌ ์œ„์น˜ ํ›„๋ณด์—์„œ ์ œ์™ธํ•˜๋ฉฐ ๊ธฐ๋ณธ href ๋™์ž‘์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
40
+ ์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น section/์ œ๋ชฉ์— ์ดˆ์ ์„ ์˜ฎ๊น๋‹ˆ๋‹ค. ์ผ๋ฐ˜ section์€ ์ž„์‹œ `tabindex=-1`์„
41
+ ๋ฐ›๊ณ  blur/unmount ๋•Œ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. Tab/Enter๋Š” ๋ธŒ๋ผ์šฐ์ € ๋งํฌ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
42
+
43
+ ํ˜„์žฌ ์œ„์น˜๋Š” DOM ์ˆœ์„œ์˜ ๊ฐ€์ • ๋Œ€์‹  ์‹ค์ œ ์œ„์น˜๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋กค ๋์—์„œ๋Š” ์งง์€ ๋งˆ์ง€๋ง‰
44
+ ์„น์…˜๋„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋กคยท์ฐฝ ํฌ๊ธฐยท๋Œ€์ƒ/๋ถ€๋ชจ ํฌ๊ธฐยท๋ณธ๋ฌธ ์‚ฝ์ž…/์‚ญ์ œ๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  unmount ๋•Œ
45
+ listenerยทobserverยท์˜ˆ์•ฝ frame์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. CSS transform๋งŒ์œผ๋กœ ์œ„์น˜๋ฅผ ์›€์ง์ด๋Š” ๋ณ„๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜์€
46
+ ๊ณ„์•ฝ์— ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. window์˜ hashchange/popstate์™€ ์ดˆ๊ธฐ fragment๋Š” ๋“ฑ๋ก๋œ ๋Œ€์ƒ์œผ๋กœ
47
+ ์ฆ‰์‹œ ์ด๋™ํ•˜์—ฌ ๋ณ„๋„ ์Šคํฌ๋กค ์˜์—ญ๋„ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค.
48
+
49
+ ์ผ๋ฐ˜ ํด๋ฆญ์€ smooth scroll์ž…๋‹ˆ๋‹ค. HJM ํ™˜๊ฒฝ ๋˜๋Š” OS๊ฐ€ reduced motion์ด๋ฉด `instant`๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
50
+ `auto`๋Š” ํ˜ธ์ŠคํŠธ์˜ scroll-behavior์— ๋”ฐ๋ผ ๋‹ค์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜๋  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
51
+
52
+ ## ๋ฒ”์œ„์™€ ๊ฒ€์ฆ
53
+
54
+ Web ์ „์šฉ์ž…๋‹ˆ๋‹ค. Native ๋ผ์šฐํŒ…ยท๋ชฉ๋ก ์œ„์น˜ ์ด๋™์€ ํ•ด๋‹น ํ”Œ๋žซํผ๊ณผ ์ œํ’ˆ์ด ์†Œ์œ ํ•˜๋ฉฐ ๋นˆ RN wrapper๋ฅผ
55
+ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘์ฒฉ ํŠธ๋ฆฌ ๋ชฉ์ฐจยท์ž๋™ ์ œ๋ชฉ ์ˆ˜์ง‘ยท์˜ค๋ฒ„๋ ˆ์ด anchor positioning์€ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
56
+
57
+ `Patterns/Anchor`๋Š” ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ์ฝ๊ธฐ ๊ฐ€์ด๋“œ์™€ ๋ณ„๋„ ์Šคํฌ๋กค ์˜์—ญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
58
+ ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ๋Š” ์œ„์น˜ ๋™๊ธฐํ™”ยท์งง์€ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„ยทoffsetยทreduced motionยท์ž„์‹œ focus ๋ณต์›ยท
59
+ fragment ๋ณต๊ตฌยท๋‚˜์ค‘์— ์‚ฝ์ž…๋œ ๋Œ€์ƒ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ œํ’ˆ ๋ฌธ์„œ ์ฑ„ํƒยท๋ณด์กฐ๊ธฐ๊ธฐ ๊ฒ€์ฆ์€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.
@@ -53,7 +53,7 @@ message์™€ notification์„ ๊ฐ€๋ฅด๋Š” ์ถ•(์ •๋ณด ์ธต, ์ง€์† ์‹œ๊ฐ„, ๋™์‹œ ๊ฐœ
53
53
  | ์ข…๋ฅ˜ | ๋œป | ์˜ˆ | ์žฌ๊ฒ€ํ†  ์‹ ํ˜ธ |
54
54
  |---|---|---|---|
55
55
  | **ํก์ˆ˜๋จ** | ๊ทธ ๋ฌธ์ œ๋ฅผ ์ด๋ฏธ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™„๊ฒฐํ•œ๋‹ค | `Notification`โ†’Toast, `Dropdown`โ†’Menu, `ContextPanel`โ†’SidePanel/Sheet, `Flex`โ†’Stack, `TimePicker`โ†’Select ์กฐํ•ฉ, `Rating`โ†’Slider/Statistic | ํก์ˆ˜ํ•œ ์ชฝ์ด ๋ชป ํ‘ธ๋Š” ์š”๊ตฌ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ |
56
- | **๊ฒ€์ฆํ•  ํ™”๋ฉด์ด ์—†์Œ** | ๊ณ„์•ฝ ์ž์ฒด๋Š” ์œ ํšจํ•˜๋‚˜ ์ด๋ฅผ ํ™•์ธํ•  ์ œํ’ˆ ํ™”๋ฉด์ด ์—†๋‹ค | `Anchor`, `Calendar` | ๊ทธ ํ™”๋ฉด์ด ์‹ค์ œ๋กœ ์ƒ๊ธธ ๋•Œ |
56
+ | **๊ฒ€์ฆํ•  ํ™”๋ฉด์ด ์—†์Œ** | ๊ณ„์•ฝ ์ž์ฒด๋Š” ์œ ํšจํ•˜๋‚˜ ์ด๋ฅผ ํ™•์ธํ•  ์ œํ’ˆ ํ™”๋ฉด์ด ์—†๋‹ค | `Anchor` | ๊ทธ ํ™”๋ฉด์ด ์‹ค์ œ๋กœ ์ƒ๊ธธ ๋•Œ |
57
57
  | **๊ฑฐ์ ˆ๋จ** | ๊ณ„์•ฝ๋„ ์œ ํšจํ•˜๊ณ  ํ™”๋ฉด์ด ์ƒ๊ฒจ๋„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค | `BorderBeam`(์žฅ์‹), `AppProvider`(๋Ÿฐํƒ€์ž„๋ฟ), `Utility`(์‹ค์ฒด ์—†์Œ) | ์ •์ฒด์„ฑ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ |
58
58
  | **ํก์ˆ˜ ๋Œ€๊ธฐ** | ํก์ˆ˜ ํŒ์ •์€ ๋๋‚ฌ์œผ๋‚˜ **์„ ๊ฒฐ ์ถ•์ด ์•„์ง ์—†๋‹ค** | `Cascader`(TreeSelect์— `valueMode`/`commitAt`๊ฐ€ ์ถ”๊ฐ€๋ผ์•ผ ์„ฑ๋ฆฝ) | ๊ทธ ์ถ•์ด ์‹ค์ œ๋กœ ์ถ”๊ฐ€๋  ๋•Œ |
59
59
 
@@ -88,8 +88,10 @@ evidence registry๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
88
88
  - partial maturity: decomposed target ์ค‘ ์ผ๋ถ€๋งŒ stable ๋˜๋Š” beta
89
89
  - planned only: ๋ชจ๋“  target์ด planned
90
90
 
91
- 2026-08-27 snapshot์˜ status ๊ธฐ๋ฐ˜ ๋ถ„ํฌ๋Š” **fully mature 45 / partial maturity 1 /
92
- planned only 27**์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 73/73 tracking์€ 73๊ฐœ ๊ตฌํ˜„ ์™„๋ฃŒ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
91
+ 2026-09-18 SidePanelยทSplitterยทTourยทTreeยทTransferListยทMentionsยทCommandPaletteยทDataTable renderer๊นŒ์ง€ ์ถ”๊ฐ€ํ•œ ๋’ค status ๊ธฐ๋ฐ˜ ๋ถ„ํฌ๋Š”
92
+ **fully mature 59 / partial maturity 0 /
93
+ planned only 14**์ž…๋‹ˆ๋‹ค. decomposed Drawer์˜ ๋‘ ๊ฐˆ๋ž˜(SheetยทSidePanel)๊ฐ€ ๋ชจ๋‘ ๊ตฌํ˜„๋˜๋ฉด์„œ
94
+ partial maturity๊ฐ€ ๋น„์—ˆ์Šต๋‹ˆ๋‹ค โ€” 0์€ "๋ถ€๋ถ„ ๊ตฌํ˜„์ด ์—†๋‹ค"๋Š” ๋œป์ด๊ณ  planned only 20์€ ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 73/73 tracking์€ 73๊ฐœ ๊ตฌํ˜„ ์™„๋ฃŒ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
93
95
  ํ™ˆ๊ณผ Component Explorer๋Š” ์ด ์ˆ˜์น˜๋ฅผ ๋ถ„๋ฆฌํ•ด ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์ˆซ์ž๋Š” source inventory ์ˆ˜๊ฐ€
94
96
  ์•„๋‹ˆ๋ผ HJM target์˜ maturity์—์„œ ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ catalog status๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•จ๊ป˜ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
95
97
 
package/docs/asset.md ADDED
@@ -0,0 +1,26 @@
1
+ # Asset contract
2
+
3
+ **๋ฌธ์ œ.** ์•„์ด์ฝ˜ยท์ด๋ฏธ์ง€ยทLottieยท๋น„๋””์˜ค๋ฅผ **๊ฐ™์€ ์•ก์ž**์— ๋„ฃ๋Š” ์ž๋ฆฌ.
4
+
5
+ **IconยทImageยทAvatar๊ฐ€ ์žˆ๋Š”๋ฐ ์™œ ๋˜ ๋‘๋Š”๊ฐ€.** ์…‹์€ ๊ฐ์ž ๋‹ค๋ฅธ ๋ชจ์–‘ ๊ทœ์น™์„ ๊ฐ–๋Š”๋‹ค โ€” ์•„์ด์ฝ˜์€
6
+ ์ •์‚ฌ๊ฐ, Avatar๋Š” ์›, Image๋Š” ๋น„์œจ. ์ด๋“ค์ด ๊ฐ™์€ ์ค„์— ์„ž์—ฌ ๋‚˜์˜ค๋ฉด ํฌ๊ธฐ์™€ ๋ชจ์„œ๋ฆฌ๊ฐ€ ์–ด๊ธ‹๋‚œ๋‹ค.
7
+ ์—์–ด๋ฆฌ์˜ `LottieArt`ยท`AnimalArt`๊ฐ€ ๊ทธ ์–ด๊ธ‹๋‚จ์„ ์ œํ’ˆ ์•ˆ์—์„œ ๋‹ค์‹œ ๋งž์ถ”๊ณ  ์žˆ์—ˆ๋‹ค. Asset์€
8
+ ์•ก์ž ๊ทœ์น™(ํฌ๊ธฐ 4๋‹จยท๋ชจ์–‘ 3์ข…ยท๊ฒน์นจยท๋ณด์กฐ ํ‘œ์‹)๋งŒ ๊ฐ–๋Š”๋‹ค.
9
+
10
+ **๋ฌด์—‡์„ ๊ทธ๋ฆด์ง€๋Š” ์Šฌ๋กฏ์œผ๋กœ ๋ฐ›๋Š”๋‹ค.** Lottie ์žฌ์ƒ๊ธฐ๋„ ๋น„๋””์˜ค ์žฌ์ƒ๊ธฐ๋„ ์ด ํŒจํ‚ค์ง€๊ฐ€ ์˜์กดํ•˜์ง€
11
+ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๊ณ„์•ฝ์— ์žฌ์ƒ ์ƒํƒœ(play/pause/seek)๊ฐ€ ์—†๋‹ค โ€” ์žฌ์ƒ๊ธฐ๋Š” ์ œํ’ˆ ๊ฒƒ์ด๊ณ , ์—ฌ๊ธฐ์„œ
12
+ ์ •ํ•˜๋Š” ๊ฒƒ์€ ์•ก์ž๋ฟ์ด๋‹ค. ์ด ๊ฒฝ๊ณ„๋ฅผ ํ๋ฆฌ๋ฉด `@hjmds/react`๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋Ÿฐํƒ€์ž„์„ ๋Œ๊ณ  ์˜จ๋‹ค.
13
+
14
+ **๋œป์ด ์žˆ๋Š” ์ž์‚ฐ์— ์ด๋ฆ„์ด ์—†์œผ๋ฉด ๊ฑฐ์ ˆํ•œ๋‹ค.** ์›€์ง์ด๋Š” ๊ทธ๋ฆผ์ผ์ˆ˜๋ก "๋ฌด์—‡์„ ๋œปํ•˜๋Š”์ง€"๊ฐ€
15
+ ํ™”๋ฉด์— ์—†์œผ๋ฉด ๋ณด์กฐ๊ธฐ๊ธฐ์—์„œ ์‚ฌ๋ผ์ง„๋‹ค. ๋ฐ˜๋Œ€๋กœ `decorative`์™€ `accessibilityLabel`์„ **ํ•จ๊ป˜**
16
+ ์ฃผ๋Š” ๊ฒƒ๋„ ๊ฑฐ์ ˆํ•œ๋‹ค โ€” ์กฐ์šฉํžˆ ํ•œ์ชฝ์„ ๋ฌด์‹œํ•˜๋ฉด ์ด๋ฆ„์„ ์ง€์šด ์ค„ ๋ชจ๋ฅธ๋‹ค.
17
+
18
+ **`reducedMotion`์—์„œ๋Š” ์ˆจ๊ธฐ์ง€ ์•Š๊ณ  ์ •์ง€ํ•œ๋‹ค.** ๊ทธ ์ž๋ฆฌ์— ๊ทธ๋ฆผ์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค ์ž์ฒด๊ฐ€ ํ™”๋ฉด์˜
19
+ ๋œป์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค(์—์–ด๋ฆฌ์˜ ๋™๋ฌผ). ์ •์ง€ ํ™”๋ฉด์„ ์ œํ’ˆ์ด ์ฃผ์ง€ ๋ชปํ•˜๋ฉด ์žฌ์ƒ๋งŒ ๋ฉˆ์ถ˜๋‹ค.
20
+ `shouldAnimateAsset(kind, reducedMotion)`์ด ์ด ํŒ๋‹จ์„ ๊ฐ–๋Š”๋‹ค.
21
+
22
+ **๋ณด์กฐ ํ‘œ์‹์€ ์•ก์ž ๋ฐ”๊นฅ ๋ชจ์„œ๋ฆฌ์— ๋ถ™๋Š”๋‹ค.** ์žฌ์ƒ ์•„์ด์ฝ˜์ด ๋งค์ฒด ์œ„์— ์˜ฌ๋ผ๊ฐ€๋ฉด ๊ฐ€์žฅ ์ค‘์š”ํ•œ
23
+ ํ”„๋ ˆ์ž„ ๊ฐ€์šด๋ฐ๋ฅผ ๊ฐ€๋ฆฐ๋‹ค.
24
+
25
+ **๊ฒน์นจ ๋น„์œจ์€ Avatar์™€ ๊ฐ™์€ ๊ฐ’์ด๋‹ค.** ํ•œ ์ค„์— ์„ž์—ฌ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ๊ธด ์ด์œ ๋ผ
26
+ ๋‘ ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ๊ทธ ์ค„์ด ๋‹ค์‹œ ์–ด๊ธ‹๋‚œ๋‹ค.
@@ -0,0 +1,65 @@
1
+ # AuthScreenLayout โ€” ๋กœ๊ทธ์ธ ํ™”๋ฉด์˜ ๋‘ ์˜์—ญ ๊ณจ๊ฒฉ
2
+
3
+ ## ๋ฌธ์ œ
4
+
5
+ ๊ณ„์ •์ด ์žˆ๋Š” ์ œํ’ˆ๋“ค์ด ๊ฐ™์€ ํ™”๋ฉด์„ ๊ฐ์ž ๋งŒ๋“ค์—ˆ๊ณ , ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๊ฐ์ž ํ–ˆ๋‹ค.
6
+
7
+ - ๋กœ๊ณ ยทํƒœ๊ทธ๋ผ์ธยท์„ค๋ช…ยท๋™์˜ ๊ณ ์ง€ยท์ •์ฑ… ๋งํฌ๋ฅผ ์œ„์—์„œ๋ถ€ํ„ฐ ์Œ“์•„ **์ฃผ ํ–‰๋™(์ œ๊ณต์ž ๋ฒ„ํŠผ)์ด ํ™”๋ฉด ๋ฐ–์œผ๋กœ
8
+ ๋ฐ€๋ ธ๋‹ค.** ๋ฒˆ๋š 2026-09-19 iPhone 17 Pro ์‹ค์ธก โ€” ์ฒซ ํ™”๋ฉด์—์„œ ๋ฒ„ํŠผ ์นด๋“œ๊ฐ€ ์ž˜๋ ค ๋ณด์˜€๋‹ค.
9
+ - ๊ฐ„๊ฒฉยท์ตœ๋Œ€ ํญยท๋งˆํฌ ํฌ๊ธฐ๊ฐ€ ์ œํ’ˆ๋งˆ๋‹ค ๋‹ฌ๋ž๋‹ค. ๋‹ค๋ฅผ ์ด์œ ๊ฐ€ ์—†๋Š”๋ฐ ์ œํ’ˆ๋งˆ๋‹ค ๋‹ค์‹œ ์ •ํ•ด์กŒ๋‹ค.
10
+ - ์ •์ฑ… ๋งํฌ๊ฐ€ ๊ธ€์ž ๋†’์ด๋งŒํผ๋งŒ ๋ˆŒ๋ ธ๋‹ค(44pt ๋ฏธ๋งŒ).
11
+
12
+ ์ด ํ™”๋ฉด์€ ํ•  ์ผ์ด ํ•˜๋‚˜๋ฟ์ด๋ผ ๋ฐฐ์น˜๊ฐ€ ๊ณง ๊ธฐ๋Šฅ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐฐ์น˜๋ฅผ ์ œํ’ˆ์ด ๋งค๋ฒˆ ๋‹ค์‹œ ์ •ํ•˜๋Š” ๊ฒƒ์ด
13
+ ๋ฌธ์ œ์˜€๋‹ค.
14
+
15
+ ## ์ผ๋ฐ˜ํ™”ํ•œ ๊ณ„์•ฝ
16
+
17
+ **๋‘ ์˜์—ญ๋งŒ ๋‘”๋‹ค.**
18
+
19
+ - ์œ„: `hero`(๋งˆํฌยท์ œ๋ชฉยท์„ค๋ช…) + `main`(์ฃผ ํ–‰๋™). ๋‘˜์ด ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ๋‚จ๋Š” ์„ธ๋กœ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ๊ทธ
20
+ ์•ˆ์—์„œ ๊ฐ€์šด๋ฐ ์ •๋ ฌํ•œ๋‹ค.
21
+ - ์•„๋ž˜: `footer`(๋™์˜ ๊ณ ์ง€ยท์ •์ฑ… ๋งํฌ). ๋ฐ”๋‹ฅ์— ๋ถ™๋Š”๋‹ค.
22
+
23
+ ์„ธ ์˜์—ญ ์ด์ƒ์œผ๋กœ ๋‚˜๋ˆ„์ง€ ์•Š๋Š”๋‹ค โ€” ์…‹์ด ๋˜๋ฉด ์–ด๋А ๊ฒƒ์ด ์ฃผ ํ–‰๋™์ธ์ง€๊ฐ€ ๋ฐฐ์น˜๋กœ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
24
+ ๋‚ด์šฉ์ด ํ™”๋ฉด๋ณด๋‹ค ๊ธธ์–ด์ง€๋ฉด **์Šคํฌ๋กค๋กœ ์ „ํ™˜**ํ•˜๊ณ , ์•„๋ž˜ ์˜์—ญ์„ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค.
25
+
26
+ `density`๋Š” `compact`/`regular` ๋‘˜๋ฟ์ด๋‹ค. ์ œํ’ˆ์ด ํ™”๋ฉด ๋†’์ด๋ฅผ ๋ณด๊ณ  ๊ณ ๋ฅด๋ฉฐ HJM์€ ๊ธฐ๊ธฐ ์ข…๋ฅ˜๋ฅผ
27
+ ์ถ”์ธกํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ๊ฐ™์€ ํญ์ด๋ผ๋„ ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜ค๋ฉด ์ข์•„์ง„๋‹ค.
28
+
29
+ ## HJM ๊ธฐ๋ณธ๊ฐ’
30
+
31
+ | ๊ฐ’ | ๊ธฐ๋ณธ | ๊ทผ๊ฑฐ |
32
+ | --- | --- | --- |
33
+ | ์ตœ๋Œ€ ํญ | 416 (26rem) | `Container`์˜ reading(720)๋ณด๋‹ค ์ข๋‹ค. ์ œ๊ณต์ž ๋ฒ„ํŠผ์ด ๋…ธํŠธ๋ถ ํญ๋งŒํผ ๊ธธ์–ด์ง€๋ฉด ๋ˆ„๋ฅผ ๊ณณ์ด ์•„๋‹ˆ๋ผ ๋ ๋กœ ๋ณด์ธ๋‹ค |
34
+ | ๋งˆํฌ | 72 ยท radius `lg` | ์•„์ด์ฝ˜(48)๋ณด๋‹ค ํฌ๊ณ  ์ผ๋Ÿฌ์ŠคํŠธ(120+)๋ณด๋‹ค ์ž‘๋‹ค โ€” ์ œํ’ˆ์„ ์•Œ์•„๋ณผ ์ตœ์†Œ ํฌ๊ธฐ |
35
+ | hero ๊ฐ„๊ฒฉ | `md`(compact `xs`) | ๋งˆํฌโ†’์ œ๋ชฉโ†’์„ค๋ช…์ด ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ฝํžˆ๋Š” ๊ฑฐ๋ฆฌ |
36
+ | main ๊ฐ„๊ฒฉ | `xl`(compact `md`) | ํžˆ์–ด๋กœ์™€ ์ฃผ ํ–‰๋™์„ ๋ถ„๋ฆฌํ•˜๋˜ ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ์œ ์ง€ |
37
+ | footer ๊ฐ„๊ฒฉ | `xl`(compact `md`) | **์ตœ์†Œ๊ฐ’**์ด๋‹ค. ํ™”๋ฉด์ด ๊ธธ๋ฉด ๊ทธ ์ด์ƒ ๋ฒŒ์–ด์ง„๋‹ค |
38
+ | ์ œ๊ณต์ž ๋ฒ„ํŠผ ๋†’์ด | `authProviderButtonRecipe.minHeight` | ์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‘ ๊ณ„์•ฝ์ด ๊ฐ์ž ๊ฐ’์„ ๋“ค๋ฉด ํ•œ์ชฝ๋งŒ ๋ฐ”๋€Œ์–ด ๋ฒ„ํŠผ ์ค„๊ธฐ๊ฐ€ ์–ด๊ธ‹๋‚œ๋‹ค |
39
+ | ์ •์ฑ… ๋งํฌ ํ„ฐ์น˜ | `control.minTouchTarget` | ๊ธ€์ž ๋†’์ด๋งŒ ๋ˆ„๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉด 44pt์— ๋ชป ๋ฏธ์นœ๋‹ค |
40
+
41
+ ## ์ด ๊ณ„์•ฝ์— ์—†๋Š” ๊ฒƒ
42
+
43
+ - **๋ฌธ๊ตฌ ์ „๋ถ€** โ€” ํƒœ๊ทธ๋ผ์ธยท์„ค๋ช…ยท๋™์˜ ๊ณ ์ง€ยท๋ฒ„ํŠผ ๋ผ๋ฒจ. ์ œํ’ˆ์ด ์ง€์—ญํ™”ํ•ด์„œ ๋„˜๊ธด๋‹ค.
44
+ - **๋งˆํฌ ์ž์‚ฐ** โ€” ์Šฌ๋กฏ์œผ๋กœ ๋ฐ›๋Š”๋‹ค.
45
+ - **์ œ๊ณต์ž ๋ชฉ๋ก๊ณผ ์ˆœ์„œ** โ€” ์„œ๋ฒ„๊ฐ€ ์ •๋ณธ์ธ ์ œํ’ˆ์ด ์žˆ์–ด HJM์ด ์ •ํ•  ์ˆ˜ ์—†๋‹ค.
46
+ - **์ •์ฑ… ๋งํฌ์˜ ๋ชฉ์ ์ง€** โ€” ์ œํ’ˆ์˜ ๊ฒŒ์‹œ ์ฃผ์†Œ๋‹ค.
47
+ - **์ธ์ฆ ํ๋ฆ„** โ€” ์‹œ์ž‘ยท์ทจ์†Œยท์žฌ๊ฐœยท์„ธ์…˜. ํ™”๋ฉด ๊ณจ๊ฒฉ๊ณผ ๋ฌด๊ด€ํ•˜๋‹ค.
48
+ - **`main`์— ๋ฌด์—‡์ด ๋“ค์–ด๊ฐ€๋Š”์ง€** โ€” ์ œ๊ณต์ž ๋ฒ„ํŠผ๋งŒ ๋„ฃ๋Š” ์ œํ’ˆ๋„, ๊ฐ€์ž… ์žฌ๊ฐœยท์‹ฌ์‚ฌ์ž ์ž…๋ ฅ ๊ฐ™์€
49
+ ์ œํ’ˆ ๋ฉ์–ด๋ฆฌ๋ฅผ ํ†ต์งธ๋กœ ๋„ฃ๋Š” ์ œํ’ˆ๋„ ์žˆ๋‹ค. ๊ทธ ์ฐจ์ด๋ฅผ ์Šฌ๋กฏ์œผ๋กœ ๋˜๋Œ๋ ค ๋ฐ›์œผ๋ฉด ์ด๋ฆ„๋งŒ ๋ถ™์€
50
+ Stack์ด ๋˜๋ฏ€๋กœ, ์•„์˜ˆ ์—ด์–ด ๋‘”๋‹ค.
51
+
52
+ ## ํ”Œ๋žซํผ ๋ฒˆ์—ญ
53
+
54
+ | | Web | Native |
55
+ | --- | --- | --- |
56
+ | ๋ฟŒ๋ฆฌ ์š”์†Œ | `<main class="hjm-auth-screen">` + ์ธ๋ผ์ธ custom property | `ScrollView` + `contentContainerStyle.flexGrow: 1` |
57
+ | ์„ธ๋กœ ์ค‘์•™ | `flex: 1` ๋ธ”๋ก์˜ `justify-content: center` | ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ `View`์˜ `flex: 1`๋กœ |
58
+ | ์Šคํฌ๋กค ์ „ํ™˜ | `min-block-size: 100dvh` + ์ž์—ฐ ์Šคํฌ๋กค | `ScrollView`๊ฐ€ ๋‚ด์šฉ์ด ๊ธธ ๋•Œ๋งŒ ์Šคํฌ๋กค |
59
+ | ์ˆ˜์น˜ ์ „๋‹ฌ | ํ•ด์„๋œ ๊ฐ’์„ CSS ๋ณ€์ˆ˜๋กœ โ€” ์Šคํƒ€์ผ์‹œํŠธ์™€ ๊ณ„์•ฝ์ด ์–ด๊ธ‹๋‚  ์ˆ˜ ์—†๋‹ค | ์ธ๋ผ์ธ ์Šคํƒ€์ผ |
60
+
61
+ ## ๊ฒ€์ฆ ํ™”๋ฉด
62
+
63
+ ์•„์ง ์—†์Œ. ์†Œ๋น„ ์ œํ’ˆ(๋ฒˆ๋šยท๋‹ค์—๋ฆฌ)์˜ ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ์ด ๊ณจ๊ฒฉ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์ด ๋‚จ์•„ ์žˆ๊ณ ,
64
+ Showcase canonical preview์™€ 6์ข… evidence(defaultยทdarkยทlong copyยทlarge textยทRTLยทreduced motion)๋„
65
+ ์•„์ง์ด๋‹ค. ํ˜„์žฌ ์ƒํƒœ๋Š” **๊ณ„์•ฝยท๋ Œ๋”๋Ÿฌยทํ…Œ์ŠคํŠธ๊นŒ์ง€**๋‹ค.
@@ -0,0 +1,15 @@
1
+ # BottomInfo contract
2
+
3
+ **๋ฌธ์ œ.** ์ฃผ ํ–‰๋™ **์•„๋ž˜** ๋ถ™๋Š” ์ž‘์€ ์•ˆ๋‚ด โ€” "๊ฐ€์ž…ํ•˜๋ฉด ์•ฝ๊ด€์— ๋™์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค",
4
+ "์ˆ˜์ˆ˜๋ฃŒ๋Š” ๊ฒฐ์ œ ์‹œ์ ์— ํ™•์ •๋ฉ๋‹ˆ๋‹ค". ํ† ์Šค TDS์˜ BottomInfo์™€ ๊ฐ™์€ ์ž๋ฆฌ๋‹ค.
5
+
6
+ **Notice์™€ ๋‹ค๋ฅด๋‹ค.** Notice๋Š” **์ง€๊ธˆ ์ƒ๊ธด ์ƒํƒœ**๋ฅผ ์•Œ๋ฆฐ๋‹ค(์˜ค๋ฅ˜ยท์„ฑ๊ณตยท๊ฒฝ๊ณ ). BottomInfo๋Š”
7
+ ํ™”๋ฉด์— ๋Š˜ ์žˆ๋Š” **์กฐ๊ฑด**์ด๋‹ค. ๊ทธ๋ž˜์„œ tone์— danger/success๊ฐ€ ์—†๊ณ , ์•„์ด์ฝ˜์ด ์—†๊ณ ,
8
+ `role="status"`๋„ ์—†๋‹ค โ€” ์ƒํƒœ ๋ณ€ํ™”๋กœ ๋ฐœํ‘œํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋ฒˆ "๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‚˜" ํ•˜๊ณ 
9
+ ์ฝ๊ฒŒ ๋œ๋‹ค. ๋‘ ๋‹จ๊ณ„(`muted`/`emphasis`)๋งŒ ๋‘๋Š” ์ด์œ ๋„ ๊ฐ™๋‹ค: ๊ฐ•์กฐ๋Š” ์žˆ์–ด๋„ ๊ฒฝ๋ณด๋Š” ์—†๋‹ค.
10
+
11
+ **ํ•œ ์ค„๊ณผ ์—ฌ๋Ÿฌ ์ค„์ด ๋‹ค๋ฅด๊ฒŒ ์ฝํžŒ๋‹ค.** ํ•œ ์ค„์€ ๋ฌธ์žฅ, ์—ฌ๋Ÿฌ ์ค„์€ ๋ชฉ๋ก์ด๋‹ค. ํ•œ ์ค„์— ์ ์„
12
+ ์ฐ์œผ๋ฉด ์˜คํžˆ๋ ค ์‹œ๋„๋Ÿฌ์›Œ์„œ `listMarkerFrom`์œผ๋กœ ๊ฒฝ๊ณ„๋ฅผ ๊ณ„์•ฝ์— ์ ์—ˆ๋‹ค.
13
+
14
+ **๋ฌธ์žฅ ์•ˆ์˜ ๋งํฌ๋Š” ์ œํ’ˆ ๊ฒƒ์ด๋‹ค.** ์•ฝ๊ด€ ๋งํฌ์˜ ์ฃผ์†Œยท๋ผ์šฐํŒ…์€ ์ œํ’ˆ์ด ์†Œ์œ ํ•˜๋ฏ€๋กœ
15
+ `renderItem`์œผ๋กœ ๊ทธ ์ค„๋งŒ ๋Œ€์ฒดํ•œ๋‹ค.
@@ -28,8 +28,7 @@ Breadcrumb๋Š” ์ƒˆ href ๊ฐœ๋…์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ์ƒ ํ•ญ๋ชฉ์˜ `desti
28
28
  `LinkDestination`(`internal | external`) ํƒ€์ž… ๊ทธ๋Œ€๋กœ์ด๊ณ , `validateBreadcrumbDescriptor`๋Š”
29
29
  ๊ฐ ์กฐ์ƒ ํ•ญ๋ชฉ๋งˆ๋‹ค `validateLinkDestination`์„ ๊ทธ๋Œ€๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ internal href๊ฐ€
30
30
  `/`, `?`, `#`๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๊ฑฐ๋‚˜ external href๊ฐ€ ํ—ˆ์šฉ๋œ protocol๋งŒ ์จ์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์€
31
- Link ๋ฌธ์„œ(`docs/link.md`)๊ฐ€ ์œ ์ผํ•œ ์ถœ์ฒ˜์ž…๋‹ˆ๋‹ค. Breadcrumb ์กฐ์ƒ ํ•ญ๋ชฉ์€ Web์—์„œ๋Š” ์‹ค์ œ
32
- anchor, Native๊ฐ€ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ด๋‹ค๋ฉด Expo Router Link๋กœ ๋ Œ๋”๋ง๋  ํ•ญ๋ชฉ์ด๋ผ๋Š” ๋œป์ด๋ฉฐ,
31
+ Link ๋ฌธ์„œ(`docs/link.md`)๊ฐ€ ์œ ์ผํ•œ ์ถœ์ฒ˜์ž…๋‹ˆ๋‹ค. Breadcrumb ์กฐ์ƒ ํ•ญ๋ชฉ์€ Web์˜ ์‹ค์ œ anchor๋กœ ๋ Œ๋”๋งํ•˜๋ฉฐ,
33
32
  `Link`์˜ `disabled`/`onClick`/`onPress` ๊ธˆ์ง€ ๊ทœ์น™๋„ ๊ทธ๋Œ€๋กœ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.
34
33
 
35
34
  ## HJM ๊ธฐ๋ณธ๊ฐ’
@@ -38,14 +37,13 @@ anchor, Native๊ฐ€ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ด๋‹ค๋ฉด Expo Router Link๋กœ ๋ Œ๋”๋ง๋ 
38
37
  - ๊ตฌ๋ถ„์ž(`/`, `โ€บ`)๋Š” ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ผ ์žฅ์‹์ž…๋‹ˆ๋‹ค. `breadcrumbRecipe.separator.decorative`๋Š”
39
38
  ํ•ญ์ƒ `true`์ด๊ณ  renderer๋Š” ์ด๋ฅผ ์ ‘๊ทผ์„ฑ ํŠธ๋ฆฌ์—์„œ ์ˆจ๊น๋‹ˆ๋‹ค(Web `aria-hidden`, ์Šคํฌ๋ฆฐ
40
39
  ๋ฆฌ๋”๋Š” ์ˆœ์„œ๋งŒ ๋“ฃ์Šต๋‹ˆ๋‹ค).
41
- - ๊ตฌ๋ถ„์ž ์•„์ด์ฝ˜์€ `chevronEnd`์ฒ˜๋Ÿผ Icon registry์˜ ๋…ผ๋ฆฌ ๋ฐฉํ–ฅ ์ด๋ฆ„์„ ์”๋‹ˆ๋‹ค. RTL ๋ฏธ๋Ÿฌ๋ง์€
42
- Icon ๊ณ„์•ฝ์ด ์ด๋ฏธ ์†Œ์œ ํ•˜๋ฏ€๋กœ Breadcrumb๊ฐ€ ๋”ฐ๋กœ ๋ฐฉํ–ฅ์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
40
+ - ๊ธฐ๋ณธ ๊ตฌ๋ถ„์ž `โ€บ`๋งŒ RTL์—์„œ ๋ฏธ๋Ÿฌ๋งํ•ฉ๋‹ˆ๋‹ค. `separator`๋กœ ์ „๋‹ฌํ•œ Icon์ด๋‚˜ ๋ฌธ์ž๋Š” ์†Œ๋น„์ž๊ฐ€
41
+ ๋ฐฉํ–ฅ์„ ์†Œ์œ ํ•˜๋ฏ€๋กœ ๋‹ค์‹œ ๋’ค์ง‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `separator={null}`์€ ๊ตฌ๋ถ„์ž๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค.
43
42
  - **์ถ•์•ฝ(`...`)์„ ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** ํ•ญ๋ชฉ์ด ๋งŽ์„ ๋•Œ ๊ฐ€์šด๋ฐ๋ฅผ ์ ‘๋Š” ๊ฒƒ์€ ์‹ค์ œ ํ™”๋ฉด์—์„œ
44
43
  ์ธก์ •๋œ ์ˆ˜์š”๊ฐ€ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•ด์ง€๋ฉด ๋ณ„๋„ `collapsed` ์ถ•์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ ,
45
44
  ์ง€๊ธˆ์€ renderer๊ฐ€ ์ „์ฒด trail์„ ๊ทธ๋Œ€๋กœ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
46
45
  - ํฌ๊ธฐ๋Š” Link์˜ inline ์ทจ๊ธ‰์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค โ€” 44-unit ์ตœ์†Œ target์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ณ  ๋ฐ‘์ค„๊ณผ
47
- focus indicator๋งŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Breadcrumb ํ•ญ๋ชฉ์€ ๋ฌธ์žฅ์ด ์•„๋‹ˆ๋ผ ํ•œ ์ค„ ๊ฒฝ๋กœ์ด๋ฏ€๋กœ ๋…๋ฆฝ๋œ
48
- standalone Link์ฒ˜๋Ÿผ ํ•˜๋‚˜์”ฉ ๋ณ„๋„ target์œผ๋กœ ์“ฐ๊ธฐ๋ณด๋‹ค, ์ด˜์ด˜ํ•œ ํ•œ ์ค„ trail๋กœ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
46
+ focus indicator๋งŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ธด ๊ฒฝ๋กœ๋Š” ์ค„๋ฐ”๊ฟˆํ•˜๊ณ  ์ „์ฒด ํ•ญ๋ชฉ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋งํฌ์˜ ๋ฐ‘์ค„๊ณผ focus indicator๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
49
47
 
50
48
  ## ํ”Œ๋žซํผ ๋ฒˆ์—ญ โ€” ์™œ Web ์ „์šฉ์ธ๊ฐ€
51
49
 
@@ -70,13 +68,15 @@ Web์—์„œ๋Š”:
70
68
  ๊ฐ€์ ธ์˜ค๋ฏ€๋กœ Breadcrumb ์ž์ฒด๊ฐ€ ์ƒˆ ํ‚ค๋ณด๋“œ ์ƒํ˜ธ์ž‘์šฉ์„ ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
71
69
  - ํ˜„์žฌ ํ•ญ๋ชฉ์€ tab stop์ด ์•„๋‹ˆ๊ณ  `aria-current="page"`๋งŒ ๊ฐ–์Šต๋‹ˆ๋‹ค.
72
70
 
73
- ## ๊ฒ€์ฆ ํ™”๋ฉด
71
+ ## ๊ณต๊ฐœ ๊ฒฝ๋กœ์™€ ๊ฒ€์ฆ
74
72
 
75
- ์•„์ง ์—†์Œ. ์ด์ „ ํŒ์ •์ด ํ›„๋ณด๋กœ ๋“  "์•ผ์ž˜์•Œ์˜ ๊ตฌ๋‹จ ์ƒ์„ธ โ†’ ์„ ์ˆ˜๋‹จ โ†’ ์„ ์ˆ˜ ์ƒ์„ธ" ๊ณ„์ธต์€
76
- ๊ฒ€์ฆ ๊ฒฐ๊ณผ ๊ทผ๊ฑฐ๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค โ€” Breadcrumb๋Š” `platform: "web"`์ธ๋ฐ ์•ผ์ž˜์•Œ(`modules/app`,
77
- `modules/app-rn`)์€ Flutter/React Native ๋ชจ๋ฐ”์ผ ์•ฑ๋ฟ์ด๊ณ  Web ํ™”๋ฉด ์ž์ฒด๊ฐ€ ์—†๋‹ค(Native
78
- ๊ณ„์ธต ์ด๋™์€ ์ด๋ฏธ ์œ„์—์„œ TopBar๊ฐ€ ๋‹ด๋‹นํ•˜๊ธฐ๋กœ ํŒ์ •ํ–ˆ๋‹ค). BurnTok์˜ Web ์•ฑ
79
- (`apps/web/src/app`)๋„ ํ•จ๊ป˜ ํ™•์ธํ–ˆ์ง€๋งŒ ์ง€๊ธˆ ๋ผ์šฐํŠธ๋Š” ๋Œ€๋ถ€๋ถ„ 2๋‹จ ์ดํ•˜(`/c/[id]`,
80
- `/ideas/[id]`, `/messages/[peerId]`, `/u/[id]`)๋ผ 3๋‹จ ์ด์ƒ ๊ณ„์ธต ํ™”๋ฉด์„ ์•„์ง ์ฐพ์ง€
81
- ๋ชปํ–ˆ๋‹ค. `planned โ†’ beta` ์Šน๊ฒฉ์€ ์‹ค์ œ 3๋‹จ ์ด์ƒ Web ํ™”๋ฉด์ด ๋‚˜์˜ค๊ณ  ํ‚ค๋ณด๋“œ/์Šคํฌ๋ฆฐ๋ฆฌ๋”
82
- ๊ฒ€์ฆ์„ ๊ฑฐ์นœ ๋’ค ๋ฆฌ๋“œ๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค.
73
+ `import { Breadcrumb } from "@hjmds/react/breadcrumb"`๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. root์™€ ๊ธฐ์กด navigation
74
+ ๊ฒฝ๋กœ๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•„์ˆ˜ props๋Š” `label`, `items`์ด๊ณ  `ref`๋Š” nav ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
75
+
76
+ 2026-09-16 ์‚ฌ์šฉ์ž์˜ React/RN ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™•์žฅ ์š”์ฒญ์œผ๋กœ, ์ œํ’ˆ ์ฑ„ํƒ ๋Œ€๊ธฐ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ beta
77
+ ์ œ๊ณต์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. `Patterns/WebNavigation`์€ ์กฐ์ƒ ๋งํฌ๋กœ ๋ณด๊ด€ํ•จ์„ ์—ด๊ณ  ๋‹ค์‹œ ๊ธฐ๋ก ๋ชฉ๋ก์œผ๋กœ
78
+ ๋Œ์•„์˜ค๋Š” ์ž‘๋™ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์ œํ’ˆ ์ฑ„ํƒ์ด๋‚˜ stable ์ฆ๊ฑฐ๋กœ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
79
+
80
+ [WAI Breadcrumb](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/)์˜ landmarkยท์กฐ์ƒ ๋งํฌยท
81
+ ํ˜„์žฌ ์œ„์น˜ ์˜๋ฏธ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ anchor, ํ˜„์žฌ plain text, ์žฅ์‹ ๊ตฌ๋ถ„์ž,
82
+ 320px/2๋ฐฐ ๊ธ€์žยทRTL ์ค„๋ฐ”๊ฟˆ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์‹ค์ œ ์ œํ’ˆ ๋ผ์šฐํŒ…ยท๋ณด์กฐ๊ธฐ๊ธฐ ๊ฒ€์ฆ์€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.
@@ -0,0 +1,20 @@
1
+ # ๋ฒ„ํŠผ ๋ผ๋ฒจ ์ค„๋ฐ”๊ฟˆ ์ •์ฑ…
2
+
3
+ **๋ฌธ์ œ.** ๊ธด ๋ผ๋ฒจ์˜ ์ฒ˜๋ฆฌ ๊ทœ์น™์ด recipe์— ์—†์–ด์„œ Web์€ ๋ฌดํ•œํžˆ ์ค„๋ฐ”๊ฟˆํ•˜๊ณ  Native๋Š” ํ•œ ์ค„๋กœ
4
+ ์ž˜๋ ธ๋‹ค. **๊ฐ™์€ ๋ฒˆ์—ญ๋ฌธ์ด ๋‘ ํ‘œ๋ฉด์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋ณด์˜€๋‹ค.**
5
+
6
+ **๊ทœ์น™.** ์ž๋ฅด์ง€ ์•Š๊ณ  **๋‘ ์ค„๊นŒ์ง€ ์ ‘๋Š”๋‹ค**(`buttonRecipe.label.maxLines = 2`).
7
+
8
+ - **์ž๋ฅด์ง€ ์•Š๋Š” ์ด์œ **: ์ž˜๋ฆฐ ํ–‰๋™ ๋ผ๋ฒจ("์‚ญ์ œํ•˜โ€ฆ")์€ ๋ฌด์—‡์„ ํ•˜๋Š” ๋ฒ„ํŠผ์ธ์ง€ ์žƒ๋Š”๋‹ค. ๋งํฌ
9
+ ํ…์ŠคํŠธ๋‚˜ ๋ณธ๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ ๋ฒ„ํŠผ ๋ผ๋ฒจ์€ ๊ทธ ์ž์ฒด๊ฐ€ ํ–‰๋™์˜ ์ •์˜๋‹ค.
10
+ - **๋ฌดํ•œํžˆ ๋Š˜๋ฆฌ์ง€ ์•Š๋Š” ์ด์œ **: ํ•˜๋‹จ CTA ํ–‰์ฒ˜๋Ÿผ ๋ฒ„ํŠผ์ด ๋‚จ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋ฐ€์–ด๋‚ด๋Š” ์ž๋ฆฌ๊ฐ€
11
+ ์žˆ๋‹ค. ๋‘ ์ค„์„ ๋„˜๋Š” ๋ผ๋ฒจ์€ ๋ ˆ์ด์•„์›ƒ์ด ์•„๋‹ˆ๋ผ **์นดํ”ผ์˜ ๋ฌธ์ œ**์ด๊ณ , ๊ทธ ์‹ ํ˜ธ๋ฅผ ํ™”๋ฉด์ด
12
+ ์ฃผ๋Š” ํŽธ์ด ๋‚ซ๋‹ค.
13
+
14
+ **ํฐ ๊ธ€์ž ์„ค์ •์—์„œ๋Š” ์ƒํ•œ์„ ํ‘ผ๋‹ค**(`liftCapOnLargeText`). ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค์šด ๊ธ€์ž์—์„œ ๋‘ ์ค„๋กœ
15
+ ์ž๋ฅด๋ฉด ๋‚ด์šฉ์ด ์‚ฌ๋ผ์ง€๊ณ  ๊ทธ๊ฑด WCAG 1.4.4๋‹ค. ์ œํ’ˆ ์นดํ”ผ๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ์„ค์ •์ด ์›์ธ์ด๋ฏ€๋กœ
16
+ ๊ฐ™์€ ๊ทœ์น™์„ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค. `resolveButtonLabelLines(largeText)`๊ฐ€ ์ด ํŒ์ •์„ ๊ฐ–๊ณ ,
17
+ Web์€ `-webkit-line-clamp`, Native๋Š” `numberOfLines`๋กœ ๊ฐ™์€ ๋‹ต์„ ์“ด๋‹ค.
18
+
19
+ **์ˆซ์ž๋Š” recipe์—๋งŒ ์žˆ๋‹ค.** ์Šคํƒ€์ผ์‹œํŠธ๋Š” `--hjm-button-label-lines`๋ฅผ ์ฝ๊ณ  ๋ Œ๋”๋Ÿฌ๊ฐ€ ๊ทธ
20
+ ๋ณ€์ˆ˜๋ฅผ recipe์—์„œ ์ฑ„์šด๋‹ค โ€” ๋‘ ๋ฒŒ์ด ๋˜๋ฉด ์–ธ์  ๊ฐ€ ์–ด๊ธ‹๋‚œ๋‹ค.