zdp-design-system 0.43.8
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/CHANGELOG.md +449 -0
- package/LICENSE +21 -0
- package/README.md +568 -0
- package/THIRD_PARTY_NOTICES.md +34 -0
- package/dist/code.ts +2 -0
- package/dist/combobox.ts +9 -0
- package/dist/command.ts +1 -0
- package/dist/components/Accordion.svelte +97 -0
- package/dist/components/Avatar.svelte +90 -0
- package/dist/components/Badge.svelte +61 -0
- package/dist/components/Breadcrumb.svelte +97 -0
- package/dist/components/Button.svelte +163 -0
- package/dist/components/Callout.svelte +81 -0
- package/dist/components/Card.svelte +151 -0
- package/dist/components/CardHeader.svelte +58 -0
- package/dist/components/Checkbox.svelte +135 -0
- package/dist/components/CodeBlock.svelte +247 -0
- package/dist/components/Combobox.svelte +552 -0
- package/dist/components/CommandField.svelte +230 -0
- package/dist/components/ConfirmAction.svelte +307 -0
- package/dist/components/Container.svelte +63 -0
- package/dist/components/Dialog.svelte +303 -0
- package/dist/components/Disclosure.svelte +176 -0
- package/dist/components/Divider.svelte +41 -0
- package/dist/components/EmptyState.svelte +79 -0
- package/dist/components/ErrorText.svelte +18 -0
- package/dist/components/Field.svelte +38 -0
- package/dist/components/Grid.svelte +76 -0
- package/dist/components/HelpText.svelte +17 -0
- package/dist/components/Icon.svelte +45 -0
- package/dist/components/IconButton.svelte +162 -0
- package/dist/components/IdentityChip.svelte +130 -0
- package/dist/components/Inline.svelte +85 -0
- package/dist/components/InlineCode.svelte +27 -0
- package/dist/components/Input.svelte +109 -0
- package/dist/components/Kbd.svelte +63 -0
- package/dist/components/KeyValue.svelte +73 -0
- package/dist/components/Label.svelte +43 -0
- package/dist/components/Link.svelte +70 -0
- package/dist/components/LocaleSwitcher.svelte +209 -0
- package/dist/components/Menu.svelte +491 -0
- package/dist/components/Page.svelte +36 -0
- package/dist/components/PageHeader.svelte +93 -0
- package/dist/components/Pagination.svelte +297 -0
- package/dist/components/Popover.svelte +208 -0
- package/dist/components/Progress.svelte +111 -0
- package/dist/components/Radio.svelte +132 -0
- package/dist/components/Section.svelte +52 -0
- package/dist/components/SegmentedControl.svelte +190 -0
- package/dist/components/Select.svelte +88 -0
- package/dist/components/ShareDock.svelte +304 -0
- package/dist/components/Sheet.svelte +332 -0
- package/dist/components/ShortcutHint.svelte +52 -0
- package/dist/components/Skeleton.svelte +82 -0
- package/dist/components/SkipLink.svelte +40 -0
- package/dist/components/SortHeader.svelte +138 -0
- package/dist/components/Spinner.svelte +82 -0
- package/dist/components/Stack.svelte +62 -0
- package/dist/components/StatusToast.svelte +133 -0
- package/dist/components/Surface.svelte +53 -0
- package/dist/components/Switch.svelte +152 -0
- package/dist/components/Table.svelte +94 -0
- package/dist/components/TableToolbar.svelte +195 -0
- package/dist/components/Tabs.svelte +205 -0
- package/dist/components/TermSheet.svelte +392 -0
- package/dist/components/TermTrigger.svelte +70 -0
- package/dist/components/TextScaleControl.svelte +219 -0
- package/dist/components/Textarea.svelte +106 -0
- package/dist/components/ThemeToggle.svelte +148 -0
- package/dist/components/Toast.svelte +180 -0
- package/dist/components/Toolbar.svelte +83 -0
- package/dist/components/Tooltip.svelte +199 -0
- package/dist/components/VisuallyHidden.svelte +18 -0
- package/dist/disclosure.ts +11 -0
- package/dist/focusable.ts +36 -0
- package/dist/identity.ts +5 -0
- package/dist/index.d.ts +106 -0
- package/dist/index.js +76 -0
- package/dist/index.ts +106 -0
- package/dist/menu.ts +12 -0
- package/dist/modal-layer.ts +108 -0
- package/dist/pagination.ts +10 -0
- package/dist/preferences.js +14 -0
- package/dist/preferences.ts +36 -0
- package/dist/progress.ts +4 -0
- package/dist/schemas/design-tokens.schema.json +119 -0
- package/dist/segmented.ts +8 -0
- package/dist/share.d.ts +48 -0
- package/dist/share.js +115 -0
- package/dist/share.ts +99 -0
- package/dist/sheet.ts +3 -0
- package/dist/shortcuts.js +125 -0
- package/dist/shortcuts.ts +153 -0
- package/dist/styles/brand-fonts.css +10 -0
- package/dist/styles/components.css +4686 -0
- package/dist/styles/expressive-fonts.css +2 -0
- package/dist/styles/index.css +2 -0
- package/dist/styles/locale-fonts.css +4 -0
- package/dist/styles/tokens.css +413 -0
- package/dist/table-tools.ts +10 -0
- package/dist/term.ts +16 -0
- package/dist/theme.ts +2 -0
- package/dist/toast.ts +14 -0
- package/dist/tokens/zdp.tokens.json +241 -0
- package/dist/tokens.js +122 -0
- package/dist/tokens.ts +123 -0
- package/docs/CONSUMER_CONTRACT.md +482 -0
- package/docs/EXTERNAL_UI_ADOPTION.md +141 -0
- package/docs/INTERACTIVE_PRIMITIVE_AUDIT.md +127 -0
- package/package.json +78 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
# Consumer Contract
|
|
2
|
+
|
|
3
|
+
์ด ๋ฌธ์๋ `zdp-design-system`์ ๋ค๋ฅธ ZDP ์ ์ฅ์์์ ์๋นํ ๋์ ๊ธฐ์ค์ด๋ค.
|
|
4
|
+
๋ชฉํ๋ public web, app shell, product lab, game surface๊ฐ ๊ฐ์ ํ ํฐ๊ณผ ๊ฐ์ ์ ๊ทผ์ฑ ๊ธฐ๋ณธ๊ฐ์ ๊ณต์ ํ๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค.
|
|
5
|
+
Default component text is English. ์๋น ์ฑ์ ํ๋ฉด locale์ ๋ง์ถฐ user-facing label, placeholder, aria-label, empty text, toast dismissal text๋ฅผ prop์ผ๋ก overrideํ๋ค.
|
|
6
|
+
|
|
7
|
+
## ๊ณตํต ์์น
|
|
8
|
+
|
|
9
|
+
- ์๋น ์ ์ฅ์๋ ์ ํ ๋ฌธ๊ตฌ, ๋ผ์ฐํ
, SEO, ๋ฐ์ดํฐ ๋ก๋ฉ, ์ธ์ฆ, ๊ฒฐ์ , ๊ถํ ํ๋จ์ ์ง์ ์์ ํ๋ค.
|
|
10
|
+
- ๋์์ธ ์์คํ
์ ์์, ํ์
, ๊ฐ๊ฒฉ, radius, focus, i18n, control metric, shared component API๋ง ์ ๊ณตํ๋ค.
|
|
11
|
+
- ์๋น ์ ์ฅ์๋ `zdp-design-system`์ public export๋ง ์ฌ์ฉํ๊ณ ๋ด๋ถ `src/` deep import๋ฅผ ๋ง๋ค์ง ์๋๋ค.
|
|
12
|
+
- package export๋ `dist/` ์ฐ์ถ๋ฌผ์ ํตํด ์๋นํ๋ค. root runtime entry๋ `dist/index.js`, type entry๋ `dist/index.d.ts`๋ค. ์์ฒ์ `src/lib`, `src/styles`, `tokens/zdp.tokens.json`, `src/lib/share.ts`์ด๊ณ `dist/`๋ release ์ `bun run package:build`๋ก ๋ค์ ๋ง๋ ๋ค.
|
|
13
|
+
- `zdpTokenNames`, `share.js`, `share.d.ts`๋ ์์ผ๋ก ๋ง์ถ์ง ์๊ณ `tokens:generate`, `share-icons:generate` ์ฐ์ถ๋ฌผ๋ก ์ ์งํ๋ค.
|
|
14
|
+
- ์ ๋ฒ์ ์ ์๋น ์ ์ฅ์๊ฐ opt-in์ผ๋ก ์ฑํํ๋ค. broad adoption ์ ์๋ ๋ํ ์๋น์ฒ์์ ์๊ฐ๊ณผ build๋ฅผ ํ์ธํ๋ค.
|
|
15
|
+
- keyboard focus, flat UI, framed control, Pretendard-first font stack์ ์๋น์ฒ์์ ์์๋ก ๋ฎ์ถ์ง ์๋๋ค.
|
|
16
|
+
- ๋ธ๋๋ ์๋๋งํฌ๋ `font.family.brand`์ `brand-fonts.css`๋ฅผ ์ฐ๋, ๋ณธ๋ฌธ๊ณผ ์ ํ UI heading์ Pretendard-first sans/display stack์ ์ ์งํ๋ค.
|
|
17
|
+
- ์๋น ์ ์ฅ์๋ `zdp-design-system`์ ์ฐ๊ธฐ ์ํด Tailwind, UnoCSS, shadcn registry, daisyUI theme, Skeleton preset, Flowbite theme, external `cn()` helper๋ฅผ ์ ํ์๊ฐ ์์ด์ผ ํ๋ค.
|
|
18
|
+
- ์ธ๋ถ headless primitive๊ฐ ๋ด๋ถ ๊ตฌํ์ ์ฐ์ด๋๋ผ๋ public API, CSS class, token, dist export๋ ZDP ๊ณ์ฝ์ผ๋ก๋ง ๋
ธ์ถํ๋ค.
|
|
19
|
+
|
|
20
|
+
## Astro ์๋น ํ๋ฉด
|
|
21
|
+
|
|
22
|
+
Astro ์ ์ ์ฌ์ดํธ๋ ์ ์ญ ์คํ์ผ๋ก ๊ธฐ๋ณธ CSS๋ฅผ ๋จผ์ ๋ถ๋ฌ์จ๋ค.
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import 'zdp-design-system/styles.css';
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
๋ค๊ตญ์ด ํ์ด์ง๊ฐ ๋ผํด, ์ค๊ตญ์ด, ๋ฐ๋ฐ๋๊ฐ๋ฆฌ, ์ผ๋ณธ์ด ์นํฐํธ๋ฅผ ๋ช
์์ ์ผ๋ก ์จ์ผ ํ๋ฉด ์ ํํ locale font entry๋ฅผ ์ถ๊ฐํ๋ค.
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
import 'zdp-design-system/styles.css';
|
|
32
|
+
import 'zdp-design-system/locale-fonts.css';
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`8ailors` ๊ฐ์ ๋ธ๋๋ ์๋๋งํฌ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ฉด์ ์ ํํ brand font entry๋ฅผ ์ถ๊ฐํ๋ค.
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import 'zdp-design-system/styles.css';
|
|
39
|
+
import 'zdp-design-system/brand-fonts.css';
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
์บ ํ์ธํ ์น์
์ ๋ชฉ, ์งง์ ๋ง์ผํ
๋ฌธ๊ตฌ, ์ฅ์์ ์๋ด์ฒ๋ผ ํํ๋ ฅ์ด ํ์ํ ํ๋ฉด์ ์ ํํ expressive font entry๋ฅผ ์ถ๊ฐํ๋ค. ์ด entry๋ ๊ธฐ๋ณธ UI ํฐํธ๋ฅผ ๋ฐ๊พธ์ง ์๋๋ค.
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import 'zdp-design-system/styles.css';
|
|
46
|
+
import 'zdp-design-system/expressive-fonts.css';
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
ํ์ด์ง ๋ฃจํธ ๋๋ ์ฃผ์ section์๋ `.zdp-surface-reset`์ ๋ถ์ฌ font, link, input, focus ๊ธฐ๋ณธ๊ฐ์ ๋ฐ๋๋ค.
|
|
50
|
+
Svelte island ์์ด ์ ์ HTML๋ง ์ฐ๋ ๊ณณ์ ์คํฌ๋ฆฐ๋ฆฌ๋ ์ ์ฉ ๋ณด์กฐ ํ
์คํธ์ `.zdp-visually-hidden` utility๋ฅผ ์ฌ์ฉํ๋ค.
|
|
51
|
+
ํ์ด์ง root๋ `.zdp-page`, ๋ณธ๋ฌธ ํญ์ `.zdp-container`์ `.zdp-container--lg`, ์น์
๊ฐ๊ฒฉ์ `.zdp-section`๊ณผ `.zdp-section--spacing-*`, ์๋จ ์ ๋ชฉ๊ณผ ์ก์
ํ๋ฆ์ `.zdp-page-header` utility๋ก ๋ง์ถ๋ค.
|
|
52
|
+
๋ธ๋๋ ํค๋๋ ๋ก๊ณ ์ ์๋๋งํฌ๋ `.zdp-brand-lockup`, `.zdp-brand-lockup__mark`, `.zdp-brand-wordmark` utility๋ก ๋ง์ถ๋ ์ ํ ๊ธฐ๋ฅ ์ ๋ชฉ, CTA, ํ ๋ฐ์ดํฐ, ๋ณธ๋ฌธ์๋ ๋ธ๋๋ ํฐํธ๋ฅผ ์ฐ์ง ์๋๋ค. `lang="ko"` ๊ฐ์ locale surface ์์์๋ ์ค์ ์๋๋งํฌ ํ
์คํธ์๋ `.zdp-brand-wordmark`๋ฅผ ์ง์ ๋ถ์ฌ์ผ ํ๋ฉฐ `.zdp-surface-reset .zdp-brand-wordmark`๊ฐ locale font override๋ณด๋ค ๋ค์์ ๋ธ๋๋ ์คํ, `font-size: calc(var(--zdp-type-page-title-size) - 0.8rem)`, `font-size: calc(var(--zdp-type-page-title-compact-size) - 0.5rem)`, `font-weight: var(--zdp-font-weight-semibold)`์ ์ ์งํ๋ค.
|
|
53
|
+
๊ฐ๊น์ด ์์์ ์ธ๋ก ํ๋ฆ์ `.zdp-stack`๊ณผ `.zdp-stack--gap-*` utility๋ก ๋ง์ถ๋ค.
|
|
54
|
+
๊ฐ๊น์ด ๋ฒํผ, ๋ฐฐ์ง, ์์ ๋งํฌ ๋ฌถ์์ ๊ฐ๋ก ํ๋ฆ์ `.zdp-inline`๊ณผ `.zdp-inline--gap-*` utility๋ก ๋ง์ถ๋ค.
|
|
55
|
+
๊ฐ๊น์ด ๋ด์ฉ ์ฌ์ด์ ์์ ๊ตฌ๋ถ์ ์ `.zdp-divider`์ `.zdp-divider--horizontal` utility๋ก ๋ง์ถ๋, section spacing์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
56
|
+
๋ฐ๋ณต ์นด๋๋ ์์ฝ ๋ฌถ์์ `.zdp-grid`, ๊ฐ๊น์ด ํ๋ฉด ๋๊ตฌ์ ์ก์
๋ฌถ์์ `.zdp-toolbar` utility๋ก ๋ง์ถ๋ค.
|
|
57
|
+
CommandField๋ ๊ฒ์, ๋น ๋ฅธ ์ด๋, ๋ช
๋ น ํ๋ ํธ ์ง์
์ฒ๋ผ ์งง์ keyboard affordance๊ฐ ํ์ํ ์
๋ ฅ์ `CommandField` ๋๋ `.zdp-command-field-shell`, `.zdp-command-field`, `.zdp-command-field__input`, `.zdp-command-field__shortcut`, `.zdp-kbd`, `.zdp-shortcut-hint` utility๋ก ๋ง์ถ๋ค.
|
|
58
|
+
Combobox๋ ๊ฒ์ ๊ฐ๋ฅํ ๋จ์ผ ์ ํ์ `Combobox` ๋๋ `.zdp-combobox`, `.zdp-combobox__control`, `.zdp-combobox__input`, `.zdp-combobox__listbox`, `.zdp-combobox__option` utility๋ก ๋ง์ถ๋ค. option source, filtering, async loading, command ์คํ, ๊ถํ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
59
|
+
๋ฌธ์, ๋ณด์, ์ํคํ
์ฒ ํ์ด์ง์ ์ฝ๋ ์กฐ๊ฐ์ `InlineCode`, `CodeBlock`, `.zdp-inline-code`, `.zdp-code-block`, `.zdp-code-block__copy` utility๋ก ๋ง์ถ๋ค.
|
|
60
|
+
์ฌ๋, ํ, ์กฐ์ง์ ์งง์ ํ๊ธฐ๋ `.zdp-avatar`, `.zdp-avatar__initials`, `.zdp-identity-chip`, `.zdp-identity-chip__label` utility๋ก ๋ง์ถ๋ ์ค์ ๊ณ์ ์๋ณ, ํ๋กํ ๋ผ์ฐํ
, ์จ๋ผ์ธ ์ํ, ๊ถํ, ์ด๋ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
61
|
+
ํ
๋ง ์ ํ ๋ฒํผ์ `.zdp-theme-toggle`, `.zdp-theme-toggle__icon`, `data-zdp-theme-state` utility๋ก ๋ง์ถ๋ ์ด๊ธฐ ํ
๋ง ๊ฒฐ์ , ์ฌ์ฉ์ ์ ์ฅ์, ์์คํ
์ ํธ๋, SSR/์ด๊ธฐ paint ์ฒ๋ฆฌ๋ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
62
|
+
์ธ์ด ์ ํ์ `.zdp-locale-switcher`, `.zdp-locale-switcher__item`, `data-zdp-locale-value` utility๋ก ๋ง์ถ๋ ์ค์ message catalog, URL routing, fallback locale, storage key, `<html lang>` ๋ฐ์, ์ฌ์ฉ์ ์ ํธ๋ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
63
|
+
๊ธ์ ํฌ๊ธฐ ์ ํ์ `.zdp-text-scale-control`, `.zdp-text-scale-control__item`, `data-zdp-text-scale-value` utility๋ก ๋ง์ถ๋ ์ค์ ๋ฌธ์ ํฌ๊ธฐ ๋ฐ์, ์ ์ฅ์, ์ฌ์ฉ์ ์ ํธ๋ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
64
|
+
์งง์ ๋ณด์กฐ ์ค๋ช
์ `.zdp-tooltip`, `.zdp-tooltip__trigger`, `.zdp-tooltip__content` utility๋ก ๋ฐฐ์นํ๋ ๊ธด ๋์๋ง, popover, validation, tour๋ ์๋น์ฒ๊ฐ ๋ณ๋ ํ๋ฆ์ผ๋ก ์์ ํ๋ค.
|
|
65
|
+
์ ํ ์๋ด์ ๋ฐ๋ณต๋๋ ํผ์นจ ๋ชฉ๋ก์ `.zdp-disclosure`, `.zdp-disclosure__trigger`, `.zdp-disclosure__panel`, `.zdp-accordion`, `.zdp-accordion__item` utility๋ก ๋ง์ถ๋ ์ค์ FAQ ๋ฌธ๊ตฌ, ์ค์ ๊ฐ, ํญ๋ชฉ ๋
ธ์ถ, ๊ถํ, ๋ฐ์ดํฐ fetch ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
66
|
+
๋ณด๊ธฐ ๋ฐฉ์, ๋ฐ๋, ๊ธฐ๊ฐ์ฒ๋ผ ๊ฐ๊น์ด ๋จ์ผ ์ ํ์ `.zdp-segmented-control`, `.zdp-segmented-control__item` utility๋ก ๋ง์ถ๋ ์ค์ ํํฐ ์๋ฏธ, URL state, ์ ๋ ฌ, ๋ฐ์ดํฐ ๋ก๋ฉ, ๊ถํ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
67
|
+
์ค์ , ๋๋ณด๊ธฐ, ํํฐ, ๊ณ์ ๋ฉ๋ด์ฒ๋ผ ๊ฐ๊น์ด ํธ๋ฆฌ๊ฑฐ์์ ์งง๊ฒ ํผ์น๋ ํ๋ฉด์ `.zdp-popover`, `.zdp-popover__trigger`, `.zdp-popover__panel`, `.zdp-menu`, `.zdp-menu__trigger`, `.zdp-menu__panel`, `.zdp-menu__item` utility๋ก ๋ง์ถ๋ ํญ๋ชฉ ๋
ธ์ถ, ๊ถํ, ๋ผ์ฐํ
, ํํฐ ์๋ฏธ, ๊ณ์ ์ํ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
68
|
+
์ค์ , ํํฐ, ๋ณด์กฐ ํ๋ฆ์ฒ๋ผ ํ์ฌ ํ๋ฉด ๊ฐ์ฅ์๋ฆฌ์์ ํ์ธํ๋ modal edge panel์ `.zdp-sheet`, `.zdp-sheet__backdrop`, `.zdp-sheet__header`, `.zdp-sheet__body`, `.zdp-sheet__footer` utility๋ก ๋ง์ถ๋ ์ ์ฅ, ๊ถํ, ๋ฐ์ดํฐ fetch, ๋ผ์ฐํ
ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
69
|
+
์ ์ฅ, ๋๊ธฐํ, ์คํจ ๊ฐ์ ์งง์ ์ํ ์๋ฆผ์ `.zdp-toast`, `.zdp-toast__body`, `.zdp-toast__close`, `.zdp-status-toast`, `.zdp-status-toast--inline|top-start|top-end|bottom-start|bottom-end` utility๋ก ๋ง์ถ๋ ์๋ฆผ ๋ฐ์ ์กฐ๊ฑด, ํ ์์, ์๋ ๋ซํ ํ์ด๋จธ, ์ค๋ณต ์ ๊ฑฐ, ์ฌ์๋ ์ ์ฑ
, ๊ถํ, ์๋ฒ ์ํ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
70
|
+
์์
์งํ, ์๋ต ๋๊ธฐ, ์ฝํ
์ธ ์๋ฆฌ ์์ฝ์ `.zdp-progress`, `.zdp-spinner`, `.zdp-skeleton`, `.zdp-skeleton__line` utility๋ก ๋ง์ถ๋ ๋ก๋ฉ ์กฐ๊ฑด, ์งํ๋ฅ ๊ณ์ฐ, ์๋ฃ/์คํจ ์ ํ, ๋ฐ์ดํฐ fetch, ์ฌ์๋, ๊ถํ, ์๋ฒ ์ํ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
71
|
+
์์ glyph๋ `.zdp-icon`๊ณผ `.zdp-icon--sm|md` utility๋ก ์ค์์ ๋ ฌํ๋ ์๋ฏธ์ ๋ผ๋ฒจ ๋ฌธ๊ตฌ๋ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
72
|
+
์ ๋ ฌ ๊ฐ๋ฅํ ํ ํค๋์ ํ ์ฃผ๋ณ ๋๊ตฌ๋ `.zdp-sort-header`, `.zdp-sort-header__label`, `.zdp-sort-header__mark`, `.zdp-table-toolbar`, `.zdp-table-toolbar__controls`, `.zdp-table-toolbar__actions` utility๋ก ๋ง์ถ๋ `aria-sort`, ์ค์ ์ ๋ ฌ, ์ ํ ํ ์ํ, ๋ฐ๋ ์ ์ฅ, ํํฐ, ๊ถํ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
73
|
+
๋ชฉ๋ก ํ์ด์ง ์ด๋์ `.zdp-pagination`, `.zdp-pagination__list`, `.zdp-pagination__link`, `.zdp-pagination__ellipsis` utility๋ก ๋ง์ถ๋ ์ ์ฒด ๊ฐ์, ํ์ฌ ํ์ด์ง ์ํ, ํ์ด์ง ํฌ๊ธฐ, ์ฟผ๋ฆฌ ๋ผ์ฐํ
, ํํฐ, ์ ๋ ฌ, ๋ฐ์ดํฐ ๋ก๋ฉ ํ๋จ์ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
74
|
+
๊ณต์ ๋ํฌ๋ `.zdp-share-dock`, `.zdp-share-dock--side|rail|bottom|inline`, `.zdp-share-action`, `.zdp-share-icon`, `.zdp-share-action__tooltip` utility๋ก ๋ฐฐ์นํ๋ URL ์์ฑ, clipboard, navigator.share, ํ๋ซํผ๋ณ ๊ณต์ ๋งํฌ๋ ์๋น์ฒ๊ฐ ์์ ํ๋ค.
|
|
75
|
+
Svelte island ์์ด Astro์์ ๊ณต์ ์์ด์ฝ shape๋ง ํ์ํ๋ฉด `zdp-design-system/share`์์ `zdpShareIcons`์ `ZdpShareIconName`์ ๊ฐ์ ธ์จ๋ค.
|
|
76
|
+
ํ๋ซํผ ๋ธ๋๋ ๊ณต์ ์์ด์ฝ์ Simple Icons path ๊ธฐ์ค์ ์ ์งํ๊ณ ์์ outline glyph๋ก ๋์ฒดํ์ง ์๋๋ค.
|
|
77
|
+
Astro ํ์ด์ง๋ Svelte island๊ฐ ํ์ํ ๋ถ๋ถ์์๋ง Svelte ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.
|
|
78
|
+
|
|
79
|
+
## Svelte์ Tauri ์๋น ํ๋ฉด
|
|
80
|
+
|
|
81
|
+
Svelte, SvelteKit, Tauri Svelte WebView๋ package root์์ shared component๋ฅผ ๊ฐ์ ธ์จ๋ค.
|
|
82
|
+
|
|
83
|
+
```svelte
|
|
84
|
+
<script lang="ts">
|
|
85
|
+
import {
|
|
86
|
+
Accordion,
|
|
87
|
+
Avatar,
|
|
88
|
+
Breadcrumb,
|
|
89
|
+
Button,
|
|
90
|
+
CodeBlock,
|
|
91
|
+
Combobox,
|
|
92
|
+
CommandField,
|
|
93
|
+
ConfirmAction,
|
|
94
|
+
Container,
|
|
95
|
+
Divider,
|
|
96
|
+
Dialog,
|
|
97
|
+
Disclosure,
|
|
98
|
+
EmptyState,
|
|
99
|
+
Field,
|
|
100
|
+
Grid,
|
|
101
|
+
HelpText,
|
|
102
|
+
Icon,
|
|
103
|
+
Input,
|
|
104
|
+
IdentityChip,
|
|
105
|
+
Inline,
|
|
106
|
+
InlineCode,
|
|
107
|
+
Kbd,
|
|
108
|
+
KeyValue,
|
|
109
|
+
Label,
|
|
110
|
+
Link,
|
|
111
|
+
LocaleSwitcher,
|
|
112
|
+
Menu,
|
|
113
|
+
Page,
|
|
114
|
+
PageHeader,
|
|
115
|
+
Pagination,
|
|
116
|
+
Popover,
|
|
117
|
+
Progress,
|
|
118
|
+
Section,
|
|
119
|
+
SegmentedControl,
|
|
120
|
+
ShareDock,
|
|
121
|
+
Sheet,
|
|
122
|
+
ShortcutHint,
|
|
123
|
+
Skeleton,
|
|
124
|
+
SkipLink,
|
|
125
|
+
SortHeader,
|
|
126
|
+
Stack,
|
|
127
|
+
StatusToast,
|
|
128
|
+
Spinner,
|
|
129
|
+
Surface,
|
|
130
|
+
Tabs,
|
|
131
|
+
Table,
|
|
132
|
+
TableToolbar,
|
|
133
|
+
TermSheet,
|
|
134
|
+
TermTrigger,
|
|
135
|
+
TextScaleControl,
|
|
136
|
+
ThemeToggle,
|
|
137
|
+
Tooltip,
|
|
138
|
+
Toast,
|
|
139
|
+
Toolbar,
|
|
140
|
+
VisuallyHidden
|
|
141
|
+
} from 'zdp-design-system';
|
|
142
|
+
|
|
143
|
+
let dialogOpen = false;
|
|
144
|
+
</script>
|
|
145
|
+
|
|
146
|
+
<Page labelledBy="consumer-contract-title">
|
|
147
|
+
<SkipLink href="#content">๋ณธ๋ฌธ์ผ๋ก ๊ฑด๋๋ฐ๊ธฐ</SkipLink>
|
|
148
|
+
<Section spacing="lg">
|
|
149
|
+
<Container size="lg" padding="lg">
|
|
150
|
+
<PageHeader labelledBy="consumer-contract-title">
|
|
151
|
+
<span slot="eyebrow">ํ๋ซํผ</span>
|
|
152
|
+
<h1 id="consumer-contract-title">๋์์ธ ์์คํ
</h1>
|
|
153
|
+
<p slot="summary">๊ณต๊ฐ ํ๋ฉด๊ณผ ์์
ํ๋ฉด์ด ๊ฐ์ ๊ธฐ์ค ์์์ ์์ง์
๋๋ค.</p>
|
|
154
|
+
</PageHeader>
|
|
155
|
+
</Container>
|
|
156
|
+
</Section>
|
|
157
|
+
<Container as="section" id="content" size="lg" padding="lg">
|
|
158
|
+
<Stack gap="md">
|
|
159
|
+
<Breadcrumb
|
|
160
|
+
ariaLabel="ํ์ฌ ์์น"
|
|
161
|
+
items={[
|
|
162
|
+
{ label: 'ํ ํ๋ฉด', href: '/' },
|
|
163
|
+
{ label: 'ํ๋ซํผ', href: '/platform' },
|
|
164
|
+
{ label: '๋์์ธ ์์คํ
' }
|
|
165
|
+
]}
|
|
166
|
+
/>
|
|
167
|
+
<Link href="/design">์์ธํ ๋ณด๊ธฐ</Link>
|
|
168
|
+
<IdentityChip
|
|
169
|
+
label="ํ๊ธธ๋"
|
|
170
|
+
description="๊ฒํ ๋ด๋น"
|
|
171
|
+
initials="ํ"
|
|
172
|
+
href="/people/hong"
|
|
173
|
+
/>
|
|
174
|
+
<Avatar label="ํ๋ซํผ ํ" initials="ํ" tone="primary" />
|
|
175
|
+
<ShareDock
|
|
176
|
+
placement="inline"
|
|
177
|
+
ariaLabel="๊ณต์ "
|
|
178
|
+
items={[
|
|
179
|
+
{ id: 'copy', label: '๋งํฌ ๋ณต์ฌ', icon: 'copy' },
|
|
180
|
+
{ id: 'telegram', label: 'ํ
๋ ๊ทธ๋จ', icon: 'telegram', href: '/share' },
|
|
181
|
+
{ id: 'x', label: 'X', icon: 'x', href: '/share' }
|
|
182
|
+
]}
|
|
183
|
+
/>
|
|
184
|
+
<Button
|
|
185
|
+
variant="secondary"
|
|
186
|
+
onclick={() => (dialogOpen = true)}
|
|
187
|
+
ariaControls="project-dialog"
|
|
188
|
+
ariaExpanded={dialogOpen}
|
|
189
|
+
>
|
|
190
|
+
<Icon size="sm">+</Icon>
|
|
191
|
+
<VisuallyHidden>์ ํญ๋ชฉ </VisuallyHidden>์ถ๊ฐ
|
|
192
|
+
</Button>
|
|
193
|
+
<Divider />
|
|
194
|
+
<Disclosure title="๊ฒํ ๊ธฐ์ค" open headingLevel={2}>
|
|
195
|
+
<p>ํ์ํ ๊ธฐ์ค๋ง ํผ์ณ์ ํ์ธํฉ๋๋ค.</p>
|
|
196
|
+
</Disclosure>
|
|
197
|
+
<Accordion
|
|
198
|
+
ariaLabel="์ ํ ์๋ด"
|
|
199
|
+
items={[
|
|
200
|
+
{
|
|
201
|
+
id: 'scope',
|
|
202
|
+
title: '๋ฒ์',
|
|
203
|
+
content: 'ํ๋ฉด ํ๋ฆ๊ณผ ๋ฐ์ดํฐ ํ๋จ์ ์๋น ์ฑ์์ ์ ํฉ๋๋ค.',
|
|
204
|
+
open: true
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 'owner',
|
|
208
|
+
title: '์์ ์',
|
|
209
|
+
content: 'ํ์ํ ํญ๋ชฉ๊ณผ ๊ถํ ํ๋จ์ ์ ํ ์ ์ฅ์๊ฐ ์ฐ๊ฒฐํฉ๋๋ค.'
|
|
210
|
+
}
|
|
211
|
+
]}
|
|
212
|
+
/>
|
|
213
|
+
<SegmentedControl
|
|
214
|
+
ariaLabel="๋ณด๊ธฐ ๋ฐฉ์"
|
|
215
|
+
items={[
|
|
216
|
+
{ id: 'list', label: '๋ชฉ๋ก' },
|
|
217
|
+
{ id: 'cards', label: '์นด๋' },
|
|
218
|
+
{ id: 'summary', label: '์์ฝ' }
|
|
219
|
+
]}
|
|
220
|
+
selectedId="list"
|
|
221
|
+
/>
|
|
222
|
+
<CommandField
|
|
223
|
+
label="๋น ๋ฅธ ์ด๋"
|
|
224
|
+
labelVisible
|
|
225
|
+
placeholder="ํ๋ก์ ํธ, ๋ฌธ์, ์ค์ ๊ฒ์"
|
|
226
|
+
describedBy="command-field-help"
|
|
227
|
+
/>
|
|
228
|
+
<HelpText id="command-field-help">์ด ํ๋ฉด์์ ์ฐพ์ ํญ๋ชฉ์ ์
๋ ฅํ์ธ์.</HelpText>
|
|
229
|
+
<Combobox
|
|
230
|
+
name="owner"
|
|
231
|
+
label="๋ด๋น"
|
|
232
|
+
labelVisible
|
|
233
|
+
placeholder="๋ด๋น ํ ์ฐพ๊ธฐ"
|
|
234
|
+
options={[
|
|
235
|
+
{ id: 'platform', value: 'platform', label: 'ํ๋ซํผ ์ด์' },
|
|
236
|
+
{ id: 'security', value: 'security', label: '๋ณด์ ๊ฒํ ' }
|
|
237
|
+
]}
|
|
238
|
+
/>
|
|
239
|
+
<p>๋ฐฐํฌ ๊ฐ์ <InlineCode text="readonly" /> ์ํ๋ก ๋จ๊น๋๋ค.</p>
|
|
240
|
+
<CodeBlock
|
|
241
|
+
label="๊ฒํ ๊ท์น"
|
|
242
|
+
language="ts"
|
|
243
|
+
code={"const requiredEvidence = ['owner', 'budget', 'audit-log'];\nconst ready = requiredEvidence.every((item) => status[item] === 'ready');"}
|
|
244
|
+
/>
|
|
245
|
+
<Divider />
|
|
246
|
+
<Grid columns="two" gap="md">
|
|
247
|
+
<Surface padding="lg">
|
|
248
|
+
<strong>๊ณต๊ฐ ํ๋ฉด</strong>
|
|
249
|
+
<p>๋ธ๋๋, ๋ฌธ์, ๋ก๋๋งต์ฒ๋ผ ๋ฐ๋ณต ํ์ธํ๋ ํ๋ฉด์ ์ฐจ๋ถํ๊ฒ ๋ฌถ์ต๋๋ค.</p>
|
|
250
|
+
</Surface>
|
|
251
|
+
<Surface padding="lg">
|
|
252
|
+
<strong>์์
ํ๋ฉด</strong>
|
|
253
|
+
<p>์ค์ , ์
๋ ฅ, ๊ฒํ ํ๋ฆ์ ๊ฐ์ ์ฌ๋ฐฑ๊ณผ focus ๊ท์น ์์ ๋์
๋๋ค.</p>
|
|
254
|
+
</Surface>
|
|
255
|
+
</Grid>
|
|
256
|
+
<Toolbar labelledBy="consumer-contract-toolbar-title">
|
|
257
|
+
<strong id="consumer-contract-toolbar-title">๊ฒํ ํ๋ฆ</strong>
|
|
258
|
+
<svelte:fragment slot="actions">
|
|
259
|
+
<Button variant="secondary">์ด์</Button>
|
|
260
|
+
<Button>๊ฒํ ์์ฒญ</Button>
|
|
261
|
+
</svelte:fragment>
|
|
262
|
+
</Toolbar>
|
|
263
|
+
<TableToolbar
|
|
264
|
+
title="์ ๊ฒ ๋ชฉ๋ก"
|
|
265
|
+
summary="๊ถํ๊ณผ ๊ฐ์ฌ ํญ๋ชฉ์ ํ์ธํฉ๋๋ค."
|
|
266
|
+
selectedCount={2}
|
|
267
|
+
density="compact"
|
|
268
|
+
ariaLabel="์ ๊ฒ ๋ชฉ๋ก ๋๊ตฌ"
|
|
269
|
+
>
|
|
270
|
+
<svelte:fragment slot="selection-actions">
|
|
271
|
+
<Button variant="secondary">์ ํ ํด์ </Button>
|
|
272
|
+
</svelte:fragment>
|
|
273
|
+
<svelte:fragment slot="actions">
|
|
274
|
+
<Button>์๋ก ๊ณ ์นจ</Button>
|
|
275
|
+
</svelte:fragment>
|
|
276
|
+
</TableToolbar>
|
|
277
|
+
<Table caption="๋ณด์ ์ ๊ฒ ๋ชฉ๋ก" density="compact">
|
|
278
|
+
<thead>
|
|
279
|
+
<tr>
|
|
280
|
+
<th scope="col" aria-sort="ascending">
|
|
281
|
+
<SortHeader label="ํญ๋ชฉ" direction="ascending" />
|
|
282
|
+
</th>
|
|
283
|
+
<th scope="col">
|
|
284
|
+
<SortHeader label="์ํ" direction="none" />
|
|
285
|
+
</th>
|
|
286
|
+
<th scope="col">๋ค์ ํ์ธ</th>
|
|
287
|
+
</tr>
|
|
288
|
+
</thead>
|
|
289
|
+
<tbody>
|
|
290
|
+
<tr>
|
|
291
|
+
<th scope="row">๊ถํ ๋ถ๋ฆฌ</th>
|
|
292
|
+
<td>ํต๊ณผ</td>
|
|
293
|
+
<td>๋ถ๊ธฐ ๋ฆฌ๋ทฐ</td>
|
|
294
|
+
</tr>
|
|
295
|
+
</tbody>
|
|
296
|
+
</Table>
|
|
297
|
+
<Pagination
|
|
298
|
+
currentPage={2}
|
|
299
|
+
totalPages={8}
|
|
300
|
+
ariaLabel="์ ๊ฒ ๋ชฉ๋ก ํ์ด์ง"
|
|
301
|
+
hrefForPage={(page) => `?page=${page}`}
|
|
302
|
+
/>
|
|
303
|
+
<KeyValue columns="two">
|
|
304
|
+
<dt>์์ ์ ์ฅ์</dt>
|
|
305
|
+
<dd>zdp-money-platform</dd>
|
|
306
|
+
<dt>์น๊ฒฉ ์กฐ๊ฑด</dt>
|
|
307
|
+
<dd>์์ฐ, ์์ ์, ์ด์ ์ฆ๊ฑฐ ํ์ธ</dd>
|
|
308
|
+
</KeyValue>
|
|
309
|
+
<EmptyState labelledBy="contract-empty-title">
|
|
310
|
+
<h2 id="contract-empty-title">์์ง ๊ณต๊ฐํ ๋ณ๊ฒฝ์ด ์์ต๋๋ค.</h2>
|
|
311
|
+
<p>๊ฒํ ๊ฐ ๋๋ ํญ๋ชฉ๋ง ๊ณต๊ฐ ๋ก๋๋งต์ ์ฌ๋ผ๊ฐ๋๋ค.</p>
|
|
312
|
+
</EmptyState>
|
|
313
|
+
<Field required>
|
|
314
|
+
<Label forId="project-name">ํ๋ก์ ํธ</Label>
|
|
315
|
+
<Input id="project-name" name="project-name" describedBy="project-name-help" />
|
|
316
|
+
<HelpText id="project-name-help">๊ณต๊ฐ ํ๊ธฐ์ ์ฌ์ฉ๋ฉ๋๋ค.</HelpText>
|
|
317
|
+
</Field>
|
|
318
|
+
<Field readonly>
|
|
319
|
+
<Label forId="project-id">๊ณ ์ ID</Label>
|
|
320
|
+
<Input id="project-id" name="project-id" value="ZDP-2401" describedBy="project-id-help" readonly />
|
|
321
|
+
<HelpText id="project-id-help">์ด๋ฏธ ๋ฐ๊ธ๋ ๊ฐ์ ๊ทธ๋๋ก ๋ก๋๋ค.</HelpText>
|
|
322
|
+
</Field>
|
|
323
|
+
<Field invalid>
|
|
324
|
+
<Label forId="project-status">์ํ</Label>
|
|
325
|
+
<Input
|
|
326
|
+
id="project-status"
|
|
327
|
+
name="project-status"
|
|
328
|
+
describedBy={['project-status-help', 'project-status-error']}
|
|
329
|
+
errorMessageId="project-status-error"
|
|
330
|
+
invalid
|
|
331
|
+
/>
|
|
332
|
+
<HelpText id="project-status-help">ํ์ฌ ์์
์ํ๋ฅผ ์
๋ ฅํ์ธ์.</HelpText>
|
|
333
|
+
<ErrorText id="project-status-error">๋ค์ ๋จ๊ณ ์ ์ ๊ธฐ์ค์ ํ์ธํ์ธ์.</ErrorText>
|
|
334
|
+
</Field>
|
|
335
|
+
<Inline gap="sm">
|
|
336
|
+
<Button>์ ์ฅ</Button>
|
|
337
|
+
</Inline>
|
|
338
|
+
<Dialog
|
|
339
|
+
open={dialogOpen}
|
|
340
|
+
id="project-dialog"
|
|
341
|
+
labelledBy="project-dialog-title"
|
|
342
|
+
describedBy="project-dialog-desc"
|
|
343
|
+
onClose={() => (dialogOpen = false)}
|
|
344
|
+
>
|
|
345
|
+
<h2 slot="title" id="project-dialog-title">๋ณ๊ฒฝ ๋ด์ฉ์ ์ ์ฅํ ๊น์?</h2>
|
|
346
|
+
<p id="project-dialog-desc">์ ์ฅํ๋ฉด ๊ณต๊ฐ ํ๊ธฐ์ ๋ฐ๋ก ๋ฐ์๋ฉ๋๋ค.</p>
|
|
347
|
+
<svelte:fragment slot="footer">
|
|
348
|
+
<Button variant="secondary" onclick={() => (dialogOpen = false)}>์ทจ์</Button>
|
|
349
|
+
<Button onclick={() => (dialogOpen = false)}>์ ์ฅ</Button>
|
|
350
|
+
</svelte:fragment>
|
|
351
|
+
</Dialog>
|
|
352
|
+
</Stack>
|
|
353
|
+
</Container>
|
|
354
|
+
</Page>
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Tauri shell์ native window, permission, update, file access ๊ฒฐ์ ์ ์ด ํจํค์ง์ ๋๊ธฐ์ง ์๋๋ค.
|
|
358
|
+
์ด ํจํค์ง๋ WebView ์์ UI ํ ํฐ๊ณผ ์ปดํฌ๋ํธ๋ง ๋ด๋นํ๋ค.
|
|
359
|
+
Breadcrumb๋ page-location trail, link, separator, current-page aria ๊ตฌ์กฐ๋ง ์ ๊ณตํ๋ฉฐ ๋ผ์ฐํ
, SEO, ์ธ์ฆ, ๊ฒฐ์ , ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
360
|
+
Button๊ณผ IconButton์ native button ์์ framed control ํ๋ฉด์ด๋ฉฐ `onclick`, `ariaLabel`, `ariaControls`, `ariaExpanded`, `ariaPressed`, `ariaDescribedBy`, `ariaKeyShortcuts` ๊ฐ์ ์ก์
์ฐ๊ฒฐ props๋ฅผ ์ ๋ฌํ๋ค. ์ ์ฅ, ์ญ์ , ๊ถํ, ๊ฒฐ์ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
361
|
+
ConfirmAction์ ์ค์ํ ์ก์
์ ๋ฐ๊ธฐ ๋๋ ๊ธธ๊ฒ ๋๋ฅด๊ธฐ๋ก ํ์ธํ๋ ํ๋ฉด์ด๋ฉฐ `onconfirm` ์ฝ๋ฐฑ๋ง ์ ๋ฌํ๋ค. ๊ฒฐ์ , ์ญ์ , ๊ถํ, ํ๋ถ ํ๋จ๊ณผ ์๋ฒ ์์ฒญ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
362
|
+
Avatar์ IdentityChip์ ์ฌ๋, ํ, ์กฐ์ง์ visual identity, ์ด๋์
, ์ด๋ฆ, ๋ณด์กฐ ํ
์คํธ, ์ ํ์ ๋งํฌ ํ๋ฉด๋ง ์ ๊ณตํ๋ฉฐ ์ค์ ๊ณ์ ์๋ณ, ํ๋กํ ๋ผ์ฐํ
, ์จ๋ผ์ธ ์ํ, ๊ถํ, ์ด๋ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
363
|
+
Icon์ ์ฅ์์ฉ glyph ๋๋ ์งง์ ๋ณด์กฐ ๊ธฐํธ์ ๋ฐ์ค, ํฌ๊ธฐ, ์ค์์ ๋ ฌ๋ง ์ ๊ณตํ๋ฉฐ ์๋ฏธ, ๋ผ๋ฒจ ๋ฌธ๊ตฌ, ์ํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
364
|
+
Link๋ ์ผ๋ฐ ํ
์คํธ ์ด๋, hover ์์ ๋ณํ, keyboard focus highlight๋ง ์ ๊ณตํ๋ฉฐ ๋ผ์ฐํ
, SEO, ์ธ์ฆ, ๊ฒฐ์ , ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ์ค์ ๋จ์ถํค๊ฐ ๊ตฌํ๋ ๋งํฌ๋ง `ariaKeyShortcuts`๋ฅผ ์ ๋ฌํ๋ค.
|
|
365
|
+
SkipLink๋ ๋ฐ๋ณต ํ์์ ๊ฑด๋๋ฐ๋ keyboard-first link ๊ตฌ์กฐ์ focus-visible ํ์๋ง ์ ๊ณตํ๋ฉฐ target id, ํ์ด์ง ๋ ์ด์์, ๋ผ์ฐํ
ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
366
|
+
VisuallyHidden์ screen-reader-only ๋ณด์กฐ ํ
์คํธ ์จ๊น๋ง ์ ๊ณตํ๋ฉฐ ๋ผ๋ฒจ ๋ฌธ๊ตฌ, ๋ฒ์ญ, ๊ถํ, ๋ฐ์ดํฐ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
367
|
+
ShareDock์ ๊ณต์ ๋ํฌ์ ์์น, ์์ด์ฝ, tooltip, focus-visible ํ๋ฉด๋ง ์ ๊ณตํ๋ฉฐ URL ์์ฑ, clipboard, navigator.share, ํ๋ซํผ๋ณ ๊ณต์ ๋งํฌ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ๋ฌธ์ ๋ณธ๋ฌธ ์์ ๋ถ๋ sticky ๊ณต์ ๋ ์ผ์ `rail` placement๋ฅผ ์ฌ์ฉํ๋ค.
|
|
368
|
+
`zdpShareIcons`๋ ๊ณต์ ์์ด์ฝ shape ๋ฐ์ดํฐ๋ง ์ ๊ณตํ๋ฉฐ ํ๋ซํผ๋ณ ๊ณต์ URL, target, rel, ํด๋ฆญ ๊ฐ๋ฅ ์ฌ๋ถ๋ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. Telegram, LINE, WhatsApp, X, Reddit ๊ฐ์ ํ๋ซํผ ๋ธ๋๋ glyph๋ Simple Icons path ๊ธฐ์ค์ ์ ์งํ๋ค.
|
|
369
|
+
ThemeToggle์ light/dark ์ ํ ๋ฒํผ์ pressed ์ํ, glyph, ์ ๊ทผ์ฑ ์ด๋ฆ, focus-visible ํ๋ฉด๋ง ์ ๊ณตํ๋ฉฐ ์ด๊ธฐ ํ
๋ง ๊ฒฐ์ , storage key, system preference, SSR/์ด๊ธฐ paint ์ฒ๋ฆฌ๋ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
370
|
+
|
|
371
|
+
LocaleSwitcher๋ locale ์ ํ์ ์ํ radiogroup, ์ ํ ์ํ, focus-visible, keyboard ์ด๋ ํ๋ฉด๋ง ์ ๊ณตํ๋ค. ์ค์ message catalog ๋ก๋ฉ, URL routing, fallback locale, root `lang`, storage key, ์ฌ์ฉ์ preference ์ ์ฅ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
372
|
+
|
|
373
|
+
TextScaleControl์ ๊ธ์ ํฌ๊ธฐ ์ ํ์ ์ํ radiogroup, ์ ํ ์ํ, focus-visible, keyboard ์ด๋ ํ๋ฉด๋ง ์ ๊ณตํ๋ค. ์ค์ document root ๋ฐฐ์จ, media query, storage key, locale๋ณ ๊ธ์ ํฌ๊ธฐ ๋ณด์ , ์ฌ์ฉ์ preference ์ ์ฅ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
374
|
+
Tooltip์ ์งง์ ๋ณด์กฐ ์ค๋ช
ํ๋ฉด๋ง ์ ๊ณตํ๋ฉฐ Escape dismiss๋ฅผ ์ ์งํ๊ณ , ๊ธด ๋์๋ง, validation message, popover, tour, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ์ค๋ช
์ด ์ ๊ทผ์ฑ ์ด๋ฆ์ ๋ณด๊ฐํด์ผ ํ ๋๋ง Tooltip `id`๋ฅผ ๋๊ธฐ๊ณ trigger์ `aria-describedby`๋ฅผ ์ฐ๊ฒฐํ๋ค.
|
|
375
|
+
Accordion๊ณผ Disclosure๋ ์ ํ ์๋ด, ์ค์ ๋ฌถ์, FAQํ ์ค๋ช
์ trigger/panel/`aria-expanded`/`aria-controls` ๊ตฌ์กฐ๋ง ์ ๊ณตํ๋ฉฐ ์ค์ FAQ ๋ฌธ๊ตฌ, ์ค์ ๊ฐ, ํญ๋ชฉ ๋
ธ์ถ, ๊ถํ, ๋ฐ์ดํฐ fetch ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. Accordion์ ๋จ์ผ ๋๋ ๋ณต์ ์ด๋ฆฐ ์ํ๋ฅผ ๊ด๋ฆฌํ์ง๋ง ํญ๋ชฉ visibility, ํํฐ ์๋ฏธ, ์๋ฒ ์ํ ํ๋จ์ผ๋ก ํ์ฅํ์ง ์๋๋ค.
|
|
376
|
+
SegmentedControl์ ๋ณด๊ธฐ ๋ฐฉ์, ๋ฐ๋, ๊ธฐ๊ฐ์ฒ๋ผ ๊ฐ๊น์ด ๋จ์ผ ์ ํ์ `radiogroup`/`radio`/`aria-checked` ๊ตฌ์กฐ๋ง ์ ๊ณตํ๋ฉฐ ์ค์ ํํฐ ์๋ฏธ, URL state, ์ ๋ ฌ, ๋ฐ์ดํฐ ๋ก๋ฉ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
377
|
+
Popover์ Menu๋ ์ค์ , ๋๋ณด๊ธฐ, ํํฐ, ๊ณ์ ๋ฉ๋ด์ฒ๋ผ ๊ฐ๊น์ด ํธ๋ฆฌ๊ฑฐ์์ ์งง๊ฒ ํผ์น๋ ํ๋ฉด๋ง ์ ๊ณตํ๋ฉฐ ํญ๋ชฉ ๋
ธ์ถ, ๊ถํ, ๋ผ์ฐํ
, ํํฐ ์๋ฏธ, ๊ณ์ ์ํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. Popover์ Menu๋ Escape ๋ซ๊ธฐ, outside click, focus ๋ณต๊ท, menu keyboard movement ๊ฐ์ ๊ธฐ๋ณธ ์ํธ์์ฉ๋ง ์ ์งํ๊ณ tour, validation, modal decision, floating collision engine ์ญํ ๋ก ํ์ฅํ์ง ์๋๋ค.
|
|
378
|
+
Sheet๋ right, left, bottom edge panel๋ก ์ค์ , ํํฐ, ๋ณด์กฐ ํ๋ฆ์ ์ฌ๋ modal surface๋ง ์ ๊ณตํ๋ค. Escape ๋ซ๊ธฐ, backdrop ๋ซ๊ธฐ, Tab ์ํ, scroll lock, ์ด์ focus ๋ณต๊ท, `role="dialog"`, `aria-modal` ๊ตฌ์กฐ๋ Sheet ํ๋ฉด์ ๊ธฐ๋ณธ ๋์์ผ๋ก ์ ์งํ๋ค. Drawer๋ ๋ณ๋ ์ปดํฌ๋ํธ๋ก ๋ณต์ ํ์ง ์๊ณ Sheet placement/use case๋ก ๋จผ์ ๋ค๋ฃฌ๋ค. ์ ์ฅ, ๊ถํ, ๋ฐ์ดํฐ fetch, ๋ผ์ฐํ
ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
379
|
+
Sheet root๋ `data-zdp-sheet-placement`, `data-zdp-sheet-size`, `data-zdp-sheet-surface="sheet"`๋ฅผ ๋จ๊ฒจ QA์ ์๋น ์ฑ์ด surface identity๋ฅผ ํ์ธํ ์ ์๊ฒ ํ๋ค.
|
|
380
|
+
Toast์ StatusToast๋ ์ ์ฅ, ๋๊ธฐํ, ์คํจ, ๊ฒฝ๊ณ ์ฒ๋ผ ์งง์ ์ํ ์๋ฆผ ํ๋ฉด๊ณผ dismiss/action/live-region ์ฐ๊ฒฐ๋ง ์ ๊ณตํ๋ฉฐ ์๋ฆผ ๋ฐ์ ์กฐ๊ฑด, ํ ์์, ์๋ ๋ซํ ํ์ด๋จธ, ์ค๋ณต ์ ๊ฑฐ, ์ฌ์๋ ์ ์ฑ
, ๊ถํ, ์๋ฒ ์ํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. Toast์ StatusToast๋ ํ์ด์ง ์ ํผ๋๋ฐฑ์ด๋ modal decision์ ๋์ฒดํ์ง ์๊ณ , ์ค๋ ์ฝ์ด์ผ ํ๋ ์๋ด๋ Callout ๋๋ ์๋น ์ฑ์ ๋ณ๋ ํ๋ฆ์ผ๋ก ๋จ๊ธด๋ค.
|
|
381
|
+
Progress, Spinner, Skeleton์ ์์
์งํ, ์๋ต ๋๊ธฐ, ์ฝํ
์ธ ์๋ฆฌ ์์ฝ ํ๋ฉด๋ง ์ ๊ณตํ๋ฉฐ ๋ก๋ฉ ์กฐ๊ฑด, ์งํ๋ฅ ๊ณ์ฐ, ์๋ฃ/์คํจ ์ ํ, ๋ฐ์ดํฐ fetch, ์ฌ์๋, ๊ถํ, ์๋ฒ ์ํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. Skeleton์ ์ต์ข
๋ ์ด์์ ํฌ๊ธฐ๋ฅผ ์์ฝํ๋ ์ฉ๋๋ก ์ฐ๊ณ , ์ค์ ํ
์คํธ ์๋ฏธ๋ ๋น ์ํ ํ๋จ์ EmptyState ๋๋ ์๋น ์ฑ์ ์ํ ํ๋ฆ์ ๋จ๊ธด๋ค.
|
|
382
|
+
Page๋ shared page root, surface reset, theme tone๋ง ์ ๊ณตํ๋ฉฐ ๋ผ์ฐํ
, SEO, ๋ฐ์ดํฐ, ๊ถํ, ์ ํ๋ณ visibility ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
383
|
+
Container๋ ํ์ด์ง ํญ, inline padding, centered width๋ง ์ ๊ณตํ๋ฉฐ ๊ทธ๋ฆฌ๋ ์๋ฏธ, ๋ผ์ฐํ
, ๋ฐ์ดํฐ, ๊ถํ, ์ ํ๋ณ visibility ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
384
|
+
Section์ block rhythm๊ณผ optional full-width band๋ง ์ ๊ณตํ๋ฉฐ ์นด๋, ๋ผ์ฐํ
, ๋ฐ์ดํฐ, ๊ถํ, ์ ํ๋ณ visibility ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
385
|
+
PageHeader๋ ์ ๋ชฉ, ์์ฝ, ์ก์
๋ฐฐ์น๋ง ์ ๊ณตํ๋ฉฐ ๋ฌธ๊ตฌ, SEO heading hierarchy, ๋ผ์ฐํ
, ๋ฐ์ดํฐ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ์ผ๋ฐ ๋ฌธ์์ ์ฑ ํ์ด์ง ์ ๋ชฉ์ `type.pageTitleSize`์ `type.pageTitleCompactSize` ๋ฒ์์์ ์์ํ๊ณ , ๋ธ๋๋ ํ์ด๋ก๋ ์บ ํ์ธ ํ๋ฉด๋ง ์๋น ์ฑ์ ๋ณ๋ ๋ํ ์ ๋ชฉ ์์ธ๋ฅผ ๋ ์ ์๋ค.
|
|
386
|
+
Stack์ ๊ฐ๊น์ด ์์์ ์ธ๋ก ํ๋ฆ, gap, align๋ง ์ ๊ณตํ๋ฉฐ ํ์ด์ง ๊ทธ๋ฆฌ๋, ๋ผ์ฐํ
, ๋ฐ์ดํฐ, ๊ถํ, ์ ํ๋ณ visibility ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
387
|
+
Inline์ ๊ฐ๊น์ด ๋ฒํผ, ๋ฐฐ์ง, ์์ ๋งํฌ ๋ฌถ์์ ๊ฐ๋ก ํ๋ฆ, gap, align, justify๋ง ์ ๊ณตํ๋ฉฐ ํ์ด์ง ๊ทธ๋ฆฌ๋, ๋ผ์ฐํ
, ๋ฐ์ดํฐ, ๊ถํ, ์ ํ๋ณ visibility ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
388
|
+
Divider๋ ๊ฐ๊น์ด ๋ด์ฉ ์ฌ์ด์ ๊ตฌ๋ถ์ , line tone, semantic separator ์ญํ ๋ง ์ ๊ณตํ๋ฉฐ section layout, page rhythm, ๋ผ์ฐํ
, ๋ฐ์ดํฐ, ๊ถํ, ์ ํ๋ณ visibility ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
389
|
+
Grid๋ ๋ฐ๋ณต๋๋ ์นด๋, ์์ฝ, ์ ํ์ง ๋ฌถ์์ responsive columns์ gap๋ง ์ ๊ณตํ๋ฉฐ ๊ฐ ํญ๋ชฉ์ ์๋ฏธ, ๋ฐ์ดํฐ ๋ก๋ฉ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
390
|
+
Toolbar๋ ๊ฐ๊น์ด ํ๋ฉด ๋๊ตฌ์ ์ก์
๋ฌถ์์ wrapping, main/action ๋ฐฐ์น๋ง ์ ๊ณตํ๋ฉฐ ์ ์ฅ, ์ญ์ , ํํฐ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
391
|
+
CommandField๋ ๊ฒ์ ์
๋ ฅ์ label, frame, focus-within, shortcut keycap, help/error id, `ariaKeyShortcuts`, `ariaAutocomplete`, result id ์ฐ๊ฒฐ, ์
๋ ฅ keydown callback๋ง ์ ๊ณตํ๋ฉฐ ๊ฒ์ ์ธ๋ฑ์ค, ๊ฒฐ๊ณผ ์ ๋ ฌ, command palette, ๋ผ์ฐํ
, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ๊ฒฐ๊ณผ ๋ชฉ๋ก, keyboard dispatcher, command ์คํ ์ํ๋ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
392
|
+
Combobox๋ ๊ฒ์ ๊ฐ๋ฅํ ๋จ์ผ ์ ํ์ label, input frame, listbox, active option, disabled option skip, hidden submitted value๋ง ์ ๊ณตํ๋ค. ์ค์ ํํฐ๋ง, async search, command ์คํ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ๋จ์ ์ํ ์ ํ์ native `Select`๋ฅผ ์ ์งํ๊ณ , ์ฌ์ฉ์๊ฐ ์
๋ ฅ์ผ๋ก ํ๋ณด๋ฅผ ์ขํ๋ ๋จ์ผ ์ ํ์ผ ๋๋ง Combobox๋ฅผ ์ด๋ค.
|
|
393
|
+
InlineCode์ CodeBlock์ ๋ฌธ์, ๋ณด์, ์ํคํ
์ฒ ํ์ด์ง์ ์ฝ๋ ํ์, language label, horizontal overflow, ์ ํ์ ๋ณต์ฌ ๋ฒํผ๋ง ์ ๊ณตํ๋ฉฐ syntax highlighting, ์ฝ๋ ์คํ, ๋น๋ฐ๊ฐ ํ์ง, ๋ณด์ ๋ถ๋ฅ, command palette๋ ์๋น ์ฑ์ด๋ ๋ฌธ์ ํ์ดํ๋ผ์ธ์ด ๊ณ์ ์์ ํ๋ค. CodeBlock์ `code` prop์ด ์์ ๋๋ง ๋ณต์ฌ ๋ฒํผ์ ๋
ธ์ถํ๋ฏ๋ก slot์ผ๋ก ํ์ํ ์ฝ๋์ ๋ณต์ฌ ๋ฌธ์์ด์ ์๋น ์ฑ์ด ๋ช
์์ ์ผ๋ก ๋๊ธด๋ค. ๊ธด ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก horizontal overflow ํ๋ฉด์์ ์คํฌ๋กค๋๊ณ , code body๋ ์ ํ ๊ฐ๋ฅํด์ผ ํ๋ค.
|
|
394
|
+
|
|
395
|
+
Kbd์ ShortcutHint๋ `/`, `?`, `Enter`, `Esc`, `ArrowUp`, `ArrowDown`, `Ctrl/โ+Enter` ๊ฐ์ ํค์บก ํํธ๋ง ์ ๊ณตํ๋ค. ์ค์ keydown dispatcher, command palette, ๊ฒ์ focus ์ด๋, ๋จ์ถํค ์๋ด, ์ ํ, ๋ซ๊ธฐ, ํ์ผ ์ด๋์ ์๋น ์ฑ์ด ์์ ํ๋ค. `ariaKeyShortcuts`์ `aria-keyshortcuts`๋ ์ค์ ๋จ์ถํค๊ฐ ๋์ํ๋ Button, IconButton, Link, CommandField์๋ง ๋ถ์ธ๋ค. ์๋น ์ฑ์ ์ ์ญ ๋จ์ถํค dispatcher๋ `shouldZdpIgnoreShortcutEvent`, `isZdpTextEntryTarget`, `isZdpBrowserReservedShortcut`, `zdpShortcutRecommendations`, `zdpShortcutReservedExamples` ๊ฐ์ shortcut policy helper๋ก ์
๋ ฅ์ฐฝ, IME ์กฐํฉ, ๋ธ๋ผ์ฐ์ ์์ฝ ์กฐํฉ์ ๋จผ์ ๊ฑธ๋ฌ๋ธ๋ค. `input, textarea, select, contenteditable`, `role="textbox"`, `role="searchbox"` ์์์๋ ์ ์ญ ๋จ์ถํค๋ฅผ ๊บผ๋๊ณ , `event.isComposing` ๋๋ `keyCode === 229`์ธ ํ๊ตญ์ด ์กฐํฉ ์
๋ ฅ๋ ๋ฌด์ํ๋ค. `Ctrl+K`, `Ctrl+S`์ฒ๋ผ Chrome๊ณผ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ ๋์์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ์กฐํฉ์ ์๋น ์ฑ์์ ์ค์ ๋ก ๊ฐ๋ก์ฑ๊ณ ๊ฒ์ฆํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์์๋ UI ํํธ๋ก ๋ณด์ฌ์ฃผ์ง ์๋๋ค.
|
|
396
|
+
Table์ ํ ํ์ ์ ๋ณด์ native table, caption, row/column header, horizontal overflow wrapper๋ง ์ ๊ณตํ๋ฉฐ ์ ๋ ฌ, ํํฐ, ๋ฐ์ดํฐ ๋ก๋ฉ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ์ข์ ํญ์์๋ header์ cell ๋ฐ์ดํฐ๊ฐ ํ ๊ธ์์ฉ ์ชผ๊ฐ์ง์ง ์๊ณ table wrapper๊ฐ overflow๋ฅผ ์์ ํด์ผ ํ๋ค. Table wrapper๋ header ์ค๋ฅธ์ชฝ์ ๋น gutter stripe๋ฅผ ๋ง๋ค ์ ์๋ ์์ `scrollbar-gutter: stable`์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฐ์ง ์๋๋ค.
|
|
397
|
+
SortHeader์ TableToolbar๋ sortable column affordance, ์ ํ ํ ์ก์
์๋ฆฌ, ๋ฐ๋ ์ ํ ํ๋ฉด๋ง ์ ๊ณตํ๋ฉฐ `aria-sort`, ์ค์ ์ ๋ ฌ ๊ณ์ฐ, ์ ํ ์ํ, ํํฐ, ๊ถํ, ๋ฐ์ดํฐ ๋ก๋ฉ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. `aria-sort`๋ SortHeader ๋ฒํผ์ด ์๋๋ผ owning `th` ๋๋ columnheader์ ๋๋ค.
|
|
398
|
+
Pagination์ ๋ชฉ๋ก ํ์ด์ง ์ด๋์ `nav`, ordered list, link/button, ellipsis, `aria-current="page"` ๊ตฌ์กฐ๋ง ์ ๊ณตํ๋ฉฐ ์ ์ฒด ๊ฐ์, ํ์ฌ ํ์ด์ง ์ํ, ํ์ด์ง ํฌ๊ธฐ, ์ฟผ๋ฆฌ ๋ผ์ฐํ
, ํํฐ, ์ ๋ ฌ, ๋ฐ์ดํฐ ๋ก๋ฉ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ์์ ์ปจํ
์ด๋์์๋ pagination nav๊ฐ horizontal overflow๋ฅผ ์์ ํ๊ณ ํ์ด์ง ๋ฒํผ์ด ์ฌ๋ฌ ์ค๋ก ๋ฌด๋์ง์ง ์์์ผ ํ๋ฉฐ, ์คํฌ๋กค ํ๋ฉด ์์์๋ focus outline์ ์์๋ edge๊ฐ ์๋ฆฌ์ง ์์์ผ ํ๋ค.
|
|
399
|
+
KeyValue๋ ์ฉ์ด์ ๊ฐ์ description list ๊ตฌ์กฐ์ responsive columns๋ง ์ ๊ณตํ๋ฉฐ ์ค์ ์์ฅ, ๋ณด์, ๊ฒฐ์ , ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
400
|
+
EmptyState๋ ๋น์ด ์๋ ์ํ์ surface, ์ ๋ชฉ ์ฐ๊ฒฐ, ์ก์
๋ฐฐ์น๋ง ์ ๊ณตํ๋ฉฐ ๋น์ด ์๋ ์กฐ๊ฑด, ๋ค์ ์ก์
๊ฐ๋ฅ ์ฌ๋ถ, ๋ฐ์ดํฐ ์ฌ์๋ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
401
|
+
TermTrigger์ TermSheet๋ ์ฉ์ด ์ค๋ช
์ ํด๋ฆญ์ผ๋ก ์ฌ๋ trigger, right sheet, bottom sheet ํ๋ฉด๋ง ์ ๊ณตํ๋ค. `.zdp-term-trigger`๋ ๋ณธ๋ฌธ ์ ์ฉ์ด๋ฅผ button์ผ๋ก ์ด๊ณ , sheet๊ฐ ์ด๋ฆฐ ๋์์๋ง `aria-controls`๋ฅผ ์ฐ๊ฒฐํ๋ฉฐ, `.zdp-term-sheet`๋ ์ ํ๋ ์ฉ์ด์ ์งง์ ์ค๋ช
, ๊ธด ์ค๋ช
, ์์, ๊ด๋ จ ์ฉ์ด, detail link ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋ค. `.zdp-term-trigger`๋ inline interactive text๋ผ์ hover์์ ๊ธ์์์ ๋ฐ๊พธ์ง ์๊ณ ๋ฐฐ๊ฒฝ๋ง ๊ฐ์กฐํ๋ฉฐ, ์ข์ฐ ์ต์ padding๊ณผ focus token์ ์ ์งํ๊ณ , ๋ณธ๋ฌธ ํ
์คํธ ์ ํ์ ๋ง์ง ์๋๋ค. Escape ๋ซ๊ธฐ, backdrop ๋ซ๊ธฐ, Tab ์ํ, scroll lock, ์ด์ focus ๋ณต๊ท๋ sheet ํ๋ฉด์ ๊ธฐ๋ณธ ๋์์ผ๋ก ์ ์งํ๋ค. glossary manifest, locale fallback, ๊ณต๊ฐ ๊ฐ๋ฅ ์ฌ๋ถ, detail page ๋ผ์ฐํ
ํ๋จ์ ์๋น ์ฑ๊ณผ glossary pipeline์ด ๊ณ์ ์์ ํ๋ค.
|
|
402
|
+
TermSheet root๋ stable `term_id`๋ฅผ `data-term-id`์ `data-zdp-term-id`๋ก ๋จ๊ธฐ๊ณ , `data-zdp-term-placement`์ `data-zdp-term-surface="sheet"`๋ก QA์ linter๊ฐ ์ ํ๋ ์ฉ์ด surface๋ฅผ ํ์ธํ ์ ์๊ฒ ํ๋ค.
|
|
403
|
+
TermSheet์๋ ๊ด๊ณ slot์ ๋ฃ์ง ์๋๋ค. TermSheet root๋ `data-zdp-ad-exclude="true"`๋ฅผ ์ ์งํ๊ณ , ๊ด๊ณ ๊ฐ ํ์ํ ๊ธด ์ค๋ช
์ ์๋น ์ฑ์ ๋ณ๋ detail page์์ ๋ค๋ฃฌ๋ค.
|
|
404
|
+
Input, Textarea, Select๋ `describedBy`์ ํ๋ ์ด์์ id๋ฅผ ์ฐ๊ฒฐํ ์ ์๊ณ invalid ์ํ์์๋ `errorMessageId`๋ก `aria-errormessage`๋ฅผ ์ฐ๊ฒฐํ๋ค. ์๋ฌ ๋ฉ์์ง ๋ฌธ๊ตฌ, ๊ฒ์ฆ ์กฐ๊ฑด, ์ ์ถ ์ฐจ๋จ ์ฌ๋ถ๋ ์๋น ์ฑ์ด ๊ฒฐ์ ํ๋ค.
|
|
405
|
+
Switch๋ `describedBy` id ๋ฐฐ์ด๊ณผ `errorMessageId`๋ฅผ ํตํด invalid ์ํ์ ๋ณด์กฐ ์ค๋ช
๊ณผ ์๋ฌ ๋ฉ์์ง๋ฅผ native switch input์ ์ฐ๊ฒฐํ๋ค.
|
|
406
|
+
Input๊ณผ Textarea์ `readonly` ์ํ๋ ์ ์ถ๊ณผ ํฌ์ปค์ค๋ฅผ ์ ์งํ๋ ์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ ์ฌ์ฉํ๋ค. ๊ถํ ๋๋ฌธ์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ์ ๋๋์ง, ๋จ์ํ ๊ณ ์ ์๋ณ์๋ฅผ ๋ณด์ฌ์ฃผ๋์ง๋ ์๋น ์ฑ์ด ๊ฒฐ์ ํ๋ค.
|
|
407
|
+
Tabs๋ ๊ฐ๊น์ด ์ ๋ณด ๋ฌถ์ ์ ํ์ ํํํ๋ ๋ผ์ฐํ
, ๊ถํ, ๋ฐ์ดํฐ ๋ก๋ฉ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค. ๊ฐ์ ํ์ด์ง์ ์ฌ๋ฌ Tabs๊ฐ ์์ผ๋ฉด `idPrefix`๋ฅผ ๋๊ฒจ tab/panel id๊ฐ ์ถฉ๋ํ์ง ์๊ฒ ํ๋ค.
|
|
408
|
+
Dialog๋ modal layer, backdrop, close, scroll lock, focus trap, aria ๊ตฌ์กฐ๋ง ์ ๊ณตํ๋ฉฐ ์ ์ฅ, ์ญ์ , ์ธ์ฆ, ๊ฒฐ์ , ๊ถํ ํ๋จ์ ์๋น ์ฑ์ด ๊ณ์ ์์ ํ๋ค.
|
|
409
|
+
|
|
410
|
+
## Flutter์ Native ์๋น ํ๋ฉด
|
|
411
|
+
|
|
412
|
+
Flutter์ native shell์ Svelte ์ปดํฌ๋ํธ๋ฅผ ์ง์ ์๋นํ์ง ์๋๋ค.
|
|
413
|
+
๋์ `tokens/zdp.tokens.json`์ theme adapter ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ค.
|
|
414
|
+
|
|
415
|
+
- `hex`๋ ๊ธฐ๋ณธ theme fallback์ด๋ค.
|
|
416
|
+
- `oklch`๋ ์น ๋๋ ๋ณํ ๊ฐ๋ฅํ ๋ ๋๋ฌ์์ ์ ์๋๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
|
|
417
|
+
- `font.family.korean`, `font.family.latin`, `font.family.chinese`, `font.family.devanagari`, `font.family.japanese`, `font.family.multiscript`๋ locale๋ณ fallback ์์์ source of truth๋ค.
|
|
418
|
+
- `font.family.brand`๋ ๋ธ๋๋ ์๋๋งํฌ ์ ์ฉ source of truth๋ค. ์ผ๋ฐ heading์ `font.family.display`์ ์์ง ์๋๋ค.
|
|
419
|
+
- `font.family.expressionScript`, `font.family.expressionInscription`, `font.family.expressionSketch`, `font.family.expressionEditorial`, `font.family.expressionSans`, `font.family.expressionKeyboard`๋ opt-in ํํ์ฉ source of truth๋ค. `expressive-fonts.css`๋ฅผ importํ ํ๋ฉด์์๋ง ์บ ํ์ธ, ์น์
์ ๋ชฉ, ์งง์ ๋ณด์กฐ ์๋ด, ํค๋ณด๋ ํ์์ ์ ํํด์ ์ด๋ค.
|
|
420
|
+
- `control.heightMd`, `control.glyphMd`, `control.choiceSize`, `control.choiceIndicatorSize`, `control.switchWidth`, `control.switchHeight`, `control.scrollbarSize`, `control.radius`, `control.borderWidth`, `control.hitTarget`์ native control size, icon glyph size, choice mark, switch track, scrollbar ๋๊ป๋ฅผ ๋ง์ถ ๋์ ๊ธฐ์ค์ด๋ค.
|
|
421
|
+
- `color.scrollbar.track`, `color.scrollbar.thumb`, `color.scrollbar.thumbHover`๋ overflow ์์ญ์ light/dark scrollbar ์ ๊ธฐ์ค์ด๋ค.
|
|
422
|
+
- `color.selection.surface`, `color.selection.text`๋ `.zdp-surface-reset` ์์ drag text selection ์ ๊ธฐ์ค์ด๋ค.
|
|
423
|
+
- `focus.surface`, `focus.text`, `focus.line`์ keyboard focus ๋๋ TV/desktop focus affordance์ ๊ธฐ์ค์์ด๋ค.
|
|
424
|
+
- `.zdp-user-select-control`, `.zdp-user-select-decorative`, `.zdp-user-select-dragging`์ token์ด ์๋๋ผ interaction utility๋ค. ์กฐ์ ๋ถํ, ์ฅ์ ํ๋ฉด, ์ค์ ๋๋๊ทธ ์ค ์ํ์๋ง ์ฐ๊ณ ์ฝ๋ ์ ๋ณด์ ๊ธฐ๋ณธ ์ ํ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ง ์๋๋ค.
|
|
425
|
+
|
|
426
|
+
## ์๋น์ฒ ์ ์ฉ ์ฒดํฌ๋ฆฌ์คํธ
|
|
427
|
+
|
|
428
|
+
- `styles.css`๋ฅผ ๋จผ์ importํ๋ค.
|
|
429
|
+
- ๋ค๊ตญ์ด ์นํฐํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ง `locale-fonts.css`๋ฅผ ์ถ๊ฐํ๋ค.
|
|
430
|
+
- ๋ธ๋๋ ์๋๋งํฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ง `brand-fonts.css`๋ฅผ ์ถ๊ฐํ๋ค.
|
|
431
|
+
- ํํ์ฉ ์น์
์ด๋ ์บ ํ์ธ ๋ฌธ๊ตฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ง `expressive-fonts.css`๋ฅผ ์ถ๊ฐํ๋ค.
|
|
432
|
+
- Svelte component๋ package root์์๋ง importํ๋ค.
|
|
433
|
+
- Link๋ฅผ ์ฐ๋ ํ๋ฉด์ hover๊ฐ ์์ ๋ณํ ์ค์ฌ์ด๊ณ focus๊ฐ sunlit gold highlight๋ก ๋ณด์ด๋์ง ํ์ธํ๋ค.
|
|
434
|
+
- SkipLink๋ฅผ ์ฐ๋ ํ๋ฉด์ ์ฒซ Tab ๋์์์ ๋ณด์ด๊ณ ๋ณธ๋ฌธ target id๋ก ์ด๋ํ๋์ง ํ์ธํ๋ค.
|
|
435
|
+
- VisuallyHidden์ ์ฐ๋ ํ๋ฉด์ ํ๋ฉด์๋ ๋ณด์ด์ง ์์ง๋ง ์ ๊ทผ์ฑ ์ด๋ฆ์ด๋ ์ค๋ช
์ ํฌํจ๋๋์ง ํ์ธํ๋ค.
|
|
436
|
+
- Page, Container, Section, PageHeader๋ฅผ ์ฐ๋ ํ๋ฉด์ page root, width, section rhythm, header actions๋ง ๋ฐ๋๊ณ ๋ผ์ฐํ
, SEO, ๋ฐ์ดํฐ, ๊ถํ ํ๋จ์ด ์๊ธฐ์ง ์๋์ง ํ์ธํ๋ค.
|
|
437
|
+
- Stack์ ์ฐ๋ ํ๋ฉด์ spacing๋ง ๋ฐ๋๊ณ ์์, ๊ทธ๋ฆผ์, hover, ์ ํ๋ณ layout ํ๋จ์ด ์๊ธฐ์ง ์๋์ง ํ์ธํ๋ค.
|
|
438
|
+
- Inline์ ์ฐ๋ ํ๋ฉด์ horizontal wrapping๋ง ๋ฐ๋๊ณ ์์, ๊ทธ๋ฆผ์, hover, ์ ํ๋ณ layout ํ๋จ์ด ์๊ธฐ์ง ์๋์ง ํ์ธํ๋ค.
|
|
439
|
+
- Divider๋ฅผ ์ฐ๋ ํ๋ฉด์ ๊ตฌ๋ถ์ ๋ง ๋ฐ๋๊ณ section spacing, ๊ทธ๋ฆผ์, ๋ฐฐ๊ฒฝ ์ฅ์, ์ ํ๋ณ layout ํ๋จ์ด ์๊ธฐ์ง ์๋์ง ํ์ธํ๋ค.
|
|
440
|
+
- Grid๋ฅผ ์ฐ๋ ํ๋ฉด์ ๋ฐ๋ณต๋๋ ์นด๋๋ ์์ฝ ๋ฌถ์์ columns์ gap๋ง ๋ฐ๋๊ณ ํญ๋ชฉ ์๋ฏธ, ๋ฐ์ดํฐ ๋ก๋ฉ, ๊ถํ ํ๋จ์ด ์๊ธฐ์ง ์๋์ง ํ์ธํ๋ค.
|
|
441
|
+
- Toolbar๋ฅผ ์ฐ๋ ํ๋ฉด์ ๊ฐ๊น์ด ๋๊ตฌ์ ์ก์
wrapping๋ง ๋ฐ๋๊ณ ์ ์ฅ, ์ญ์ , ํํฐ, ๊ถํ ํ๋จ์ด ์๊ธฐ์ง ์๋์ง ํ์ธํ๋ค.
|
|
442
|
+
- CommandField๋ฅผ ์ฐ๋ ํ๋ฉด์ label, help/error id, Tab focus, `/` ๊ฐ์ shortcut ํ์๊ฐ ๋ง๊ณ , ์ค์ ๊ฒ์/๋ผ์ฐํ
/command ์คํ ํ๋จ์ ์๋น ์ฑ์ ๋จ๋์ง ํ์ธํ๋ค.
|
|
443
|
+
- Combobox๋ฅผ ์ฐ๋ ํ๋ฉด์ combobox/listbox/option aria ๊ตฌ์กฐ, ArrowUp/ArrowDown/Enter/Escape ๋์, disabled option skip, hidden submitted value๊ฐ ๋ง๊ณ , ์ค์ ํํฐ๋ง, async search, command ์คํ, ๊ถํ ํ๋จ์ ์๋น ์ฑ์ ๋จ๋์ง ํ์ธํ๋ค.
|
|
444
|
+
- Kbd์ ShortcutHint๋ฅผ ์ฐ๋ ํ๋ฉด์ ๋ณด์ด๋ ๋จ์ถํค๊ฐ ์ค์ ๋ก ๋์ํ๋์ง ํ์ธํ๋ค. ๋์ํ์ง ์๋ ํํธ๋ ์ ๊ฑฐํ๊ณ , ์ค์ ๋จ์ถํค๊ฐ ์๋ control์๋ง `ariaKeyShortcuts`๋ฅผ ๋ถ์ธ๋ค.
|
|
445
|
+
- Avatar์ IdentityChip์ ์ฐ๋ ํ๋ฉด์ ์ด๋ฆ, ์ด๋์
, ๋ณด์กฐ ํ
์คํธ, ํ์ฌ ๋งํฌ ์ํ๋ง ํ๋ฉด์ ๋จ๊ณ , ์ค์ ๊ณ์ ์๋ณ, ์จ๋ผ์ธ ์ํ, ๊ถํ, ์ด๋ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จ์ ์๋น ์ฑ ์ํ์ ๋ง๋์ง ํ์ธํ๋ค.
|
|
446
|
+
- Accordion๊ณผ Disclosure๋ฅผ ์ฐ๋ ํ๋ฉด์ trigger์ `aria-expanded`์ `aria-controls`๊ฐ ๋จ๊ณ , ์ค์ ํญ๋ชฉ ๋
ธ์ถ, ๊ถํ, ๋ฐ์ดํฐ fetch ํ๋จ์ ์๋น ์ฑ ์ํ์ ๋ง๋์ง ํ์ธํ๋ค.
|
|
447
|
+
- SegmentedControl์ ์ฐ๋ ํ๋ฉด์ `radiogroup`, `radio`, `aria-checked`๊ฐ ๋จ๊ณ , ์ค์ ํํฐ ์๋ฏธ, URL state, ์ ๋ ฌ, ๋ฐ์ดํฐ ๋ก๋ฉ, ๊ถํ ํ๋จ์ ์๋น ์ฑ ์ํ์ ๋ง๋์ง ํ์ธํ๋ค.
|
|
448
|
+
- Table์ ์ฐ๋ ํ๋ฉด์ caption ๋๋ labelledBy๊ฐ ์๊ณ , `th scope="col"`๊ณผ `th scope="row"`๊ฐ ํ์ํ ๊ณณ์ ๋จ๋์ง ํ์ธํ๋ค.
|
|
449
|
+
- SortHeader์ TableToolbar๋ฅผ ์ฐ๋ ํ๋ฉด์ ์ ๋ ฌ ์ค์ธ ์ด์ owning `th`์ `aria-sort`๊ฐ ๋จ๊ณ , ์ ํ ํ ์ก์
๊ณผ ๋ฐ๋ ์ ํ์ด ์๋น ์ฑ ์ํ์ ๋ง๋์ง ํ์ธํ๋ค.
|
|
450
|
+
- TermTrigger์ TermSheet๋ฅผ ์ฐ๋ ํ๋ฉด์ ํด๋ฆญ์ผ๋ก ์ด๋ฆฌ๊ณ , Escape ๋ซ๊ธฐ, Tab ์ํ, ์ด์ focus ๋ณต๊ท๊ฐ ์ ์ง๋๋์ง ํ์ธํ๋ค.
|
|
451
|
+
- Dialog, Sheet, TermSheet๋ฅผ ์ฐ๋ ํ๋ฉด์ ์ด๋ฆฐ ๋์ body scroll์ด ์ ๊ธฐ๊ณ ๋ซํ ๋ค ์ด์ scroll ์ํ๊ฐ ๋ณต๊ตฌ๋๋์ง ํ์ธํ๋ค.
|
|
452
|
+
- Sheet๋ฅผ ์ฐ๋ ํ๋ฉด์ `data-zdp-sheet-placement`, `data-zdp-sheet-size`, `data-zdp-sheet-surface="sheet"`๊ฐ ๋จ๊ณ Drawer ๋ณํ์ ๋ณ๋ ์ปดํฌ๋ํธ๋ก ๋ณต์ ํ์ง ์์๋์ง ํ์ธํ๋ค.
|
|
453
|
+
- TermSheet root์๋ `data-term-id`, `data-zdp-term-id`, `data-zdp-term-placement`, `data-zdp-term-surface="sheet"`๊ฐ ๋จ๋์ง ํ์ธํ๋ค.
|
|
454
|
+
- TermSheet์๋ ๊ด๊ณ slot์ด ์๊ณ root์ `data-zdp-ad-exclude="true"`๊ฐ ๋จ๋์ง ํ์ธํ๋ค.
|
|
455
|
+
- Pagination์ ์ฐ๋ ํ๋ฉด์ ํ์ฌ ํ์ด์ง ํญ๋ชฉ์ `aria-current="page"`๊ฐ ๋จ๊ณ , URL ๋๋ ๋ฒํผ ์ฝ๋ฐฑ์ด ์๋น ์ฑ์ ์ค์ page state์ ๋ง๋์ง ํ์ธํ๋ค.
|
|
456
|
+
- KeyValue๋ฅผ ์ฐ๋ ํ๋ฉด์ ์ฉ์ด์ ๊ฐ์ด `dt`์ `dd`๋ก ๋จ๊ณ , ๊ฐ์ ์์ฑ/๊ถํ/๊ฒฐ์ ํ๋จ์ด ์ปดํฌ๋ํธ๋ก ๋ค์ด์ค์ง ์๋์ง ํ์ธํ๋ค.
|
|
457
|
+
- EmptyState๋ฅผ ์ฐ๋ ํ๋ฉด์ ์ ๋ชฉ id๊ฐ ์ฐ๊ฒฐ๋๊ณ ๋ค์ ์ก์
๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์๋น ์ฑ์ด ๊ฒฐ์ ํ๋์ง ํ์ธํ๋ค.
|
|
458
|
+
- Input, Textarea, Select์ invalid ์ํ๋ help id์ error id๋ฅผ ๋ชจ๋ `aria-describedby`๋ก ์ฐ๊ฒฐํ๊ณ , error id๋ฅผ `aria-errormessage`๋ก๋ ์ฐ๊ฒฐํ๋์ง ํ์ธํ๋ค.
|
|
459
|
+
- Input๊ณผ Textarea์ readonly ์ํ๋ disabled์ฒ๋ผ ํ๋ ค์ ธ ์ ์ถ/๋ณต์ฌ/ํฌ์ปค์ค ํ๋ฆ์ ๋์ง ์๋์ง ํ์ธํ๋ค.
|
|
460
|
+
- Breadcrumb๋ฅผ ์ฐ๋ ํ๋ฉด์ ํ์ฌ ํ์ด์ง ํญ๋ชฉ์ `aria-current="page"`๊ฐ ๋จ๋์ง ํ์ธํ๋ค.
|
|
461
|
+
- Flutter/native adapter๋ `tokens/zdp.tokens.json`์ token name์ ์ ์งํ๋ค.
|
|
462
|
+
- ์๋น์ฒ ์์ฒด CSS์์ `box-shadow`, gradient, hover transform์ผ๋ก shared component ๊ธฐ๋ณธ๊ฐ์ ๋ฎ์ด์ฐ์ง ์๋๋ค.
|
|
463
|
+
- Overflow๊ฐ ์๊ธฐ๋ ํ, ํจ๋, ํ์ด์ง๋ `.zdp-surface-reset` ๋ฒ์ ์์์ theme scrollbar๊ฐ ๋ณด์ด๋์ง ํ์ธํ๋ค.
|
|
464
|
+
- ๋๋๊ทธ๋ก ํ
์คํธ๋ฅผ ์ ํํ์ ๋ `.zdp-surface-reset` ๋ฒ์ ์์์ theme selection surface/text๊ฐ ๋ณด์ด๊ณ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ํ๋์์ด ๋จ์ง ์๋์ง ํ์ธํ๋ค.
|
|
465
|
+
- Button, IconButton, MenuItem, SegmentedControl item, Pagination link, SortHeader, copy button, icon, separator, spinner, skeleton์ฒ๋ผ ๋๋ฅด๊ฑฐ๋ ์ฅ์์ธ ํ๋ฉด๋ง ์ ํ๋์ง ์๋์ง ํ์ธํ๋ค.
|
|
466
|
+
- Table cell, code body, toast message, document body, card data, identity label, ์ฃผ์, ์ด๋ฉ์ผ, ID, ๋ ์ง, ๊ฐ๊ฒฉ, ์๋ฌ ๋ฉ์์ง๋ ๊ณ์ ์ ํํ๊ณ ๋ณต์ฌํ ์ ์๋์ง ํ์ธํ๋ค.
|
|
467
|
+
- Drag interaction์ drag start๋ถํฐ end/cancel/pointer release๊น์ง๋ง `.zdp-user-select-dragging`์ ๋ถ์ด๊ณ , ์ฑ root๋ page/card/list/table container์ ์์ `user-select: none`์ด ๋จ์ง ์๋์ง ํ์ธํ๋ค.
|
|
468
|
+
- light/dark, keyboard focus, disabled, invalid ์ํ๋ฅผ ์๋น์ฒ ํ๋ฉด์์ ํ์ธํ๋ค.
|
|
469
|
+
- Theme / Locale Stress story์์ light/dark, ZDP Mobile ํญ, ๊ธด ํ๊ตญ์ด/์์ด/์ค๊ตญ์ด/ํ๋์ด ๋ฌธ์ฅ, focus-visible ์ํ๊ฐ ํจ๊ป ๋ฌด๋์ง์ง ์๋์ง ํ์ธํ๋ค.
|
|
470
|
+
- Dialog๋ฅผ ์ฐ๋ ํ๋ฉด์ Tab ์ํ, Escape ๋ซ๊ธฐ, backdrop ๋ซ๊ธฐ, ์ด์ focus ๋ณต๊ท๋ฅผ ํ์ธํ๋ค.
|
|
471
|
+
- ์ ๋์์ธ ์์คํ
๋ฒ์ ์ ๋ํ ์๋น์ฒ ํ ๊ณณ์์ build์ ์๊ฐ QA๋ฅผ ํต๊ณผํ ๋ค ํ์ฐํ๋ค.
|
|
472
|
+
|
|
473
|
+
## ๊ธ์ง ๊ฒฝ๊ณ
|
|
474
|
+
|
|
475
|
+
- ๋์์ธ ์์คํ
์ ์ ํ๋ณ ํ๋ฉด, ๋๋ฉ ๋ฌธ๊ตฌ, admin ์ ์ฑ
, ๊ฒฐ์ ํ๋จ, ๊ถํ ํ๋จ, ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ ๋ก์ง์ ๋ฃ์ง ์๋๋ค.
|
|
476
|
+
- ์๋น ์ ์ฅ์๊ฐ `zdp-design-system/src/...` ๊ฐ์ ๋ด๋ถ ๊ฒฝ๋ก๋ฅผ ์ง์ importํ์ง ์๋๋ค.
|
|
477
|
+
- ๋ฐฐํฌ package๋ `bun run package:build`๋ก ๋ง๋ `dist/` export๋ฅผ ์ฐ๋ฉฐ, ์๋น์ fixture๊ฐ public import๋ง์ผ๋ก build๋๋์ง ํ์ธํ๋ค.
|
|
478
|
+
- token name์ ์ ํ๋ณ ๋ณ์นญ์ผ๋ก ๋ณต์ฌํด forkํ์ง ์๋๋ค.
|
|
479
|
+
- focus ์์ ๋ธ๋๋ ์ฅ์์, hover ์, semantic danger/success ์์ผ๋ก ์ฌ์ฌ์ฉํ์ง ์๋๋ค.
|
|
480
|
+
- ์ฑ root, page root, card, table cell, code body, document body, toast body์ `user-select: none`์ ์ ์ฉํ์ง ์๋๋ค.
|
|
481
|
+
- ๋ณด์์ ์ด์ ๋ก ์ ํ๋ง ๋ง์ง ์๋๋ค. ํ๋ฉด์ ๋
ธ์ถํ๋ฉด ๋ณต์ฌ ๊ฐ๋ฅํ๋ค๊ณ ๋ณด๊ณ , ๋
ธ์ถํ๋ฉด ์ ๋๋ ๊ฐ์ ๋ ๋๋งํ์ง ์๋๋ค.
|
|
482
|
+
- `selectstart` ์ฐจ๋จ, ์ฐํด๋ฆญ ์ฐจ๋จ, ๋ฌธ์ ์ ์ฒด selection ์ฐจ๋จ์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ํ๋์ ์ฃฝ์ด์ง ์๋๋ค.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# External UI Adoption
|
|
2
|
+
|
|
3
|
+
์ด ๋ฌธ์๋ ์ธ๋ถ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ ๋ฅผ `zdp-design-system`์ ์ฐธ๊ณ ํ๊ฑฐ๋ ํก์ํ ๋์ ๊ธฐ์ค์ด๋ค.
|
|
4
|
+
๋ชฉํ๋ ๋ ๋ง์ ๊ธฐ๋ฅ์ ๋ง๋ค๋, ZDP public API, CSS token, Storybook, consumer fixture, a11y gate๋ฅผ ์ธ๋ถ ์ฒ ํ์ ๋๊ธฐ์ง ์๋ ๊ฒ์ด๋ค.
|
|
5
|
+
|
|
6
|
+
## ์์น
|
|
7
|
+
|
|
8
|
+
- ์ธ๋ถ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ZDP์ dependency source๊ฐ ์๋๋ผ ๊ฒ์ฆ source๋ค.
|
|
9
|
+
- ๊ณ ๋๋ headless primitive๋ public API์ styling contract๊ฐ ZDP ์์ ๊ฐํ ์๋ค๋ ์กฐ๊ฑด์์ ๋ด๋ถ ๊ตฌํ ์์กด์ฑ์ผ๋ก ํ์ฉํ ์ ์๋ค.
|
|
10
|
+
- Tailwind, UnoCSS, registry, `cn()` helper, class merge helper, ์ธ๋ถ theme preset์ ZDP core public contract๋ก ์์ง ์๋๋ค.
|
|
11
|
+
- ZDP public component props, DOM exposure policy, CSS class, token mapping, Storybook coverage, consumer fixture๋ ZDP๊ฐ ์์ ํ๋ค.
|
|
12
|
+
- Button, Badge, Card, typography, layout helper์ฒ๋ผ ์๊ฐ ๊ท์น์ด ๋๋ถ๋ถ์ธ ์ปดํฌ๋ํธ๋ ์ธ๋ถ headless ์์กด์ฑ์ ๋ถ์ด์ง ์๋๋ค.
|
|
13
|
+
- ์ธ๋ถ ์ฝ๋๋ฅผ ๋ณต์ฌํ๊ฑฐ๋ ํฌํ
ํ๋ฉด ์ ์ถ์ฒ, ๋ผ์ด์ ์ค, ๋ณ๊ฒฝ ๋ฒ์, notice ์ ์ง ์ฌ๋ถ๋ฅผ component-level provenance๋ก ๋จ๊ธด๋ค.
|
|
14
|
+
|
|
15
|
+
## ํก์ ๋ฑ๊ธ
|
|
16
|
+
|
|
17
|
+
### Reference Only
|
|
18
|
+
|
|
19
|
+
์์ ํ๋ฉด, interaction idea, docs ์ค๋ช
์ ๋ณด๊ณ ์ ํ ๋ฐฉํฅ๋ง ๋น๊ตํ ์ํ๋ค.
|
|
20
|
+
์ฝ๋, DOM ๊ตฌ์กฐ, naming, state machine์ ์ฎ๊ธฐ์ง ์๋๋ค.
|
|
21
|
+
THIRD_PARTY_NOTICES์๋ ๋ณดํต ๋จ๊ธฐ์ง ์์๋ ๋์ง๋ง PR ์ค๋ช
์๋ ์ฐธ๊ณ ํ ๋งํฌ๋ฅผ ๋จ๊ธด๋ค.
|
|
22
|
+
|
|
23
|
+
### Behavior Spec
|
|
24
|
+
|
|
25
|
+
ํค๋ณด๋ ์ด๋, focus return, Escape ๋ซ๊ธฐ, aria state ๊ฐ์ ๋์ ๋ช
์ธ๋ฅผ ๋น๊ตํ ์ํ๋ค.
|
|
26
|
+
์ฝ๋๋ ๋ณต์ฌํ์ง ์๊ณ ZDP-native Svelte/CSS๋ก ๋ค์ ๊ตฌํํ๋ค.
|
|
27
|
+
๋ฌธ์์๋ `behavior reviewed against <source>, no source copied` ํํ๋ก ๋จ๊ธด๋ค.
|
|
28
|
+
|
|
29
|
+
### Ported Structure
|
|
30
|
+
|
|
31
|
+
์ํ ํ๋ฆ, DOM ๋ฐฐ์น, ์ด๋ฒคํธ ์์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ Svelte/ZDP ๋ฐฉ์์ผ๋ก ์ฎ๊ธด ์ํ๋ค.
|
|
32
|
+
์ ์ฝ๋๊ฐ ์ง์ ๋ณต์ฌ๋์ง ์์์ด๋ ํ์์ง๋์ด๋ฏ๋ก provenance๋ฅผ ๋จ๊ธด๋ค.
|
|
33
|
+
Storybook interaction, a11y gate, consumer fixture๊ฐ ๊ฐ์ด ์์ด์ผ ํ๋ค.
|
|
34
|
+
|
|
35
|
+
### Source Adapted
|
|
36
|
+
|
|
37
|
+
์ธ๋ถ ์ฝ๋ ์ผ๋ถ๋ฅผ ์ง์ ๋ณต์ฌํ๊ฑฐ๋ ์๋ฏธ ์๊ฒ ๋ณํํ ์ํ๋ค.
|
|
38
|
+
MIT ๊ฐ์ ํ์ฉ ๋ผ์ด์ ์ค๋ผ๋ ์ ์ ์๊ถ ๊ณ ์ง์ license notice๋ฅผ ๋ณด์กดํ๋ค.
|
|
39
|
+
`THIRD_PARTY_NOTICES.md`์ component provenance์ source URL, license, adapted file, local owner๋ฅผ ๋จ๊ธด๋ค.
|
|
40
|
+
|
|
41
|
+
### Runtime Dependency
|
|
42
|
+
|
|
43
|
+
์ธ๋ถ ํจํค์ง๋ฅผ dependency๋ก ์ค์นํด ๋ด๋ถ ๊ตฌํ์ ์ฐ๋ ์ํ๋ค.
|
|
44
|
+
Bits UI ๊ฐ์ headless primitive์ ํํด ํ๋ณด๊ฐ ๋ ์ ์๊ณ , public export์ ์ธ๋ถ ํ์
, prop ์ด๋ฆ, class, theme token์ด ์๋ฉด ์คํจ๋ค.
|
|
45
|
+
consumer fixture๊ฐ ์ธ๋ถ ํจํค์ง ์ค์ ์์ด `zdp-design-system` public export๋ง์ผ๋ก ๋น๋๋์ด์ผ ํ๋ค.
|
|
46
|
+
|
|
47
|
+
### Prohibited
|
|
48
|
+
|
|
49
|
+
ํ์ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, template, starter kit, redistributable UI kit์ ์ ํ์ด ์๋ ์์ฉ UI ์์ค๋ ๊ธ์งํ๋ค.
|
|
50
|
+
Tailwind Plus/Tailwind UI ๊ณ์ด์ ZDP public package ์ฌ๋ฃ๋ก ์ฐ์ง ์๋๋ค.
|
|
51
|
+
|
|
52
|
+
## ํ๋ณด๋ณ ๊ธฐ์ค
|
|
53
|
+
|
|
54
|
+
### Bits UI / shadcn-svelte
|
|
55
|
+
|
|
56
|
+
Select, Combobox, Dialog, Popover, Menu, Command, Drawer, Sheet์ฒ๋ผ focus, keyboard, aria, nested overlay๊ฐ ๊น๋ค๋ก์ด primitive์ ๋์ ๋ช
์ธ์ ํ
์คํธ ํ๋ณด๋ก ๊ฒํ ํ๋ค.
|
|
57
|
+
๋ด๋ถ ๊ตฌํ ์์กด์ฑ์ ํ์ฉํ ์ ์์ง๋ง, public API์ CSS token, class naming, DOM exposure policy๋ ZDP๊ฐ ์์ ํ๋ค.
|
|
58
|
+
`bits-ui` ํ์
, prop ์ด๋ฆ, store shape, Tailwind class, shadcn registry ํ์ผ ๊ตฌ์กฐ๊ฐ ZDP public export๋ก ์๋ฉด ์คํจ๋ค.
|
|
59
|
+
|
|
60
|
+
### Skeleton / Flowbite Svelte / daisyUI
|
|
61
|
+
|
|
62
|
+
ํจํด ์นดํ๋ก๊ทธ๋ก๋ง ๋ณธ๋ค.
|
|
63
|
+
core primitive์ ์ง์ ์ ์
ํ์ง ์๊ณ , ํ์ํ ์์ด๋์ด๋ ZDP-native Svelte/CSS์ token mapping์ผ๋ก ๋ค์ ์์ฑํ๋ค.
|
|
64
|
+
์๋น ์ฑ์ด Tailwind ์ค์ ์ด๋ daisyUI theme์ ์์์ผ ํ๋ ๊ตฌ์กฐ๋ ํ์ฉํ์ง ์๋๋ค.
|
|
65
|
+
|
|
66
|
+
### Ark UI
|
|
67
|
+
|
|
68
|
+
React, Solid, Vue, Svelte๋ฅผ ๊ฐ์ด ๋ณด๋ ์ฅ๊ธฐ ๋ฉํฐ ํ๋ ์์ํฌ ํ๋ณด๋ก ๋๋ค.
|
|
69
|
+
ํ์ฌ Svelte-first ํ๋ฉด์์๋ ๊ธฐ๋ณธ ํ๋ณด๊ฐ ์๋๋ฉฐ, cross-framework package boundary๊ฐ ์ค์ ์๊ตฌ๊ฐ ๋ ๋ ๋ค์ ํ๊ฐํ๋ค.
|
|
70
|
+
|
|
71
|
+
### Motion / SmoothUI
|
|
72
|
+
|
|
73
|
+
core component๊ฐ ์๋๋ผ marketing recipe์ campaign surface ํ๋ณด๋ก ๊ฒฉ๋ฆฌํ๋ค.
|
|
74
|
+
Motion engine๊ณผ SmoothUI-derived recipe๋ ์๋ก ๋ค๋ฅธ ์ถ์ฒ๋ก ๊ธฐ๋กํ๋ค.
|
|
75
|
+
SmoothUI ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๊ฑฐ๋ ํฌํ
ํ๋ฉด SmoothUI source์ license๋ฅผ ๋ฐ๋ก provenance์ notice์ ๋จ๊ธด๋ค.
|
|
76
|
+
๋ชจ๋ animation recipe๋ `prefers-reduced-motion` ๋์ฒด ํ๋ฆ์ ๊ฐ๋๋ค.
|
|
77
|
+
|
|
78
|
+
### Tailwind Plus / Tailwind UI
|
|
79
|
+
|
|
80
|
+
ZDP package, template, shared component, starter, registry, generated UI surface์ ์ฌ๋ฃ๋ก ์ฐ์ง ์๋๋ค.
|
|
81
|
+
์ ํ end screen์์ ๋ณ๋ ๋ผ์ด์ ์ค ์๋ ์ฐ๋ ๊ฒฐ์ ์ ํด๋น ์๋น ์ฑ์ด ์์ ํ์ง๋ง, ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ด `zdp-design-system`์ผ๋ก ์ญ์ ์
๋๋ฉด ์ ๋๋ค.
|
|
82
|
+
|
|
83
|
+
## ๊ณ ๋๋ Primitive ๊ฒ์ดํธ
|
|
84
|
+
|
|
85
|
+
์ธ๋ถ headless ๊ตฌํ์ ์ฐธ๊ณ ํ๊ฑฐ๋ ์์กด์ฑ ํ๋ณด๋ก ์ฌ๋ฆฌ๋ primitive๋ ๋ค์ ํญ๋ชฉ์ ๊ฒํ ํด์ผ ํ๋ค.
|
|
86
|
+
|
|
87
|
+
- focus trap ๋๋ focus return
|
|
88
|
+
- Escape close
|
|
89
|
+
- outside click ๋๋ outside pointerdown
|
|
90
|
+
- Tab ์ํ๊ณผ Shift+Tab ์ญ์ํ
|
|
91
|
+
- SSR/hydration ์์ ์ฑ
|
|
92
|
+
- nested overlay ๋์
|
|
93
|
+
- scroll lock๊ณผ ๊ธฐ์กด body overflow ๋ณต์
|
|
94
|
+
- portal target ๋๋ layer root
|
|
95
|
+
- reduced motion ๋์ฒด
|
|
96
|
+
- keyboard interaction ํ์ค
|
|
97
|
+
- screen reader label, description, state
|
|
98
|
+
- form integration
|
|
99
|
+
- controlled/uncontrolled state
|
|
100
|
+
- disabled, readonly, invalid ์ํ
|
|
101
|
+
- Storybook interaction๊ณผ addon-a11y gate
|
|
102
|
+
- consumer fixture build
|
|
103
|
+
|
|
104
|
+
## Provenance Template
|
|
105
|
+
|
|
106
|
+
์ component๋ ํฐ interaction ๋ณ๊ฒฝ์ด ์ธ๋ถ source๋ฅผ ์ฐธ๊ณ ํ๋ฉด PR์ด๋ ๋ฌธ์์ ๋ค์ ํญ๋ชฉ์ ๋จ๊ธด๋ค.
|
|
107
|
+
|
|
108
|
+
```md
|
|
109
|
+
Component:
|
|
110
|
+
Source:
|
|
111
|
+
License:
|
|
112
|
+
Adoption grade:
|
|
113
|
+
What was adapted:
|
|
114
|
+
What was not copied:
|
|
115
|
+
ZDP-owned API:
|
|
116
|
+
ZDP token mapping:
|
|
117
|
+
A11y contract:
|
|
118
|
+
Fixture / story coverage:
|
|
119
|
+
Notice update:
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
์์๋ ๋ค์์ฒ๋ผ ๋จ๊ธด๋ค.
|
|
123
|
+
|
|
124
|
+
```md
|
|
125
|
+
Component: Select
|
|
126
|
+
Source: Bits UI Select docs
|
|
127
|
+
License: MIT
|
|
128
|
+
Adoption grade: Behavior Spec
|
|
129
|
+
What was adapted: keyboard movement and aria state checklist
|
|
130
|
+
What was not copied: source code, prop names, Tailwind classes
|
|
131
|
+
ZDP-owned API: Select.svelte props and zdp-select CSS classes
|
|
132
|
+
ZDP token mapping: control, focus, line, surface tokens
|
|
133
|
+
A11y contract: labelled trigger, aria-expanded, roving option focus
|
|
134
|
+
Fixture / story coverage: Interaction story and consumer fixture
|
|
135
|
+
Notice update: not required because no source copied
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Review Rule
|
|
139
|
+
|
|
140
|
+
์ธ๋ถ UI๋ฅผ ์ฐธ๊ณ ํ ๋ณ๊ฒฝ์ โ์๋ํ๋คโ๋ง์ผ๋ก ํต๊ณผํ์ง ์๋๋ค.
|
|
141
|
+
ZDP public API๊ฐ ์ธ๋ถ ์์กด์ฑ์ ์จ๊ธฐ๊ณ , consumer๊ฐ ๋ด๋ถ ์ฃผ๋ฐฉ์ ๋ชฐ๋ผ๋ import๋ง์ผ๋ก ์ธ ์ ์์ด์ผ ํ๋ค.
|