@hjmds/design-contracts 1.1.1 โ 1.3.4
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/agreement.d.ts +183 -0
- package/dist/agreement.d.ts.map +1 -0
- package/dist/agreement.js +137 -0
- package/dist/agreement.js.map +1 -0
- package/dist/anchor.d.ts +62 -0
- package/dist/anchor.d.ts.map +1 -0
- package/dist/anchor.js +43 -0
- package/dist/anchor.js.map +1 -0
- package/dist/asset.d.ts +94 -0
- package/dist/asset.d.ts.map +1 -0
- package/dist/asset.js +60 -0
- package/dist/asset.js.map +1 -0
- package/dist/auth-screen.d.ts +119 -0
- package/dist/auth-screen.d.ts.map +1 -0
- package/dist/auth-screen.js +87 -0
- package/dist/auth-screen.js.map +1 -0
- package/dist/base-recipes.d.ts +19 -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/behaviors.d.ts +363 -3
- package/dist/behaviors.d.ts.map +1 -1
- package/dist/behaviors.js +37 -1
- package/dist/behaviors.js.map +1 -1
- package/dist/bottom-info.d.ts +58 -0
- package/dist/bottom-info.d.ts.map +1 -0
- package/dist/bottom-info.js +48 -0
- package/dist/bottom-info.js.map +1 -0
- package/dist/carousel.d.ts +3 -3
- package/dist/carousel.js +1 -1
- package/dist/carousel.js.map +1 -1
- package/dist/catalog.d.ts +1315 -245
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +67 -25
- package/dist/catalog.js.map +1 -1
- package/dist/collapsible.d.ts +56 -0
- package/dist/collapsible.d.ts.map +1 -0
- package/dist/collapsible.js +37 -0
- package/dist/collapsible.js.map +1 -0
- package/dist/component-definitions.d.ts +17 -0
- package/dist/component-definitions.d.ts.map +1 -1
- package/dist/component-definitions.js +17 -0
- package/dist/component-definitions.js.map +1 -1
- package/dist/component-recipes.d.ts +20 -3
- package/dist/component-recipes.d.ts.map +1 -1
- package/dist/component-recipes.js +24 -1
- package/dist/component-recipes.js.map +1 -1
- package/dist/context-menu.d.ts +53 -0
- package/dist/context-menu.d.ts.map +1 -0
- package/dist/context-menu.js +44 -0
- package/dist/context-menu.js.map +1 -0
- package/dist/counter-badge-recipe.d.ts +5 -0
- package/dist/counter-badge-recipe.d.ts.map +1 -1
- package/dist/counter-badge-recipe.js +5 -0
- package/dist/counter-badge-recipe.js.map +1 -1
- package/dist/dataviz.d.ts +76 -0
- package/dist/dataviz.d.ts.map +1 -0
- package/dist/dataviz.js +58 -0
- package/dist/dataviz.js.map +1 -0
- package/dist/date-range.d.ts +56 -0
- package/dist/date-range.d.ts.map +1 -0
- package/dist/date-range.js +79 -0
- package/dist/date-range.js.map +1 -0
- package/dist/design-system-provider.d.ts +24 -0
- package/dist/design-system-provider.d.ts.map +1 -1
- package/dist/design-system-provider.js +21 -0
- package/dist/design-system-provider.js.map +1 -1
- package/dist/floating-action-button.d.ts +1 -1
- package/dist/floating-action-button.d.ts.map +1 -1
- package/dist/floating-action-button.js +3 -1
- package/dist/floating-action-button.js.map +1 -1
- package/dist/formatters.d.ts +37 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +69 -0
- package/dist/formatters.js.map +1 -0
- package/dist/heading.d.ts +82 -0
- package/dist/heading.d.ts.map +1 -0
- package/dist/heading.js +48 -0
- package/dist/heading.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/menubar.d.ts +133 -0
- package/dist/menubar.d.ts.map +1 -0
- package/dist/menubar.js +80 -0
- package/dist/menubar.js.map +1 -0
- package/dist/native-platform.d.ts +88 -0
- package/dist/native-platform.d.ts.map +1 -0
- package/dist/native-platform.js +70 -0
- package/dist/native-platform.js.map +1 -0
- package/dist/popover.d.ts +19 -4
- package/dist/popover.d.ts.map +1 -1
- package/dist/popover.js +3 -0
- package/dist/popover.js.map +1 -1
- package/dist/progress-recipe.d.ts +14 -0
- package/dist/progress-recipe.d.ts.map +1 -1
- package/dist/progress-recipe.js +14 -1
- package/dist/progress-recipe.js.map +1 -1
- package/dist/provider-button.d.ts +140 -0
- package/dist/provider-button.d.ts.map +1 -0
- package/dist/provider-button.js +83 -0
- package/dist/provider-button.js.map +1 -0
- package/dist/recipes.d.ts +16 -1
- package/dist/recipes.d.ts.map +1 -1
- package/dist/recipes.js +15 -0
- package/dist/recipes.js.map +1 -1
- package/dist/sheet.d.ts +16 -0
- package/dist/sheet.d.ts.map +1 -1
- package/dist/sheet.js +33 -0
- package/dist/sheet.js.map +1 -1
- package/dist/sidebar.d.ts +168 -0
- package/dist/sidebar.d.ts.map +1 -0
- package/dist/sidebar.js +98 -0
- package/dist/sidebar.js.map +1 -0
- package/dist/skip-nav.d.ts +67 -0
- package/dist/skip-nav.d.ts.map +1 -0
- package/dist/skip-nav.js +47 -0
- package/dist/skip-nav.js.map +1 -0
- package/dist/tags-input.d.ts +157 -0
- package/dist/tags-input.d.ts.map +1 -0
- package/dist/tags-input.js +108 -0
- package/dist/tags-input.js.map +1 -0
- package/dist/text-formats.d.ts +85 -0
- package/dist/text-formats.d.ts.map +1 -0
- package/dist/text-formats.js +43 -0
- package/dist/text-formats.js.map +1 -0
- package/dist/toggle-group.d.ts +111 -0
- package/dist/toggle-group.d.ts.map +1 -0
- package/dist/toggle-group.js +78 -0
- package/dist/toggle-group.js.map +1 -0
- package/dist/top.d.ts +113 -0
- package/dist/top.d.ts.map +1 -0
- package/dist/top.js +72 -0
- package/dist/top.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/docs/agreement.md +33 -0
- package/docs/anchor.md +59 -59
- package/docs/ant-design-coverage.md +5 -3
- package/docs/asset.md +26 -0
- package/docs/auth-screen.md +65 -0
- package/docs/bottom-info.md +15 -0
- package/docs/breadcrumb.md +15 -15
- package/docs/button-label.md +20 -0
- package/docs/calendar.md +82 -154
- package/docs/carousel.md +27 -2
- package/docs/cascader.md +17 -0
- package/docs/chart.md +33 -0
- package/docs/clipboard.md +13 -0
- package/docs/collapsible.md +19 -0
- package/docs/command-palette.md +19 -0
- package/docs/confirm-popover.md +11 -1
- package/docs/context-menu.md +23 -0
- package/docs/data-table.md +22 -0
- package/docs/date-range.md +31 -0
- package/docs/density.md +52 -0
- package/docs/expansion-roadmap.md +16 -3
- package/docs/floating-action-button.md +35 -3
- package/docs/formatters.md +18 -0
- package/docs/generated/component-maturity.md +40 -23
- package/docs/generated/renderer-evidence.json +3029 -652
- package/docs/generated/renderer-evidence.md +55 -6
- package/docs/generated/showcase-manifest.json +1156 -81
- package/docs/heading.md +25 -0
- package/docs/identity.md +5 -0
- package/docs/layout.md +1 -1
- package/docs/library-gap-analysis.md +29 -9
- package/docs/list-row.md +14 -0
- package/docs/mentions.md +18 -0
- package/docs/menubar.md +22 -0
- package/docs/native-platform.md +36 -0
- package/docs/overlay-stack.md +24 -0
- package/docs/pagination.md +16 -8
- package/docs/popover.md +42 -13
- package/docs/product-audit-2026-09-15.md +88 -0
- package/docs/progress.md +16 -0
- package/docs/provider-button.md +33 -0
- package/docs/rating.md +19 -0
- package/docs/react-native-completion.md +347 -0
- package/docs/screen-chrome.md +52 -0
- package/docs/side-panel.md +23 -2
- package/docs/sidebar.md +30 -0
- package/docs/skip-nav.md +20 -0
- package/docs/splitter.md +22 -2
- package/docs/stable-promotion.md +51 -0
- package/docs/tags-input.md +25 -0
- package/docs/text-formats.md +15 -0
- package/docs/theming.md +84 -0
- package/docs/time-picker.md +22 -1
- package/docs/toast.md +18 -0
- package/docs/toggle-group.md +21 -0
- package/docs/top.md +32 -0
- package/docs/tour.md +23 -2
- package/docs/transfer-list.md +20 -0
- package/docs/tree-select.md +18 -0
- package/docs/tree.md +21 -0
- package/package.json +126 -6
package/dist/top.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { heading, spacing, typography } from "./foundations.js";
|
|
2
|
+
import { semanticColors } from "./semantic-colors.js";
|
|
3
|
+
export const topDefaults = {
|
|
4
|
+
size: "large",
|
|
5
|
+
headingLevel: 1,
|
|
6
|
+
};
|
|
7
|
+
function assertNonEmpty(value, field) {
|
|
8
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
9
|
+
throw new TypeError(`Top ${field} must not be empty`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function validateTopDescriptor(descriptor) {
|
|
13
|
+
if (descriptor === null || typeof descriptor !== "object") {
|
|
14
|
+
throw new TypeError("Top descriptor must be an object");
|
|
15
|
+
}
|
|
16
|
+
assertNonEmpty(descriptor.title, "title");
|
|
17
|
+
if (descriptor.eyebrow !== undefined)
|
|
18
|
+
assertNonEmpty(descriptor.eyebrow, "eyebrow");
|
|
19
|
+
if (descriptor.description !== undefined) {
|
|
20
|
+
assertNonEmpty(descriptor.description, "description");
|
|
21
|
+
}
|
|
22
|
+
if (descriptor.size !== undefined && descriptor.size !== "medium" && descriptor.size !== "large") {
|
|
23
|
+
throw new TypeError(`Unsupported Top size: ${String(descriptor.size)}`);
|
|
24
|
+
}
|
|
25
|
+
if (descriptor.headingLevel !== undefined &&
|
|
26
|
+
![1, 2, 3].includes(descriptor.headingLevel)) {
|
|
27
|
+
throw new TypeError(`Unsupported Top headingLevel: ${String(descriptor.headingLevel)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* `large`๋ ํ๋ฉด์ ์ฒซ ์ ๋ชฉ, `medium`์ ์ํธยท๋ชจ๋ฌ ์์ ์ฒซ ์ ๋ชฉ์ด๋ค. ๋ ๋จ๊ณ๋ฟ์ธ ์ด์ ๋
|
|
32
|
+
* ์ธ ๋ฒ์งธ๊ฐ ํ์ํด์ง๋ ์๋ฆฌ๊ฐ ๊ณง `Section`์ด๊ธฐ ๋๋ฌธ์ด๋ค โ ํฌ๊ธฐ๋ฅผ ๋ ๋๋ฆฌ๋ ๋์ ๋ค๋ฅธ
|
|
33
|
+
* ์ปดํฌ๋ํธ๋ฅผ ์ฐ๋ผ๋ ์ ํธ๋ก ๋๋ค.
|
|
34
|
+
*/
|
|
35
|
+
export const topRecipe = {
|
|
36
|
+
slots: ["root", "eyebrow", "title", "description", "trailing"],
|
|
37
|
+
defaults: { size: topDefaults.size },
|
|
38
|
+
sizes: {
|
|
39
|
+
medium: { title: typography.titleLarge, paddingTop: spacing.md, paddingBottom: spacing.sm },
|
|
40
|
+
large: { title: heading.level2, paddingTop: spacing.xl, paddingBottom: spacing.md },
|
|
41
|
+
},
|
|
42
|
+
eyebrow: {
|
|
43
|
+
color: semanticColors.content.brand,
|
|
44
|
+
textVariant: "label",
|
|
45
|
+
marginBottom: spacing.xxs,
|
|
46
|
+
},
|
|
47
|
+
title: { color: semanticColors.content.primary },
|
|
48
|
+
description: {
|
|
49
|
+
color: semanticColors.content.body,
|
|
50
|
+
textVariant: "body",
|
|
51
|
+
marginTop: spacing.xs,
|
|
52
|
+
},
|
|
53
|
+
/** ์ ๋ชฉ ์ค ์ค๋ฅธ์ชฝ ๋ณด์กฐ ํ๋. ๋ณธ๋ฌธ์ด๋ฏ๋ก TopBar์ฒ๋ผ ์์ด์ฝ ์ ์ฉ์ ๊ฐ์ ํ์ง ์๋๋ค. */
|
|
54
|
+
trailing: { gap: spacing.xs },
|
|
55
|
+
gap: spacing.xs,
|
|
56
|
+
};
|
|
57
|
+
export const topBehavior = {
|
|
58
|
+
/** ์ํ ์ถ์ด ์๋ค โ ํ๋ฉด์ด ์ ๋ชฉ์ ๋ฐ๊พธ๋ฉด ๊ทธ๋ฅ ๋ค๋ฅธ ๋ฌธ์์ด์ ๋๊ธด๋ค. */
|
|
59
|
+
controlled: [],
|
|
60
|
+
inputs: ["title", "eyebrow", "description", "size", "headingLevel"],
|
|
61
|
+
stateAxes: {},
|
|
62
|
+
web: { roles: ["heading"], keyboard: [], focus: "none" },
|
|
63
|
+
native: { roles: ["header"], states: [], actions: [] },
|
|
64
|
+
scenarios: [
|
|
65
|
+
"the-title-is-a-real-heading-element-at-the-declared-level-not-styled-text",
|
|
66
|
+
"top-is-body-content-that-scrolls-away-while-topbar-is-fixed-chrome",
|
|
67
|
+
"description-wraps-instead-of-truncating-so-large-text-never-hides-the-question",
|
|
68
|
+
"a-trailing-action-shares-the-title-row-and-drops-below-it-when-space-runs-out",
|
|
69
|
+
"eyebrow-never-carries-information-the-title-does-not-repeat-in-some-form",
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=top.js.map
|
package/dist/top.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"top.js","sourceRoot":"","sources":["../src/top.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAiCtD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,OAAO;IACb,YAAY,EAAE,CAAC;CACwD,CAAC;AAE1E,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CAAC,OAAO,KAAK,oBAAoB,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAyB;IAC7D,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC1D,CAAC;IACD,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS;QAAE,cAAc,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpF,IAAI,UAAU,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACzC,cAAc,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjG,MAAM,IAAI,SAAS,CAAC,yBAAyB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,IACE,UAAU,CAAC,YAAY,KAAK,SAAS;QACrC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EAC5C,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,iCAAiC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,CAAU;IACvE,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE;IACpC,KAAK,EAAE;QACL,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE;QAC3F,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE;KACpF;IACD,OAAO,EAAE;QACP,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK;QACnC,WAAW,EAAE,OAAgB;QAC7B,YAAY,EAAE,OAAO,CAAC,GAAG;KAC1B;IACD,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE;IAChD,WAAW,EAAE;QACX,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI;QAClC,WAAW,EAAE,MAAe;QAC5B,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB;IACD,uDAAuD;IACvD,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE;IAC7B,GAAG,EAAE,OAAO,CAAC,EAAE;CAahB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,6CAA6C;IAC7C,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,CAAC;IACnE,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;IACxD,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACtD,SAAS,EAAE;QACT,2EAA2E;QAC3E,oEAAoE;QACpE,gFAAgF;QAChF,+EAA+E;QAC/E,0EAA0E;KAC3E;CACkC,CAAC","sourcesContent":["import type { BehaviorContract } from \"./behaviors.js\";\nimport type { ColorReference } from \"./color-references.js\";\nimport { heading, spacing, typography } from \"./foundations.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\n\n/**\n * ํ๋ฉด ๋ณธ๋ฌธ์ **์ฒซ ๋ธ๋ก**์ด๋ค. `TopBar`(์๋จ ๋ด๋น๊ฒ์ด์
๋ฐ)์ ๋ค๋ฅธ ์๋ฆฌ์ด๊ณ , ๊ทธ ์ฐจ์ด๊ฐ\n * ์ด ๊ณ์ฝ์ ์กด์ฌ ์ด์ ๋ค.\n *\n * - `TopBar`๋ ํ๋ฉด์ ๊ณ ์ ๋ ํฌ๋กฌ์ด๋ค โ ๋ค๋ก๊ฐ๊ธฐ, ํ๋ฉด ์ด๋ฆ, ์ก์
. ์คํฌ๋กค๊ณผ ๋ฌด๊ดํ๊ฒ\n * ๋ถ์ด ์๊ณ safe area๋ฅผ ๋ค๋ฃฌ๋ค.\n * - `Top`์ ๋ณธ๋ฌธ์ด๋ค โ ์คํฌ๋กค๊ณผ ํจ๊ป ์ฌ๋ผ๊ฐ๊ณ , ์ฌ์ฉ์๊ฐ \"์ด ํ๋ฉด์ด ๋ฌด์์ ๋ฌป๋์ง\"\n * ์ฝ๋ ๋ฌธ์ฅ์ด ์ฌ๊ธฐ ์๋ค. ํ ์ค TDS๊ฐ \"Top๊ณผ ListRow๋ก ํ๋ฉด ๋๋ถ๋ถ์ ๋ง๋ ๋ค\"๊ณ \n * ๋งํ๋ ๊ทธ Top์ด๊ณ , ์ง๊ธ๊น์ง BurnTok `AppScreenHeader`ยทTaground `screen-shell`ยท\n * Diairy `DetailPanel`์ด ๊ฐ์ ๋ค์ ๋ง๋ค๋ ๋ธ๋ก์ด๋ค.\n *\n * `Section`๊ณผ๋ ๋ค๋ฅด๋ค. Section์ ๋ณธ๋ฌธ **์ค๊ฐ**์ ๋ฌถ์ ์ ๋ชฉ์ด๋ผ heading level์ด ํ๋ฉด\n * ๊ตฌ์กฐ์ ์ข
์๋์ง๋ง, Top์ ํ๋ฉด๋น ํ๋๋ฟ์ธ ์ฒซ ์ ๋ชฉ์ด๋ผ ๊ธฐ๋ณธ์ด `h1`์ด๋ค. ๊ทธ๋์ ๋\n * ๊ณ์ฝ์ ํฉ์น์ง ์์๋ค โ ํฉ์น๋ฉด \"์ด Section์ด ํ๋ฉด์ h1์ธ๊ฐ\"๋ฅผ ๋งค๋ฒ ๋ฌผ์ด์ผ ํ๋ค.\n */\nexport type TopSize = \"medium\" | \"large\";\n\nexport type TopDescriptor = Readonly<{\n title: string;\n /** ์ ๋ชฉ ์ ํ ์ค. ์นดํ
๊ณ ๋ฆฌยท๋จ๊ณ์ฒ๋ผ ์ ๋ชฉ์ ํ์ ํ๋ ์งง์ ๋ง. */\n eyebrow?: string;\n /** ์ ๋ชฉ ์๋ ๋ณด์กฐ ๋ฌธ์ฅ. ๊ธธ๋ฉด ์ค๋ฐ๊ฟ๋๋ฉฐ ์๋ฆฌ์ง ์๋๋ค. */\n description?: string;\n size?: TopSize;\n /**\n * ๋ฌธ์ ๊ตฌ์กฐ์์ ์ ๋ชฉ ๋จ๊ณ. ํ๋ฉด๋น ํ๋์ธ Top์ `1`์ด ๊ธฐ๋ณธ์ด์ง๋ง, ํ ๋ผ์ฐํธ๊ฐ\n * ์ฌ๋ฌ ํ๋ฉด์ ๋ด๋ ๊ฒฝ์ฐ(์ํธ ์์ ํ๋ฉด ๋ฑ) ์ ํ์ด ๋ฎ์ถ ์ ์๋ค.\n */\n headingLevel?: 1 | 2 | 3;\n}>;\n\nexport const topDefaults = {\n size: \"large\",\n headingLevel: 1,\n} as const satisfies Readonly<{ size: TopSize; headingLevel: 1 | 2 | 3 }>;\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`Top ${field} must not be empty`);\n }\n}\n\nexport function validateTopDescriptor(descriptor: TopDescriptor): void {\n if (descriptor === null || typeof descriptor !== \"object\") {\n throw new TypeError(\"Top descriptor must be an object\");\n }\n assertNonEmpty(descriptor.title, \"title\");\n if (descriptor.eyebrow !== undefined) assertNonEmpty(descriptor.eyebrow, \"eyebrow\");\n if (descriptor.description !== undefined) {\n assertNonEmpty(descriptor.description, \"description\");\n }\n if (descriptor.size !== undefined && descriptor.size !== \"medium\" && descriptor.size !== \"large\") {\n throw new TypeError(`Unsupported Top size: ${String(descriptor.size)}`);\n }\n if (\n descriptor.headingLevel !== undefined &&\n ![1, 2, 3].includes(descriptor.headingLevel)\n ) {\n throw new TypeError(`Unsupported Top headingLevel: ${String(descriptor.headingLevel)}`);\n }\n}\n\n/**\n * `large`๋ ํ๋ฉด์ ์ฒซ ์ ๋ชฉ, `medium`์ ์ํธยท๋ชจ๋ฌ ์์ ์ฒซ ์ ๋ชฉ์ด๋ค. ๋ ๋จ๊ณ๋ฟ์ธ ์ด์ ๋\n * ์ธ ๋ฒ์งธ๊ฐ ํ์ํด์ง๋ ์๋ฆฌ๊ฐ ๊ณง `Section`์ด๊ธฐ ๋๋ฌธ์ด๋ค โ ํฌ๊ธฐ๋ฅผ ๋ ๋๋ฆฌ๋ ๋์ ๋ค๋ฅธ\n * ์ปดํฌ๋ํธ๋ฅผ ์ฐ๋ผ๋ ์ ํธ๋ก ๋๋ค.\n */\nexport const topRecipe = {\n slots: [\"root\", \"eyebrow\", \"title\", \"description\", \"trailing\"] as const,\n defaults: { size: topDefaults.size },\n sizes: {\n medium: { title: typography.titleLarge, paddingTop: spacing.md, paddingBottom: spacing.sm },\n large: { title: heading.level2, paddingTop: spacing.xl, paddingBottom: spacing.md },\n },\n eyebrow: {\n color: semanticColors.content.brand,\n textVariant: \"label\" as const,\n marginBottom: spacing.xxs,\n },\n title: { color: semanticColors.content.primary },\n description: {\n color: semanticColors.content.body,\n textVariant: \"body\" as const,\n marginTop: spacing.xs,\n },\n /** ์ ๋ชฉ ์ค ์ค๋ฅธ์ชฝ ๋ณด์กฐ ํ๋. ๋ณธ๋ฌธ์ด๋ฏ๋ก TopBar์ฒ๋ผ ์์ด์ฝ ์ ์ฉ์ ๊ฐ์ ํ์ง ์๋๋ค. */\n trailing: { gap: spacing.xs },\n gap: spacing.xs,\n} as const satisfies {\n slots: readonly [\"root\", \"eyebrow\", \"title\", \"description\", \"trailing\"];\n defaults: { size: TopSize };\n sizes: Readonly<{\n medium: { title: typeof typography.titleLarge; paddingTop: number; paddingBottom: number };\n large: { title: typeof heading.level2; paddingTop: number; paddingBottom: number };\n }>;\n eyebrow: { color: ColorReference; textVariant: \"label\"; marginBottom: number };\n title: { color: ColorReference };\n description: { color: ColorReference; textVariant: \"body\"; marginTop: number };\n trailing: { gap: number };\n gap: number;\n};\n\nexport const topBehavior = {\n /** ์ํ ์ถ์ด ์๋ค โ ํ๋ฉด์ด ์ ๋ชฉ์ ๋ฐ๊พธ๋ฉด ๊ทธ๋ฅ ๋ค๋ฅธ ๋ฌธ์์ด์ ๋๊ธด๋ค. */\n controlled: [],\n inputs: [\"title\", \"eyebrow\", \"description\", \"size\", \"headingLevel\"],\n stateAxes: {},\n web: { roles: [\"heading\"], keyboard: [], focus: \"none\" },\n native: { roles: [\"header\"], states: [], actions: [] },\n scenarios: [\n \"the-title-is-a-real-heading-element-at-the-declared-level-not-styled-text\",\n \"top-is-body-content-that-scrolls-away-while-topbar-is-fixed-chrome\",\n \"description-wraps-instead-of-truncating-so-large-text-never-hides-the-question\",\n \"a-trailing-action-shares-the-title-row-and-drops-below-it-when-space-runs-out\",\n \"eyebrow-never-carries-information-the-title-does-not-repeat-in-some-form\",\n ],\n} as const satisfies BehaviorContract;\n"]}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAgB,CAAC","sourcesContent":["/** Package release shown by documentation surfaces. Kept in sync by a test. */\nexport const designSystemVersion = \"1.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAgB,CAAC","sourcesContent":["/** Package release shown by documentation surfaces. Kept in sync by a test. */\nexport const designSystemVersion = \"1.3.4\" as const;\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Agreement contract
|
|
2
|
+
|
|
3
|
+
**๋ฌธ์ .** ๊ฐ์
ยท๊ฒฐ์ ์์ ์๋ ์ฝ๊ด ๋์ ๋ฌถ์์ด๋ค. ์ ์ฒด ๋์ ํ ์ค๊ณผ ๊ฐ๋ณ ํญ๋ชฉ๋ค,
|
|
4
|
+
ํ์/์ ํ ๊ตฌ๋ถ, ๊ฐ ํญ๋ชฉ์ ์ ๋ฌธ ๋ณด๊ธฐ๊ฐ ํ ๋ฉ์ด๋ฆฌ๋ก ์์ง์ธ๋ค.
|
|
5
|
+
|
|
6
|
+
**์ CheckboxGroup์ผ๋ก ์ถฉ๋ถํ์ง ์์๊ฐ.** ์ธ ๊ฐ์ง๊ฐ ์ฒดํฌ๋ฐ์ค ๋ชฉ๋ก์ด ์๋๋ผ ์ ์ฐจ์ด๊ธฐ
|
|
7
|
+
๋๋ฌธ์ด๋ค.
|
|
8
|
+
|
|
9
|
+
1. **ํ์/์ ํ์ด ์ ์ถ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ ํ๋ค.** CheckboxGroup์ "๋ช ๊ฐ ๊ณจ๋๋๊ฐ"๋ง ์๊ณ
|
|
10
|
+
"์ด ํ๋ฉด์ด ์งํ ๊ฐ๋ฅํ๊ฐ"๋ ๋ชจ๋ฅธ๋ค. `resolveAgreementState`์ `satisfied`์
|
|
11
|
+
`missingRequiredIds`๊ฐ ๊ทธ ํ์ ์ด๊ณ , ์ ํ์ ์ ์ถ ๋ฒํผ์ด ๊ทธ๊ฒ๋ง ์ฝ๋๋ค.
|
|
12
|
+
2. **์ ์ฒด ๋์๋ ํ์์ด๋ค.** ์ ์ฅ๋๋ ๊ฐ์ ๊ฐ๋ณ ํญ๋ชฉ๋ฟ์ด๊ณ ์ ์ฒด ํ์ tri-state๋ก
|
|
13
|
+
๊ทธ๋ ค์ง๋ค โ DataTable ๋จธ๋ฆฌ๊ธ(`resolveDataTableSelectAllState`)ยทTreeSelect ๋ถ๋ชจ
|
|
14
|
+
(`resolveTreeCheckedStates`)์ ๊ฐ์ ๊ด๊ณ๋ค. ์ ์ฒด ๋์๋ฅผ ๋ณ๋ ๊ฐ์ผ๋ก ์ ์ฅํ๋ฉด
|
|
15
|
+
"์ ์ฒด ๋์ํ์ง๋ง ๊ฐ๋ณ์ ๋ ๊ฐ๋ง ์ฒดํฌ๋จ" ๊ฐ์ ๋ชจ์์ด ํํ ๊ฐ๋ฅํด์ง๋ค.
|
|
16
|
+
3. **์ฝ์ ์ ์์ด์ผ ๋์๋ค.** ์ ๋ฌธ ๊ฒฝ๋ก๊ฐ ์๋ ๋์ ํญ๋ชฉ์ ๋ง๋ค ์ ์๊ฒ ๋์ง๋ ์์ง๋ง,
|
|
17
|
+
`detail`์ ๊ณ์ฝ๋ ํ๋์ผ๋ก ๋ฌ์ renderer๊ฐ ์ฅ์ ํ์ดํ๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๊ฒ ํ๋ค.
|
|
18
|
+
๊ทธ ์ปจํธ๋กค์ ์ฒดํฌ๋ฐ์ค์ **๋ค๋ฅธ tab stop**์ด๊ณ ๋๋ฅด๋ฉด ์ ๋ ์ฒดํฌ๋์ง ์๋๋ค.
|
|
19
|
+
|
|
20
|
+
**๋ง์ ๋ ์กฐํฉ.** ํ์์ด๋ฉด์ ๋นํ์ฑ์ธ ํญ๋ชฉ์ descriptor ๋จ๊ณ์์ ๊ฑฐ์ ํ๋ค. ํ์ฉํ๋ฉด
|
|
21
|
+
์ฌ์ฉ์๊ฐ ์์ํ ์งํํ ์ ์๋ ํ๋ฉด์ด ์กฐ์ฉํ ๋ง๋ค์ด์ง๊ณ , "๋ฒํผ์ด ์ ์ ๋๋ฆฌ๋๊ฐ"๋ฅผ
|
|
22
|
+
์๋ฌด๋ ์ค๋ช
ํ ์ ์๋ค.
|
|
23
|
+
|
|
24
|
+
**๋นํ์ฑ ํญ๋ชฉ์ ํ๊ณ.** ์ ์ฒด ๋์์ ๋ถ๋ชจ์์ ๋บ๋ค โ ์ฌ์ฉ์๊ฐ ๋ฐ๊ฟ ์ ์๋ ๊ฒ์ "๋
|
|
25
|
+
๋์ํ๋ค"๊ณ ์
์ ์๋ค. ํ์๋ ๋นํ์ฑ์ผ ์ ์์ผ๋ฏ๋ก `satisfied` ํ์ ์๋ ์ด ์์ธ๊ฐ ์๋ค.
|
|
26
|
+
|
|
27
|
+
**์ ํ์ด ์์ ํ๋ ๊ฒ.** ๋ฌธ๊ตฌ, ๋งํฌ ์ฃผ์, ๋ฒ์ ์ ํจ์ฑ, ๋์ ๊ธฐ๋ก์ ์ ์ฅยท์ฆ๋น. HJM์
|
|
28
|
+
ํ์ ๊ณผ ๋ฐฐ์น๋ง ๊ฐ๋๋ค. ์ฝ๊ด ๋ด์ฉ์ ์ด๋์ ๋ณด์ฌ์ค์ง(๋งํฌยท์ํธยท์ ํ๋ฉด)๋ ์ ํ ๊ฒฐ์ ์ด๋ผ
|
|
29
|
+
`detail.href`๋ ์ ํ์ด๊ณ , ์์ผ๋ฉด renderer๊ฐ ๋ฒํผ์ผ๋ก ๋ธ๋ค.
|
|
30
|
+
|
|
31
|
+
**ํ๋ซํผ ๋ฒ์ญ.** Web์ `group` + `checkbox` + ๋ณ๋ ๋งํฌ/๋ฒํผ, Native๋ checkbox
|
|
32
|
+
accessibility state์ `openDetail` action์ด๋ค. ๋ ํ๋ฉด ๋ชจ๋ ์ ์ฒด ๋์ ํ์ด ๋ชฉ๋ก์ ์ ๋ชฉ
|
|
33
|
+
์ญํ ์ ํ๋๋ก `surface.sunken` ์์ ๋๋๋ค.
|
package/docs/anchor.md
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
# Anchor โ
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- `
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
1
|
+
# Anchor โ ๊ฐ์ ๋ฌธ์ ์์ ๋ชฉ์ฐจ
|
|
2
|
+
|
|
3
|
+
2026-09-16 React/RN ํ์ฅ ์์ฒญ์ ๋ฐ๋ผ Web ๋ผ์ด๋ธ๋ฌ๋ฆฌ beta๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด์ ์๋ ์ค์ ์ ํ์
|
|
4
|
+
๊ธด ๋ฌธ์ ์์๊ฐ ์์ด planned์์ต๋๋ค. ์ด๋ฒ์๋ ์๋ํ๋ ๋ฌธ์ ์์ ์ ๋ธ๋ผ์ฐ์ ๊ฒ์ฆ๊น์ง
|
|
5
|
+
์ ๊ณตํ๋ฉฐ ์ ํ ์ฑํยท๋ณด์กฐ๊ธฐ๊ธฐ ๊ฒ์ฆยทstable ์น๊ฒฉ์ ๋ณ๋๋ก ๋จ๊น๋๋ค.
|
|
6
|
+
|
|
7
|
+
[Ant Design Anchor](https://ant.design/components/anchor/)์ ๋ฌธ์ ๋ด ๋งํฌยทํ์ฌ ์์นยท์คํฌ๋กค
|
|
8
|
+
์์ญ ๊ตฌ๋ถ์ ๋น๊ตํ์ต๋๋ค. HJM์ content-brand ๊ธ์์ ์์ ๋
ผ๋ฆฌ ๋ฐฉํฅ ํ์์ ์ผ๋ก ์์น๋ฅผ
|
|
9
|
+
๋ณด์ฌ์ฃผ๋ฉฐ ๋ณ๋ ์นด๋๋ ์ฃผ์ ํ๋ ๋ฒํผ์ผ๋ก ๊ฐ์กฐํ์ง ์์ต๋๋ค. API ํธํ์ ์ฝ์ํ์ง ์์ต๋๋ค.
|
|
10
|
+
|
|
11
|
+
## ์ฌ์ฉ๋ฒ
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { Anchor } from "@hjmds/react/anchor";
|
|
15
|
+
|
|
16
|
+
<Anchor label="๊ฐ์ด๋ ๋ชฉ์ฐจ" items={[
|
|
17
|
+
{ id: "start", label: "์์ํ๊ธฐ" },
|
|
18
|
+
{ id: "next", label: "๋ค์ ๋จ๊ณ" },
|
|
19
|
+
]} offset={64} />
|
|
20
|
+
// ๊ฐ์ ๋ฌธ์์ ๊ณ ์ ID๋ฅผ ๊ฐ์ง <section id="start">, <section id="next">๋ฅผ ๋ก๋๋ค.
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- `items`๋ ๋น์ด ์์ง ์์ `{ id, label }` ๋ฐฐ์ด์
๋๋ค. ID๋ ๊ณต๋ฐฑ ์์ด ๋ฌธ์ ์์์ ๊ณ ์ ํด์ผ
|
|
24
|
+
ํฉ๋๋ค. ์ค๋ณต IDยท๋น label์ ๊ฑฐ๋ถํฉ๋๋ค. fragment๋ ID๋ฅผ URL encodeํด ์์ฑํฉ๋๋ค.
|
|
25
|
+
- `container` ์๋ต ์ ๋ฌธ์ ์คํฌ๋กค์ ๊ด์ฐฐํฉ๋๋ค. `HTMLElement`๋ฅผ ๋๊ธฐ๋ฉด ํด๋น ์์ญ ๋ด๋ถ๋ง
|
|
26
|
+
๊ด์ฐฐํฉ๋๋ค. ref๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ `null`์์๋ ๊ด์ฐฐํ์ง ์์ต๋๋ค.
|
|
27
|
+
- `offset`์ ์๋จ ๊ณ ์ ํค๋ ์๋์ ๋จ๊ธธ CSS px์
๋๋ค. ๊ธฐ๋ณธ 0์ด๊ณ ์ ํํ ์์ด ์๋ ์๋ง
|
|
28
|
+
ํ์ฉํฉ๋๋ค. ๋ณ๋ ์คํฌ๋กค ์์ญ์ border์ scrollTop์ ํฌํจํด ๊ณ์ฐํฉ๋๋ค.
|
|
29
|
+
- `orientation`์ `vertical` ๊ธฐ๋ณธ๊ฐ ๋๋ `horizontal`์
๋๋ค. ์ข์ ํญ์์ ๋งํฌ๊ฐ ์ค๋ฐ๊ฟํ๋ฉฐ
|
|
30
|
+
๊ธด label์ ์๋ฅด์ง ์์ต๋๋ค. ๋ชฉ์ฐจ์ sticky ๋ฐฐ์น์ ๋ฌธ์ ๋ ์ด์์์ ํธ์คํธ๊ฐ ์์ ํฉ๋๋ค.
|
|
31
|
+
- `historyMode`๋ `push` ๊ธฐ๋ณธ๊ฐ, `replace`, `none`์
๋๋ค. ์์ ๋์ ๊ธฐ์กด history.state๋ฅผ
|
|
32
|
+
๋ณด์กดํ๋ฉฐ fragment๋ง ๊ฐฑ์ ํฉ๋๋ค. `none`์ URL์ ์ฐ์ง ์๋ ๋ด์ฅ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ์ ํฉํฉ๋๋ค.
|
|
33
|
+
- `onNavigate(id, event)`์์ `preventDefault()`๋ก ์ฑ ๋ผ์ฐํฐ ๋ฑ์ ๋์์ ์์ํ ์ ์์ต๋๋ค.
|
|
34
|
+
์ ํญ์ ์ฌ๋ modifier ํด๋ฆญ์ ๋ธ๋ผ์ฐ์ ์ ๋งก๊น๋๋ค. `ref`๋ nav ์์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
|
|
35
|
+
|
|
36
|
+
## ์คํฌ๋กคยท์ด์ ๊ณ์ฝ
|
|
37
|
+
|
|
38
|
+
`nav > ul > li > a`๋ฅผ ์ฌ์ฉํ๊ณ ํ์ฌ ๋งํฌ ํ๋์ `aria-current="location"`์ ๋ก๋๋ค.
|
|
39
|
+
๋์์ด DOM์ ์๋ ๋งํฌ๋ ํ์ฌ ์์น ํ๋ณด์์ ์ ์ธํ๋ฉฐ ๊ธฐ๋ณธ href ๋์์ ์ ์งํฉ๋๋ค.
|
|
40
|
+
์ฌ์ฉ์๊ฐ ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด ํด๋น section/์ ๋ชฉ์ ์ด์ ์ ์ฎ๊น๋๋ค. ์ผ๋ฐ section์ ์์ `tabindex=-1`์
|
|
41
|
+
๋ฐ๊ณ blur/unmount ๋ ๋ณต์ํฉ๋๋ค. Tab/Enter๋ ๋ธ๋ผ์ฐ์ ๋งํฌ ๋์์
๋๋ค.
|
|
42
|
+
|
|
43
|
+
ํ์ฌ ์์น๋ DOM ์์์ ๊ฐ์ ๋์ ์ค์ ์์น๋ก ๊ณ์ฐํฉ๋๋ค. ์คํฌ๋กค ๋์์๋ ์งง์ ๋ง์ง๋ง
|
|
44
|
+
์น์
๋ ์ ํํฉ๋๋ค. ์คํฌ๋กคยท์ฐฝ ํฌ๊ธฐยท๋์/๋ถ๋ชจ ํฌ๊ธฐยท๋ณธ๋ฌธ ์ฝ์
/์ญ์ ๋ฅผ ๊ด์ฐฐํ๊ณ unmount ๋
|
|
45
|
+
listenerยทobserverยท์์ฝ frame์ ํด์ ํฉ๋๋ค. CSS transform๋ง์ผ๋ก ์์น๋ฅผ ์์ง์ด๋ ๋ณ๋ ์ ๋๋ฉ์ด์
์
|
|
46
|
+
๊ณ์ฝ์ ํฌํจํ์ง ์์ต๋๋ค. window์ hashchange/popstate์ ์ด๊ธฐ fragment๋ ๋ฑ๋ก๋ ๋์์ผ๋ก
|
|
47
|
+
์ฆ์ ์ด๋ํ์ฌ ๋ณ๋ ์คํฌ๋กค ์์ญ๋ ๋ณต๊ตฌํฉ๋๋ค.
|
|
48
|
+
|
|
49
|
+
์ผ๋ฐ ํด๋ฆญ์ smooth scroll์
๋๋ค. HJM ํ๊ฒฝ ๋๋ OS๊ฐ reduced motion์ด๋ฉด `instant`๋ก ์ด๋ํฉ๋๋ค.
|
|
50
|
+
`auto`๋ ํธ์คํธ์ scroll-behavior์ ๋ฐ๋ผ ๋ค์ ์ ๋๋ฉ์ด์
๋ ์ ์์ด ์ฌ์ฉํ์ง ์์ต๋๋ค.
|
|
51
|
+
|
|
52
|
+
## ๋ฒ์์ ๊ฒ์ฆ
|
|
53
|
+
|
|
54
|
+
Web ์ ์ฉ์
๋๋ค. Native ๋ผ์ฐํ
ยท๋ชฉ๋ก ์์น ์ด๋์ ํด๋น ํ๋ซํผ๊ณผ ์ ํ์ด ์์ ํ๋ฉฐ ๋น RN wrapper๋ฅผ
|
|
55
|
+
์ถ๊ฐํ์ง ์์ต๋๋ค. ์ค์ฒฉ ํธ๋ฆฌ ๋ชฉ์ฐจยท์๋ ์ ๋ชฉ ์์งยท์ค๋ฒ๋ ์ด anchor positioning์ ํฌํจํ์ง ์์ต๋๋ค.
|
|
56
|
+
|
|
57
|
+
`Patterns/Anchor`๋ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ ์ฝ๊ธฐ ๊ฐ์ด๋์ ๋ณ๋ ์คํฌ๋กค ์์ญ์ ์ ๊ณตํฉ๋๋ค.
|
|
58
|
+
๋ธ๋ผ์ฐ์ ํ
์คํธ๋ ์์น ๋๊ธฐํยท์งง์ ๋ง์ง๋ง ๋ถ๋ถยทoffsetยทreduced motionยท์์ focus ๋ณต์ยท
|
|
59
|
+
fragment ๋ณต๊ตฌยท๋์ค์ ์ฝ์
๋ ๋์์ ๊ฒ์ฌํฉ๋๋ค. ์ค์ ์ ํ ๋ฌธ์ ์ฑํยท๋ณด์กฐ๊ธฐ๊ธฐ ๊ฒ์ฆ์ ๋จ์ ์์ต๋๋ค.
|
|
@@ -53,7 +53,7 @@ message์ notification์ ๊ฐ๋ฅด๋ ์ถ(์ ๋ณด ์ธต, ์ง์ ์๊ฐ, ๋์ ๊ฐ
|
|
|
53
53
|
| ์ข
๋ฅ | ๋ป | ์ | ์ฌ๊ฒํ ์ ํธ |
|
|
54
54
|
|---|---|---|---|
|
|
55
55
|
| **ํก์๋จ** | ๊ทธ ๋ฌธ์ ๋ฅผ ์ด๋ฏธ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์๊ฒฐํ๋ค | `Notification`โToast, `Dropdown`โMenu, `ContextPanel`โSidePanel/Sheet, `Flex`โStack, `TimePicker`โSelect ์กฐํฉ, `Rating`โSlider/Statistic | ํก์ํ ์ชฝ์ด ๋ชป ํธ๋ ์๊ตฌ๊ฐ ๋์ฌ ๋ |
|
|
56
|
-
| **๊ฒ์ฆํ ํ๋ฉด์ด ์์** | ๊ณ์ฝ ์์ฒด๋ ์ ํจํ๋ ์ด๋ฅผ ํ์ธํ ์ ํ ํ๋ฉด์ด ์๋ค | `Anchor
|
|
56
|
+
| **๊ฒ์ฆํ ํ๋ฉด์ด ์์** | ๊ณ์ฝ ์์ฒด๋ ์ ํจํ๋ ์ด๋ฅผ ํ์ธํ ์ ํ ํ๋ฉด์ด ์๋ค | `Anchor` | ๊ทธ ํ๋ฉด์ด ์ค์ ๋ก ์๊ธธ ๋ |
|
|
57
57
|
| **๊ฑฐ์ ๋จ** | ๊ณ์ฝ๋ ์ ํจํ๊ณ ํ๋ฉด์ด ์๊ฒจ๋ ๋ง๋ค์ง ์๋๋ค | `BorderBeam`(์ฅ์), `AppProvider`(๋ฐํ์๋ฟ), `Utility`(์ค์ฒด ์์) | ์ ์ฒด์ฑ์ด๋ ์ํคํ
์ฒ ๊ฒฝ๊ณ๊ฐ ๋ฐ๋ ๋๋ง |
|
|
58
58
|
| **ํก์ ๋๊ธฐ** | ํก์ ํ์ ์ ๋๋ฌ์ผ๋ **์ ๊ฒฐ ์ถ์ด ์์ง ์๋ค** | `Cascader`(TreeSelect์ `valueMode`/`commitAt`๊ฐ ์ถ๊ฐ๋ผ์ผ ์ฑ๋ฆฝ) | ๊ทธ ์ถ์ด ์ค์ ๋ก ์ถ๊ฐ๋ ๋ |
|
|
59
59
|
|
|
@@ -88,8 +88,10 @@ evidence registry๋ก ํ๋จํฉ๋๋ค.
|
|
|
88
88
|
- partial maturity: decomposed target ์ค ์ผ๋ถ๋ง stable ๋๋ beta
|
|
89
89
|
- planned only: ๋ชจ๋ target์ด planned
|
|
90
90
|
|
|
91
|
-
2026-
|
|
92
|
-
|
|
91
|
+
2026-09-18 SidePanelยทSplitterยทTourยทTreeยทTransferListยทMentionsยทCommandPaletteยทDataTable renderer๊น์ง ์ถ๊ฐํ ๋ค status ๊ธฐ๋ฐ ๋ถํฌ๋
|
|
92
|
+
**fully mature 59 / partial maturity 0 /
|
|
93
|
+
planned only 14**์
๋๋ค. decomposed Drawer์ ๋ ๊ฐ๋(SheetยทSidePanel)๊ฐ ๋ชจ๋ ๊ตฌํ๋๋ฉด์
|
|
94
|
+
partial maturity๊ฐ ๋น์์ต๋๋ค โ 0์ "๋ถ๋ถ ๊ตฌํ์ด ์๋ค"๋ ๋ป์ด๊ณ planned only 20์ ๊ทธ๋๋ก์
๋๋ค. ๋ฐ๋ผ์ 73/73 tracking์ 73๊ฐ ๊ตฌํ ์๋ฃ๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค.
|
|
93
95
|
ํ๊ณผ Component Explorer๋ ์ด ์์น๋ฅผ ๋ถ๋ฆฌํด ํ์ํฉ๋๋ค. ์ด ์ซ์๋ source inventory ์๊ฐ
|
|
94
96
|
์๋๋ผ HJM target์ maturity์์ ๊ณ์ฐํ๋ฏ๋ก catalog status๊ฐ ๋ฐ๋๋ฉด ํจ๊ป ๊ฐฑ์ ํฉ๋๋ค.
|
|
95
97
|
|
package/docs/asset.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Asset contract
|
|
2
|
+
|
|
3
|
+
**๋ฌธ์ .** ์์ด์ฝยท์ด๋ฏธ์งยทLottieยท๋น๋์ค๋ฅผ **๊ฐ์ ์ก์**์ ๋ฃ๋ ์๋ฆฌ.
|
|
4
|
+
|
|
5
|
+
**IconยทImageยทAvatar๊ฐ ์๋๋ฐ ์ ๋ ๋๋๊ฐ.** ์
์ ๊ฐ์ ๋ค๋ฅธ ๋ชจ์ ๊ท์น์ ๊ฐ๋๋ค โ ์์ด์ฝ์
|
|
6
|
+
์ ์ฌ๊ฐ, Avatar๋ ์, Image๋ ๋น์จ. ์ด๋ค์ด ๊ฐ์ ์ค์ ์์ฌ ๋์ค๋ฉด ํฌ๊ธฐ์ ๋ชจ์๋ฆฌ๊ฐ ์ด๊ธ๋๋ค.
|
|
7
|
+
์์ด๋ฆฌ์ `LottieArt`ยท`AnimalArt`๊ฐ ๊ทธ ์ด๊ธ๋จ์ ์ ํ ์์์ ๋ค์ ๋ง์ถ๊ณ ์์๋ค. Asset์
|
|
8
|
+
์ก์ ๊ท์น(ํฌ๊ธฐ 4๋จยท๋ชจ์ 3์ข
ยท๊ฒน์นจยท๋ณด์กฐ ํ์)๋ง ๊ฐ๋๋ค.
|
|
9
|
+
|
|
10
|
+
**๋ฌด์์ ๊ทธ๋ฆด์ง๋ ์ฌ๋กฏ์ผ๋ก ๋ฐ๋๋ค.** Lottie ์ฌ์๊ธฐ๋ ๋น๋์ค ์ฌ์๊ธฐ๋ ์ด ํจํค์ง๊ฐ ์์กดํ์ง
|
|
11
|
+
์๋๋ค. ๊ทธ๋์ ์ด ๊ณ์ฝ์ ์ฌ์ ์ํ(play/pause/seek)๊ฐ ์๋ค โ ์ฌ์๊ธฐ๋ ์ ํ ๊ฒ์ด๊ณ , ์ฌ๊ธฐ์
|
|
12
|
+
์ ํ๋ ๊ฒ์ ์ก์๋ฟ์ด๋ค. ์ด ๊ฒฝ๊ณ๋ฅผ ํ๋ฆฌ๋ฉด `@hjmds/react`๊ฐ ์ ๋๋ฉ์ด์
๋ฐํ์์ ๋๊ณ ์จ๋ค.
|
|
13
|
+
|
|
14
|
+
**๋ป์ด ์๋ ์์ฐ์ ์ด๋ฆ์ด ์์ผ๋ฉด ๊ฑฐ์ ํ๋ค.** ์์ง์ด๋ ๊ทธ๋ฆผ์ผ์๋ก "๋ฌด์์ ๋ปํ๋์ง"๊ฐ
|
|
15
|
+
ํ๋ฉด์ ์์ผ๋ฉด ๋ณด์กฐ๊ธฐ๊ธฐ์์ ์ฌ๋ผ์ง๋ค. ๋ฐ๋๋ก `decorative`์ `accessibilityLabel`์ **ํจ๊ป**
|
|
16
|
+
์ฃผ๋ ๊ฒ๋ ๊ฑฐ์ ํ๋ค โ ์กฐ์ฉํ ํ์ชฝ์ ๋ฌด์ํ๋ฉด ์ด๋ฆ์ ์ง์ด ์ค ๋ชจ๋ฅธ๋ค.
|
|
17
|
+
|
|
18
|
+
**`reducedMotion`์์๋ ์จ๊ธฐ์ง ์๊ณ ์ ์งํ๋ค.** ๊ทธ ์๋ฆฌ์ ๊ทธ๋ฆผ์ด ์๋ค๋ ์ฌ์ค ์์ฒด๊ฐ ํ๋ฉด์
|
|
19
|
+
๋ป์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค(์์ด๋ฆฌ์ ๋๋ฌผ). ์ ์ง ํ๋ฉด์ ์ ํ์ด ์ฃผ์ง ๋ชปํ๋ฉด ์ฌ์๋ง ๋ฉ์ถ๋ค.
|
|
20
|
+
`shouldAnimateAsset(kind, reducedMotion)`์ด ์ด ํ๋จ์ ๊ฐ๋๋ค.
|
|
21
|
+
|
|
22
|
+
**๋ณด์กฐ ํ์์ ์ก์ ๋ฐ๊นฅ ๋ชจ์๋ฆฌ์ ๋ถ๋๋ค.** ์ฌ์ ์์ด์ฝ์ด ๋งค์ฒด ์์ ์ฌ๋ผ๊ฐ๋ฉด ๊ฐ์ฅ ์ค์ํ
|
|
23
|
+
ํ๋ ์ ๊ฐ์ด๋ฐ๋ฅผ ๊ฐ๋ฆฐ๋ค.
|
|
24
|
+
|
|
25
|
+
**๊ฒน์นจ ๋น์จ์ Avatar์ ๊ฐ์ ๊ฐ์ด๋ค.** ํ ์ค์ ์์ฌ ๋์ค๋ ๊ฒ์ด ์ด ์ปดํฌ๋ํธ๊ฐ ์๊ธด ์ด์ ๋ผ
|
|
26
|
+
๋ ๊ฐ์ด ๋ค๋ฅด๋ฉด ๊ทธ ์ค์ด ๋ค์ ์ด๊ธ๋๋ค.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# AuthScreenLayout โ ๋ก๊ทธ์ธ ํ๋ฉด์ ๋ ์์ญ ๊ณจ๊ฒฉ
|
|
2
|
+
|
|
3
|
+
## ๋ฌธ์
|
|
4
|
+
|
|
5
|
+
๊ณ์ ์ด ์๋ ์ ํ๋ค์ด ๊ฐ์ ํ๋ฉด์ ๊ฐ์ ๋ง๋ค์๊ณ , ๊ฐ์ ์ค์๋ฅผ ๊ฐ์ ํ๋ค.
|
|
6
|
+
|
|
7
|
+
- ๋ก๊ณ ยทํ๊ทธ๋ผ์ธยท์ค๋ช
ยท๋์ ๊ณ ์งยท์ ์ฑ
๋งํฌ๋ฅผ ์์์๋ถํฐ ์์ **์ฃผ ํ๋(์ ๊ณต์ ๋ฒํผ)์ด ํ๋ฉด ๋ฐ์ผ๋ก
|
|
8
|
+
๋ฐ๋ ธ๋ค.** ๋ฒ๋ 2026-09-19 iPhone 17 Pro ์ค์ธก โ ์ฒซ ํ๋ฉด์์ ๋ฒํผ ์นด๋๊ฐ ์๋ ค ๋ณด์๋ค.
|
|
9
|
+
- ๊ฐ๊ฒฉยท์ต๋ ํญยท๋งํฌ ํฌ๊ธฐ๊ฐ ์ ํ๋ง๋ค ๋ฌ๋๋ค. ๋ค๋ฅผ ์ด์ ๊ฐ ์๋๋ฐ ์ ํ๋ง๋ค ๋ค์ ์ ํด์ก๋ค.
|
|
10
|
+
- ์ ์ฑ
๋งํฌ๊ฐ ๊ธ์ ๋์ด๋งํผ๋ง ๋๋ ธ๋ค(44pt ๋ฏธ๋ง).
|
|
11
|
+
|
|
12
|
+
์ด ํ๋ฉด์ ํ ์ผ์ด ํ๋๋ฟ์ด๋ผ ๋ฐฐ์น๊ฐ ๊ณง ๊ธฐ๋ฅ์ด๋ค. ๊ทธ๋์ ๋ฐฐ์น๋ฅผ ์ ํ์ด ๋งค๋ฒ ๋ค์ ์ ํ๋ ๊ฒ์ด
|
|
13
|
+
๋ฌธ์ ์๋ค.
|
|
14
|
+
|
|
15
|
+
## ์ผ๋ฐํํ ๊ณ์ฝ
|
|
16
|
+
|
|
17
|
+
**๋ ์์ญ๋ง ๋๋ค.**
|
|
18
|
+
|
|
19
|
+
- ์: `hero`(๋งํฌยท์ ๋ชฉยท์ค๋ช
) + `main`(์ฃผ ํ๋). ๋์ด ํ ๋ฉ์ด๋ฆฌ๋ก ๋จ๋ ์ธ๋ก ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ๊ทธ
|
|
20
|
+
์์์ ๊ฐ์ด๋ฐ ์ ๋ ฌํ๋ค.
|
|
21
|
+
- ์๋: `footer`(๋์ ๊ณ ์งยท์ ์ฑ
๋งํฌ). ๋ฐ๋ฅ์ ๋ถ๋๋ค.
|
|
22
|
+
|
|
23
|
+
์ธ ์์ญ ์ด์์ผ๋ก ๋๋์ง ์๋๋ค โ ์
์ด ๋๋ฉด ์ด๋ ๊ฒ์ด ์ฃผ ํ๋์ธ์ง๊ฐ ๋ฐฐ์น๋ก ๋๋ฌ๋์ง ์๋๋ค.
|
|
24
|
+
๋ด์ฉ์ด ํ๋ฉด๋ณด๋ค ๊ธธ์ด์ง๋ฉด **์คํฌ๋กค๋ก ์ ํ**ํ๊ณ , ์๋ ์์ญ์ ์๋ก ๋์ด์ฌ๋ ค ๊ฒน์น์ง ์๋๋ค.
|
|
25
|
+
|
|
26
|
+
`density`๋ `compact`/`regular` ๋๋ฟ์ด๋ค. ์ ํ์ด ํ๋ฉด ๋์ด๋ฅผ ๋ณด๊ณ ๊ณ ๋ฅด๋ฉฐ HJM์ ๊ธฐ๊ธฐ ์ข
๋ฅ๋ฅผ
|
|
27
|
+
์ถ์ธกํ์ง ์๋๋ค โ ๊ฐ์ ํญ์ด๋ผ๋ ํค๋ณด๋๊ฐ ์ฌ๋ผ์ค๋ฉด ์ข์์ง๋ค.
|
|
28
|
+
|
|
29
|
+
## HJM ๊ธฐ๋ณธ๊ฐ
|
|
30
|
+
|
|
31
|
+
| ๊ฐ | ๊ธฐ๋ณธ | ๊ทผ๊ฑฐ |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| ์ต๋ ํญ | 416 (26rem) | `Container`์ reading(720)๋ณด๋ค ์ข๋ค. ์ ๊ณต์ ๋ฒํผ์ด ๋
ธํธ๋ถ ํญ๋งํผ ๊ธธ์ด์ง๋ฉด ๋๋ฅผ ๊ณณ์ด ์๋๋ผ ๋ ๋ก ๋ณด์ธ๋ค |
|
|
34
|
+
| ๋งํฌ | 72 ยท radius `lg` | ์์ด์ฝ(48)๋ณด๋ค ํฌ๊ณ ์ผ๋ฌ์คํธ(120+)๋ณด๋ค ์๋ค โ ์ ํ์ ์์๋ณผ ์ต์ ํฌ๊ธฐ |
|
|
35
|
+
| hero ๊ฐ๊ฒฉ | `md`(compact `xs`) | ๋งํฌโ์ ๋ชฉโ์ค๋ช
์ด ํ ๋ฌธ์ฅ์ผ๋ก ์ฝํ๋ ๊ฑฐ๋ฆฌ |
|
|
36
|
+
| main ๊ฐ๊ฒฉ | `xl`(compact `md`) | ํ์ด๋ก์ ์ฃผ ํ๋์ ๋ถ๋ฆฌํ๋ ํ ๋ฉ์ด๋ฆฌ๋ก ์ ์ง |
|
|
37
|
+
| footer ๊ฐ๊ฒฉ | `xl`(compact `md`) | **์ต์๊ฐ**์ด๋ค. ํ๋ฉด์ด ๊ธธ๋ฉด ๊ทธ ์ด์ ๋ฒ์ด์ง๋ค |
|
|
38
|
+
| ์ ๊ณต์ ๋ฒํผ ๋์ด | `authProviderButtonRecipe.minHeight` | ์ฌ๊ธฐ์ ๋ค์ ์ ํ์ง ์๋๋ค. ๋ ๊ณ์ฝ์ด ๊ฐ์ ๊ฐ์ ๋ค๋ฉด ํ์ชฝ๋ง ๋ฐ๋์ด ๋ฒํผ ์ค๊ธฐ๊ฐ ์ด๊ธ๋๋ค |
|
|
39
|
+
| ์ ์ฑ
๋งํฌ ํฐ์น | `control.minTouchTarget` | ๊ธ์ ๋์ด๋ง ๋๋ฅผ ์ ์์ผ๋ฉด 44pt์ ๋ชป ๋ฏธ์น๋ค |
|
|
40
|
+
|
|
41
|
+
## ์ด ๊ณ์ฝ์ ์๋ ๊ฒ
|
|
42
|
+
|
|
43
|
+
- **๋ฌธ๊ตฌ ์ ๋ถ** โ ํ๊ทธ๋ผ์ธยท์ค๋ช
ยท๋์ ๊ณ ์งยท๋ฒํผ ๋ผ๋ฒจ. ์ ํ์ด ์ง์ญํํด์ ๋๊ธด๋ค.
|
|
44
|
+
- **๋งํฌ ์์ฐ** โ ์ฌ๋กฏ์ผ๋ก ๋ฐ๋๋ค.
|
|
45
|
+
- **์ ๊ณต์ ๋ชฉ๋ก๊ณผ ์์** โ ์๋ฒ๊ฐ ์ ๋ณธ์ธ ์ ํ์ด ์์ด HJM์ด ์ ํ ์ ์๋ค.
|
|
46
|
+
- **์ ์ฑ
๋งํฌ์ ๋ชฉ์ ์ง** โ ์ ํ์ ๊ฒ์ ์ฃผ์๋ค.
|
|
47
|
+
- **์ธ์ฆ ํ๋ฆ** โ ์์ยท์ทจ์ยท์ฌ๊ฐยท์ธ์
. ํ๋ฉด ๊ณจ๊ฒฉ๊ณผ ๋ฌด๊ดํ๋ค.
|
|
48
|
+
- **`main`์ ๋ฌด์์ด ๋ค์ด๊ฐ๋์ง** โ ์ ๊ณต์ ๋ฒํผ๋ง ๋ฃ๋ ์ ํ๋, ๊ฐ์
์ฌ๊ฐยท์ฌ์ฌ์ ์
๋ ฅ ๊ฐ์
|
|
49
|
+
์ ํ ๋ฉ์ด๋ฆฌ๋ฅผ ํต์งธ๋ก ๋ฃ๋ ์ ํ๋ ์๋ค. ๊ทธ ์ฐจ์ด๋ฅผ ์ฌ๋กฏ์ผ๋ก ๋๋๋ ค ๋ฐ์ผ๋ฉด ์ด๋ฆ๋ง ๋ถ์
|
|
50
|
+
Stack์ด ๋๋ฏ๋ก, ์์ ์ด์ด ๋๋ค.
|
|
51
|
+
|
|
52
|
+
## ํ๋ซํผ ๋ฒ์ญ
|
|
53
|
+
|
|
54
|
+
| | Web | Native |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| ๋ฟ๋ฆฌ ์์ | `<main class="hjm-auth-screen">` + ์ธ๋ผ์ธ custom property | `ScrollView` + `contentContainerStyle.flexGrow: 1` |
|
|
57
|
+
| ์ธ๋ก ์ค์ | `flex: 1` ๋ธ๋ก์ `justify-content: center` | ๊ฐ์ ๊ตฌ์กฐ๋ฅผ `View`์ `flex: 1`๋ก |
|
|
58
|
+
| ์คํฌ๋กค ์ ํ | `min-block-size: 100dvh` + ์์ฐ ์คํฌ๋กค | `ScrollView`๊ฐ ๋ด์ฉ์ด ๊ธธ ๋๋ง ์คํฌ๋กค |
|
|
59
|
+
| ์์น ์ ๋ฌ | ํด์๋ ๊ฐ์ CSS ๋ณ์๋ก โ ์คํ์ผ์ํธ์ ๊ณ์ฝ์ด ์ด๊ธ๋ ์ ์๋ค | ์ธ๋ผ์ธ ์คํ์ผ |
|
|
60
|
+
|
|
61
|
+
## ๊ฒ์ฆ ํ๋ฉด
|
|
62
|
+
|
|
63
|
+
์์ง ์์. ์๋น ์ ํ(๋ฒ๋ยท๋ค์๋ฆฌ)์ ๋ก๊ทธ์ธ ํ๋ฉด์ ์ด ๊ณจ๊ฒฉ์ผ๋ก ์ฎ๊ธฐ๋ ์์
์ด ๋จ์ ์๊ณ ,
|
|
64
|
+
Showcase canonical preview์ 6์ข
evidence(defaultยทdarkยทlong copyยทlarge textยทRTLยทreduced motion)๋
|
|
65
|
+
์์ง์ด๋ค. ํ์ฌ ์ํ๋ **๊ณ์ฝยท๋ ๋๋ฌยทํ
์คํธ๊น์ง**๋ค.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# BottomInfo contract
|
|
2
|
+
|
|
3
|
+
**๋ฌธ์ .** ์ฃผ ํ๋ **์๋** ๋ถ๋ ์์ ์๋ด โ "๊ฐ์
ํ๋ฉด ์ฝ๊ด์ ๋์ํ๋ ๊ฒ์ผ๋ก ๋ด
๋๋ค",
|
|
4
|
+
"์์๋ฃ๋ ๊ฒฐ์ ์์ ์ ํ์ ๋ฉ๋๋ค". ํ ์ค TDS์ BottomInfo์ ๊ฐ์ ์๋ฆฌ๋ค.
|
|
5
|
+
|
|
6
|
+
**Notice์ ๋ค๋ฅด๋ค.** Notice๋ **์ง๊ธ ์๊ธด ์ํ**๋ฅผ ์๋ฆฐ๋ค(์ค๋ฅยท์ฑ๊ณตยท๊ฒฝ๊ณ ). BottomInfo๋
|
|
7
|
+
ํ๋ฉด์ ๋ ์๋ **์กฐ๊ฑด**์ด๋ค. ๊ทธ๋์ tone์ danger/success๊ฐ ์๊ณ , ์์ด์ฝ์ด ์๊ณ ,
|
|
8
|
+
`role="status"`๋ ์๋ค โ ์ํ ๋ณํ๋ก ๋ฐํํ๋ฉด ์ฌ์ฉ์๊ฐ ๋งค๋ฒ "๋ฌด์จ ๋ฌธ์ ๊ฐ ์๊ฒผ๋" ํ๊ณ
|
|
9
|
+
์ฝ๊ฒ ๋๋ค. ๋ ๋จ๊ณ(`muted`/`emphasis`)๋ง ๋๋ ์ด์ ๋ ๊ฐ๋ค: ๊ฐ์กฐ๋ ์์ด๋ ๊ฒฝ๋ณด๋ ์๋ค.
|
|
10
|
+
|
|
11
|
+
**ํ ์ค๊ณผ ์ฌ๋ฌ ์ค์ด ๋ค๋ฅด๊ฒ ์ฝํ๋ค.** ํ ์ค์ ๋ฌธ์ฅ, ์ฌ๋ฌ ์ค์ ๋ชฉ๋ก์ด๋ค. ํ ์ค์ ์ ์
|
|
12
|
+
์ฐ์ผ๋ฉด ์คํ๋ ค ์๋๋ฌ์์ `listMarkerFrom`์ผ๋ก ๊ฒฝ๊ณ๋ฅผ ๊ณ์ฝ์ ์ ์๋ค.
|
|
13
|
+
|
|
14
|
+
**๋ฌธ์ฅ ์์ ๋งํฌ๋ ์ ํ ๊ฒ์ด๋ค.** ์ฝ๊ด ๋งํฌ์ ์ฃผ์ยท๋ผ์ฐํ
์ ์ ํ์ด ์์ ํ๋ฏ๋ก
|
|
15
|
+
`renderItem`์ผ๋ก ๊ทธ ์ค๋ง ๋์ฒดํ๋ค.
|
package/docs/breadcrumb.md
CHANGED
|
@@ -28,8 +28,7 @@ Breadcrumb๋ ์ href ๊ฐ๋
์ ๋ง๋ค์ง ์์ต๋๋ค. ์กฐ์ ํญ๋ชฉ์ `desti
|
|
|
28
28
|
`LinkDestination`(`internal | external`) ํ์
๊ทธ๋๋ก์ด๊ณ , `validateBreadcrumbDescriptor`๋
|
|
29
29
|
๊ฐ ์กฐ์ ํญ๋ชฉ๋ง๋ค `validateLinkDestination`์ ๊ทธ๋๋ก ํธ์ถํฉ๋๋ค. ๊ทธ๋์ internal href๊ฐ
|
|
30
30
|
`/`, `?`, `#`๋ก ์์ํด์ผ ํ๋ค๊ฑฐ๋ external href๊ฐ ํ์ฉ๋ protocol๋ง ์จ์ผ ํ๋ค๋ ๊ท์น์
|
|
31
|
-
Link ๋ฌธ์(`docs/link.md`)๊ฐ ์ ์ผํ ์ถ์ฒ์
๋๋ค. Breadcrumb ์กฐ์ ํญ๋ชฉ์ Web
|
|
32
|
-
anchor, Native๊ฐ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ด๋ค๋ฉด Expo Router Link๋ก ๋ ๋๋ง๋ ํญ๋ชฉ์ด๋ผ๋ ๋ป์ด๋ฉฐ,
|
|
31
|
+
Link ๋ฌธ์(`docs/link.md`)๊ฐ ์ ์ผํ ์ถ์ฒ์
๋๋ค. Breadcrumb ์กฐ์ ํญ๋ชฉ์ Web์ ์ค์ anchor๋ก ๋ ๋๋งํ๋ฉฐ,
|
|
33
32
|
`Link`์ `disabled`/`onClick`/`onPress` ๊ธ์ง ๊ท์น๋ ๊ทธ๋๋ก ์์ํฉ๋๋ค.
|
|
34
33
|
|
|
35
34
|
## HJM ๊ธฐ๋ณธ๊ฐ
|
|
@@ -38,14 +37,13 @@ anchor, Native๊ฐ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ด๋ค๋ฉด Expo Router Link๋ก ๋ ๋๋ง๋
|
|
|
38
37
|
- ๊ตฌ๋ถ์(`/`, `โบ`)๋ ์ ๋ณด๊ฐ ์๋๋ผ ์ฅ์์
๋๋ค. `breadcrumbRecipe.separator.decorative`๋
|
|
39
38
|
ํญ์ `true`์ด๊ณ renderer๋ ์ด๋ฅผ ์ ๊ทผ์ฑ ํธ๋ฆฌ์์ ์จ๊น๋๋ค(Web `aria-hidden`, ์คํฌ๋ฆฐ
|
|
40
39
|
๋ฆฌ๋๋ ์์๋ง ๋ฃ์ต๋๋ค).
|
|
41
|
-
- ๊ตฌ๋ถ์
|
|
42
|
-
|
|
40
|
+
- ๊ธฐ๋ณธ ๊ตฌ๋ถ์ `โบ`๋ง RTL์์ ๋ฏธ๋ฌ๋งํฉ๋๋ค. `separator`๋ก ์ ๋ฌํ Icon์ด๋ ๋ฌธ์๋ ์๋น์๊ฐ
|
|
41
|
+
๋ฐฉํฅ์ ์์ ํ๋ฏ๋ก ๋ค์ ๋ค์ง์ง ์์ต๋๋ค. `separator={null}`์ ๊ตฌ๋ถ์๋ฅผ ์จ๊น๋๋ค.
|
|
43
42
|
- **์ถ์ฝ(`...`)์ ๋ฃ์ง ์์ต๋๋ค.** ํญ๋ชฉ์ด ๋ง์ ๋ ๊ฐ์ด๋ฐ๋ฅผ ์ ๋ ๊ฒ์ ์ค์ ํ๋ฉด์์
|
|
44
43
|
์ธก์ ๋ ์์๊ฐ ์์ง ์์ต๋๋ค. ํ์ํด์ง๋ฉด ๋ณ๋ `collapsed` ์ถ์ผ๋ก ๋ช
์์ ์ผ๋ก ์ถ๊ฐํ๊ณ ,
|
|
45
44
|
์ง๊ธ์ renderer๊ฐ ์ ์ฒด trail์ ๊ทธ๋๋ก ๊ทธ๋ฆฝ๋๋ค.
|
|
46
45
|
- ํฌ๊ธฐ๋ Link์ inline ์ทจ๊ธ์ ๋ฐ๋ฆ
๋๋ค โ 44-unit ์ต์ target์ ๊ฐ์ ํ์ง ์๊ณ ๋ฐ์ค๊ณผ
|
|
47
|
-
focus indicator๋ง ์ ์งํฉ๋๋ค.
|
|
48
|
-
standalone Link์ฒ๋ผ ํ๋์ฉ ๋ณ๋ target์ผ๋ก ์ฐ๊ธฐ๋ณด๋ค, ์ด์ดํ ํ ์ค trail๋ก ๋ฐฐ์น๋ฉ๋๋ค.
|
|
46
|
+
focus indicator๋ง ์ ์งํฉ๋๋ค. ๊ธด ๊ฒฝ๋ก๋ ์ค๋ฐ๊ฟํ๊ณ ์ ์ฒด ํญ๋ชฉ์ ์ ์งํฉ๋๋ค. ๋งํฌ์ ๋ฐ์ค๊ณผ focus indicator๋ ์ ์งํฉ๋๋ค.
|
|
49
47
|
|
|
50
48
|
## ํ๋ซํผ ๋ฒ์ญ โ ์ Web ์ ์ฉ์ธ๊ฐ
|
|
51
49
|
|
|
@@ -70,13 +68,15 @@ Web์์๋:
|
|
|
70
68
|
๊ฐ์ ธ์ค๋ฏ๋ก Breadcrumb ์์ฒด๊ฐ ์ ํค๋ณด๋ ์ํธ์์ฉ์ ์ ์ํ์ง ์์ต๋๋ค.
|
|
71
69
|
- ํ์ฌ ํญ๋ชฉ์ tab stop์ด ์๋๊ณ `aria-current="page"`๋ง ๊ฐ์ต๋๋ค.
|
|
72
70
|
|
|
73
|
-
## ๊ฒ์ฆ
|
|
71
|
+
## ๊ณต๊ฐ ๊ฒฝ๋ก์ ๊ฒ์ฆ
|
|
74
72
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
73
|
+
`import { Breadcrumb } from "@hjmds/react/breadcrumb"`๋ก ๊ฐ์ ธ์ต๋๋ค. root์ ๊ธฐ์กด navigation
|
|
74
|
+
๊ฒฝ๋ก๋ ์ ์งํฉ๋๋ค. ํ์ props๋ `label`, `items`์ด๊ณ `ref`๋ nav ์์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
|
|
75
|
+
|
|
76
|
+
2026-09-16 ์ฌ์ฉ์์ React/RN ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฅ ์์ฒญ์ผ๋ก, ์ ํ ์ฑํ ๋๊ธฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ beta
|
|
77
|
+
์ ๊ณต์ ๋ถ๋ฆฌํ์ต๋๋ค. `Patterns/WebNavigation`์ ์กฐ์ ๋งํฌ๋ก ๋ณด๊ดํจ์ ์ด๊ณ ๋ค์ ๊ธฐ๋ก ๋ชฉ๋ก์ผ๋ก
|
|
78
|
+
๋์์ค๋ ์๋ ์์ ์
๋๋ค. ์ ํ ์ฑํ์ด๋ stable ์ฆ๊ฑฐ๋ก ๊ณ์ฐํ์ง ์์ต๋๋ค.
|
|
79
|
+
|
|
80
|
+
[WAI Breadcrumb](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/)์ landmarkยท์กฐ์ ๋งํฌยท
|
|
81
|
+
ํ์ฌ ์์น ์๋ฏธ๋ฅผ ํ์ธํ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ํ
์คํธ๋ ์ค์ anchor, ํ์ฌ plain text, ์ฅ์ ๊ตฌ๋ถ์,
|
|
82
|
+
320px/2๋ฐฐ ๊ธ์ยทRTL ์ค๋ฐ๊ฟ์ ๋ค๋ฃน๋๋ค. ์ค์ ์ ํ ๋ผ์ฐํ
ยท๋ณด์กฐ๊ธฐ๊ธฐ ๊ฒ์ฆ์ ๋จ์ ์์ต๋๋ค.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# ๋ฒํผ ๋ผ๋ฒจ ์ค๋ฐ๊ฟ ์ ์ฑ
|
|
2
|
+
|
|
3
|
+
**๋ฌธ์ .** ๊ธด ๋ผ๋ฒจ์ ์ฒ๋ฆฌ ๊ท์น์ด recipe์ ์์ด์ Web์ ๋ฌดํํ ์ค๋ฐ๊ฟํ๊ณ Native๋ ํ ์ค๋ก
|
|
4
|
+
์๋ ธ๋ค. **๊ฐ์ ๋ฒ์ญ๋ฌธ์ด ๋ ํ๋ฉด์์ ๋ค๋ฅด๊ฒ ๋ณด์๋ค.**
|
|
5
|
+
|
|
6
|
+
**๊ท์น.** ์๋ฅด์ง ์๊ณ **๋ ์ค๊น์ง ์ ๋๋ค**(`buttonRecipe.label.maxLines = 2`).
|
|
7
|
+
|
|
8
|
+
- **์๋ฅด์ง ์๋ ์ด์ **: ์๋ฆฐ ํ๋ ๋ผ๋ฒจ("์ญ์ ํโฆ")์ ๋ฌด์์ ํ๋ ๋ฒํผ์ธ์ง ์๋๋ค. ๋งํฌ
|
|
9
|
+
ํ
์คํธ๋ ๋ณธ๋ฌธ๊ณผ ๋ฌ๋ฆฌ ๋ฒํผ ๋ผ๋ฒจ์ ๊ทธ ์์ฒด๊ฐ ํ๋์ ์ ์๋ค.
|
|
10
|
+
- **๋ฌดํํ ๋๋ฆฌ์ง ์๋ ์ด์ **: ํ๋จ CTA ํ์ฒ๋ผ ๋ฒํผ์ด ๋จ์ ๋ ์ด์์์ ๋ฐ์ด๋ด๋ ์๋ฆฌ๊ฐ
|
|
11
|
+
์๋ค. ๋ ์ค์ ๋๋ ๋ผ๋ฒจ์ ๋ ์ด์์์ด ์๋๋ผ **์นดํผ์ ๋ฌธ์ **์ด๊ณ , ๊ทธ ์ ํธ๋ฅผ ํ๋ฉด์ด
|
|
12
|
+
์ฃผ๋ ํธ์ด ๋ซ๋ค.
|
|
13
|
+
|
|
14
|
+
**ํฐ ๊ธ์ ์ค์ ์์๋ ์ํ์ ํผ๋ค**(`liftCapOnLargeText`). ์ฌ์ฉ์๊ฐ ํค์ด ๊ธ์์์ ๋ ์ค๋ก
|
|
15
|
+
์๋ฅด๋ฉด ๋ด์ฉ์ด ์ฌ๋ผ์ง๊ณ ๊ทธ๊ฑด WCAG 1.4.4๋ค. ์ ํ ์นดํผ๊ฐ ์๋๋ผ ์ฌ์ฉ์ ์ค์ ์ด ์์ธ์ด๋ฏ๋ก
|
|
16
|
+
๊ฐ์ ๊ท์น์ ์ ์ฉํ ์ ์๋ค. `resolveButtonLabelLines(largeText)`๊ฐ ์ด ํ์ ์ ๊ฐ๊ณ ,
|
|
17
|
+
Web์ `-webkit-line-clamp`, Native๋ `numberOfLines`๋ก ๊ฐ์ ๋ต์ ์ด๋ค.
|
|
18
|
+
|
|
19
|
+
**์ซ์๋ recipe์๋ง ์๋ค.** ์คํ์ผ์ํธ๋ `--hjm-button-label-lines`๋ฅผ ์ฝ๊ณ ๋ ๋๋ฌ๊ฐ ๊ทธ
|
|
20
|
+
๋ณ์๋ฅผ recipe์์ ์ฑ์ด๋ค โ ๋ ๋ฒ์ด ๋๋ฉด ์ธ์ ๊ฐ ์ด๊ธ๋๋ค.
|