@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,68 @@
|
|
|
1
|
+
# UploadItem contract
|
|
2
|
+
|
|
3
|
+
**문제.** 사용자가 고른 파일 하나가 지금 어디쯤 있는지 보여준다 — 대기 중인지,
|
|
4
|
+
전송 중이며 얼마나 갔는지, 끝났는지, 실패해서 무엇을 할 수 있는지. 어떤 파일을
|
|
5
|
+
고를지는 [[file-picker]]의 몫이고, 업로드 요청·재시도 로직·서버 응답은 제품의
|
|
6
|
+
몫이다. UploadItem은 그 상태를 화면에 어떻게 표현할지만 소유한다. antd `Upload`는
|
|
7
|
+
[[file-picker]]와 이 컴포넌트로 decompose된다(`src/component-references.ts`).
|
|
8
|
+
|
|
9
|
+
**일반화한 계약.**
|
|
10
|
+
|
|
11
|
+
- 상태는 `pending | uploading | success | error` 네 값의 discriminated union이다.
|
|
12
|
+
`progress`(0..1 또는 불확정이면 `null`)는 `uploading`에만 있고, `message`는
|
|
13
|
+
`error`에만 있다 — 타입이 허용하지 않으니 "success인데 progress가 있다" 같은
|
|
14
|
+
조합이 애초에 만들어지지 않는다.
|
|
15
|
+
- 취소/재시도 가능 여부를 별도 boolean으로 저장하지 않는다.
|
|
16
|
+
`getUploadItemAvailableAction(state)`가 `status`에서 매번 다시 계산해
|
|
17
|
+
`uploading`일 때만 `"cancel"`, `error`일 때만 `"retry"`를 돌려준다. 저장된 값이
|
|
18
|
+
상태와 따로 놀 수 있는 여지 자체를 없앤다 — `SheetOpenState`가 controlled/
|
|
19
|
+
uncontrolled 축을 섞지 않는 것, `LoadMoreState`가 `complete`에 `requestKey`를
|
|
20
|
+
아예 두지 않는 것과 같은 이유다.
|
|
21
|
+
- `resolveUploadItemAnnouncement`가 `{ label, description }`을 돌려준다. `label`은
|
|
22
|
+
파일명으로 상태와 무관하게 고정하고([[statistic]]이 label/value/hint/trend를
|
|
23
|
+
독립된 접근성 이름으로 유지하는 것과 같은 원칙), `description`이 상태 문장을
|
|
24
|
+
맡는다 — 진행률 채움 막대 색만으로 상태를 말하지 않는다.
|
|
25
|
+
- `progress`가 색으로만 말해지지 않도록 항상 낭독 가능한 문장을 만든다.
|
|
26
|
+
우선순위는 제품이 준 `progressLabel` → (숫자 진행률이면) 반올림 퍼센트 →
|
|
27
|
+
`labels.uploading` 정적 문구다. 퍼센트 자동 계산은 이 모듈에서 유일하게
|
|
28
|
+
"제품이 포맷한 문자열을 받는다"는 [[statistic]] 원칙과 다르게 판단한 자리다 —
|
|
29
|
+
Statistic의 값은 통화·단위처럼 로케일에 따라 표기가 갈리지만, `Math.round(x*100)
|
|
30
|
+
+ "%"`는 로케일 중립적인 숫자와 기호뿐이라 Slider의 raw-value fallback과 같은
|
|
31
|
+
근거로 예외를 둔다. 그래도 제품이 `progressLabel`을 주면 항상 그것을 우선한다.
|
|
32
|
+
- `validateUploadItemList`가 한 목록 안에서 stable id 중복을 거부한다 —
|
|
33
|
+
[[statistic]]의 `validateStatisticGroup`과 같은 이유로, 목록 재조정 시 행이
|
|
34
|
+
잘못된 항목과 뒤바뀌는 사고를 막는다.
|
|
35
|
+
- 진행 표시는 이미 beta인 `progressRecipe`(`component-recipes.ts`)를 그대로
|
|
36
|
+
재사용한다 — `uploadItemRecipe.progress`는 새 막대를 만들지 않고
|
|
37
|
+
`progressRecipe.defaults.size`/`.tone`을 그대로 참조한다. 실패 상태의 막대
|
|
38
|
+
색만 `progressRecipe.tones.danger`로 바꾼다.
|
|
39
|
+
- 넣지 않은 것: 자동 업로드 시작, 이미지 미리보기 썸네일, 순서 재배치(drag
|
|
40
|
+
reorder), 여러 파일의 배치 재시도 정책. 이 모듈은 한 파일 한 행의 표현만
|
|
41
|
+
안다 — 목록 레이아웃과 배치 동작은 제품이 [[file-picker]]의 선택 결과 위에
|
|
42
|
+
조합한다.
|
|
43
|
+
|
|
44
|
+
**HJM 기본값.** 행 높이는 `layout.rowHeight.twoLine`(파일명 + 상태/진행 두 줄
|
|
45
|
+
정보 밀도)이고, 취소/재시도 target은 `control.minTouchTarget`(44) 이상을
|
|
46
|
+
유지한다. 상태별 강조 색은 `pending=content.secondary`,
|
|
47
|
+
`uploading=content.brand`, `success=feedback.success.foreground`,
|
|
48
|
+
`error=content.danger`이며, 어떤 상태도 색만으로 구분되지 않고 `statusText`
|
|
49
|
+
슬롯의 문장이 항상 함께 있다.
|
|
50
|
+
|
|
51
|
+
**플랫폼 번역.**
|
|
52
|
+
|
|
53
|
+
- Web: 행을 `role="group"`으로 묶고 진행 막대는 `role="progressbar"`, 취소/재시도는
|
|
54
|
+
`role="button"`이다. 진행률 변경은 진행 중인 값이 잦게 바뀌므로 매 tick을
|
|
55
|
+
발표하지 않고(LoadMore의 loading status와 같은 절제) 상태 전이(시작/완료/실패)
|
|
56
|
+
시점에만 announce한다 — tick마다 알리는 정책은 이 계약에 넣지 않는다.
|
|
57
|
+
- Native: `accessibilityState.busy`가 `uploading`에 대응하고, `cancel`/`retry`
|
|
58
|
+
action이 각각 uploading/error에서만 노출된다. `NativeAccessibilityState`
|
|
59
|
+
enum에는 error/success 전용 상태가 없어 `busy` 하나로만 표현하고, 나머지
|
|
60
|
+
구분은 `statusText`의 문장이 맡는다.
|
|
61
|
+
- `stateAxes.content`는 공통 축 `idle | loading | loadingMore | empty | error |
|
|
62
|
+
complete` 중 `idle`(pending), `loading`(uploading), `complete`(success),
|
|
63
|
+
`error`만 쓴다. `loadingMore`와 `empty`는 목록 페이지네이션 개념이라 한 파일의
|
|
64
|
+
상태에는 적용되지 않는다.
|
|
65
|
+
|
|
66
|
+
**검증 화면.** first-party Web·Native renderer와 cancel/retry 상태 테스트는 연결되어
|
|
67
|
+
surface는 `beta`다. 실제 전송 lifecycle을 쓰는 제품 vertical slice는 아직 없으므로
|
|
68
|
+
`stable` 승격 gate는 닫혀 있다.
|
package/docs/utility.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Utility — 새 컴포넌트를 만들지 않는다
|
|
2
|
+
|
|
3
|
+
## 이름이 이미 경고였다
|
|
4
|
+
|
|
5
|
+
"유틸"은 컴포넌트가 아니다. 먼저 antd의 실제 `Util` 페이지가 무엇인지 확인했다(공식
|
|
6
|
+
문서 확인, 아래 출처). antd `Util`은 UI 컴포넌트가 아니라 **`theme.useToken()` 훅으로
|
|
7
|
+
현재 테마의 design token 값을 자신의 커스텀 컴포넌트에서 읽는 방법**을 설명하는 문서
|
|
8
|
+
페이지다.
|
|
9
|
+
|
|
10
|
+
## 판정: 이 패키지 자체가 이미 그 역할이다
|
|
11
|
+
|
|
12
|
+
`useToken()`이 제공하는 것 — 현재 테마의 색·간격·타이포 값을 코드에서 직접 읽는 것 —
|
|
13
|
+
은 이 저장소에서는 **훅이 아니라 이미 export된 상수**로 존재한다: `spacing`, `radius`,
|
|
14
|
+
`typography`, `glyph`, `stroke`, `semanticColors`, `THEMES`(`foundations.ts`,
|
|
15
|
+
`semantic-colors.ts`, `colors.ts`). antd는 이 값들을 Context에 넣고 훅으로 꺼내야 하지만
|
|
16
|
+
(런타임 테마 스위칭이 Context 기반이므로), 이 패키지는 애초에 런타임 의존성이 없어 그
|
|
17
|
+
값들을 정적 module import로 바로 쓴다 — **"컴포넌트에서 토큰 값을 읽는 방법"이라는 antd
|
|
18
|
+
`Util` 페이지의 문제 자체가 이 패키지 구조에서는 발생하지 않는다.**
|
|
19
|
+
|
|
20
|
+
즉 `Utility`라는 이름 아래 모일 실체가 없다:
|
|
21
|
+
|
|
22
|
+
- 새 값 타입 없음 — 토큰은 이미 `foundations.ts`/`semantic-colors.ts`/`colors.ts`에 있다.
|
|
23
|
+
- 새 접근 패턴 없음 — `import { spacing } from "@hjmds/design-contracts"`가 이미 `useToken()`이
|
|
24
|
+
하는 일과 같은 결과를 낸다(테마별 실제 색 resolve는 `resolveColorReference`가 이미
|
|
25
|
+
한다).
|
|
26
|
+
- 새 접근성·상태 축 없음 — 컴포넌트가 아니므로 애초에 대상이 아니다.
|
|
27
|
+
|
|
28
|
+
`ContextPanel`(`docs/context-panel.md`)과 같은 자리다 — crosswalk에 실체가 없는 이름이
|
|
29
|
+
목록에 먼저 올라간 경우.
|
|
30
|
+
|
|
31
|
+
## 결론
|
|
32
|
+
|
|
33
|
+
`src/utility.ts`, `test/utility.test.ts`는 만들지 않는다.
|
|
34
|
+
|
|
35
|
+
## 판정이 뒤집힐 조건
|
|
36
|
+
|
|
37
|
+
antd `Util` 페이지가 이후 실제 유틸리티 함수(단순 토큰 읽기를 넘어서는, 예를 들어 이
|
|
38
|
+
패키지가 아직 갖지 않은 계산 헬퍼)를 추가하고 그중 플랫폼 중립적으로 유용한 것이
|
|
39
|
+
확인되면, 그건 `Utility`라는 이름의 새 컴포넌트가 아니라 **그 헬퍼가 속한 기존 모듈**
|
|
40
|
+
(예: 숫자 관련이면 `number-field.ts`의 `clampToRange`류)에 함수로 추가하는 쪽을 권한다.
|
|
41
|
+
|
|
42
|
+
## 배선 명세 제안 (리드 적용)
|
|
43
|
+
|
|
44
|
+
`ContextPanel`과 같은 방식을 권한다.
|
|
45
|
+
|
|
46
|
+
**(a) 권고: catalog에서 제거.** `src/catalog.ts`의 `{ name: "Utility", category:
|
|
47
|
+
"utility", platform: "web", status: "planned", aliases: ["Util"] }`(`src/catalog.ts:127`)
|
|
48
|
+
행을 지운다. `component-definitions.ts`의 예약 ID는 무해하니 남겨도 된다.
|
|
49
|
+
|
|
50
|
+
**(b) 대안: catalog row 유지 + 이 문서만 링크.**
|
|
51
|
+
|
|
52
|
+
이 저작자 판단은 (a)다 — 대응할 실체가 없는 `planned` 행이 "곧 만들 컴포넌트"로
|
|
53
|
+
오인되는 비용이 검색 편의보다 크다고 봤다(`ContextPanel`과 같은 이유).
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# VirtualList — 계약을 만들지 않는다
|
|
2
|
+
|
|
3
|
+
## 제약
|
|
4
|
+
|
|
5
|
+
`docs/ant-design-coverage.md`의 lifecycle 절이 이미 선언했다 — Ant Design 6.6.1이 기존
|
|
6
|
+
`List`를 deprecated로 두고 `Listy`를 successor로 추가했지만, **HJM은 기존 비가상
|
|
7
|
+
`List`와 planned `VirtualList`를 서로 다른 사용 문제로 유지한다.** 이 문서는 그 선언을
|
|
8
|
+
뒤집지 않는다. 두 catalog row(`List` beta, `VirtualList` planned + `aliases: ["Listy"]`)를
|
|
9
|
+
합치자는 이야기가 아니라, **`VirtualList`가 소유할 계약이 실제로 있는지**를 판정한다.
|
|
10
|
+
|
|
11
|
+
## 판정: 지금은 아무것도 소유하지 않는다
|
|
12
|
+
|
|
13
|
+
가상화가 계약이 되려면 "Web과 Native가 각자 다른 구현 기법으로 같은 결과를 낸다"는
|
|
14
|
+
공통 semantic이 있어야 한다(`docs/architecture.md`의 `adaptive` 정의 그대로). 후보를
|
|
15
|
+
셋으로 나눠 각각 판정했다.
|
|
16
|
+
|
|
17
|
+
### 1. 항목 높이 추정(고정/가변) — 렌더러 기법이다
|
|
18
|
+
|
|
19
|
+
Web windowing 라이브러리(react-window/virtua류)와 RN `FlatList`는 각자의 windowing
|
|
20
|
+
파라미터(`itemSize`/`overscan` vs `getItemLayout`/`windowSize`/`initialNumToRender`)를
|
|
21
|
+
갖지만 이름도, 단위도, 의미도 서로 대응하지 않는다. Slider의 `min`/`max`/`step`처럼
|
|
22
|
+
두 플랫폼이 같은 사용자 의미를 공유하는 것이 아니라, 각 플랫폼의 렌더링 성능 엔진이
|
|
23
|
+
내부적으로 요구하는 힌트일 뿐이다 — 공유할 semantic이 없다.
|
|
24
|
+
|
|
25
|
+
### 2. 스크롤 위치 복원 — 가상화 전용 문제가 아니다
|
|
26
|
+
|
|
27
|
+
가상화하지 않은 평범한 긴 목록도 스크롤 위치 복원이 필요하다(뒤로가기 후 원래 보던
|
|
28
|
+
위치로). 이 문제는 "가상화됐는가"와 독립이고, 스크롤을 소유한 컨테이너/렌더러의 몫이다
|
|
29
|
+
— `VirtualList`라는 이름 아래 있어야 할 이유가 없다.
|
|
30
|
+
|
|
31
|
+
### 3. 총 개수의 낭독 — 실제로는 이미 있거나, 아직 없다
|
|
32
|
+
|
|
33
|
+
가상화된 목록은 DOM/네이티브 뷰 트리에 일부만 마운트되므로 스크린 리더가 전체 개수를
|
|
34
|
+
잘못 알 수 있다는 우려는 진짜다. 그런데 이 문제를 나눠보면:
|
|
35
|
+
|
|
36
|
+
- 전체 데이터가 이미 메모리에 있는 경우(`items.length`를 제품이 이미 안다) — 총
|
|
37
|
+
개수는 이미 알려진 값이고, `aria-setsize`/`aria-posinset`류를 실제 배열 길이로
|
|
38
|
+
채우는 것은 렌더러가 창을 마운트할 때 하는 일이다. 이걸 계산하거나 유도할 판단이
|
|
39
|
+
없다 — Steps/Timeline/Carousel의 `position`/`total`처럼 커서 위치나 유효하지 않은
|
|
40
|
+
조합을 막는 로직이 있는 게 아니라, 그냥 `.length`를 읽는 일이다.
|
|
41
|
+
- 전체 데이터가 아직 로딩 중인 경우(페이지네이션) — 이건 `src/load-more.ts`가 이미
|
|
42
|
+
소유한 문제다. `LoadMoreState`는 의도적으로 `totalCount`를 갖지 않는다 — 모르는
|
|
43
|
+
총합을 지어내는 것이 아무것도 말하지 않는 것보다 나쁘기 때문이다(`idle|loading|
|
|
44
|
+
loadingMore|error|complete` 중 어느 것도 총 개수를 전제하지 않는다). `VirtualList`가
|
|
45
|
+
이 자리에 총 개수 축을 새로 만들면 LoadMore가 이미 내린 판단과 충돌한다.
|
|
46
|
+
|
|
47
|
+
즉 이 문제는 이미 있는 계약(`LoadMore`) 또는 렌더러가 이미 아는 값(`items.length`) 중
|
|
48
|
+
하나로 항상 환원된다 — `VirtualList`가 따로 소유할 몫이 남지 않는다.
|
|
49
|
+
|
|
50
|
+
## 결론
|
|
51
|
+
|
|
52
|
+
측정된 제품 요구도 없다 — 로드맵·메모리 어디에도 "List+LoadMore로는 렌더링 성능이
|
|
53
|
+
부족했다"는 vertical slice 기록이 없다. 야잘알의 긴 목록(팀 순위, 선수 검색 결과)은
|
|
54
|
+
이미 List/ListRow + LoadMore 조합으로 충분히 설계돼 있다.
|
|
55
|
+
|
|
56
|
+
`src/virtual-list.ts`, `test/virtual-list.test.ts`는 만들지 않는다. catalog row(`{ name:
|
|
57
|
+
"VirtualList", category: "data-display", platform: "adaptive", status: "planned",
|
|
58
|
+
aliases: ["Listy"] }`)는 건드리지 않는다 — 이름 자리를 지우자는 것이 아니라, 지금
|
|
59
|
+
채울 계약이 없다는 것이다.
|
|
60
|
+
|
|
61
|
+
## 뒤집힐 조건
|
|
62
|
+
|
|
63
|
+
다음 중 하나가 실제로 측정되면 이 판정을 다시 연다.
|
|
64
|
+
|
|
65
|
+
1. 실제 제품에서 List+LoadMore로 렌더링 성능(프레임 드랍, 초기 마운트 시간)이 측정
|
|
66
|
+
가능하게 부족한 vertical slice가 나온다.
|
|
67
|
+
2. Web과 Native 렌더러가 **같은 이름의 파라미터**로 반응하는 windowing 설정이 두
|
|
68
|
+
플랫폼 모두에서 검증돼, 진짜 공유 semantic이 있다고 판단된다.
|
|
69
|
+
3. 총 개수를 알 수 없는 채로 가상화해야 하는 화면이 나와, `LoadMore`의 "총합을 지어내지
|
|
70
|
+
않는다"는 원칙과 다른 새 발화 규칙이 필요해진다.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Watermark — 계약을 만들지 않는다
|
|
2
|
+
|
|
3
|
+
## 문제로 제기된 것
|
|
4
|
+
|
|
5
|
+
Ant Design `Watermark`는 콘텐츠 위에 반복되는 텍스트/이미지를 덮어 출처나 소유권을
|
|
6
|
+
표시합니다. 이 컴포넌트를 검토하며 나온 관찰은, 유일하게 성립할 수 있는 계약이
|
|
7
|
+
**"덮개가 본문 낭독과 조작을 방해하면 안 된다"**는 것이고, 두 제품에 실제 수요가
|
|
8
|
+
없다면 만들지 않는다는 조건이었습니다.
|
|
9
|
+
|
|
10
|
+
## 판정: 만들지 않는다
|
|
11
|
+
|
|
12
|
+
### 1. 두 React 기반 제품 어디에도 실사용처가 없다
|
|
13
|
+
|
|
14
|
+
`Yajalal RN`(`modules/app-rn/src`)과 `BurnTok`(`apps/web/src`,
|
|
15
|
+
`packages/design-system/src`) 양쪽을 `watermark`로 전수 검색한 결과, 시각적으로 콘텐츠
|
|
16
|
+
위에 반복 마크를 덮는 코드는 없었습니다. 유일한 매치는
|
|
17
|
+
`modules/app-rn/src/features/notification/state.ts:48`의 "seen watermark"로, 이는 "이
|
|
18
|
+
알림까지는 읽음 처리됐다"는 **읽음 커서**를 뜻하는 이름일 뿐 시각적 워터마크와 무관합니다.
|
|
19
|
+
공유 흐름(`LineupRouteScreen.tsx`, `PlayerCompareScreen.tsx`)도 `Share.share({ message })`로
|
|
20
|
+
텍스트만 공유하고, 이미지를 만들어 공유하는 경로 자체가 아직 없습니다.
|
|
21
|
+
|
|
22
|
+
### 2. 같은 개념이 다른 스택에는 있지만, 이 패키지가 서비스하는 층이 아니다
|
|
23
|
+
|
|
24
|
+
Flutter 앱(`modules/app`)에는 실제 시각 워터마크가 있습니다 —
|
|
25
|
+
`modules/app/lib/managers/watermark.manager.dart`, `modules/app/lib/common/sharing/
|
|
26
|
+
app_name_watermark.dart`(공유 이미지에 앱 이름을 얹는 `AppNameWatermark`),
|
|
27
|
+
`player_detail_info.dart`의 등번호 배경 워터마크, `contrast.dart`의
|
|
28
|
+
`watermarkAlphaFor`(배경 명도에 따라 0.08/0.16 알파를 고르는 대비 계산)까지 갖췄습니다.
|
|
29
|
+
이는 "워터마크"라는 제품 개념이 회사 안에 이미 존재한다는 증거이지, **이 패키지가
|
|
30
|
+
계약하는 React/RN 스택**(`docs/architecture.md`: "React, React Native, DOM, Expo import는
|
|
31
|
+
코어에 들어오지 않는다")에서 검증된 vertical slice라는 증거는 아닙니다. Flutter 구현은
|
|
32
|
+
같은 렌더러 경계를 공유하지 않으므로 이 판정의 근거로 세지 않았습니다.
|
|
33
|
+
|
|
34
|
+
### 3. 유일하게 유효한 계약은 이미 있는 원칙의 적용일 뿐, 새 상태 축이 아니다
|
|
35
|
+
|
|
36
|
+
`Icon`(`src/icon.ts`)과 `Image`(`src/image.ts`)가 이미 decorative/informative
|
|
37
|
+
discriminated union으로 "장식용 콘텐츠는 접근성 트리에서 빠지고 상호작용을 가로채지
|
|
38
|
+
않는다"는 원칙을 확립해 두었습니다. 반복 마크가 본문 낭독·조작을 방해하면 안 된다는
|
|
39
|
+
관찰은 이 원칙을 "화면 전체를 덮는 장식 레이어"에 적용한 것일 뿐, Watermark만의 새
|
|
40
|
+
상태 축이나 접근성 개념이 아닙니다. 타일 밀도, 회전 각도, 캔버스/SVG 렌더링 방식은
|
|
41
|
+
"이 패키지의 층에 속하는가" 질문에서 렌더러의 몫입니다 — 플랫폼 중립 계약이 검증할 수
|
|
42
|
+
있는 입력이 없습니다.
|
|
43
|
+
|
|
44
|
+
## 만들지 않은 것
|
|
45
|
+
|
|
46
|
+
`src/watermark.ts`, `test/watermark.test.ts`는 없습니다.
|
|
47
|
+
`componentCatalog`의 `{ name: "Watermark", category: "feedback", platform: "web",
|
|
48
|
+
status: "planned" }` 행과 crosswalk의 `Watermark → Watermark` direct 관계
|
|
49
|
+
(`src/component-references.ts:123`)는 건드리지 않습니다.
|
|
50
|
+
|
|
51
|
+
## 뒤집힐 조건
|
|
52
|
+
|
|
53
|
+
1. BurnTok 또는 Yajalal RN에 실제 이미지 워터마크 요구(스크린샷 유출 방지, 공유 이미지에
|
|
54
|
+
앱 마크 삽입 등)가 나타나는 vertical slice가 측정된다.
|
|
55
|
+
2. 그 슬라이스에서 "decorative overlay는 낭독·조작을 가로채지 않는다"는 기존 원칙 이상의
|
|
56
|
+
새 규칙(예: 워터마크 밀도가 본문 대비 요건과 충돌해 별도 최소 명도 대비 계산이
|
|
57
|
+
필요한 경우 — Flutter의 `watermarkAlphaFor`가 이미 이런 계산의 선례이니 이식 여부를
|
|
58
|
+
먼저 검토)이 필요해진다.
|
package/package.json
ADDED
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hjmds/design-contracts",
|
|
3
|
+
"version": "0.8.2",
|
|
4
|
+
"description": "Renderer-neutral design contracts, tokens, recipes, and behaviors shared by HJM products.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/jim1286/hjm-design-system.git",
|
|
8
|
+
"directory": "packages/design-contracts"
|
|
9
|
+
},
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"sideEffects": false,
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"react-native": "./dist/index.js",
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./tokens": {
|
|
25
|
+
"types": "./dist/tokens.d.ts",
|
|
26
|
+
"react-native": "./dist/tokens.js",
|
|
27
|
+
"import": "./dist/tokens.js",
|
|
28
|
+
"default": "./dist/tokens.js"
|
|
29
|
+
},
|
|
30
|
+
"./foundations": {
|
|
31
|
+
"types": "./dist/foundations.d.ts",
|
|
32
|
+
"react-native": "./dist/foundations.js",
|
|
33
|
+
"import": "./dist/foundations.js",
|
|
34
|
+
"default": "./dist/foundations.js"
|
|
35
|
+
},
|
|
36
|
+
"./colors": {
|
|
37
|
+
"types": "./dist/colors.d.ts",
|
|
38
|
+
"react-native": "./dist/colors.js",
|
|
39
|
+
"import": "./dist/colors.js",
|
|
40
|
+
"default": "./dist/colors.js"
|
|
41
|
+
},
|
|
42
|
+
"./color-references": {
|
|
43
|
+
"types": "./dist/color-references.d.ts",
|
|
44
|
+
"react-native": "./dist/color-references.js",
|
|
45
|
+
"import": "./dist/color-references.js",
|
|
46
|
+
"default": "./dist/color-references.js"
|
|
47
|
+
},
|
|
48
|
+
"./responsive": {
|
|
49
|
+
"types": "./dist/responsive.d.ts",
|
|
50
|
+
"react-native": "./dist/responsive.js",
|
|
51
|
+
"import": "./dist/responsive.js",
|
|
52
|
+
"default": "./dist/responsive.js"
|
|
53
|
+
},
|
|
54
|
+
"./grid": {
|
|
55
|
+
"types": "./dist/grid.d.ts",
|
|
56
|
+
"react-native": "./dist/grid.js",
|
|
57
|
+
"import": "./dist/grid.js",
|
|
58
|
+
"default": "./dist/grid.js"
|
|
59
|
+
},
|
|
60
|
+
"./recipes": {
|
|
61
|
+
"types": "./dist/component-recipes.d.ts",
|
|
62
|
+
"react-native": "./dist/component-recipes.js",
|
|
63
|
+
"import": "./dist/component-recipes.js",
|
|
64
|
+
"default": "./dist/component-recipes.js"
|
|
65
|
+
},
|
|
66
|
+
"./recipes/base": {
|
|
67
|
+
"types": "./dist/base-recipes.d.ts",
|
|
68
|
+
"react-native": "./dist/base-recipes.js",
|
|
69
|
+
"import": "./dist/base-recipes.js",
|
|
70
|
+
"default": "./dist/base-recipes.js"
|
|
71
|
+
},
|
|
72
|
+
"./recipes/all": {
|
|
73
|
+
"types": "./dist/recipes.d.ts",
|
|
74
|
+
"react-native": "./dist/recipes.js",
|
|
75
|
+
"import": "./dist/recipes.js",
|
|
76
|
+
"default": "./dist/recipes.js"
|
|
77
|
+
},
|
|
78
|
+
"./behaviors": {
|
|
79
|
+
"types": "./dist/behaviors.d.ts",
|
|
80
|
+
"react-native": "./dist/behaviors.js",
|
|
81
|
+
"import": "./dist/behaviors.js",
|
|
82
|
+
"default": "./dist/behaviors.js"
|
|
83
|
+
},
|
|
84
|
+
"./contracts": {
|
|
85
|
+
"types": "./dist/component-contracts.d.ts",
|
|
86
|
+
"react-native": "./dist/component-contracts.js",
|
|
87
|
+
"import": "./dist/component-contracts.js",
|
|
88
|
+
"default": "./dist/component-contracts.js"
|
|
89
|
+
},
|
|
90
|
+
"./catalog": {
|
|
91
|
+
"types": "./dist/catalog.d.ts",
|
|
92
|
+
"react-native": "./dist/catalog.js",
|
|
93
|
+
"import": "./dist/catalog.js",
|
|
94
|
+
"default": "./dist/catalog.js"
|
|
95
|
+
},
|
|
96
|
+
"./evidence": {
|
|
97
|
+
"types": "./dist/evidence.d.ts",
|
|
98
|
+
"react-native": "./dist/evidence.js",
|
|
99
|
+
"import": "./dist/evidence.js",
|
|
100
|
+
"default": "./dist/evidence.js"
|
|
101
|
+
},
|
|
102
|
+
"./version": {
|
|
103
|
+
"types": "./dist/version.d.ts",
|
|
104
|
+
"react-native": "./dist/version.js",
|
|
105
|
+
"import": "./dist/version.js",
|
|
106
|
+
"default": "./dist/version.js"
|
|
107
|
+
},
|
|
108
|
+
"./manifest.json": {
|
|
109
|
+
"default": "./docs/generated/showcase-manifest.json"
|
|
110
|
+
},
|
|
111
|
+
"./renderer-evidence.json": {
|
|
112
|
+
"default": "./docs/generated/renderer-evidence.json"
|
|
113
|
+
},
|
|
114
|
+
"./components/alert-dialog": {
|
|
115
|
+
"types": "./dist/alert-dialog.d.ts",
|
|
116
|
+
"react-native": "./dist/alert-dialog.js",
|
|
117
|
+
"import": "./dist/alert-dialog.js",
|
|
118
|
+
"default": "./dist/alert-dialog.js"
|
|
119
|
+
},
|
|
120
|
+
"./components/bottom-navigation": {
|
|
121
|
+
"types": "./dist/bottom-navigation.d.ts",
|
|
122
|
+
"react-native": "./dist/bottom-navigation.js",
|
|
123
|
+
"import": "./dist/bottom-navigation.js",
|
|
124
|
+
"default": "./dist/bottom-navigation.js"
|
|
125
|
+
},
|
|
126
|
+
"./components/breadcrumb": {
|
|
127
|
+
"types": "./dist/breadcrumb.d.ts",
|
|
128
|
+
"react-native": "./dist/breadcrumb.js",
|
|
129
|
+
"import": "./dist/breadcrumb.js",
|
|
130
|
+
"default": "./dist/breadcrumb.js"
|
|
131
|
+
},
|
|
132
|
+
"./components/calendar": {
|
|
133
|
+
"types": "./dist/calendar.d.ts",
|
|
134
|
+
"react-native": "./dist/calendar.js",
|
|
135
|
+
"import": "./dist/calendar.js",
|
|
136
|
+
"default": "./dist/calendar.js"
|
|
137
|
+
},
|
|
138
|
+
"./components/card": {
|
|
139
|
+
"types": "./dist/card.d.ts",
|
|
140
|
+
"react-native": "./dist/card.js",
|
|
141
|
+
"import": "./dist/card.js",
|
|
142
|
+
"default": "./dist/card.js"
|
|
143
|
+
},
|
|
144
|
+
"./components/carousel": {
|
|
145
|
+
"types": "./dist/carousel.d.ts",
|
|
146
|
+
"react-native": "./dist/carousel.js",
|
|
147
|
+
"import": "./dist/carousel.js",
|
|
148
|
+
"default": "./dist/carousel.js"
|
|
149
|
+
},
|
|
150
|
+
"./components/collection": {
|
|
151
|
+
"types": "./dist/collection.d.ts",
|
|
152
|
+
"react-native": "./dist/collection.js",
|
|
153
|
+
"import": "./dist/collection.js",
|
|
154
|
+
"default": "./dist/collection.js"
|
|
155
|
+
},
|
|
156
|
+
"./components/command-palette": {
|
|
157
|
+
"types": "./dist/command-palette.d.ts",
|
|
158
|
+
"react-native": "./dist/command-palette.js",
|
|
159
|
+
"import": "./dist/command-palette.js",
|
|
160
|
+
"default": "./dist/command-palette.js"
|
|
161
|
+
},
|
|
162
|
+
"./components/content-state": {
|
|
163
|
+
"types": "./dist/content-state.d.ts",
|
|
164
|
+
"react-native": "./dist/content-state.js",
|
|
165
|
+
"import": "./dist/content-state.js",
|
|
166
|
+
"default": "./dist/content-state.js"
|
|
167
|
+
},
|
|
168
|
+
"./components/data-table": {
|
|
169
|
+
"types": "./dist/data-table.d.ts",
|
|
170
|
+
"react-native": "./dist/data-table.js",
|
|
171
|
+
"import": "./dist/data-table.js",
|
|
172
|
+
"default": "./dist/data-table.js"
|
|
173
|
+
},
|
|
174
|
+
"./components/date-picker": {
|
|
175
|
+
"types": "./dist/date-picker.d.ts",
|
|
176
|
+
"react-native": "./dist/date-picker.js",
|
|
177
|
+
"import": "./dist/date-picker.js",
|
|
178
|
+
"default": "./dist/date-picker.js"
|
|
179
|
+
},
|
|
180
|
+
"./components/description-list": {
|
|
181
|
+
"types": "./dist/description-list.d.ts",
|
|
182
|
+
"react-native": "./dist/description-list.js",
|
|
183
|
+
"import": "./dist/description-list.js",
|
|
184
|
+
"default": "./dist/description-list.js"
|
|
185
|
+
},
|
|
186
|
+
"./components/design-system-provider": {
|
|
187
|
+
"types": "./dist/design-system-provider.d.ts",
|
|
188
|
+
"react-native": "./dist/design-system-provider.js",
|
|
189
|
+
"import": "./dist/design-system-provider.js",
|
|
190
|
+
"default": "./dist/design-system-provider.js"
|
|
191
|
+
},
|
|
192
|
+
"./components/file-picker": {
|
|
193
|
+
"types": "./dist/file-picker.d.ts",
|
|
194
|
+
"react-native": "./dist/file-picker.js",
|
|
195
|
+
"import": "./dist/file-picker.js",
|
|
196
|
+
"default": "./dist/file-picker.js"
|
|
197
|
+
},
|
|
198
|
+
"./components/floating-action-button": {
|
|
199
|
+
"types": "./dist/floating-action-button.d.ts",
|
|
200
|
+
"react-native": "./dist/floating-action-button.js",
|
|
201
|
+
"import": "./dist/floating-action-button.js",
|
|
202
|
+
"default": "./dist/floating-action-button.js"
|
|
203
|
+
},
|
|
204
|
+
"./components/form": {
|
|
205
|
+
"types": "./dist/form.d.ts",
|
|
206
|
+
"react-native": "./dist/form.js",
|
|
207
|
+
"import": "./dist/form.js",
|
|
208
|
+
"default": "./dist/form.js"
|
|
209
|
+
},
|
|
210
|
+
"./components/icon": {
|
|
211
|
+
"types": "./dist/icon.d.ts",
|
|
212
|
+
"react-native": "./dist/icon.js",
|
|
213
|
+
"import": "./dist/icon.js",
|
|
214
|
+
"default": "./dist/icon.js"
|
|
215
|
+
},
|
|
216
|
+
"./components/image": {
|
|
217
|
+
"types": "./dist/image.d.ts",
|
|
218
|
+
"react-native": "./dist/image.js",
|
|
219
|
+
"import": "./dist/image.js",
|
|
220
|
+
"default": "./dist/image.js"
|
|
221
|
+
},
|
|
222
|
+
"./components/layout": {
|
|
223
|
+
"types": "./dist/layout.d.ts",
|
|
224
|
+
"react-native": "./dist/layout.js",
|
|
225
|
+
"import": "./dist/layout.js",
|
|
226
|
+
"default": "./dist/layout.js"
|
|
227
|
+
},
|
|
228
|
+
"./components/link": {
|
|
229
|
+
"types": "./dist/link.d.ts",
|
|
230
|
+
"react-native": "./dist/link.js",
|
|
231
|
+
"import": "./dist/link.js",
|
|
232
|
+
"default": "./dist/link.js"
|
|
233
|
+
},
|
|
234
|
+
"./components/load-more": {
|
|
235
|
+
"types": "./dist/load-more.d.ts",
|
|
236
|
+
"react-native": "./dist/load-more.js",
|
|
237
|
+
"import": "./dist/load-more.js",
|
|
238
|
+
"default": "./dist/load-more.js"
|
|
239
|
+
},
|
|
240
|
+
"./components/mentions": {
|
|
241
|
+
"types": "./dist/mentions.d.ts",
|
|
242
|
+
"react-native": "./dist/mentions.js",
|
|
243
|
+
"import": "./dist/mentions.js",
|
|
244
|
+
"default": "./dist/mentions.js"
|
|
245
|
+
},
|
|
246
|
+
"./components/number-field": {
|
|
247
|
+
"types": "./dist/number-field.d.ts",
|
|
248
|
+
"react-native": "./dist/number-field.js",
|
|
249
|
+
"import": "./dist/number-field.js",
|
|
250
|
+
"default": "./dist/number-field.js"
|
|
251
|
+
},
|
|
252
|
+
"./components/otp-field": {
|
|
253
|
+
"types": "./dist/otp-field.d.ts",
|
|
254
|
+
"react-native": "./dist/otp-field.js",
|
|
255
|
+
"import": "./dist/otp-field.js",
|
|
256
|
+
"default": "./dist/otp-field.js"
|
|
257
|
+
},
|
|
258
|
+
"./components/pagination": {
|
|
259
|
+
"types": "./dist/pagination.d.ts",
|
|
260
|
+
"react-native": "./dist/pagination.js",
|
|
261
|
+
"import": "./dist/pagination.js",
|
|
262
|
+
"default": "./dist/pagination.js"
|
|
263
|
+
},
|
|
264
|
+
"./components/password-field": {
|
|
265
|
+
"types": "./dist/password-field.d.ts",
|
|
266
|
+
"react-native": "./dist/password-field.js",
|
|
267
|
+
"import": "./dist/password-field.js",
|
|
268
|
+
"default": "./dist/password-field.js"
|
|
269
|
+
},
|
|
270
|
+
"./components/popover": {
|
|
271
|
+
"types": "./dist/popover.d.ts",
|
|
272
|
+
"react-native": "./dist/popover.js",
|
|
273
|
+
"import": "./dist/popover.js",
|
|
274
|
+
"default": "./dist/popover.js"
|
|
275
|
+
},
|
|
276
|
+
"./components/result": {
|
|
277
|
+
"types": "./dist/result.d.ts",
|
|
278
|
+
"react-native": "./dist/result.js",
|
|
279
|
+
"import": "./dist/result.js",
|
|
280
|
+
"default": "./dist/result.js"
|
|
281
|
+
},
|
|
282
|
+
"./components/sheet": {
|
|
283
|
+
"types": "./dist/sheet.d.ts",
|
|
284
|
+
"react-native": "./dist/sheet.js",
|
|
285
|
+
"import": "./dist/sheet.js",
|
|
286
|
+
"default": "./dist/sheet.js"
|
|
287
|
+
},
|
|
288
|
+
"./components/side-panel": {
|
|
289
|
+
"types": "./dist/side-panel.d.ts",
|
|
290
|
+
"react-native": "./dist/side-panel.js",
|
|
291
|
+
"import": "./dist/side-panel.js",
|
|
292
|
+
"default": "./dist/side-panel.js"
|
|
293
|
+
},
|
|
294
|
+
"./components/slider": {
|
|
295
|
+
"types": "./dist/slider.d.ts",
|
|
296
|
+
"react-native": "./dist/slider.js",
|
|
297
|
+
"import": "./dist/slider.js",
|
|
298
|
+
"default": "./dist/slider.js"
|
|
299
|
+
},
|
|
300
|
+
"./components/splitter": {
|
|
301
|
+
"types": "./dist/splitter.d.ts",
|
|
302
|
+
"react-native": "./dist/splitter.js",
|
|
303
|
+
"import": "./dist/splitter.js",
|
|
304
|
+
"default": "./dist/splitter.js"
|
|
305
|
+
},
|
|
306
|
+
"./components/statistic": {
|
|
307
|
+
"types": "./dist/statistic.d.ts",
|
|
308
|
+
"react-native": "./dist/statistic.js",
|
|
309
|
+
"import": "./dist/statistic.js",
|
|
310
|
+
"default": "./dist/statistic.js"
|
|
311
|
+
},
|
|
312
|
+
"./components/steps": {
|
|
313
|
+
"types": "./dist/steps.d.ts",
|
|
314
|
+
"react-native": "./dist/steps.js",
|
|
315
|
+
"import": "./dist/steps.js",
|
|
316
|
+
"default": "./dist/steps.js"
|
|
317
|
+
},
|
|
318
|
+
"./components/tag": {
|
|
319
|
+
"types": "./dist/tag.d.ts",
|
|
320
|
+
"react-native": "./dist/tag.js",
|
|
321
|
+
"import": "./dist/tag.js",
|
|
322
|
+
"default": "./dist/tag.js"
|
|
323
|
+
},
|
|
324
|
+
"./components/timeline": {
|
|
325
|
+
"types": "./dist/timeline.d.ts",
|
|
326
|
+
"react-native": "./dist/timeline.js",
|
|
327
|
+
"import": "./dist/timeline.js",
|
|
328
|
+
"default": "./dist/timeline.js"
|
|
329
|
+
},
|
|
330
|
+
"./components/toast": {
|
|
331
|
+
"types": "./dist/toast.d.ts",
|
|
332
|
+
"react-native": "./dist/toast.js",
|
|
333
|
+
"import": "./dist/toast.js",
|
|
334
|
+
"default": "./dist/toast.js"
|
|
335
|
+
},
|
|
336
|
+
"./components/tooltip": {
|
|
337
|
+
"types": "./dist/tooltip.d.ts",
|
|
338
|
+
"react-native": "./dist/tooltip.js",
|
|
339
|
+
"import": "./dist/tooltip.js",
|
|
340
|
+
"default": "./dist/tooltip.js"
|
|
341
|
+
},
|
|
342
|
+
"./components/tour": {
|
|
343
|
+
"types": "./dist/tour.d.ts",
|
|
344
|
+
"react-native": "./dist/tour.js",
|
|
345
|
+
"import": "./dist/tour.js",
|
|
346
|
+
"default": "./dist/tour.js"
|
|
347
|
+
},
|
|
348
|
+
"./components/transfer-list": {
|
|
349
|
+
"types": "./dist/transfer-list.d.ts",
|
|
350
|
+
"react-native": "./dist/transfer-list.js",
|
|
351
|
+
"import": "./dist/transfer-list.js",
|
|
352
|
+
"default": "./dist/transfer-list.js"
|
|
353
|
+
},
|
|
354
|
+
"./components/tree": {
|
|
355
|
+
"types": "./dist/tree.d.ts",
|
|
356
|
+
"react-native": "./dist/tree.js",
|
|
357
|
+
"import": "./dist/tree.js",
|
|
358
|
+
"default": "./dist/tree.js"
|
|
359
|
+
},
|
|
360
|
+
"./components/tree-select": {
|
|
361
|
+
"types": "./dist/tree-select.d.ts",
|
|
362
|
+
"react-native": "./dist/tree-select.js",
|
|
363
|
+
"import": "./dist/tree-select.js",
|
|
364
|
+
"default": "./dist/tree-select.js"
|
|
365
|
+
},
|
|
366
|
+
"./components/upload-item": {
|
|
367
|
+
"types": "./dist/upload-item.d.ts",
|
|
368
|
+
"react-native": "./dist/upload-item.js",
|
|
369
|
+
"import": "./dist/upload-item.js",
|
|
370
|
+
"default": "./dist/upload-item.js"
|
|
371
|
+
},
|
|
372
|
+
"./showcase": {
|
|
373
|
+
"types": "./dist/showcase.d.ts",
|
|
374
|
+
"react-native": "./dist/showcase.js",
|
|
375
|
+
"import": "./dist/showcase.js",
|
|
376
|
+
"default": "./dist/showcase.js"
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
"files": [
|
|
380
|
+
"dist",
|
|
381
|
+
"docs",
|
|
382
|
+
"README.md"
|
|
383
|
+
],
|
|
384
|
+
"engines": {
|
|
385
|
+
"node": ">=20"
|
|
386
|
+
},
|
|
387
|
+
"devDependencies": {
|
|
388
|
+
"@types/node": "^24.0.0",
|
|
389
|
+
"typescript": "^5.9.3",
|
|
390
|
+
"vitest": "^4.1.10"
|
|
391
|
+
},
|
|
392
|
+
"scripts": {
|
|
393
|
+
"build": "tsc -p tsconfig.build.json",
|
|
394
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
395
|
+
"test": "vitest run",
|
|
396
|
+
"check": "pnpm typecheck && pnpm test && pnpm build && pnpm contracts:check && pnpm bundle:check",
|
|
397
|
+
"contracts:sync": "pnpm build && node scripts/sync-contract-artifacts.mjs --write",
|
|
398
|
+
"contracts:check": "node scripts/sync-contract-artifacts.mjs",
|
|
399
|
+
"bundle:check": "node scripts/check-bundle-budget.mjs",
|
|
400
|
+
"reference:antd:verify": "node scripts/verify-antd-reference.mjs"
|
|
401
|
+
}
|
|
402
|
+
}
|