@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.
- package/README.md +208 -0
- package/dist/alert-dialog.d.ts +102 -0
- package/dist/alert-dialog.d.ts.map +1 -0
- package/dist/alert-dialog.js +136 -0
- package/dist/alert-dialog.js.map +1 -0
- package/dist/base-recipes.d.ts +184 -0
- package/dist/base-recipes.d.ts.map +1 -0
- package/dist/base-recipes.js +129 -0
- package/dist/base-recipes.js.map +1 -0
- package/dist/behaviors.d.ts +1254 -0
- package/dist/behaviors.d.ts.map +1 -0
- package/dist/behaviors.js +972 -0
- package/dist/behaviors.js.map +1 -0
- package/dist/bottom-navigation-defaults.d.ts +13 -0
- package/dist/bottom-navigation-defaults.d.ts.map +1 -0
- package/dist/bottom-navigation-defaults.js +10 -0
- package/dist/bottom-navigation-defaults.js.map +1 -0
- package/dist/bottom-navigation.d.ts +114 -0
- package/dist/bottom-navigation.d.ts.map +1 -0
- package/dist/bottom-navigation.js +223 -0
- package/dist/bottom-navigation.js.map +1 -0
- package/dist/breadcrumb.d.ts +97 -0
- package/dist/breadcrumb.d.ts.map +1 -0
- package/dist/breadcrumb.js +99 -0
- package/dist/breadcrumb.js.map +1 -0
- package/dist/calendar.d.ts +285 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +297 -0
- package/dist/calendar.js.map +1 -0
- package/dist/card.d.ts +39 -0
- package/dist/card.d.ts.map +1 -0
- package/dist/card.js +50 -0
- package/dist/card.js.map +1 -0
- package/dist/carousel.d.ts +180 -0
- package/dist/carousel.d.ts.map +1 -0
- package/dist/carousel.js +172 -0
- package/dist/carousel.js.map +1 -0
- package/dist/catalog.d.ts +7158 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +220 -0
- package/dist/catalog.js.map +1 -0
- package/dist/collection.d.ts +123 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +211 -0
- package/dist/collection.js.map +1 -0
- package/dist/color-references.d.ts +46 -0
- package/dist/color-references.d.ts.map +1 -0
- package/dist/color-references.js +39 -0
- package/dist/color-references.js.map +1 -0
- package/dist/colors.d.ts +56 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +90 -0
- package/dist/colors.js.map +1 -0
- package/dist/command-palette.d.ts +240 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +97 -0
- package/dist/command-palette.js.map +1 -0
- package/dist/component-contracts.d.ts +137 -0
- package/dist/component-contracts.d.ts.map +1 -0
- package/dist/component-contracts.js +53 -0
- package/dist/component-contracts.js.map +1 -0
- package/dist/component-definitions.d.ts +135 -0
- package/dist/component-definitions.d.ts.map +1 -0
- package/dist/component-definitions.js +142 -0
- package/dist/component-definitions.js.map +1 -0
- package/dist/component-recipes.d.ts +3583 -0
- package/dist/component-recipes.d.ts.map +1 -0
- package/dist/component-recipes.js +1503 -0
- package/dist/component-recipes.js.map +1 -0
- package/dist/component-references.d.ts +416 -0
- package/dist/component-references.d.ts.map +1 -0
- package/dist/component-references.js +140 -0
- package/dist/component-references.js.map +1 -0
- package/dist/content-state.d.ts +104 -0
- package/dist/content-state.d.ts.map +1 -0
- package/dist/content-state.js +116 -0
- package/dist/content-state.js.map +1 -0
- package/dist/counter-badge-recipe.d.ts +80 -0
- package/dist/counter-badge-recipe.d.ts.map +1 -0
- package/dist/counter-badge-recipe.js +44 -0
- package/dist/counter-badge-recipe.js.map +1 -0
- package/dist/counter-badge.d.ts +12 -0
- package/dist/counter-badge.d.ts.map +1 -0
- package/dist/counter-badge.js +21 -0
- package/dist/counter-badge.js.map +1 -0
- package/dist/data-table.d.ts +203 -0
- package/dist/data-table.d.ts.map +1 -0
- package/dist/data-table.js +182 -0
- package/dist/data-table.js.map +1 -0
- package/dist/date-picker.d.ts +268 -0
- package/dist/date-picker.d.ts.map +1 -0
- package/dist/date-picker.js +168 -0
- package/dist/date-picker.js.map +1 -0
- package/dist/description-list.d.ts +68 -0
- package/dist/description-list.d.ts.map +1 -0
- package/dist/description-list.js +85 -0
- package/dist/description-list.js.map +1 -0
- package/dist/design-system-provider.d.ts +80 -0
- package/dist/design-system-provider.d.ts.map +1 -0
- package/dist/design-system-provider.js +147 -0
- package/dist/design-system-provider.js.map +1 -0
- package/dist/evidence.d.ts +49 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +133 -0
- package/dist/evidence.js.map +1 -0
- package/dist/file-picker.d.ts +183 -0
- package/dist/file-picker.d.ts.map +1 -0
- package/dist/file-picker.js +224 -0
- package/dist/file-picker.js.map +1 -0
- package/dist/floating-action-button.d.ts +143 -0
- package/dist/floating-action-button.d.ts.map +1 -0
- package/dist/floating-action-button.js +149 -0
- package/dist/floating-action-button.js.map +1 -0
- package/dist/form.d.ts +143 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +206 -0
- package/dist/form.js.map +1 -0
- package/dist/foundations.d.ts +300 -0
- package/dist/foundations.d.ts.map +1 -0
- package/dist/foundations.js +238 -0
- package/dist/foundations.js.map +1 -0
- package/dist/grid.d.ts +75 -0
- package/dist/grid.d.ts.map +1 -0
- package/dist/grid.js +133 -0
- package/dist/grid.js.map +1 -0
- package/dist/icon-button-recipe.d.ts +99 -0
- package/dist/icon-button-recipe.d.ts.map +1 -0
- package/dist/icon-button-recipe.js +53 -0
- package/dist/icon-button-recipe.js.map +1 -0
- package/dist/icon.d.ts +41 -0
- package/dist/icon.d.ts.map +1 -0
- package/dist/icon.js +147 -0
- package/dist/icon.js.map +1 -0
- package/dist/image.d.ts +82 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +100 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +118 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +118 -0
- package/dist/layout.js.map +1 -0
- package/dist/link.d.ts +57 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +142 -0
- package/dist/link.js.map +1 -0
- package/dist/load-more.d.ts +64 -0
- package/dist/load-more.d.ts.map +1 -0
- package/dist/load-more.js +124 -0
- package/dist/load-more.js.map +1 -0
- package/dist/mentions.d.ts +67 -0
- package/dist/mentions.d.ts.map +1 -0
- package/dist/mentions.js +107 -0
- package/dist/mentions.js.map +1 -0
- package/dist/number-field.d.ts +208 -0
- package/dist/number-field.d.ts.map +1 -0
- package/dist/number-field.js +247 -0
- package/dist/number-field.js.map +1 -0
- package/dist/otp-field.d.ts +152 -0
- package/dist/otp-field.d.ts.map +1 -0
- package/dist/otp-field.js +117 -0
- package/dist/otp-field.js.map +1 -0
- package/dist/pagination.d.ts +181 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +226 -0
- package/dist/pagination.js.map +1 -0
- package/dist/password-field.d.ts +187 -0
- package/dist/password-field.d.ts.map +1 -0
- package/dist/password-field.js +120 -0
- package/dist/password-field.js.map +1 -0
- package/dist/popover.d.ts +152 -0
- package/dist/popover.d.ts.map +1 -0
- package/dist/popover.js +137 -0
- package/dist/popover.js.map +1 -0
- package/dist/progress-recipe.d.ts +43 -0
- package/dist/progress-recipe.d.ts.map +1 -0
- package/dist/progress-recipe.js +16 -0
- package/dist/progress-recipe.js.map +1 -0
- package/dist/recipes.d.ts +31 -0
- package/dist/recipes.d.ts.map +1 -0
- package/dist/recipes.js +46 -0
- package/dist/recipes.js.map +1 -0
- package/dist/responsive.d.ts +27 -0
- package/dist/responsive.d.ts.map +1 -0
- package/dist/responsive.js +66 -0
- package/dist/responsive.js.map +1 -0
- package/dist/result.d.ts +111 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +97 -0
- package/dist/result.js.map +1 -0
- package/dist/selection-helpers.d.ts +16 -0
- package/dist/selection-helpers.d.ts.map +1 -0
- package/dist/selection-helpers.js +52 -0
- package/dist/selection-helpers.js.map +1 -0
- package/dist/semantic-colors.d.ts +275 -0
- package/dist/semantic-colors.d.ts.map +1 -0
- package/dist/semantic-colors.js +84 -0
- package/dist/semantic-colors.js.map +1 -0
- package/dist/sheet.d.ts +51 -0
- package/dist/sheet.d.ts.map +1 -0
- package/dist/sheet.js +69 -0
- package/dist/sheet.js.map +1 -0
- package/dist/showcase.d.ts +153 -0
- package/dist/showcase.d.ts.map +1 -0
- package/dist/showcase.js +210 -0
- package/dist/showcase.js.map +1 -0
- package/dist/side-panel.d.ts +199 -0
- package/dist/side-panel.d.ts.map +1 -0
- package/dist/side-panel.js +111 -0
- package/dist/side-panel.js.map +1 -0
- package/dist/slider.d.ts +138 -0
- package/dist/slider.d.ts.map +1 -0
- package/dist/slider.js +150 -0
- package/dist/slider.js.map +1 -0
- package/dist/splitter.d.ts +113 -0
- package/dist/splitter.d.ts.map +1 -0
- package/dist/splitter.js +99 -0
- package/dist/splitter.js.map +1 -0
- package/dist/statistic.d.ts +41 -0
- package/dist/statistic.d.ts.map +1 -0
- package/dist/statistic.js +76 -0
- package/dist/statistic.js.map +1 -0
- package/dist/steps.d.ts +196 -0
- package/dist/steps.d.ts.map +1 -0
- package/dist/steps.js +160 -0
- package/dist/steps.js.map +1 -0
- package/dist/tag.d.ts +128 -0
- package/dist/tag.d.ts.map +1 -0
- package/dist/tag.js +93 -0
- package/dist/tag.js.map +1 -0
- package/dist/timeline.d.ts +147 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +127 -0
- package/dist/timeline.js.map +1 -0
- package/dist/toast.d.ts +164 -0
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +529 -0
- package/dist/toast.js.map +1 -0
- package/dist/tokens.d.ts +9 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +9 -0
- package/dist/tokens.js.map +1 -0
- package/dist/tooltip.d.ts +44 -0
- package/dist/tooltip.d.ts.map +1 -0
- package/dist/tooltip.js +88 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/tour.d.ts +218 -0
- package/dist/tour.d.ts.map +1 -0
- package/dist/tour.js +211 -0
- package/dist/tour.js.map +1 -0
- package/dist/transfer-list.d.ts +207 -0
- package/dist/transfer-list.d.ts.map +1 -0
- package/dist/transfer-list.js +193 -0
- package/dist/transfer-list.js.map +1 -0
- package/dist/tree-select.d.ts +78 -0
- package/dist/tree-select.d.ts.map +1 -0
- package/dist/tree-select.js +132 -0
- package/dist/tree-select.js.map +1 -0
- package/dist/tree.d.ts +206 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +223 -0
- package/dist/tree.js.map +1 -0
- package/dist/upload-item.d.ts +173 -0
- package/dist/upload-item.d.ts.map +1 -0
- package/dist/upload-item.js +156 -0
- package/dist/upload-item.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/docs/affix.md +63 -0
- package/docs/anchor.md +59 -0
- package/docs/ant-design-coverage.md +119 -0
- package/docs/app-provider.md +50 -0
- package/docs/app-rn-adoption.md +227 -0
- package/docs/architecture.md +320 -0
- package/docs/authoring-brief.md +87 -0
- package/docs/border-beam.md +66 -0
- package/docs/bottom-navigation.md +127 -0
- package/docs/breadcrumb.md +82 -0
- package/docs/calendar.md +154 -0
- package/docs/carousel.md +130 -0
- package/docs/cascader.md +93 -0
- package/docs/catalog-decision-status.md +306 -0
- package/docs/color-picker.md +72 -0
- package/docs/command-palette.md +116 -0
- package/docs/confirm-popover.md +93 -0
- package/docs/consistency-audit.md +383 -0
- package/docs/consumer-release-gate.md +90 -0
- package/docs/content-state.md +156 -0
- package/docs/context-panel.md +88 -0
- package/docs/cross-platform-core-normalization.md +118 -0
- package/docs/data-table.md +79 -0
- package/docs/date-picker.md +84 -0
- package/docs/description-list.md +75 -0
- package/docs/design-system-provider.md +139 -0
- package/docs/dropdown.md +78 -0
- package/docs/expansion-roadmap.md +285 -0
- package/docs/file-picker.md +59 -0
- package/docs/floating-action-button.md +111 -0
- package/docs/form.md +134 -0
- package/docs/generated/component-maturity.md +103 -0
- package/docs/generated/renderer-evidence.json +5597 -0
- package/docs/generated/renderer-evidence.md +132 -0
- package/docs/generated/showcase-manifest.json +3732 -0
- package/docs/icon.md +22 -0
- package/docs/identity.md +121 -0
- package/docs/image.md +84 -0
- package/docs/implementation-0.5.md +85 -0
- package/docs/layout-primitives.md +107 -0
- package/docs/layout.md +83 -0
- package/docs/library-reference-decisions.md +123 -0
- package/docs/link.md +67 -0
- package/docs/load-more.md +31 -0
- package/docs/mentions.md +82 -0
- package/docs/migration-0.2.md +108 -0
- package/docs/migration-0.3.md +72 -0
- package/docs/migration-0.5.md +82 -0
- package/docs/migration-0.6.md +197 -0
- package/docs/notification.md +54 -0
- package/docs/number-field.md +82 -0
- package/docs/otp-field.md +103 -0
- package/docs/pagination.md +139 -0
- package/docs/password-field.md +98 -0
- package/docs/popover.md +124 -0
- package/docs/promotion-candidates.md +169 -0
- package/docs/qr-code.md +69 -0
- package/docs/rating.md +58 -0
- package/docs/responsive-grid.md +90 -0
- package/docs/result.md +96 -0
- package/docs/showcase.md +97 -0
- package/docs/side-panel.md +71 -0
- package/docs/slider.md +79 -0
- package/docs/splitter.md +55 -0
- package/docs/statistic.md +16 -0
- package/docs/steps.md +115 -0
- package/docs/tag.md +57 -0
- package/docs/time-picker.md +88 -0
- package/docs/timeline.md +146 -0
- package/docs/toast.md +127 -0
- package/docs/tooltip.md +58 -0
- package/docs/tour.md +136 -0
- package/docs/transfer-list.md +94 -0
- package/docs/tree-select.md +101 -0
- package/docs/tree.md +123 -0
- package/docs/upload-item.md +68 -0
- package/docs/utility.md +53 -0
- package/docs/virtual-list.md +70 -0
- package/docs/watermark.md +58 -0
- package/package.json +402 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# DescriptionList contract
|
|
2
|
+
|
|
3
|
+
**๋ฌธ์ .** ๋ผ๋ฒจ-๊ฐ ์์ ๋ฌถ์ โ FA ๋ฑ๊ธ ๊ท์ , ์ ์ ํ๋กํ, ๊ณ์ฝ ์กฐ๊ฑด โ ์ ์ผ๊ด๋ ์๊ณ์
|
|
4
|
+
๋ฐ์ํ ์ด ๋ฐฐ์น๋ก ๋ณด์ฌ์ค๋๋ค. ์ผ์์์ FA ๋ฑ๊ธ ์ํธ์ ํต์ฐ ํ๋ฉด์ด ์ง๊ธ ๊ฐ์์ ์์ฒด
|
|
5
|
+
๊ตฌํ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํ๊ณ ์์ต๋๋ค.
|
|
6
|
+
|
|
7
|
+
**์ผ๋ฐํํ ๊ณ์ฝ.** Statistic๊ณผ ๊ฐ์ ์์น์
๋๋ค โ ๊ฐ์ ์ ํ์ด ์ด๋ฏธ ํฌ๋งทํ ๋ฌธ์์ด์ด๊ณ ,
|
|
8
|
+
HJM์ stable `id`, `label`, `value`์ ๋ฐ๋ณต๋๋ ์ฝ๊ธฐ ์์๋ง ์์ ํฉ๋๋ค.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
const gradeSheet = {
|
|
12
|
+
items: [
|
|
13
|
+
{ id: "grade", label: "FA ๋ฑ๊ธ", value: "A๋ฑ๊ธ" },
|
|
14
|
+
{ id: "years", label: "๊ท์ ์ถ์ฅ ์์ฆ", value: "6์์ฆ" },
|
|
15
|
+
],
|
|
16
|
+
} satisfies DescriptionListDescriptor;
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
- ๊ฐ ์์ ๋
๋ฆฝ๋ ์ ๊ทผ์ฑ ๋
ธ๋์
๋๋ค. Statistic ๊ทธ๋ฃน๊ณผ ๊ฐ์ ์์น์ผ๋ก, renderer๋ ์ฌ๋ฌ
|
|
20
|
+
์์ ํ๋์ ์ถ์ฝ๋ ๋
ธ๋๋ก ํฉ์น์ง ์์ต๋๋ค.
|
|
21
|
+
- `columns`๋ 1 ๋๋ 2๋ง ํ์ฉํฉ๋๋ค(Statistic์ 1โ4๋ณด๋ค ์ข์ต๋๋ค โ ๋ผ๋ฒจ-๊ฐ ์์ ํต๊ณ
|
|
22
|
+
์นด๋๋ณด๋ค ํ ์ค์ด ๊ธธ์ด 3โ4์ด์์ ๊ฐ์ด ์ฝ๊ฒ ์๋ฆฝ๋๋ค).
|
|
23
|
+
|
|
24
|
+
**HJM ๊ธฐ๋ณธ๊ฐ.** ๊ธฐ๋ณธ `columns`๋ 2.
|
|
25
|
+
|
|
26
|
+
## ํฐ ๊ธ์์์์ ์ ํ โ resolver๊ฐ ์์
|
|
27
|
+
|
|
28
|
+
์ด๋ฒ ๊ฒ์์์ ์ผ์์ ์๋น ์ฝ๋๊ฐ ยง5 ใํฐ ๊ธ์์์์ ์ ํใ ๊ท์น์ ๋ค์ฏ ๋ฒ ์ด๊ฒผ์ต๋๋ค.
|
|
29
|
+
๋งค๋ฒ ํ๋ฉด์ด `fontScale >= 1.6`์ด๋ฉด `columns={1}`์ ๋๊ธฐ๋ ์์ผ๋ก ์ง์ ๋ง์๊ณ , ๊ทธ ์ํ๋ฅผ
|
|
30
|
+
๋น ๋จ๋ฆฐ ํ๋ฉด์ ์กฐ์ฉํ ๊นจ์ก์ต๋๋ค. ์ผ์์ `src/components/ui/statistic-renderer-contract.ts`์
|
|
31
|
+
`resolveStatisticColumnCount`๊ฐ ์ด๋ฏธ ๊ฐ์ ๋ฌธ์ ๋ฅผ "ํ๋ฉด์ด ๋ฐฐ์จ์ ํ์ ํ์ง ์๊ณ , ์ต์ ์นธ
|
|
32
|
+
ํญ์ ๋ฐฐ์จ๋งํผ ํค์์ ์ข์ ํญ๊ณผ ํฐ ๊ธ์๋ฅผ ๊ฐ์ ๊ณ์ฐ์ผ๋ก ํก์ํ๋ค"๋ ํํ๋ก ํ์์ต๋๋ค.
|
|
33
|
+
|
|
34
|
+
DescriptionList๋ ์ด ํํ๋ฅผ **์ฝ์ด ๊ณ์ฝ ์์ผ๋ก** ๊ฐ์ ธ์ `resolveDescriptionListColumnCount`๋ก
|
|
35
|
+
๊ณต๊ฐํฉ๋๋ค โ Statistic์ฒ๋ผ ์๋น ์ฑ์ด ๊ฐ์ ์ฌ๊ตฌํํ์ง ์๊ณ , ์ด ํจํค์ง๊ฐ ํญยท๋ฐฐ์จ ํ์ ์
|
|
36
|
+
์์ ํฉ๋๋ค.
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
resolveDescriptionListColumnCount(availableWidth, requestedColumns, textScale);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- `availableWidth`๊ฐ ์ ํจํ์ง ์์ผ๋ฉด(0 ์ดํ, NaN) `requestedColumns`๋ฅผ ๊ทธ๋๋ก ๋๋ ค์ค๋๋ค โ
|
|
43
|
+
renderer๊ฐ ์์ง ๋ ์ด์์์ ์ธก์ ํ์ง ๋ชปํ ์ฒซ ํ๋ ์์ ์ํ ์์ ํ ํด๋ฐฑ์
๋๋ค.
|
|
44
|
+
- `textScale`์ `DesignSystemProvider`์ ์ฐ์๊ฐ์ ๊ทธ๋๋ก ๋ฐ์ผ๋ฉฐ ์ต์ 1๋ก clampํฉ๋๋ค.
|
|
45
|
+
๋ฐฐ์จ์ด 1๋ณด๋ค ์๋ค๊ณ ์นธ์ ๋ ์ขํ์ง ์์ต๋๋ค(ยง5๊ฐ
|
|
46
|
+
๋ง์ ๋ฐฉํฅ).
|
|
47
|
+
- ๊ฐ์ `availableWidth`์์ `textScale`์ด ์ปค์ง๋ฉด `minItemWidth`๊ฐ ํจ๊ป ์ปค์ง๋ฏ๋ก 2์ด์ด
|
|
48
|
+
์์ฐํ 1์ด๋ก ์ค์ด๋ญ๋๋ค โ ํ๋ฉด๋ง๋ค ๋ฐ๋ณตํด์ผ ํ๋ ์๊ณ๊ฐ ๋ถ๊ธฐ๊ฐ ์ฌ๋ผ์ง๋๋ค.
|
|
49
|
+
|
|
50
|
+
## Statistic๊ณผ์ ๊ฒฝ๊ณ
|
|
51
|
+
|
|
52
|
+
DescriptionList๋ Statistic์ "์ ํ์ด ํฌ๋งทํ ๋ฌธ์์ด, ๋
๋ฆฝ ์ ๊ทผ์ฑ ๋
ธ๋" ์์น์ ๊ทธ๋๋ก
|
|
53
|
+
๋ฐ๋ฅด์ง๋ง ๊ฐ์ ์ปดํฌ๋ํธ๋ ์๋๋๋ค. Statistic์ ์ซ์ ์ค์ฌ ์งํ(๊ฐ์ด tabular, ์งง๊ณ ,
|
|
54
|
+
trend๋ฅผ ๊ฐ์ง ์ ์์)์ด๊ณ DescriptionList๋ ์์ ๊ธธ์ด ํ
์คํธ ๊ฐ์ ๋ผ๋ฒจ-๊ฐ ์์
๋๋ค.
|
|
55
|
+
๊ทธ๋์ `value`์ `trend`๊ฐ ์๊ณ , `columns` ์ํ์ด 2๋ก ๋ ์ข์ผ๋ฉฐ, `resolveDescriptionListColumnCount`์
|
|
56
|
+
`minItemWidth`(160)๋ Statistic์ `minItemWidth`(120)์ ๋ค๋ฅธ ๊ฐ์
๋๋ค โ ํต๊ณ ์นด๋๋ณด๋ค
|
|
57
|
+
๋ผ๋ฒจ-๊ฐ ํ ์ค์ด ๋๊ฒ ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
58
|
+
|
|
59
|
+
## ํ๋ซํผ ๋ฒ์ญ
|
|
60
|
+
|
|
61
|
+
Web/Native ๋ชจ๋ `resolveDescriptionListColumnCount`๊ฐ ๋๋ ค์ค ์ด ์๋ก CSS grid ๋๋
|
|
62
|
+
flex wrap ๋ ์ด์์์ ๋ง๋ญ๋๋ค. ์ค์ ์ธก์ ๋ ์ปจํ
์ด๋ ํญ๊ณผ ์์คํ
ํฐํธ ๋ฐฐ์จ์ renderer๊ฐ
|
|
63
|
+
๊ณต๊ธํ๊ณ , ์ด ๊ณ์ฝ์ ๊ทธ ๋ ์
๋ ฅ์ ๋ฐ์ ์ด ์๋ง ๊ฒฐ์ ํฉ๋๋ค.
|
|
64
|
+
|
|
65
|
+
## ํ์ฌ ๊ฒ์ฆ๊ณผ ๋จ์ ์ฆ๊ฑฐ
|
|
66
|
+
|
|
67
|
+
first-party Web/RN renderer๊ฐ ๊ณตํต descriptor์
|
|
68
|
+
`resolveDescriptionListColumnCount`๋ฅผ ์ง์ ์๋นํ๋ฏ๋ก contract์ ๋ surface๋ฅผ `beta`๋ก
|
|
69
|
+
์น๊ฒฉํ๋ค. Web์ `<dl>/<dt>/<dd>` ๊ตฌ์กฐ์ ์ธก์ ํญ ๊ธฐ๋ฐ ์ด ์ ํ์, Native๋ ๋
๋ฆฝ๋ ๋ผ๋ฒจ-๊ฐ
|
|
70
|
+
์ ๊ทผ์ฑ ๋
ธ๋์ window/text-scale ๊ธฐ๋ฐ flex ์ด ์ ํ์ ๊ธฐ๋ณธ ์คํ test๋ก ๊ฒ์ฆํ๋ค.
|
|
71
|
+
|
|
72
|
+
์ด์ ํ์ ์ด ํ๋ณด๋ก ๋ ์ผ์์ ํ๋ฉด์ ์ฌ์ ํ ์น๊ฒฉ์ ์ ํ ๊ทผ๊ฑฐ๋ก ์ธ์ง ์๋๋ค. ํด๋น ํ๋ฉด์
|
|
73
|
+
๋จ์ผ ์ด `List`/`ListRow` ์กฐํฉ์ด๋ฉฐ DescriptionList์ 1/2์ด ๋ฌธ์ ์ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ์ค์ ์๋น
|
|
74
|
+
์ฑ์์ ์ด renderer๋ฅผ ์ฐ๋ 1/2์ด ํ๋ฉด๊ณผ 200% ๊ธ์ ํฌ๊ธฐ ์ค๊ธฐ๊ธฐ ์ฆ๊ฑฐ๋ stable ์น๊ฒฉ ์ ๊น์ง
|
|
75
|
+
๋ช
์์ ์ธ debt๋ก ๋จ๋๋ค.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# DesignSystemProvider contract
|
|
2
|
+
|
|
3
|
+
## ๋ฌธ์
|
|
4
|
+
|
|
5
|
+
antd `ConfigProvider`๋ ํ
๋งยท๋ฐฉํฅ(RTL)ยท๊ธ์ ๋ฐฐ์จยทlocale ๊ฐ์ ์ ์ญ ์ค์ ์ React Context๋ก
|
|
6
|
+
์๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ด๋ ค์ค๋ค. ์ด ํจํค์ง๋ React๋ RN๋ importํ์ง ์์ผ๋ฏ๋ก "Context๋ก
|
|
7
|
+
๋ด๋ ค์ค๋ค"๋ ๋ถ๋ถ(๊ทธ ์์ฒด๊ฐ antd `ConfigProvider`์ ๋ณธ์ฒด)์ ์ ์ด์ ์ด ์ ์ฅ์์ ๋ฌผ๊ฑด์ด ๋
|
|
8
|
+
์ ์๋ค. ๊ทธ๋์ ๋จผ์ ๋ฌผ์ด์ผ ํ๋ค: **๋ฐํ์(Context ์ ํ)์ ๊ฑท์ด๋ด๊ณ ๋๋ฉด ๊ณ์ฝํ ๊ฒ์ด
|
|
9
|
+
๋จ๋๊ฐ?**
|
|
10
|
+
|
|
11
|
+
**๋จ๋๋ค โ ๋ค๋ง "provider ์ปดํฌ๋ํธ"๊ฐ ์๋๋ผ "ํ๊ฒฝ ๊ฐ์ ํ์
+ ๊ธฐ๋ณธ๊ฐ + ๋ณํฉ ๊ท์น +
|
|
12
|
+
ํด์๋ ์ ํ๋ ํธ"๋ค.**
|
|
13
|
+
`showcaseEnvironmentMatrix`(`src/showcase.ts`)๊ฐ ์ด๋ฏธ theme/direction/textScale/motion
|
|
14
|
+
๋ค ์ถ์ ์ ํํ ์ด๊ฑฐํ๊ณ ์๋ค๋ ๊ฒ์ด ๊ทธ ์ฆ๊ฑฐ์๋ค โ ๋ค๋ง ๊ทธ๊ฑด Showcase ๋ฌธ์ ๋๊ตฌ๊ฐ ์ฐ๋
|
|
15
|
+
**๋ซํ 5๊ฐ fixture ์๋๋ฆฌ์ค**(`id: "default"|"dark"|"large-text"|"rtl"|"reduced-motion"`)
|
|
16
|
+
์ด์ง, ์ค์ ์ ํ์ด ๋ฐํ์์ ๊ตฌ๋
ํ **์ด๋ฆฐ ๊ฐ ํ์
**์ด ์๋๋ค. ์ด ๊ณ์ฝ์ด ๊ทธ ์ด๋ฆฐ ๋ฒ์ ์ด๋ค.
|
|
17
|
+
|
|
18
|
+
## ์ด๋ฏธ ์๋ ๊ฒ๊ณผ ๊ฒน์น์ง ์๋์ง ๋จผ์ ํ์ธํ๋ค
|
|
19
|
+
|
|
20
|
+
- **theme ์ถ์ ์ด๋ฏธ ์๊ฒฐ๋ผ ์๋ค.** `colors.ts`๊ฐ ์ด๋ฏธ `ThemePreference =
|
|
21
|
+
"system"|"light"|"dark"`, `ResolvedTheme`, `isThemePreference()`๋ฅผ ๊ฐ๊ณ ์๋ค. ์ด
|
|
22
|
+
๋ชจ๋์ ๊ทธ๊ฒ์ **์ฌ์ ์ธํ์ง ์๊ณ ๊ทธ๋๋ก import**ํ๋ค โ "์ด๋ฏธ ์๋ ๊ฒ๊ณผ ๊ฒน์น๋ฉด ๋ง๋ค์ง
|
|
23
|
+
๋ง๋ผ"๋ ์ง์๋ฅผ theme ์ถ์๋ ๊ทธ๋๋ก ์ ์ฉํด ์๋ฌด๊ฒ๋ ์๋ก ๋ง๋ค์ง ์์๋ค.
|
|
24
|
+
- **direction ์ถ์ ๊ฒน์น๋ ๊ฒ ์๋๋ผ ํฉ์ด์ ธ ์์๋ค.** `"ltr" | "rtl"`๊ฐ
|
|
25
|
+
`BottomNavigationDirection`, `TabsDirection`, `SelectionDirection`, `IconDirection`,
|
|
26
|
+
`ShowcaseDirection`, ๊ทธ๋ฆฌ๊ณ `calendar.ts`์ ์ธ๋ผ์ธ ํ๋ผ๋ฏธํฐ๊น์ง **์ต์ 6๊ณณ์์ ๊ฐ์ ๋ค์
|
|
27
|
+
์ ์ธ**๋ผ ์์๋ค. ๊ณต๊ฐ ์ด๋ฆ์ ํธํ์ฑ์ ์ํด ์ ์งํ๋ ๋ชจ๋
|
|
28
|
+
`DesignSystemDirection`์ type alias๋ก ์ด๊ดํ๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด import๋ ๊นจ์ง์ง ์๊ณ ,
|
|
29
|
+
ํ์ฉ ๊ฐ์ ๋จ์ผ ์ถ์ฒ๋ง Provider ๊ณ์ฝ์ผ๋ก ๋ชจ์๋ค.
|
|
30
|
+
- **textScale์ ์ด๋ฆ๋ ๋ชจ์๋ ์ด๋ฏธ ๋ ๊ฐ๋์๋ค.** `description-list.ts`๋ `fontScale`
|
|
31
|
+
(์ฐ์๊ฐ, `Math.max(fontScale, 1)`๋ก ์์ฒด clamp), `showcase.ts`๋ `textScale`(๋ซํ
|
|
32
|
+
`1|1.5|2`)์ ๊ฐ์ ์ฐ๊ณ ์์๋ค. `DesignSystemTextScale = number`(์ฐ์๊ฐ)๋ฅผ ์๋ฅ
|
|
33
|
+
์ ํธ๋ก ์ด์๊ณ DescriptionList์ ์ธ ๋ฒ์งธ ์ธ์์ Showcase fixture ๋ณํ ํจ์๊ฐ ์ด ํ์
์
|
|
34
|
+
์ฌ์ฉํ๋ค. Showcase์ ๋ซํ union๊ณผ ๊ธฐ์กด `motion` ํ๋๋ fixture API ํธํ์ ์ํด ์ ์งํ๋ค.
|
|
35
|
+
- **reducedMotion์ "์ ํธ"์ "์ ๋ต"์ด ์ด๋ฏธ ๋ถ๋ฆฌ๋ผ ์์๋ค.** `foundations.ts`์
|
|
36
|
+
`ReducedMotionBehavior`("instant"/"opacity"/"static")๋ ์ปดํฌ๋ํธ๊ฐ Reduce Motion์ผ
|
|
37
|
+
**๋ ๋ฌด์์ ํ๋์ง**(์ ๋ต)์ด๊ณ , `carousel.ts`์ `inputs: ["reducedMotion", ...]`๋ ๊ทธ
|
|
38
|
+
ํ์ฌ **์ ํธ๊ฐ**(boolean) ํ๋๋ฅผ ์ด๋ฏธ ์ปดํฌ๋ํธ ์
๋ ฅ์ผ๋ก ๋ฐ๊ณ ์์๋ค. ์ด ๋ชจ๋์ ๊ทธ
|
|
39
|
+
boolean ์ ํธ๊ฐ์ ๋จ์ผ ์ถ์ฒ๋ฅผ ๊ณ์ฝํ ๋ฟ, ๊ฐ ์ปดํฌ๋ํธ์ ์ ๋ต(motionPreset)์ ๋์ฒดํ์ง
|
|
40
|
+
์๋๋ค โ ๋์ ๊ณ์ ๋ถ๋ฆฌ๋ ์ฑ๋ก ๋๋ค.
|
|
41
|
+
|
|
42
|
+
## ์ผ๋ฐํํ ๊ณ์ฝ
|
|
43
|
+
|
|
44
|
+
- `DesignSystemEnvironmentInput`์ ๋ค ํ๋ ๋ชจ๋ **์ ํ**์ด๋ค โ ๋ ๋๋ฌ๊ฐ ์์ง ์ผ๋ถ
|
|
45
|
+
์ ํธ๋ง ์๊ณ ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค(RN์ `AccessibilityInfo.isReduceMotionEnabled()`๋
|
|
46
|
+
๋น๋๊ธฐ๋ผ ์ฒซ ๋ ๋์๋ ๊ฐ์ด ์์ ์ ์๋ค).
|
|
47
|
+
- `resolveDesignSystemEnvironment(input, options)`์ ์ฐ์ ์์๋ ์ถ๋ง๋ค
|
|
48
|
+
**๋ช
์ input โ ํด์๋ parent โ renderer์ system signal โ HJM default**๋ค. ๊ธฐ์กด ํธ์ถ์
|
|
49
|
+
ํ์ `systemTheme`์ ๊ทธ๋๋ก์ด๋ฉฐ `systemDirection`, `systemTextScale`,
|
|
50
|
+
`systemReducedMotion`, `parent`๋ง ์ ํ์ ์ผ๋ก ์ถ๊ฐ๋๋ค. `theme: "system"`์ ๋ช
์ํ๋ฉด
|
|
51
|
+
parent๋ณด๋ค ํ์ฌ `systemTheme`์ ์ฐ์ ํ๋ค.
|
|
52
|
+
- `resolveDesignSystemProviderValue()`๋ ์ด ํ๊ฒฝ๊ณผ `THEMES`, `ACCENTS`, `accentFill`์ ๋ฌถ์ด
|
|
53
|
+
`{ environment, palette }`๋ฅผ ๋ฐํํ๋ค. renderer๋ `palette`๋ฅผ
|
|
54
|
+
`resolveColorReference()`์ ๊ทธ๋๋ก ์ ๋ฌํ๋ค.
|
|
55
|
+
- `validateDesignSystemProviderValue()`๋ renderer์ ์ง์ ์ฃผ์
๋๋ ์์ ํ ์ ํ palette๋
|
|
56
|
+
๊ฐ์ ๋ฐํ์ ๊ฒฝ๊ณ์์ ๊ฒ์ฌํ๋ค. ๋ชจ๋ semantic theme/accent role๊ณผ alpha ํฉ์ฑ ๊ฐ๋ฅํ
|
|
57
|
+
6์๋ฆฌ hex ๊ฐ์ด ํ์ํ๋ฉฐ, ์ผ๋ถ token๋ง ๋ฎ๋ partial override๋ ํ์ฉํ์ง ์๋๋ค. ์ ํ
|
|
58
|
+
palette์ ๋๋น fixture์ ์น์ธ ์ฑ
์์ ๊ทธ ์์ ํ palette๋ฅผ ์ ๊ณตํ๋ ์ ํ adapter๊ฐ ๊ฐ์ง๋ค.
|
|
59
|
+
- `validateDesignSystemEnvironmentInput()`์ ์ ํํ input์ ๊ฒ์ฌํ๊ณ ,
|
|
60
|
+
`validateResolvedDesignSystemEnvironment()`๋ parent ์ ์ฉ invariant๋ฅผ ๊ฒ์ฌํ๋ค. ํ์๋
|
|
61
|
+
`theme: "system"`, ๋๋ฝ๋ ์ถ, ์๋ชป๋ direction, 0 ์ดํ/non-finite textScale, boolean์ด
|
|
62
|
+
์๋ reducedMotion์ ๋ชจ๋ ๊ฑฐ๋ถํ๋ค. ์ด๋ฏธ resolved๋ผ๋ ํ์
์ด๋ฆ์ ๋ฐํ์์์๋ ์งํจ๋ค.
|
|
63
|
+
- **OS ์กฐํ ์์ฒด๋ ํ์ง ์๋๋ค.** `Appearance`, `AccessibilityInfo`, `I18nManager`,
|
|
64
|
+
`PixelRatio`, `matchMedia`๋ renderer ๋ชซ์ด๊ณ ์ฝ์ด๋ ๊ณ์ React/RN/DOM ์์กด์ฑ์ด ์๋ค.
|
|
65
|
+
|
|
66
|
+
## HJM ๊ธฐ๋ณธ๊ฐ
|
|
67
|
+
|
|
68
|
+
`designSystemEnvironmentDefaults`: `theme: "system"`, `direction: "ltr"`,
|
|
69
|
+
`textScale: 1`, `reducedMotion: false` โ ๊ธฐ์กด ํธ์ถ์ fallback๊ณผ ํธํ๋๋ ๊ฐ์ด๋ค. ์ค์
|
|
70
|
+
renderer๋ ์ด fallback์ OS ๊ฐ์ง ๊ฒฐ๊ณผ๋ก ์คํดํ๋ฉด ์ ๋๊ณ , root์์ ๋ฐ๋์
|
|
71
|
+
`systemReducedMotion`์ ๊ณต๊ธํด์ผ ํ๋ค. RN์ ๋น๋๊ธฐ ์ ํธ๋ฅผ ์์ง ๋ชจ๋ฅด๋ ์ฒซ ํ๋ ์์๋ adapter๊ฐ
|
|
72
|
+
์ ๋๋ฉ์ด์
์ ์์ํ์ง ์๋ ์ ์ฑ
์ ๋ณ๋๋ก ์ ์ฉํ๋ค.
|
|
73
|
+
|
|
74
|
+
## ํ๋ซํผ ๋ฒ์ญ
|
|
75
|
+
|
|
76
|
+
์ด ๋ชจ๋ ์์ฒด๋ ํ๋ซํผ์ ๋ถ๊ธฐํ์ง ์๋๋ค โ ๊ฐ์ Provider value๋ฅผ Web๊ณผ Native๊ฐ
|
|
77
|
+
๊ตฌ๋
ํ๋ค. ๋ค๋ฅธ ๊ฒ์ **system signal์ ์ด๋ป๊ฒ ์ป๊ณ , ๊ฐ์ ์ด๋ป๊ฒ ์ ํํ๊ณ , palette๋ฅผ
|
|
78
|
+
์ด๋ค style API๋ก ๋ฒ์ญํ๋๊ฐ**๋ฟ์ด๋ค:
|
|
79
|
+
|
|
80
|
+
- Web: `matchMedia`(์ ๊ตฌ์ฑํยทprefers-reduced-motion), CSS `dir` ์์ฑ(direction),
|
|
81
|
+
`document.documentElement`์ root font-size ๋ฐฐ์จ. ์ ํ๋ React Context.
|
|
82
|
+
- Native: `Appearance`/`useColorScheme()`, `AccessibilityInfo`, `PixelRatio.getFontScale()`
|
|
83
|
+
๋๋ `useWindowDimensions().fontScale`, `I18nManager.isRTL`. ์ ํ๋ RN Context ๋๋
|
|
84
|
+
๋๋ฑํ ์ํ ์ ์ฅ์.
|
|
85
|
+
|
|
86
|
+
catalog์ `platform: "shared"`๊ฐ ๋ง๋ค. ์ค๋ฒ๋ ์ด(Web popup vs Native Sheet)์ฒ๋ผ ํ๋ฉด์
|
|
87
|
+
๋ฐ๊พธ๋ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ, ๊ฐ์ ๊ฐ ํ์
์ ๋ ํ๋ซํผ์ด ๊ฐ์์ OS API๋ก ์ฑ์ ๋ฃ๊ธฐ ๋๋ฌธ์ด๋ค.
|
|
88
|
+
|
|
89
|
+
์ค์ฒฉ Provider๋ `parent.environment`๋ฅผ options์ ๋๊ธด๋ค. ์ผ๋ถ ์ถ๋ง ๋ช
์ํ๋ฉด ๋๋จธ์ง๋
|
|
90
|
+
parent์์ ์์ํ๊ณ , root Provider๋ system signal๋ก ์ฑ์ด๋ค. ์ด ๊ท์น ๋๋ถ์ ๊ฐ React/RN
|
|
91
|
+
adapter๊ฐ ์์ฒด ๋ณํฉ ๋ก์ง์ ๋ค์ ๋ง๋ค ํ์๊ฐ ์๋ค. `parent`์๋ ๋ฐ๋์
|
|
92
|
+
`resolveDesignSystemEnvironment()` ๋๋ `resolveDesignSystemProviderValue().environment`์
|
|
93
|
+
๊ฒฐ๊ณผ๋ฅผ ๋๊ธด๋ค. `theme: "system"`์ธ input ๊ฐ์ฒด๋ฅผ ํ์
๋จ์ธ์ผ๋ก parent์ ๋ฃ์ด๋ resolver๊ฐ
|
|
94
|
+
๋ค์ ํด์ํ์ง ์๊ณ ์ฆ์ ์คํจํ๋ค.
|
|
95
|
+
|
|
96
|
+
## ๊ณต๊ฐํ ์ถ / ๋ฐฐ์ ํ ์ถ
|
|
97
|
+
|
|
98
|
+
| ์ถ | ์ํ |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| `theme`(system/light/dark) | ๊ณต๊ฐ โ `colors.ts` ์ฌ์ฌ์ฉ |
|
|
101
|
+
| `direction`(ltr/rtl) | ๊ณต๊ฐ โ ์๋ก ์ ์ํ |
|
|
102
|
+
| `textScale`(์ฐ์๊ฐ) | ๊ณต๊ฐ |
|
|
103
|
+
| `reducedMotion`(boolean ์ ํธ) | ๊ณต๊ฐ |
|
|
104
|
+
| `locale`(์ธ์ด ์ฝ๋) | **๋ฐฐ์ ** โ RTL ์ฌ๋ถ๋ `direction`์ผ๋ก ์ด๋ฏธ ํํ๋๊ณ , ์ซ์ยท๋ ์งยท๋ณต์ํ
|
|
105
|
+
ํฌ๋งท์ "์ ํ์ด ํฌ๋งทํ ๋ฌธ์์ด์ ๋ฐ๋๋ค" ์์น์ ์ด ํจํค์ง๊ฐ ๋ชฐ๋ผ๋ ๋๋ค. locale ์์ฒด๊ฐ
|
|
106
|
+
ํ์ํ ์ ํ์ ๊ทธ ๊ฐ์ ์ง์ ๋ค๊ณ ์๋ค๊ฐ ํ์ํ ๊ณณ(์: `Intl.DateTimeFormat`)์ ์ด๋ค. |
|
|
107
|
+
| React/RN Context, `<Provider>` ์ปดํฌ๋ํธ, `useDesignSystem()` ํ
| **๋ฐฐ์ ** โ ์ด ํจํค์ง๋
|
|
108
|
+
๋ฐํ์ ์์กด์ฑ์ ๊ฐ์ง ์๋๋ค. ๊ฐ ์ ํ์ renderer๊ฐ ์ด ๊ฐ ํ์
์ ์์ ์ Context์ ๋ด์
|
|
109
|
+
์ ํํ๋ค. |
|
|
110
|
+
| `size`(antd ConfigProvider์ ์ปดํฌ๋ํธ ์ ์ญ ์ฌ์ด์ฆ ํ๋ฆฌ์
) | **๋ฐฐ์ ** โ ์ธก์ ๋ ์๊ตฌ๊ฐ
|
|
111
|
+
์๊ณ , ์๋ค ํด๋ ๊ทธ๊ฑด ๊ฐ recipe์ `sizes`(์: `selectRecipe.sizes`)๊ฐ ์ด๋ฏธ ์ปดํฌ๋ํธ๋ณ๋ก
|
|
112
|
+
๊ฐ๊ณ ์๋ ์ถ์ด๋ผ ์ ์ญ ์ค๋ฒ๋ผ์ด๋๋ฅผ ์น์ผ๋ฉด ๋ ๊ณณ์ด ๊ฐ์ ์ถ์ ๋ค์ ์์ ํ๊ฒ ๋๋ค. |
|
|
113
|
+
| ์์ theme/component token override | **partial override๋ ๋ฐฐ์ ** โ HJM light/dark๋ ๋๋น
|
|
114
|
+
ํ
์คํธ๋ฅผ ํจ๊ป ํต๊ณผํ๋ ๊ณ ์ ๊ณ์ฝ์ด๋ค. ๋ณ๋ ๋ธ๋๋ ์ ํ์ ๋ชจ๋ semantic role์ ๊ฐ์ง
|
|
115
|
+
์์ ํ `DesignSystemProviderValue`๋ง renderer์ `value` ๊ฒฝ๊ณ๋ก ์ฃผ์
ํ๋ฉฐ, ๋ฐํ์ shape ๊ฒ์ฌ์
|
|
116
|
+
์ ํ๋ณ ์ ์ฒด ๋๋น fixture๋ฅผ ํจ๊ป ๋๋ค. |
|
|
117
|
+
|
|
118
|
+
## ์ ํ adapter ์ฆ๊ฑฐ
|
|
119
|
+
|
|
120
|
+
Showcase fixture๋ง์ผ๋ก ์ฑ์๋๋ฅผ ์ฌ๋ฆฌ์ง ์๋๋ค. ํ์ฌ๋ ๋ค์ ์ค์ ์ ํ ๊ฒฝ๊ณ๊ฐ
|
|
121
|
+
`resolveDesignSystemProviderValue()`์ `environment + palette`๋ฅผ Context์ ์ ์ฅํ๊ณ renderer์
|
|
122
|
+
๋ด๋ ค์ค๋ค.
|
|
123
|
+
|
|
124
|
+
| ์ ํ ํ๋ฉด | ์ค์ adapter ์ฆ๊ฑฐ | ๊ฒ์ฆ ๊ฒฝ๊ณ |
|
|
125
|
+
| --- | --- | --- |
|
|
126
|
+
| BurnTok Web | `../BurnTok/apps/web/src/components/ThemeProvider.tsx` | `matchMedia`, root `dir`, ์ ์ฅ๋ theme preference๋ฅผ resolver์ ๋ฃ๊ณ Context๊ฐ `providerValue`, `environment`, `palette`๋ฅผ ๊ณต๊ฐํ๋ค. OS ์ถ์ system option์ผ๋ก ์ ๋ฌํ๋ฏ๋ก nested `parentEnvironment`๊ฐ omitted axis๋ณด๋ค ๋จผ์ ์ ์ฉ๋๋ค. `palette.theme.bg`๋ ๋ธ๋ผ์ฐ์ theme color์ ์ค์ ์ ์ฉ๋๋ค. `ThemeProvider.test.tsx`๊ฐ ์ด ๊ฒฝ๊ณ๋ฅผ ๊ฒ์ฆํ๋ค. |
|
|
127
|
+
| BurnTok RN | `../BurnTok/apps/mobile/src/components/ThemeProvider.tsx` | `useColorScheme`, `I18nManager`, `useWindowDimensions().fontScale`, `AccessibilityInfo`์ ์ ํธ๋ฅผ system option์ผ๋ก ํด์ํ๊ณ `parentEnvironment` ์์ ๋ฐ ๋ช
์ fixture๋ฅผ ์ง์ํ๋ฉฐ `palette.theme`์ Native style renderer์ `colors`๋ก ์ ๊ณตํ๋ค. |
|
|
128
|
+
| Yajalal RN | `../yajalal/modules/app-rn/src/lib/theme/provider-adapter.ts`, `ThemeProvider.tsx` | HJM resolver๋ก ํ๊ฒฝ ์ฐ์ ์์์ `parentEnvironment`์ omitted axis ์์์ ํด์ํ๊ณ `validateResolvedDesignSystemEnvironment()`๋ก ๊ฒ์ฆํ ๋ค, ๊ธฐ์กด ์ ํ ํ๋ ํธ๋ง ๊ฒํ ๋ adapter๋ก ๋ฐ๊พผ๋ค. `ThemeProvider.test.ts`๊ฐ ํด์๋ ํ๊ฒฝ๊ณผ ํ๋ ํธ๋ฅผ ๊ฒ์ฆํ๋ค. |
|
|
129
|
+
|
|
130
|
+
Showcase์ `DesignSystemProvider` Web reference๋ ์ด ์ฆ๊ฑฐ๋ฅผ ๋์ ํ๋ ๊ฐ์ UI๊ฐ ์๋๋ค.
|
|
131
|
+
๋์ผํ provider value์ theme, direction, textScale, reducedMotion๊ณผ ํด์๋ palette๋ฅผ
|
|
132
|
+
์ง์ ํ์ํ๋ ๋น์๊ฐ adapter presentation์ด๋ค.
|
|
133
|
+
|
|
134
|
+
## ํ์ฌ ์ฑ์๋
|
|
135
|
+
|
|
136
|
+
catalog ์ํ๋ `beta`๋ค. Web๊ณผ RN, ๋ ์ ํ์์ ๊ฐ ํด์ยทContext ์ ํยทpalette ์๋น,
|
|
137
|
+
์ค์ฒฉ Provider์ omitted axis ์์ ๊ฒฝ๊ณ๊น์ง ํ์ธ๋๋ค. ๋ค๋ง ์ด ์์ adapter๊ฐ ํฌํจ๋
|
|
138
|
+
์ถ๊ฐ ์ ํ ๋ฆด๋ฆฌ์ค ์ฆ๊ฑฐ๋ ์์ง ์์ผ๋ฏ๋ก roadmap์ ๋ค์ ์น๊ฒฉ ์กฐ๊ฑด์
|
|
139
|
+
`evidence-needed`๋ก ๊ธฐ๋กํ๊ณ `stable`์ ๊ณผ์ฅํ์ง ์๋๋ค.
|
package/docs/dropdown.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Dropdown โ ๋ณ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค
|
|
2
|
+
|
|
3
|
+
## ํ์
|
|
4
|
+
|
|
5
|
+
Ant Design์์ `Dropdown`์ "ํธ๋ฆฌ๊ฑฐ์ ๋ถ๋ ์ค๋ฒ๋ ์ด"์ด๊ณ ๊ทธ ์์ ํญ๋ชฉ ๋ชฉ๋ก์ ๋ณ๋
|
|
6
|
+
์ปดํฌ๋ํธ `Menu`๊ฐ ์ฑ์ด๋ค. ๋ ์ปดํฌ๋ํธ๊ฐ ๋๋ ์ด์ ๋ Ant Design์ Dropdown์ด ์์
|
|
7
|
+
์ฝํ
์ธ (`dropdownRender`)๋ ๋ด์ ์ ์๋ ๋ฒ์ฉ ์ค๋ฒ๋ ์ด ์
ธ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
|
|
8
|
+
|
|
9
|
+
HJM์๋ ์ด ๋ถ๋ฆฌ๊ฐ ์๋ค. `menuRecipe`(`src/component-recipes.ts:628`)์ anatomy๋ ์ด๋ฏธ
|
|
10
|
+
`trigger, content, viewport, section, sectionLabel, item, ...`์ด๊ณ , `behaviorRegistry.menu`
|
|
11
|
+
(`src/behaviors.ts:815`)๋ `open`/`defaultOpen`/`onOpenChange`/`selection`/`asyncState`๋ฅผ
|
|
12
|
+
์ง์ controlled ์ถ์ผ๋ก ๊ฐ์ง๋ค. ์ฆ HJM์ `Menu`๋ ์ด๋ฏธ **ํธ๋ฆฌ๊ฑฐ + ๋ ์๋ ํ๋ฉด + ํญ๋ชฉ
|
|
13
|
+
๋ชฉ๋ก**์ ํ ์ปดํฌ๋ํธ๊ฐ ๋๊น์ง ์์ ํ๋ค. `expansion-roadmap.md`๋ Menu๋ฅผ "Web anchored
|
|
14
|
+
surface์ RN Sheet๊ฐ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ adaptive ์ฌ๋ผ์ด์ค"๋ก ์ด๋ฏธ beta ๊ฒ์ฆํ๋ค๊ณ
|
|
15
|
+
๊ธฐ๋กํ๋ค.
|
|
16
|
+
|
|
17
|
+
๊ทธ๋์ Ant Design ๊ธฐ์ค "Dropdown"์ด ์ค์ ๋ก ํ๋ ๋ฌธ์ โ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋๋ฅด๋ฉด ๋จ๋ action
|
|
18
|
+
๋ชฉ๋ก โ ๋ HJM์์ ์ด๋ฏธ `Menu` ํ๋๋ก ์๊ฒฐ๋ ๋ฌธ์ ๋ค. ์ฌ๊ธฐ์ ์ด๋ฆ๋ง ๋ค๋ฅธ `Dropdown`์
|
|
19
|
+
์๋ก ๋ง๋ค๋ฉด:
|
|
20
|
+
|
|
21
|
+
- `menuRecipe`์ ๊ฑฐ์ ๊ฐ์ `trigger`/`content`/`viewport` anatomy๋ฅผ ๋ค์ ์ ์ธํ๊ฒ ๋๊ณ ,
|
|
22
|
+
- `behaviorRegistry.menu`์ ๊ฑฐ์ ๊ฐ์ `open`/`dismiss`/`selection` ์ถ์ ๋ค์ ๊ณ์ฝํ๊ฒ
|
|
23
|
+
๋์ด, ๋ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ ์ํ๋ฅผ ์๋ก ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์์ ํ๋ ์ ํํ ๊ทธ ์ค์(Tag๊ฐ
|
|
24
|
+
`docs/tag.md`์์ Chip์ `selected`์ ๋ณ๋ `closable` ์ถ์ ๋ง๋ค์ง ์๊ธฐ๋ก ํ ๊ฒ๊ณผ ๊ฐ์
|
|
25
|
+
์ข
๋ฅ์ ์ค์)๋ฅผ ๋ฐ๋ณตํ๋ค.
|
|
26
|
+
|
|
27
|
+
## ์์ ์ฝํ
์ธ ์ค๋ฒ๋ ์ด๋ ์ด๋ฏธ ๋ค๋ฅธ ๊ณณ์ ์๋ค
|
|
28
|
+
|
|
29
|
+
**์
์ค 2๋ฒ ์ ํ์ง ๊ฒํ .** "Menu๋ ํญ๋ชฉ collection๋ง ๋ค๋ฃจ๊ณ Dropdown์ ์์ ์ฝํ
์ธ ๋ฅผ
|
|
30
|
+
๋ด๋ ํ๋ฉด"์ด๋ผ๋ ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง ๊ฒํ ํ๋ค. ๊ทธ๋ฐ๋ฐ "ํธ๋ฆฌ๊ฑฐ์ ๋ถ์ด ์์ ์ฝํ
์ธ ๋ฅผ ๋ณด์ฌ
|
|
31
|
+
์ฃผ๋ Web ์ค๋ฒ๋ ์ด"๋ ์ด๋ฏธ catalog์ `Popover`(`category: overlay`, `platform: web`,
|
|
32
|
+
`status: planned`)๋ก ์๋ฆฌ๋ฅผ ์์ฝํด ๋์๋ค. Ant Design์ crosswalk๋ `Popover`๋ฅผ
|
|
33
|
+
`category: "data-display"`, `relationship: "direct"`๋ก ์ด๋ฏธ ๋ณ๋ target์ ์ฐ๊ฒฐํด ๋์๋ค
|
|
34
|
+
(`src/component-references.ts:102`). ์ฆ "์์ ์ฝํ
์ธ ๋ด๋ ํธ๋ฆฌ๊ฑฐ ์ค๋ฒ๋ ์ด"๋ผ๋ ๋ฌธ์ ๋
|
|
35
|
+
HJM ์์์ ์ด๋ฏธ `Popover`์ ์ด๋ฆํ๋ฅผ ๋ฌ๊ณ ๋๊ธฐ ์ค์ด๋ค.
|
|
36
|
+
|
|
37
|
+
์ฌ๊ธฐ์ `Dropdown`์ "์์ ์ฝํ
์ธ "์ฉ์ผ๋ก ๋ค์ ์ ์ํ๋ฉด `Popover`์ ์์ ํ ๊ฐ์ ๋ฌธ์ ๋ฅผ
|
|
38
|
+
๋ ์ด๋ฆ์ผ๋ก ๊ณ์ฝํ๊ฒ ๋๋ค. ๋ธ๋ฆฌํ๊ฐ ๋ช
์ํ ๋๋ก Popover์ Dropdown์ ๋์์ ๋ง๋ค์ง
|
|
39
|
+
์๊ธฐ๋ก ํ๊ณ , ๋ planned ํญ๋ชฉ ์ค ์ค์ ์ ํ์์ ๋จผ์ ์๊ตฌ๊ฐ ๋์ค๋ ์ชฝ๋ง ๊ณ์ฝํ๋ค. ์ง๊ธ์
|
|
40
|
+
์ด๋ ์ชฝ๋ vertical slice ๊ทผ๊ฑฐ๊ฐ ์์ผ๋ฏ๋ก **์๋ฌด๊ฒ๋ ๋ง๋ค์ง ์๋๋ค.**
|
|
41
|
+
|
|
42
|
+
## ๊ฒฐ๋ก
|
|
43
|
+
|
|
44
|
+
1. Menu๊ฐ ์ด๋ฏธ ํธ๋ฆฌ๊ฑฐ+ํ๋ฉด+ํญ๋ชฉ ๋ชฉ๋ก์ ๋ฌธ์ ๋ฅผ ์๊ฒฐํ๋ค โ antd Dropdown์ ์๋์ ๋ค์
|
|
45
|
+
์ฌ์ฉ๋ฒ("Dropdown + Menu" ์กฐํฉ)์ด ์ ํํ ์ด ๋ฌธ์ ๋ค.
|
|
46
|
+
2. Dropdown์ด ํญ๋ชฉ ๋ชฉ๋ก์ด ์๋ ์์ ์ฝํ
์ธ ๋ฅผ ์ํ ๊ฒ์ด๋ผ๋ ๋์์ ์ด๋ฏธ `Popover`๊ฐ
|
|
47
|
+
์ ์ ํ ๋ฌธ์ ์ ๊ตฌ๋ถ๋์ง ์๋๋ค.
|
|
48
|
+
3. ์ธก์ ๋ ์ ํ ์์ ์์ด ๊ฒน์น๋ ๋ ํ๋ฉด์ ๋ง๋ค์ง ์๋ ๊ฒ์ด ์ด ์ ์ฅ์์ ์์น์ด๋ค
|
|
49
|
+
(`docs/authoring-brief.md`: "์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ์ ๋ง๋๋ ์ด์ ๋ฅผ ๋จ๊ธฐ๋
|
|
50
|
+
๊ฒ์ด ์ด ์ ์ฅ์์ ๋ ๊ฐ์ง๋ค").
|
|
51
|
+
|
|
52
|
+
`src/dropdown.ts`, `test/dropdown.test.ts`๋ ๋ง๋ค์ง ์๋๋ค. `antDesignReferenceComponents`์
|
|
53
|
+
`Dropdown โ Dropdown` crosswalk(`relationship: "direct"`)๋ ๋ฐ๊ฟ ํ์๊ฐ ์๋ค โ target
|
|
54
|
+
`ComponentId`๋ ์ ์งํ๋, catalog์ ์ค์ ๊ตฌํ ๊ฒฐ์ ๋ง ์๋๋ก ์ฎ๊ธด๋ค.
|
|
55
|
+
|
|
56
|
+
## ๋ฐฐ์ ๋ช
์ธ ์ ์ (๋ฆฌ๋ ์ ์ฉ)
|
|
57
|
+
|
|
58
|
+
๋ ๊ฐ์ง ์ค ํ๋๋ฅผ ๋ฆฌ๋๊ฐ ๊ณ ๋ฅธ๋ค. ์ด ์ ์์์ ๊ถ๊ณ ๋ (a)๋ค.
|
|
59
|
+
|
|
60
|
+
**(a) ๊ถ๊ณ : Menu์ alias๋ก ํก์.**
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
{ name: "Menu", category: "navigation", platform: "adaptive", status: "beta",
|
|
64
|
+
recipe: "menuRecipe", behavior: "menu", aliases: ["Dropdown"] }
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
๊ธฐ์กด `{ name: "Dropdown", ... status: "planned" }` catalog row๋ ์ ๊ฑฐํ๋ค. Ant Design
|
|
68
|
+
crosswalk์ `Dropdown` source entry๋ ๊ทธ๋๋ก ๋๋(๊ฐ์ `Menu` target์ ์ด๋ฏธ ๊ฐ๋ฆฌํค๊ณ
|
|
69
|
+
์์ด ๋ณ๊ฒฝ์ด ํ์ ์๋ค), Component Explorer์ "Dropdown" ๊ฒ์์ `aliases`๋ฅผ ํตํด Menu๋ก
|
|
70
|
+
์๋ด๋๋ค.
|
|
71
|
+
|
|
72
|
+
**(b) ๋์: planned ์ ์ง + ์ด์ ๋ง ๊ธฐ๋ก.** catalog row๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ด ๋ฌธ์๋ง ๋งํฌํ๋ค.
|
|
73
|
+
alias ํก์๊ฐ Component Explorer ํ์ ๋ฐฉ์๊ณผ ์ถฉ๋ํ๊ฑฐ๋ ์ถํ Menu๊ฐ collection ์ ์ฉ์ผ๋ก
|
|
74
|
+
์ข์์ง ๊ณํ์ด ์๋ค๋ฉด ์ด ๋์์ ์ด๋ค.
|
|
75
|
+
|
|
76
|
+
์ด ์ ์์ ํ๋จ์ผ๋ก๋ (a)๊ฐ ๋ง๋ค โ `aliases`๋ ์ด๋ฏธ `FloatingActionButton: aliases:
|
|
77
|
+
["FloatButton", "FAB"]`์ฒ๋ผ "๋ค๋ฅธ ์ํ๊ณ ์ด๋ฆ์ผ๋ก ์ฐพ์์๋ ๊ฐ์ HJM ์ปดํฌ๋ํธ๋ก
|
|
78
|
+
์๋ดํ๋ค"๋ ์ ํํ ์ด ์ฉ๋๋ก ์ฐ์ด๊ณ ์๋ค.
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# HJM Design System Expansion Roadmap
|
|
2
|
+
|
|
3
|
+
## ๋ฌด์์ ํก์ํ๋๊ฐ
|
|
4
|
+
|
|
5
|
+
HJM์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธํ์ด๋ public prop ์ด๋ฆ์ ๋ณต์ฌํ์ง ์์ต๋๋ค. ๊ฐ ์์คํ
์์
|
|
6
|
+
์ ๊ฒ์ฆ๋ ๋ฌธ์ ๋ถํด ๋ฐฉ์๋ง ๊ฐ์ ธ์ HJM์ ๋ฌธ์ฅ์ธ **โ์กฐ์ฉํ ํ๋ฉด ์์ ์ค์ํ ์๊ฐ๋ง
|
|
7
|
+
์ ๋ช
ํ๊ฒโ**์ ๋ง๊ฒ ๋ค์ ์ค๊ณํฉ๋๋ค.
|
|
8
|
+
|
|
9
|
+
| ์ฐธ๊ณ ์์คํ
| ํก์ํ ๊ฒ | ๊ทธ๋๋ก ๊ฐ์ ธ์ค์ง ์์ ๊ฒ |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| Ant Design | ๋์ ์ปดํฌ๋ํธ ๋ฒ์, Form/Field ์ญํ ๋ถ๋ฆฌ, async ์ํ | ์๊ฐ ์คํ์ผ, variant ์ด๋ฆ, runtime dependency |
|
|
12
|
+
| Radix Primitives | compound anatomy, focusยทdismissยทkeyboard acceptance table | DOM primitive๋ฅผ RN๊น์ง ๊ฐ์ ํ๋ ๊ตฌ์กฐ |
|
|
13
|
+
| React Aria | stable key ๊ธฐ๋ฐ collection, selection mode, ๊ตญ์ ํยทํค๋ณด๋ ๋ชจ๋ธ | React hook๊ณผ DOM ๊ตฌํ |
|
|
14
|
+
| Material | ์ํ ์ถ ์กฐํฉ, adaptive layout, non-text contrast | Material shapeยทmotionยทcomponent appearance |
|
|
15
|
+
| TDS | ๋ชจ๋ฐ์ผ ์ ๋ณด ์๊ณ, ์์ ํต์ฌ ์ธํธ, ListRow ์ค์ฌ ์กฐํฉ | ์ ์ฉ ์์ฐยทํฐํธยท์ปดํฌ๋ํธยท์ด๋ฆ์ ๋ณต์ |
|
|
16
|
+
| Polaris | component lifecycle, page/pattern catalog | Shopify ๋๋ฉ์ธ ์ดํ |
|
|
17
|
+
| Tamagui | typed variant, Web popup/Native sheet์ adaptive intent | ์คํ์ผ ์์ง๊ณผ package dependency |
|
|
18
|
+
|
|
19
|
+
๊ณต์ ์ฐธ๊ณ ๋งํฌ๋ `docs/identity.md`์ ์ฐธ๊ณ ์์น์ ๊ณ ์ ํฉ๋๋ค. ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ ๋๋
|
|
20
|
+
`๋ฌธ์ โ ์ผ๋ฐํํ ๊ณ์ฝ โ HJM ๊ธฐ๋ณธ๊ฐ โ ํ๋ซํผ ๋ฒ์ญ โ ๊ฒ์ฆ ํ๋ฉด`์ ๊ธฐ๋กํด์ผ ํฉ๋๋ค.
|
|
21
|
+
|
|
22
|
+
### ใ๊ฒ์ฆ ํ๋ฉดใ์ ํ๋ณด๋ฅผ ์ ์ ๋
|
|
23
|
+
|
|
24
|
+
**๊ตฌ์ฒด์ ์ธ ํ๋ฉดยท์ปดํฌ๋ํธ ์ด๋ฆ์ ์ค์ ์ฝ๋์์ ํ์ธํ ๋ค์๋ง ์ ์ต๋๋ค.** ํ์ธํ์ง ์์์ผ๋ฉด
|
|
25
|
+
`์์ง ์์`์ด ์ ํํ ๊ฐ์ด๊ณ , ๊ทธ๊ฒ๋ง ์ ๋ ๊ฒ์ด ์ ์งํ ๋ฌธ์์
๋๋ค.
|
|
26
|
+
|
|
27
|
+
์ด ๊ท์น์ด ํ์ํ ์ด์ ๋ **๊ฒ์ดํธ๊ฐ ์ฌ๊ธฐ๋ฅผ ๋ชป ๋ณด๊ธฐ ๋๋ฌธ**์
๋๋ค. `pnpm typecheck && pnpm test`๋
|
|
28
|
+
์ด ์ ์ฅ์ ์๋ง ๊ฒ์ฌํฉ๋๋ค. ๊ทธ๋์ "๋ง๋ค์ง ์๋๋ค" ํ์ ์ ๊ทผ๊ฑฐ๊ฐ ์ ์ฅ์ ์(๋ค๋ฅธ ๋ชจ๋์ ๊ณ์ฝ)์
|
|
29
|
+
์์ด ์ด๊ธ๋๋ฉด ํ
์คํธ๊ฐ ์ก์ง๋ง, ใ๊ฒ์ฆ ํ๋ฉดใ์ ๊ทผ๊ฑฐ๊ฐ **์ ์ฅ์ ๋ฐ**(์ ํ ์ฝ๋)์ ์์ด ๊ฐ์
|
|
30
|
+
์ค์๋ผ๋ ๊ฑธ๋ฆฌ๋ ๊ทธ๋ฌผ์ด ์์ต๋๋ค. ์ค์ ๋ก ๋ค ๋ฌธ์๊ฐ ์กด์ฌํ์ง ์๋ ํ๋ฉด์ ํ๋ณด๋ก ์ ์ด ๋์๊ณ ,
|
|
31
|
+
์น๊ฒฉ์ ์ค์ธกํ๊ธฐ ์ ๊น์ง ์๋ฌด๋ ๋ชฐ๋์ต๋๋ค(`docs/consistency-audit.md` 3์ฐจ).
|
|
32
|
+
|
|
33
|
+
๊ทธ๋์ ํ๋ณด๋ฅผ ์ ์ ๋๋ **`ํ์ผ:์ค` ํํ๋ก ์ธ์ฉํฉ๋๋ค.** ์ธ์ฉ์ด ๊ทธ ์์ฒด๋ก ์ฆ๋ช
์ ์๋์ง๋ง,
|
|
34
|
+
์ ๋ ์ฌ๋์ด ํ์ผ์ ์ด๊ฒ ํ๊ณ ์ฝ๋ ์ฌ๋์ด ๋ฐ์ฆํ ์ ์๊ฒ ํฉ๋๋ค. ์ธ์ฉํ ์ ์์ผ๋ฉด ๊ทธ๊ฒ์
|
|
35
|
+
ํ๋ณด๊ฐ ์๋๋ผ ์ง์์ด๊ณ , ์ง์์ ์ ์ง ์์ต๋๋ค.
|
|
36
|
+
|
|
37
|
+
Ant Design์ ํ์ฌ ์ ์ฒด ๋ฒ์๋ [`ant-design-coverage.md`](./ant-design-coverage.md)์
|
|
38
|
+
`antDesignReferenceComponents`์ 6.6.1 core 73๊ฐ๋ก ๊ณ ์ ํฉ๋๋ค. 73/73์ scope tracking์ด๋ฉฐ
|
|
39
|
+
renderer ์๋ฃ๋ฅผ ๋ปํ์ง ์์ต๋๋ค. ํ๊ณผ Showcase๋ Web reference, contract-only, Native-only
|
|
40
|
+
์ฆ๊ฑฐ๋ฅผ ํ์ํ๊ณ , reference crosswalk์ fully mature, partial maturity, planned-only ์์น์
|
|
41
|
+
๋ถ๋ฆฌํฉ๋๋ค.
|
|
42
|
+
|
|
43
|
+
## ํ์ฅ ๊ตฌ์กฐ
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
Foundations โโโโโโโโโโโโโโโโ
|
|
47
|
+
Semantic color references โโ Component fragments โ Visual recipes โโ
|
|
48
|
+
โ โโ Web renderer
|
|
49
|
+
Behavior contracts โโโโโโโโโค โโ RN renderer
|
|
50
|
+
Collection contracts โโโโโโโ โโ Product adapter
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
- `component-contracts.ts`: focus, field frame, floating surface, collection item์ฒ๋ผ ์ฌ๋ฌ
|
|
54
|
+
recipe๊ฐ ๊ณต์ ํ๋ ๋ด๋ถ ๋ฌธ๋ฒ
|
|
55
|
+
- `component-recipes.ts`: anatomy, size, tone, visual state
|
|
56
|
+
- `behaviors.ts`: controlled state ์ด๋ฆ, ์ ํจํ state axis, Web keyboard/focus, RN
|
|
57
|
+
accessibilityState, ๊ณตํต acceptance scenario
|
|
58
|
+
- `catalog.ts`: ๊ตฌํ ๋ฒ์, ํ๋ซํผ ๋ถ๋ฅ, maturity์ recipe/behavior ์ฐ๊ฒฐ
|
|
59
|
+
|
|
60
|
+
์๊ฐ recipe๋ง์ผ๋ก ๊ตฌํ ์๋ฃ๋ฅผ ์ฃผ์ฅํ์ง ์์ต๋๋ค. Menu, Tabs, Dialog์ฒ๋ผ ํ๋์ด ์ค์ํ
|
|
61
|
+
์ปดํฌ๋ํธ๋ behavior scenario๊น์ง renderer ํ
์คํธ๊ฐ ํต๊ณผํด์ผ ํฉ๋๋ค.
|
|
62
|
+
|
|
63
|
+
## ๊ณตํต ์ํ ์ถ
|
|
64
|
+
|
|
65
|
+
| ์ถ | ๊ฐ |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| interaction | idle, hover, focusVisible, pressed, dragged |
|
|
68
|
+
| availability | enabled, disabled, readOnly, busy |
|
|
69
|
+
| value | empty, filled, checked, mixed, selected, open, expanded |
|
|
70
|
+
| validation | valid, invalid |
|
|
71
|
+
| content | idle, loading, loadingMore, empty, error |
|
|
72
|
+
|
|
73
|
+
์ปดํฌ๋ํธ๋ ํ์ํ ์ถ๋ง ๊ณต๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด Link๋ disabled๋ฅผ ์ง์ํ์ง ์๊ณ , AlertDialog๋
|
|
74
|
+
outside dismiss๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ๋ฐ๋์ ๋ณ๋ fixture๋ก ๊ฒ์ฆํ ์กฐํฉ์
|
|
75
|
+
`selected + focusVisible`, `invalid + focusVisible`, `busy + focusVisible`,
|
|
76
|
+
`open + selected item`์
๋๋ค.
|
|
77
|
+
|
|
78
|
+
## Collection ๊ธฐ๋ณธ ๊ณ์ฝ
|
|
79
|
+
|
|
80
|
+
Menu, Select, Combobox, DataTable, Tree๊ฐ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ง๋ค์ง ์๋๋ก ๋ค์์
|
|
81
|
+
๊ณต์ ํฉ๋๋ค.
|
|
82
|
+
|
|
83
|
+
- stable string `id`
|
|
84
|
+
- ๋ณด์ด๋ `label`๊ณผ typeahead/๊ฒ์์ฉ `textValue`
|
|
85
|
+
- ์ ํ์ `description`, `disabled`; ์ํ `tone`๊ณผ `shortcut`์ Menu descriptor์๋ง ์ถ๊ฐ
|
|
86
|
+
- section์ ๋ณด์ด๋ label ๋๋ accessibility label
|
|
87
|
+
- `none | single | multiple` selection mode
|
|
88
|
+
- `idle | loading | loadingMore | empty | error` async state
|
|
89
|
+
- interactive item ์์ ๋ ๋ค๋ฅธ button/link ๊ธ์ง
|
|
90
|
+
|
|
91
|
+
์ ํ ๊ฐ์ฒด๋ฅผ recipe์ ์ง์ ๋๊ธฐ์ง ์์ต๋๋ค. ์ ํ adapter๊ฐ ๋ชฉ์ ์ ๋ง๋ descriptor๋ก ๋ณํํ๋ฉฐ
|
|
92
|
+
๋๋ฉ์ธ ID๋ฅผ ์ ์งํ๊ณ , semantic tone์ ๊ทธ ์๋ฏธ๋ฅผ ์ง์ํ๋ ์ปดํฌ๋ํธ์๋ง ์ ๋ฌํฉ๋๋ค.
|
|
93
|
+
|
|
94
|
+
## ๊ณต๊ฐ ๋ฐฐ์น
|
|
95
|
+
|
|
96
|
+
### ํ์ฌ ์ค์ ์ฑ์์ ๊ฒ์ฆ ์ค
|
|
97
|
+
|
|
98
|
+
- Button, Field, Surface
|
|
99
|
+
- IconButton, Badge, CounterBadge
|
|
100
|
+
- SegmentedControl, Tabs, SearchField
|
|
101
|
+
- Checkbox, CheckboxGroup, RadioGroup
|
|
102
|
+
- List, ListRow, Divider, Section
|
|
103
|
+
- Notice, EmptyState, Skeleton
|
|
104
|
+
- Sheet, Dialog, Toast, BottomCTA, TopBar
|
|
105
|
+
- Select, Combobox
|
|
106
|
+
|
|
107
|
+
### Batch 1 โ ๊ธฐ๋ฐ๊ณผ ํ๋ ๊ฒ์ฆ (beta ์ ์ฉ ์ค)
|
|
108
|
+
|
|
109
|
+
- shared: Icon, Stack, Checkbox/CheckboxGroup/RadioGroup, Accordion
|
|
110
|
+
- adaptive: Link, Menu, AlertDialog
|
|
111
|
+
- web: Tooltip
|
|
112
|
+
|
|
113
|
+
Accordion์ disclosure behavior์ ์ฒซ shared ์ธ๋ก ์ฌ๋ผ์ด์ค, Menu๋ Web anchored surface์ RN
|
|
114
|
+
Sheet๊ฐ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ adaptive ์ฌ๋ผ์ด์ค, AlertDialog๋ focus/back/async confirm์
|
|
115
|
+
๊ฒ์ฆํ๋ overlay ์ฌ๋ผ์ด์ค๋ก ์ฌ์ฉํฉ๋๋ค.
|
|
116
|
+
|
|
117
|
+
Tooltip์ ํ์งํ๋ plain text ๋ณด์ถฉ ์ค๋ช
๋ง ํ์ฉํ๋ Web ์ ์ฉ overlay์
๋๋ค. focus๋ ์ฆ์,
|
|
118
|
+
pointer๋ ์ง์ฐ ํ ์ด๊ณ trigger/content hoverยทpointer corridorยทEscapeยทskip delayยทํ ๋ฒ์ ํ๋๋ง
|
|
119
|
+
์ด๋ฆผ์ provider๊ฐ ์กฐ์ ํฉ๋๋ค. portal/flip/shift/RTL/visual viewport๋ ์ ํ Web renderer์
|
|
120
|
+
๋น๊ณต๊ฐ AnchoredOverlay์ ๋๊ณ interactive Popover๋ก ํ์ฅํ์ง ์์ต๋๋ค. ์์ธ๋
|
|
121
|
+
`docs/tooltip.md`์ ๋ก๋๋ค.
|
|
122
|
+
|
|
123
|
+
BurnTok ์๋ฆผ ๋ฒํผ vertical slice์์ ์ค์ anchor clone, ๊ธฐ์กด `aria-describedby`, focus์
|
|
124
|
+
pointer ์๋ช
์ฃผ๊ธฐ, controlled close ๊ฑฐ๋ถ, sibling FIFO, detached anchor, portal RTL๊ณผ viewport
|
|
125
|
+
collision์ ๊ฒ์ฆํ์ต๋๋ค. Tooltip surface๋ interaction์ ์ถ๊ฐํ์ง ์๊ณ plain copy๋ง
|
|
126
|
+
์ ๊ณตํ๋ฉฐ Reduce Motion exit๋ ๊ฐ์ ์๋ฃ ๊ฒฝ๊ณ๋ฅผ ์ง๋๋ฏ๋ก Tooltip์ Web beta๋ก ์น๊ฒฉํฉ๋๋ค.
|
|
127
|
+
|
|
128
|
+
Icon์ ์ธ๋ถ package component๋ฅผ ํ๋ฉด์์ ์ง์ ๊ณ ๋ฅด๋ ๋ฐฉ์ ๋์ HJM semantic name์ ์ ํ
|
|
129
|
+
adapter๊ฐ tree-shakeable glyph๋ก ๋ฒ์ญํฉ๋๋ค. ๊ธฐ๋ณธ์ decorative์ด๋ฉฐ ์ ๋ณด icon๋ง ํ์งํ๋
|
|
130
|
+
์ ๊ทผ์ฑ ์ด๋ฆ์ ์๊ตฌํ๊ณ , ๋
ผ๋ฆฌ ๋ฐฉํฅ icon๋ง RTL์์ mirrorํฉ๋๋ค. ์์ธ๋ `docs/icon.md`์ ๋ก๋๋ค.
|
|
131
|
+
|
|
132
|
+
Link๋ Button callback์ด ์๋๋ผ ํ์ `href`๊ฐ ์๋ ๋ชฉ์ ์ง์
๋๋ค. Web์ ์ค์ anchor/Next Link๋ก
|
|
133
|
+
modifier clickยทcontext menuยท์ ํญ์ ๋ณด์กดํ๊ณ , Native๋ internal Expo Router Link์ external
|
|
134
|
+
Linking adapter๋ก ์ ์ํฉ๋๋ค. disabledยทvisited application stateยทdownload๋ ๊ณตํต API์ ๋ฃ์ง
|
|
135
|
+
์์ต๋๋ค. BurnTok ๋ฉ์์ง ๋ชฉ๋ก์ ๊ณ ์ conversation-row adapter์์ Web anchor์ Native
|
|
136
|
+
`Link asChild`, unread ์ ๊ทผ์ฑ ์ด๋ฆ, modifier/context navigation, pressed feedback์
|
|
137
|
+
๊ฒ์ฆํ์ผ๋ฏ๋ก Link๋ฅผ adaptive beta๋ก ์น๊ฒฉํฉ๋๋ค.
|
|
138
|
+
Stack์ ๋ฐ๋ณต๋๋ ๋ด๋ถ flex๋ฅผ ๊ฐ์ธ๋ ๊ฒ๋ง์ผ๋ก ์ ํ ์๋ฏธ๋ ์ ๊ทผ์ฑ ๊ณ์ฝ์ด ์๊ธฐ์ง ์์ผ๋ฏ๋ก ์ค์
|
|
139
|
+
paired layout ์๊ตฌ๊ฐ ๋ํ๋ ๋๊น์ง planned recipe ์ด์์ผ๋ก ๊ณต๊ฐํ์ง ์์ต๋๋ค.
|
|
140
|
+
|
|
141
|
+
BurnTok Web/RN๊ณผ Yajalal RN์ Toast tone mark, Yajalal Statistic trend mark์์ ๊ฐ์ semantic
|
|
142
|
+
registryยทtoneยทsizeยทstrokeยทRTL ๊ณ์ฝ์ ์ค์ renderer๋ก ๊ฒ์ฆํ์ต๋๋ค. ์ ํ ์ ์ฉ ์ผ๊ตฌ icon์
|
|
143
|
+
๋ณ๋ adapter์ ๋จ๊ธฐ๊ณ raw colorยท์ซ์ sizeยทstroke override๊ฐ ๊ณต์ฉ API๋ก ์์ง ์๊ฒ ํ์ผ๋ฏ๋ก
|
|
144
|
+
Icon์ beta๋ก ์น๊ฒฉํฉ๋๋ค.
|
|
145
|
+
|
|
146
|
+
AlertDialog๋ `idle โ busy โ error/closing โ closed` session์ ๊ณตํต ๊ธฐ๋ฐ์ผ๋ก ์ผ์ต๋๋ค.
|
|
147
|
+
confirm side effect์ ๊ฒฐ๊ณผ ์ ์ฐ์ ๋ณ๋ once guard๋ก ๋๋์ง ์๊ณ ํ session์ด ์์ ํ๋ฉฐ,
|
|
148
|
+
outside dismiss๋ ์๊ตฌ ๊ธ์งํฉ๋๋ค. Web์ exit ์๋ฃ์ Native Modal dismissal ์ดํ์๋ง ๊ฒฐ๊ณผ๋ฅผ
|
|
149
|
+
์ ์ฐํ๋ฏ๋ก ์ค์ฒฉ ํ์ธ๋ ๋์์ ๋ ๊ฐ๊ฐ ์ด๋ฆฌ์ง ์์ต๋๋ค.
|
|
150
|
+
|
|
151
|
+
Sheet๋ beta ๋จ๊ณ์์ `SheetOpenState`, concrete dismiss reason, `SheetDismissPolicy`์
|
|
152
|
+
`canDismissSheet`๋ฅผ ๊ณตํต ๊ณ์ฝ์ผ๋ก ๊ณ ์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ close/outside/Escapeยทback ํ์ฉ,
|
|
153
|
+
busy dismiss์ swipe ๊ธ์ง์
๋๋ค. controlled owner์ programmatic close๋ ํญ์ ํ์ฉํ๊ณ ,
|
|
154
|
+
ํ์ overlay๋ exit/onDismiss๊ฐ ๋๋ ๋ค ์ฝ๋๋ค. drag handle์ swipe gesture capability์
|
|
155
|
+
๋ช
์์ policy๊ฐ ๋ชจ๋ ์ผ์ง renderer์์๋ง ๋ณด์ฌ ๋์ํ์ง ์๋ affordance๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค.
|
|
156
|
+
visual recipe๋ border/shadow, ์ฝํ
์ธ typography rhythm, Web max-width, safe-area, Reduce Motion๋ง
|
|
157
|
+
๋ด๊ณ dismiss behavior๋ ํฌํจํ์ง ์์ต๋๋ค.
|
|
158
|
+
|
|
159
|
+
Toast๋ root provider์ bounded FIFO์ stable-id update๋ฅผ ๊ณตํตํํฉ๋๋ค. queued ํญ๋ชฉ์๋ timer๋ฅผ
|
|
160
|
+
์์ํ์ง ์๊ณ visible ๋์ pointer/focus/window/gesture pause๋ฅผ ํฉ์ฑํ๋ฉฐ, action๊ณผ dismiss๋
|
|
161
|
+
ํ revision์์ ์ ํํ ํ ๋ฒ๋ง ์ฒ๋ฆฌํฉ๋๋ค. ์ธํ tone๊ณผ announcement priority๋ฅผ ๋ถ๋ฆฌํ๊ณ ๋ชจ๋
|
|
162
|
+
tone์ ๊ณ ์ icon mark์ ํจ๊ป ํ์ํฉ๋๋ค. ์์ธ ๊ณ์ฝ์ `docs/toast.md`์ ๋ก๋๋ค.
|
|
163
|
+
|
|
164
|
+
์ ํ ์
๋ ฅ์ ๋จ์ผ mode prop์ผ๋ก ํฉ์น์ง ์์ต๋๋ค. Checkbox, CheckboxGroup, RadioGroup์ด
|
|
165
|
+
์๊ฐ recipe๋ง ๊ณต์ ํ๊ณ , Checkbox๋ ๊ฐ native tab stop, RadioGroup์ roving focus๋ฅผ ๊ฐ์ต๋๋ค.
|
|
166
|
+
๊ทธ๋ฃน ๊ฐ์ stable string id์ `ReadonlySet` ๋๋ nullable single key๋ง ์ฌ์ฉํฉ๋๋ค.
|
|
167
|
+
|
|
168
|
+
### Batch 2 โ ์
๋ ฅ๊ณผ ํ์ (beta ์ ์ฉ ์ค)
|
|
169
|
+
|
|
170
|
+
- shared: Steps, Statistic, Slider, NumberField, LoadMore
|
|
171
|
+
- adaptive: Select, Combobox, BottomNavigation
|
|
172
|
+
- `ContextPanel`์ ์ด ๋ชฉ๋ก์์ ๋บ๋ค. ์ ํ ๋์์ ์์ธ๋ฅผ ์์ ๋ณด์ฌ ์ฃผ๋ ๋ฌธ์ ๋
|
|
173
|
+
`Drawer`๋ฅผ ๋ถํดํ ๋ ์ด๋ฏธ **Web `SidePanel`(+`modal: false`) / Native `Sheet`**๋ก
|
|
174
|
+
๋ต์ด ๋์ ์์๋ค. ๋ก๋๋งต์ด ์ปดํฌ๋ํธ ์ด๋ฆ์ ๋จผ์ ์ ์ด ๋๊ณ ๋ฌธ์ ์ ์๋ฅผ ๋์ค์ผ๋ก
|
|
175
|
+
๋ฏธ๋ฃจ๋ฉด ์ด๋ฐ ์ค๋ณต์ด ์๊ธด๋ค โ ๊ทผ๊ฑฐ๋ `docs/context-panel.md`.
|
|
176
|
+
- web: Pagination, Breadcrumb
|
|
177
|
+
|
|
178
|
+
Statistic์ ์ ํ์ด ํฌ๋งทํ ๋ฌธ์์ด์ ๋ฐ์ label/value/hint/trend ์๊ณ๋ง ํต์ผํฉ๋๋ค. trend ๋ฐฉํฅ๊ณผ
|
|
179
|
+
semantic tone์ ๋
๋ฆฝ์ด๊ณ arrow/minus์ visible copy๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฃน์ ๊ฐ ๊ฐ์ ํ๋์
|
|
180
|
+
์ถ์ฝ๋ ์ ๊ทผ์ฑ ๋
ธ๋๋ก ํฉ์น์ง ์์ต๋๋ค.
|
|
181
|
+
|
|
182
|
+
Yajalal์ ์ ์ยทFA ๊ธฐ๋ก vertical slice์์ ๊ธฐ์กด StatGrid ํธํ adapter์ ์ Statistic renderer๋ฅผ
|
|
183
|
+
ํจ๊ป ๊ฒ์ฆํ์ต๋๋ค. ์ข์ ํญ์์๋ 1์ด๊น์ง reflowํ๊ณ ํฐ ๊ธ์์์๋ ๊ฐ์ ์ค ์๋ก ์๋ฅด์ง ์์ผ๋ฉฐ,
|
|
184
|
+
๊ฐ ํต๊ณ์ label/value/hint/trend๋ฅผ ๋
๋ฆฝ๋ ์ ๊ทผ์ฑ ์ด๋ฆ์ผ๋ก ์ ์งํ๋ฏ๋ก Statistic์ beta๋ก
|
|
185
|
+
์น๊ฒฉํฉ๋๋ค.
|
|
186
|
+
|
|
187
|
+
Select/Combobox๋ Menu์ collection contract๋ฅผ ๊ณต์ ํ์ง๋ง role๊ณผ dismiss behavior๋ ๋ณ๋์
๋๋ค.
|
|
188
|
+
Web์ listbox popup, Native๋ Sheet๋ฅผ ์ฌ์ฉํฉ๋๋ค. Native ๊ธด ๋ชฉ๋ก์๋ ํ์ด์ง ๋ฒํธ๋ณด๋ค
|
|
189
|
+
LoadMore/infinite loading์ ์ฌ์ฉํฉ๋๋ค.
|
|
190
|
+
|
|
191
|
+
LoadMore๋ `ready | loading | error | complete` footer state์ stable `requestKey`๋ง ๊ณต์ ํฉ๋๋ค.
|
|
192
|
+
Web IntersectionObserver์ Native onEndReached๋ ํ๋ซํผ renderer๊ฐ ์์ ํ๊ณ , ๊ณตํต controller๋
|
|
193
|
+
์์ฒญ ํ๋๋ง ํต๊ณผ์์ผ ๋ฐ๋ณต viewport event์ retry ์ค๋ณต์ ๋ง์ต๋๋ค. automatic mode๋ ์ ๊ทผ ๊ฐ๋ฅํ
|
|
194
|
+
manual fallback์ ์ ์งํฉ๋๋ค.
|
|
195
|
+
|
|
196
|
+
BurnTok ํ ํผ๋ vertical slice์์ Web IntersectionObserver์ ํญ์ ๋ณด์ด๋ manual fallback,
|
|
197
|
+
Native FlatList onEndReached์ footer fallback์ ๊ฐ์ controller์ ์ฐ๊ฒฐํ์ต๋๋ค. ๋ renderer ๋ชจ๋
|
|
198
|
+
ํญ๊ณผ ๋ค์ offset์ผ๋ก requestKey๋ฅผ ๋ง๋ค๊ณ ์ค์ ํ์ด์ง ์์ฒญ Promise๊ฐ ๋๋ ๋๊น์ง ์ค๋ณต ํธ์ถ์
|
|
199
|
+
์ฐจ๋จํ๋ฉฐ loading/error/complete ์ ๊ทผ์ฑ ์ํ๋ฅผ ๊ฒ์ฆํ์ผ๋ฏ๋ก LoadMore๋ฅผ beta๋ก ์น๊ฒฉํฉ๋๋ค.
|
|
200
|
+
|
|
201
|
+
BottomNavigation์ route source-of-truth๋ฅผ ๋ณต์ ํ์ง ์๊ณ `selectedKey`๋ฅผ input์ผ๋ก๋ง ๋ฐ์ต๋๋ค.
|
|
202
|
+
Web renderer๋ ์ค์ link์ `aria-current`, Native renderer๋ navigator์ preventable tabPress์
|
|
203
|
+
long press๋ฅผ ๋ณด์กดํฉ๋๋ค. ์ซ์ badge๋ visual subtree๋ฅผ ์ ๊ทผ์ฑ์์ ์จ๊ธฐ๊ณ item root์ ํฉ์ฑ๋
|
|
204
|
+
์ด๋ฆ์ ํ ๋ฒ๋ง ์ ๋ฌํฉ๋๋ค. BurnTok ์ค์ ์์ฑ action์ `center-gap`์ ๋์ด๋ sibling primary
|
|
205
|
+
action์ด๋ฉฐ destination collection์๋ ๋ค์ด๊ฐ์ง ์์ต๋๋ค. BurnTok Web/RN๊ณผ Yajalal RN ์ค์
|
|
206
|
+
navigation์ ์ ์ฉํด route stateยทdisabled/reselectยท๊ธด ๊ธ์ยทsafe areaยทRTL ๊ณ์ฝ์ ๊ฒ์ฆํ์ผ๋ฏ๋ก
|
|
207
|
+
BottomNavigation์ beta๋ก ์น๊ฒฉํฉ๋๋ค.
|
|
208
|
+
|
|
209
|
+
์ ํ ํ์
์ Select์ nullable stable key์ Combobox์ `selectedKey`/`inputValue` ๋ถ๋ฆฌ๋ฅผ
|
|
210
|
+
๊ณ ์ ํฉ๋๋ค. local filtering๊ณผ server-driven external filtering๋ ๊ตฌ๋ถํด ์ ํ ์ํ์ ๋น๋๊ธฐ
|
|
211
|
+
๊ฒ์ ์ํ๊ฐ ์๋ก ๋ฎ์ด์ฐ์ง ์๊ฒ ํฉ๋๋ค. ์ค์ ์ ํ ํ๋ฆ์์ ํ์ธ๋ stable key, stale result,
|
|
212
|
+
committed item snapshot๋ง ๊ณต๊ฐํ๊ณ ์์ ๊ฐ ์์ฑ์ด๋ option ๋ด๋ถ action์ ์์ง ์ถ๊ฐํ์ง ์์ต๋๋ค.
|
|
213
|
+
|
|
214
|
+
`validateCollection`, `flattenCollectionItems`, `resolveCollectionItem`,
|
|
215
|
+
`reconcileSelectSelection`์ ๋จผ์ ๊ณต๊ฐํฉ๋๋ค. item ID๋ section ์ ์ฒด์์ ์ ์ผํ๊ณ ๋ณด์ด๋
|
|
216
|
+
labelยทtypeahead์ฉ textValueยทsection accessible name์ ๋น์ด ์์ ์ ์์ต๋๋ค. Select์ open
|
|
217
|
+
state๋ selection state์ ๋ณ๋ controlled/uncontrolled ์ถ์ผ๋ก ์ ์งํฉ๋๋ค.
|
|
218
|
+
|
|
219
|
+
### vertical slice๊ฐ ์๋ ๊ณ์ฝ โ ์ฑํ ์ ํ์ธํ ๊ฒ
|
|
220
|
+
|
|
221
|
+
surface๋ณ `planned โ beta` gate๋ public renderer export์ package CI๊ฐ ์คํํ๋ canonical
|
|
222
|
+
`default` proof๋ฅผ ์๊ตฌํฉ๋๋ค. ์ค์ ์ ํ vertical slice๋ ๋ณ๋์ adoption evidence์ด๋ฉฐ,
|
|
223
|
+
์๋ค๋ฉด beta์ ํ๊ฒฝ debt์ ํจ๊ป ๊ณต๊ฐ๋๊ณ stable ์น๊ฒฉ์ ๋ง์ต๋๋ค. ์ ํ ์ฑํ์ ๊ฒํ ํ๋
|
|
224
|
+
๊ณผ์ ์์ **์ ์ ๊ฐ ์ด๋ฏธ ๋ฐ๋์ด ์๋ ์ฌ๋ก**๋ ๋์์ต๋๋ค.
|
|
225
|
+
|
|
226
|
+
`Calendar`ยท`DatePicker`๋ฅผ ์์ํ ๋ "์ผ์์ ์ผ์ ์ฐพ๊ธฐ๊ฐ ์ ๋ฌ๋ ฅ ๊ฒฉ์๋ฅผ ์์ฒด ๊ตฌํ ์ค"์ด๋ผ๋
|
|
227
|
+
์ ์ ๋ฅผ ์คฌ๋๋ฐ, ์ ์์๊ฐ ์์ค๋ฅผ ์ง์ ํ์ธํด ๊ทธ ์ ์ ๊ฐ **์ปค๋ฐ `0f4887c`(ใ์ผ์ ํ์๊ธฐ ์
|
|
228
|
+
๊ทธ๋ฆฌ๋๋ฅผ ๋ ์ง ๋ ์ผ๋ก ๊ต์ฒดใ)์์ ์ด๋ฏธ ๊นจ์ก๋ค**๋ ๊ฒ์ ์ฐพ์๋๋ค. `buildCalendarCells`๋
|
|
229
|
+
๋จ์ ์์ง๋ง ๋ ๋๋์ง ์๊ณ ์ ๋ฒ์ ์ฟผ๋ฆฌ์ ๋ด๋ถ ๊ณ์ฐ์ผ ๋ฟ์ด๋ฉฐ, ํ๋ฉด์ ์ ํค๋ + 7์ผ
|
|
230
|
+
๋ ์ง ๋ ์ผ์ด๋ค. ์ฑ ์ ์ฒด์ ๊ฐ ํ๋๋ฅผ ๊ณ ๋ฅด๋ ์์ถ ํธ๋ฆฌ๊ฑฐ UI๋ ์๋ค.
|
|
231
|
+
|
|
232
|
+
์ดํ DatePicker์๋ first-party WebยทNative renderer์ canonical ํ๊ฒฝ ์ฆ๊ฑฐ๊ฐ ์ถ๊ฐ๋์ด
|
|
233
|
+
`beta`๋ก ์น๊ฒฉ๋๋ค. ๋ค๋ง ์ ์ค์ธก์ ์ฌ์ ํ ์ ํจํ๋ค. **์ ํ adoption evidence๋ ์๊ณ **,
|
|
234
|
+
Yajalal์ ๋ ์ง ๋ ์ผ์ DatePicker ์ฑํ์ผ๋ก ์ธ์ง ์๋๋ค. ๋ฐ๋ผ์ `stable` ์น๊ฒฉ ๊ทผ๊ฑฐ๋ ์๋ค.
|
|
235
|
+
|
|
236
|
+
**๊ตํ**: ์์ํ ๋ ์ค ์ค์ฌ์ฉ์ฒ ์ ์ ๋ฅผ ์ ์์๊ฐ **ํ์ธํ๊ฒ** ํด์ผ ํ๋ค. ๋ฆฌ๋์ ๊ธฐ์ต์
|
|
237
|
+
์ปค๋ฐ ํ๋๋ก ๋ก๋๋ค.
|
|
238
|
+
|
|
239
|
+
### Batch 3 โ ๋ณตํฉ ๋ฐ์ดํฐ์ ํ์ผ
|
|
240
|
+
|
|
241
|
+
- beta: Timeline, UploadItem, DatePicker, FilePicker
|
|
242
|
+
- planned: TimePicker
|
|
243
|
+
- web: DataTable, Tree, ColorPicker, CommandPalette, SidePanel, Popover
|
|
244
|
+
|
|
245
|
+
FilePicker๋ ํ์ผ ์ ํ ์๋๋ง ์์ ํฉ๋๋ค. ์
๋ก๋ ์์ฒญยท์ฌ์๋ยท์๋ฒ ์ํ๋ ์ ํ์ด ์์ ํ๊ณ ,
|
|
246
|
+
๊ณต์ UI์๋ UploadItem์ progress/success/error/cancel ํํ๋ง ๋ก๋๋ค.
|
|
247
|
+
|
|
248
|
+
## ์ ํ ์ ์ฉ ์์
|
|
249
|
+
|
|
250
|
+
### BurnTok
|
|
251
|
+
|
|
252
|
+
1. SearchField, CounterBadge, ShareSheet/ListRow
|
|
253
|
+
2. messages/notifications metadata row์ unread state
|
|
254
|
+
3. Sheet์ ์๊ฐ recipe ์ฐ๊ฒฐ โ ๊ธฐ์กด focus trapยทscroll lock์ ๋ณด์กด
|
|
255
|
+
4. action Menu๋ฅผ ๊ณต์ /ํผ๋์์ ๊ฒ์ฆ
|
|
256
|
+
5. Dialog์ AlertDialog๋ฅผ ๋ถ๋ฆฌ
|
|
257
|
+
|
|
258
|
+
### Yajalal
|
|
259
|
+
|
|
260
|
+
1. SearchField, BottomCTA, Notice, CounterBadge
|
|
261
|
+
2. Chip์ action/radio/checkbox๋ก ์๋ฏธ ๋ถ๋ฆฌ
|
|
262
|
+
3. List/ListRow/Section/Skeleton์ ๊ณต์ฉ recipe์ ์ฐ๊ฒฐ
|
|
263
|
+
4. Accordion์ ๊ธฐ๋ก ์์ธ์์ ๊ฒ์ฆ
|
|
264
|
+
5. Menu/Select๋ฅผ ์ ์ยท์์ฆ ์ ํ ํ๋ฆ์ ์ ์ฉ
|
|
265
|
+
|
|
266
|
+
์ ํ ์ ์ฉ `ai` accent, `built`, `live`, `win`, ๊ตฌ๋จ ์์ adapter์ ๋จ๊ณ recipe์๋
|
|
267
|
+
`info`, `success`, `attention`, `brand` ๊ฐ์ ๊ณต์ฉ ์๋ฏธ๋ง ๋ค์ด๊ฐ๋๋ค. ๋ฐ๋ฉด
|
|
268
|
+
`SemanticIconName`์ `ai`๋ ํน์ ๋ชจ๋ธ์ด๋ ์ ํ ์์ ๋ปํ์ง ์๋ ์ผ๋ฐ โAI ๊ธฐ๋ฅโ
|
|
269
|
+
์์ด์ฝ ์ญํ ์ด๋ฏ๋ก ๊ณต์ฉ registry์ ๋ก๋๋ค.
|
|
270
|
+
|
|
271
|
+
## maturity gate
|
|
272
|
+
|
|
273
|
+
- surface `planned โ beta`: public renderer export + package CI์ canonical default proof
|
|
274
|
+
- `beta โ stable(shared)`: Web/RN renderer, ๊ณตํต scenario parity, Web keyboard,
|
|
275
|
+
iOS VoiceOver, Android TalkBack, Reduce Motion + consumer adoption evidence
|
|
276
|
+
- `beta โ stable(adaptive)`: ํฝ์
parity ๋์ ๊ฐ์ action/result/announcement, dismiss/back
|
|
277
|
+
scenario ํต๊ณผ
|
|
278
|
+
- Web/Native ์ ์ฉ: ํด๋น ํ๋ซํผ์ keyboard ๋๋ screen reader evidence
|
|
279
|
+
|
|
280
|
+
๋ชจ๋ ๋จ๊ณ์์ light/dark, 200% text ๋๋ ํฐ ๊ธ์, RTL ๊ฐ๋ฅํ API, ํ์ ํ
์คํธ 4.5:1,
|
|
281
|
+
๊ฒฝ๊ณยทfocusยทindicator 3:1, 44-unit target์ ํ์ธํฉ๋๋ค.
|
|
282
|
+
|
|
283
|
+
Sheet stable ์น๊ฒฉ์๋ ์ gate์ ํจ๊ป ๋ชจ๋ dismiss reason์ ๋จ์ผ callback, busy ์ฐจ๋จ,
|
|
284
|
+
Web focus/scroll lock, Native safe-area/back, Reduce Motion exit ์๋ฃ, Sheet ์ข
๋ฃ ๋ค ํ์ surface
|
|
285
|
+
์์, opt-in swipe gesture์ ์ค์ ๊ธฐ๊ธฐ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# FilePicker contract
|
|
2
|
+
|
|
3
|
+
**๋ฌธ์ .** ์ฌ์ฉ์๊ฐ ์
๋ก๋ํ ๋ก์ปฌ ํ์ผ์ ๊ณ ๋ฅธ๋ค โ ์ด๋ค ํ์์ ๋ฐ๋์ง, ๋ช ๊ฐ๊น์ง
|
|
4
|
+
๊ณ ๋ฅผ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ฌด์์ ๊ณจ๋๋์ง. ์
๋ก๋ ์์ฒญยท์ฌ์๋ยท์๋ฒ ์๋ต์ ์ด ๊ณ์ฝ
|
|
5
|
+
๋ฐ์ด๋ค. `docs/expansion-roadmap.md`์ Batch 3 ์ ์ด ์ด๋ฏธ ๊ทธ ๊ฒฝ๊ณ๋ฅผ ๊ทธ์ด ๋๋ค:
|
|
6
|
+
FilePicker๋ ํ์ผ ์ ํ ์๋๋ง ์์ ํ๊ณ , ์งํยท์ฑ๊ณตยท์คํจ ํํ์ [[upload-item]]์ด
|
|
7
|
+
๋ฐ๋ก ์์ ํ๋ค. antd `Upload`๋ ์ด ๋๋ก decompose๋๋ค
|
|
8
|
+
(`src/component-references.ts`์ crosswalk).
|
|
9
|
+
|
|
10
|
+
**์ผ๋ฐํํ ๊ณ์ฝ.**
|
|
11
|
+
|
|
12
|
+
- `mode`(`single` ๊ธฐ๋ณธ๊ฐ ๋๋ `multiple`), `accept?`(MIME ํจํด ๋๋ ํ์ฅ์ ๋ชฉ๋ก),
|
|
13
|
+
`maxSizeBytes?`, `maxCount?`(multiple ์ ์ฉ)๋ง ๊ณต๊ฐํ๋ค. `maxCount`๋ฅผ single
|
|
14
|
+
๋ชจ๋์ ์ฃผ๋ฉด ์กฐ์ฉํ ๋ฌด์ํ์ง ์๊ณ ๋์ง๋ค โ ๋ ์ถ์ด ๊ฐ์ ๊ฒ์ ๋ค๋ฅด๊ฒ ๋ ๋ฒ
|
|
15
|
+
๋งํ๊ฒ ๋์ง ์๋๋ค.
|
|
16
|
+
- ๊ณ ๋ฅธ ๊ฒฐ๊ณผ๋ `{ accepted, rejected }`๋ก ํจ๊ป ๋์์จ๋ค. `rejected`์ ๊ฐ ํญ๋ชฉ์
|
|
17
|
+
`reason`(`unsupported-type`, `too-large`, `count-exceeded` ์ค ํ๋)๊ณผ ๊ทธ ํ์ ์ ์ด
|
|
18
|
+
ํ๊ณ๊ฐ์ ํจ๊ป ๋ค๊ณ ์์ด ์ ํ์ด ์ ๋งํ๋์ง ๋ค์ ๊ณ์ฐํ์ง ์๊ณ ๋ฌธ์ฅ์ ๋ง๋ ๋ค.
|
|
19
|
+
๋๋จธ์ง accepted ํ์ผ์ ๊ทธ๋๋ก ์ ํ๋ ์ฑ๋ก ๋จ๋๋ค โ identity.md์ "๋ฌด์์ด
|
|
20
|
+
๊นจ์ก๋์ง + ๋ฌด์์ด ๋ฌด์ฌํ์ง"๋ฅผ ํ ๊ฒฐ๊ณผ ๊ฐ ์์์ ๋ง์กฑํ๋ค.
|
|
21
|
+
- ํฌ๊ธฐยทํ์ ๊ฑฐ๋ถ๋ **์ ํ ์์ **์ ํ์ ์ด๋ค. ๋ธ๋ผ์ฐ์ `accept` ์์ฑ์ด๋ ๋ค์ดํฐ๋ธ
|
|
22
|
+
ํผ์ปค์ ํํฐ๋ ์ฐธ๊ณ ํํธ์ผ ๋ฟ ๊ฐ์ ๊ฐ ์๋๋ฏ๋ก(์ฌ์ฉ์๊ฐ "๋ชจ๋ ํ์ผ"์ ๊ณ ๋ฅด๋ฉด
|
|
23
|
+
ํต๊ณผํ๋ค), `resolveFilePickerSelection`์ด ์ค์ ์ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๊ฒ์ฆํ๋ค.
|
|
24
|
+
- `mode: "single"`์ ๋ณ๋ ๋ถ๊ธฐ๊ฐ ์๋๋ผ `maxCount = 1`์ธ ์ผ๋ฐ ๊ท์น์ ํน์
|
|
25
|
+
๊ฒฝ์ฐ๋ก ์ฒ๋ฆฌํ๋ค โ Web dropzone์ ํ์ผ ์ฌ๋ฌ ๊ฐ๋ฅผ ํ ๋ฒ์ ๋์ด๋ค ๋์๋(๋จ์ผ
|
|
26
|
+
๋ชจ๋๋ผ๋ ๋๋กญ ์ด๋ฒคํธ ์์ฒด๋ ์ฌ๋ฌ ํ์ผ์ ์ค ์ ์๋ค) ์ฒซ ํ์ผ๋ง accepted, ๋๋จธ์ง๋
|
|
27
|
+
`count-exceeded`๋ก ๋จ์ด์ง๋ค.
|
|
28
|
+
- `existingCount`๋ FilePicker๊ฐ ์์ ํ์ง ์๋ ์
๋ ฅ์ด๋ค(Select์ `selectedItem`๊ณผ
|
|
29
|
+
๊ฐ์ ์๋ฆฌ). ์ฌ๋ฌ ๋ฒ ๋๋ ๊ณ ๋ฅด๋ ์ ํ ํ๋ฆ์์ ์ด๋ฏธ ๊ณ ๋ฅธ ๊ฐ์๋ฅผ ๋๊ฒจ์ฃผ๋ฉด
|
|
30
|
+
`maxCount`๊ฐ ๋์ ๊ธฐ์ค์ผ๋ก ํ๋จ๋๋ค โ FilePicker๋ ์ ํ ๋ชฉ๋ก ์์ฒด๋ฅผ ์์๋์ง
|
|
31
|
+
์๋๋ค.
|
|
32
|
+
- ๋ฃ์ง ์์ ๊ฒ: ํ์ผ ๋ด์ฉ ์ฝ๊ธฐ/๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์
๋ก๋ ์งํยท์ฌ์๋ยท์๋ฒ ์ํ(โ
|
|
33
|
+
[[upload-item]]๊ณผ ์ ํ), ๋๋ ํฐ๋ฆฌ ์
๋ก๋, ์๋ ์ ๋ ฌ. antd `Upload`์ ๋์ ํ๋ฉด ์ค
|
|
34
|
+
"๋ฌด์์ ๊ณ ๋ฅผ ๊ฒ์ธ๊ฐ"๋ง ๊ฐ์ ธ์จ๋ค.
|
|
35
|
+
|
|
36
|
+
**HJM ๊ธฐ๋ณธ๊ฐ.** `mode` ๊ธฐ๋ณธ๊ฐ์ `single`(๋ ์ข๊ณ ์์ ํ ์ชฝ). trigger ๋ฒํผ์
|
|
37
|
+
`control.minTouchTarget`(44) ์ด์์ ์ ์งํ๊ณ , dropzone์ `radius.lg`์ ์ ์
|
|
38
|
+
ํ
๋๋ฆฌ๋ก ํํํ๋ฉฐ hover/drag ์ `border.focus` ์๊ณผ `interaction.focus`
|
|
39
|
+
๋ฐฐ๊ฒฝ์ผ๋ก ๊ฐ์กฐํ๋ค โ ์ด ๊ฐ์กฐ๋ ์ฅ์์ด ์๋๋ผ "์ฌ๊ธฐ ๋์ผ๋ฉด ๋๋ค"๋ ์ ํธ๋ค.
|
|
40
|
+
|
|
41
|
+
**ํ๋ซํผ ๋ฒ์ญ.**
|
|
42
|
+
|
|
43
|
+
- Web: `<input type="file">` ๋๋ ๋๋ฑ ์์ ฏ์ด `role="button"`์ผ๋ก trigger๋ฅผ
|
|
44
|
+
๋๋ฌ๋ธ๋ค. ๋๋๊ทธ ์ค ๋๋กญ์ **Web ์ ์ฉ ๋ณด๊ฐ**์ด๋ฉฐ ํญ์ ๋ฒํผ trigger์ ํจ๊ป
|
|
45
|
+
์์ด์ผ ํ๋ค โ `validateFilePickerTriggers`๊ฐ ์ด ์กฐํฉ์ ๊ฐ์ ํ๋ค. Native๊ฐ
|
|
46
|
+
dropzone trigger๋ฅผ ์์ฒญํ๋ฉด ๋์ง๋ค.
|
|
47
|
+
- Native: ์์คํ
document/์ด๋ฏธ์ง ํผ์ปค๊ฐ ์ ์ผํ ์ง์
์ ์ด๋ค. ๊ฒฐ๊ณผ๊ฐ ๋์ฐฉํ๋
|
|
48
|
+
๊ฒฝ๋ก๋ ๋ค๋ฅด์ง๋ง(Web `change` ์ด๋ฒคํธ vs Native picker ์ฝ๋ฐฑ), ๊ฐ์
|
|
49
|
+
`FilePickerCandidate` ๋ฐฐ์ด๋ก ๋ค์ด์ ๊ฐ์ `resolveFilePickerSelection`์ ํต๊ณผํ๋ฏ๋ก
|
|
50
|
+
accept/size/count ํ์ ์ ๋ ํ๋ซํผ์์ ๋์ผํ๋ค โ ๋ก๋๋งต์ adaptive gate๊ฐ
|
|
51
|
+
์๊ตฌํ๋ "๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ๋ค๋ฅธ ๊ฒฝ๋ก"๋ค.
|
|
52
|
+
- ์ด๋ฆผ/๋ซํ ์ถ์ ๊ณต๊ฐํ์ง ์๋๋ค. ํ๋ซํผ ํผ์ปค ์ํธ๋ OS๊ฐ ์์ ํ๋ ์ผ์์
|
|
53
|
+
chrome์ด๋ผ Sheet/Select์ฒ๋ผ `open` controlled state๋ฅผ ๋ชจ๋ธ๋งํ์ง ์๋๋ค.
|
|
54
|
+
- ๊ฑฐ๋ถ ๋ฐํ๋ ์์ ์์กดํ์ง ์๋๋ค โ `reason`๊ณผ ํ๊ณ๊ฐ์ผ๋ก ์ ํ์ด ๋ง๋ ๋ฌธ์ฅ์
|
|
55
|
+
live ์์ญ/์๋ฌ ์นดํผ๋ก ๋ณด์ฌ์ค๋ค.
|
|
56
|
+
|
|
57
|
+
**๊ฒ์ฆ ํ๋ฉด.** first-party Web input/dropzone๊ณผ Native picker-adapter renderer, ์ ํ ํ์
|
|
58
|
+
์ํธ์์ฉ ํ
์คํธ๋ ์ฐ๊ฒฐ๋์ด surface๋ `beta`๋ค. ์ค์ ์ ํ vertical slice์ ํ๋ซํผ picker
|
|
59
|
+
์ค๊ธฐ๊ธฐ ์ฆ๊ฑฐ๋ ์์ง ์์ผ๋ฏ๋ก `stable` ์น๊ฒฉ gate๋ ๋ซํ ์๋ค.
|