@hjmds/design-contracts 1.18.0 โ 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action-session.d.ts +16 -0
- package/dist/action-session.d.ts.map +1 -1
- package/dist/action-session.js +18 -0
- package/dist/action-session.js.map +1 -1
- package/dist/behaviors.d.ts +8 -6
- package/dist/behaviors.d.ts.map +1 -1
- package/dist/behaviors.js +4 -3
- package/dist/behaviors.js.map +1 -1
- package/dist/bottom-navigation.d.ts +14 -0
- package/dist/bottom-navigation.d.ts.map +1 -1
- package/dist/bottom-navigation.js +21 -0
- package/dist/bottom-navigation.js.map +1 -1
- package/dist/carousel.d.ts +3 -0
- package/dist/carousel.d.ts.map +1 -1
- package/dist/carousel.js.map +1 -1
- package/dist/catalog.d.ts +61 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/component-recipes.d.ts +67 -0
- package/dist/component-recipes.d.ts.map +1 -1
- package/dist/component-recipes.js +27 -1
- package/dist/component-recipes.js.map +1 -1
- package/dist/field-group.d.ts +14 -0
- package/dist/field-group.d.ts.map +1 -1
- package/dist/field-group.js +9 -0
- package/dist/field-group.js.map +1 -1
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +10 -3
- package/dist/form.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/screen-patterns.d.ts +4 -0
- package/dist/screen-patterns.d.ts.map +1 -1
- package/dist/screen-patterns.js +12 -3
- package/dist/screen-patterns.js.map +1 -1
- package/dist/semantic-colors.d.ts +9 -0
- package/dist/semantic-colors.d.ts.map +1 -1
- package/dist/semantic-colors.js +5 -0
- package/dist/semantic-colors.js.map +1 -1
- package/dist/toast.d.ts +10 -1
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +43 -2
- package/dist/toast.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/docs/action-session.md +2 -0
- package/docs/asset.md +7 -0
- package/docs/bottom-navigation.md +22 -0
- package/docs/brand-boundary.md +3 -3
- package/docs/collection-rail.md +4 -0
- package/docs/compound-controls.md +8 -3
- package/docs/consumer-policy.md +39 -120
- package/docs/generated/component-maturity.md +1 -1
- package/docs/generated/renderer-evidence.json +3 -3
- package/docs/generated/renderer-evidence.md +1 -1
- package/docs/generated/showcase-manifest.json +1 -1
- package/docs/gravity-letters.md +2 -0
- package/docs/grid-reveal.md +2 -0
- package/docs/layout.md +2 -2
- package/docs/load-more.md +5 -0
- package/docs/migration-native-legacy-removal.md +30 -17
- package/docs/optional-adapters.md +4 -0
- package/docs/screen-patterns.md +23 -1
- package/docs/toast.md +41 -2
- package/docs/usage/README.md +248 -245
- package/docs/usage/SELECTION.md +43 -0
- package/docs/usage/STANDARD.md +22 -10
- package/docs/usage/components/accordion.md +5 -3
- package/docs/usage/components/agreement.md +6 -9
- package/docs/usage/components/alert-dialog.md +12 -6
- package/docs/usage/components/asset.md +10 -4
- package/docs/usage/components/auth-provider-button.md +2 -2
- package/docs/usage/components/avatar.md +8 -6
- package/docs/usage/components/badge.md +4 -4
- package/docs/usage/components/bottom-cta.md +4 -4
- package/docs/usage/components/bottom-info.md +2 -2
- package/docs/usage/components/bottom-navigation.md +30 -6
- package/docs/usage/components/button.md +2 -2
- package/docs/usage/components/card.md +1 -1
- package/docs/usage/components/carousel.md +12 -4
- package/docs/usage/components/chat-message.md +6 -2
- package/docs/usage/components/chat-screen.md +5 -5
- package/docs/usage/components/checkbox-group.md +1 -1
- package/docs/usage/components/checkbox.md +2 -2
- package/docs/usage/components/chip.md +2 -2
- package/docs/usage/components/code-block.md +3 -4
- package/docs/usage/components/collapsible.md +6 -4
- package/docs/usage/components/combobox.md +2 -2
- package/docs/usage/components/command-palette.md +1 -1
- package/docs/usage/components/comment-thread-screen.md +7 -4
- package/docs/usage/components/container.md +1 -1
- package/docs/usage/components/content-transition.md +2 -2
- package/docs/usage/components/context-menu.md +2 -2
- package/docs/usage/components/counter-badge.md +3 -3
- package/docs/usage/components/data-table.md +1 -1
- package/docs/usage/components/date-picker.md +4 -4
- package/docs/usage/components/description-list.md +3 -3
- package/docs/usage/components/design-system-provider.md +2 -2
- package/docs/usage/components/dialog.md +14 -3
- package/docs/usage/components/divider.md +2 -2
- package/docs/usage/components/editor-screen.md +5 -3
- package/docs/usage/components/effect-surface.md +1 -1
- package/docs/usage/components/empty-state.md +6 -6
- package/docs/usage/components/field.md +5 -3
- package/docs/usage/components/file-picker.md +6 -3
- package/docs/usage/components/form.md +1 -1
- package/docs/usage/components/heading.md +3 -3
- package/docs/usage/components/icon-button.md +3 -3
- package/docs/usage/components/icon.md +1 -1
- package/docs/usage/components/image.md +5 -4
- package/docs/usage/components/keyboard-dock.md +1 -1
- package/docs/usage/components/layout.md +1 -1
- package/docs/usage/components/link.md +2 -2
- package/docs/usage/components/list-detail-screen.md +6 -6
- package/docs/usage/components/list-row.md +13 -4
- package/docs/usage/components/list.md +5 -4
- package/docs/usage/components/masonry.md +2 -1
- package/docs/usage/components/media-selection-screen.md +11 -5
- package/docs/usage/components/mentions.md +2 -2
- package/docs/usage/components/menu.md +3 -2
- package/docs/usage/components/menubar.md +2 -2
- package/docs/usage/components/message-composer.md +3 -3
- package/docs/usage/components/moderation-screen.md +3 -2
- package/docs/usage/components/notice.md +2 -2
- package/docs/usage/components/notification-inbox-screen.md +1 -1
- package/docs/usage/components/notification-item.md +2 -2
- package/docs/usage/components/number-field.md +3 -3
- package/docs/usage/components/otp-field.md +1 -1
- package/docs/usage/components/overview-screen.md +1 -1
- package/docs/usage/components/permission-screen.md +1 -1
- package/docs/usage/components/photo-source-sheet.md +1 -1
- package/docs/usage/components/popover.md +2 -2
- package/docs/usage/components/profile-screen.md +1 -1
- package/docs/usage/components/progress.md +2 -2
- package/docs/usage/components/qr-code.md +2 -2
- package/docs/usage/components/radio-group.md +1 -2
- package/docs/usage/components/radio.md +1 -2
- package/docs/usage/components/result.md +1 -1
- package/docs/usage/components/saved-items-screen.md +4 -2
- package/docs/usage/components/screen-layout.md +4 -3
- package/docs/usage/components/search-field.md +1 -1
- package/docs/usage/components/search-screen.md +4 -4
- package/docs/usage/components/section.md +3 -3
- package/docs/usage/components/segmented-control.md +4 -4
- package/docs/usage/components/select.md +2 -3
- package/docs/usage/components/settings-screen.md +11 -49
- package/docs/usage/components/sheet.md +10 -5
- package/docs/usage/components/sidebar.md +1 -1
- package/docs/usage/components/skeleton.md +1 -1
- package/docs/usage/components/skip-nav.md +1 -1
- package/docs/usage/components/slider.md +2 -2
- package/docs/usage/components/spinner.md +2 -2
- package/docs/usage/components/splitter.md +1 -1
- package/docs/usage/components/statistic.md +5 -4
- package/docs/usage/components/steps.md +2 -2
- package/docs/usage/components/surface.md +2 -3
- package/docs/usage/components/switch.md +1 -1
- package/docs/usage/components/tabs.md +4 -4
- package/docs/usage/components/tag.md +2 -2
- package/docs/usage/components/tags-input.md +4 -4
- package/docs/usage/components/text-area.md +2 -3
- package/docs/usage/components/text.md +85 -4
- package/docs/usage/components/timeline.md +2 -2
- package/docs/usage/components/toast.md +17 -7
- package/docs/usage/components/toggle-group.md +3 -3
- package/docs/usage/components/tooltip.md +1 -1
- package/docs/usage/components/top-bar.md +5 -4
- package/docs/usage/components/top.md +3 -3
- package/docs/usage/components/transfer-list.md +5 -4
- package/docs/usage/components/upload-item.md +3 -3
- package/docs/usage/components/virtual-list.md +1 -0
- package/docs/usage/compositions/action-feedback.md +42 -6
- package/docs/usage/compositions/action-recovery-optimistic.md +6 -1
- package/docs/usage/compositions/action-recovery-save.md +19 -23
- package/docs/usage/compositions/action-recovery-undo.md +6 -1
- package/docs/usage/compositions/activity-status.md +11 -5
- package/docs/usage/compositions/collection-detail.md +2 -0
- package/docs/usage/compositions/command-records.md +15 -5
- package/docs/usage/compositions/common-message.md +4 -2
- package/docs/usage/compositions/common-notification.md +5 -3
- package/docs/usage/compositions/compound-controls.md +13 -5
- package/docs/usage/compositions/content-transition-comparison.md +2 -2
- package/docs/usage/compositions/date-entry.md +10 -5
- package/docs/usage/compositions/date-time-selection.md +3 -3
- package/docs/usage/compositions/design-profile-comparison.md +7 -5
- package/docs/usage/compositions/disclosure.md +1 -1
- package/docs/usage/compositions/document-resource.md +10 -3
- package/docs/usage/compositions/expo-interactions.md +3 -2
- package/docs/usage/compositions/family-drawer.md +9 -4
- package/docs/usage/compositions/field-group.md +7 -1
- package/docs/usage/compositions/floating-action-button.md +18 -18
- package/docs/usage/compositions/illustrated-outcome.md +3 -2
- package/docs/usage/compositions/input-sheet.md +6 -2
- package/docs/usage/compositions/interaction-adapters.md +1 -1
- package/docs/usage/compositions/interaction-flow-apply.md +6 -3
- package/docs/usage/compositions/interaction-flow-draft.md +5 -2
- package/docs/usage/compositions/interaction-flow-search.md +5 -2
- package/docs/usage/compositions/live-list.md +7 -5
- package/docs/usage/compositions/navigation-bar-collection.md +8 -7
- package/docs/usage/compositions/optional-adapters.md +1 -1
- package/docs/usage/compositions/origin-dialog.md +5 -5
- package/docs/usage/compositions/paper-surface.md +1 -1
- package/docs/usage/compositions/photo-source.md +1 -1
- package/docs/usage/compositions/purpose-input-comment.md +5 -3
- package/docs/usage/compositions/purpose-input-message.md +5 -3
- package/docs/usage/compositions/reference-first.md +63 -42
- package/docs/usage/compositions/reference-review.md +60 -50
- package/docs/usage/compositions/reference-settings.md +60 -50
- package/docs/usage/compositions/selection-scope.md +48 -35
- package/docs/usage/compositions/stea-order-progress.md +1 -0
- package/docs/usage/compositions/stea-otp-verify.md +5 -3
- package/docs/usage/compositions/stea-pixel-empty.md +3 -3
- package/docs/usage/compositions/time-selection.md +6 -5
- package/docs/usage/compositions/upload-recovery.md +10 -1
- package/docs/usage/compositions/video-dialog.md +10 -3
- package/docs/usage/compositions/web-additions.md +5 -5
- package/docs/usage/compositions/web-navigation.md +1 -1
- package/docs/usage/screens/common-chat.md +21 -8
- package/docs/usage/screens/common-comments.md +13 -1
- package/docs/usage/screens/common-inbox.md +19 -6
- package/docs/usage/screens/common-login.md +19 -7
- package/docs/usage/screens/common-profile.md +22 -9
- package/docs/usage/screens/common-saved.md +16 -2
- package/docs/usage/screens/common-search.md +24 -4
- package/docs/usage/screens/common-settings.md +22 -50
- package/docs/usage/screens/common-shell.md +14 -2
- package/docs/usage/screens/dashboard.md +52 -109
- package/docs/usage/screens/discovery-gallery.md +57 -148
- package/docs/usage/screens/flow-collection.md +38 -9
- package/docs/usage/screens/flow-editor.md +25 -7
- package/docs/usage/screens/flow-media.md +23 -7
- package/docs/usage/screens/flow-moderation.md +15 -2
- package/docs/usage/screens/flow-onboarding.md +3 -3
- package/docs/usage/screens/flow-permission.md +17 -3
- package/docs/usage/screens/landing.md +37 -20
- package/docs/usage/screens/mockup-studio.md +22 -7
- package/docs/usage/screens/notification-settings.md +18 -4
- package/docs/usage/screens/product-bento.md +18 -9
- package/docs/usage/screens/reference-comparison.md +29 -10
- package/docs/usage/tokens/color.md +6 -3
- package/docs/usage/tokens/elevation-opacity.md +4 -2
- package/docs/usage/tokens/font-roles.md +2 -2
- package/docs/usage/tokens/layers.md +3 -3
- package/docs/usage/tokens/motion.md +2 -2
- package/docs/usage/tokens/radius.md +4 -2
- package/docs/usage/tokens/spacing.md +3 -3
- package/docs/usage/tokens/theme-studio.md +2 -2
- package/docs/usage/tokens/typography-studio.md +14 -8
- package/docs/usage/tokens/typography.md +15 -5
- package/package.json +1 -1
|
@@ -67,7 +67,7 @@ import { EmptyState } from "@hjmds/react-native/feedback";
|
|
|
67
67
|
| `description` | Web `ReactNode` ยท Native `string` | โ | โ |
|
|
68
68
|
| `action` | `ReactNode`(Button ํ๋) | โ | ์ฝ๋ฐฑ์ Button์ `onClick`ยท`onPress`๊ฐ ๊ฐ๋๋ค |
|
|
69
69
|
| Web `icon` ยท Native `illustration` | `ReactNode` | โ | ์ฅ์, ์ ๊ทผ์ฑ์์ ์จ๊น |
|
|
70
|
-
| `layoutStyle` | ๋ฐฐ์น ์ ์ฉ style | โ | ๋ฃจํธ ๋ฐฐ์น. Native `style`ยท`illustrationStyle`ยท`titleStyle`ยท`descriptionStyle`ยท`actionStyle`์
|
|
70
|
+
| `layoutStyle` | ๋ฐฐ์น ์ ์ฉ style | โ | ๋ฃจํธ ๋ฐฐ์น. Native `style`ยท`illustrationStyle`ยท`titleStyle`ยท`descriptionStyle`ยท`actionStyle`์ ์ ๊ฑฐ๋ ์์ฑ |
|
|
71
71
|
|
|
72
72
|
EmptyState ์์ฒด์๋ ์ฝ๋ฐฑ prop์ด ์๋ค. 2026-10-07 ๊ธฐ์กด ์์ ์ ์์ฑ ๋ฒํผ์ ๋์์ด ์์์ ํ์ธํด
|
|
73
73
|
์ ๊ธฐ๋ณธ ์คํ ๋ฆฌ๋ฅผ ์์ ์์ฑ โ ๊ฒ์ 0๊ฑด โ ๊ฒ์์ด ์ง์ฐ๊ธฐ โ ๋ชฉ๋ก ๋ณต๊ตฌ๋ก ์ฐ๊ฒฐํ๋ค. ์ด ๋ฐ์ดํฐ๋
|
|
@@ -77,7 +77,7 @@ EmptyState ์์ฒด์๋ ์ฝ๋ฐฑ prop์ด ์๋ค. 2026-10-07 ๊ธฐ์กด ์์ ์ ์
|
|
|
77
77
|
|
|
78
78
|
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
79
79
|
| --- | --- | --- |
|
|
80
|
-
| ํฌ๊ธฐ | ๊ทธ๋ฆผ ์ฌ๋กฏ์ `glyph.lg`(28)
|
|
80
|
+
| ํฌ๊ธฐ | Native ๊ทธ๋ฆผ ์ฌ๋กฏ์ ์ต์ `glyph.lg`(28) ํญยท๋์ด๋ฅผ ํ๋ณดํ๊ณ ํฐ ์ผ๋ฌ์คํธ์ ์์ฒด ํฌ๊ธฐ๋ฅผ ์กด์คํ๋ค. Web ๊ทธ๋ฆผ ์ฌ๋กฏ์๋ ๊ณ ์ ํฌ๊ธฐ๊ฐ ์๋ค. ์ธ๋ก ์ฌ๋ฐฑ: `compact` `spacing.xl`(24). `regular` `spacing.xxxl`(40, ๋ ํ๋ซํผ) | `component-recipes.ts` `emptyStateRecipe`, `styles.css` `.hjm-empty-state` |
|
|
81
81
|
| ๊ฐ๊ฒฉ | ํญ๋ชฉ ์ฌ์ด ๊ฐ๊ฒฉ `spacing.xs`(8), ์ข์ฐ ์ฌ๋ฐฑ `spacing.xl`(24) | `component-recipes.ts` `emptyStateRecipe` |
|
|
82
82
|
| ์์ยท์ ๋ ฌ | ์โ์๋ ์์๋ ๊ทธ๋ฆผ โ ์ ๋ชฉ โ ์ค๋ช
โ ํ๋์ด๊ณ ๊ฐ์ด๋ฐ ์ ๋ ฌ์ด๋ค. ํ๋์ Button ํ๋(`tone="secondary"` ๋๋ `primary`)๋ฅผ ๋ด์ฉ ํญ๋งํผ ๋๋ค | `react-native/src/feedback.tsx` `EmptyState` |
|
|
83
83
|
| ๊ณ ์ ยท์คํฌ๋กค | ๋น์ด ์๋ ๋ชฉ๋กยท๊ฒ์ ๊ฒฐ๊ณผ ์์ญ **์**์ ๋๋ค. ์ TopBarยท๊ฒ์์นธยทํํฐ๋ ๊ทธ๋๋ก ๋จ๊ธฐ๊ณ ๊ทธ ์๋ ๋ด์ฉ ์์ญ๋ง EmptyState๋ก ๋ฐ๊พผ๋ค. Native `regular`๋ ๋จ์ ๋์ด๋ฅผ ์ฑ์ฐ๊ณ (`flexGrow: 1`) ์ธ๋ก ๊ฐ์ด๋ฐ์ ๋๋๋ค. `align="upper"`๋ ์:์๋ ๋น ๊ณต๊ฐ์ 1:3์ผ๋ก ๋๋ ๋ด์ฉ์ด ์์ชฝ์ ์จ๋ค. ํ๋ฉด ํ๋จ ๊ณ ์ ํ๋์ด ํ์ํ๋ฉด [BottomCTA](bottom-cta.md)๋ก ๋ฐ๋ก ๋๋ค | `react-native/src/feedback.tsx` `EmptyState` |
|
|
@@ -107,16 +107,16 @@ EmptyState ์์ฒด์๋ ์ฝ๋ฐฑ prop์ด ์๋ค. 2026-10-07 ๊ธฐ์กด ์์ ์ ์
|
|
|
107
107
|
- ์ ๋ชฉยท์ค๋ช
ยทํ๋ ๋ฌธ๊ตฌ๋ i18n ํค๋ก ๋ฃ๋๋ค. "๊ฒ์ 0๊ฑด"๊ณผ "์์ง ๋ง๋ ๊ฒ ์์"์ ๋ค๋ฅธ ๋ฌธ๊ตฌ๋ก ๊ตฌ๋ถํ๋ค.
|
|
108
108
|
- ๋ค์ ํ๋์ด ์์ผ๋ฉด `action`์ Button ํ๋๋ฅผ ๋๋ค. ์์ด์ฝยท์ผ๋ฌ์คํธ๋ ์ฅ์์ด๋ผ ์ ๊ทผ์ฑ์์ ์จ๊ฒจ์ง๋ค.
|
|
109
109
|
- Native๋ `title`ยท`description`ยท`accessibilityLabel` ์ค ํ๋๋ ์์ด์ผ ํ๋ค. ๋ชจ๋ ์์ผ๋ฉด `TypeError`๋ฅผ ๋์ง๋ค.
|
|
110
|
-
- ์ผ๋ฌ์คํธยท์์ด์ฝ
|
|
110
|
+
- ์ผ๋ฌ์คํธยท์์ด์ฝ ์์ฐ๊ณผ ์์ฒด ํฌ๊ธฐ๋ ์ ํ ์์ ๋ค. ํฐ ๊ทธ๋ฆผ์ `illustration` ๋
ธ๋ ์์์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ค. EmptyState์ ์ ๋ชฉยท์ค๋ช
์์ recipe๊ฐ ์ ํ๋ฉฐ ์ ๊ฑฐ๋ `illustrationStyle`๋ก ํ๋ ์์ ๋ฎ์ง ์๋๋ค.
|
|
111
111
|
- ๋ฐฐ์น๋ `layoutStyle`๋ก ํ๋ค. Native ์ฌ๋กฏ style(`style`ยท`illustrationStyle`ยท`titleStyle`ยท`descriptionStyle`ยท`actionStyle`)์
|
|
112
|
-
|
|
112
|
+
์ ๊ฑฐ๋ ์์ฑ์ด๋ค โ ๋ฐฐ์น๋ `layoutStyle`, ์ธํ์ `density`ยท`align`์ผ๋ก ์ฎ๊ธด๋ค.
|
|
113
113
|
|
|
114
114
|
## ํ๋ซํผ ์ฐจ์ด
|
|
115
115
|
|
|
116
116
|
| ํญ๋ชฉ | Web | Native |
|
|
117
117
|
| --- | --- | --- |
|
|
118
|
-
| ๊ทธ๋ฆผ ์ฌ๋กฏ | `icon`(ReactNode) | `illustration`(ReactNode, ์์ด์ฝ ํฌ๊ธฐ
|
|
118
|
+
| ๊ทธ๋ฆผ ์ฌ๋กฏ | `icon`(ReactNode) | `illustration`(ReactNode, ์ต์ ์์ด์ฝ ํฌ๊ธฐ + ์ฝํ
์ธ ์์ฒด ํฌ๊ธฐ) |
|
|
119
119
|
| `title` | ํ์, ReactNode | ์ ํ, string |
|
|
120
120
|
| `description` | ReactNode | string |
|
|
121
121
|
| ์ ๋ ฌยท์๋ฆผ | ์์ | `align`, `announcement`, `accessibilityLabel`, `titleRole` |
|
|
122
|
-
| ๋ฐฐ์น | `layoutStyle`(๊ทธ ๋ฐ์ `className`๊ณผ div ์์ฑ) | `layoutStyle`(์ฌ๋กฏ style ๋ค์ฏ ๊ฐ๋
|
|
122
|
+
| ๋ฐฐ์น | `layoutStyle`(๊ทธ ๋ฐ์ `className`๊ณผ div ์์ฑ) | `layoutStyle`(์ฌ๋กฏ style ๋ค์ฏ ๊ฐ๋ ์ ๊ฑฐ๋ ์์ฑ) |
|
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
| `Field` | ๊ธฐ๋ณธ โ ์ปค์คํ
์ปจํธ๋กค์ฉ ํ | `@hjmds/react`, `/forms` | `@hjmds/react-native`, `/forms` |
|
|
31
31
|
| `TextField` | ๋๋ฐ โ ํ ์ค ํ
์คํธ ์
๋ ฅ | `@hjmds/react`, `/forms` | `@hjmds/react-native`, `/inputs` |
|
|
32
32
|
| `GestureSheetInput` | ํ์ฅ โ GestureSheet ์์ ํค๋ณด๋ ์ถ์ ์
๋ ฅ | ์์ | `/sheet-gesture` |
|
|
33
|
+
| `DateEntry` | ํ์ฅ โ ๋ ์ง ์กฐ๊ฐ ์ง์ ์
๋ ฅ([๊ตฌ์ฑ ์ง์นจ](../compositions/date-entry.md)) | `/date-entry` | `/date-entry` |
|
|
34
|
+
| `FieldGroup` | ํ์ฅ โ ๊ด๋ จ ์
๋ ฅ์ ๊ทธ๋ฃน ์๋ดยท์ค๋ฅ([๊ตฌ์ฑ ์ง์นจ](../compositions/field-group.md)) | `/field-group` | `/field-group` |
|
|
33
35
|
|
|
34
36
|
## ์ต์ ์ฌ์ฉ ์
|
|
35
37
|
|
|
@@ -130,7 +132,7 @@ TextField์ ๊ฐ์ ํ
๋๋ฆฌยท๊ธ๊ผดยทplaceholder ์์ ์
ํ๋ค. ๋ผ๋ฒจยท๋
|
|
|
130
132
|
์๋๋ค(TS2375). ์ ์์ฒ๋ผ ์กฐ๊ฑด๋ถ spread๋ก ๋๊ธด๋ค. Web์ `ReactNode`๋ผ `undefined`๋ฅผ ๊ทธ๋๋ก ๋๊ฒจ๋ ๋๋ค.
|
|
131
133
|
- Web `Field`๋ `controlId`๊ฐ ํ์์ด๊ณ , Native `Field`์๋ `controlId`๊ฐ ์๋ค. ๊ณต์ฉ ์ฝ๋์์ ๊ฐ์ props ๊ฐ์ฒด๋ฅผ ๋๊ธฐ์ง ์๋๋ค.
|
|
132
134
|
|
|
133
|
-
### ๋ ์ง ์กฐ๊ฐ ์ง์ ์
๋ ฅ (
|
|
135
|
+
### ๋ ์ง ์กฐ๊ฐ ์ง์ ์
๋ ฅ (1.14.0 ์ถ๊ฐยท์คํ)
|
|
134
136
|
|
|
135
137
|
์๊ณ ์๋ ๋ ์ง๋ฅผ ๋
ยท์ยท์ผ๋ก ์ง์ ํธ์งํ๋ ค๋ฉด `DateEntry`๋ฅผ ์ฌ์ฉํ๋ค.
|
|
136
138
|
Web `@hjmds/react/date-entry`, Native `@hjmds/react-native/date-entry`์ Field ํ์ฅ์ด๋ค.
|
|
@@ -143,11 +145,11 @@ Web `@hjmds/react/date-entry`, Native `@hjmds/react-native/date-entry`์ Field
|
|
|
143
145
|
|
|
144
146
|
Web TextField์ `aria-invalid={true}`๋ ์ธ๋ถ ์ค๋ฅ ID๋ฅผ `aria-describedby`๋ก ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ์๋
|
|
145
147
|
์ค๋ฅ ํ
๋๋ฆฌ๋ฅผ ํ์ํ๋ค. Native TextField/TextArea์ `invalid`๋ ์ธ๋ผ์ธ error ๋ฌธ๊ตฌ ์์ด ์ค๋ฅ
|
|
146
|
-
ํ
๋๋ฆฌ๋ฅผ ํ์ํ๋
|
|
148
|
+
ํ
๋๋ฆฌ๋ฅผ ํ์ํ๋ ์ต์
์ด๋ค(1.14.0 ์ถ๊ฐ). ๊ฐ์ ์ค๋ฅ๋ฅผ `accessibilityHint`๋ก ์ฐ๊ฒฐํ๊ณ ๊ทธ๋ฃน ์๋ด๋ฅผ
|
|
147
149
|
๋ณ๋๋ก ๋ณด์ฌ ์ค๋ค. error๊ฐ ์์ผ๋ฉด ํด๋น ๋ฌธ๊ตฌ๊ฐ hint๋ณด๋ค ์ฐ์ ํ๊ณ , hint๊ฐ ์์ผ๋ฉด description์ ์ด๋ค.
|
|
148
150
|
2026-10-07 ๋ ์ง ์ง์ ์
๋ ฅ์ ํฐ ๊ธ์ ์ค๋ฅ๊ฐ ์ธ ๋ฒ ๋ฐ๋ณต๋ ๊ด์ฐฐ์ ๋ฐ๋ผ ์ด ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ค.
|
|
149
151
|
|
|
150
|
-
### ๊ด๋ จ ์
๋ ฅ ๊ทธ๋ฃน (
|
|
152
|
+
### ๊ด๋ จ ์
๋ ฅ ๊ทธ๋ฃน (1.14.0 ์ถ๊ฐยท์คํ)
|
|
151
153
|
|
|
152
154
|
์ฌ๋ฌ ์
๋ ฅ์ด ํ ์ง๋ฌธ์ ๋ตํ๋ฉด `FieldGroup`์ ์ฌ์ฉํ๋ค. Form์ ์ ์ถ ๊ฒฝ๊ณ์ ๊ตฌ๋ถํ๋ฉฐ
|
|
153
155
|
`@hjmds/react/field-group`, `@hjmds/react-native/field-group`์์ ์ ๊ณตํ๋ค.
|
|
@@ -70,7 +70,7 @@ import { FilePicker } from "@hjmds/react-native/file-picker";
|
|
|
70
70
|
| Native `onPick` | `() => Promise<readonly FilePickerCandidate[] \| null>` | ํ์ | ์ ํ adapter. ์ทจ์๋ฉด `null` |
|
|
71
71
|
| Native `onPickError` | `(error: unknown) => void` | ํ์ | `onPick`์ด rejectํ๋ฉด ์ด์ชฝ์ผ๋ก๋ง ์จ๋ค |
|
|
72
72
|
| Web `getCandidateId` | `(file: File, index: number) => string` | `name:size:lastModified:index` | ํ๋ณด id ๊ท์น |
|
|
73
|
-
| `disabled` | `true` ยท `false` | `false` |
|
|
73
|
+
| `disabled` | `true` ยท `false` | `false` | ์ ํ ์๋ฃ ์์๋ ์ ๊ธ ์ํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ์ง ์๋๋ค |
|
|
74
74
|
| `hint`, `error` | ๋ฌธ๊ตฌ | โ | ์ ํ ์ฌํญ์ด๋ค |
|
|
75
75
|
|
|
76
76
|
- `FilePickerCandidate`: `{ id, name, mimeType, sizeBytes }`(`mimeType`์ ํ๋ซํผ์ด ๋ชป ์ ํ๋ฉด `""`).
|
|
@@ -93,6 +93,9 @@ import { FilePicker } from "@hjmds/react-native/file-picker";
|
|
|
93
93
|
๋ง๋ค๊ณ ์์ผ๋ก๋ง ์๋ฆฌ์ง ์๋๋ค.
|
|
94
94
|
- `rejected`๊ฐ ์์ด๋ `accepted`๋ ๊ทธ๋๋ก ์ด๋ค. ํ ์ฅ์ด ๋งํ๋ค๊ณ ์ ์ฒด ์ ํ์ ๋ฒ๋ฆฌ์ง ์๋๋ค.
|
|
95
95
|
- FilePicker๋ ์ ํ ๋ชฉ๋ก์ ์์ง ์๋๋ค. ๊ณ ๋ฅธ ํ์ผ ๋ชฉ๋กยท์
๋ก๋ ์ํ๋ ์ ํ ์ํ์ UploadItem์ด ์์ ํ๋ค.
|
|
96
|
+
- ์ทจ์(Web์ ๋น ์ ํ, Native adapter์ `null`)๋ ๊ธฐ์กด ๋ชฉ๋ก์ ๋ฐ๊พธ๊ฑฐ๋ `onSelect`๋ฅผ ํธ์ถํ์ง ์๋๋ค. ๊ฐ์ ํ์ผ์ ๋ค์ ์ ํํ ์ ์๋ค.
|
|
97
|
+
- Native ๊ฒฐ๊ณผ๋ ์๋ฃ ์์ ์ `descriptor`ยท`existingCount`๋ก ํ์ ํ๊ณ ํ์ฌ ์ฝ๋ฐฑ์ผ๋ก ์ ๋ฌํ๋ค. ๋๊ธฐ ์ค ๋ค๋ฅธ ํ์ผ์ด ์ถ๊ฐยท์ ๊ฑฐ๋๋ฉด `existingCount`๋ฅผ ๊ณ์ ๊ฐฑ์ ํ๋ค.
|
|
98
|
+
- ํ์ผ ํ ์ ๊ฑฐ์ ์ ๊ฑฐ ํ ์ด์ ๋ณต๊ท๋ ๋ชฉ๋ก์ ์์ ํ ์ ํ์ด ์ฒ๋ฆฌํ๋ค. ์ ๊ฑฐ ๋ฒํผ์ FilePicker ๋ด๋ถ์ ๊ฐ์ ํ๊ฑฐ๋ ์ ํ ์ฝ๋ฐฑ์ ๋ชฉ๋ก ์ด๊ธฐํ ์ ํธ๋ก ์ฐ์ง ์๋๋ค.
|
|
96
99
|
- Native ์ค์ OS document/image picker ์ฐ๊ฒฐ(`onPick`)์ ์ ํ ์ฑ
์์ด๋ค. ํจํค์ง๋ ์ด๋ฅผ ๊ตฌํํ๊ฑฐ๋
|
|
97
100
|
๊ธฐ๊ธฐ์์ ๊ฒ์ฆํ์ง ์๋๋ค. ์ ํ ๋ฆด๋ฆฌ์ค QA์์ ํ์ธํ๋ค.
|
|
98
101
|
|
|
@@ -106,7 +109,7 @@ import { FilePicker } from "@hjmds/react-native/file-picker";
|
|
|
106
109
|
| ์งํ ์ค ์ ๊ธ | ์์ | `onPick` ๋๊ธฐ ์ค ๋ฒํผ `busy`ยท๋นํ์ฑ |
|
|
107
110
|
| `label`ยท`hint`ยท`error` ํ์
| `ReactNode` | `string` |
|
|
108
111
|
| ํ๋ณด id | `getCandidateId`(๊ธฐ๋ณธ `name:size:lastModified:index`) | adapter๊ฐ `id`๋ฅผ ์ฑ์ |
|
|
109
|
-
| ๋ฐฐ์น | `layoutStyle`(๋ฃจํธ), `className`๊ณผ div ์์ฑ | `layoutStyle`. `style`์
|
|
112
|
+
| ๋ฐฐ์น | `layoutStyle`(๋ฃจํธ), `className`๊ณผ div ์์ฑ | `layoutStyle`. `style`์ ์ ๊ฑฐ๋ ์์ฑ โ `layoutStyle` ๋๋ recipe |
|
|
110
113
|
|
|
111
114
|
## ํจ์
|
|
112
115
|
|
|
@@ -117,4 +120,4 @@ import { FilePicker } from "@hjmds/react-native/file-picker";
|
|
|
117
120
|
|
|
118
121
|
2026-10-07 ์๋น ๊ฐ์ฌ์์ Native ์ ํ ๋ฒํผ์ ๋ชจ์๋ฆฌ 12๊ฐ ํ๋กํ์ ์ฐํํ๋ค. Web ๋ฒํผ์ ๊ธฐ์กด `radius.md`์ ๊ฐ์ ์ญํ ์ Native๋ ๊ฐ๊น์ด ํ๋กํ์์ ์ฝ์ผ๋ฉฐ, ํ๋กํ์ด ์์ผ๋ฉด ๊ธฐ์กด 12๋ฅผ ์ ์งํ๋ค. ์ ํ ์ด๋ํฐยท๋นํ์ฑ/์งํ ์ํยทํ์ผ ๊ฒ์ฆ์ ๋ฐ๊พธ์ง ์๋๋ค.
|
|
119
122
|
|
|
120
|
-
ํ๋กํ ์ฐ๊ฒฐ์ 1.
|
|
123
|
+
ํ๋กํ ์ฐ๊ฒฐ์ 1.16.0 ๋ณ๊ฒฝ์ด๋ฉฐ, ๊ธฐ๋ณธ ๋ฐฐํฌ ๊ณ์ฝ๊ณผ ์ค์ Native ๊ธฐ๊ธฐ ๊ฒ์ฆ์ ๊ตฌ๋ถํ๋ค.
|
|
@@ -157,7 +157,7 @@ useEffect(() => { firstInvalidRef.current = nicknameError ? nicknameInputRef.cur
|
|
|
157
157
|
| ์คํจ ์ฒ๋ฆฌ | Promise reject๋ฅผ ์ผํจ๋ค. ์ ํ์ด `formError`๋ฅผ ์ค์ | rejectํ๋ฉด `failed`๋ก ๋ฐ๊พธ๊ณ Error ๋ฉ์์ง ๋๋ `fallbackErrorMessage`๋ฅผ alert๋ก ํ์ |
|
|
158
158
|
| ์ฒซ ์ค๋ฅ ํ๋๋ก ์ด๋ | ์์. ์ ํ์ด `onSubmit` ์์์ ์ฒซ ๋ฌดํจ ์
๋ ฅ์ `.focus()`ํ๋ค | `firstInvalidFieldRef`: ๋ฒํผ์ ๋๋ฅธ ์๊ฐ `current`๋ฅผ ์ฝ๋๋ค. non-null์ด๋ฉด ๊ทธ ์
๋ ฅ์ focus์ ์คํฌ๋ฆฐ ๋ฆฌ๋ focus๋ฅผ ์ฎ๊ธฐ๊ณ `onSubmit`ยท`onStatusChange` ์์ด ๋ฉ์ถ๋ค(์ํ ๊ทธ๋๋ก). ref๋ `useEffect`์์ ๊ฐฑ์ ํ๊ณ , ์์ ๊ณ์ฐ์ `resolveFirstInvalidFieldFocusTarget(fieldOrder, invalidIds)`๋ฅผ ์ด๋ค |
|
|
159
159
|
| ์ ๊ทผ์ฑ ์ด๋ฆ | `<form>` ์์ฑ(`aria-label` ๋ฑ) | `label` ํ์ |
|
|
160
|
-
| ๋ฐฐ์น | `className`, `layoutStyle`(form ์์ฑ `style`๋ ๋ฐ์) | `layoutStyle`. `style`์
|
|
160
|
+
| ๋ฐฐ์น | `className`, `layoutStyle`(form ์์ฑ `style`๋ ๋ฐ์) | `layoutStyle`. `style`์ ์ ๊ฑฐ๋ ์์ฑ โ `layoutStyle` ๋๋ `density` |
|
|
161
161
|
| ๋ฐ์์ ์ ์ถ | `<form>`์ด๋ฏ๋ก `type="submit"` ๋ฒํผยทEnter๋ก ๋๋ค | `ref: Ref<FormHandle>`์ `submit()`์ผ๋ก ๊ฐ์ validationยท์ค๋ณต ์ ์ถ ๋ฐฉ์ง๋ฅผ ์คํ |
|
|
162
162
|
|
|
163
163
|
## ํจ์
|
|
@@ -83,14 +83,14 @@ import { Heading } from "@hjmds/react-native/heading";
|
|
|
83
83
|
| --- | --- | --- |
|
|
84
84
|
| ์ถ๋ ฅ | `h1`~`h6` ์์ | `Text` + `accessibilityRole="header"` + `aria-level` |
|
|
85
85
|
| ์ถ๊ฐ prop | `HTMLAttributes`(`id`, `className`, `style` ๋ฑ), ref | ์์ |
|
|
86
|
-
| ๋ฐฐ์น | `layoutStyle`. `style`๋ ํฉ์ณ์ง๋ค(ํฌ๊ธฐ ๋ณ์๋ ๋ฎ์ด์ง ์์) | `layoutStyle`. `style`(TextStyle)์
|
|
86
|
+
| ๋ฐฐ์น | `layoutStyle`. `style`๋ ํฉ์ณ์ง๋ค(ํฌ๊ธฐ ๋ณ์๋ ๋ฎ์ด์ง ์์) | `layoutStyle`. `style`(TextStyle)์ ์ ๊ฑฐ๋ ์์ฑ โ `layoutStyle` ๋๋ `level` |
|
|
87
87
|
| ๊ธ์ ๋ฐฐ์จ | `--hjm-text-scale`๋ก ํ๋ | Native `Text`์ ๊ธ์ ๋ฐฐ์จ |
|
|
88
88
|
|
|
89
89
|
## ํจ์
|
|
90
90
|
|
|
91
91
|
- Web `style`์ ์ด์ ๋ฒ๋ ค์ง์ง ์๊ณ ํฉ์ณ์ง๋ค. ๋ค๋ง ํฌ๊ธฐยท์ค ๋์ดยท๊ตต๊ธฐ ๋ณ์(`--hjm-heading-*`)๋ recipe๊ฐ ๋ง์ง๋ง์ ๋ฎ์ผ๋ฏ๋ก
|
|
92
92
|
`style`๋ก ํฌ๊ธฐ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค. ๋ฐฐ์น๋ `layoutStyle`๋ก ์ค๋ค.
|
|
93
|
-
- Native `style
|
|
93
|
+
- Native `style`์ ์ ๊ฑฐ๋์๋ค. ๋ฐฐ์น๋ `layoutStyle`, ์ ๋ชฉ ์๊ณ๋ `level`๋ก ์ง์ ํ๋ค.
|
|
94
94
|
|
|
95
95
|
2026-10-07 ์ถ๊ฐ: ์ ๋ชฉ์ ํ๋กํ์ optional `tokens.fontFamily.display`๋ฅผ ์ฌ์ฉํ๊ณ ์๋ต ์ ํ์ฌ ui๋ฅผ ๋ฐ๋ฅธ๋ค.
|
|
96
|
-
๋ฌธ์ semanticLevelยทํฌ๊ธฐยท๊ตต๊ธฐ๋ ์ ์งํ๋ค. [์์ฒด ์ญํ ](../tokens/font-roles.md), 1.
|
|
96
|
+
๋ฌธ์ semanticLevelยทํฌ๊ธฐยท๊ตต๊ธฐ๋ ์ ์งํ๋ค. [์์ฒด ์ญํ ](../tokens/font-roles.md), 1.16.0 ๋ณ๊ฒฝ.
|
|
@@ -80,7 +80,7 @@ import { NotificationBell } from "@hjmds/react-native/notification-bell";
|
|
|
80
80
|
| `onPress`(NotificationBell) | `() => void` | ํ์ | WebยทNative ๋ชจ๋ `onPress`๋ค(Web๋ `onClick`์ด ์๋๋ค) |
|
|
81
81
|
| `active`(NotificationBell) | `true` ยท `false` | `true` | โ |
|
|
82
82
|
| `disabled`(NotificationBell) | `true` ยท `false` | `false` | โ |
|
|
83
|
-
| Web `layoutStyle`(NotificationBell) | `HjmCompositionStyleProp` | โ | ๋ฃจํธ ๋ฐฐ์น. ๊ธฐ๋ณธ `alignSelf: "flex-start"`๋ณด๋ค ์ฐ์ ํ์ง๋ง `width`๋ ๋ฌด์๋๋ค(๋ฃจํธ๋ ํญ์ `max-content`). ๋ ์๋ ๋ฐฐ์ง๊ฐ ๋ฃจํธ์ ๋ ๋ชจ์๋ฆฌ์ ๋ถ์ด ์์ด ๋ฃจํธ๊ฐ ๋์ด์ง๋ฉด ์์ด์ฝ์์ ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. marginยท`alignSelf`๋ก ๋ฐฐ์นํ๋ค.
|
|
83
|
+
| Web `layoutStyle`(NotificationBell) | `HjmCompositionStyleProp` | โ | ๋ฃจํธ ๋ฐฐ์น. ๊ธฐ๋ณธ `alignSelf: "flex-start"`๋ณด๋ค ์ฐ์ ํ์ง๋ง `width`๋ ๋ฌด์๋๋ค(๋ฃจํธ๋ ํญ์ `max-content`). ๋ ์๋ ๋ฐฐ์ง๊ฐ ๋ฃจํธ์ ๋ ๋ชจ์๋ฆฌ์ ๋ถ์ด ์์ด ๋ฃจํธ๊ฐ ๋์ด์ง๋ฉด ์์ด์ฝ์์ ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. marginยท`alignSelf`๋ก ๋ฐฐ์นํ๋ค. 1.13.0 ๋ณ๊ฒฝ |
|
|
84
84
|
|
|
85
85
|
## ๋ฐฐ์น
|
|
86
86
|
|
|
@@ -117,13 +117,13 @@ TopBar
|
|
|
117
117
|
| ์คํผ๋ ๊ต์ฒด | ์์ | `renderLoadingIndicator` |
|
|
118
118
|
| ๋นํ์ฑ์ด์ง๋ง ํฌ์ปค์ค ์ ์ง | `aria-disabled` | `loading` ๊ธฐ๋ณธ ๋์ |
|
|
119
119
|
| NotificationBell ํ๋ค๋ฆผ ์ ์ง | ๋ฌธ์ ์จ๊นยทreduced motion | AppState ๋นํ์ฑยทreduced motion |
|
|
120
|
-
| ๋ฐฐ์น | `layoutStyle`(IconButtonยทNotificationBell, NotificationBell์ `width` ๋ฌด์) | IconButton `layoutStyle`. `style`์
|
|
120
|
+
| ๋ฐฐ์น | `layoutStyle`(IconButtonยทNotificationBell, NotificationBell์ `width` ๋ฌด์) | IconButton `layoutStyle`. `style`์ ์ ๊ฑฐ๋ ์์ฑ โ `layoutStyle` ๋๋ `tone`ยท`size`ยท`shape`. NotificationBell์ ๋ฐฐ์น prop์ด ์์ด ๊ฐ์ธ๋ View๋ก ๋ฐฐ์นํ๋ค |
|
|
121
121
|
|
|
122
122
|
## ํจ์
|
|
123
123
|
|
|
124
124
|
- children์ ์์ ๋ฒํผ์ด ์น ํ์ง ์๋๋ค. HJM Icon์ ์๊ธฐ `tone` ์์ ์ฐ๋ฏ๋ก, `primary`ยท`danger` ๋ฒํผ ์์์๋
|
|
125
125
|
`tone="inverse"`๋ฅผ ์ค๋ค. ๋ค๋ฅธ ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ๋ฃ์ผ๋ฉด(Native) ์์ ์ ํ์ด ๋๊ฒจ์ผ ํ๋ค.
|
|
126
|
-
- Native `IconButton
|
|
126
|
+
- Native `IconButton`์ `style`์ ์ ๊ฑฐ๋์๋ค. ๋ฐฐ์น๋ `layoutStyle`, ์ธํ์ `tone`ยท`size`ยท`shape`๋ก ์ง์ ํ๋ค.
|
|
127
127
|
|
|
128
128
|
2026-10-10 ์ฌ์ฉ์ ์์ฒญ: Button๊ณผ ๊ฐ์ ์ ํ ํํ์ ์ด๋ค. ์ ํ์ bg ๋ฐํยทcontentBrand ์์ด์ฝ์ผ๋ก
|
|
129
129
|
ํ์ํ๊ณ ์ถ๊ฐ ์ ํ ํ
๋๋ฆฌ๋ ์๋ค. aria-pressed/Native selected์ ํค๋ณด๋ focus outline์ ์ ์งํ๋ค.
|
|
@@ -96,7 +96,7 @@ const renderGlyph = createLucideGlyph({ search: Search, back: ArrowLeft });
|
|
|
96
96
|
| glyph | ๋ด์ฅ SVG ๊ฒฝ๋ก, `renderGlyph`๋ ์ ํ | `renderGlyph` ํ์(๋ด์ฅ ๊ทธ๋ฆผ ์์) |
|
|
97
97
|
| ์ฌ์ฉ์ ์ ์ ์ด๋ฆ | `SemanticIconName`๋ง | `Icon<Name>` ์ ๋ค๋ฆญ์ผ๋ก ์ ํ ์ด๋ฆ ํ์ฉ |
|
|
98
98
|
| ์ถ๋ ฅ | `<svg>`(์ฅ์์ด๋ฉด `aria-hidden`) | `View` ํ๋ ์(์ฅ์์ด๋ฉด `accessible={false}`) |
|
|
99
|
-
| ๋ฐฐ์น | `layoutStyle` | `layoutStyle`. `style`์
|
|
99
|
+
| ๋ฐฐ์น | `layoutStyle` | `layoutStyle`. `style`์ ์ ๊ฑฐ๋ ์์ฑ โ `layoutStyle` ๋๋ descriptor `size`ยท`tone` |
|
|
100
100
|
|
|
101
101
|
## ํจ์
|
|
102
102
|
|
|
@@ -84,10 +84,11 @@ import { ImageViewer } from "@hjmds/react-native/image-viewer";
|
|
|
84
84
|
| ImageViewer `onClose` ยท `onIndexChange` | `() => void` ยท `(index: number) => void` | `onClose` ํ์ | โ |
|
|
85
85
|
| ImageViewer `safeAreaInsets` | `{ top: number; bottom: number; left?: number; right?: number }` | ํ์, ์ข์ฐ 0 | ๋ฒํผยทcaptionยท์ํ ์๋ด๋ฅผ ๋ฌผ๋ฆฌ์ ์ข์ฐ ์์ ์์ญ ์์ ๋ฐฐ์น. ์ฌ์ง์ ์ ์ฒด ๊ฐค๋ฌ๋ฆฌ ํญ ์ฌ์ฉ |
|
|
86
86
|
| ImageViewer `supportedOrientations` | RN Modal์ orientation ๋ฐฐ์ด | RN ๊ธฐ๋ณธ๊ฐ | ์ ํ manifestยท๊ธฐ๊ธฐ ํ์ ์ ๊ธ ๋ฒ์ ์์์ ํ์ฉ. Modal์ fullScreen |
|
|
87
|
-
| ImageViewer `renderImage` | `(props: ImageViewerImageRenderProps) => ReactNode` | RN Image | Native ์ ์ฉ,
|
|
87
|
+
| ImageViewer `renderImage` | `(props: ImageViewerImageRenderProps) => ReactNode` | RN Image | Native ์ ์ฉ, 1.14.0 ์ถ๊ฐ. `item`, ์ธก์ ๋ `width`ยท`height`, `onReady`ยท`onError`๋ฅผ ์ ๋ฌ. ์ ํ ์ด๋ฏธ์ง host์ ์บ์ยทํ์ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐ |
|
|
88
88
|
| ImageViewer `onImageStatusChange` | `({ item, status }) => void` | ์์ | `loading`ยท`ready`ยท`error`. ๋ง์ดํธ๋ ๊ฐ ์ด๋ฏธ์ง ๊ธฐ์ค์ด๋ฉฐ ๋น์ ํ ํ์ด์ง๋ ํฌํจํ ์ ์์ |
|
|
89
89
|
|
|
90
90
|
- ์คํจํ๋ฉด ์ค๋ฆฝ ๋ฐฐ๊ฒฝ ์์ ์ค๋ฅ ๊ธฐํธ๋ฅผ ๊ทธ๋ฆฌ๊ณ , ์ ๋ณด ์ด๋ฏธ์ง์ ์ด๋ฆ์ ๊ทธ๋๋ก ์ ์งํ๋ค. `fallback`์ ์๊ฐ๋ง ๋ฐ๊พผ๋ค.
|
|
91
|
+
- ๊ฐ์ ์ฃผ์๋ผ๋ Web `imageProps.srcSet`/์์ฒญ ์ ์ฑ
, Native `sourceAdapter`์ ์ค์ sourceยทํค๋ยทcache ๋ด์ฉ์ด ๋ฐ๋๋ฉด ์ ์์ฒญ์ผ๋ก ๋ณด๊ณ loading๋ถํฐ ์์ํ๋ค. inline adapter ํจ์๋ง ๋ค์ ๋ง๋ ๊ฒ์ ์ฌ์๋๊ฐ ์๋๋ค. ๊ฐ์ ์์ฒญ์ ๋ช
์์ ์ผ๋ก ์ฌ์๋ํ๊ฑฐ๋ adapter ๊ตฌํ๋ง ๊ต์ฒดํ๋ ค๋ฉด `<Image key={attempt} ... />`์ฒ๋ผ ์์ฒญ ์๋ ํค๋ก Image ์ ์ฒด๋ฅผ ๋ค์ ๋ง์ดํธํ๋ค. ์คํจํ ์์ฒญ์ ๋ฆ์ ์ฝ๋ฐฑ์ ์ ์์ฒญ์ ๋ฎ์ง ์๋๋ค.
|
|
91
92
|
|
|
92
93
|
## ๋ฐฐ์น
|
|
93
94
|
|
|
@@ -107,7 +108,7 @@ Native ์ด๋ฏธ์ง ํ๋ ์์ `imageRecipe.radius` ์ญํ ์ Provider์ `tokens
|
|
|
107
108
|
- GridReveal์ `ready`๋ `onLoadStatusChange`๊ฐ `loaded`์ผ ๋๋ง true, ์ค๋ฅยท์์ค ๋ณ๊ฒฝยท์ฌ์๋ ์ ์๋ false๋ก ๋๋ฆฐ๋ค.
|
|
108
109
|
Native์์ ํ๋ฉด์ด ๊ฐ๋ ค์ง ์ฑ mounted๋ฉด `active={false}`.
|
|
109
110
|
- ImageViewer๋ `open`์ผ๋ก ์ ์ดํ๊ณ ๋ซํ๋ฉด ์ํ๋ฅผ ๋ฒ๋ฆฐ๋ค. ๋ผ๋ฒจยท`id`๊ฐ ๋น๊ฑฐ๋ ์ค๋ณต์ด๋ฉด `TypeError`.
|
|
110
|
-
- ImageViewer๋ ๋ถ๋ฌ์ค๋ ์ค(`loadingLabel`)๊ณผ ์คํจ(`errorLabel`)๋ฅผ ๋ชจ๋ ์๋ฆฐ๋ค. ์คํจ๋ Android assertive live region, iOS๋ `announceForAccessibility`๋ค(
|
|
111
|
+
- ImageViewer๋ ๋ถ๋ฌ์ค๋ ์ค(`loadingLabel`)๊ณผ ์คํจ(`errorLabel`)๋ฅผ ๋ชจ๋ ์๋ฆฐ๋ค. ์คํจ๋ Android assertive live region, iOS๋ `announceForAccessibility`๋ค(1.13.0 ๋ณ๊ฒฝ. 1.12.1์ ์คํจ๋ฅผ ์๋ฆฌ์ง ์์๋ค).
|
|
111
112
|
- ์๊ฒฉ ์ด๋ฏธ์ง ๊ถํยทURL ์๋ช
ยท์บ์๋ ์ ํ ์์ ๋ค. HJM์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๋๋ค.
|
|
112
113
|
|
|
113
114
|
### Native ImageViewer์ ์ ํ ์ด๋ฏธ์ง ํธ์คํธ
|
|
@@ -140,7 +141,7 @@ import { ImageViewer } from "@hjmds/react-native/image-viewer";
|
|
|
140
141
|
ํ์ ์ ํ์ฉํ๋ ์ ํ์ `supportedOrientations={["portrait", "landscape"]}`์ ๊ฐฑ์ ๋๋
|
|
141
142
|
safeAreaInsets ๋ค ๋ฐฉํฅ์ ์ ๊ณตํ๋ค. ์ฑ manifest๊ฐ portrait ๊ณ ์ ์ด๋ฉด ์ด prop๋ง์ผ๋ก ํ์ ์ด ๋ณด์ฅ๋์ง ์๋๋ค.
|
|
142
143
|
ํ๋ฉด ํฌ๊ธฐ๊ฐ ๋ฐ๋๋ฉด ๋ฒํผ์ ์ ์ธํ ๋จ์ ๊ฐค๋ฌ๋ฆฌ ์์ญ์ ๋ค์ ์ธก์ ํด host์ ์ ๋ฌํ๋ค.
|
|
143
|
-
์๋ inspection ํ์ฅ์
|
|
144
|
+
์๋ inspection ํ์ฅ์ 1.14.0 ์ถ๊ฐ API์ด๋ฉฐ, Expo ํ์ ํ์ธยท๊ฒฐ๊ณผ ์น์ธ ํ๊ท์ Utilverse ์ฑํ์ ๋ณ๋ ๊ฒ์ฆํ๋ค.
|
|
144
145
|
|
|
145
146
|
### ๊ฒฐ๊ณผ ๊ฒ์ฌ ํฌ๊ธฐ ๊ณ์ฐ
|
|
146
147
|
|
|
@@ -157,7 +158,7 @@ const geometry = resolveImageInspectionGeometry(
|
|
|
157
158
|
); // width/height 804, panBounds x=201 y=175 (์ค์์์ ์๋ฐฉํฅ)
|
|
158
159
|
```
|
|
159
160
|
|
|
160
|
-
### Native ๊ฒฐ๊ณผ ๊ฒ์ฌ ๋ณด๊ธฐ (
|
|
161
|
+
### Native ๊ฒฐ๊ณผ ๊ฒ์ฌ ๋ณด๊ธฐ (1.14.0 ์ถ๊ฐ)
|
|
161
162
|
|
|
162
163
|
`ImageViewer`์ ์ ํ์ `inspection`์ ์ ๊ณ์ฐ์ ์ฌ์ฉํ๋ค. ๋ชจ๋ `items`์ ์ค์ ์ถ๋ ฅ์
|
|
163
164
|
์์ `width`ยท`height`๋ฅผ ์ ๊ณตํ๋ค. ์ผ๋ฐ Gallery์ pinch/paging๊ณผ ๋ณ๊ฐ๋ก ๊ณ ์ ๋ฐฐ์จ์ ๊ฒฐ๊ณผ๋ฅผ
|
|
@@ -65,7 +65,7 @@ const keyboardOpen = useKeyboardState((state) => state.isVisible);
|
|
|
65
65
|
| `enabled` | `true` ยท `false` | `true` | `false`๋ฉด ๋ฐ๋ผ ์์ง์ด์ง ์๋๋ค |
|
|
66
66
|
| `clearance` | 0 ์ด์ ์ซ์(layout point) | `0` | ํค๋ณด๋ ์ ์ถ๊ฐ ๊ฐ๊ฒฉ. ์์๋ ์ ํํ์ง ์์ ๊ฐ์ `TypeError` |
|
|
67
67
|
| `children` | ReactNode(ํ์) | โ | ํ๋จ ํ๋. ์์ชฝ ์ฌ๋ฐฑยท์์ ์์ญ์ ํธ์คํธ๊ฐ ์ค๋ค |
|
|
68
|
-
| `style` | `StyleProp<ViewStyle>` | โ | ๊ฐ์ธ๋ sticky view์ host ์คํ์ผ. ํ๋ซํผ host๋ผ 1.13 deprecated ๋์์ด ์๋๋ค([์ด๊ด ๋ฌธ์](../../migration-native-legacy-removal.md#
|
|
68
|
+
| `style` | `StyleProp<ViewStyle>` | โ | ๊ฐ์ธ๋ sticky view์ host ์คํ์ผ. ํ๋ซํผ host๋ผ 1.13 deprecated ๋์์ด ์๋๋ค([์ด๊ด ๋ฌธ์](../../migration-native-legacy-removal.md#2026-10-13-์์ฌ-์๊ฐ-style-์ ๊ฑฐ)). ๋ฐฐ์น ๊ฐ๋ง ๋ฃ๋๋ค |
|
|
69
69
|
|
|
70
70
|
- ์ด๋ฒคํธยท์ฝ๋ฐฑ prop์ ์๋ค. ํค๋ณด๋ ์ด๋ฆผ ์ฌ๋ถ๊ฐ ํ์ํ๋ฉด peer์ `useKeyboardState((state) => state.isVisible)`๋ก ์ฝ๋๋ค.
|
|
71
71
|
- ๋ด๋ถ์์ `KeyboardStickyView`์ `offset={{ closed: 0, opened: -clearance }}`๋ฅผ ๋๊ธด๋ค.
|
|
@@ -113,5 +113,5 @@ Web (persistent sidebar) Native
|
|
|
113
113
|
|
|
114
114
|
## ํจ์
|
|
115
115
|
|
|
116
|
-
-
|
|
116
|
+
- `skipLinkLabel`์ Web ์ ์ฉ์ด๋ค. Native `LayoutProps`์๋ ์์ผ๋ฏ๋ก ํ๋ซํผ ๊ณตํต props์ ๋ฃ์ง ์๋๋ค.
|
|
117
117
|
- Native persistent ์ฌ์ด๋๋ฐ๋ ์์ผ๋ก ๋์ด์ง ์๊ณ ์ธ๋ก๋ก ์์ธ๋ค. ๋์ ํ๋ฉด 2๋จ ๋ฐฐ์น๊ฐ ํ์ํ๋ฉด ์ ํ์ด main ์์์ ๊ตฌ์ฑํ๋ค.
|
|
@@ -79,7 +79,7 @@ const renderGlyph = createLucideGlyph({ chevronEnd: ChevronRight }); // ์ ํ
|
|
|
79
79
|
| `renderIcon`(Native) | `(props: { name, size, color, strokeWidth }) => ReactNode` | โ | semantic name โ glyph ๊ฒฝ๊ณ. ๋ณดํต `createLucideGlyph`. ํฌ๊ธฐยท์์ HJM์ด ๋๊ธด ๊ฐ์ ๊ทธ๋๋ก ์ด๋ค |
|
|
80
80
|
| `renderAnchor`(Web) | `(props: LinkRenderProps) => ReactElement` | โ | ๋ฐ์ props(`href`ยท`ref`ยท`className`ยท`data-*`ยท`aria-disabled`ยท`onClick`ยท`children`ยท๋ณํฉ๋ `style`)๋ฅผ framework Link์ ๊ทธ๋๋ก ๋๊ธด๋ค |
|
|
81
81
|
| `layoutStyle` | ๋ฐฐ์น key๋ง | โ | ์์ชฝ ์์. Web์ `renderAnchor`์๋ ๋ณํฉ๋ `style`๋ก ์ ๋ฌ๋๋ค |
|
|
82
|
-
| `style`(Native) | โ | โ |
|
|
82
|
+
| `style`(Native) | โ | โ | ์ ๊ฑฐ๋ ์์ฑ โ `layoutStyle`์ ์ด๋ค |
|
|
83
83
|
|
|
84
84
|
- Native๋ toneยทvariant๊ฐ ์๋ค. ํญ์ brand ์ ยท ๋ฐ์ค ยท `bodyLarge` ๊ธ์ ยท ์ต์ ํฐ์น target์ด๋ค.
|
|
85
85
|
|
|
@@ -118,6 +118,6 @@ const renderGlyph = createLucideGlyph({ chevronEnd: ChevronRight }); // ์ ํ
|
|
|
118
118
|
- Native์์ descriptor ์์ด์ฝ์ ์ฃผ๊ณ `renderIcon`์ ๋นผ๋ฉด ๊ฐ๋ฐ ๋ชจ๋์์ ํ ๋ฒ ๊ฒฝ๊ณ ํ๊ณ ์์ด์ฝ์ ๊ทธ๋ฆฌ์ง ์๋๋ค(throwํ์ง ์์).
|
|
119
119
|
descriptor ์์ด์ฝ๊ณผ `leading`/`trailing` node๋ฅผ ํจ๊ป ์ฃผ๋ฉด descriptor๊ฐ ๊ทธ ์๋ฆฌ๋ฅผ ๊ฐ๊ณ ๊ฒฝ๊ณ ๊ฐ ๋๋ค. 1.12๊น์ง๋ Native๊ฐ
|
|
120
120
|
descriptor ์์ด์ฝ์ ๊ทธ๋ฆฌ์ง ์์๋ค.
|
|
121
|
-
- Native `style`์
|
|
121
|
+
- Native `style`์ ์ ๊ฑฐ๋์๋ค. ๋ฐฐ์น๋ `layoutStyle`๋ก ์ง์ ํ๊ณ brand ์ยท๋ฐ์คยท๊ธ์ ํฌ๊ธฐ๋ `linkRecipe`๋ฅผ ๋ฐ๋ฅธ๋ค. Native์๋ `tone`ยท`size` prop์ด ์๋ค.
|
|
122
122
|
- ํ์ฌ Native ์คํ ๋ฆฌ(`showcase/native/src/component-examples.tsx` LinkExample)๋ descriptor ์์ด์ฝยท`renderIcon` ์๊ฐ ์๊ณ
|
|
123
123
|
๋ฌธ๊ตฌ๊ฐ i18n ํค๊ฐ ์๋๋ค. ์์ด์ฝ ๊ฒฝ๋ก๋ ์ ์ต์ ์ฌ์ฉ ์๋ก ํ์ธํ๋ค.
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
4
|
- ์ํ: ๋ฐฐํฌ
|
|
5
5
|
- ์ง์: Web ยท Native
|
|
6
|
-
- ์ ์ฉ:
|
|
7
|
-
- ๊ฒํ ์ผ: 2026-10-
|
|
6
|
+
- ์ ์ฉ: 1.17.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-13
|
|
8
8
|
- ๊ทผ๊ฑฐ: [๋ฐ๋ณต ํ๋ฉด ์กฐํฉ](../../screen-patterns.md), WebยทNative `src/screens.tsx`ยท`src/screen-flows.tsx`; ๊ธฐ์กด ๊ฐ๋ณ ์ง์นจ์ ์ ๊ท๊ฒฉ์ผ๋ก ํตํฉ. ์์ ์คํ ๋ฆฌ๋ 2026-10-06 ์ฌ์ฉ์ ์น์ธ์ผ๋ก ์คํ ๋ฆฌ๋ถ ๋ฐฐํฌ([์น์ธ ๊ธฐ๋ก](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-์ ์ฒด-์น๊ฒฉ๊ณผ-๊ท๊ฒฉ-ํ์ )). ์คํ ๋ฆฌ๋ถ ๋ฐฐํฌ๋ API ๊ฒ์๊ฐ ์๋๋ค(`์ ์ฉ` ์ฐธ๊ณ )
|
|
9
9
|
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/ํ๋ฉด/์ฝํ
์ธ /๋ชฉ๋ก๊ณผ ์์ธ`
|
|
10
10
|
|
|
@@ -64,11 +64,11 @@ import { ListDetailScreen } from "@hjmds/react-native/screen-flows";
|
|
|
64
64
|
| prop | ๊ฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|
|
65
65
|
| --- | --- | --- | --- |
|
|
66
66
|
| `list` | `ReactNode` | ํ์ | ๋ชฉ๋ก pane ๋ณธ๋ฌธ. ์์ธ๊ฐ ์ด๋ ค๋ mount๋ฅผ ์ ์งํ๋ค |
|
|
67
|
-
| `detail` | `{ title
|
|
67
|
+
| `detail` | `{ title; content; state?; stateAction?; notice? }` | ์์ | ์์ผ๋ฉด ์์ธ pane์ ๋ณด์ด๊ณ ๋ชฉ๋ก pane์ ์จ๊ธด๋ค. ๋ซํ ์ํ๋ prop์ ๋นผ์ ํํํ๋ค(`undefined`๋ฅผ ๋๊ธฐ์ง ์๋๋ค) |
|
|
68
68
|
| `back` | `ScreenFlowAction`(`{ label, onAction(), disabled?, pending? }`) | ํ์ | ์์ธ pane `leading` ์๋ฆฌ์ ghost ๋ฒํผ |
|
|
69
69
|
| `refresh` | `ScreenFlowAction` | ์์ | ๋ชฉ๋ก pane `actions` ์๋ฆฌ์ ghost ๋ฒํผ. ์ฃผ๋ฉด `actions`๋ฅผ ๋ฎ๋๋ค |
|
|
70
70
|
| `loadMore` | `ScreenFlowAction` | ์์ | ๋ชฉ๋ก pane footer์ ghost ๋ฒํผ |
|
|
71
|
-
| `layoutStyle` | `HjmCompositionStyleProp` | ์์ | WebยทNative ๋ชจ๋ ๋ชฉ๋กยท์์ธ pane์ ํจ๊ป ๋ด๋ **๋ฐ๊นฅ ํ**์ ์ ์ฉํ๋ค(์์ชฝ ๋ชฉ๋ก ScreenLayout์ด ์๋๋ค). ๋ชฉ๋ก/์์ธ ์ ํ๊ณผ ์๊ด์์ด ๊ฐ์ ๋ฃจํธ์
|
|
71
|
+
| `layoutStyle` | `HjmCompositionStyleProp` | ์์ | WebยทNative ๋ชจ๋ ๋ชฉ๋กยท์์ธ pane์ ํจ๊ป ๋ด๋ **๋ฐ๊นฅ ํ**์ ์ ์ฉํ๋ค(์์ชฝ ๋ชฉ๋ก ScreenLayout์ด ์๋๋ค). ๋ชฉ๋ก/์์ธ ์ ํ๊ณผ ์๊ด์์ด ๊ฐ์ ๋ฃจํธ์ ๋จ๋๋ค(1.13.0) |
|
|
72
72
|
| ๋๋จธ์ง | `ScreenLayout`๊ณผ ๊ฐ์(`children`ยท`footer` ์ ์ธ) | โ | ๋ชฉ๋ก pane์๋ง ์ ์ฉ๋๋ค(`title` ํ์, `state`, `scroll` ๋ฑ) |
|
|
73
73
|
|
|
74
74
|
## ๋ฐฐ์น
|
|
@@ -84,7 +84,7 @@ import { ListDetailScreen } from "@hjmds/react-native/screen-flows";
|
|
|
84
84
|
## ๊ผญ ์งํฌ ๊ฒ
|
|
85
85
|
|
|
86
86
|
- ๋ผ๋ฒจ์ ๋ชจ๋ i18n ํค๋ก ๋ฃ๋๋ค.
|
|
87
|
-
- `state`(๋ก๋ฉยท๋นยท์ค๋ฅยท์ ํ)๋ ๋ชฉ๋ก pane์๋ง ์ ์ฉ๋๋ค.
|
|
87
|
+
- `state`(๋ก๋ฉยท๋นยท์ค๋ฅยท์ ํ)๋ ๋ชฉ๋ก pane์๋ง ์ ์ฉ๋๋ค. ์์ธ ์ต์ด ์กฐํยท์ค๋ฅ๋ `detail.state`, ์ฌ์๋๋ `detail.stateAction`, ๊ธฐ์กด ์์ธ๋ฅผ ์ ์งํ๋ ๊ฐฑ์ ์คํจ๋ `detail.notice`๋ก ์ ๋ฌํ๋ค. ๋ฏธ๊ฒ์(1.18.0 ์ดํ)์ ์ถ๊ฐ๋ ์ ํ prop์ด๋ฉฐ ์ด์ ์ค์น ๋ฒ์ ์์๋ ์์ธ content ์์ ์ํ๋ฅผ ๊ตฌ์ฑํ๋ค.
|
|
88
88
|
- Web์ ์์ธ ์ง์
์ ๋ค๋ก ๋ฒํผ์ ํฌ์ปค์ค๋ฅผ ์ฎ๊ธฐ๊ณ ๋ณต๊ท ์ ๋ชฉ๋ก์ ์๋ ์์๋ก ๋๋ฆฐ๋ค. ์์๊ฐ ์ญ์ ๋์์ผ๋ฉด ๋ชฉ๋ก ๋ณธ๋ฌธ์ผ๋ก ์ด๋ํ๋ค.
|
|
89
89
|
์ฒ์๋ถํฐ `detail`์ด ์๋ ์ฑ๋ก mount๋๋ฉด(๋ฅ๋งํฌ) ์ฌ์ฉ์ ์ ํ์ด ์๋๋ฏ๋ก ํฌ์ปค์ค๋ฅผ ์ฎ๊ธฐ์ง ์๋๋ค. ๊ทธ๋ ํฌ์ปค์ค๋ ์ ํ router๊ฐ ์ ํ๋ค.
|
|
90
90
|
- ์์ธ ์ด๋ฆผ ์ํ๋ ์ ํ์ด ๊ฐ์ง๋ค. OS ๋ค๋ก๊ฐ๊ธฐยท๋ธ๋ผ์ฐ์ ๋ค๋ก๊ฐ๊ธฐ์ `back`์ ์ ํ router์์ ํจ๊ป ์ฐ๊ฒฐํ๋ค.
|
|
@@ -99,5 +99,5 @@ import { ListDetailScreen } from "@hjmds/react-native/screen-flows";
|
|
|
99
99
|
## ํจ์
|
|
100
100
|
|
|
101
101
|
- `refresh`๋ฅผ ์ฃผ๋ฉด ScreenLayout `actions`๋ ๋ฌด์๋๋ค. ๋ ๋ค ํ์ํ๋ฉด `refresh` ๋์ `actions`์ ์ง์ ์กฐํฉํ๋ค.
|
|
102
|
-
- ์์ธ pane์ `title
|
|
102
|
+
- ์์ธ pane์ `title`ยท`state`ยท`stateAction`ยท`notice`์ `back`(leading)์ ๋ฐ๋๋ค. ์์ธ ์ชฝ `description`ยท`actions`ยทfooter ์๋ฆฌ๋ ์๋ค.
|
|
103
103
|
- `loadMore`๋ ์ํ ์๋ ๋ฒํผ์ด๋ค. ๋ยท์ค๋ฅยท์ค๋ณต ์์ฒญ ๋ฐฉ์ง๊ฐ ํ์ํ๋ฉด LoadMore๋ฅผ ์ด๋ค.
|
|
@@ -54,6 +54,8 @@ import { Avatar, ListRow } from "@hjmds/react-native/data-display";
|
|
|
54
54
|
<ListRow title={member.name} description={member.role}
|
|
55
55
|
leading={<Avatar name={member.name} decorative />} leadingShape="circle"
|
|
56
56
|
trailingText={t("member.joined", { date })} onPress={() => openMember(member.id)} />
|
|
57
|
+
|
|
58
|
+
<ListRow title={t("account.delete")} tone="danger" onPress={openDeleteConfirmation} />
|
|
57
59
|
```
|
|
58
60
|
|
|
59
61
|
## ์ถ๊ณผ ๊ธฐ๋ณธ๊ฐ
|
|
@@ -62,15 +64,16 @@ import { Avatar, ListRow } from "@hjmds/react-native/data-display";
|
|
|
62
64
|
| --- | --- | --- | --- |
|
|
63
65
|
| `density` | `compact` ยท `comfortable` ยท `relaxed` ยท `spacious` | `comfortable` | ์ต์ ๋์ด๋ ์ค๋ช
์ ๋ฌด(ํ ์คยท๋ ์ค)์ ํจ๊ป ์ ํด์ง๋ค |
|
|
64
66
|
| `leadingShape` | `square` ยท `circle` | `square` | leading ํ๋ ์ ํฌ๊ธฐ๋ recipe๊ฐ ๊ทธ๋ฆฐ๋ค |
|
|
67
|
+
| `tone` | `default` ยท `danger` | `default` | ํํด ๊ฐ์ ํ๊ดด์ ๋ชฉ์ ์ง ์ ๋ชฉ์ `danger`๋ก ๊ฐ์กฐํ๋ค. ์ ํยท์ ๊ธยท๋ฐ๋์ ๋
๋ฆฝ์ ์ด๋ค |
|
|
65
68
|
| `selected` | `true` ยท `false` | `false` | โ |
|
|
66
69
|
| `disabled` | `true` ยท `false` | `false` | โ |
|
|
67
70
|
| `href`(Web) | ๋ฌธ์์ด | โ | ์์ผ๋ฉด `<a>` ํ |
|
|
68
71
|
| `onClick`(Web) | `(event: MouseEvent<HTMLElement>) => void` | โ | ์์ผ๋ฉด `<button>` ํ |
|
|
69
72
|
| `onPress`(Native) | `(event: GestureResponderEvent) => void` | โ | ์์ผ๋ฉด ๋๋ฅผ ์ ์๋ ํ |
|
|
70
|
-
| `loading`ยท`loadingLabel`
|
|
73
|
+
| `loading`ยท`loadingLabel` | `boolean` ยท ํ์งํ ๋ฌธ์์ด | `false` ยท โ | ๊ฐ์ ์ฌ๋กฏ ๋ชจ์์ ์๋ฆฌํ์ ํ. `loadingLabel`์ด ์ํ๋ก ์ฝํ๋ค |
|
|
71
74
|
| `trailingAction`(Native) | ReactNode | โ | ํ ๋ช
๋ น ์์ ๋ฐ๋ก ๊ทธ๋ฆฌ๋ ๋ณ๋ target(IconButton ๋ฑ). ์๊ธฐ `onPress`๋ฅผ ๊ฐ์ง๋ค |
|
|
72
75
|
| `layoutStyle` | ๋ฐฐ์น key๋ง | โ | ํ ๋ฃจํธ ๋ฐฐ์น. Native๋ ์ฌ๋กฏ ๋ฐฐ์น์ฉ `leadingStyle`ยท`contentStyle`ยท`titleRowStyle`ยท`trailingStyle`ยท`trailingActionStyle`(๋ชจ๋ ๋ฐฐ์น key๋ง)๋ ๋ฐ๋๋ค |
|
|
73
|
-
| `titleStyle`ยท`descriptionStyle`(Native) | โ | โ |
|
|
76
|
+
| `titleStyle`ยท`descriptionStyle`(Native) | โ | โ | ์ ๊ฑฐ๋ ์์ฑ โ ๋ฐฐ์น๋ `layoutStyle`, ์ ๋ชฉ์ ์ํ์์ `tone="danger"`, ๊ธ์๋ listRowRecipe๊ฐ ์ ํ๋ค |
|
|
74
77
|
|
|
75
78
|
- ์ํธ์์ฉ: Web์ `href`๋ฉด `<a>`(selected๋ `aria-current="page"`), `onClick`์ด๋ฉด `<button>`(selected๋ `aria-pressed`),
|
|
76
79
|
๋ ๋ค ์์ผ๋ฉด `<div>`. Native๋ `onPress`๊ฐ ์์ผ๋ฉด ๋๋ฅผ ์ ์๋ ํ์ด ๋๋ค.
|
|
@@ -116,7 +119,7 @@ Native ์ํ leading์ `full`์ Provider token์์ ์ฝ์ง๋ง ๊ณ ์ ์ํ
|
|
|
116
119
|
| ํญ๋ชฉ | Web | Native |
|
|
117
120
|
| --- | --- | --- |
|
|
118
121
|
| ์ ๋ชฉยท์ค๋ช
ํ์
| `ReactNode` | `string` |
|
|
119
|
-
| ์๋ฆฌํ์ ํ | `loading` + `loadingLabel` |
|
|
122
|
+
| ์๋ฆฌํ์ ํ | `loading` + `loadingLabel` | `loading` + `loadingLabel` |
|
|
120
123
|
| ๋งํฌ ํ | `href` | ์์(`onPress`์์ router ํธ์ถ) |
|
|
121
124
|
| ์ ๋ชฉ ์ ๋ฉํยท๋ณ๋ ๋ค ํ๋ยท๋ค ๋ฌธ๊ตฌ | โ | `titleMetadata`, `trailingAction`, `trailingText` |
|
|
122
125
|
| ์ ๊ทผ์ฑ ์ด๋ฆ ์กฐํฉ | ์์ ๋ด์ฉ | `accessibilityLabel` ์์ผ๋ฉด ์ ๋ชฉยท`metadataLabel`ยท์ค๋ช
ยท`trailingLabel`์ ์ด์ด ๋ถ์ |
|
|
@@ -125,4 +128,10 @@ Native ์ํ leading์ `full`์ Provider token์์ ์ฝ์ง๋ง ๊ณ ์ ์ํ
|
|
|
125
128
|
## ํจ์
|
|
126
129
|
|
|
127
130
|
- Web ๋ก๋ฉ ํ์ ์ฌ๋กฏ์ **์กด์ฌ**๋ก ๋ชจ์์ ์ ํ๊ณ ๋ฌธ๊ตฌ๋ ๋ฌด์ํ๋ค. ์ค์ ํ๊ณผ ๊ฐ์ ์ฌ๋กฏ์ ๋๊ฒจ์ผ ๋์ด๊ฐ ๋ง๋๋ค.
|
|
128
|
-
- Native `titleStyle`ยท`descriptionStyle`์
|
|
131
|
+
- Native `titleStyle`ยท`descriptionStyle`์ ์ ๊ฑฐ๋์๋ค. ํ๊ดด์ ๋ชฉ์ ์ง์ ์ ๋ชฉ ๊ฐ์กฐ์๋ ์ ํ๋ซํผ ๊ณตํต `tone="danger"`๋ฅผ ์ฌ์ฉํ๋ค. `tone`์ ํ์ธ ์ ์ฐจ๋ ์ญ์ ์คํ์ ๋์ ํ์ง ์๋๋ค.
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
๋ก๋ฉ ํ์ ์ค์ ListRow์ densityยทํ ์ค/๋ ์ค ์ต์ ๋์ด์ padding์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค. ๋ ์ค ๊ฒฐ๊ณผ๋ฅผ
|
|
135
|
+
์์ํ๋ฉด `description`์ ์ ๊ณตํ๋ค(์๋ฆฌํ์ ์ค ๋ฌธ๊ตฌ ์์ฒด๋ ํ์ํ์ง ์๋๋ค). loading ๋์ ํ๊ณผ
|
|
136
|
+
trailingAction์ ์คํํ ์ ์์ผ๋ฉฐ ์ค์ ์ฌ๋กฏ ๋ด์ฉ๋ ๋ง์ดํธํ์ง ์๋๋ค. ์ฌ๋ฌ ๋ก๋ฉ ํ ์ค ์ฒซ ํ์๋ง
|
|
137
|
+
`loadingLabel`์ ์ฃผ๊ณ ๋๋จธ์ง๋ ์ ๊ทผ์ฑ ํธ๋ฆฌ์์ ์จ๊ธด๋ค. ๊ฒ์ ํ๋ฉด๋ ์์ Skeleton ์กฐ๋ฆฝ ๋์ ์ด ๊ณ์ฝ์ ์ด๋ค.
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
| ํ๋ฉด ํํ | ์ธ ๊ฒ |
|
|
20
20
|
| --- | --- |
|
|
21
21
|
| ์์ญ ๊ฐ ์ดํ์ ํ์ ํ ๋ฒ์ ๊ทธ๋ฆผ(์ค์ , ๊ณ์ ๋ฉ๋ด, ๊ฒ์ ๊ฒฐ๊ณผ ํ ํ์ด์ง) | `List` + `ListRow` |
|
|
22
|
-
| ์ ํ ์นด๋ ์ฌ๋ฌ ์ฅ์ ๋
๋ฆฝ ์
๋ ฅ/ํ๋์ ํจ๊ป ๋ณด์ฌ์ฃผ๋ ๊ฐ๋ก ํ์ | `CollectionRail` (
|
|
22
|
+
| ์ ํ ์นด๋ ์ฌ๋ฌ ์ฅ์ ๋
๋ฆฝ ์
๋ ฅ/ํ๋์ ํจ๊ป ๋ณด์ฌ์ฃผ๋ ๊ฐ๋ก ํ์ | `CollectionRail` (1.16.0 ์ถ๊ฐยท์คํ, ์๋ ๊ฐ๋ก ๋ฐฐ์น ์ง์นจ) |
|
|
23
23
|
| ํ ํ ์ค์ ์ ๋ชฉยท์ค๋ช
ยท์๋ค ์ฌ๋กฏ | [ListRow](list-row.md) |
|
|
24
24
|
| ๋์ด๊ฐ ๊ณ ์ ๋ ํ ์๋ฐฑ~์์ฒ ๊ฐ๋ฅผ ์ฐฝ ์์์ ์คํฌ๋กค | [VirtualList](virtual-list.md) |
|
|
25
25
|
| ์ด์ด์ง๋ ๋ชฉ๋ก์ ๋ค์ ํ์ด์ง ์์ฒญ footer | [LoadMore](load-more.md) (ListยทVirtualList ์๋์ ๋๋ค) |
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
| --- | --- | --- | --- |
|
|
43
43
|
| `List` | ๊ธฐ๋ณธ | `@hjmds/react`, `/display` | `@hjmds/react-native`, `/data-display` |
|
|
44
44
|
| `TaskList` | ํ์ฅ โ ์๋ฃ ์ฒดํฌ ๋ชฉ๋ก(optional) | `/task-list` | `/task-list` |
|
|
45
|
+
| `CollectionRail` | ๋๋ฐยท๋์ โ ๋
๋ฆฝ ํ๋์ ๊ฐ์ง ์ ํ ๊ฐ๋ก ๋ชฉ๋ก([๊ตฌ์ฑ ์ง์นจ](../compositions/collection-detail.md)) | `/collection-rail` | `/collection-rail` |
|
|
45
46
|
|
|
46
47
|
`TaskList`๋ granular subpath๋ก๋ง import ๋๋ค. ์ถ๊ฐ peer๋ ์๋ค. ์์ ๋ฐ๊พธ๊ธฐ๋ฅผ ํฉ์ฑํ๋ฉด SortableCollection์ peer๊ฐ ํ์ํ๋ค.
|
|
47
48
|
|
|
@@ -74,7 +75,7 @@ import { Text } from "@hjmds/react-native/primitives";
|
|
|
74
75
|
| `label` | ํ์งํ ๋ฌธ์์ด(ํ์) | โ | ๋ชฉ๋ก์ ์ ๊ทผ์ฑ ์ด๋ฆ. ๋น๋ฉด `TypeError` |
|
|
75
76
|
| `separator` | `indented` ยท `full` ยท `none` | `indented` | `indented`๋ leading ์ฌ๋กฏ ํญ๋งํผ ๋ค์ฌ์ |
|
|
76
77
|
| `appearance` | `plain` ยท `grouped` | `plain` | `grouped`๋ ๋ฐฐ๊ฒฝ๊ณผ ๋ฅ๊ทผ ๋ชจ์๋ฆฌ๋ก ํ ๋ฉ์ด๋ฆฌ |
|
|
77
|
-
| `layoutStyle` | ๋ฐฐ์น key๋ง | โ | ๋ชฉ๋ก ๋ฃจํธ ๋ฐฐ์น. Native `style`์
|
|
78
|
+
| `layoutStyle` | ๋ฐฐ์น key๋ง | โ | ๋ชฉ๋ก ๋ฃจํธ ๋ฐฐ์น. Native `style`์ ์ ๊ฑฐ๋ ์์ฑ โ `layoutStyle`, ๋ชจ์์ `appearance`ยท`separator` |
|
|
78
79
|
| TaskList `items` | `readonly TaskItem[]` โ `{ id, label, completed, description?, disabled? }` | โ | `id`ยท`label`์ด ๋น๊ฑฐ๋ `id`๊ฐ ์ค๋ณต๋๊ฑฐ๋ `completed`๊ฐ boolean์ด ์๋๋ฉด `TypeError` |
|
|
79
80
|
| TaskList `onCompletedChange` | `(id: string, completed: boolean) => void` | โ | ํ์. ์ฒดํฌ ํ๋๋ง๋ค ํ ๋ฒ. ๋ชฉ๋ก ์์ยท์ ์ฅ์ ์ ํ์ด ์ ํ๋ค |
|
|
80
81
|
| TaskList `disabled` | `true` ยท `false` | `false` | ์ ์ฒด ์ฒดํฌ๋ฐ์ค๋ฅผ ๋๋ค |
|
|
@@ -110,7 +111,7 @@ Native `grouped` ํ๋ ์์ Provider์ `tokens.radius.lg`๋ฅผ ์ฝ๋๋ค. plain
|
|
|
110
111
|
|
|
111
112
|
### CollectionRail ๊ฐ๋ก ๋ฐฐ์น
|
|
112
113
|
|
|
113
|
-
์ `CollectionRail`์
|
|
114
|
+
์ `CollectionRail`์ 1.16.0 ์ถ๊ฐ ์คํ companion์ด๋ค. ๊ธฐ์กด List์ ๋ฐฐํฌ/ํธํ ๊ณ์ฝ์ ์ ์งํ๋ค.
|
|
114
115
|
|
|
115
116
|
#### ์ธ์ ์ฐ๋
|
|
116
117
|
|
|
@@ -196,7 +197,7 @@ import { CollectionRail } from "@hjmds/react/collection-rail";
|
|
|
196
197
|
| --- | --- | --- |
|
|
197
198
|
| ๊ตฌ์กฐ | `role="list"` + ์์๋ง๋ค `role="listitem"` | `accessibilityRole="list"` |
|
|
198
199
|
| ๊ตฌ๋ถ์ | CSS(`data-separator`) | ํ ์ฌ์ด 1px `View` |
|
|
199
|
-
| ๋ฐฐ์น | `layoutStyle`(+ `className`) | `layoutStyle`(`style`์
|
|
200
|
+
| ๋ฐฐ์น | `layoutStyle`(+ `className`) | `layoutStyle`(`style`์ ์ ๊ฑฐ๋ ์์ฑ) |
|
|
200
201
|
|
|
201
202
|
2026-10-07 Utilverse ํญ๋ชฉ ์ญ์ ์ฑํ์ ์ํด `renderItemAction`์ ์ถ๊ฐํ๋ค. ์ฒดํฌ์ ์ญ์ ์ ์ด์ ยท๋๋ฆ์ ๋ถ๋ฆฌํ๊ณ ํฐ ๊ธ์ ๋ผ๋ฒจ ํญ์ ๋ณด์กดํ๋๋ก ํ๋์ ๋ค์ ์ค์ ๋๋ค. `renderCollection`์ `renderItem`์๋ ํฌํจ๋๋ค. ์ญ์ ์ ์ฅยท์คํจยท๋๋๋ฆฌ๊ธฐ๋ ์ ํ์ด ์ฒ๋ฆฌํ๋ค.
|
|
202
203
|
|
|
@@ -88,6 +88,7 @@ import { Masonry } from "@hjmds/react-native/masonry";
|
|
|
88
88
|
- `width`๊ฐ 0 ์ดํ์ด๊ฑฐ๋ ์ด ํญ์ด 0 ์ดํ, `getItemHeight`๊ฐ ์์ ์ ํ์๊ฐ ์๋๋ฉด `TypeError`๊ฐ ๋๋ค. ํญ๋ชฉ์ด ๋น์ด
|
|
89
89
|
`empty`๋ง ๊ทธ๋ฆด ๋๋ ๊ธฐํ ๊ฒ์ฌ๋ฅผ ๋จผ์ ํ๋ฏ๋ก ๊ฐ๋ค. ์ธก์ ์ (ํญ 0)์๋ Masonry๋ฅผ ๋ ๋ํ์ง ์๋๋ค.
|
|
90
90
|
- ํ๋ฉด ํญ์ด ๋ฐ๋๋ฉด `width`๋ฅผ ๋ค์ ๋๊ธด๋ค.
|
|
91
|
+
- ๋น ๋ชฉ๋ก๋ `width`๋ฅผ ์ ์งํ๋ฉฐ, `layoutStyle`๋ก ํ ๋นํ ์์ญ ์์์ ์๋ด๋ฅผ ๊ฐ๋กยท์ธ๋ก ์ค์์ ๋๋๋ค. ๋์ด๋ฅผ ์ง์ ํ์ง ์์ ๋ณธ๋ฌธ์์๋ ์๋ด์ ๋ด์ฉ ๋์ด๋ฅผ ์ฌ์ฉํ๋ค.
|
|
91
92
|
|
|
92
93
|
## ํ๋ซํผ ์ฐจ์ด
|
|
93
94
|
|
|
@@ -100,7 +101,7 @@ import { Masonry } from "@hjmds/react-native/masonry";
|
|
|
100
101
|
## ํจ์
|
|
101
102
|
|
|
102
103
|
- ๋ชจ๋ ํญ๋ชฉ์ ํ ๋ฒ์ ๊ทธ๋ฆฐ๋ค. ํญ๋ชฉ์ด ๋ง์ ๋ฌดํ ํผ๋์์๋ ๋ ๋ ๋น์ฉ์ด ์์ธ๋ค.
|
|
103
|
-
- ํญ๋ชฉ์ด ์์ผ๋ฉด `empty`๋ง ๊ทธ๋ฆฌ๊ณ ๋ชฉ๋ก role์ด ๋ถ์ง ์๋๋ค. Web ๋น ๋ถ๊ธฐ๋ `role="group"` + `label` ์ด๋ฆ์ด๋ค(
|
|
104
|
+
- ํญ๋ชฉ์ด ์์ผ๋ฉด `empty`๋ง ๊ทธ๋ฆฌ๊ณ ๋ชฉ๋ก role์ด ๋ถ์ง ์๋๋ค. Web ๋น ๋ถ๊ธฐ๋ `role="group"` + `label` ์ด๋ฆ์ด๋ค(1.13.0 ๋ณ๊ฒฝ.
|
|
104
105
|
1.12.1์ role ์๋ `<div aria-label>`์ด๋ผ ์ด๋ฆ์ด ๋
ธ์ถ๋์ง ์์๋ค). ๋น ์ํ ๋ฌธ๊ตฌ๋ `empty` ์์ ๋ณด์ด๋ ๊ธ๋ก ๋๋ค.
|
|
105
106
|
- ๋ค์ ํ์ด์ง๋ ๋ชฉ๋ก ๋ค์ ํ์ ๋ก [LoadMore](load-more.md)๋ฅผ ๋๋ค. Native์์ FlatList ๋ฐ(ScrollView ์ Masonry)์ด๋ฉด
|
|
106
107
|
`onEndReached`๊ฐ ์์ผ๋ฏ๋ก `mode="manual"`๋ก ๋๋ค. Web `automatic`์ sentinel๋ก ๋์ํ์ง๋ง ๋น๊ฐ์ํ๋ผ ํญ๋ชฉ์ด
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
4
|
- ์ํ: ๋ฐฐํฌ
|
|
5
5
|
- ์ง์: Web ยท Native
|
|
6
|
-
- ์ ์ฉ:
|
|
7
|
-
- ๊ฒํ ์ผ: 2026-10-
|
|
6
|
+
- ์ ์ฉ: 1.17.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-13
|
|
8
8
|
- ๊ทผ๊ฑฐ: [๋ฐ๋ณต ํ๋ฉด ์กฐํฉ](../../screen-patterns.md), WebยทNative `src/screens.tsx`ยท`src/screen-flows.tsx`; ๊ธฐ์กด ๊ฐ๋ณ ์ง์นจ์ ์ ๊ท๊ฒฉ์ผ๋ก ํตํฉ. ์์ ์คํ ๋ฆฌ๋ 2026-10-06 ์ฌ์ฉ์ ์น์ธ์ผ๋ก ์คํ ๋ฆฌ๋ถ ๋ฐฐํฌ([์น์ธ ๊ธฐ๋ก](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-์ ์ฒด-์น๊ฒฉ๊ณผ-๊ท๊ฒฉ-ํ์ )). ์คํ ๋ฆฌ๋ถ ๋ฐฐํฌ๋ API ๊ฒ์๊ฐ ์๋๋ค(`์ ์ฉ` ์ฐธ๊ณ )
|
|
9
9
|
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/ํ๋ฉด/์ฝํ
์ธ /์ฌ์ง ์ ํ๊ณผ ์
๋ก๋`
|
|
10
10
|
|
|
@@ -44,7 +44,7 @@ import { MediaSelectionScreen } from "@hjmds/react/screen-flows";
|
|
|
44
44
|
items={picked.map((p) => ({ descriptor: { id: p.id, name: p.fileName, state: p.upload },
|
|
45
45
|
preview: <img src={p.uri} alt="" width={p.width} height={p.height} /> }))}
|
|
46
46
|
add={{ label: t("media.add"), onAction: openPicker }}
|
|
47
|
-
done={{ label: t("media.done"), onAction: submit, disabled: uploading }}
|
|
47
|
+
done={{ label: t("media.done"), onAction: submit, disabled: uploading || !canComplete }}
|
|
48
48
|
labels={{ pending: t("upload.pending"), uploading: t("upload.uploading"),
|
|
49
49
|
success: t("upload.success"), cancel: t("upload.cancel"), retry: t("upload.retry") }}
|
|
50
50
|
actionLabels={{ remove: t("media.remove"), moveUp: t("media.moveUp"), moveDown: t("media.moveDown") }}
|
|
@@ -66,7 +66,7 @@ import { Image } from "react-native";
|
|
|
66
66
|
items={picked.map((p) => ({ descriptor: { id: p.id, name: p.fileName, state: p.upload },
|
|
67
67
|
preview: <Image src={p.uri} width={p.width} height={p.height} /> }))}
|
|
68
68
|
add={{ label: t("media.add"), onAction: openPicker }}
|
|
69
|
-
done={{ label: t("media.done"), onAction: submit, disabled: uploading }}
|
|
69
|
+
done={{ label: t("media.done"), onAction: submit, disabled: uploading || !canComplete }}
|
|
70
70
|
labels={{ pending: t("upload.pending"), uploading: t("upload.uploading"),
|
|
71
71
|
success: t("upload.success"), cancel: t("upload.cancel"), retry: t("upload.retry") }}
|
|
72
72
|
actionLabels={{ remove: t("media.remove"), moveUp: t("media.moveUp"), moveDown: t("media.moveDown") }}
|
|
@@ -104,7 +104,7 @@ Web์ `<img alt="">`๋ ์ฅ์์ฉ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ค. ์ฌ์ง ์ด๋ฆ์ `removeLabe
|
|
|
104
104
|
| ๊ฐ๊ฒฉ | ํ๋ฉด padding `spacing.md` 16; ๊ฒฉ์ ๊ฐ๊ฒฉ `spacing.md` 16; ํญ๋ชฉ ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐโUploadItemโ๋ฒํผ ์ค `spacing.xs` 8; ๋ฒํผ ์ฌ์ด `spacing.xxs` 4; footer ์์ฝโ์๋ฃ `spacing.sm` 12 | WebยทNative `MediaSelectionScreen` |
|
|
105
105
|
| ์์ยท์ ๋ ฌ | ํค๋(์ ๋ชฉ โ ์ถ๊ฐ) โ ๊ฒฉ์(ํญ๋ชฉ๋ง๋ค ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ UploadItem โ ์๋กยท์๋๋กยท์ญ์ ) โ footer(`selectionSummary` โ ์๋ฃ) | ๋ ๋ ์์ |
|
|
106
106
|
| ๊ณ ์ ยท์คํฌ๋กค | ํค๋ยทfooter ๊ณ ์ , ๊ฒฉ์๋ ๋ณธ๋ฌธ ์คํฌ๋กค(`scroll` ๊ธฐ๋ณธ `"screen"`) | `ScreenLayout` |
|
|
107
|
-
| ์ข์
|
|
107
|
+
| ์ข์ ํญ | ์ข์ ํญ์์๋ 2์ด ์ ์ง; ํญ๋ชฉ ๋ฒํผ ์ค์ ์ค๋ฐ๊ฟ(`flexWrap: "wrap"`)ํด ๋ฒํผ์ ์๋ฅด์ง ์๋๋ค | `screen-flows.tsx` |
|
|
108
108
|
|
|
109
109
|
## ๊ผญ ์งํฌ ๊ฒ
|
|
110
110
|
|
|
@@ -117,3 +117,9 @@ Web์ `<img alt="">`๋ ์ฅ์์ฉ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ค. ์ฌ์ง ์ด๋ฆ์ `removeLabe
|
|
|
117
117
|
|
|
118
118
|
- `actions`๋ฅผ ๋๊ฒจ๋ `add` ๋ฒํผ์ด ๊ทธ ์๋ฆฌ๋ฅผ ๋ฎ๋๋ค. ๋ค๋ฅธ ์๋จ ํ๋์ `leading`์ด๋ `notice`๋ก ๋๋ค.
|
|
119
119
|
- `library`๋ฅผ ์ฃผ๋ฉด `items` ๊ฒฉ์์ ์
๋ก๋ ์ํ ํ์๋ ๊ทธ๋ ค์ง์ง ์๋๋ค. ์ ํ ๊ฒฐ๊ณผ๋ `selectionSummary`๋ก ๋ณด์ฌ ์ค๋ค.
|
|
120
|
+
|
|
121
|
+
## ์ญ์ ยท์์ ๋ณ๊ฒฝ ํ Web ํค๋ณด๋ ์ด์
|
|
122
|
+
|
|
123
|
+
๊ธฐ๋ณธ ๊ฒฉ์๋ ์ ํ์ด `items` ๋ณ๊ฒฝ์ ๋ฐ์ํ ๋ค ์ด์ ์ ๋ณต๊ตฌํ๋ค. ํ์ฌ ์ฌ์ง์ ์ ๊ฑฐํ๋ฉด ๊ฐ์ ์์น์ ๋ค์ ์ฌ์ง ์ ๊ฑฐ ๋ฒํผ, ๋ง์ง๋ง์ด๋ฉด ์ด์ ์ฌ์ง ์ ๊ฑฐ ๋ฒํผ์ผ๋ก ์ด์ด์ง๋ค. ๋ชจ๋ ์ ๊ฑฐํ๋ฉด ํ์ฑ `add`๋ก ์ด๋ํ๊ณ , ์ถ๊ฐ๋ ์ ๊ฒผ์ผ๋ฉด ๋ณธ๋ฌธ์ ๋จ๋๋ค. ๋ง์ง๋ง ์ ๊ฑฐ์ ๋์์ `state.kind="empty"`๋ก ๋ฐ๊ฟ๋ ๊ฐ์ ๊ท์น์ด๋ค. ์ด๋ ํ ์ฒซยท๋ง์ง๋ง ์์น์ ๋ฒํผ์ด ๋นํ์ฑํ๋๋ฉด ๊ฐ์ ์ฌ์ง์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋์ผ๋ก ์ด์ด์ง๋ค. ์ด์ ์๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์
๋ ฅ๊ณผ ๊ฐ์ key์ธ `descriptor.id`๋ฅผ ๋ฐ๋ผ ์ ์งํ๋ค. ์ด๋๋ ์ด์ ์ด ๋ณธ๋ฌธ ๋ฐ์ผ๋ก ๊ฐ๋ ค์ง๋ฉด `scroll="screen"`์ ๋ณธ๋ฌธ๋ง ํ์ํ ๋งํผ ์คํฌ๋กคํ๋ค.
|
|
124
|
+
|
|
125
|
+
2026-10-13 ์คํ ๊ฒ์์์ ์ญ์ ยท๊ฒฝ๊ณ ์ด๋ ํ ํค๋ณด๋ ๋ฌธ๋งฅ์ด ๋๊ฒจ ์ถ๊ฐํ ๋์์ด๋ค. ์ธ๋ถ ์ปจํธ๋กค๋ก ์ด๋ํ๊ฑฐ๋ ๋ช
์์ ์ผ๋ก blurํ ์ด์ ์ ๊ฐ์ ธ์ค์ง ์๋๋ค. `library`์ ์ด์ ยท์ ํ๊ณผ Native OS ์ ๊ทผ์ฑ ์ด์ ์ ์ด Web DOM ๋ณต๊ตฌ ๋ฒ์์ ํฌํจ๋์ง ์๋๋ค. `done` ํ์ฉ ์กฐ๊ฑด๊ณผ ์์ฒญ ์ทจ์ยท๋ฆ์ ์๋ต ์ฒ๋ฆฌ๋ ๊ณ์ ์ ํ์ด ์์ ํ๋ค.
|
|
@@ -79,7 +79,7 @@ Native ํ๋ณด ๋ชฉ๋ก์ ๋ชจ์๋ฆฌ๋ `comboboxRecipe.popover.radius` ์ญํ ์ P
|
|
|
79
79
|
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
80
80
|
| --- | --- | --- |
|
|
81
81
|
| ํฌ๊ธฐ | ํ๋ณด ํ ์ค ์ต์ ๋์ด 44(`control.minTouchTarget`). Web ๋ชฉ๋ก ์ต๋ ๋์ด `14rem`, ์
๋ ฅ ํญ์ ๋ง์ถค | `.hjm-mentions__option`ยท`__list`, Native `minHeight: 44` |
|
|
82
|
-
| ๊ฐ๊ฒฉ | ๋ผ๋ฒจยท์
๋ ฅยท์ค๋ช
ยท์ค๋ฅ ์ฌ์ด `spacing.xs` 8. Web ๋ชฉ๋ก์ ์
๋ ฅ๊ณผ 8, ํ๋ฉด ๊ฐ์ฅ์๋ฆฌ 8, ์์ชฝ 8, radius `radius.md` 12 โ ๋ชจ๋ Combobox ๋ชฉ๋ก๊ณผ ๊ฐ์ `comboboxRecipe.popover`(sideOffsetยทcollisionPaddingยทpadding `spacing.xs`). Native ๋ชฉ๋ก ์์ชฝ 8(๊ฐ์ recipe)ยทํญ๋ชฉ ์ฌ์ด 4, radius `radius.md` 12. ํ๋ณด ์ข์ฐ ์ฌ๋ฐฑ 8. 2026-10-06๊น์ง Web ๊ฐ์ฅ์๋ฆฌ 16ยท์์ชฝ 4, Native ์์ชฝ 4์๋ค(1.
|
|
82
|
+
| ๊ฐ๊ฒฉ | ๋ผ๋ฒจยท์
๋ ฅยท์ค๋ช
ยท์ค๋ฅ ์ฌ์ด `spacing.xs` 8. Web ๋ชฉ๋ก์ ์
๋ ฅ๊ณผ 8, ํ๋ฉด ๊ฐ์ฅ์๋ฆฌ 8, ์์ชฝ 8, radius `radius.md` 12 โ ๋ชจ๋ Combobox ๋ชฉ๋ก๊ณผ ๊ฐ์ `comboboxRecipe.popover`(sideOffsetยทcollisionPaddingยทpadding `spacing.xs`). Native ๋ชฉ๋ก ์์ชฝ 8(๊ฐ์ recipe)ยทํญ๋ชฉ ์ฌ์ด 4, radius `radius.md` 12. ํ๋ณด ์ข์ฐ ์ฌ๋ฐฑ 8. 2026-10-06๊น์ง Web ๊ฐ์ฅ์๋ฆฌ 16ยท์์ชฝ 4, Native ์์ชฝ 4์๋ค(1.13.0 ๋ณ๊ฒฝ) | `comboboxRecipe.popover`, `.hjm-mentions__*`, `react-native/src/mentions.tsx` |
|
|
83
83
|
| ์์ยท์ ๋ ฌ | ํ๋ณด ๋ชฉ๋ก์ ์
๋ ฅ **๋ฐ๋ก ์๋**. Web์ ์๋ ๊ณต๊ฐ์ด ๋ชจ์๋ผ๋ฉด ์๋ก ๋ค์ง๋๋ค. Web ํ๋ณด๋ `label` ์์ `description`, ์ข์ผ๋ฉด ์ค๋ฐ๊ฟ | `useAnchoredPopup`, `.hjm-mentions__option` |
|
|
84
84
|
| ๊ณ ์ ยท์คํฌ๋กค | Web ๋ชฉ๋ก์ ๋ ์๋ portal(z-index `layer.dropdown` 400)์ด๊ณ ๋์น๋ฉด ๋ชฉ๋ก ์ ์คํฌ๋กค. Native ๋ชฉ๋ก์ ๋ฌธ์ ํ๋ฆ ์์ ๋ผ์ด๋ค์ด ์๋ ๋ด์ฉ์ ๋ฏผ๋ค | `src/mentions.tsx`(WebยทNative) |
|
|
85
85
|
| ์ข์ ํญยทํฐ ๊ธ์ | ํค๋ณด๋ ์ ์
๋ ฅ์ด๋ฉด Native ๋ชฉ๋ก์ด ๊ฐ๋ ค์ง ์ ์์ผ๋ [KeyboardFormScrollView](keyboard-form-scroll-view.md) ์์ ๋๋ค | โ |
|
|
@@ -112,7 +112,7 @@ Web Native
|
|
|
112
112
|
| ํ๋ณด ํ์ | ์
๋ ฅ ์๋ ๋ ์๋ listbox(portal) | ์
๋ ฅ ์๋ ๋ฌธ์ ํ๋ฆ ์ ๋ชฉ๋ก |
|
|
113
113
|
| ํค๋ณด๋ | โโ ์ด๋, Enter ํ์ , Esc ๋ซ๊ธฐ(์
๋ ฅ์ ์ ์ง) | ํด๋น ์์(๋๋ฆ์ผ๋ก ํ์ ) |
|
|
114
114
|
| ๊ธฐ๋ณธ ํ๋ณด ๋ ๋ | `label` + `description` | `label`๋ง |
|
|
115
|
-
| ์ถ๊ฐ prop | `className`, ref(`HTMLTextAreaElement`). `style`์ ์์ชฝ textarea์ ๋ถ๋๋ค | `listStyle`์
|
|
115
|
+
| ์ถ๊ฐ prop | `className`, ref(`HTMLTextAreaElement`). `style`์ ์์ชฝ textarea์ ๋ถ๋๋ค | `listStyle`์ ์ ๊ฑฐ๋ ์์ฑ(ํ๋ณด ๋ชฉ๋ก์ ์ธํ์ recipe๊ฐ ์์ ํ๋ค) |
|
|
116
116
|
|
|
117
117
|
## ํจ์
|
|
118
118
|
|
|
@@ -89,7 +89,7 @@ Native popover์ ํญ๋ชฉ ๋ชจ์๋ฆฌ๋ Provider token์์ recipe ์ญํ ์ ํด
|
|
|
89
89
|
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
90
90
|
| --- | --- | --- |
|
|
91
91
|
| ํฌ๊ธฐ | ํญ๋ชฉ ๋์ด `comfortable` 56(`layout.rowHeight.singleLine`) ยท `compact` 44(`control.minTouchTarget`). Web ํ๋ฉด ํญ `13.75rem`~`min(24rem, 90vw)`, ๋์ด ์ต๋ `100dvh โ 2 ร spacing.md`. Native ํ๋ฉด ํญ 100%ยท์ต๋ 520, ๋์ด ์ต๋ 75% | `menuRecipe.density`, `.hjm-menu__content`, `react-native/src/navigation.tsx` |
|
|
92
|
-
| ๊ฐ๊ฒฉ | ํญ๋ชฉ ์ข์ฐ `spacing.sm` 12, leadingยท๋ฌธ๊ตฌยท๋จ์ถํค ์ฌ์ด 12. ์น์
์ ๋ชฉ ์ข์ฐ 12 ยท ์์๋ `spacing.xs` 8. Web: ํธ๋ฆฌ๊ฑฐ์ 8(`menuRecipe.sideOffset`), ํ๋ฉด ๊ฐ์ฅ์๋ฆฌ 8(`collisionPadding`), ์์ชฝ `spacing.xs` 8(`menuRecipe.surface.padding`; 2026-10-06๊น์ง 4, 1.
|
|
92
|
+
| ๊ฐ๊ฒฉ | ํญ๋ชฉ ์ข์ฐ `spacing.sm` 12, leadingยท๋ฌธ๊ตฌยท๋จ์ถํค ์ฌ์ด 12. ์น์
์ ๋ชฉ ์ข์ฐ 12 ยท ์์๋ `spacing.xs` 8. Web: ํธ๋ฆฌ๊ฑฐ์ 8(`menuRecipe.sideOffset`), ํ๋ฉด ๊ฐ์ฅ์๋ฆฌ 8(`collisionPadding`), ์์ชฝ `spacing.xs` 8(`menuRecipe.surface.padding`; 2026-10-06๊น์ง 4, 1.13.0 ๋ณ๊ฒฝ), ํ๋ฉดยทํญ๋ชฉ radius `radius.md` 12, ๊ตฌ๋ถ์ ์์๋ 4 ยท ์ข์ฐ 8. Native: ๋ฐ๊นฅ ์ฌ๋ฐฑยท์์ชฝ `spacing.md` 16, ์ ๋ชฉยท๋ชฉ๋กยท๋ซ๊ธฐ ์ฌ์ด 12, radius `radius.lg` 16 | `collectionItemContract`, `menuRecipe.sectionLabel`ยท`surface`, `.hjm-menu__*`, `useAnchoredPopup` |
|
|
93
93
|
| ์์ยท์ ๋ ฌ | ์ผ๋ฐ ํ๋์ ์์, `danger` ํ๋์ ๋งจ ์๋. Web `align="start"`(๊ธฐ๋ณธ)๋ ํธ๋ฆฌ๊ฑฐ ์์ ๋, `end`๋ ๋ ๋์ ๋ง์ถ๋ค(ํ ๋ โฏ์ `end`). Native๋ ์โ์๋ ์ ๋ชฉ โ ํญ๋ชฉ โ ๋ซ๊ธฐ ๋ฒํผ(`secondary`) | `menuRecipe`, `src/overlays.tsx` |
|
|
94
94
|
| ๊ณ ์ ยท์คํฌ๋กค | Web: ํธ๋ฆฌ๊ฑฐ์ ๋ถ๋ portal(z-index `layer.dropdown` 400), ์๋๊ฐ ๋ชจ์๋ผ๋ฉด ์๋ก ๋ค์ง๊ณ ๊ฐ๋ก๋ ํ๋ฉด ์์ผ๋ก ๋ฏผ๋ค. ๋์น๋ฉด ํ๋ฉด ์ ์คํฌ๋กค. Native: `Modal`๋ก ํ๋ฉด **๊ฐ์ด๋ฐ**, scrim์ ๋๋ฅด๋ฉด ๋ซํ๊ณ ํญ๋ชฉ ๋ชฉ๋ก๋ง ์คํฌ๋กค | `useAnchoredPopup`, `react-native/src/navigation.tsx`(`Menu`) |
|
|
95
95
|
| ์ข์ ํญยทํฐ ๊ธ์ | Web ํญ ์ํ `90vw`, ํญ๋ชฉ ๋ฌธ๊ตฌ๋ ์ค๋ฐ๊ฟ๋๋ค. Native ๋์ด ์ํ 75%๋ฅผ ๋์ผ๋ฉด ๋ชฉ๋ก์ด ์คํฌ๋กค๋๋ค | `.hjm-menu__content`, `maxHeight: "75%"` |
|
|
@@ -114,6 +114,7 @@ Web (ํธ๋ฆฌ๊ฑฐ ์๋, ์ต์ปค) Native (Modal, ํ๋ฉด ๊ฐ์ด๋ฐ)
|
|
|
114
114
|
- ํญ๋ชฉ id๋ ๋น์ด ์์ง ์๊ณ ์ ์ผํด์ผ ํ๋ฉฐ, ํ์ฑ ํญ๋ชฉ์ด ํ๋ ์ด์ ์์ด์ผ ํ๋ค. ์ด๊ธฐ๋ฉด ๋ ๋ ์ค ๋์ง๋ค.
|
|
115
115
|
- Web์์ `label`์ด ๋ฌธ์์ด์ด ์๋ ํญ๋ชฉ์ typeahead์ฉ `textValue`๋ฅผ ์ค๋ค. ์์ผ๋ฉด ๋์ง๋ค.
|
|
116
116
|
- ๋ค๋ฅธ ๋ชจ๋ฌยท์ํธยทํ๋ฉด ์ด๋์ ์ฌ๋ action์ `onActionAfterDismiss`๋ก ์คํํ๋ค. ์ด ์ฝ๋ฐฑ์ ๋ฉ๋ด๊ฐ ์ค์ ๋ก ๋ซํ ๋ค(Native๋ Modal teardown ๋ค)์๋ง ์คํ๋๋ฏ๋ก ๋ ํ๋ฉด์ด ๊ฒน์น์ง ์๋๋ค.
|
|
117
|
+
- Native์์ teardown ์๋ฃ ์ ์ ์ฌ์ด๊ฑฐ๋ owner๋ฅผ ๊ต์ฒดํ๋ฉด ์ด์ ์ ๋๊ธฐํ๋ after-dismiss action์ ํ๊ธฐ๋๋ค. ๋น๋๊ธฐ action์ ์์ฒญ ์ค๋ฅ๋ ์ ํ ์ฝ๋ฐฑ ์์์ ์ฒ๋ฆฌํ๊ณ ์ ํ ์ค๋ฅ UI์ ์ฐ๊ฒฐํ๋ค. ๋ฉ๋ด๋ Promise ์คํจ์ ๋ฐ๋ฅธ ์ค๋ฅ ํ๋ฉด์ด๋ ์๋ ์ฌ์๋๋ฅผ ๋ง๋ค์ง ์๋๋ค.
|
|
117
118
|
- ํญ๋ชฉ ๋ฌธ๊ตฌยท์์ด์ฝ(์ ํ ์์ )์ i18n ํค์ ์ ํ ์์ด์ฝ์ผ๋ก ๋ฃ๊ณ , ์์ `tone`์ผ๋ก๋ง ๋ฐ๊พผ๋ค.
|
|
118
119
|
- `MorphingMenu`๋ action ์ ์ฉ์ด๋ค. ์ ํยทasync๊ฐ ํ์ํ๋ฉด `Menu`๋ฅผ ์ด๋ค. reduce-motionยทRTL์์๋ ์ค์ค๋ก `Menu`๋ก ๋์๊ฐ๋ค.
|
|
119
120
|
|
|
@@ -128,4 +129,4 @@ Web (ํธ๋ฆฌ๊ฑฐ ์๋, ์ต์ปค) Native (Modal, ํ๋ฉด ๊ฐ์ด๋ฐ)
|
|
|
128
129
|
| ์ํ | `disabled` | `disabled`, `readOnly`(+`readOnlyLabel`), `busy`, `onRetry`/`retryLabel` |
|
|
129
130
|
| ํ๋ฉด | ํธ๋ฆฌ๊ฑฐ์ ๋ถ๋ portal(`portalContainer`) | `Modal` |
|
|
130
131
|
| ํญ๋ชฉ label | `ReactNode`(+`textValue`) | `string` |
|
|
131
|
-
| ๋ฐฐ์น | `className`, `layoutStyle` | `layoutStyle`(`style`์
|
|
132
|
+
| ๋ฐฐ์น | `className`, `layoutStyle` | `layoutStyle`(`style`์ ์ ๊ฑฐ๋ ์์ฑ) |
|
|
@@ -93,7 +93,7 @@ Native ์๋ ์๋ค(renderer ์์).
|
|
|
93
93
|
- `className`ยท`layoutStyle`์ ๋ฐฐ์น์๋ง ์ด๋ค. ์ยท๋์ด๋ฅผ ๋ฎ์ง ์๋๋ค.
|
|
94
94
|
|
|
95
95
|
2026-10-07 Web ์ ์ฒด ํ๊ท ์ค ํค๋ณด๋๋ก ์ฎ๊ธด ํญ๋ชฉ์ด ์ฒซ ํญ๋ชฉ์ผ๋ก ๋์๊ฐ๋ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ค.
|
|
96
|
-
|
|
96
|
+
1.15.0 ๋ณ๊ฒฝ ์์ ์ ํจ๋์ ๋ฆ์ mouseenter๊ฐ ํค๋ณด๋ ์ ํ์ ๋ฎ์ง ์๊ณ ์ค์ ๋ง์ฐ์ค ์ด๋์
|
|
97
97
|
๋ง์ถฐ ํ์ฑ ํญ๋ชฉ์ ๋ฐ๊พผ๋ค. ๋ฉ๋ด ๋ง๋ ๋ผ๋ฒจ์ hover ์ ํยทํด๋ฆญยท๋นํ์ฑ ๊ฑด๋๋ฐ๊ธฐ๋ ์ ์งํ๋ค.
|
|
98
98
|
๊ณ ์ ์ง์ฐ์ด๋ ํค๋ณด๋ ๊ฒ์ฌ ์ฌ์๋๋ก ๊ฐ๋ฆฌ๋ ๋์ ์
๋ ฅ ์๋๋ฅผ ๊ตฌ๋ถํ๋ค.
|
|
99
99
|
[๊ฒ์ฆ ๊ธฐ๋ก](../../../../../docs/qa/2026-10-07-command-records.md).
|
|
@@ -102,4 +102,4 @@ Native ์๋ ์๋ค(renderer ์์).
|
|
|
102
102
|
|
|
103
103
|
2026-10-07 ์๋น ๊ฐ์ฌ์์ Web ๋ผ๋ฒจ์ ์ซ์ recipe ๋ชจ์๋ฆฌ๊ฐ ํ๋กํ์ ์ฐํํ๋ค. ๊ธฐ์กด `radius.sm` ์ญํ ์ ๊ฐ๊น์ด Provider์ CSS ๋ณ์๋ก ์ฝ๊ณ ๋ณ์ ์๋ ๋
๋ฆฝ ์ฌ์ฉ์ recipe 8์ ์ ์งํ๋ค. ์ด๋ฆฐ ๋ฉ๋ดยทroving focusยท๋นํ์ฑ ๊ฑด๋๋ฐ๊ธฐยทํ๋๊ณผ Web ์ ์ฉ ๋ฒ์๋ ๋ฐ๊พธ์ง ์๋๋ค.
|
|
104
104
|
|
|
105
|
-
ํ๋กํ ์ฐ๊ฒฐ์ 1.
|
|
105
|
+
ํ๋กํ ์ฐ๊ฒฐ์ 1.16.0 ๋ณ๊ฒฝ์ด๋ฉฐ, ๊ธฐ๋ณธ ๋ฐฐํฌ ๊ณ์ฝ๊ณผ ์ค์ Native ๊ธฐ๊ธฐ ๊ฒ์ฆ์ ๊ตฌ๋ถํ๋ค.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
4
|
- ์ํ: ๋ฐฐํฌ
|
|
5
5
|
- ์ง์: Web ยท Native
|
|
6
|
-
- ์ ์ฉ:
|
|
6
|
+
- ์ ์ฉ: 1.17.1
|
|
7
7
|
- ๊ฒํ ์ผ: 2026-10-07
|
|
8
8
|
- ๊ทผ๊ฑฐ: [๋ฐ๋ณต ํ๋ฉด ์กฐํฉ](../../screen-patterns.md), WebยทNative `src/screens.tsx`ยท`src/screen-flows.tsx`; ๊ธฐ์กด ๊ฐ๋ณ ์ง์นจ์ ์ ๊ท๊ฒฉ์ผ๋ก ํตํฉ. ์์ ์คํ ๋ฆฌ๋ 2026-10-06 ์ฌ์ฉ์ ์น์ธ์ผ๋ก ์คํ ๋ฆฌ๋ถ ๋ฐฐํฌ([์น์ธ ๊ธฐ๋ก](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-์ ์ฒด-์น๊ฒฉ๊ณผ-๊ท๊ฒฉ-ํ์ )). ์คํ ๋ฆฌ๋ถ ๋ฐฐํฌ๋ API ๊ฒ์๊ฐ ์๋๋ค(`์ ์ฉ` ์ฐธ๊ณ )
|
|
9
9
|
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/๊ตฌ์ฑ/์
๋ ฅ๊ณผ ์์ฑ/๋ฉ์์ง ์์ฑ`, `๋ฐฐํฌ/๊ตฌ์ฑ/์
๋ ฅ๊ณผ ์์ฑ/๋๊ธ ์์ฑ`, `๋ฐฐํฌ/ํ๋ฉด/์ํต/์ฑํ
`
|
|
@@ -95,7 +95,7 @@ import { Image } from "react-native";
|
|
|
95
95
|
| `attachmentAction` | `{ label, icon, onPress(), disabled? }` | ์์ | ์ฒจ๋ถ ๋ฒํผ(ghost `IconButton`) |
|
|
96
96
|
| `attachments` | `readonly { id, removeLabel, preview, disabled? }[]` | `[]` | ์ฒจ๋ถ ๋ฏธ๋ฆฌ๋ณด๊ธฐ. ์์ผ๋ฉด `onRemoveAttachment` ํ์ |
|
|
97
97
|
| `onRemoveAttachment` | `(id: string) => void` | ์์ | ์ฒจ๋ถ ์ ๊ฑฐ |
|
|
98
|
-
| Web `layoutStyle` | `HjmCompositionStyleProp` | ์์ | ์์ฑ์ฐฝ ๋ฃจํธ ๋ฐฐ์น(marginยทwidthยทflex ๋ฑ).
|
|
98
|
+
| Web `layoutStyle` | `HjmCompositionStyleProp` | ์์ | ์์ฑ์ฐฝ ๋ฃจํธ ๋ฐฐ์น(marginยทwidthยทflex ๋ฑ). 1.13.0 ๋ณ๊ฒฝ |
|
|
99
99
|
|
|
100
100
|
์ ์ก ๊ฐ๋ฅ ์กฐ๊ฑด: `disabled`ยท`pending`ยท`sendDisabled`๊ฐ ์๋๊ณ , ๊ธ(๊ณต๋ฐฑ ์ ์ธ)ยท์ฒจ๋ถยท`additionalContent` ์ค ํ๋๊ฐ ์์ ๋(`canSubmitMessage`).
|
|
101
101
|
|
|
@@ -104,7 +104,7 @@ import { Image } from "react-native";
|
|
|
104
104
|
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
105
105
|
| --- | --- | --- |
|
|
106
106
|
| ํฌ๊ธฐ | ์
๋ ฅ `composerMinLines` 1 ~ `composerMaxLines` 5์ค(๋์ผ๋ฉด ์
๋ ฅ ์์์ ์คํฌ๋กค), `shape="large"`; ์ฒจ๋ถ ์ธ๋ค์ผ `attachmentSize` 80(radius `radius.md`); ์ ๊ฑฐ ๋ฒํผ์ `IconButton size="small"` 36 + ์ฌ๋ฐฉ hit 4(์ค์ ํ๊น 44), ๊ทธ ์ ๋ณด์ด๋ ์ `attachmentRemoveSize` 24; circle ์ ์ก์ `IconButton size="small"` 36 | `screen-patterns.ts`, `icon-button-recipe.ts` `sizes.small`, Web `styles.css`, Native `MessageComposer` |
|
|
107
|
-
| ๊ฐ๊ฒฉ | ์ธ๋ก ๋ฌถ์(contextยท๋ต์ฅ ๋์ยท์ฒจ๋ถยท์
๋ ฅ ์ค) ์ฌ์ด์ ์
๋ ฅโํ
์คํธ ์ ์ก ๋ฒํผ ์ฌ์ด `screenPatternRecipe.itemGap`(`spacing.sm` 12, ๋ ํ๋ซํผ. 2026-10-06๊น์ง Web์ 8, 1.
|
|
107
|
+
| ๊ฐ๊ฒฉ | ์ธ๋ก ๋ฌถ์(contextยท๋ต์ฅ ๋์ยท์ฒจ๋ถยท์
๋ ฅ ์ค) ์ฌ์ด์ ์
๋ ฅโํ
์คํธ ์ ์ก ๋ฒํผ ์ฌ์ด `screenPatternRecipe.itemGap`(`spacing.sm` 12, ๋ ํ๋ซํผ. 2026-10-06๊น์ง Web์ 8, 1.13.0 ๋ณ๊ฒฝ); ๋ต์ฅ ๋์ ์คยท์ฒจ๋ถ ์ฌ์ด `spacing.sm` 12; circle ์ ์ก์ ์
๋ ฅ ๊ธ์์ `spacing.sm` 12, ์ค๋ฅธ์ชฝ ๋ 8 | `screenPatternRecipe.itemGap`, Web `.hjm-message-composer`ยท`__row`(`--hjm-message-composer-gap`), Native `Stack gap="sm"`ยท`itemGap` |
|
|
108
108
|
| ์์ยท์ ๋ ฌ | `context` โ ๋ต์ฅ ๋์(์์ฑ์ยท๋ฐ์ท โ ์ทจ์) โ ์ฒจ๋ถ ์ธ๋ค์ผ(โ ์ฒจ๋ถ ๋ฒํผ) โ ์
๋ ฅยท์ ์ก ํ ์ค, ์ ์ก์ ์
๋ ฅ ์๋์ชฝ(`flex-end`)์ ๋ง์ถ๋ค. ์
๋ ฅ ์ค ์์ `leadingAction` โ ๊ธ์ โ (์์ด์ฝ ๋ชจ๋) ์ ์ก/์ฒจ๋ถ | ๋ ๋ ์์, Web `forms.tsx` `hjm-field__leading` |
|
|
109
109
|
| ๊ณ ์ ยท์คํฌ๋กค | ์์ฒด ๊ณ ์ ์์: ํ๋ฉด composer ์ฌ๋กฏ(footer)์ ๋ฃ๋๋ค; ์ฒจ๋ถ๋ ๊ฐ๋ก ์คํฌ๋กค; ํค๋ณด๋ adapter๋ host ํ๋๋ง | ChatScreenยทCommentThreadScreen `composer` |
|
|
110
110
|
| ์ข์ ํญยทํฐ ๊ธ์ | ์
๋ ฅ์ด ๋จ์ ํญ์ ์ฑ์ฐ๊ณ (`flex: 1`, ์ต์ ํญ 0) ์ ์ก ๋ฒํผ์ ์ค์ง ์๋๋ค; ํฐ ๊ธ์์์๋ 5์ค ์ํ ๋ค ์
๋ ฅ ์ ์คํฌ๋กค๋ก ๊ธฐ๋ก์ ๊ฐ๋ฆฌ์ง ์๋๋ค | Web `.hjm-message-composer__row`, Native `layoutStyle={{ flex: 1 }}` |
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
4
|
- ์ํ: ๋ฐฐํฌ
|
|
5
5
|
- ์ง์: Web ยท Native
|
|
6
|
-
- ์ ์ฉ:
|
|
7
|
-
- ๊ฒํ ์ผ: 2026-10-
|
|
6
|
+
- ์ ์ฉ: 1.17.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-13
|
|
8
8
|
- ๊ทผ๊ฑฐ: [๋ฐ๋ณต ํ๋ฉด ์กฐํฉ](../../screen-patterns.md), WebยทNative `src/screens.tsx`ยท`src/screen-flows.tsx`; ๊ธฐ์กด ๊ฐ๋ณ ์ง์นจ์ ์ ๊ท๊ฒฉ์ผ๋ก ํตํฉ. ์์ ์คํ ๋ฆฌ๋ 2026-10-06 ์ฌ์ฉ์ ์น์ธ์ผ๋ก ์คํ ๋ฆฌ๋ถ ๋ฐฐํฌ([์น์ธ ๊ธฐ๋ก](../../../../../docs/STORYBOOK_NAVIGATION.md#21-2026-10-06-์ ์ฒด-์น๊ฒฉ๊ณผ-๊ท๊ฒฉ-ํ์ )). ์คํ ๋ฆฌ๋ถ ๋ฐฐํฌ๋ API ๊ฒ์๊ฐ ์๋๋ค(`์ ์ฉ` ์ฐธ๊ณ )
|
|
9
9
|
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/ํ๋ฉด/์ํต/์ ๊ณ ์ ์ฐจ๋จ`
|
|
10
10
|
|
|
@@ -111,3 +111,4 @@ import { ModerationScreen } from "@hjmds/react-native/screen-flows";
|
|
|
111
111
|
- ์ฐจ๋จ ๋ฒํผ์ `block.action.onAction`์ ํธ์ถ๋์ง ์๋๋ค. ๋ฒํผ์ ํ์ธ ๋ํ์์๋ง ์ด๊ณ , ์ค์ ์ฐจ๋จ์ `confirmation.onConfirm`์์ ํ๋ค.
|
|
112
112
|
- ์๋ฒ ์ ๊ณ ยท๊ถํยท์ฐจ๋จ mutation, ์๋ฃ ํ ์ด๋์ ์ ํ ์์ ๋ค. ์ฌ์ ๋ชฉ๋ก๊ณผ ์ ์ฑ
๋ฌธ๊ตฌ๋ ์ ํ์ด ์ ํ๋ค.
|
|
113
113
|
- ํ์ธ ๋ํ์์์ ์ฑ๊ณต ํ ๋ซํยท์คํจ ๋ฌธ๊ตฌ๋ [AlertDialog](alert-dialog.md) ๊ณ์ฝ์ ๋ฐ๋ฅธ๋ค.
|
|
114
|
+
- `block`์ ์ ๊ฑฐํ๋ฉด ์ด๋ฆฐ ํ์ธ ์ธ์
๋ ์ข
๋ฃํ๋ค. ๋์ค์ ์ฐจ๋จ ํ๋์ ๋ค์ ๊ณต๊ธํด๋ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ์๋ก ๋๋ฌ์ผ ํ์ธ์ฐฝ์ด ์ด๋ฆฐ๋ค. 2026-10-13 ์ฌ๋ผ์ง ํ๋์ ํ์ธ ์ํ๊ฐ ๋ถํํ๋ ๊ฒฝ๋ก๋ฅผ ์์ ํ๋ค. ๋์์ด ๋ฐ๋๋ ์ ํ์ ๋์ id๋ฅผ ํ๋ฉด key/์ด์ยท์์ฒญ ์๋ช
์ ํจ๊ป ์ฐ๊ฒฐํ๋ค.
|