@hjmds/design-contracts 0.8.2

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 (353) hide show
  1. package/README.md +208 -0
  2. package/dist/alert-dialog.d.ts +102 -0
  3. package/dist/alert-dialog.d.ts.map +1 -0
  4. package/dist/alert-dialog.js +136 -0
  5. package/dist/alert-dialog.js.map +1 -0
  6. package/dist/base-recipes.d.ts +184 -0
  7. package/dist/base-recipes.d.ts.map +1 -0
  8. package/dist/base-recipes.js +129 -0
  9. package/dist/base-recipes.js.map +1 -0
  10. package/dist/behaviors.d.ts +1254 -0
  11. package/dist/behaviors.d.ts.map +1 -0
  12. package/dist/behaviors.js +972 -0
  13. package/dist/behaviors.js.map +1 -0
  14. package/dist/bottom-navigation-defaults.d.ts +13 -0
  15. package/dist/bottom-navigation-defaults.d.ts.map +1 -0
  16. package/dist/bottom-navigation-defaults.js +10 -0
  17. package/dist/bottom-navigation-defaults.js.map +1 -0
  18. package/dist/bottom-navigation.d.ts +114 -0
  19. package/dist/bottom-navigation.d.ts.map +1 -0
  20. package/dist/bottom-navigation.js +223 -0
  21. package/dist/bottom-navigation.js.map +1 -0
  22. package/dist/breadcrumb.d.ts +97 -0
  23. package/dist/breadcrumb.d.ts.map +1 -0
  24. package/dist/breadcrumb.js +99 -0
  25. package/dist/breadcrumb.js.map +1 -0
  26. package/dist/calendar.d.ts +285 -0
  27. package/dist/calendar.d.ts.map +1 -0
  28. package/dist/calendar.js +297 -0
  29. package/dist/calendar.js.map +1 -0
  30. package/dist/card.d.ts +39 -0
  31. package/dist/card.d.ts.map +1 -0
  32. package/dist/card.js +50 -0
  33. package/dist/card.js.map +1 -0
  34. package/dist/carousel.d.ts +180 -0
  35. package/dist/carousel.d.ts.map +1 -0
  36. package/dist/carousel.js +172 -0
  37. package/dist/carousel.js.map +1 -0
  38. package/dist/catalog.d.ts +7158 -0
  39. package/dist/catalog.d.ts.map +1 -0
  40. package/dist/catalog.js +220 -0
  41. package/dist/catalog.js.map +1 -0
  42. package/dist/collection.d.ts +123 -0
  43. package/dist/collection.d.ts.map +1 -0
  44. package/dist/collection.js +211 -0
  45. package/dist/collection.js.map +1 -0
  46. package/dist/color-references.d.ts +46 -0
  47. package/dist/color-references.d.ts.map +1 -0
  48. package/dist/color-references.js +39 -0
  49. package/dist/color-references.js.map +1 -0
  50. package/dist/colors.d.ts +56 -0
  51. package/dist/colors.d.ts.map +1 -0
  52. package/dist/colors.js +90 -0
  53. package/dist/colors.js.map +1 -0
  54. package/dist/command-palette.d.ts +240 -0
  55. package/dist/command-palette.d.ts.map +1 -0
  56. package/dist/command-palette.js +97 -0
  57. package/dist/command-palette.js.map +1 -0
  58. package/dist/component-contracts.d.ts +137 -0
  59. package/dist/component-contracts.d.ts.map +1 -0
  60. package/dist/component-contracts.js +53 -0
  61. package/dist/component-contracts.js.map +1 -0
  62. package/dist/component-definitions.d.ts +135 -0
  63. package/dist/component-definitions.d.ts.map +1 -0
  64. package/dist/component-definitions.js +142 -0
  65. package/dist/component-definitions.js.map +1 -0
  66. package/dist/component-recipes.d.ts +3583 -0
  67. package/dist/component-recipes.d.ts.map +1 -0
  68. package/dist/component-recipes.js +1503 -0
  69. package/dist/component-recipes.js.map +1 -0
  70. package/dist/component-references.d.ts +416 -0
  71. package/dist/component-references.d.ts.map +1 -0
  72. package/dist/component-references.js +140 -0
  73. package/dist/component-references.js.map +1 -0
  74. package/dist/content-state.d.ts +104 -0
  75. package/dist/content-state.d.ts.map +1 -0
  76. package/dist/content-state.js +116 -0
  77. package/dist/content-state.js.map +1 -0
  78. package/dist/counter-badge-recipe.d.ts +80 -0
  79. package/dist/counter-badge-recipe.d.ts.map +1 -0
  80. package/dist/counter-badge-recipe.js +44 -0
  81. package/dist/counter-badge-recipe.js.map +1 -0
  82. package/dist/counter-badge.d.ts +12 -0
  83. package/dist/counter-badge.d.ts.map +1 -0
  84. package/dist/counter-badge.js +21 -0
  85. package/dist/counter-badge.js.map +1 -0
  86. package/dist/data-table.d.ts +203 -0
  87. package/dist/data-table.d.ts.map +1 -0
  88. package/dist/data-table.js +182 -0
  89. package/dist/data-table.js.map +1 -0
  90. package/dist/date-picker.d.ts +268 -0
  91. package/dist/date-picker.d.ts.map +1 -0
  92. package/dist/date-picker.js +168 -0
  93. package/dist/date-picker.js.map +1 -0
  94. package/dist/description-list.d.ts +68 -0
  95. package/dist/description-list.d.ts.map +1 -0
  96. package/dist/description-list.js +85 -0
  97. package/dist/description-list.js.map +1 -0
  98. package/dist/design-system-provider.d.ts +80 -0
  99. package/dist/design-system-provider.d.ts.map +1 -0
  100. package/dist/design-system-provider.js +147 -0
  101. package/dist/design-system-provider.js.map +1 -0
  102. package/dist/evidence.d.ts +49 -0
  103. package/dist/evidence.d.ts.map +1 -0
  104. package/dist/evidence.js +133 -0
  105. package/dist/evidence.js.map +1 -0
  106. package/dist/file-picker.d.ts +183 -0
  107. package/dist/file-picker.d.ts.map +1 -0
  108. package/dist/file-picker.js +224 -0
  109. package/dist/file-picker.js.map +1 -0
  110. package/dist/floating-action-button.d.ts +143 -0
  111. package/dist/floating-action-button.d.ts.map +1 -0
  112. package/dist/floating-action-button.js +149 -0
  113. package/dist/floating-action-button.js.map +1 -0
  114. package/dist/form.d.ts +143 -0
  115. package/dist/form.d.ts.map +1 -0
  116. package/dist/form.js +206 -0
  117. package/dist/form.js.map +1 -0
  118. package/dist/foundations.d.ts +300 -0
  119. package/dist/foundations.d.ts.map +1 -0
  120. package/dist/foundations.js +238 -0
  121. package/dist/foundations.js.map +1 -0
  122. package/dist/grid.d.ts +75 -0
  123. package/dist/grid.d.ts.map +1 -0
  124. package/dist/grid.js +133 -0
  125. package/dist/grid.js.map +1 -0
  126. package/dist/icon-button-recipe.d.ts +99 -0
  127. package/dist/icon-button-recipe.d.ts.map +1 -0
  128. package/dist/icon-button-recipe.js +53 -0
  129. package/dist/icon-button-recipe.js.map +1 -0
  130. package/dist/icon.d.ts +41 -0
  131. package/dist/icon.d.ts.map +1 -0
  132. package/dist/icon.js +147 -0
  133. package/dist/icon.js.map +1 -0
  134. package/dist/image.d.ts +82 -0
  135. package/dist/image.d.ts.map +1 -0
  136. package/dist/image.js +100 -0
  137. package/dist/image.js.map +1 -0
  138. package/dist/index.d.ts +58 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +66 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/layout.d.ts +118 -0
  143. package/dist/layout.d.ts.map +1 -0
  144. package/dist/layout.js +118 -0
  145. package/dist/layout.js.map +1 -0
  146. package/dist/link.d.ts +57 -0
  147. package/dist/link.d.ts.map +1 -0
  148. package/dist/link.js +142 -0
  149. package/dist/link.js.map +1 -0
  150. package/dist/load-more.d.ts +64 -0
  151. package/dist/load-more.d.ts.map +1 -0
  152. package/dist/load-more.js +124 -0
  153. package/dist/load-more.js.map +1 -0
  154. package/dist/mentions.d.ts +67 -0
  155. package/dist/mentions.d.ts.map +1 -0
  156. package/dist/mentions.js +107 -0
  157. package/dist/mentions.js.map +1 -0
  158. package/dist/number-field.d.ts +208 -0
  159. package/dist/number-field.d.ts.map +1 -0
  160. package/dist/number-field.js +247 -0
  161. package/dist/number-field.js.map +1 -0
  162. package/dist/otp-field.d.ts +152 -0
  163. package/dist/otp-field.d.ts.map +1 -0
  164. package/dist/otp-field.js +117 -0
  165. package/dist/otp-field.js.map +1 -0
  166. package/dist/pagination.d.ts +181 -0
  167. package/dist/pagination.d.ts.map +1 -0
  168. package/dist/pagination.js +226 -0
  169. package/dist/pagination.js.map +1 -0
  170. package/dist/password-field.d.ts +187 -0
  171. package/dist/password-field.d.ts.map +1 -0
  172. package/dist/password-field.js +120 -0
  173. package/dist/password-field.js.map +1 -0
  174. package/dist/popover.d.ts +152 -0
  175. package/dist/popover.d.ts.map +1 -0
  176. package/dist/popover.js +137 -0
  177. package/dist/popover.js.map +1 -0
  178. package/dist/progress-recipe.d.ts +43 -0
  179. package/dist/progress-recipe.d.ts.map +1 -0
  180. package/dist/progress-recipe.js +16 -0
  181. package/dist/progress-recipe.js.map +1 -0
  182. package/dist/recipes.d.ts +31 -0
  183. package/dist/recipes.d.ts.map +1 -0
  184. package/dist/recipes.js +46 -0
  185. package/dist/recipes.js.map +1 -0
  186. package/dist/responsive.d.ts +27 -0
  187. package/dist/responsive.d.ts.map +1 -0
  188. package/dist/responsive.js +66 -0
  189. package/dist/responsive.js.map +1 -0
  190. package/dist/result.d.ts +111 -0
  191. package/dist/result.d.ts.map +1 -0
  192. package/dist/result.js +97 -0
  193. package/dist/result.js.map +1 -0
  194. package/dist/selection-helpers.d.ts +16 -0
  195. package/dist/selection-helpers.d.ts.map +1 -0
  196. package/dist/selection-helpers.js +52 -0
  197. package/dist/selection-helpers.js.map +1 -0
  198. package/dist/semantic-colors.d.ts +275 -0
  199. package/dist/semantic-colors.d.ts.map +1 -0
  200. package/dist/semantic-colors.js +84 -0
  201. package/dist/semantic-colors.js.map +1 -0
  202. package/dist/sheet.d.ts +51 -0
  203. package/dist/sheet.d.ts.map +1 -0
  204. package/dist/sheet.js +69 -0
  205. package/dist/sheet.js.map +1 -0
  206. package/dist/showcase.d.ts +153 -0
  207. package/dist/showcase.d.ts.map +1 -0
  208. package/dist/showcase.js +210 -0
  209. package/dist/showcase.js.map +1 -0
  210. package/dist/side-panel.d.ts +199 -0
  211. package/dist/side-panel.d.ts.map +1 -0
  212. package/dist/side-panel.js +111 -0
  213. package/dist/side-panel.js.map +1 -0
  214. package/dist/slider.d.ts +138 -0
  215. package/dist/slider.d.ts.map +1 -0
  216. package/dist/slider.js +150 -0
  217. package/dist/slider.js.map +1 -0
  218. package/dist/splitter.d.ts +113 -0
  219. package/dist/splitter.d.ts.map +1 -0
  220. package/dist/splitter.js +99 -0
  221. package/dist/splitter.js.map +1 -0
  222. package/dist/statistic.d.ts +41 -0
  223. package/dist/statistic.d.ts.map +1 -0
  224. package/dist/statistic.js +76 -0
  225. package/dist/statistic.js.map +1 -0
  226. package/dist/steps.d.ts +196 -0
  227. package/dist/steps.d.ts.map +1 -0
  228. package/dist/steps.js +160 -0
  229. package/dist/steps.js.map +1 -0
  230. package/dist/tag.d.ts +128 -0
  231. package/dist/tag.d.ts.map +1 -0
  232. package/dist/tag.js +93 -0
  233. package/dist/tag.js.map +1 -0
  234. package/dist/timeline.d.ts +147 -0
  235. package/dist/timeline.d.ts.map +1 -0
  236. package/dist/timeline.js +127 -0
  237. package/dist/timeline.js.map +1 -0
  238. package/dist/toast.d.ts +164 -0
  239. package/dist/toast.d.ts.map +1 -0
  240. package/dist/toast.js +529 -0
  241. package/dist/toast.js.map +1 -0
  242. package/dist/tokens.d.ts +9 -0
  243. package/dist/tokens.d.ts.map +1 -0
  244. package/dist/tokens.js +9 -0
  245. package/dist/tokens.js.map +1 -0
  246. package/dist/tooltip.d.ts +44 -0
  247. package/dist/tooltip.d.ts.map +1 -0
  248. package/dist/tooltip.js +88 -0
  249. package/dist/tooltip.js.map +1 -0
  250. package/dist/tour.d.ts +218 -0
  251. package/dist/tour.d.ts.map +1 -0
  252. package/dist/tour.js +211 -0
  253. package/dist/tour.js.map +1 -0
  254. package/dist/transfer-list.d.ts +207 -0
  255. package/dist/transfer-list.d.ts.map +1 -0
  256. package/dist/transfer-list.js +193 -0
  257. package/dist/transfer-list.js.map +1 -0
  258. package/dist/tree-select.d.ts +78 -0
  259. package/dist/tree-select.d.ts.map +1 -0
  260. package/dist/tree-select.js +132 -0
  261. package/dist/tree-select.js.map +1 -0
  262. package/dist/tree.d.ts +206 -0
  263. package/dist/tree.d.ts.map +1 -0
  264. package/dist/tree.js +223 -0
  265. package/dist/tree.js.map +1 -0
  266. package/dist/upload-item.d.ts +173 -0
  267. package/dist/upload-item.d.ts.map +1 -0
  268. package/dist/upload-item.js +156 -0
  269. package/dist/upload-item.js.map +1 -0
  270. package/dist/version.d.ts +3 -0
  271. package/dist/version.d.ts.map +1 -0
  272. package/dist/version.js +3 -0
  273. package/dist/version.js.map +1 -0
  274. package/docs/affix.md +63 -0
  275. package/docs/anchor.md +59 -0
  276. package/docs/ant-design-coverage.md +119 -0
  277. package/docs/app-provider.md +50 -0
  278. package/docs/app-rn-adoption.md +227 -0
  279. package/docs/architecture.md +320 -0
  280. package/docs/authoring-brief.md +87 -0
  281. package/docs/border-beam.md +66 -0
  282. package/docs/bottom-navigation.md +127 -0
  283. package/docs/breadcrumb.md +82 -0
  284. package/docs/calendar.md +154 -0
  285. package/docs/carousel.md +130 -0
  286. package/docs/cascader.md +93 -0
  287. package/docs/catalog-decision-status.md +306 -0
  288. package/docs/color-picker.md +72 -0
  289. package/docs/command-palette.md +116 -0
  290. package/docs/confirm-popover.md +93 -0
  291. package/docs/consistency-audit.md +383 -0
  292. package/docs/consumer-release-gate.md +90 -0
  293. package/docs/content-state.md +156 -0
  294. package/docs/context-panel.md +88 -0
  295. package/docs/cross-platform-core-normalization.md +118 -0
  296. package/docs/data-table.md +79 -0
  297. package/docs/date-picker.md +84 -0
  298. package/docs/description-list.md +75 -0
  299. package/docs/design-system-provider.md +139 -0
  300. package/docs/dropdown.md +78 -0
  301. package/docs/expansion-roadmap.md +285 -0
  302. package/docs/file-picker.md +59 -0
  303. package/docs/floating-action-button.md +111 -0
  304. package/docs/form.md +134 -0
  305. package/docs/generated/component-maturity.md +103 -0
  306. package/docs/generated/renderer-evidence.json +5597 -0
  307. package/docs/generated/renderer-evidence.md +132 -0
  308. package/docs/generated/showcase-manifest.json +3732 -0
  309. package/docs/icon.md +22 -0
  310. package/docs/identity.md +121 -0
  311. package/docs/image.md +84 -0
  312. package/docs/implementation-0.5.md +85 -0
  313. package/docs/layout-primitives.md +107 -0
  314. package/docs/layout.md +83 -0
  315. package/docs/library-reference-decisions.md +123 -0
  316. package/docs/link.md +67 -0
  317. package/docs/load-more.md +31 -0
  318. package/docs/mentions.md +82 -0
  319. package/docs/migration-0.2.md +108 -0
  320. package/docs/migration-0.3.md +72 -0
  321. package/docs/migration-0.5.md +82 -0
  322. package/docs/migration-0.6.md +197 -0
  323. package/docs/notification.md +54 -0
  324. package/docs/number-field.md +82 -0
  325. package/docs/otp-field.md +103 -0
  326. package/docs/pagination.md +139 -0
  327. package/docs/password-field.md +98 -0
  328. package/docs/popover.md +124 -0
  329. package/docs/promotion-candidates.md +169 -0
  330. package/docs/qr-code.md +69 -0
  331. package/docs/rating.md +58 -0
  332. package/docs/responsive-grid.md +90 -0
  333. package/docs/result.md +96 -0
  334. package/docs/showcase.md +97 -0
  335. package/docs/side-panel.md +71 -0
  336. package/docs/slider.md +79 -0
  337. package/docs/splitter.md +55 -0
  338. package/docs/statistic.md +16 -0
  339. package/docs/steps.md +115 -0
  340. package/docs/tag.md +57 -0
  341. package/docs/time-picker.md +88 -0
  342. package/docs/timeline.md +146 -0
  343. package/docs/toast.md +127 -0
  344. package/docs/tooltip.md +58 -0
  345. package/docs/tour.md +136 -0
  346. package/docs/transfer-list.md +94 -0
  347. package/docs/tree-select.md +101 -0
  348. package/docs/tree.md +123 -0
  349. package/docs/upload-item.md +68 -0
  350. package/docs/utility.md +53 -0
  351. package/docs/virtual-list.md +70 -0
  352. package/docs/watermark.md +58 -0
  353. package/package.json +402 -0
