@hjmds/design-contracts 1.12.1 โ 1.13.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/avatar-fallback.d.ts +11 -0
- package/dist/avatar-fallback.d.ts.map +1 -1
- package/dist/avatar-fallback.js +21 -0
- package/dist/avatar-fallback.js.map +1 -1
- package/dist/base-recipes.d.ts +17 -0
- package/dist/base-recipes.d.ts.map +1 -1
- package/dist/base-recipes.js +17 -0
- package/dist/base-recipes.js.map +1 -1
- package/dist/catalog.d.ts +25 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/command-palette.d.ts +14 -9
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +8 -9
- package/dist/command-palette.js.map +1 -1
- package/dist/component-recipes.d.ts +17 -0
- package/dist/component-recipes.d.ts.map +1 -1
- package/dist/component-recipes.js +5 -0
- package/dist/component-recipes.js.map +1 -1
- package/dist/provider-button.d.ts.map +1 -1
- package/dist/provider-button.js +3 -0
- package/dist/provider-button.js.map +1 -1
- package/dist/reactions.d.ts +10 -0
- package/dist/reactions.d.ts.map +1 -1
- package/dist/reactions.js +7 -0
- package/dist/reactions.js.map +1 -1
- package/dist/screen-patterns.d.ts +147 -0
- package/dist/screen-patterns.d.ts.map +1 -0
- package/dist/screen-patterns.js +149 -0
- package/dist/screen-patterns.js.map +1 -0
- package/dist/slider.d.ts +8 -0
- package/dist/slider.d.ts.map +1 -1
- package/dist/slider.js +6 -1
- package/dist/slider.js.map +1 -1
- package/dist/upload-item.d.ts +5 -0
- package/dist/upload-item.d.ts.map +1 -1
- package/dist/upload-item.js +5 -0
- package/dist/upload-item.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 +3 -3
- package/docs/agreement.md +5 -0
- package/docs/avatar-fallback.md +7 -0
- package/docs/bottom-navigation.md +6 -0
- package/docs/brand-boundary.md +1 -1
- package/docs/button-label.md +6 -0
- package/docs/clipboard.md +3 -0
- package/docs/command-palette.md +45 -2
- package/docs/consumer-policy.md +5 -1
- package/docs/data-table.md +6 -4
- package/docs/dialog.md +8 -2
- package/docs/form.md +51 -0
- 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/link.md +8 -0
- package/docs/migration-native-legacy-removal.md +45 -1
- package/docs/optional-adapters.md +1 -1
- package/docs/password-field.md +5 -0
- package/docs/product-composition-adoption.md +40 -0
- package/docs/progress.md +19 -1
- package/docs/provider-button.md +13 -0
- package/docs/result.md +3 -0
- package/docs/screen-chrome.md +10 -0
- package/docs/screen-patterns.md +376 -0
- package/docs/sheet.md +12 -0
- package/docs/splitter.md +8 -2
- package/docs/theming.md +36 -29
- package/docs/toggle-group.md +7 -0
- package/docs/tour.md +7 -1
- package/docs/tree.md +5 -2
- package/docs/upload-item.md +7 -0
- package/docs/usage/README.md +236 -0
- package/docs/usage/STANDARD.md +108 -0
- package/docs/usage/components/accordion.md +107 -0
- package/docs/usage/components/activity-heatmap.md +104 -0
- package/docs/usage/components/affix.md +86 -0
- package/docs/usage/components/agreement.md +129 -0
- package/docs/usage/components/alert-dialog.md +130 -0
- package/docs/usage/components/anchor.md +96 -0
- package/docs/usage/components/aspect-ratio.md +89 -0
- package/docs/usage/components/asset.md +126 -0
- package/docs/usage/components/auth-provider-button.md +116 -0
- package/docs/usage/components/auth-screen-layout.md +129 -0
- package/docs/usage/components/avatar.md +114 -0
- package/docs/usage/components/badge.md +84 -0
- package/docs/usage/components/bottom-cta.md +125 -0
- package/docs/usage/components/bottom-info.md +99 -0
- package/docs/usage/components/bottom-navigation.md +136 -0
- package/docs/usage/components/breadcrumb.md +81 -0
- package/docs/usage/components/button.md +118 -0
- package/docs/usage/components/calendar.md +122 -0
- package/docs/usage/components/card.md +110 -0
- package/docs/usage/components/carousel.md +113 -0
- package/docs/usage/components/celebration.md +96 -0
- package/docs/usage/components/chat-message.md +122 -0
- package/docs/usage/components/chat-screen.md +112 -0
- package/docs/usage/components/checkbox-group.md +104 -0
- package/docs/usage/components/checkbox.md +103 -0
- package/docs/usage/components/chip.md +104 -0
- package/docs/usage/components/code-block.md +111 -0
- package/docs/usage/components/collapsible.md +112 -0
- package/docs/usage/components/color-picker.md +86 -0
- package/docs/usage/components/combobox.md +137 -0
- package/docs/usage/components/command-palette.md +125 -0
- package/docs/usage/components/comment-thread-screen.md +125 -0
- package/docs/usage/components/container.md +98 -0
- package/docs/usage/components/content-transition.md +101 -0
- package/docs/usage/components/context-menu.md +136 -0
- package/docs/usage/components/counter-badge.md +107 -0
- package/docs/usage/components/data-table.md +122 -0
- package/docs/usage/components/date-picker.md +142 -0
- package/docs/usage/components/date-range-picker.md +111 -0
- package/docs/usage/components/description-list.md +103 -0
- package/docs/usage/components/design-system-provider.md +124 -0
- package/docs/usage/components/dialog.md +176 -0
- package/docs/usage/components/divider.md +89 -0
- package/docs/usage/components/editor-screen.md +126 -0
- package/docs/usage/components/effect-surface.md +120 -0
- package/docs/usage/components/empty-state.md +114 -0
- package/docs/usage/components/field.md +129 -0
- package/docs/usage/components/file-picker.md +114 -0
- package/docs/usage/components/floating-action-button.md +138 -0
- package/docs/usage/components/form.md +162 -0
- package/docs/usage/components/grid.md +99 -0
- package/docs/usage/components/heading.md +87 -0
- package/docs/usage/components/icon-button.md +126 -0
- package/docs/usage/components/icon.md +105 -0
- package/docs/usage/components/image.md +122 -0
- package/docs/usage/components/keyboard-avoiding.md +93 -0
- package/docs/usage/components/keyboard-dock.md +110 -0
- package/docs/usage/components/keyboard-form-scroll-view.md +95 -0
- package/docs/usage/components/keyboard-motion-provider.md +86 -0
- package/docs/usage/components/layout.md +117 -0
- package/docs/usage/components/link.md +121 -0
- package/docs/usage/components/list-detail-screen.md +103 -0
- package/docs/usage/components/list-row.md +124 -0
- package/docs/usage/components/list.md +119 -0
- package/docs/usage/components/load-more.md +115 -0
- package/docs/usage/components/masonry.md +109 -0
- package/docs/usage/components/media-selection-screen.md +119 -0
- package/docs/usage/components/mentions.md +119 -0
- package/docs/usage/components/menu.md +129 -0
- package/docs/usage/components/menubar.md +93 -0
- package/docs/usage/components/message-composer.md +124 -0
- package/docs/usage/components/moderation-screen.md +113 -0
- package/docs/usage/components/notice.md +106 -0
- package/docs/usage/components/notification-inbox-screen.md +97 -0
- package/docs/usage/components/notification-item.md +98 -0
- package/docs/usage/components/number-field.md +131 -0
- package/docs/usage/components/onboarding-screen.md +106 -0
- package/docs/usage/components/otp-field.md +101 -0
- package/docs/usage/components/pagination.md +82 -0
- package/docs/usage/components/password-field.md +137 -0
- package/docs/usage/components/permission-screen.md +107 -0
- package/docs/usage/components/photo-source-sheet.md +119 -0
- package/docs/usage/components/popover.md +108 -0
- package/docs/usage/components/profile-screen.md +89 -0
- package/docs/usage/components/progress.md +122 -0
- package/docs/usage/components/qr-code.md +122 -0
- package/docs/usage/components/radio-group.md +124 -0
- package/docs/usage/components/radio.md +104 -0
- package/docs/usage/components/result.md +116 -0
- package/docs/usage/components/saved-items-screen.md +126 -0
- package/docs/usage/components/screen-layout.md +119 -0
- package/docs/usage/components/search-field.md +120 -0
- package/docs/usage/components/search-screen.md +215 -0
- package/docs/usage/components/section.md +111 -0
- package/docs/usage/components/segmented-control.md +138 -0
- package/docs/usage/components/select.md +142 -0
- package/docs/usage/components/settings-screen.md +126 -0
- package/docs/usage/components/shared-transition-element.md +111 -0
- package/docs/usage/components/shared-transition-screen.md +86 -0
- package/docs/usage/components/sheet.md +151 -0
- package/docs/usage/components/side-panel.md +104 -0
- package/docs/usage/components/sidebar.md +107 -0
- package/docs/usage/components/skeleton.md +105 -0
- package/docs/usage/components/skip-nav.md +76 -0
- package/docs/usage/components/slider.md +121 -0
- package/docs/usage/components/sortable-collection.md +127 -0
- package/docs/usage/components/spinner.md +86 -0
- package/docs/usage/components/splitter.md +103 -0
- package/docs/usage/components/stack.md +93 -0
- package/docs/usage/components/statistic.md +123 -0
- package/docs/usage/components/steps.md +110 -0
- package/docs/usage/components/surface.md +91 -0
- package/docs/usage/components/swipe-actions.md +124 -0
- package/docs/usage/components/switch.md +120 -0
- package/docs/usage/components/tabs.md +134 -0
- package/docs/usage/components/tag.md +84 -0
- package/docs/usage/components/tags-input.md +111 -0
- package/docs/usage/components/text-area.md +112 -0
- package/docs/usage/components/text-format.md +75 -0
- package/docs/usage/components/text-transition.md +104 -0
- package/docs/usage/components/text.md +101 -0
- package/docs/usage/components/thinking-orb.md +105 -0
- package/docs/usage/components/timeline.md +105 -0
- package/docs/usage/components/toast.md +145 -0
- package/docs/usage/components/toggle-group.md +95 -0
- package/docs/usage/components/tooltip.md +103 -0
- package/docs/usage/components/top-bar.md +124 -0
- package/docs/usage/components/top.md +89 -0
- package/docs/usage/components/tour.md +118 -0
- package/docs/usage/components/transfer-list.md +115 -0
- package/docs/usage/components/tree.md +91 -0
- package/docs/usage/components/upload-item.md +99 -0
- package/docs/usage/components/virtual-list.md +105 -0
- package/docs/usage/components/visually-hidden.md +72 -0
- package/docs/usage/components/watermark.md +78 -0
- package/docs/usage/compositions/action-recovery-optimistic.md +180 -0
- package/docs/usage/compositions/action-recovery-save.md +235 -0
- package/docs/usage/compositions/action-recovery-undo.md +193 -0
- package/docs/usage/compositions/common-message.md +132 -0
- package/docs/usage/compositions/common-notification.md +101 -0
- package/docs/usage/compositions/compound-controls.md +186 -0
- package/docs/usage/compositions/data-layouts.md +157 -0
- package/docs/usage/compositions/disclosure.md +144 -0
- package/docs/usage/compositions/environment-matrix.md +139 -0
- package/docs/usage/compositions/expo-interactions.md +149 -0
- package/docs/usage/compositions/family-drawer.md +201 -0
- package/docs/usage/compositions/floating-action-button.md +197 -0
- package/docs/usage/compositions/input-sheet.md +148 -0
- package/docs/usage/compositions/interaction-adapters.md +190 -0
- package/docs/usage/compositions/interaction-flow-apply.md +205 -0
- package/docs/usage/compositions/interaction-flow-draft.md +188 -0
- package/docs/usage/compositions/interaction-flow-search.md +171 -0
- package/docs/usage/compositions/native-renderers.md +106 -0
- package/docs/usage/compositions/navigation-bar-collection.md +164 -0
- package/docs/usage/compositions/optional-adapters.md +169 -0
- package/docs/usage/compositions/optional-motion.md +109 -0
- package/docs/usage/compositions/photo-source.md +104 -0
- package/docs/usage/compositions/purpose-input-comment.md +110 -0
- package/docs/usage/compositions/purpose-input-message.md +119 -0
- package/docs/usage/compositions/reference-first.md +96 -0
- package/docs/usage/compositions/reference-review.md +107 -0
- package/docs/usage/compositions/reference-settings.md +107 -0
- package/docs/usage/compositions/selection-scope.md +174 -0
- package/docs/usage/compositions/stea-event-ticket.md +166 -0
- package/docs/usage/compositions/stea-flip-card.md +162 -0
- package/docs/usage/compositions/stea-order-progress.md +184 -0
- package/docs/usage/compositions/stea-otp-verify.md +215 -0
- package/docs/usage/compositions/stea-pixel-empty.md +140 -0
- package/docs/usage/compositions/stea-schedule-card.md +169 -0
- package/docs/usage/compositions/stea-stat-summary.md +154 -0
- package/docs/usage/compositions/time-selection.md +174 -0
- package/docs/usage/compositions/toast-layout.md +128 -0
- package/docs/usage/compositions/visual-foundations.md +185 -0
- package/docs/usage/compositions/web-additions.md +146 -0
- package/docs/usage/compositions/web-navigation.md +143 -0
- package/docs/usage/screens/common-chat.md +127 -0
- package/docs/usage/screens/common-comments.md +108 -0
- package/docs/usage/screens/common-inbox.md +110 -0
- package/docs/usage/screens/common-login.md +98 -0
- package/docs/usage/screens/common-profile.md +221 -0
- package/docs/usage/screens/common-saved.md +127 -0
- package/docs/usage/screens/common-search.md +274 -0
- package/docs/usage/screens/common-settings.md +126 -0
- package/docs/usage/screens/common-shell.md +108 -0
- package/docs/usage/screens/dashboard.md +245 -0
- package/docs/usage/screens/discovery-gallery.md +306 -0
- package/docs/usage/screens/flow-collection.md +96 -0
- package/docs/usage/screens/flow-editor.md +120 -0
- package/docs/usage/screens/flow-media.md +111 -0
- package/docs/usage/screens/flow-moderation.md +120 -0
- package/docs/usage/screens/flow-onboarding.md +193 -0
- package/docs/usage/screens/flow-permission.md +103 -0
- package/docs/usage/screens/landing.md +347 -0
- package/docs/usage/screens/mockup-studio.md +190 -0
- package/docs/usage/screens/notification-settings.md +206 -0
- package/docs/usage/screens/reference-comparison.md +159 -0
- package/docs/usage/templates/component.md +61 -0
- package/docs/usage/templates/composition.md +47 -0
- package/docs/usage/templates/screen.md +56 -0
- package/docs/usage/templates/token.md +32 -0
- package/docs/usage/tokens/color.md +142 -0
- package/docs/usage/tokens/elevation-opacity.md +86 -0
- package/docs/usage/tokens/layers.md +98 -0
- package/docs/usage/tokens/layout.md +114 -0
- package/docs/usage/tokens/motion.md +88 -0
- package/docs/usage/tokens/radius.md +53 -0
- package/docs/usage/tokens/size.md +74 -0
- package/docs/usage/tokens/spacing.md +73 -0
- package/docs/usage/tokens/stroke.md +50 -0
- package/docs/usage/tokens/theme-studio.md +70 -0
- package/docs/usage/tokens/typography-studio.md +70 -0
- package/docs/usage/tokens/typography.md +89 -0
- package/package.json +7 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# TextArea
|
|
2
|
+
|
|
3
|
+
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
|
+
- ์ํ: ๋ฐฐํฌ
|
|
5
|
+
- ์ง์: Web ยท Native
|
|
6
|
+
- ์ ์ฉ: 1.12.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-06
|
|
8
|
+
- ๊ทผ๊ฑฐ: `src/base-recipes.ts`(`fieldRecipe`)
|
|
9
|
+
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/์ปดํฌ๋ํธ/์
๋ ฅ/์ฌ๋ฌ ์ค ์
๋ ฅ`
|
|
10
|
+
|
|
11
|
+
## ์ธ์ ์ฐ๋
|
|
12
|
+
|
|
13
|
+
์ฌ๋ฌ ์ค ์์ ๊ธ์ ๋ฐ๋ ์
๋ ฅ์ ์ด๋ค. ์๊ธฐ์๊ฐ, ํ๊ธฐ, ๋ฌธ์ ๋ณธ๋ฌธ์ฒ๋ผ ์ค๋ฐ๊ฟ์ด ๊ฐ์ ์ผ๋ถ์ธ ๊ฒฝ์ฐ๋ค.
|
|
14
|
+
๋ผ๋ฒจยท์ค๋ช
ยท์ค๋ฅ ๋ฌธ๊ตฌ ํ์ [Field](field.md)์ ๊ฐ๋ค.
|
|
15
|
+
|
|
16
|
+
## ์ฐ์ง ์์ ๋
|
|
17
|
+
|
|
18
|
+
| ์ํฉ | ๋์ ์ธ ๊ฒ |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| ํ ์ค ๊ฐ(์ด๋ฆ, ์ด๋ฉ์ผ) | [Field](field.md)์ `TextField` |
|
|
21
|
+
| `@์ฌ๋` ์ธ๊ธ์ด ์๋ ๋ณธ๋ฌธ | [Mentions](mentions.md) |
|
|
22
|
+
| ๋น๋ฐ๋ฒํธยท์ซ์ยท์ธ์ฆ ์ฝ๋ | [PasswordField](password-field.md), [NumberField](number-field.md), [OTPField](otp-field.md) |
|
|
23
|
+
| ๊ฒ์์ด | [SearchField](search-field.md) |
|
|
24
|
+
|
|
25
|
+
## ๊ณต๊ฐ ์ด๋ฆ๊ณผ import
|
|
26
|
+
|
|
27
|
+
| ์ด๋ฆ | ์ญํ | Web | Native |
|
|
28
|
+
| --- | --- | --- | --- |
|
|
29
|
+
| `TextArea` | ๊ธฐ๋ณธ | `@hjmds/react`, `/forms` | `@hjmds/react-native`, `/inputs` |
|
|
30
|
+
|
|
31
|
+
## ์ต์ ์ฌ์ฉ ์
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
// Web
|
|
35
|
+
import { TextArea } from "@hjmds/react/forms";
|
|
36
|
+
|
|
37
|
+
<TextArea
|
|
38
|
+
label={t("review.body")}
|
|
39
|
+
description={t("review.bodyHint")}
|
|
40
|
+
error={bodyError ? t(bodyError) : undefined}
|
|
41
|
+
value={body}
|
|
42
|
+
onChange={(event) => setBody(event.currentTarget.value)}
|
|
43
|
+
minVisibleLines={3}
|
|
44
|
+
maxVisibleLines={8}
|
|
45
|
+
/>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// Native
|
|
50
|
+
import { TextArea } from "@hjmds/react-native/inputs";
|
|
51
|
+
|
|
52
|
+
<TextArea
|
|
53
|
+
label={t("review.body")}
|
|
54
|
+
value={body}
|
|
55
|
+
onValueChange={setBody}
|
|
56
|
+
maxVisibleLines={8}
|
|
57
|
+
layoutStyle={{ marginTop: 16 }}
|
|
58
|
+
/>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## ์ถ๊ณผ ๊ธฐ๋ณธ๊ฐ
|
|
62
|
+
|
|
63
|
+
| prop | ๊ฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|
|
64
|
+
| --- | --- | --- | --- |
|
|
65
|
+
| `variant` | `surface` ยท `inset` | `surface` | โ |
|
|
66
|
+
| `shape` | `medium` ยท `large` ยท `full` | `medium` | โ |
|
|
67
|
+
| `align` | `start` ยท `center` | `start` | โ |
|
|
68
|
+
| `value`/`defaultValue` | `string` | โ | โ |
|
|
69
|
+
| `onChange`(Web) | `(event: ChangeEvent<HTMLTextAreaElement>) => void` | โ | DOM ์ด๋ฒคํธ. ๊ฐ์ `event.currentTarget.value` |
|
|
70
|
+
| `onValueChange`(Native) | `(value: string) => void` | โ | ๋ค์ ๋ฌธ์์ด |
|
|
71
|
+
| `minVisibleLines` ยท `maxVisibleLines` | ์ค ์ | ์ต์ ๋์ด 80, ์ํ ์์ | ๋์ด๋ ์ค ์๋ก๋ง ์ ํ๋ค. ์ต์ ๋์ด๋ `max(80, ์ค ์ ร typography.body ์ค ๋์ด 20 + spacing.sm 12 ร 2)`๋ผ `minVisibleLines`๊ฐ 1ยท2์ฌ๋ 80(`fieldRecipe.multilineMinHeight`) ์๋๋ก ๋ด๋ ค๊ฐ์ง ์๊ณ 3๋ถํฐ ์ปค์ง๋ค(3์ค 84). WebยทNative ๊ฐ๋ค |
|
|
72
|
+
| `leadingAction` | `ReactNode` | โ | ํ ์ ๊ธ์ ์ ํ๋ ๋ฒํผ. ์๋ผ๋ ๊ธ์์ ์ธ๋ก ๊ฐ์ด๋ฐ์ ๋ง์ถ๊ณ ํ๋ฆฐ affix ์์ ์ฐ์ง ์๋๋ค. ๋ฏธ๊ฒ์(1.12.1 ์ดํ) |
|
|
73
|
+
| `trailing` | `ReactNode` | โ | ํ ์ ๊ธ์ ๋ค ์ฌ๋กฏ |
|
|
74
|
+
| `description` ยท `error` ยท `required` ยท `disabled` | Web `ReactNode`, Native `string` ยท `boolean` | โ | Field์ ๊ฐ์ ํ๋ก ๊ทธ๋ ค์ง๊ณ ๋ณด์กฐ๊ธฐ๊ธฐ ์ค๋ช
์ ์ฐ๊ฒฐ๋๋ค |
|
|
75
|
+
| `busy`(Native) | `boolean` | `false` | โ |
|
|
76
|
+
| `layoutStyle` | `HjmCompositionStyleProp` | โ | ํ๋ ์ ์ฒด(๋ผ๋ฒจยทํยท์ค๋ช
) ๋ฐฐ์น. WebยทNative ๋ชจ๋ |
|
|
77
|
+
|
|
78
|
+
`leading`(ํ๋ฆฐ ์ฅ์ affix)์ TextArea์ ์๋ค(TextField ์ ์ฉ). ํ๋์ `leadingAction`ยท`trailing`์ ๋๊ณ , ๊ธ์ ์ ๊ฐ์ ๋ณด์กฐ ํ์๋ `description`์ผ๋ก ๋๋ค.
|
|
79
|
+
|
|
80
|
+
## ๋ฐฐ์น
|
|
81
|
+
|
|
82
|
+
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| ํฌ๊ธฐ | ์ต์ ๋์ด 80(`fieldRecipe.multilineMinHeight`)์์ ์์ํด ์
๋ ฅ์ ๋ฐ๋ผ ์๋๋ค. ์ข์ฐ ์์ชฝ ์ฌ๋ฐฑ `spacing.md` 16, ๋ชจ์๋ฆฌ ๊ธฐ๋ณธ `radius.md` 12 | `fieldRecipe`, `.hjm-field__control--multiline` |
|
|
85
|
+
| ๊ฐ๊ฒฉ | ๋ผ๋ฒจ๊ณผ ํ ์ฌ์ด `spacing.xs` 8. ์ด์ ํ๋์์ ๊ฐ๊ฒฉ์ ํผ์ด ์ ํ๊ณ TextArea๋ ๋ฐ๊นฅ ์ฌ๋ฐฑ์ด ์๋ค(ํ์ํ๋ฉด `layoutStyle`๋ก ์ค๋ค) | `fieldRecipe.label.gap`, `.hjm-field` |
|
|
86
|
+
| ์์ยท์ ๋ ฌ | ๋ผ๋ฒจ โ ์
๋ ฅ ํ โ ์ค๋ช
/์ค๋ฅ. ํผ์ ์ธ๋ก ์ค์์ ํญ์ ๊ฝ ์ฑ์ด๋ค | `react-native/src/inputs.tsx`(`TextArea`) |
|
|
87
|
+
| ๊ณ ์ ยท์คํฌ๋กค | `maxVisibleLines`์ ๋ฟ์ผ๋ฉด ํ ์์์ ์คํฌ๋กคํ๋ค. Web์ ์ฌ์ฉ์๊ฐ ์ธ๋ก๋ก๋ง ํฌ๊ธฐ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค(`resize: vertical`) | `.hjm-field__control--multiline textarea` |
|
|
88
|
+
| ์ข์ ํญยทํฐ ๊ธ์ | ํฐ ๊ธ์์์๋ ์ค ๋์ด๊ฐ ์ปค์ ธ `minVisibleLines`ยท`maxVisibleLines`์ ์ค์ ๋์ด๋ ์ปค์ง๋ค. ํฝ์
๋์ด๋ก ๊ณ ์ ํ์ง ์๋๋ค | `.hjm-field__control--multiline textarea` |
|
|
89
|
+
|
|
90
|
+
## ๊ผญ ์งํฌ ๊ฒ
|
|
91
|
+
|
|
92
|
+
- `label` ๋๋ ์ ๊ทผ ์ด๋ฆ(Web `aria-label`, Native `accessibilityLabel`)์ด ๋ฐ๋์ ์์ด์ผ ํ๋ค. ๋ ๋ค ์์ผ๋ฉด `TypeError`.
|
|
93
|
+
- ๋ผ๋ฒจยท์ค๋ช
ยท์ค๋ฅยทplaceholder๋ i18n ํค๋ก ๋ฃ๋๋ค. placeholder๋ฅผ ๋ผ๋ฒจ ๋์ ์ฐ์ง ์๋๋ค.
|
|
94
|
+
- ๋์ด๋ฅผ `style`์ `minHeight`/`maxHeight`๋ก ๋ฐ๊พธ์ง ์๋๋ค. `minVisibleLines`/`maxVisibleLines`๋ฅผ ์ด๋ค.
|
|
95
|
+
- ํ ์ค ๋์ด(44)์์ ์์ํด ์๋ผ๋ ์
๋ ฅ์ด ํ์ํ๋ฉด TextArea๊ฐ ์๋๋ผ [MessageComposer](message-composer.md)๋ฅผ ์ด๋ค. ํ ์ค ์์์ composer ๋ด๋ถ ์ ์ฉ์ด๋ฉฐ ๊ณต๊ฐ `minVisibleLines`๋ก๋ 80 ์๋๋ก ๋ด๋ ค๊ฐ์ง ์๋๋ค. 2026-10-06 ๋ฆฌ๋ทฐ์์ ํํ์ 44๋ก ๋ฎ์ถ ๋ฏธ๊ฒ์ ๋ณ๊ฒฝ์ด ๊ธฐ์กด `minVisibleLines={2}` ํ๋๋ฅผ 80์์ 64๋ก ์ค์ฌ ๋๋๋ ธ๋ค.
|
|
96
|
+
- ์ค๋ฅ๋ `error`๋ก ๋๊ธด๋ค. ํ
๋๋ฆฌ ์์ ์ง์ ๋ฐ๊พธ์ง ์๋๋ค.
|
|
97
|
+
|
|
98
|
+
## ํ๋ซํผ ์ฐจ์ด
|
|
99
|
+
|
|
100
|
+
| ํญ๋ชฉ | Web | Native |
|
|
101
|
+
| --- | --- | --- |
|
|
102
|
+
| ๊ฐ ๋ณ๊ฒฝ | DOM `onChange`(`onValueChange` ์์) | `onValueChange(value)` |
|
|
103
|
+
| ๋ฐฐ์น | `layoutStyle`(ํ๋ ์ ์ฒด), ๋ฐ๊นฅ ํ class๋ `fieldClassName` | `layoutStyle`(ํ๋ ์ ์ฒด) |
|
|
104
|
+
| `style` | `textarea`์ ์ ๋ฌ | ํ์
์์ ์ ์ธ |
|
|
105
|
+
| ์งํ ํ์ | ์์ | `busy` |
|
|
106
|
+
| ๋ผ๋ฒจยท๋ฌธ๊ตฌ ํ์
| `ReactNode` | `string` |
|
|
107
|
+
| import ๊ฒฝ๋ก | `/forms` | `/inputs` |
|
|
108
|
+
|
|
109
|
+
## ํจ์
|
|
110
|
+
|
|
111
|
+
- ํ์ฌ Web `TextField`์ `onValueChange` ์ฃผ์์ "Web TextArea์ ๊ฐ์ ์ฝ๋ฐฑ"์ด๋ผ๊ณ ์ ์ง๋ง Web `TextAreaProps`์๋
|
|
112
|
+
`onValueChange`๊ฐ ์๋ค(`react/src/forms.tsx`). ๊ณต์ ํผ ์ฝ๋๋ Web TextArea๋ง `onChange`๋ก ๋ถ๊ธฐํ๋ค.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# TextFormat
|
|
2
|
+
|
|
3
|
+
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
|
+
- ์ํ: ๋ฐฐํฌ
|
|
5
|
+
- ์ง์: Web
|
|
6
|
+
- ์ ์ฉ: 1.12.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-06
|
|
8
|
+
- ๊ทผ๊ฑฐ: [TextFormat](../../text-formats.md), `src/text-formats.ts`(`textFormatRecipe`)
|
|
9
|
+
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/์ปดํฌ๋ํธ/๊ธ์์ ์์ด์ฝ/๊ธ์ ์์`
|
|
10
|
+
|
|
11
|
+
## ์ธ์ ์ฐ๋
|
|
12
|
+
|
|
13
|
+
๋์๋งยท๊ฐ๋ฐ์ ์๋ดยท์ฝ๊ด ๋ณธ๋ฌธ ์์์ ๋จ์ถํค(`โS`), ์งง์ ์ฝ๋ ์กฐ๊ฐ(`pnpm add โฆ`), ์ธ์ฉ๋ฌธ์
|
|
14
|
+
ํ์ํ ๋ ์ด๋ค. `kind`๋ง๋ค `<kbd>`ยท`<code>`ยท`<blockquote>`๋ผ๋ ๋ค๋ฅธ HTML ์์๋ฅผ ๊ทธ๋ ค
|
|
15
|
+
๋ณด์กฐ๊ธฐ๊ธฐ๊ฐ ๊ทธ ์๋ฏธ๋๋ก ์ฝ๊ฒ ํ๋ค.
|
|
16
|
+
|
|
17
|
+
## ์ฐ์ง ์์ ๋
|
|
18
|
+
|
|
19
|
+
| ์ํฉ | ๋์ ์ธ ๊ฒ |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| ์ฌ๋ฌ ์ค ์ฝ๋, ๋ณต์ฌ ๋ฒํผ์ด ๋ถ์ ์ฝ๋ | [CodeBlock](code-block.md) |
|
|
22
|
+
| ๋จ์ํ ๊ธ์ ํฌ๊ธฐยท๊ตต๊ธฐ๋ง ๋ค๋ฆ | [Text](text.md) |
|
|
23
|
+
| Native ํ๋ฉด | ์์. RN์๋ ๋์ ์๋ฏธ ์์๊ฐ ์์ด renderer๋ฅผ ๋์ง ์๋๋ค([๊ณ์ฝ](../../text-formats.md)) |
|
|
24
|
+
|
|
25
|
+
## ๊ณต๊ฐ ์ด๋ฆ๊ณผ import
|
|
26
|
+
|
|
27
|
+
| ์ด๋ฆ | ์ญํ | Web | Native |
|
|
28
|
+
| --- | --- | --- | --- |
|
|
29
|
+
| `TextFormat` | ๊ธฐ๋ณธ | `@hjmds/react`, `/text-formats` | โ |
|
|
30
|
+
|
|
31
|
+
## ์ต์ ์ฌ์ฉ ์
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
// Web
|
|
35
|
+
import { Text } from "@hjmds/react/layout";
|
|
36
|
+
import { TextFormat } from "@hjmds/react/text-formats";
|
|
37
|
+
|
|
38
|
+
<>
|
|
39
|
+
<Text>
|
|
40
|
+
{t("help.saveShortcut.prefix")}{" "}
|
|
41
|
+
<TextFormat kind="kbd">{t("help.saveShortcut.key")}</TextFormat>
|
|
42
|
+
</Text>
|
|
43
|
+
<TextFormat kind="code">pnpm add @hjmds/react</TextFormat>
|
|
44
|
+
</>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Native: ์์.
|
|
48
|
+
|
|
49
|
+
## ์ถ๊ณผ ๊ธฐ๋ณธ๊ฐ
|
|
50
|
+
|
|
51
|
+
| prop | ๊ฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| `kind`(ํ์) | `kbd` โ `<kbd>` ยท `code` โ `<code>` ยท `quote` โ `<blockquote>` | ์์ | ๋ชฉ๋ก ๋ฐ ๊ฐ์ ์คํ ์ค `TypeError` |
|
|
54
|
+
| `children` | `ReactNode` | โ (ํ์) | โ |
|
|
55
|
+
| `layoutStyle` | `HjmCompositionStyleProp` | โ | ๋ฐฐ์น(์ฃผ๋ก `quote` ๋ธ๋ก์ ๋ฐ๊นฅ ์ฌ๋ฐฑยทํญ) |
|
|
56
|
+
| ๋๋จธ์ง | `HTMLAttributes<HTMLElement>` | โ | ํด๋น HTML ์์๋ก ์ ๋ฌ๋๊ณ ref๋ ๊ทธ ์์๋ก ๊ฐ๋ค |
|
|
57
|
+
|
|
58
|
+
## ๋ฐฐ์น
|
|
59
|
+
|
|
60
|
+
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| ํฌ๊ธฐ | `kbd`ยท`code` ์์ชฝ ์ข์ฐ ์ฌ๋ฐฑ `spacing.xxs` 4, ๋ชจ์๋ฆฌ `radius.sm` 8. `quote` ์์ ์ชฝ 2px ์ธ๋ก ์ ๊ณผ ์์ชฝ ์ฌ๋ฐฑ `spacing.md` 16 | `.hjm-text-format[data-kind]` |
|
|
63
|
+
| ๊ฐ๊ฒฉ | ๋ฐ๊นฅ ์ฌ๋ฐฑ์ด ์๋ค(`margin: 0`). `quote` ์๋ค ๋ฌธ๋จ๊ณผ์ ๊ฐ๊ฒฉ์ ๋ถ๋ชจ๊ฐ ์ค๋ค | `.hjm-text-format` |
|
|
64
|
+
| ์์ยท์ ๋ ฌ | `kbd`ยท`code`๋ ๋ฌธ์ฅ ์์ ์ธ๋ผ์ธ์ผ๋ก, `quote`๋ ๋ธ๋ก์ผ๋ก ๋๋๋ค | `.hjm-text-format` |
|
|
65
|
+
| ๊ณ ์ ยท์คํฌ๋กค | โ | โ |
|
|
66
|
+
| ์ข์ ํญยทํฐ ๊ธ์ | ๊ธด ์ฝ๋ ์กฐ๊ฐ์ ์ค๋ฐ๊ฟ๋๋ค(`overflow-wrap: anywhere`). ์ค๋ฐ๊ฟ ์์ด ๊ฐ๋ก ์คํฌ๋กค์ด ํ์ํ๋ฉด [CodeBlock](code-block.md) | `.hjm-text-format` |
|
|
67
|
+
|
|
68
|
+
## ๊ผญ ์งํฌ ๊ฒ
|
|
69
|
+
|
|
70
|
+
- ํค ์ด๋ฆ(โ / Ctrl ๋ฑ)์ ์ ํ ๋ฌธ๊ตฌ๋ค. ํ๋ซํผ๋ณ๋ก ๋ค๋ฅด๊ฒ ๋ถ๋ฅด๋ฏ๋ก i18n ํค๋ก ๋ฃ๊ณ HJM์ด ์ ํ์ง ์๋๋ค.
|
|
71
|
+
- `quote`๋ ๋ธ๋ก ์์(`<blockquote>`)๋ฅผ ๋ง๋ ๋ค. ๋ฌธ๋จ ์ ์ธ๋ผ์ธ ๊ฐ์กฐ์ฉ์ผ๋ก ์ฐ์ง ์๋๋ค.
|
|
72
|
+
- ๋ฐฐ์น๋ `layoutStyle`๋ก ํ๋ค. `className`์ ๋ถ์ผ ์ ์์ง๋ง(`hjm-text-format`์ ํฉ์ณ์ง๋ค) ๊ธ๊ผดยท์ยทํ
๋๋ฆฌ๋ฅผ ๋ฎ์ง ์๋๋ค.
|
|
73
|
+
๋ฐฐ์น ์ธ ์๊ฐ override๋ [์๋น ์ ์ฑ
](../../consumer-policy.md) ์๋ฐ์ด๋ค.
|
|
74
|
+
- ๋ชจ์์ `@hjmds/react/styles.css`์ `.hjm-text-format` ๊ท์น์ด ๊ทธ๋ฆฐ๋ค. stylesheet๋ฅผ ๋ถ๋ฌ์ค์ง
|
|
75
|
+
์์ ํ๋ฉด์์๋ ์๋ฏธ ์์๋ง ๋จ๊ณ HJM ๋ชจ์์ ์๋ค.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# TextTransition
|
|
2
|
+
|
|
3
|
+
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
|
+
- ์ํ: ๋ฐฐํฌ
|
|
5
|
+
- ์ง์: Web ยท Native
|
|
6
|
+
- ์ ์ฉ: 1.12.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-06
|
|
8
|
+
- ๊ทผ๊ฑฐ: `src/content-transition.ts`(`resolveContentTransition`). ๋
๋ฆฝ ๊ณ์ฝ ๋ฌธ์ ์์(supplemental)
|
|
9
|
+
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/์ปดํฌ๋ํธ/์๊ฐ ํจ๊ณผ/๋ด์ฉ ์ ํ`, `๋ฐฐํฌ/๊ตฌ์ฑ/์ง์ ์กฐ์๊ณผ ๋ชจ์
/๋๊ธฐยท๋ฐ๊ธฐยทํ๋ฉด ์ ํ`
|
|
10
|
+
|
|
11
|
+
## ์ธ์ ์ฐ๋
|
|
12
|
+
|
|
13
|
+
๊ฐ์ ์๋ฆฌ์ ์งง์ ๋ฌธ์์ด์ด ๋ฐ๋ ๋(์ํ ๋ฌธ๊ตฌ, ๋ฒํผ ์ ์๋ด, ๋จ๊ณ ์ด๋ฆ) ๋ฐ๋ ์๊ฐ์ ์งง์
|
|
14
|
+
๋ฑ์ฅ ๋ชจ์
์ผ๋ก ์๋ฆฐ๋ค. ๊ธ์ ๋จ์๋ก ์ชผ๊ฐ์ง ์๊ณ ๋ฌธ์์ด ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๋ฐ๊ฟ, ์ค๋ฐ๊ฟยท์ ํยท
|
|
15
|
+
์คํฌ๋ฆฐ๋ฆฌ๋ ๋ญ๋
์ด ํ ๊ฐ์ผ๋ก ์ ์ง๋๋ค.
|
|
16
|
+
|
|
17
|
+
## ์ฐ์ง ์์ ๋
|
|
18
|
+
|
|
19
|
+
| ์ํฉ | ๋์ ์ธ ๊ฒ |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| ๋ฌธ์์ด์ด ์๋๋ผ ํจ๋ยท์์ญ ์ ์ฒด๊ฐ ๋ฐ๋ | `ContentTransition`(๊ฐ์ subpath, ์๋ ํ) โ [ContentTransition](content-transition.md) |
|
|
22
|
+
| ์ซ์ ๊ฐ์ด ๋ฐ๋๋ ํต๊ณ | [Statistic](statistic.md) |
|
|
23
|
+
| ์ฝ์ด ์ค์ผ ํ๋ ๊ฒฐ๊ณผ ์๋ฆผ | [Toast](toast.md), [Notice](notice.md) |
|
|
24
|
+
|
|
25
|
+
## ๊ณต๊ฐ ์ด๋ฆ๊ณผ import
|
|
26
|
+
|
|
27
|
+
| ์ด๋ฆ | ์ญํ | Web | Native |
|
|
28
|
+
| --- | --- | --- | --- |
|
|
29
|
+
| `TextTransition` | ๊ธฐ๋ณธ(๋ฌธ์์ด ์ ํ) | `/content-transition` | `/content-transition` |
|
|
30
|
+
| `ContentTransition` | ๋๋ฐ(ํ์ ํธ๋ฆฌ ์ ํ, TextTransition์ ๊ธฐ๋ฐ) | `/content-transition` | `/content-transition` |
|
|
31
|
+
|
|
32
|
+
root์์๋ ๋ด๋ณด๋ด์ง ์๋๋ค. granular subpath๋ก๋ง ๊ฐ์ ธ์จ๋ค.
|
|
33
|
+
|
|
34
|
+
| renderer | ํ์ํ peer(`peerDependenciesMeta` optional) |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| Web | `framer-motion` 13.4.4 (subpath๊ฐ ์ง์ import ํ๋ค) |
|
|
37
|
+
| Native | ์์. RN `Animated`๋ง ์ด๋ค |
|
|
38
|
+
|
|
39
|
+
## ์ต์ ์ฌ์ฉ ์
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
// Web
|
|
43
|
+
import { TextTransition } from "@hjmds/react/content-transition";
|
|
44
|
+
|
|
45
|
+
// ์ํ โ i18n ํค ์์ ํ. ํค๋ฅผ ํ
ํ๋ฆฟ ๋ฌธ์์ด๋ก ๋ง๋ค์ง ์๋๋ค.
|
|
46
|
+
const uploadStatusKey = {
|
|
47
|
+
uploading: "upload.status.uploading",
|
|
48
|
+
processing: "upload.status.processing",
|
|
49
|
+
done: "upload.status.done",
|
|
50
|
+
} as const;
|
|
51
|
+
|
|
52
|
+
<TextTransition text={t(uploadStatusKey[phase])} preset="rise" />
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
// Native
|
|
57
|
+
import { TextTransition } from "@hjmds/react-native/content-transition";
|
|
58
|
+
|
|
59
|
+
const uploadStatusKey = {
|
|
60
|
+
uploading: "upload.status.uploading",
|
|
61
|
+
processing: "upload.status.processing",
|
|
62
|
+
done: "upload.status.done",
|
|
63
|
+
} as const;
|
|
64
|
+
|
|
65
|
+
<TextTransition text={t(uploadStatusKey[phase])} preset="rise" />
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## ์ถ๊ณผ ๊ธฐ๋ณธ๊ฐ
|
|
69
|
+
|
|
70
|
+
| prop | ๊ฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|
|
71
|
+
| --- | --- | --- | --- |
|
|
72
|
+
| `text`(ํ์) | ๋ฌธ์์ด | โ | ๋ฐ๋ ๋๋ง๋ค ์ ํํ๋ค. ๊ฐ์ ๋ฌธ์์ด์ด๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค |
|
|
73
|
+
| `preset` | `fade` ยท `rise`(์๋ 12์์) ยท `slide`(๊ฐ๋ก 16, RTL์ด๋ฉด ๋ฐ๋) ยท `scale`(0.96์์) | `fade` | โ |
|
|
74
|
+
| `motion` | `system` ยท `none` | `system` | `system`์ด์ด๋ provider์ reduced motion์ด๋ฉด ์ฆ์ ๋ฐ๋๋ค |
|
|
75
|
+
| `layoutStyle`(Web) | `HjmCompositionStyleProp` | โ | ๋ฐ๊นฅ `<div>` ๋ฐฐ์น. Native์๋ ์๋ค |
|
|
76
|
+
| `ContentTransition` `stateKey`ยท`children` | `string`ยท`ReactNode` | โ (ํ์) | `stateKey`๊ฐ ๋ฐ๋ ๋ ํ์ ํธ๋ฆฌ๋ฅผ ์ ํํ๋ค |
|
|
77
|
+
| `ContentTransition` `focusTarget`(Web) | `RefObject<HTMLElement \| null>` | โ | ์ ํ ์ ํฌ์ปค์ค๊ฐ ๋ฐ๋๋ ํ์ ํธ๋ฆฌ ์์ ์์์ผ๋ฉด ์ ํ ๋ค ์ด ์์๋ก ํฌ์ปค์ค๋ฅผ ์ฎ๊ธด๋ค |
|
|
78
|
+
|
|
79
|
+
์ฒซ ๋ ๋์๋ ๋ชจ์
์ด ์๋ค. ๊ธธ์ด๋ `motion.normal`, ๊ณก์ ์ `easing.enter`(foundations).
|
|
80
|
+
|
|
81
|
+
## ๋ฐฐ์น
|
|
82
|
+
|
|
83
|
+
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
84
|
+
| --- | --- | --- |
|
|
85
|
+
| ํฌ๊ธฐ | ๋ฐ๊นฅ ์ฌ๋ฐฑยทํฌ๊ธฐ prop์ด ์๋ค. ๋์ด๋ ์ ๋ฌธ์์ด์ ๋ง์ถฐ ์ฆ์ ๋ฐ๋๋ค(๋์ด ๋ณด๊ฐ ์์). ์๋ฆฌ๋ฅผ ๊ณ ์ ํ๋ ค๋ฉด ๋ถ๋ชจ์ ์ต์ ๋์ด๋ฅผ ์ค๋ค | `react/src/content-transition.tsx`, `react-native/src/content-transition.tsx` |
|
|
86
|
+
| ๊ฐ๊ฒฉ | ์์น์ ์ด์ ๊ฐ๊ฒฉ์ ๊ฐ์ธ๋ [Stack](stack.md) ๋ฑ์ `gap`์ผ๋ก ์ค๋ค | โ |
|
|
87
|
+
| ์์ยท์ ๋ ฌ | ๋ธ๋ก ์์๋ค(Web `<div>` ๋ ๊ฒน, Native `Animated.View`). ๋ฌธ์ฅ ์ค๊ฐ์ ์ธ๋ผ์ธ์ผ๋ก ๋ผ์ฐ์ง ์๊ณ ํ ์ค(๋๋ ํ ๋ฉ์ด๋ฆฌ)๋ก ๋๋ค | `react/src/content-transition.tsx`, `react-native/src/content-transition.tsx` |
|
|
88
|
+
| ๊ณ ์ ยท์คํฌ๋กค | ์ด๋๋์ `rise` ์ธ๋ก 12, `slide` ๊ฐ๋ก 16์ด๋ค. ๋ถ๋ชจ๊ฐ `overflow: hidden`์ด๋ฉด ์์ ์์น๊ฐ ์๋ ค ๋ณด์ผ ์ ์๋ค | `design-contracts/src/content-transition.ts` |
|
|
89
|
+
| ์ข์ ํญยทํฐ ๊ธ์ | ์ข์ ํญ์์ ๋ฌธ๊ตฌ ๊ธธ์ด ์ฐจ์ด๋ก ์ค ์๊ฐ ๋ฐ๋๋ฉด ์๋ ์์๊ฐ ํ๋ค(ํฌ๊ธฐ ํ ์ฐธ๊ณ ) | `react/src/content-transition.tsx` |
|
|
90
|
+
|
|
91
|
+
## ๊ผญ ์งํฌ ๊ฒ
|
|
92
|
+
|
|
93
|
+
- ๋ฌธ์์ด์ i18n ํค๋ก ๋ง๋ ์ต์ข
๋ฌธ๊ตฌ๋ฅผ ๋๊ธด๋ค. ๊ธ์ ์ ๋ณํ๋ฅผ ๋
ธ๋ฆฐ ์ฐ์ถ์ฉ์ผ๋ก ์ฐ์ง ์๋๋ค.
|
|
94
|
+
- ๊ธ์ ๋ชจ์ prop์ ์๋ค. ๊ธ์ ๋ชจ์์ ๊ฐ์ธ๋ ์ชฝ์ด ์ ํ๋ค(์๋ ํ๋ซํผ ์ฐจ์ด). Web์ `layoutStyle`๋ก ๋ฐฐ์น๋ง ํ๊ณ , Native๋ ๋ฐฐ์น prop์ด ์์ด ๊ฐ์ธ๋ ์ชฝ์ด ๋ฐฐ์นํ๋ค.
|
|
95
|
+
- Web์์ ์ด subpath๋ฅผ ์ฐ๋ ค๋ฉด ์ฑ์ `framer-motion`์ ์ค์นํ๋ค. ์์ผ๋ฉด import ์์ ์ ์คํจํ๋ค.
|
|
96
|
+
|
|
97
|
+
## ํ๋ซํผ ์ฐจ์ด
|
|
98
|
+
|
|
99
|
+
| ํญ๋ชฉ | Web | Native |
|
|
100
|
+
| --- | --- | --- |
|
|
101
|
+
| ๊ธ์ ๋ ๋ | `<div>` ์์ ๋งจ ํ
์คํธ(๋ถ๋ชจ ๊ธ๊ผด ์์) | HJM `Text`๋ก ๊ฐ์ผ๋ค |
|
|
102
|
+
| ์ ํ ๋ฐฉ์ | `stateKey`๋ก ํค๋ฅผ ๋ฐ๊ฟ ์ ๋
ธ๋๋ฅผ ๋ง์ดํธ | ๊ฐ์ ๋
ธ๋์ opacityยทtransform ๋ณด๊ฐ |
|
|
103
|
+
| ๋ฐฑ๊ทธ๋ผ์ด๋ | ํด๋น ์์ | ์ฑ์ด active๊ฐ ์๋๋ฉด ์ ํ ์์ด ์ฆ์ ํ์ |
|
|
104
|
+
| `layoutStyle` | ์์ | ์์ |
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Text
|
|
2
|
+
|
|
3
|
+
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
|
+
- ์ํ: ๋ฐฐํฌ
|
|
5
|
+
- ์ง์: Web ยท Native
|
|
6
|
+
- ์ ์ฉ: 1.12.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-06
|
|
8
|
+
- ๊ทผ๊ฑฐ: `src/component-recipes.ts`(`textRecipe`), [Gravity Letters](../../gravity-letters.md)
|
|
9
|
+
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/์ปดํฌ๋ํธ/๊ธ์์ ์์ด์ฝ/๋ณธ๋ฌธ ๊ธ์`, `๋ฐฐํฌ/์ปดํฌ๋ํธ/์๊ฐ ํจ๊ณผ/์ค๋ ฅ ๊ธ์`
|
|
10
|
+
|
|
11
|
+
## ์ธ์ ์ฐ๋
|
|
12
|
+
|
|
13
|
+
ํ๋ฉด์ ๋ชจ๋ ์ผ๋ฐ ๊ธ์์ ์ด๋ค. ๋ณธ๋ฌธยท๋ณด์กฐ ์ค๋ช
ยท์บก์
ยท๋ผ๋ฒจยท์นด๋ ์์ ์์ ์ ๋ชฉ(24px ์ดํ)์ด ์ฌ๊ธฐ์
|
|
14
|
+
์ํ๋ค. ์ ํ CSS๋ก ํฐํธ ํฌ๊ธฐยท๊ตต๊ธฐยท์์ ์ง์ ์ฐ๋ ๋์ `variant`ยท`emphasis`ยท`tone`์ผ๋ก ๊ณ ๋ฅธ๋ค.
|
|
15
|
+
|
|
16
|
+
## ์ฐ์ง ์์ ๋
|
|
17
|
+
|
|
18
|
+
| ์ํฉ | ๋์ ์ธ ๊ฒ |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| ๋ฌธ์ ์ ๋ชฉ ๋จ๊ณ(`h1`~)๊ฐ ํ์ํ๊ฑฐ๋ 24px๋ณด๋ค ํฐ ์ ๋ชฉ | [Heading](heading.md) |
|
|
21
|
+
| ํ๋ฉด ์ฒซ ์๋ฆฌ์ ์ ๋ชฉ ๋ธ๋ก(๋ณด์กฐ ๋ฌธ์ฅยทํ๋ ํฌํจ) | [Top](top.md) |
|
|
22
|
+
| ๋ณธ๋ฌธ ๋ฌถ์์ ํค๋ ํ | [Section](section.md) |
|
|
23
|
+
| ์ซ์ ์งํ์ ๊ทธ ๋ผ๋ฒจ | [Statistic](statistic.md) |
|
|
24
|
+
| ๋ค๋ฅธ ํ๋ฉดยทURL๋ก ๊ฐ๋ ๊ธ์ | [Link](link.md) |
|
|
25
|
+
| ์ซ์ยท๋ ์งยท์ฝ๋ ๊ฐ์ ํ์ ๊ธ์ | [TextFormat](text-format.md) |
|
|
26
|
+
| ํ๋ฉด์๋ ์จ๊ธฐ๊ณ ๋ณด์กฐ๊ธฐ๊ธฐ์๋ง ์ฝํ ๊ธ์(Web) | [VisuallyHidden](visually-hidden.md) |
|
|
27
|
+
|
|
28
|
+
Text์ Heading์ ๊ฒฝ๊ณ: Text์ `variant="heading"`(24px)์ **๋ชจ์๋ง** ์ ๋ชฉ์ด๊ณ ์ ๋ชฉ role์ด ์๋ค.
|
|
29
|
+
๋ณด์กฐ๊ธฐ๊ธฐ์ ์ ๋ชฉ ํ์์ ์กํ์ผ ํ๊ฑฐ๋ ๋ ํฐ ํฌ๊ธฐ๊ฐ ํ์ํ๋ฉด Heading์ ์ด๋ค. Heading์ ์ฌ๋ฐฑ์ ๊ฐ์ง ์๋๋ค.
|
|
30
|
+
|
|
31
|
+
## ๊ณต๊ฐ ์ด๋ฆ๊ณผ import
|
|
32
|
+
|
|
33
|
+
| ์ด๋ฆ | ์ญํ | Web | Native |
|
|
34
|
+
| --- | --- | --- | --- |
|
|
35
|
+
| `Text` | ๊ธฐ๋ณธ | `@hjmds/react`, `/layout` | `@hjmds/react-native`, `/primitives` |
|
|
36
|
+
| `GravityLetters` | ํ์ฅ(ํ๋ณด์ฉ ๊ธ์ ๋ํ ์ฅ์, optional-extension) | `/gravity-letters` | `/gravity-letters` |
|
|
37
|
+
|
|
38
|
+
`GravityLetters`๋ granular subpath๋ก๋ง import ๋๋ค. ์ถ๊ฐ peer ์์กด์ฑ์ ์๋ค(Web์ WAAPI, Native๋ RN `Animated`).
|
|
39
|
+
|
|
40
|
+
## ์ต์ ์ฌ์ฉ ์
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
// Web
|
|
44
|
+
import { Text } from "@hjmds/react/layout";
|
|
45
|
+
|
|
46
|
+
<Text as="p" variant="body" tone="muted">{t("profile.bioHint")}</Text>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
// Native
|
|
51
|
+
import { Text } from "@hjmds/react-native/primitives";
|
|
52
|
+
|
|
53
|
+
<Text variant="body" tone="muted" numberOfLines={2}>{t("profile.bioHint")}</Text>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## ์ถ๊ณผ ๊ธฐ๋ณธ๊ฐ
|
|
57
|
+
|
|
58
|
+
| prop | ๊ฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|
|
59
|
+
| --- | --- | --- | --- |
|
|
60
|
+
| `variant` | `caption`(11) ยท `label`(12) ยท `body`(14) ยท `bodyLarge`(16) ยท `title`(18) ยท `titleLarge`(20) ยท `heading`(24) | `body` | ํ๋ฉดยท์น์
์ ๋ชฉ์ ๋ชจ์์ด ์๋๋ผ [Heading](heading.md)์ผ๋ก ์ด๋ค |
|
|
61
|
+
| `emphasis` | `regular` ยท `medium`(semibold) ยท `strong`(bold) | `regular` | โ |
|
|
62
|
+
| `tone` | `primary` ยท `body` ยท `muted` ยท `subtle` ยท `weak` ยท `brand` ยท `danger` ยท `inverse` | `primary` | โ |
|
|
63
|
+
| `as` | `span` ยท `p` ยท `div` ยท `strong` ยท `small` | `span` | Web๋ง. ๋ฌธ๋จ์ `as="p"` |
|
|
64
|
+
| `align` | `TextStyle["textAlign"]` | ์ฐ๊ธฐ ๋ฐฉํฅ์ ์์ ์ชฝ | Native๋ง |
|
|
65
|
+
| `layoutStyle` | `HjmCompositionStyleProp` | โ | ๋ฐฐ์น. WebยทNative ๋ชจ๋ |
|
|
66
|
+
| `GravityLetters` `glyphs` | `readonly string[]`(1~32๊ฐ) | โ (ํ์) | โ |
|
|
67
|
+
| `GravityLetters` `active`ยท`replayKey` | `boolean`ยท`string \| number` | `false`ยท`0` | `replayKey`๊ฐ ๋ฐ๋๋ฉด ๋ค์ ๋จ์ด์ง๋ค. Web๋ง `layoutStyle`๋ ๋ฐ๋๋ค |
|
|
68
|
+
|
|
69
|
+
## ๋ฐฐ์น
|
|
70
|
+
|
|
71
|
+
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
72
|
+
| --- | --- | --- |
|
|
73
|
+
| ํฌ๊ธฐ | ํญ์ ๋ถ๋ชจ๋ฅผ ๋ฐ๋ฅธ๋ค. ๊ธด ์ฝ๊ธฐ ๊ธ์ ๋ถ๋ชจ ํญ์ `layout.readingMaxWidth` 720 ์ดํ๋ก ๋๋ค | `foundations.ts`(`layout`) |
|
|
74
|
+
| ๊ฐ๊ฒฉ | ๋ฐ๊นฅ ์ฌ๋ฐฑ์ด ์๋ค(Web `margin: 0`). ๋ฌธ๋จ ์ฌ์ดยท๋ผ๋ฒจ๊ณผ ๊ฐ ์ฌ์ด ๊ฐ๊ฒฉ์ ๋ถ๋ชจ [Stack](stack.md)์ `gap`์ด๋ `layoutStyle`๋ก ์ค๋ค. ๋ณธ๋ฌธ ๋ฌธ๋จ ๋ฌถ์์ ๋ณดํต `spacing.xs` 8~`spacing.sm` 12, ์น์
์ฌ์ด๋ `layout.sectionGap`(`spacing.xl` 24) | `.hjm-text`, `foundations.ts`(`layout`, `spacing`) |
|
|
75
|
+
| ์์ยท์ ๋ ฌ | Web์ ๋ถ๋ชจ๊ฐ ์ ํ๊ณ , Native๋ `align`(์๋ต ์ ์ฐ๊ธฐ ๋ฐฉํฅ์ ์์ ์ชฝ)์ผ๋ก ์ ํ๋ค | `react-native/src/primitives.tsx` |
|
|
76
|
+
| ๊ณ ์ ยท์คํฌ๋กค | โ | โ |
|
|
77
|
+
| ์ข์ ํญยทํฐ ๊ธ์ | ์ค์ด ๋์ด๋ ๋์ด๊ฐ ์๋๋ค. ์๋ฅด๋ ค๋ฉด Native `numberOfLines`๋ฅผ ์ฐ๊ณ , ํต์ฌ ๋ฌธ๊ตฌ๋ ์๋ฅด์ง ์๋๋ค | `.hjm-text`(`overflow-wrap: anywhere`) |
|
|
78
|
+
|
|
79
|
+
## ๊ผญ ์งํฌ ๊ฒ
|
|
80
|
+
|
|
81
|
+
- ๊ธ์๋ i18n ํค๋ก ๋ฃ๋๋ค. ์ ํ ์ด๋ฆยท๋๋ฉ์ธ ๋ฌธ๊ตฌ๋ ์ ํ ์์ , ํฌ๊ธฐยท์ ์ฒด๊ณ๋ HJM ์์ ๋ค.
|
|
82
|
+
- ๋ฐฐ์น(์ฌ๋ฐฑยทํญยทflex)๋ `layoutStyle`๋ก๋ง ํ๋ค. ์ยทํฌ๊ธฐยท๊ตต๊ธฐ๋ `style`/`className`์ผ๋ก ๋ฎ์ง ์๋๋ค.
|
|
83
|
+
(Native Text์ `style`์ layout primitive๋ผ deprecated ๊ฒฝ๊ณ ๋์์์ ๋น ์ ธ ์์ ๋ฟ ๊ถ์ฅ ๊ฒฝ๋ก๊ฐ ์๋๋ค.)
|
|
84
|
+
- ์์ผ๋ก ์๋ฏธ๋ฅผ ๋ฐ๊ฟ ๋๋ `tone`๋ง ์ด๋ค(์ค๋ฅ ๋ฌธ๊ตฌ `danger`, ์ด๋์ด ๋ฐฐ๊ฒฝ ์ `inverse`).
|
|
85
|
+
- `GravityLetters`๋ ์ฅ์์ด๋ฉฐ ์ ๊ทผ์ฑ ํธ๋ฆฌ์์ ์จ๋๋ค. ๊ฐ์ ๋ฌธ๊ตฌ์ ์ ์ TextยทHeading์ ๋ฐ๊นฅ์ ํจ๊ป ๋๋ค.
|
|
86
|
+
`glyphs`๋ 32๊ฐ ์ดํ, ๋น ๋ฌธ์์ดยท์ค๋ฐ๊ฟ ์์ด ๋๊ธด๋ค(์ด๊ธฐ๋ฉด `RangeError`). `active` ๊ธฐ๋ณธ์ `false`๋ค.
|
|
87
|
+
|
|
88
|
+
## ํ๋ซํผ ์ฐจ์ด
|
|
89
|
+
|
|
90
|
+
| ํญ๋ชฉ | Web | Native |
|
|
91
|
+
| --- | --- | --- |
|
|
92
|
+
| ์์ ์ ํ | `as` | ์์(ํญ์ RN `Text`) |
|
|
93
|
+
| ์ ๋ ฌ | ์์(๋ฐฐ์น๋ ๋ถ๋ชจ) | `align`(์๋ต ์ ๋ฐฉํฅ์ ๋ง์ถ ๋
ผ๋ฆฌ ์ ๋ ฌ) |
|
|
94
|
+
| ๊ธ์ ํฌ๊ธฐ ์กฐ์ | ๋ธ๋ผ์ฐ์ | provider `textScaling`์ด `allowFontScaling`์ ์ ํจ |
|
|
95
|
+
| ๊ธด ๋จ์ด ์ค๋ฐ๊ฟ | `overflow-wrap: anywhere` | RN ๊ธฐ๋ณธ |
|
|
96
|
+
| import ๊ฒฝ๋ก | `/layout` | `/primitives` |
|
|
97
|
+
|
|
98
|
+
## ํจ์
|
|
99
|
+
|
|
100
|
+
- `emphasis`๊ฐ `variant`์ ๊ตต๊ธฐ๋ฅผ ๋ฎ๋๋ค. `variant="title"`๋ ๊ธฐ๋ณธ `emphasis="regular"`๋ฉด ๋ณดํต ๊ตต๊ธฐ๋ก
|
|
101
|
+
๊ทธ๋ ค์ง๋ค. ๊ตต์ ์ ๋ชฉ์ด ํ์ํ๋ฉด `emphasis="strong"`์ ๋ช
์ํ๋ค(๋ renderer ๋์ผ).
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# ThinkingOrb
|
|
2
|
+
|
|
3
|
+
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
|
+
- ์ํ: ๋ฐฐํฌ
|
|
5
|
+
- ์ง์: Web ยท Native
|
|
6
|
+
- ์ ์ฉ: 1.12.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-06
|
|
8
|
+
- ๊ทผ๊ฑฐ: [ThinkingOrb](../../thinking-orb.md), `src/thinking-orb-recipe.ts`(`thinkingOrbRecipe`)
|
|
9
|
+
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/์ปดํฌ๋ํธ/์ํ์ ์๋ฆผ/์๊ฐ ์ค ํ์`
|
|
10
|
+
|
|
11
|
+
## ์ธ์ ์ฐ๋
|
|
12
|
+
|
|
13
|
+
AI ์์ด์ ํธ๊ฐ ์ค์ ๋ก ๊ฒ์ยท์์ฑยท๋ฃ๊ธฐ ๊ฐ์ ์์
์ ํ๋ ๋์ ๊ทธ ๋จ๊ณ๋ฅผ ๋ณด์ฌ ์ค ๋๋ง ์ด๋ค.
|
|
14
|
+
์ํ(`state`)๋ ์ฑ์ด ์ค์ ์์
๋จ๊ณ์์ ๋๊ธด๋ค. orb๊ฐ ์งํ๋ฅ ์ ํ๋ด ๋ด์ง ์๋๋ค.
|
|
15
|
+
|
|
16
|
+
## ์ฐ์ง ์์ ๋
|
|
17
|
+
|
|
18
|
+
| ์ํฉ | ๋์ ์ธ ๊ฒ |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| ์ผ๋ฐ ๋ก๋ฉยท๋๊ธฐ | [Spinner](spinner.md) |
|
|
21
|
+
| ์งํ๋ฅ ์ ์๋ ์์
| [Progress](progress.md) |
|
|
22
|
+
| ์ฝํ
์ธ ์๋ฆฌ ํ์ | [Skeleton](skeleton.md) |
|
|
23
|
+
| ์๋ฃยท์ค๋ฅ ๊ฒฐ๊ณผ | [Result](result.md), [Toast](toast.md) โ orb๋ฅผ ๊ฒฐ๊ณผ UI๋ก ๊ต์ฒดํ๋ค |
|
|
24
|
+
|
|
25
|
+
## ๊ณต๊ฐ ์ด๋ฆ๊ณผ import
|
|
26
|
+
|
|
27
|
+
| ์ด๋ฆ | ์ญํ | Web | Native |
|
|
28
|
+
| --- | --- | --- | --- |
|
|
29
|
+
| `ThinkingOrb` | ๊ธฐ๋ณธ(root์์๋ ๋ด๋ณด๋ด์ง ์๋๋ค) | `/thinking-orb` | `/thinking-orb` |
|
|
30
|
+
|
|
31
|
+
granular subpath๋ก๋ง ๊ฐ์ ธ์จ๋ค. Native subpath๋ optional native peer๋ฅผ ์ง์ import ํ๋ค.
|
|
32
|
+
|
|
33
|
+
| renderer | ํ์ํ peer(`peerDependenciesMeta` optional) |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| Web | ์์(Canvas 2D) |
|
|
36
|
+
| Native | `@shopify/react-native-skia` ^2.6.2, `react-native-reanimated` ^4.5.1์ ๊ทธ ์ ์ `react-native-worklets` ^0.10.1. ๋ชจ๋ native ๋ชจ๋์ด๋ผ ์ค์น ํ dev client๋ฅผ ๋ค์ ๋น๋ํ๋ค |
|
|
37
|
+
|
|
38
|
+
๊ณ์ฝ ๋ฌธ์๊ฐ ๊ฒ์ฆ ๋์์ผ๋ก ์ ์ ์กฐํฉ์ Expo 57 / RN 0.86.2๋ค. ๊ธฐ๋ณธ ํจํค์ง์ `react-native >=0.81`
|
|
39
|
+
๋ฒ์๊ฐ ์ด subpath์ ์ง์์ ๋ณด์ฅํ์ง ์๋๋ค.
|
|
40
|
+
|
|
41
|
+
## ์ต์ ์ฌ์ฉ ์
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
// Web
|
|
45
|
+
import { ThinkingOrb } from "@hjmds/react/thinking-orb";
|
|
46
|
+
|
|
47
|
+
<ThinkingOrb state="searching" label={t("agent.searching")} />
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
// Native
|
|
52
|
+
import { ThinkingOrb } from "@hjmds/react-native/thinking-orb";
|
|
53
|
+
|
|
54
|
+
<ThinkingOrb state="searching" size={20} label={t("agent.searching")} active={isFocused} />
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## ์ถ๊ณผ ๊ธฐ๋ณธ๊ฐ
|
|
58
|
+
|
|
59
|
+
| prop | ๊ฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|
|
60
|
+
| --- | --- | --- | --- |
|
|
61
|
+
| `state` | `working` ยท `searching` ยท `solving` ยท `listening` ยท `connecting` ยท `weaving` ยท `composing` ยท `breathing` ยท `shaping` | `working` | `listening`์ ์์ฑ ํฌ๊ธฐ ์๊ฐํ๊ฐ ์๋๋ค |
|
|
62
|
+
| `appearance` | `state`(์ํ๋ณ ๊ธฐํ) ยท `fluid` ยท `matrix` | `state` | โ |
|
|
63
|
+
| `size` | `64` ยท `20` | `64` | ๋ค๋ฅธ ๊ฐ์ `RangeError` |
|
|
64
|
+
| `label`(ํ์) | ๋ฒ์ญ๋ ํ์ฌ ์์
์ค๋ช
| โ | ๋น๊ฑฐ๋ ๊ณต๋ฐฑ์ด๋ฉด `TypeError` |
|
|
65
|
+
| `speed` | 0 ์ด๊ณผ 4 ์ดํ | `1` | โ |
|
|
66
|
+
| `paused` | `boolean` | `false` | โ |
|
|
67
|
+
| `active` | `boolean` | `true` | โ |
|
|
68
|
+
| `layoutStyle`(Web) | `HjmCompositionStyleProp` | โ | ๋ฐ๊นฅ ์์ ๋ฐฐ์น. `style`๊ณผ ๊ฒน์น๋ฉด `layoutStyle`์ด ์ด๊ธด๋ค |
|
|
69
|
+
| `style` | Web `CSSProperties`, Native `StyleProp<ViewStyle>` | โ | Native๋ `layoutStyle`์ด ์์ด `style`์ด ๋ฐฐ์น ํต๋ก๋ค(optional motion host frame์ด๋ผ deprecated ๋์์์ ๋น ์ก๋ค). ๋ฐฐ์น key๋ง ๋ฃ๋๋ค |
|
|
70
|
+
|
|
71
|
+
์์ provider์ `text` ์์ ๊น์ด๋ณ opacity๋ก ์ด๋ค. ์ prop์ ์๋ค.
|
|
72
|
+
|
|
73
|
+
## ๋ฐฐ์น
|
|
74
|
+
|
|
75
|
+
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| ํฌ๊ธฐ | ์ ์ฌ๊ฐํ ๊ณ ์ ํฌ๊ธฐ `size` 20 ๋๋ 64. ์์ชฝยท๋ฐ๊นฅ ์ฌ๋ฐฑ์ด ์๋ค. ๋๋ฅผ ์ ์๋ ํ์๋ผ ํฐ์น ์์ญ ์๊ตฌ๊ฐ ์๋ค | `thinkingOrbRecipe`(`sizes: [20, 64]`) |
|
|
78
|
+
| ๊ฐ๊ฒฉ | ๋ฌธ๊ตฌ์ ๋๋ํ ๋ ๋ ๊ฐ๊ฒฉ์ ๊ฐ์ธ๋ [Stack](stack.md)์ `gap`(์: `spacing.xs` 8)์ผ๋ก ์ค๋ค | โ |
|
|
79
|
+
| ์์ยท์ ๋ ฌ | 20์ ์์
๋ฌธ๊ตฌ ํ ์ค๊ณผ ๋๋ํ, 64๋ ์์ญ ๊ฐ์ด๋ฐ ๋จ๋
์ผ๋ก ๋๋ค. Web ๋ฐ๊นฅ ์์๋ `inline-flex`๋ผ ๊ธ์ค ์์๋ ๋์ธ๋ค. ๋ฒํผ ์ ๋ก๋ฉ ํ์๋ก ์ฐ์ง ์๋๋ค(๋ฒํผ์ `loading`). ์์
์ด ๋๋๋ฉด ๊ฐ์ ์๋ฆฌ๋ฅผ ๊ฒฐ๊ณผ UI๋ก ๋ฐ๊พธ๊ณ orb์ ๊ฒฐ๊ณผ๋ฅผ ํจ๊ป ๋์ง ์๋๋ค | `react/src/thinking-orb.tsx` |
|
|
80
|
+
| ๊ณ ์ ยท์คํฌ๋กค | โ | โ |
|
|
81
|
+
| ์ข์ ํญยทํฐ ๊ธ์ | ํฐ ๊ธ์ ์ค์ ์๋ ํฌ๊ธฐ๊ฐ ๋ณํ์ง ์๋๋ค | `react/src/thinking-orb.tsx`, `react-native/src/thinking-orb.tsx` |
|
|
82
|
+
|
|
83
|
+
## ๊ผญ ์งํฌ ๊ฒ
|
|
84
|
+
|
|
85
|
+
- Native์์๋ ํญยท๋ด๋น๊ฒ์ด์
ยท๊ฐ์ ๋ชฉ๋ก์์ ํ๋ฉด์ด ๊ฐ๋ ค์ง๋ฉด `active={false}`๋ฅผ ๋๊ธด๋ค.
|
|
86
|
+
mounted ์ํ๋ก ์จ์ ํ๋ฉด์ AppState๋ก ์ ์ ์์ด ๊ณ์ ๊ทธ๋ฆฐ๋ค.
|
|
87
|
+
- orb๊ฐ live region(Web `role="status"`, Native progressbar + `accessibilityLiveRegion`)์ด๋ค.
|
|
88
|
+
๊ฐ์ ๋ฌธ๊ตฌ๋ฅผ ์์ ๋ ๋ณด์ฌ ์ค ๋ ๊ทธ ๋ฌธ๊ตฌ์ live region์ ์ค๋ณต์ผ๋ก ๋์ง ์๋๋ค.
|
|
89
|
+
- ํฌ๊ธฐ๋ `size`๋ก๋ง ๋ฐ๊พผ๋ค. CSSยทtransform์ผ๋ก ํ๋ํ์ง ์๋๋ค.
|
|
90
|
+
- ๋ฐฐ์น๋ Web `layoutStyle`, Native `style`๋ก ํ๊ณ ๋ฐฐ์น key(marginยท`alignSelf` ๋ฑ)๋ง ๋ฃ๋๋ค. Web `className`ยท`style`๋ก ํฌ๊ธฐยท์์ ๋ฐ๊พธ์ง ์๋๋ค.
|
|
91
|
+
|
|
92
|
+
## ํ๋ซํผ ์ฐจ์ด
|
|
93
|
+
|
|
94
|
+
| ํญ๋ชฉ | Web | Native |
|
|
95
|
+
| --- | --- | --- |
|
|
96
|
+
| ๊ทธ๋ฆฌ๊ธฐ | Canvas 2D, ๋ณด์ด์ง ์์ผ๋ฉด(IntersectionObserverยท๋ฌธ์ ์จ๊น) ์ ์ง | Skia Picture, ๋ฐฑ๊ทธ๋ผ์ด๋ยท`active=false`๋ฉด ์ ์ง |
|
|
97
|
+
| ๋ชจ์
์ค์ด๊ธฐ | provider `reducedMotion` | provider ๊ฐ ๋๋ OS ์ค์ . OS ๊ฐ์ ์ฝ๊ธฐ ์ ์๋ ์ ์ง ํ๋ ์์ผ๋ก ์์ |
|
|
98
|
+
| ์ ๊ทผ์ฑ | `role="status"` + ์จ๊ธด ํ
์คํธ | `accessibilityRole="progressbar"`, `busy: true` |
|
|
99
|
+
| ์ถ๊ฐ prop | `className`, `layoutStyle` | `testID`(`layoutStyle` ์์) |
|
|
100
|
+
|
|
101
|
+
## ํจ์
|
|
102
|
+
|
|
103
|
+
- 2026-10 ์๋น ์ฑ์์ ์ด subpath๋ฅผ ์ฐ๋ฉด์ SkiaยทReanimated ๊ฐ์ optional native peer๋ฅผ
|
|
104
|
+
์ค์นํ์ง ์์ tscยทํ
์คํธ๋ ํต๊ณผํ๋๋ฐ ๊ธฐ๊ธฐ Metro์์ ํฌ๋์๊ฐ ๋ฌ๋ค. ํ์
๊ฒ์ฌ๋ peer ์ค์น๋ฅผ
|
|
105
|
+
์ฆ๋ช
ํ์ง ์๋๋ค. Native ์ฑํ ์ ์ ์ peer๋ฅผ ์ฑ `package.json`์ ๋ฃ๊ณ ์ค์น ์ฑ์์ ์ค์ ๋ก ๊ทธ๋ ค์ง๋์ง ํ์ธํ๋ค.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Timeline
|
|
2
|
+
|
|
3
|
+
- ๋จ๊ณ: ์ปดํฌ๋ํธ
|
|
4
|
+
- ์ํ: ๋ฐฐํฌ
|
|
5
|
+
- ์ง์: Web ยท Native
|
|
6
|
+
- ์ ์ฉ: 1.12.1
|
|
7
|
+
- ๊ฒํ ์ผ: 2026-10-06
|
|
8
|
+
- ๊ทผ๊ฑฐ: [Timeline](../../timeline.md), `src/timeline.ts`(`timelineRecipe`)
|
|
9
|
+
- ์คํ ๋ฆฌ๋ถ: `๋ฐฐํฌ/์ปดํฌ๋ํธ/๋ฐ์ดํฐ ํ์/ํ์๋ผ์ธ`
|
|
10
|
+
|
|
11
|
+
## ์ธ์ ์ฐ๋
|
|
12
|
+
|
|
13
|
+
์ด๋ฏธ ์ผ์ด๋ ์ผ์ ์๊ฐ ์์๋๋ก ๋ณด์ฌ ์ค ๋ ์ด๋ค. ๊ฒฝ๊ธฐ ํ๋ ์ด ๊ธฐ๋ก, ์ด์ ยท๋ณ๊ฒฝ ์ด๋ ฅ, ์ฃผ๋ฌธ ์ฒ๋ฆฌ
|
|
14
|
+
๊ธฐ๋ก์ฒ๋ผ "๋ฌด์จ ์ผ์ด ์ธ์ ์์๋"๋ฅผ ์โ์๋ ํ ๋ฐฉํฅ์ผ๋ก ๋์ดํ๋ค. ํ์ฌ ์์น(์ปค์)๋ ์๋ค.
|
|
15
|
+
|
|
16
|
+
## ์ฐ์ง ์์ ๋
|
|
17
|
+
|
|
18
|
+
| ์ํฉ | ๋์ ์ธ ๊ฒ |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| ํ๋ฆ์์ ์ง๊ธ ์ด๋์ ์๋์ง(ํ์ฌ ๋จ๊ณ) | [Steps](steps.md) |
|
|
21
|
+
| ํญ๋ชฉ์ ๋๋ฌ ์ด๋ยท์ ํ | [List](list.md), [ListRow](list-row.md) |
|
|
22
|
+
| ํญ๋ชฉ์ด ํ๋๋ ์์ | Timeline์ ๋ง์ดํธํ์ง ์๊ณ [EmptyState](empty-state.md) |
|
|
23
|
+
| ๊ณผ๊ฑฐ ๊ธฐ๋ก์ ๋ ๋ถ๋ฌ์ด | Timeline ์๋์ [LoadMore](load-more.md)๋ฅผ ํฉ์ฑ |
|
|
24
|
+
| ํญ๋ชฉ๋ณ ์งง์ ๋ฐฐ์ง | ์ ํ๋ ์์. ์ ํ ํ๋ฉด์์ [Tag](tag.md)๋ก ์กฐํฉ |
|
|
25
|
+
|
|
26
|
+
## ๊ณต๊ฐ ์ด๋ฆ๊ณผ import
|
|
27
|
+
|
|
28
|
+
| ์ด๋ฆ | ์ญํ | Web | Native |
|
|
29
|
+
| --- | --- | --- | --- |
|
|
30
|
+
| `Timeline` | ๊ธฐ๋ณธ | `@hjmds/react`, `/display` | `@hjmds/react-native`, `/data-display` |
|
|
31
|
+
|
|
32
|
+
ํญ๋ชฉ ํ์
`TimelineItemDescriptor`๋ `@hjmds/design-contracts/components/timeline`์ ์๋ค.
|
|
33
|
+
|
|
34
|
+
## ์ต์ ์ฌ์ฉ ์
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
// Web
|
|
38
|
+
import { Timeline } from "@hjmds/react/display";
|
|
39
|
+
|
|
40
|
+
// ์ํ โ i18n ํค ์์ ํ. ํค๋ฅผ ํ
ํ๋ฆฟ ๋ฌธ์์ด๋ก ๋ง๋ค์ง ์๋๋ค.
|
|
41
|
+
const playEventKey = {
|
|
42
|
+
hit: "pbp.event.hit",
|
|
43
|
+
out: "pbp.event.out",
|
|
44
|
+
run: "pbp.event.run",
|
|
45
|
+
} as const;
|
|
46
|
+
|
|
47
|
+
<Timeline
|
|
48
|
+
items={plays.map((play) => ({
|
|
49
|
+
id: play.id,
|
|
50
|
+
label: t(playEventKey[play.kind]),
|
|
51
|
+
timestamp: formatInning(play.inning), // ์ ํ์ด ํฌ๋งทํ ๋ฌธ์์ด
|
|
52
|
+
tone: play.scored ? "success" : "neutral",
|
|
53
|
+
}))}
|
|
54
|
+
composeAccessibleName={({ position, total, label }) =>
|
|
55
|
+
t("pbp.itemA11y", { position, total, label })}
|
|
56
|
+
/>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
// Native
|
|
61
|
+
import { Timeline } from "@hjmds/react-native/data-display";
|
|
62
|
+
|
|
63
|
+
<Timeline
|
|
64
|
+
items={items}
|
|
65
|
+
composeAccessibleName={({ position, total, label }) =>
|
|
66
|
+
t("pbp.itemA11y", { position, total, label })}
|
|
67
|
+
/>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## ์ถ๊ณผ ๊ธฐ๋ณธ๊ฐ
|
|
71
|
+
|
|
72
|
+
| prop | ๊ฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|
|
73
|
+
| --- | --- | --- | --- |
|
|
74
|
+
| `items`(ํ์) | `id`ยท`label` ํ์, `timestamp`ยท`description`ยท`tone` ์ ํ | โ | ๋ฐฐ์ด ์์๊ฐ ๊ณง ํ์ ์์ |
|
|
75
|
+
| `items[].tone` | `neutral` ยท `info` ยท `success` ยท `attention` | `neutral` | `warning`ยท`danger`๋ ์๋ค |
|
|
76
|
+
| `composeAccessibleName`(ํ์) | `(info: { position: number, total: number, label: string }) => string` | โ | position์ 1๋ถํฐ |
|
|
77
|
+
| `layoutStyle` | `HjmCompositionStyleProp` | โ | ๋ฃจํธ ๋ฐฐ์น. WebยทNative ๋ชจ๋ |
|
|
78
|
+
| `style`(Native) | `StyleProp<ViewStyle>` | โ | deprecated โ `layoutStyle`. ๊ฐ๋ฐ ๋ชจ๋์์ ํ ๋ฒ ๊ฒฝ๊ณ ํ๊ณ ๋ค์ major์์ ์ ๊ฑฐ๋๋ค |
|
|
79
|
+
| ๋๋จธ์ง | Web `<ol>` ์์ฑ, Native `ViewProps`(`style` ์ ์ธ) | โ | โ |
|
|
80
|
+
|
|
81
|
+
## ๋ฐฐ์น
|
|
82
|
+
|
|
83
|
+
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|
|
84
|
+
| --- | --- | --- |
|
|
85
|
+
| ํฌ๊ธฐ | ๊ฐ ํญ๋ชฉ์ [๋ ์ผ 16][๋ณธ๋ฌธ] ๋ ์ด. ๋ ์ผ์ ์ง๋ฆ 10์ dot๊ณผ ๋ค์ ํญ๋ชฉ๊น์ง ์ด์ด์ง๋ 1px connector. ํญ๋ชฉ์ ๋๋ฅผ ์ ์์ด ํฐ์น ์์ญ ์๊ตฌ๊ฐ ์๊ณ ํ ์์ ๋ฒํผ์ ๋ฃ์ง ์๋๋ค | `timelineRecipe`, `.hjm-timeline__item`ยท`__dot`ยท`__connector` |
|
|
86
|
+
| ๊ฐ๊ฒฉ | ํญ๋ชฉ ์ฌ์ด `spacing.md` 16, ๋ ์ผ๊ณผ ๋ณธ๋ฌธ ์ด ๊ฐ๊ฒฉ `spacing.sm` 12, ๋ณธ๋ฌธ ์ค ๊ฐ๊ฒฉ `spacing.xxs` 4 | `timelineRecipe.gap`, `.hjm-timeline*` |
|
|
87
|
+
| ์์ยท์ ๋ ฌ | ๋ณธ๋ฌธ์ labelยทtimestamp ์ค โ description. Web์ label๊ณผ timestamp๋ฅผ ํ ์ค ์ ๋์ ๋๋ค | `.hjm-timeline__heading` |
|
|
88
|
+
| ๊ณ ์ ยท์คํฌ๋กค | ๋ณธ๋ฌธ ์คํฌ๋กค ์์ญ ์์ ํ ์น์
์ผ๋ก ํญ์ ๊ฝ ์ฑ์ด๋ค. ๋ ๋ถ๋ฌ์ค๊ธฐ๋ Timeline ์๋์ [LoadMore](load-more.md) | โ |
|
|
89
|
+
| ์ข์ ํญยทํฐ ๊ธ์ | Web์ ์ข์ผ๋ฉด timestamp๊ฐ ๋ค์ ์ค๋ก ๋ด๋ ค๊ฐ๋ค(`flex-wrap`). ํฐ ๊ธ์์์๋ ๊ธ์ ์๋ฅด์ง ์๋๋ค | `.hjm-timeline__heading`ยท`__label` |
|
|
90
|
+
|
|
91
|
+
## ๊ผญ ์งํฌ ๊ฒ
|
|
92
|
+
|
|
93
|
+
- `timestamp`ยท`description`์ ์ ํ์ด ๋ ์งยท์ด๋์ ์ด๋ฏธ ํฌ๋งทํ ๋ฌธ์์ด์ด๋ค. Timeline์ ์๊ฐ ๊ณ์ฐ์ ํ์ง ์๋๋ค.
|
|
94
|
+
- ๋น ๋ฐฐ์ด, ์ค๋ณต `id`, ์๋ค ๊ณต๋ฐฑ์ด ์๋ `id`, ๋น ๋ฌธ์์ด ํ๋, ๋ชฉ๋ก ๋ฐ tone์ ์คํ ์ค ์ค๋ฅ๋ฅผ ๋์ง๋ค.
|
|
95
|
+
- ์ ๊ทผ ์ด๋ฆ์ ์ด์์ ์ธ์ด๋ง๋ค ๋ค๋ฅด๋ฏ๋ก `composeAccessibleName`์ i18n ํค๋ก ๋ง๋ ๋ค.
|
|
96
|
+
- ์ ํ ๊ณ ์ ์(๊ตฌ๋จ ์ ๋ฑ)์ adapter์์ ๋ค tone ์ค ํ๋๋ก ๋จผ์ ๋งคํํ๋ค. dot ์์ ์ง์ ์น ํ์ง ์๋๋ค.
|
|
97
|
+
- ๋ฐฐ์น๋ `layoutStyle`๋ก ํ๋ค. Web `className`/`style`๊ณผ Native์ deprecated `style`๋ก dotยทconnectorยท๊ธ์ ์์ ๋ฎ์ง ์๋๋ค.
|
|
98
|
+
|
|
99
|
+
## ํ๋ซํผ ์ฐจ์ด
|
|
100
|
+
|
|
101
|
+
| ํญ๋ชฉ | Web | Native |
|
|
102
|
+
| --- | --- | --- |
|
|
103
|
+
| ๊ตฌ์กฐ | `<ol>` / `<li>`, dotยทconnector `aria-hidden` | `View` ํ, railยท๋ณธ๋ฌธ์ ์ ๊ทผ์ฑ ํธ๋ฆฌ์์ ์จ๊น |
|
|
104
|
+
| ํญ๋ชฉ ์ ๊ทผ ์ด๋ฆ | `<li aria-label={accessibleName}>` | `accessibleName, timestamp, description`์ ์ด์ด ๋ถ์ธ `accessibilityLabel` |
|
|
105
|
+
| ref | `HTMLOListElement`๋ก ์ ๋ฌ | ์์(ํจ์ ์ปดํฌ๋ํธ) |
|