@@ -0,0 +1,111 @@
1
+ # FloatingActionButton contract
2
+
3
+ ## ๋ฌธ์ œ
4
+
5
+ ๋ชฉ๋กยทํ”ผ๋“œ์ฒ˜๋Ÿผ ์Šคํฌ๋กค๋˜๋Š” ์ฝ˜ํ…์ธ  ์œ„์—, ํ™”๋ฉด ์ „์ฒด ํญ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ํ•ญ์ƒ ์†๋‹ฟ๋Š”
6
+ ์ž๋ฆฌ์— ๋–  ์žˆ๋Š” ๋‹จ์ผ ์ƒ์„ฑ ํ–‰๋™(์ƒˆ ๊ธฐ๋ก ์ถ”๊ฐ€, ์ƒˆ ๊ธ€ ์ž‘์„ฑ)์ด ํ•„์š”ํ•˜๋‹ค. antd
7
+ `FloatButton`์ด ์ด ๋ฌธ์ œ๋ฅผ ์ปค๋ฒ„ํ•œ๋‹ค.
8
+
9
+ ## BottomCTA์™€ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค (ํŒ์ •)
10
+
11
+ ์ด ์‹œ์Šคํ…œ์—๋Š” ์ด๋ฏธ ํ™”๋ฉด ํ•˜๋‹จ์— ๊ณ ์ •๋œ ์ฃผ์š” ํ–‰๋™(`bottomCtaRecipe`)์ด ์žˆ๋‹ค. ๋‘˜์˜
12
+ ์ฐจ์ด๋Š” ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ **์ฝ˜ํ…์ธ ์™€์˜ ๊ด€๊ณ„**๋‹ค.
13
+
14
+ | | BottomCTA | FloatingActionButton |
15
+ | --- | --- | --- |
16
+ | ํญ | ํ™”๋ฉด ์ „์ฒด(`bottomCtaRecipe`์— `paddingHorizontal: layout.pagePadding.regular`) | ์ฝ˜ํ…์ธ  ํญ๊ณผ ๋ฌด๊ด€ํ•œ ๊ณ ์ • ํฌ๊ธฐ ์›/์•Œ์•ฝ |
17
+ | ์˜๋ฏธ | ๊ทธ ํ™”๋ฉด์˜ **๊ฒฐ๋ก ** โ€” ์ด ํ๋ฆ„์€ ์ด ํ–‰๋™์œผ๋กœ ๋๋‚œ๋‹ค | ์•„์ง ๋ธŒ๋ผ์šฐ์ง• ์ค‘์ธ ์ฝ˜ํ…์ธ  **์œ„์— ๋œฌ** ์ƒ์„ฑ ํ–‰๋™ โ€” ํ™”๋ฉด์˜ ๊ฒฐ๋ก ์ด ์•„๋‹ˆ๋‹ค |
18
+ | ์ฝ˜ํ…์ธ ์™€์˜ ๊ด€๊ณ„ | ์ฝ˜ํ…์ธ  ์•„๋ž˜ ๊ณ ์ •๋œ ๋ณ„๋„ ํ–‰(`bottomCtaRecipe.slots`์— `root/description/secondaryAction/primaryAction`) | ์ฝ˜ํ…์ธ  **์œ„์— ๊ฒน์ณ** ๋œจ๊ณ , ์ฝ˜ํ…์ธ  ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค(์•„๋ž˜ ์ฐธ๊ณ ) |
19
+ | ์Šคํฌ๋กค ๋ฐ˜์‘ | ์—†์Œ โ€” ์œ„์น˜ ๊ณ ์ •, ํฌ๊ธฐ ๋ถˆ๋ณ€ | ์Šคํฌ๋กค ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ํ™•์žฅ/์ถ•์†Œ(์•„๋ž˜ ์ฐธ๊ณ ) |
20
+
21
+ ์ฆ‰ ํ•œ ํ™”๋ฉด์— ์–ด๋А ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด์ง€๋งŒ, ์›๋ฆฌ์ƒ ๊ณต์กด๋„ ๊ฐ€๋Šฅํ•˜๋‹ค(์˜ˆ:
22
+ ๋ชฉ๋ก ํ™”๋ฉด์— "ํ•„ํ„ฐ ์ ์šฉ" ๊ฐ™์€ BottomCTA ๊ฒฐ๋ก  ํ–‰๋™๊ณผ ๋ณ„๊ฐœ๋กœ "์ƒˆ ํ•ญ๋ชฉ ์ถ”๊ฐ€" FAB๊ฐ€
23
+ ๋œจ๋Š” ๊ฒฝ์šฐ). ๋‘ ๊ณ„์•ฝ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋ฉด "ํ™”๋ฉด์˜ ๊ฒฐ๋ก "๊ณผ "์ฝ˜ํ…์ธ  ์œ„ ์ƒ์„ฑ ํ–‰๋™"์ด๋ผ๋Š”
24
+ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์˜๋ฏธ๋ฅผ ํ•œ recipe๊ฐ€ ๋– ์•ˆ๊ฒŒ ๋˜๋ฏ€๋กœ ๋ถ„๋ฆฌ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
25
+
26
+ ## ์ผ๋ฐ˜ํ™”ํ•œ ๊ณ„์•ฝ
27
+
28
+ ### Button/IconButton recipe๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค โ€” ์ƒˆ recipe๋ฅผ ์–ป์ง€ ๋ชปํ•œ๋‹ค
29
+
30
+ `floatingActionButtonRecipe`๋Š” ์ƒˆ ํ†คยทํฌ๊ธฐยท๊ทธ๋ฆผ์ž๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๋Š”๋‹ค.
31
+
32
+ - `circle`์€ `iconButtonRecipe.sizes.large`(diameter 52) ๊ทธ๋Œ€๋กœ.
33
+ - `tone`์€ `iconButtonRecipe.tones.primary` ๊ทธ๋Œ€๋กœ.
34
+ - `shape`๋Š” `iconButtonRecipe.shapes.circle`(`radius.full`) ๊ทธ๋Œ€๋กœ.
35
+ - `expandedLabel`์€ `buttonRecipe.sizes.large`์˜ `textVariant`/`paddingHorizontal` ๊ทธ๋Œ€๋กœ.
36
+
37
+ ๋‘ ๋ชจ๋“œ(collapsed/expanded) ๋ชจ๋‘ `large` ํ‹ฐ์–ด๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋ชจ์–‘์ด ์› โ†” ์•Œ์•ฝ์œผ๋กœ
38
+ ๋ฐ”๋€Œ๋Š” ๋™์•ˆ ๋†’์ด(ํ„ฐ์น˜ ํƒ€๊นƒ)๋Š” 52๋กœ ๊ณ ์ •๋œ๋‹ค โ€” ๋ผ๋ฒจ์ด ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์งˆ ๋•Œ ๋ฒ„ํŠผ
39
+ ์ „์ฒด๊ฐ€ ์„ธ๋กœ๋กœ ๋“ค์ฉ์ด์ง€ ์•Š๋Š”๋‹ค. `docs/dropdown.md`๊ฐ€ "Menu์™€ ๊ฑฐ์˜ ๊ฐ™์€ anatomy๋ฅผ
40
+ ๋‹ค์‹œ ์„ ์–ธํ•˜์ง€ ์•Š๋Š”๋‹ค"๊ณ  ํŒ์ •ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ, ์ด ๋ชจ๋“ˆ๋„ `Button`์˜ recipe๋ฅผ
41
+ ํฌํฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
42
+
43
+ ### ์Šคํฌ๋กค์— ๋”ฐ๋ฅธ ํ™•์žฅ/์ถ•์†Œ
44
+
45
+ `FloatingActionButtonScrollSignal`(`away-from-start`/`toward-start`/`idle`)์€
46
+ LoadMore์˜ `viewport` ์‹ ํ˜ธ, Popover์˜ `AnchoredOverlay`์™€ ๊ฐ™์€ ๊ฒฝ๊ณ„๋ฅผ ๋”ฐ๋ฅธ๋‹ค โ€”
47
+ **์Šคํฌ๋กค ๋ฆฌ์Šค๋„ˆ์™€ ์ž„๊ณ„๊ฐ’ ํŒ๋‹จ์€ ๋ Œ๋”๋Ÿฌ ์†Œ์œ **์ด๊ณ , ์ด ๋ชจ๋“ˆ์€ ์ด์‚ฐ์ ์ธ ์‹ ํ˜ธ ํ•˜๋‚˜๋งŒ
48
+ ๋ฐ›์•„ ๋‹ค์Œ ๋ชจ๋“œ๋ฅผ ๋Œ๋ ค์ค€๋‹ค(`resolveFloatingActionButtonLayoutMode`). `idle`์€
49
+ "ํŒ๋‹จํ•  ๊ทผ๊ฑฐ๊ฐ€ ์—†๋‹ค"๋Š” ๋œป์ด๋ฏ€๋กœ ํ˜„์žฌ ๋ชจ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ๋‹ค โ€” ๋ธํƒ€๊ฐ€ 0์ธ ํ”„๋ ˆ์ž„๋งˆ๋‹ค
50
+ ๋งค๋ฒˆ ์ถ”์ธกํ•ด์„œ ๋ฒ„ํŠผ์ด ๊นœ๋นก์ด๋Š” ์‚ฌ๊ณ ๋ฅผ ๋ง‰๋Š”๋‹ค.
51
+
52
+ ๋ผ๋ฒจ์ด ์ˆจ์–ด๋„(`collapsed`) ์ ‘๊ทผ์„ฑ ์ด๋ฆ„์€ ์ค„์–ด๋“ค์ง€ ์•Š๋Š”๋‹ค.
53
+ `resolveFloatingActionButtonDescriptor`๋Š” ๋‘ ๋ชจ๋“œ ๋ชจ๋‘์—์„œ
54
+ `resolvedAccessibilityLabel`์„ ํ•ญ์ƒ ์ „์ฒด `label`๋กœ ๊ณ ์ •ํ•œ๋‹ค โ€” ์•„์ด์ฝ˜๋งŒ ๋ณด์ด๋Š”
55
+ ์ƒํƒœ๊ฐ€ "์ด๋ฆ„ ์—†๋Š” ๋ฒ„ํŠผ"์ด ๋˜๋Š” ์‚ฌ๊ณ ๋ฅผ ํƒ€์ž… ์ฐจ์›์—์„œ ๋ง‰๋Š”๋‹ค.
56
+
57
+ ### ์ฝ˜ํ…์ธ  ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌ๋Š” ๋ฌธ์ œ โ€” ์—ฌ๋ฐฑ์€ ๊ณ„์•ฝ์ด ์ฑ…์ž„์ง„๋‹ค
58
+
59
+ FAB๋Š” ์ฝ˜ํ…์ธ  ์œ„์— ๊ฒน์ณ ๋œจ๋ฏ€๋กœ, ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์ฝ˜ํ…์ธ ๋Š” ํ•ญ์ƒ FAB์˜ ๋ฐœ์ž๊ตญ๋งŒํผ ํ•˜๋‹จ
60
+ ์—ฌ๋ฐฑ์„ ์˜ˆ์•ฝํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ณ„์‚ฐ์„ Web/RN ๋ Œ๋”๋Ÿฌ๊ฐ€ ๊ฐ์ž ๋‹ค์‹œ ํ•˜๋ฉด ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
61
+ `resolveFloatingActionButtonContentClearance(safeAreaBottomInset)`์ด ํ•œ ๊ณณ์—์„œ
62
+ `diameter + margin ร— 2 + safeAreaBottomInset`์„ ๊ณ„์‚ฐํ•ด ๋Œ๋ ค์ค€๋‹ค. safe-area
63
+ inset์€ BottomNavigationยทSheetยทToast์™€ ๊ฐ™์€ **additive** ๋ชจ๋“œ๋‹ค(base ์—ฌ๋ฐฑ์—
64
+ ๋”ํ•˜์ง€, `max()`๋กœ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค).
65
+
66
+ ### ๋‚ญ๋…ยทํƒญ ์ˆœ์„œ์—์„œ์˜ ์ž๋ฆฌ
67
+
68
+ FAB๋Š” collection ํ•ญ๋ชฉ์ด ์•„๋‹ˆ๋‹ค. ์Šคํฌ๋กค ์ฝ˜ํ…์ธ  **๋’ค**์— ์˜ค๋Š” ๊ณ ์ • sibling์œผ๋กœ
69
+ ๋ Œ๋”๋งํ•˜๊ณ , ์ฝ˜ํ…์ธ  ์•ˆ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค โ€” ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€/์‚ญ์ œ๋˜์–ด๋„ FAB์˜ ๋‚ญ๋…ยทํƒญ ์ˆœ์„œ
70
+ ์œ„์น˜๊ฐ€ ํ”๋“ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. `BottomNavigation`์ด "์ƒ์„ฑ ํ–‰๋™์€ destination ๋ชฉ๋ก์—
71
+ ๋„ฃ์ง€ ์•Š๊ณ  ๋ณ„๋„ Button/IconButton์œผ๋กœ ํ•ฉ์„ฑํ•œ๋‹ค"๊ณ  ์ด๋ฏธ ์ •ํ•œ ๊ฒฝ๊ณ„์™€ ๊ฐ™์€ ์ด์œ ๋‹ค.
72
+
73
+ ## HJM ๊ธฐ๋ณธ๊ฐ’
74
+
75
+ - `layoutMode` ๊ธฐ๋ณธ๊ฐ’ `expanded` โ€” ์ฒซ ์ง„์ž… ์‹œ ๋ผ๋ฒจ์ด ๋ณด์—ฌ์•ผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์Šจ
76
+ ํ–‰๋™์ธ์ง€ ๋จผ์ € ์ฝ๋Š”๋‹ค.
77
+ - ์ „ํ™˜์€ `motionPreset.micro`(120ms, Reduce Motion์—์„œ ์ฆ‰์‹œ ์ „ํ™˜)๋ฅผ ์“ด๋‹ค.
78
+ ์Šคํฌ๋กค๋งˆ๋‹ค ๋ฐ˜๋ณต ํŠธ๋ฆฌ๊ฑฐ๋  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ ๋ณ€ํ™”์ด๋ฏ€๋กœ, ๋‹ค๋ฅธ recipe๋“ค์˜ ์—ด๊ธฐ/๋‹ซ๊ธฐ์šฉ
79
+ `enter`/`exit`(200ms๋Œ€)๋ณด๋‹ค hover/press๊ธ‰์˜ ๊ฐ€์žฅ ๋น ๋ฅธ ํ‹ฐ์–ด๋ฅผ ๊ณจ๋ž๋‹ค โ€” ๋น ๋ฅธ
80
+ ์Šคํฌ๋กค ๋’ค๋กœ ์ „ํ™˜์ด ๋ฐ€๋ ค ์Œ“์ด๋Š” ์‚ฌ๊ณ ๋ฅผ ๋ง‰๋Š”๋‹ค.
81
+ - `shadow.floating`์„ ์žฌ์‚ฌ์šฉํ•œ๋‹ค โ€” identity.md์˜ "floating์€ menuยทtoast" ๋ชฉ๋ก์—
82
+ ์ด๋ฆ„์ด ๋ช…์‹œ๋ผ ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ, ์ฝ˜ํ…์ธ  ์œ„์— ์‹ค์ œ๋กœ ๋–  ์žˆ๋Š” ๊ณ„์ธต์ด๋ผ๋Š” ๊ฐ™์€
83
+ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์œ ์ผํ•œ ๊ธฐ์กด ํ‹ฐ์–ด๋‹ค.
84
+ - ๋ชจ์„œ๋ฆฌ ์—ฌ๋ฐฑ์€ `spacing.md`(16) โ€” BottomCTA์˜ ํ™”๋ฉด ํญ ์—ฌ๋ฐฑ(`layout.pagePadding`)๊ณผ
85
+ ๋‹ค๋ฅธ ์Šค์ผ€์ผ์ด๋‹ค. FAB๋Š” ํ™”๋ฉด ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ์•ˆ์ชฝ์œผ๋กœ ๋“ค์–ด์˜จ ์ž‘์€ ์›์ด์ง€, ํญ ์ „์ฒด
86
+ ์ฝ˜ํ…์ธ  ์ •๋ ฌ์„ ๋”ฐ๋ฅด๋Š” ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค.
87
+
88
+ ## ํ”Œ๋žซํผ ๋ฒˆ์—ญ
89
+
90
+ - Web: `position: fixed`(๋˜๋Š” ์Šคํฌ๋กค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ค€ `sticky`), `aria-label`์ด
91
+ ํ•ญ์ƒ ์ „์ฒด `label`(๋ชจ๋“œ ๋ฌด๊ด€). ์•„์ด์ฝ˜์€ decorative(`aria-hidden`).
92
+ - Native: ์ ˆ๋Œ€ ์œ„์น˜ + safe-area ํ•˜๋‹จ inset์„ additive๋กœ ์ ์šฉ.
93
+ `accessibilityLabel` ์—ญ์‹œ ํ•ญ์ƒ ์ „์ฒด `label`.
94
+ - Reduce Motion: ๋ชจ์–‘ tween(์› โ†” ์•Œ์•ฝ) ์—†์ด ์•„์ด์ฝ˜/๋ผ๋ฒจ opacity ๊ต์ฐจ๋กœ ๋Œ€์ฒด.
95
+
96
+ ## ๊ณต๊ฐœํ•œ ์ถ• / ๋ฐฐ์ œํ•œ ์ถ•
97
+
98
+ | ์ถ• | ์ƒํƒœ |
99
+ | --- | --- |
100
+ | `layoutMode`(expanded/collapsed) | ๊ณต๊ฐœ |
101
+ | ์ ‘๊ทผ์„ฑ ์ด๋ฆ„(ํ•ญ์ƒ ์ „์ฒด label) | ๊ณต๊ฐœ, ๋ชจ๋“œ์™€ ๋…๋ฆฝ |
102
+ | ์ฝ˜ํ…์ธ  ํ•˜๋‹จ ์—ฌ๋ฐฑ ๊ณ„์‚ฐ | ๊ณต๊ฐœ(`resolveFloatingActionButtonContentClearance`) |
103
+ | `disabled` | **๋ฐฐ์ œ** โ€” ์ธก์ •๋œ ์š”๊ตฌ ์—†์Œ. ์ƒ์„ฑ ํ–‰๋™์€ ๋ณดํ†ต ํ•ญ์ƒ ํ™œ์„ฑ ์ƒํƒœ๋‹ค. ํ•„์š”ํ•ด์ง€๋ฉด ๊ทธ๋•Œ ์—ฐ๋‹ค |
104
+ | ๋น„๋™๊ธฐ/๋กœ๋”ฉ ์ƒํƒœ | **๋ฐฐ์ œ** โ€” FAB๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ณดํ†ต ์ฆ‰์‹œ ๋‹ค์Œ ํ™”๋ฉด/์‹œํŠธ๊ฐ€ ์—ด๋ฆฐ๋‹ค. ๊ทธ ๋ชฉ์ ์ง€ ์ž์ฒด์˜ ๋น„๋™๊ธฐ ์ƒํƒœ๋Š” ๊ทธ ๋ชฉ์ ์ง€(Dialog/Sheet)์˜ session์ด ์†Œ์œ ํ•  ๋ชซ์ด์ง€ FAB์˜ ๋ชซ์ด ์•„๋‹ˆ๋‹ค |
105
+ | ์œ„์น˜(์ฝ”๋„ˆ) ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ | **๋ฐฐ์ œ** โ€” ์ธก์ •๋œ ์ œํ’ˆ ์š”๊ตฌ๊ฐ€ ์—†๋‹ค. ๊ธฐ๋ณธ๊ฐ’(ํ™”๋ฉด ๋…ผ๋ฆฌ์  ๋ ์ชฝ ํ•˜๋‹จ)๋งŒ ๊ณต๊ฐœํ•˜๊ณ , ๋‹ค๋ฅธ ์ฝ”๋„ˆ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด ๊ทธ๋•Œ ์—ฐ๋‹ค |
106
+ | BottomNavigation์˜ `center-gap` sibling action๊ณผ์˜ ํ†ตํ•ฉ | **๋ฐฐ์ œ** โ€” ๊ทธ์ชฝ์€ ์ด๋ฏธ ๋ณ„๋„ Button/IconButton ํ•ฉ์„ฑ์œผ๋กœ ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ(`docs/architecture.md`)์ด๊ณ , ์ด ๊ณ„์•ฝ์ด ๊ทธ ์ž๋ฆฌ๋ฅผ ๋Œ€์‹  ํก์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค |
107
+
108
+ ## ๊ฒ€์ฆ ํ™”๋ฉด
109
+
110
+ ์•„์ง ์—†์Œ. `planned โ†’ beta` ์Šน๊ฒฉ์€ ์‹ค์ œ ์ œํ’ˆ vertical slice ์ดํ›„ ๋ฆฌ๋“œ๊ฐ€
111
+ ์ง„ํ–‰ํ•œ๋‹ค. ์œ ๋ ฅ ํ›„๋ณด: Yajalal ๋งˆ์ด ํ”Œ๋ ˆ์ด์–ด ๋ชฉ๋ก์˜ "์„ ์ˆ˜ ์ถ”๊ฐ€".
package/docs/form.md ADDED
@@ -0,0 +1,134 @@
1
+ # Form contract
2
+
3
+ ## ๋ฌธ์ œ
4
+
5
+ antd `Form`์€ ๋ ˆ์ด์•„์›ƒ๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒธํ•ฉ๋‹ˆ๋‹ค(`useForm`, `dependencies`,
6
+ `validateTrigger`, `Form.List`...). HJM์—๋Š” ๋Ÿฐํƒ€์ž„์ด ์—†์œผ๋ฏ€๋กœ ๊ทธ ํ‘œ๋ฉด์„ ์˜ฎ๊ธธ ์ˆ˜ ์—†๊ณ ,
7
+ ์˜ฎ๊ธฐ๋ ค๋Š” ์‹œ๋„ ์ž์ฒด๊ฐ€ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์‚ฌ์šฉ์ž ๋ฌธ์ œ๋Š” ๋‘ ๊ฐ€์ง€๋ฟ์ž…๋‹ˆ๋‹ค.
8
+
9
+ 1. ์—ฌ๋Ÿฌ `Field`๋ฅผ ํ•œ ํ™”๋ฉด์— ์Œ“์„ ๋•Œ ๋ผ๋ฒจยทํ•„๋“œยท๋„์›€๋งยท์˜ค๋ฅ˜ ์‚ฌ์ด์˜ ๋ฆฌ๋“ฌ์ด ํ™”๋ฉด๋งˆ๋‹ค
10
+ ์ œ๊ฐ๊ฐ์ด ๋œ๋‹ค.
11
+ 2. ์ œ์ถœ์€ ํ•ญ์ƒ ๊ฐ™์€ ๋ชจ์–‘์˜ ์‹คํŒจ๋ฅผ ๋งŒ๋“ ๋‹ค โ€” ๋‘ ๋ฒˆ ๋ˆŒ๋Ÿฌ ๋‘ ๋ฒˆ ์ „์†ก๋˜๊ฑฐ๋‚˜, ์‹คํŒจ ๋ฉ”์‹œ์ง€๊ฐ€
12
+ ์–ด๋А ํ•„๋“œ ๊ฒƒ์ธ์ง€ ํผ ์ „์ฒด ๊ฒƒ์ธ์ง€ ํ—ท๊ฐˆ๋ฆฌ๊ฑฐ๋‚˜, ์‹คํŒจ ํ›„ ํฌ์ปค์Šค๊ฐ€ ์•„๋ฌด ๋ฐ๋„ ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
13
+
14
+ ## ์ผ๋ฐ˜ํ™”ํ•œ ๊ณ„์•ฝ
15
+
16
+ Form์€ **ํ•„๋“œ๋“ค ์‚ฌ์ด์˜ ๋ฆฌ๋“ฌ**๊ณผ **์ œ์ถœ ์„ธ์…˜**๋งŒ ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ๋ชจ๋‘ ์ œํ’ˆ(React
17
+ Hook Form ๋“ฑ)์ด ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค.
18
+
19
+ ### Field์™€์˜ ๊ฒฝ๊ณ„
20
+
21
+ `Field`๋Š” ์ด๋ฏธ ํ•œ ํ•„๋“œ์˜ ํ”„๋ ˆ์ž„(background/border/์ƒํƒœ๋ณ„ border, label-to-control
22
+ gap, control-to-support-text gap)์„ `fieldRecipe`๋กœ ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค. `Form`์€ ๊ทธ ํ”„๋ ˆ์ž„์„
23
+ ๋‹ค์‹œ ์ •์˜ํ•˜์ง€ ์•Š๊ณ , ํ”„๋ ˆ์ž„์ด ๋๋‚œ ๋’ค **๋‹ค์Œ ํ•„๋“œ๊นŒ์ง€์˜ ์„ธ๋กœ ๊ฐ„๊ฒฉ**๋งŒ `formRecipe`๋กœ
24
+ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ํ•„๋“œ ๋‚ด๋ถ€์˜ ๋ฆฌ๋“ฌ์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ Field์˜ ๋ณ€๊ฒฝ์ด์ง€ Form์˜
25
+ prop์ด ์•„๋‹™๋‹ˆ๋‹ค.
26
+
27
+ ### ์ œ์ถœ ์„ธ์…˜
28
+
29
+ `AlertDialog`๊ฐ€ ์ด๋ฏธ `idle โ†’ busy โ†’ error/closing โ†’ closed` ์„ธ์…˜์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
30
+ Form์€ ๊ฐ™์€ ๋ฌธ์ œ(์ค‘๋ณต ์‹คํ–‰ ์ฐจ๋‹จ, ์‹คํŒจ ํ›„ ์žฌ์‹œ๋„, ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์˜ ์ •์‚ฐ)๋ฅผ ๊ฐ™์€ ๋ชจ์–‘์œผ๋กœ
31
+ ํ’€๋˜, ํ•œ ๊ฐ€์ง€ ์‹ค์ œ ์ฐจ์ด๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค โ€” AlertDialog์˜ side effect๋Š” ํ•œ ๋ฒˆ ํ™•์ธํ•˜๊ณ 
32
+ ๋‹ซํžˆ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์ง€๋งŒ, Form์€ ๋Œ€๊ฐœ ํ™”๋ฉด์— ๊ณ„์† ๋‚จ์•„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค์‹œ ์ œ์ถœ๋ฉ๋‹ˆ๋‹ค(์ˆ˜์ • โ†’
33
+ ์žฌ์‹œ๋„, ๋˜๋Š” ์„ค์ • ํ™”๋ฉด์„ ๋‚˜์ค‘์— ๋‹ค์‹œ ์ €์žฅ). ๊ทธ๋ž˜์„œ `succeeded`/`failed`๋Š”
34
+ AlertDialog์˜ `closed`์ฒ˜๋Ÿผ ์ข…๊ฒฐ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ **์‰ฌ๋Š” ์ƒํƒœ**์ž…๋‹ˆ๋‹ค โ€” ๋‘˜ ๋‹ค์—์„œ ๋‹ค์‹œ
35
+ `submit()`์„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
36
+
37
+ ```text
38
+ idle โ”€โ”€submitโ”€โ”€โ†’ submitting โ”€โ”€resolveโ”€โ”€โ†’ succeeded โ”€โ”€submitโ”€โ”€โ†’ submitting โ€ฆ
39
+ โ”‚ โ†‘
40
+ โ””โ”€โ”€rejectโ”€โ”€โ†’ failed โ”€โ”€โ”€โ”€โ”€โ”€โ”€submit(retry)โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
41
+ submitting ์ค‘์—๋Š” submit()์ด ์ฆ‰์‹œ blocked๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  onSubmit์„ ๋‹ค์‹œ ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค.
42
+ dispose()๊ฐ€ submitting ์ค‘ ํ˜ธ์ถœ๋˜๋ฉด ๊ทธ attempt๋Š” interrupted๋กœ ํ•œ ๋ฒˆ๋งŒ ์ •์‚ฐ๋œ๋‹ค.
43
+ ```
44
+
45
+ - `submit(values)`๋Š” ๋งค ํ˜ธ์ถœ๋งˆ๋‹ค ์ž์‹ ์˜ ๋ฐ˜ํ™˜ Promise๋ฅผ **์ •ํ™•ํžˆ ํ•œ ๋ฒˆ** ์ •์‚ฐํ•ฉ๋‹ˆ๋‹ค.
46
+ ๊ฐ™์€ attempt๊ฐ€ ์‹ค์ œ handler ์„ฑ๊ณต/์‹คํŒจ๋กœ ์ •์‚ฐ๋˜๊ฑฐ๋‚˜, `dispose()`๋กœ `interrupted`๋กœ
47
+ ์ •์‚ฐ๋˜๊ฑฐ๋‚˜ โ€” ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.
48
+ - `submitting` ์ค‘์˜ ๋ชจ๋“  `submit()` ํ˜ธ์ถœ์€ handler๋ฅผ ๋‹ค์‹œ ๋ถ€๋ฅด์ง€ ์•Š๊ณ 
49
+ `{ outcome: "blocked", reason: "already-submitting" }`์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.
50
+ - `reset()`์€ `succeeded`/`failed`์ฒ˜๋Ÿผ ์‰ฌ๋Š” ์ƒํƒœ์—์„œ๋งŒ `idle`๋กœ ๋˜๋Œ๋ฆฌ๋ฉฐ,
51
+ `submitting` ์ค‘์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  `false`๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค(๊ฒฝํ•ฉ ๋ฐฉ์ง€).
52
+ - Form์€ ๊ฐ’์„ ๋“ค๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `submit(values)`๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ์ˆœ๊ฐ„์˜ ๊ฐ’์„
53
+ ์ „๋‹ฌ๋ฐ›์„ ๋ฟ์ด๋ฉฐ, ์–ธ์ œ ์ œ์ถœ์„ ์‹œ์ž‘ํ•ด๋„ ๋˜๋Š”์ง€(dirty/valid ์—ฌ๋ถ€)๋Š” ์ œํ’ˆ์ด ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
54
+
55
+ ### ์˜ค๋ฅ˜ ์†Œ์œ ๊ถŒ
56
+
57
+ - **ํ•„๋“œ ์˜ค๋ฅ˜**๋Š” ๊ฐ Field์˜ `validation`(`valid`/`invalid`) ์ถ•์ด ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค. Form์€
58
+ ๊ทธ ์˜ค๋ฅ˜ ๋ฌธ์ž์—ด์„ ๋ณต์ œํ•ด์„œ ๋‹ค์‹œ ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
59
+ - **form-level ์˜ค๋ฅ˜**(์„œ๋ฒ„ ๊ฑฐ๋ถ€, ๋„คํŠธ์›Œํฌ)๋งŒ Form์˜ `failed` phase๊ฐ€ `message: string`
60
+ ํ•˜๋‚˜๋กœ ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค. `FormSubmitOutcome`์˜ `failed` variant์—๋Š” ํ•„๋“œ๋ณ„ ๋งคํ•‘์ด ํƒ€์ž…
61
+ ์ˆ˜์ค€์—์„œ ์•„์˜ˆ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ๊ฐ™์€ ์‚ฌ์‹ค์„ ๋‘ ๊ณณ์ด ๋งํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์›์ฒœ์ ์œผ๋กœ
62
+ ๋ง‰์Šต๋‹ˆ๋‹ค.
63
+ - form-level ์˜ค๋ฅ˜๋Š” ๊ธฐ์กด Notice `tone="danger"` ๊ณ„์•ฝ์œผ๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. `formRecipe`๋Š”
64
+ ๊ทธ ๋ฐฐ์น˜ ์œ„์น˜(`fields` ๋‹ค์Œ, `actions` ์ด์ „)๋งŒ ๊ณ ์ •ํ•˜๊ณ  ์ƒ‰์„ ๋‹ค์‹œ ์„ ์–ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
65
+
66
+ ### ์ ‘๊ทผ์„ฑ โ€” ์‹คํŒจ ํ›„ ํฌ์ปค์Šค
67
+
68
+ ์ œ์ถœ ์‹คํŒจ๋Š” ๋‘ ๊ฒฝ๋กœ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
69
+
70
+ 1. **ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ ์‹คํŒจ** โ€” ์ œํ’ˆ์˜ ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์• ์ดˆ์— `onSubmit`์„ ๋ถ€๋ฅด์ง€
71
+ ์•Š๊ณ  ํ•„๋“œ๋ณ„ ์˜ค๋ฅ˜๋งŒ ๋‚จ๊น๋‹ˆ๋‹ค. Form์€ ๊ฒ€์ฆ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์–ด๋А ํ•„๋“œ๊ฐ€ ์ฒซ
72
+ ์˜ค๋ฅ˜์ธ์ง€ ์Šค์Šค๋กœ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ œํ’ˆ์ด ์ž์‹ ์˜ ํ•„๋“œ ๋ Œ๋” ์ˆœ์„œ์™€ ํ˜„์žฌ ๋ฌดํšจ
73
+ ํ•„๋“œ id ์ง‘ํ•ฉ์„ ๋„˜๊ธฐ๋ฉด, `resolveFirstInvalidFieldFocusTarget`์ด **๋ Œ๋” ์ˆœ์„œ์ƒ
74
+ ๊ฐ€์žฅ ๋จผ์ €์ธ ๋ฌดํšจ ํ•„๋“œ**๋ฅผ ํ•˜๋‚˜๋กœ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹ต์„ ์ •ํ•˜๋Š” ๊ทœ์น™๋งŒ ๊ณต์šฉ์ด๊ณ , ํฌ์ปค์Šค
75
+ ์ด๋™ ์ž์ฒด(Web `.focus()`, RN accessibility focus)๋Š” renderer๊ฐ€ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
76
+ 2. **์ œ์ถœ ์‹คํŒจ**(์„œ๋ฒ„ ๊ฑฐ๋ถ€, ๋„คํŠธ์›Œํฌ) โ€” ํŠน์ • ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํฌ์ปค์Šค๋Š” form-level
77
+ ์˜ค๋ฅ˜ ์Šฌ๋กฏ์œผ๋กœ ๊ฐ€๊ณ , `formBehaviorDefaults.errorAnnouncementPriority`๊ฐ€
78
+ `"high"`(Toast๊ฐ€ ์ด๋ฏธ ์“ฐ๋Š” `normal | high` ์–ดํœ˜ ์žฌ์‚ฌ์šฉ)๋กœ assertive ๋ฐœํ‘œ๋ฅผ
79
+ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
80
+
81
+ ์ด ๋‘ ๊ฒฝ๋กœ๋Š” ํ•ญ์ƒ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค โ€” ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ์ด ๋ง‰์•˜๋‹ค๋ฉด `onSubmit`์€ ์•„์˜ˆ
82
+ ๋ถˆ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ Form์˜ `failed` phase๋„ ์ƒ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
83
+
84
+ ## HJM ๊ธฐ๋ณธ๊ฐ’
85
+
86
+ - `formDefaults.density = "comfortable"` โ€” `fieldGap`์€ comfortable(`spacing.lg`)์ด
87
+ compact(`spacing.sm`)๋ณด๋‹ค ๋„“์Šต๋‹ˆ๋‹ค.
88
+ - anatomy๋Š” `["root", "field", "formError", "actions"]` ์ˆœ์„œ๋กœ ๊ณ ์ •์ด๋ฉฐ prop์œผ๋กœ ๋ฐ”๊ฟ€
89
+ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค โ€” ๋กœ๋“œ๋งต์˜ "๋ชจ๋“  ์กฐํ•ฉ์„ ์—ด์–ด๋‘์ง€ ์•Š๋Š”๋‹ค" ์›์น™์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
90
+ - `errorAnnouncementPriority = "high"`.
91
+
92
+ ## ํ”Œ๋žซํผ ๋ฒˆ์—ญ
93
+
94
+ - Web: ์‹คํŒจ ์‹œ ์ฒซ ๋ฌดํšจ ํ•„๋“œ์— `.focus()`, form-level ์˜ค๋ฅ˜๋Š” `role="alert"` ๋˜๋Š”
95
+ ๋™๋“ฑํ•œ `aria-live="assertive"` ์˜์—ญ์œผ๋กœ ๋ฐœํ‘œ. `submitting` ์ค‘์—๋Š” ์ œ์ถœ ๋ฒ„ํŠผ๊ณผ ๋ชจ๋“ 
96
+ ํ•„๋“œ๊ฐ€ `aria-disabled`/`disabled`๋กœ ์žฌ์ž…๋ ฅ์„ ๋ง‰์Šต๋‹ˆ๋‹ค(๊ฐ’์€ ๊ทธ๋Œ€๋กœ ๋ณด์กด).
97
+ - React Native: ์‹คํŒจ ์‹œ ์ฒซ ๋ฌดํšจ ํ•„๋“œ๋กœ accessibility focus ์ด๋™, form-level ์˜ค๋ฅ˜๋Š”
98
+ live-region ๋™๋“ฑ๋ฌผ(`AccessibilityInfo.announceForAccessibility` ๋˜๋Š” ๋™๋“ฑ API)๋กœ
99
+ ๋ฐœํ‘œ. `submitting` ์ค‘์—๋Š” ์ œ์ถœ ๋ฒ„ํŠผ์ด `accessibilityState.busy`๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
100
+
101
+ ## ๊ฒ€์ฆ ํ™”๋ฉด
102
+
103
+ Form์€ ์ด์ œ `beta`์ž…๋‹ˆ๋‹ค. BurnTok Web์˜
104
+ `apps/web/src/app/ideas/page.tsx`๊ฐ€ ์‹ค์ œ 2ํ•„๋“œ ์ƒ์„ฑ ํ๋ฆ„์—์„œ ์•„๋ž˜ ๊ณ„์•ฝ์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.
105
+
106
+ - `apps/web/src/lib/form-contract.ts`: `formRecipe` ๊ฐ„๊ฒฉ, `createFormSubmitSession`,
107
+ `resolveFirstInvalidFieldFocusTarget`์„ ์ œํ’ˆ validation๊ณผ React lifecycle์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
108
+ - `apps/web/src/app/ideas/page.tsx`: ์ฒซ invalid control์— ์‹ค์ œ `.focus()`๋ฅผ ์‹คํ–‰ํ•˜๊ณ ,
109
+ field error์™€ `role="alert"` form-level error๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ submitting ์ค‘ ์ค‘๋ณต ์ œ์ถœ์„
110
+ canonical session์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
111
+ - `apps/web/src/components/ui/AppTextField.tsx`: input/textarea ref๋ฅผ ์‹ค์ œ control๊นŒ์ง€
112
+ ์ „๋‹ฌํ•ด focus ๊ณ„์•ฝ์ด ์„ค๋ช…์— ๊ทธ์น˜์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
113
+
114
+ Web ํ•œ ์ œํ’ˆ์˜ vertical slice๋งŒ์œผ๋กœ `stable`์„ ์ฃผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Native renderer์˜
115
+ accessibility focus์™€ busy ๋ฐœํ‘œ ์ฆ๊ฑฐ๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ ์ „๊นŒ์ง€ `beta`๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
116
+
117
+ ## ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ ๊ฒƒ
118
+
119
+ - **๊ฐ’ ์ƒํƒœ ๊ด€๋ฆฌ** โ€” ์–ด๋–ค ํ•„๋“œ๊ฐ€ ๋ฌด์—‡์„ ๋‹ด๊ณ  ์žˆ๋Š”์ง€, dirty/touched ์—ฌ๋ถ€๋Š” ์ „๋ถ€ ์ œํ’ˆ
120
+ ๋˜๋Š” React Hook Form์ด ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค. Form์€ `submit(values)`์˜ ์ธ์ž๋กœ๋งŒ ๊ฐ’์„
121
+ ๋ฐ›์Šต๋‹ˆ๋‹ค.
122
+ - **ํ•„๋“œ ๋“ฑ๋กยท์˜์กด์„ฑยท์กฐ๊ฑด๋ถ€ ํ•„๋“œ** โ€” antd์˜ `Form.Item name`/`dependencies`์— ํ•ด๋‹นํ•˜๋Š”
123
+ ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํ•„๋“œ๊ฐ€ ๋ Œ๋”๋˜๋Š”์ง€๋Š” ์ œํ’ˆ์˜ React ํŠธ๋ฆฌ๊ฐ€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
124
+ - **validateTrigger ์ •์ฑ…** โ€” ์–ธ์ œ ๊ฒ€์ฆ์„ ์‹คํ–‰ํ• ์ง€(`onChange`/`onBlur`/`onSubmit`)๋Š”
125
+ ์ „์ ์œผ๋กœ ์ œํ’ˆ์˜ ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •์ž…๋‹ˆ๋‹ค.
126
+ - **`Form.List`(๋ฐ˜๋ณต ํ•„๋“œ ๊ทธ๋ฃน)** โ€” ๋ฐฐ์—ด ํ˜•ํƒœ์˜ ๋ฐ˜๋ณต ์ž…๋ ฅ์€ ๋ณ„๋„ ๋ฌธ์ œ์ด๋ฉฐ, ํ˜„์žฌ ์–ด๋–ค
127
+ ์‹ค์ œ ํ™”๋ฉด๋„ ์š”๊ตฌํ•˜์ง€ ์•Š์•„ ์ž„์˜๋กœ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
128
+ - **๋ผ๋ฒจ ์œ„์น˜ ๋ณ€ํ˜•(์ˆ˜ํ‰/inline ๋ ˆ์ด์•„์›ƒ)** โ€” `Field`๊ฐ€ ๋ผ๋ฒจ-์œ„ยท์ปจํŠธ๋กค-์•„๋ž˜ ํ•˜๋‚˜์˜
129
+ ๋ฌธ๋ฒ•๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ Form๋„ antd์˜ `layout="horizontal"`์— ํ•ด๋‹นํ•˜๋Š” ๋ณ€ํ˜•์„ ์ถ”๊ฐ€ํ•˜์ง€
130
+ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•ด์ง€๋ฉด ๊ทธ๊ฒƒ์€ ๋จผ์ € `Field`์˜ ์ƒˆ ๋ณ€ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
131
+ - **actions(์ œ์ถœ/์ทจ์†Œ ๋ฒ„ํŠผ) ๋ ˆ์ด์•„์›ƒ** โ€” ๋ฒ„ํŠผ ๊ฐ„๊ฒฉยท์ •๋ ฌ์€ ๊ธฐ์กด Button/Stack์˜ ๋ชซ์ž…๋‹ˆ๋‹ค.
132
+ Stack์ด ์•„์ง ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ „๊นŒ์ง€ `planned` ์ด์ƒ์œผ๋กœ ์Šน๊ฒฉํ•˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ ๊ฐ™์€
133
+ ์ด์œ ๋กœ, Form๋„ actions ์Šฌ๋กฏ์˜ ์œ„์น˜๋งŒ ๊ณ ์ •ํ•˜๊ณ  ๊ทธ ์•ˆ์˜ ๋ ˆ์ด์•„์›ƒ ํ† ํฐ์€ ๋งŒ๋“ค์ง€
134
+ ์•Š์Šต๋‹ˆ๋‹ค.
@@ -0,0 +1,103 @@
1
+ # Component maturity and evidence manifest
2
+
3
+ > Generated from `@hjmds/design-contracts` 0.8.2. Do not edit this file directly; run `pnpm contracts:sync`.
4
+
5
+ This document is the human-readable projection of the same catalog and Showcase manifest consumed by product CI.
6
+
7
+ - Contract: stable 4 ยท beta 58 ยท planned 29
8
+ - Web renderer: beta 60 ยท planned 29 ยท unsupported 2
9
+ - Native renderer: beta 61 ยท planned 12 ยท unsupported 18
10
+
11
+ | Component | Canonical story ID | Contract | Web | Native | Documentation | Required evidence |
12
+ | --- | --- | --- | --- | --- | --- | --- |
13
+ | Text | `foundation/text` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
14
+ | Icon | `foundation/icon` | beta | beta | beta | [authored](../icon.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
15
+ | Surface | `layout/surface` | stable | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
16
+ | Divider | `layout/divider` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
17
+ | Section | `layout/section` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
18
+ | Stack | `layout/stack` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
19
+ | Grid | `layout/grid` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, platform-parity |
20
+ | Layout | `layout/layout` | beta | beta | beta | [authored](../layout.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
21
+ | Masonry | `layout/masonry` | planned | planned | planned | generated only | contract: contract |
22
+ | Splitter | `layout/splitter` | planned | planned | unsupported | [authored](../splitter.md) | contract: contract |
23
+ | Button | `action/button` | stable | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
24
+ | IconButton | `action/icon-button` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
25
+ | Link | `action/link` | beta | beta | beta | [authored](../link.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
26
+ | BottomCTA | `action/bottom-cta` | beta | unsupported | beta | generated only | contract: contract; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
27
+ | FloatingActionButton | `action/floating-action-button` | planned | planned | planned | [authored](../floating-action-button.md) | contract: contract |
28
+ | Field | `input/field` | stable | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
29
+ | SearchField | `input/search-field` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
30
+ | TextArea | `input/text-area` | stable | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
31
+ | PasswordField | `input/password-field` | beta | beta | beta | [authored](../password-field.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
32
+ | OtpField | `input/otp-field` | beta | beta | beta | [authored](../otp-field.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
33
+ | Checkbox | `input/checkbox` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
34
+ | Radio | `input/radio` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
35
+ | CheckboxGroup | `input/checkbox-group` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
36
+ | RadioGroup | `input/radio-group` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
37
+ | Switch | `input/switch` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
38
+ | Chip | `input/chip` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
39
+ | SegmentedControl | `input/segmented-control` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
40
+ | Slider | `input/slider` | beta | beta | beta | [authored](../slider.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
41
+ | NumberField | `input/number-field` | beta | beta | beta | [authored](../number-field.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
42
+ | Select | `input/select` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
43
+ | Combobox | `input/combobox` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
44
+ | DatePicker | `input/date-picker` | beta | beta | beta | [authored](../date-picker.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
45
+ | TimePicker | `input/time-picker` | planned | planned | planned | [authored](../time-picker.md) | contract: contract |
46
+ | ColorPicker | `input/color-picker` | planned | planned | unsupported | [authored](../color-picker.md) | contract: contract |
47
+ | FilePicker | `input/file-picker` | beta | beta | beta | [authored](../file-picker.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
48
+ | Cascader | `input/cascader` | planned | planned | planned | [authored](../cascader.md) | contract: contract |
49
+ | Form | `input/form` | beta | beta | beta | [authored](../form.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
50
+ | Mentions | `input/mentions` | planned | planned | planned | [authored](../mentions.md) | contract: contract |
51
+ | Rating | `input/rating` | planned | planned | planned | [authored](../rating.md) | contract: contract |
52
+ | TransferList | `input/transfer-list` | planned | planned | planned | [authored](../transfer-list.md) | contract: contract |
53
+ | TreeSelect | `input/tree-select` | planned | planned | unsupported | [authored](../tree-select.md) | contract: contract |
54
+ | UploadItem | `data-display/upload-item` | beta | beta | beta | [authored](../upload-item.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
55
+ | Tabs | `navigation/tabs` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
56
+ | TopBar | `navigation/top-bar` | beta | unsupported | beta | generated only | contract: contract; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
57
+ | BottomNavigation | `navigation/bottom-navigation` | beta | beta | beta | [authored](../bottom-navigation.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
58
+ | Breadcrumb | `navigation/breadcrumb` | planned | planned | unsupported | [authored](../breadcrumb.md) | contract: contract |
59
+ | Pagination | `navigation/pagination` | planned | planned | unsupported | [authored](../pagination.md) | contract: contract |
60
+ | LoadMore | `navigation/load-more` | beta | beta | beta | [authored](../load-more.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
61
+ | Steps | `navigation/steps` | beta | beta | beta | [authored](../steps.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
62
+ | Menu | `navigation/menu` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
63
+ | Anchor | `navigation/anchor` | planned | planned | unsupported | [authored](../anchor.md) | contract: contract |
64
+ | Avatar | `data-display/avatar` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
65
+ | Badge | `data-display/badge` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
66
+ | CounterBadge | `data-display/counter-badge` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
67
+ | Card | `data-display/card` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
68
+ | List | `data-display/list` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
69
+ | ListRow | `data-display/list-row` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
70
+ | VirtualList | `data-display/virtual-list` | planned | planned | planned | [authored](../virtual-list.md) | contract: contract |
71
+ | Accordion | `data-display/accordion` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
72
+ | Statistic | `data-display/statistic` | beta | beta | beta | [authored](../statistic.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
73
+ | Timeline | `data-display/timeline` | beta | beta | beta | [authored](../timeline.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
74
+ | DataTable | `data-display/data-table` | planned | planned | unsupported | [authored](../data-table.md) | contract: contract |
75
+ | Tree | `data-display/tree` | planned | planned | unsupported | [authored](../tree.md) | contract: contract |
76
+ | Calendar | `data-display/calendar` | planned | planned | planned | [authored](../calendar.md) | contract: contract |
77
+ | Carousel | `data-display/carousel` | planned | planned | planned | [authored](../carousel.md) | contract: contract |
78
+ | DescriptionList | `data-display/description-list` | beta | beta | beta | [authored](../description-list.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
79
+ | Image | `data-display/image` | beta | beta | beta | [authored](../image.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
80
+ | QRCode | `data-display/qrcode` | planned | planned | planned | [authored](../qr-code.md) | contract: contract |
81
+ | Tag | `data-display/tag` | beta | beta | beta | [authored](../tag.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
82
+ | Tour | `overlay/tour` | planned | planned | unsupported | [authored](../tour.md) | contract: contract |
83
+ | EmptyState | `feedback/empty-state` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
84
+ | Notice | `feedback/notice` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
85
+ | Progress | `feedback/progress` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
86
+ | Spinner | `feedback/spinner` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
87
+ | Skeleton | `feedback/skeleton` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
88
+ | Result | `feedback/result` | beta | beta | beta | [authored](../result.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
89
+ | Toast | `feedback/toast` | beta | beta | beta | [authored](../toast.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
90
+ | Watermark | `feedback/watermark` | planned | planned | unsupported | [authored](../watermark.md) | contract: contract |
91
+ | Dialog | `overlay/dialog` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
92
+ | AlertDialog | `overlay/alert-dialog` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
93
+ | Sheet | `overlay/sheet` | beta | beta | beta | generated only | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard, platform-parity |
94
+ | SidePanel | `overlay/side-panel` | planned | planned | unsupported | [authored](../side-panel.md) | contract: contract |
95
+ | Popover | `overlay/popover` | planned | planned | unsupported | [authored](../popover.md) | contract: contract |
96
+ | ConfirmPopover | `overlay/confirm-popover` | planned | planned | unsupported | [authored](../confirm-popover.md) | contract: contract |
97
+ | Tooltip | `overlay/tooltip` | beta | beta | unsupported | [authored](../tooltip.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility, keyboard |
98
+ | CommandPalette | `overlay/command-palette` | planned | planned | unsupported | [authored](../command-palette.md) | contract: contract |
99
+ | Affix | `utility/affix` | planned | planned | unsupported | [authored](../affix.md) | contract: contract |
100
+ | AppProvider | `provider/app-provider` | planned | planned | planned | [authored](../app-provider.md) | contract: contract |
101
+ | BorderBeam | `utility/border-beam` | planned | planned | unsupported | [authored](../border-beam.md) | contract: contract |
102
+ | DesignSystemProvider | `provider/design-system-provider` | beta | beta | beta | [authored](../design-system-provider.md) | contract: contract; web: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility; native: default, dark, long-copy, large-text, rtl, reduced-motion, accessibility |
103
+ | Utility | `utility/utility` | planned | planned | unsupported | [authored](../utility.md) | contract: contract |