@iyulab/components 1.43.0 โ†’ 1.44.1

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.
Files changed (43) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/dist/_virtual/_glob-assets_raw/dark.css.e8ac080d.js +1 -1
  3. package/dist/assets/locales/ar.json.js +6 -2
  4. package/dist/assets/locales/de.json.js +6 -2
  5. package/dist/assets/locales/en.json.js +6 -2
  6. package/dist/assets/locales/es.json.js +6 -2
  7. package/dist/assets/locales/fr.json.js +6 -2
  8. package/dist/assets/locales/id.json.js +6 -2
  9. package/dist/assets/locales/ja.json.js +5 -2
  10. package/dist/assets/locales/ko.json.js +6 -2
  11. package/dist/assets/locales/pt-BR.json.js +6 -2
  12. package/dist/assets/locales/ru.json.js +6 -2
  13. package/dist/assets/locales/th.json.js +6 -2
  14. package/dist/assets/locales/vi.json.js +6 -2
  15. package/dist/assets/locales/zh-CN.json.js +6 -2
  16. package/dist/assets/locales/zh-TW.json.js +6 -2
  17. package/dist/components/UOverlayElement.d.ts +7 -1
  18. package/dist/components/UOverlayElement.js +1 -1
  19. package/dist/components/breadcrumb-item/UBreadcrumbItem.js +1 -0
  20. package/dist/components/date-picker/UDatePicker.js +1 -0
  21. package/dist/components/input/UInput.js +2 -1
  22. package/dist/components/menu-item/UMenuItem.js +5 -1
  23. package/dist/components/popover/UPopover.d.ts +10 -0
  24. package/dist/components/popover/UPopover.js +3 -1
  25. package/dist/components/radio/URadio.js +1 -0
  26. package/dist/components/rating/URating.js +1 -0
  27. package/dist/components/select/USelect.d.ts +8 -0
  28. package/dist/components/select/USelect.js +6 -1
  29. package/dist/components/tab/UTab.d.ts +2 -0
  30. package/dist/components/tab/UTab.js +7 -0
  31. package/dist/components/tree-item/UTreeItem.js +5 -1
  32. package/dist/styles/dark.css +72 -47
  33. package/dist/utilities/Dialog.d.ts +2 -2
  34. package/dist/utilities/Dialog.js +5 -4
  35. package/dist/utilities/Locale.d.ts +1 -1
  36. package/dist/utilities/Theme.d.ts +18 -0
  37. package/dist/utilities/Theme.js +25 -2
  38. package/package.json +1 -1
  39. package/skills/iyulab-components/SKILL.md +7 -0
  40. package/skills/iyulab-components/references/components/popover.md +12 -0
  41. package/skills/iyulab-components/references/extensions/overlay.md +3 -1
  42. package/skills/iyulab-components/references/utilities/dialog.md +2 -2
  43. package/skills/iyulab-components/references/utilities/theme.md +6 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,99 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.44.1] - 2026-09-23
4
+
5
+ ### Fixed
6
+
7
+ - ๐Ÿ”ด **A closed popover no longer consumes `Escape`.** A popover with `escape` in its `dismiss`
8
+ list listens on the document from the moment it connects, and it called `preventDefault()`
9
+ whether or not it was open. Every form control carries a popover, so on any real screen a
10
+ document-level `Escape` always arrived already `defaultPrevented` โ€” and `defaultPrevented` is
11
+ exactly the signal you need to tell whether an inner layer handled the key. Now only an open
12
+ popover consumes it. A popover waiting on `showDelay` still has its pending show cancelled, but
13
+ the key is not consumed because nothing was visible yet. A closed popover also ignores document
14
+ clicks instead of running `hide()` on every click.
15
+ - **`u-input` no longer consumes `Escape` while its suggestion list is closed.**
16
+ - **`u-select` returns focus to the combobox when its list closes with focus inside it.** Closing
17
+ the list with `Escape` or choosing an option with the keyboard left focus inside the hidden
18
+ list, where keyboard users lost their place and the next `Escape` was swallowed again. Closing
19
+ by clicking elsewhere does not move focus.
20
+ - **Dialogs and drawers ignore an `Escape` that something inside them already consumed.** With an
21
+ open list inside a dialog, one press used to close both. Now the first press closes the list and
22
+ the second closes the dialog โ€” one press, one layer.
23
+ - ๐Ÿ”ด **`disabled` is now exposed to assistive technology on controls whose role sits on a
24
+ non-native node.** These controls blocked interaction but never said so: screen readers
25
+ announced nothing, and test tools that check actionability treated the control as enabled,
26
+ clicked it, and had the click silently swallowed. `aria-disabled="true"` is now set on the
27
+ `combobox` of `u-select` and `u-date-picker`, the `radiogroup` of `u-radio` and `u-rating`,
28
+ the host of `u-menu-item`, `u-tab` and `u-tree-item`, and the link of `u-breadcrumb-item`.
29
+
30
+ - ๐Ÿ”ด **In dark mode, a `:root` override of the scale tokens now wins, as it does in light.**
31
+ `dark.css` redeclared radius, spacing, the type scale, motion and fonts โ€” with the same values as
32
+ `light.css` โ€” under `:root[theme="dark"]`, which outranks `:root`. So every layer that sets those
33
+ tokens on `:root` (the `@iyulab/enterprise` preset, a brand sheet) lost in dark mode regardless
34
+ of load order. Colors still switched, so dark mode *looked* fine while the type scale and radius
35
+ quietly fell back to neutral. Those tokens now sit in a `:root:where([theme="dark"])` block, at
36
+ the same specificity as `:root`. `dark.css` still defines every token, so a fixed-dark screen
37
+ that loads only that sheet is unaffected. **No visual change** for anyone not overriding them.
38
+ - ๐Ÿ”ด **`prefers-reduced-motion` is honoured in dark mode.** The durations were among the tokens
39
+ redeclared at the higher specificity, so `light.css`'s reduced-motion rule lost to them and
40
+ animations kept running for users who asked for less motion. `dark.css` now carries the same
41
+ rule for itself.
42
+
43
+ - **`Dialog.confirm` and `Dialog.prompt` label their buttons in the active locale.** The defaults
44
+ were the English literals `Cancel` and `Confirm`, so an app that had switched `Locale` got
45
+ English buttons under a translated message, while every other built-in label in this package
46
+ already followed the locale. `confirm` and `cancel` are now in all fourteen built-in tables;
47
+ labels you pass explicitly still win, and English is unchanged.
48
+
49
+ โš  **If you close your own panel on `Escape`**, you can now guard it with `event.defaultPrevented`
50
+ the way the platform intends; you no longer need to inspect which popovers are open. **If a test
51
+ locates a control by tag and expects a click on a disabled one to be attempted**, it will now
52
+ wait instead โ€” locate by role.
53
+
54
+ ### Documentation
55
+
56
+ - The popover and overlay references state the `Escape` contract, with the guard a consumer
57
+ panel should use. The skill index states where `disabled` is exposed for each control.
58
+ - `docs/theming.md` says which tokens a `:root` override reaches in dark mode, and how to
59
+ override a color there too.
60
+
61
+ ## [1.44.0] - 2026-09-22
62
+
63
+ ### Fixed
64
+
65
+ - ๐Ÿ”ด **`Theme.init()` no longer overrides styles the document already has.** The built-in token
66
+ sheets were appended to the end of `<head>`. A consumer stylesheet declaring the same `--u-*`
67
+ tokens on `:root` is placed by the bundler while the document parses, so the runtime append
68
+ always came *after* it โ€” and at equal specificity the later rule wins. The result was that the
69
+ built-in defaults silently overrode whatever the consumer had set, with no error and no
70
+ warning. Where the two sheets agreed on some values and differed on others, it read as
71
+ *partially applied* rather than as ignored, which is harder to notice than an outright failure.
72
+ - **The sheets are a defaults layer, so they now go in front of the document's other styles.**
73
+ They are inserted ahead of the first `<style>`/`<link rel=stylesheet>` โ€” not pushed past
74
+ `<meta>` and friends โ€” and their order relative to each other is preserved rather than
75
+ reversed. If a document has no stylesheets at all, they are appended as before; anything added
76
+ later still comes after them, which is the point.
77
+
78
+ โš  **If you relied on the old behavior** โ€” that is, on the built-in values winning over a sheet
79
+ you loaded yourself โ€” you no longer need to; load order now works the way `:root` at equal
80
+ specificity implies. Nothing changes for consumers who never override these tokens.
81
+
82
+ ### Documentation
83
+
84
+ - **`docs/theming.md` no longer tells you to sequence your override after `Theme.init()`.** That
85
+ instruction existed because of the behavior above, and it outlived it by exactly one release
86
+ otherwise. The Custom Themes section now says a plain static `import` is enough, states what
87
+ changed for anyone still on an older version, and keeps the one rule that *does* still decide
88
+ the outcome: specificity. `How Theme Switching Works` says where the sheets are inserted, not
89
+ just that they are.
90
+ - The same note is in the skill reference for `Theme`, which is where an assistant reads it.
91
+
92
+ ### Notes
93
+
94
+ - The regression measures computed values in a real browser. Asserting where a node was inserted
95
+ would describe placement, not the cascade, and the contract here is the cascade.
96
+
3
97
  ## [1.43.0] - 2026-09-22
4
98
 
5
99
  ### Added
@@ -1,4 +1,4 @@
1
1
  //#region \0glob-assets_raw/dark.css.e8ac080d
2
- var dark_css_default = ":root[theme=\"dark\"] {\n color-scheme: dark;\n\n /* Neutral Colors */\n --u-neutral-0: #000000;\n --u-neutral-50: #0A0A0A;\n --u-neutral-100: #121212;\n --u-neutral-200: #1E1E1E;\n --u-neutral-300: #2A2A2A;\n --u-neutral-400: #3D3D3D;\n --u-neutral-500: #525252;\n --u-neutral-600: #6E6E6E;\n --u-neutral-700: #8A8A8A;\n --u-neutral-800: #B0B0B0;\n --u-neutral-900: #D4D4D4;\n --u-neutral-1000: #FFFFFF;\n\n /* Blue Colors */\n --u-blue-0: #030D1A;\n --u-blue-100: #061629;\n --u-blue-200: #0A223B;\n --u-blue-300: #103150;\n --u-blue-400: #174167;\n --u-blue-500: #205281;\n --u-blue-600: #2A659D;\n --u-blue-700: #3678B8;\n --u-blue-800: #478DCE;\n --u-blue-900: #5DA2DF;\n --u-blue-1000: #79BBEA;\n\n /* Green Colors */\n --u-green-0: #06140C;\n --u-green-100: #0A2114;\n --u-green-200: #10301D;\n --u-green-300: #164228;\n --u-green-400: #1F5535;\n --u-green-500: #2A6942;\n --u-green-600: #367E50;\n --u-green-700: #4A9563;\n --u-green-800: #63AB7A;\n --u-green-900: #80BE97;\n --u-green-1000: #9BCFB1;\n\n /* Yellow Colors */\n --u-yellow-0: #1C1300;\n --u-yellow-100: #2D1E00;\n --u-yellow-200: #402B00;\n --u-yellow-300: #553900;\n --u-yellow-400: #6B4900;\n --u-yellow-500: #825A00;\n --u-yellow-600: #9A6C00;\n --u-yellow-700: #B08012;\n --u-yellow-800: #C69635;\n --u-yellow-900: #D9AD5A;\n --u-yellow-1000: #E8C57F;\n\n /* Red Colors */\n --u-red-0: #1C0707;\n --u-red-100: #2C0B0B;\n --u-red-200: #3E1111;\n --u-red-300: #541818;\n --u-red-400: #6C2020;\n --u-red-500: #852A2A;\n --u-red-600: #A13535;\n --u-red-700: #B94949;\n --u-red-800: #CB6262;\n --u-red-900: #D98383;\n --u-red-1000: #E7A2A2;\n\n /* Orange Colors */\n --u-orange-0: #1D0E00;\n --u-orange-100: #2F1700;\n --u-orange-200: #421F00;\n --u-orange-300: #582A00;\n --u-orange-400: #703600;\n --u-orange-500: #8A4500;\n --u-orange-600: #A55600;\n --u-orange-700: #BD6A18;\n --u-orange-800: #D1823C;\n --u-orange-900: #E19D67;\n --u-orange-1000: #EDB992;\n\n /* Teal Colors */\n --u-teal-0: #041411;\n --u-teal-100: #07201B;\n --u-teal-200: #0B2E28;\n --u-teal-300: #10403A;\n --u-teal-400: #16544D;\n --u-teal-500: #1E6860;\n --u-teal-600: #297D74;\n --u-teal-700: #3A9389;\n --u-teal-800: #54A89F;\n --u-teal-900: #73BBB3;\n --u-teal-1000: #93CBC5;\n\n /* Cyan Colors */\n --u-cyan-0: #041318;\n --u-cyan-100: #071F29;\n --u-cyan-200: #0B2D3A;\n --u-cyan-300: #104050;\n --u-cyan-400: #165469;\n --u-cyan-500: #1E6A82;\n --u-cyan-600: #287F9C;\n --u-cyan-700: #3995B5;\n --u-cyan-800: #53AACC;\n --u-cyan-900: #73BEDD;\n --u-cyan-1000: #95CFE8;\n\n /* Purple Colors */\n --u-purple-0: #150A22;\n --u-purple-100: #220F36;\n --u-purple-200: #31164B;\n --u-purple-300: #432064;\n --u-purple-400: #572B80;\n --u-purple-500: #6C379C;\n --u-purple-600: #8245B7;\n --u-purple-700: #975BCB;\n --u-purple-800: #AB79D9;\n --u-purple-900: #BD99E2;\n --u-purple-1000: #CEB8EA;\n\n /* Pink Colors */\n --u-pink-0: #1F0A14;\n --u-pink-100: #310F20;\n --u-pink-200: #451532;\n --u-pink-300: #5C1D45;\n --u-pink-400: #74285A;\n --u-pink-500: #8F336F;\n --u-pink-600: #AB4187;\n --u-pink-700: #C0569D;\n --u-pink-800: #D174B3;\n --u-pink-900: #E095C7;\n --u-pink-1000: #EBB5D9;\n\n /* ==========================================================================\n Role Colors โ€” ์˜๋ฏธ ์—ญํ•  ์ธต\n ์ปดํฌ๋„ŒํŠธ๋Š” ํŒ”๋ ˆํŠธ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด ์ธต์„ ์ฐธ์กฐํ•œ๋‹ค.\n ๋ธŒ๋žœ๋“œ ์ƒ‰ ๊ต์ฒด๋Š” ์•„๋ž˜ 25๊ฐœ๋งŒ ์žฌ์ •์˜ํ•˜๋ฉด ์‹œ๋งจํ‹ฑ ์ธต๊นŒ์ง€ ๋”ฐ๋ผ์˜จ๋‹ค.\n\n ๋‹จ์€ '๊ฐ•๋„' ์ถ•์ด๋‹ค (weakest -> strong). ์šฉ๋„(๋ฐฐ๊ฒฝ/ํ…Œ๋‘๋ฆฌ/ํ…์ŠคํŠธ)๋Š”\n ์†Œ๋น„์ฒ˜๊ฐ€ ์ •ํ•œ๋‹ค -- ๋‹จ์„ ์†์„ฑ์— ๋ฌถ์œผ๋ฉด primary ๋ฒ„ํŠผ์˜ ๋ฐฐ๊ฒฝ์ด ์–ด๋А\n ๋‹จ์ธ์ง€ ๊ฐ™์€ ๋ชจ์ˆœ์ด ์ƒ๊ธด๋‹ค.\n\n โ˜…**๋‹ค๋งŒ ๋‘ ๋‹จ์€ ์šฉ๋„๊ฐ€ ํ™•์ •๋ผ ์žˆ๋‹ค** โ€” ๋Œ€๋น„ ์š”๊ตฌ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.\n `-color` = **๋ฉด**. `--u-*-txt-color` ๊ฐ€ ๊ทธ ์œ„์— ์–นํžˆ๋ฏ€๋กœ on-color ๊ธฐ์ค€ 4.5.\n `-strong` = **๊ธ€์žยท์•„์ด์ฝ˜**. `--u-bg-color` ์œ„์— ๋†“์ด๋ฏ€๋กœ ๋ฐ”ํƒ• ๊ธฐ์ค€ 4.5.\n ๋ผ์ดํŠธ์—์„œ๋Š” ๋ฐ”ํƒ•๋„ on-color ๋„ ํฐ์ƒ‰์ด๋ผ ๋‘ ์š”๊ตฌ๊ฐ€ ํ•œ ์กฐ๊ฑด์œผ๋กœ ํ•ฉ์ณ์ง€์ง€๋งŒ,\n **๋‹คํฌ์—์„œ๋Š” ์ •๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ**์ด๋‹ค(๋ฐ”ํƒ• #121212 ยท on-color #FFFFFF). ๋ฐ”ํƒ•์—์„œ ์ฝํžˆ๋Š”\n ๋ฐ์€ ๋‹จ์€ ํฐ ๊ธ€์ž๋ฅผ ๋ชป ๋ฐ›๊ณ , ํฐ ๊ธ€์ž๋ฅผ ๋ฐ›๋Š” ์–ด๋‘์šด ๋‹จ์€ ๋ฐ”ํƒ•์—์„œ ์•ˆ ์ฝํžŒ๋‹ค.\n โ‡’ ๋‹คํฌ์—์„œ `-color` ์™€ `-strong` ์ด ๋‘ ๋‹จ ๋ฒŒ์–ด์ง€๋Š” ๊ฒƒ์ด ๊ทธ ๊ฒฐ๊ณผ๋‹ค.\n `tests/build/token-contrast.test.ts` ๊ฐ€ ๊ฐ’์„ ์ง€ํ‚จ๋‹ค.\n ========================================================================== */\n\n /* primary โ€” ๋ธŒ๋žœ๋“œ ยท ๊ฐ•์กฐ ยท ํฌ์ปค์Šค ยท ๋งํฌ */\n --u-primary-color-weakest: var(--u-blue-200);\n --u-primary-color-weaker: var(--u-blue-300);\n --u-primary-color-weak: var(--u-blue-500);\n --u-primary-color: var(--u-blue-600); /* ๋ฉด: ํฐ ๊ธ€์ž 6.09 โœ“ */\n --u-primary-color-strong: var(--u-blue-800); /* ๊ธ€์ž: ๋ฐ”ํƒ• 5.32 โœ“ (700 ์€ 4.05 โœ—) */\n\n /* info โ€” ์ •๋ณด ์•ˆ๋‚ด (primary ์™€ ๊ธฐ๋ณธ๊ฐ’์€ ๊ฐ™์œผ๋‚˜ ์—ญํ• ์ด ๋‹ค๋ฅด๋‹ค โ€” ๋ธŒ๋žœ๋”ฉ์€ primary ๋งŒ ๋ฐ”๊พผ๋‹ค) */\n --u-info-color-weakest: var(--u-blue-200);\n --u-info-color-weaker: var(--u-blue-300);\n --u-info-color-weak: var(--u-blue-500);\n --u-info-color: var(--u-blue-600);\n --u-info-color-strong: var(--u-blue-800);\n\n /* success โ€” ์„ฑ๊ณต ยท ์™„๋ฃŒ */\n --u-success-color-weakest: var(--u-green-200);\n --u-success-color-weaker: var(--u-green-300);\n --u-success-color-weak: var(--u-green-500);\n --u-success-color: var(--u-green-600);\n --u-success-color-strong: var(--u-green-700);\n\n /* warning โ€” ์ฃผ์˜ */\n --u-warning-color-weakest: var(--u-yellow-200);\n --u-warning-color-weaker: var(--u-yellow-300);\n --u-warning-color-weak: var(--u-yellow-500);\n --u-warning-color: var(--u-yellow-600);\n --u-warning-color-strong: var(--u-yellow-700);\n\n /* danger โ€” ์˜ค๋ฅ˜ ยท ์œ„ํ—˜ ยท ์œ ํšจ์„ฑ ์‹คํŒจ */\n --u-danger-color-weakest: var(--u-red-200);\n --u-danger-color-weaker: var(--u-red-300);\n --u-danger-color-weak: var(--u-red-500);\n --u-danger-color: var(--u-red-600); /* ๋ฉด: ํฐ ๊ธ€์ž 6.83 โœ“ */\n --u-danger-color-strong: var(--u-red-800); /* ๊ธ€์ž: ๋ฐ”ํƒ• 4.87 โœ“ (700 ์€ 3.67 โœ—) */\n /* ==========================================================================\n Radius Scale โ€” ๋ชจ์„œ๋ฆฌ ๋ฐ˜๊ฒฝ\n ๋ฆฌํ„ฐ๋Ÿด์„ ํฉ๋ฟŒ๋ฆฌ๋ฉด ๊ฐ’์ด ๊ฐˆ๋ฆฐ๋‹ค(์‹ค์ œ๋กœ pill ์ด 999px/9999px ๋‘ ํ‘œ๊ธฐ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์—ˆ๋‹ค).\n ========================================================================== */\n --u-radius-none: 0;\n --u-radius-sm: 3px;\n --u-radius-md: 4px;\n --u-radius-lg: 6px;\n --u-radius-xl: 8px;\n /* โ˜…์ƒ๋‹จ 2๋‹จ์€ **๋ฉด(surface)์šฉ**์ด๋‹ค โ€” ์นด๋“œยทํŒจ๋„ยท๋Œ€ํ™”์ƒ์ž์ฒ˜๋Ÿผ ํฐ ์‚ฌ๊ฐํ˜•์€ ์ปจํŠธ๋กค๊ณผ\n ๊ฐ™์€ ๋ฐ˜๊ฒฝ์„ ์“ฐ๋ฉด ๊ฐ์ ธ ๋ณด์ธ๋‹ค. ๊ธฐ์กด 5๋‹จ์€ **์ปจํŠธ๋กค์šฉ**์ด๊ณ  ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค\n (๋ฐ”๊พธ๋ฉด ๋ชจ๋“  ์†Œ๋น„์ž์˜ ๋ฒ„ํŠผยท์ž…๋ ฅ์ด ๋™์‹œ์— ์›€์ง์ธ๋‹ค). */\n --u-radius-2xl: 12px;\n --u-radius-3xl: 16px;\n --u-radius-pill: 9999px;\n --u-radius-circle: 50%;\n\n /* ==========================================================================\n Space Scale โ€” ์ปจํ…Œ์ด๋„ˆยท์˜ค๋ฒ„๋ ˆ์ด์˜ ์ ˆ๋Œ€ ์—ฌ๋ฐฑ\n โš **์—ฌ๋ฐฑ์€ ํ•˜๋‚˜์˜ ์ถ•์ด ์•„๋‹ˆ๋‹ค.** ์ด ์Šค์ผ€์ผ์€ ์ปจํ…Œ์ด๋„ˆ/์˜ค๋ฒ„๋ ˆ์ด์˜ **๋ ˆ์ด์•„์›ƒ ์—ฌ๋ฐฑ**๋งŒ\n ๋‹ด๋‹นํ•œ๋‹ค. ํผยท์ธ๋ผ์ธ ์š”์†Œ์˜ `em` ์—ฌ๋ฐฑ์€ ์ƒ์†๋œ `font-size` ์— ๋น„๋ก€ํ•˜๋Š” ๊ฒƒ์ด ์˜๋„์ด๋ฏ€๋กœ\n **์—ฌ๊ธฐ๋กœ ํก์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋ฐ˜๊ฒฝ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ…Œ๋งˆ์™€ ๋ฌด๊ด€ํ•˜๋ฏ€๋กœ ๋‘ ์‹œํŠธ๊ฐ€ ๊ฐ™๋‹ค.\n ์ถ• ๊ตฌ๋ถ„๊ณผ ๊ทผ๊ฑฐ๋Š” docs/design-tokens.md ์ฐธ์กฐ.\n ========================================================================== */\n --u-space-3xs: 2px;\n --u-space-2xs: 4px;\n --u-space-xs: 6px;\n --u-space-sm: 8px;\n --u-space-md: 12px;\n --u-space-lg: 16px;\n /* โ˜…์ƒ๋‹จ 4๋‹จ์€ **ํ™”๋ฉด ๋ฆฌ๋“ฌ**์ด๋‹ค โ€” ์นด๋“œ ์•ˆ์ชฝ ์—ฌ๋ฐฑ(20~24)ยท์„น์…˜ ๊ฐ„๊ฒฉ(24~32)ยทํŽ˜์ด์ง€ ์—ฌ๋ฐฑ\n (32~40). ์ข…์ „์—๋Š” ์ด ๊ตฌ๊ฐ„์ด ํ†ต์งธ๋กœ ๋น„์–ด ์žˆ์–ด ์†Œ๋น„์ž๊ฐ€ ์ „๋ถ€ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ ์—ˆ๊ณ ,\n ๊ทธ๋ž˜์„œ ์•ฑ๋งˆ๋‹ค ํ™”๋ฉด ๋ฐ€๋„๊ฐ€ ๋‹ฌ๋ผ์กŒ๋‹ค. `lg`(16px) ์ดํ•˜๋Š” **์š”์†Œ ์‚ฌ์ด**, `xl` ์ด์ƒ์€\n **์˜์—ญ ์‚ฌ์ด**๋กœ ๋‚˜๋ˆ  ์“ด๋‹ค.\n โš `xs: 6px` ๋Š” 4px ๊ฒฉ์ž์—์„œ ๋ฒ—์–ด๋‚˜ ์žˆ์œผ๋‚˜ **๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค** โ€” ์ด๋ฏธ ๋ฐฐ์„ ๋œ ์ปจํŠธ๋กค\n ์—ฌ๋ฐฑ์ด ์ „๋ถ€ ์›€์ง์ธ๋‹ค. ์‹ ๊ทœ ๋‹จ์€ ์ „๋ถ€ 4์˜ ๋ฐฐ์ˆ˜๋กœ ๋‘”๋‹ค. */\n --u-space-xl: 20px;\n --u-space-2xl: 24px;\n --u-space-3xl: 32px;\n --u-space-4xl: 40px;\n\n /* Text Colors */\n --u-txt-color: var(--u-neutral-900);\n --u-txt-color-inverse: var(--u-neutral-100);\n\n /* ์œ ์ฑ„์ƒ‰ ๋ฐฐ๊ฒฝ ์œ„์˜ ๊ธ€์ž โ€” warning ๋งŒ ๋‹ค๋ฅด๋‹ค(light.css ์ฐธ์กฐ). */\n --u-primary-txt-color: #FFFFFF;\n --u-info-txt-color: #FFFFFF;\n --u-success-txt-color: #FFFFFF;\n --u-danger-txt-color: #FFFFFF;\n /* โ˜…๋ผ์ดํŠธ ์‹œํŠธ์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์ค‘๋ฆฝ ์ตœ์ƒ๋‹จ์„ ์“ด๋‹ค โ€” ๋‹คํฌ์—์„œ๋Š” ๊ทธ ๊ฐ’์ด #FFFFFF ๋ผ\n ๊ฒฐ๊ณผ๊ฐ€ ์ข…์ „๊ณผ ๊ฐ™๋‹ค(4.65 โœ“). ๋ฆฌํ„ฐ๋Ÿด ๋Œ€์‹  ํ† ํฐ์„ ์“ฐ๋Š” ์ด์œ ๋Š” ๋ผ์ดํŠธ์—์„œ ๋’ค์ง‘ํžˆ๊ธฐ\n ๋•Œ๋ฌธ์ด๋‹ค(#000000). ๋‘ ์‹œํŠธ๊ฐ€ ๊ฐ™์€ ์„ ์–ธ์ด ๋˜์–ด ์–ด๊ธ‹๋‚  ์ž๋ฆฌ๊ฐ€ ์—†์–ด์ง„๋‹ค. */\n --u-warning-txt-color: var(--u-neutral-1000);\n --u-txt-color-hover: var(--u-primary-color-strong);\n --u-txt-color-active: var(--u-primary-color-strong);\n --u-txt-color-disabled: var(--u-neutral-500);\n /* ๋ผ์ดํŠธ์™€ ๊ฐ™์€ ๊ธฐ์ค€ โ€” ๋†“์ด๋Š” ๋ชจ๋“  ๋ฉด์—์„œ AA. neutral-700(#8A8A8A)์€ ๋ฐ”ํƒ• 5.43 ยท\n ์˜ฌ๋ฆผ๋ฉด(neutral-300) 4.16 ยท active ๋ฉด(neutral-400) 3.15 ๋กœ ๋ฏธ๋‹ฌ์ด์—ˆ๋‹ค.\n neutral-800(#B0B0B0) = 8.64 ยท 6.62 ยท 5.01. ๋ณธ๋ฌธ(neutral-900)๊ณผ์˜ ๋Œ€๋น„๋น„ 1.46. */\n --u-txt-color-weak: var(--u-neutral-800);\n --u-txt-color-strong: var(--u-neutral-1000);\n\n --u-link-txt-color: var(--u-primary-color-strong);\n --u-tooltip-txt-color: var(--u-neutral-100);\n\n /* Icon Colors */\n --u-icon-color: var(--u-neutral-800);\n --u-icon-color-inverse: var(--u-neutral-100);\n --u-icon-color-hover: var(--u-primary-color-strong);\n --u-icon-color-active: var(--u-primary-color-strong);\n --u-icon-color-disabled: var(--u-neutral-500);\n\n /* Border Colors\n โ˜…`-weak` ๋Š” `neutral-300` ์ผ ์ˆ˜ ์—†๋‹ค โ€” `--u-bg-color-raised` ๊ฐ€ ๊ฐ™์€ ๋‹จ์ด๋ผ, ์˜ฌ๋ฆผ๋ฉด(์‚ฌ์ด๋“œ๋ฐ”ยท\n ํ‘œ ๋จธ๋ฆฌ/ํ–‰ยท๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ๊ตฌ๋ถ„์„ ) ์œ„์— ๊ทธ๋ฆฌ๋Š” ์•ฝํ•œ ์„ ์ด **๋ฉด๊ณผ ๊ฐ™์€ ์ƒ‰**(๋Œ€๋น„ 1.00)์ด ๋˜์–ด\n ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค. ๋ผ์ดํŠธ๋Š” 200 ๋‹จ์ด ์˜ฌ๋ฆผ๋ฉด(50)๊ณผ ๋–จ์–ด์ ธ ์žˆ์–ด ๋ณด์ธ๋‹ค. ๋žจํ”„์—์„œ ์˜ฌ๋ฆผ๋ฉด(300)\n ์œ„๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ๋‹จ์ด 400 ๋ฟ์ด๋ผ `-weak` ๋Š” ์ด ํ…Œ๋งˆ์—์„œ `--u-border-color` ์™€ ๊ฐ™์€\n ๋‹จ์ด๋‹ค โ€” ๋‹คํฌ์—์„œ๋Š” ยซ์•ฝํ•จ/๋ณดํ†ตยป ๋‘ ๋‹จ์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง€์ง€๋งŒ, ์ข…์ „ `-weak` ๋Š” ๊ทธ๊ฒƒ์ด ์“ฐ์ด๋Š”\n ๋ฉด ์œ„์—์„œ ์• ์ดˆ์— ๊ตฌ๋ณ„๋˜์ง€ ์•Š์•˜๋‹ค. */\n --u-border-color: var(--u-neutral-400);\n --u-border-color-weak: var(--u-neutral-400);\n --u-border-color-strong: var(--u-neutral-500);\n --u-border-color-hover: var(--u-neutral-500);\n\n /* โ˜…์ƒํƒœ ํ…Œ๋‘๋ฆฌ๋Š” `-strong` ๋‹จ์ด๋‹ค โ€” light.css ์˜ ๊ฐ™์€ ์ž๋ฆฌ ์ฃผ์„ ์ฐธ์กฐ.\n ์ด ํ…Œ๋งˆ๊ฐ€ ์‹ค์ œ๋กœ ๋ฏธ๋‹ฌ์ด์—ˆ๋‹ค: focus 2.74 ยท invalid 2.44 โ†’ 4.74 / 4.34. */\n --u-input-border-color: var(--u-neutral-400);\n --u-input-border-color-hover: var(--u-neutral-500);\n --u-input-border-color-focus: var(--u-primary-color-strong);\n --u-input-border-color-invalid: var(--u-danger-color-strong);\n\n /* Background Colors */\n --u-bg-color: var(--u-neutral-100);\n --u-bg-color-inverse: var(--u-neutral-0);\n --u-bg-color-hover: var(--u-neutral-300);\n --u-bg-color-active: var(--u-neutral-400);\n --u-bg-color-disabled: var(--u-neutral-100);\n\n /* ๋ฉด ๋†’์ด โ€” ์ƒ์„ธ๋Š” light.css ์ฐธ์กฐ. ๋‹คํฌ๋Š” **๋ฐ”ํƒ•๋ณด๋‹ค ๋ฐ์€ ์ชฝ**์ด ์œ„๋‹ค.\n neutral-300(#2A2A2A)์€ ๋ฐ”ํƒ•(#121212) ๋Œ€๋น„ 1.42 ๋กœ, ์†Œ๋น„ ์ธก์ด ์˜ค๋ฒ„๋ผ์ด๋“œ๋กœ ์“ฐ๋˜\n neutral-200(1.15)๋ณด๋‹ค ์‹ค์ œ๋กœ ๋” ์ž˜ ๊ตฌ๋ถ„๋œ๋‹ค โ€” ๊ทธ ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋˜ ์ฆ์ƒ์ด\n *\"ํˆด๋ฐ”ยทํ—ค๋”๊ฐ€ ๋ฐฐ๊ฒฝ์— ๋ฌปํžŒ๋‹ค\"* ์˜€๋‹ค. */\n --u-bg-color-raised: var(--u-neutral-300);\n\n /* โ˜…์˜ฌ๋ฆผ๋ฉด ์œ„์˜ hover โ€” `--u-bg-color-hover`(์ „์—ญ, ๋ฐ”ํƒ•๋ฉด ์ „์šฉ)์™€ ๊ฐ’์ด ๊ฐ™์•„์„œ\n (ยซ๋‘˜ ๋‹ค neutral-300ยป) ์นด๋“œยทํ‘œ ๋จธ๋ฆฌ ์œ„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋„ ์•„๋ฌด ์ผ๋„ ์•ˆ ์ผ์–ด๋‚ฌ๋‹ค\n (์†Œ๋น„์ž ์‹ค์ธก). ์ „์—ญ ํ† ํฐ ํ•˜๋‚˜๋กœ๋Š” \"์ง€๊ธˆ ์œ„์— ์žˆ๋Š” ๋ฉด\"์„\n ์•Œ ๋ฐฉ๋ฒ•์ด ์—†์–ด(์ฐธ์กฐ ์ง€์ ๋งˆ๋‹ค ๊ณ„์‚ฐ ๊ธฐ์ค€์ด ๋‹ค๋ฅผ ์ˆ˜ ์—†๋‹ค) **์ „์šฉ ํ† ํฐ**์„ ์‹ ์„คํ•œ๋‹ค.\n\n โš **A์•ˆ**(`raised`๋ฅผ neutral-200์œผ๋กœ) โ€” ๊ณผ๊ฑฐ์— ๊ฑฐ๋ถ€๋œ ๊ฐ’(์œ„ ์ฃผ์„). **B์•ˆ**(์ „์—ญ\n `hover`๋ฅผ neutral-400์œผ๋กœ) โ€” `--u-bg-color-active` ์™€ ์ถฉ๋Œํ•ด ๊ฒฐํ•จ์ด ๋‹ค๋ฅธ ์Œ์œผ๋กœ\n ์˜ฎ๊ฒจ๊ฐ„๋‹ค. โ‡’ hover ๋Š” ๋ณธ๋ž˜ \"ํ˜„์žฌ ๋ฉด๋ณด๋‹ค ํ•œ ๋‹จ ์œ„\"์ด์ง€ ์ ˆ๋Œ€ ๋‹จ์ด ์•„๋‹ˆ๋ฏ€๋กœ\n `color-mix()` ๋กœ raised ์ž์‹ ์„ ๊ธฐ์ค€ ์‚ผ์•„ ์ƒ๋Œ€ ๊ณ„์‚ฐํ•œ๋‹ค.\n\n N=6% ๋Š” raised(Lโ‰ˆ0.023)์™€ active(Lโ‰ˆ0.047, neutral-400) ์‚ฌ์ด ๋Œ€๋น„ ๊ณ„์‚ฐ์œผ๋กœ ๊ณจ๋ž๋‹ค โ€”\n ๊ฒฐ๊ณผ Lโ‰ˆ0.038, raised ๋Œ€๋น„ โ‰ˆ1.21(๋ผ์ดํŠธ์˜ ๊ธฐ์กด \"์•ฝํ•œ\" 1.04๋ณด๋‹ค ๋šœ๋ ทํ•˜๊ณ , `bgโ†’raised`\n ์˜ ๊ธฐ์กด 1.31 ๊ณผ ๋น„์Šทํ•œ ์ฒด๊ฐ), active ์™€๋Š” ๊ฐ’์ด ๋‹ฌ๋ผ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค(โ‰ˆ#373737 vs\n active #3D3D3D). N ์„ ๋” ์˜ฌ๋ฆฌ๋ฉด(โ‰ˆ10%+) active ๋ฅผ ๋„˜์–ด์„œ ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžŒ๋‹ค โ€” ํ™•์ธํ•จ. */\n --u-bg-color-raised-hover: color-mix(in srgb, var(--u-bg-color-raised), white 6%);\n\n /* ์œ ์ฑ„์ƒ‰ ํ‘œ๋ฉด โ€” ๋ผ์ดํŠธ์™€ **๊ฐ™์€ ๋‹จ์ด ์•„๋‹ˆ๋ผ ๊ฐ™์€ ์„ธ๊ธฐ**๋กœ ์ง์ง€์—ˆ๋‹ค(light.css ์ฐธ์กฐ).\n ํŒ”๋ ˆํŠธ ์œ ์ฑ„์ƒ‰ ํ‹ดํŠธ๊ฐ€ ๋‹คํฌ์—์„œ ์ง“๋ˆŒ๋ฆฌ๋ฏ€๋กœ ํ•œ ๋‹จ ์œ„๋ฅผ ์“ด๋‹ค. green ์€ ๋Œ€์นญ์ด๋ผ ๊ทธ๋Œ€๋กœ. */\n --u-primary-bg-color: var(--u-blue-100);\n --u-info-bg-color: var(--u-blue-100);\n --u-success-bg-color: var(--u-green-0);\n --u-danger-bg-color: var(--u-red-100);\n /* warning ํ•ฉ๋ฅ˜ โ€” ๋ผ์ดํŠธ๋Š” yellow-200 ์ด๋‹ค(๋‹จ ์ด๋ฆ„์ด ๋‹ค๋ฅธ ์ด์œ ๋Š” light.css ์ฐธ์กฐ). */\n --u-warning-bg-color: var(--u-yellow-100);\n\n --u-input-bg-color: var(--u-neutral-200);\n --u-panel-bg-color: var(--u-neutral-200);\n --u-overlay-bg-color: rgba(0, 0, 0, 0.7);\n --u-tooltip-bg-color: rgba(255, 255, 255, 0.85);\n\n /* Shadow Colors */\n --u-shadow-color-weaker: rgba(0, 0, 0, 0.15);\n --u-shadow-color-weak: rgba(0, 0, 0, 0.25);\n --u-shadow-color-normal: rgba(0, 0, 0, 0.35);\n --u-shadow-color-strong: rgba(0, 0, 0, 0.45);\n --u-shadow-color-stronger: rgba(0, 0, 0, 0.60);\n\n /* Elevation Scale โ€” ๊ทผ๊ฑฐ๋Š” light.css ์˜ ๊ฐ™์€ ์ž๋ฆฌ ์ฃผ์„ ์ฐธ์กฐ.\n โ˜…๋‹คํฌ๋Š” ์•ŒํŒŒ๊ฐ€ 3๋ฐฐ ๊ฐ€๊นŒ์ด ์ง„ํ•˜๋‹ค โ€” ๋ฆฌํ„ฐ๋Ÿด๋กœ ํฉ์–ด์ ธ ์žˆ๋˜ ์ข…์ „์—๋Š” ์ด ์ฐจ์ด๊ฐ€\n ์ ์šฉ๋˜์ง€ ์•Š์•„ ๋‹คํฌ์—์„œ ๊ทธ๋ฆผ์ž๊ฐ€ ์‚ฌ์‹ค์ƒ ๋ณด์ด์ง€ ์•Š์•˜๋‹ค. */\n --u-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25), 0 1px 1px rgba(0, 0, 0, 0.14); /* = shadow-color-weak */\n --u-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.18); /* = shadow-color-normal */\n --u-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.22); /* = shadow-color-strong */\n --u-shadow-xl: 0 6px 18px rgba(0, 0, 0, 0.60), 0 2px 6px rgba(0, 0, 0, 0.30); /* = shadow-color-stronger */\n\n\n /* ==========================================================================\n Type Scale โ€” ๊ธ€์ž ํฌ๊ธฐยท๊ตต๊ธฐยทํ–‰๊ฐ„ยท์ž๊ฐ„์˜ **ํ•œ ๋ฒŒ**\n โ˜…**ํฌ๊ธฐ๋งŒ ์ฃผ๋ฉด ์Šค์ผ€์ผ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.** ์†Œ๋น„์ž๊ฐ€ ํฌ๊ธฐ๋งŒ ๋ฐ›๊ณ  ๊ตต๊ธฐยทํ–‰๊ฐ„์„ ๊ฐ์ž ์ •ํ•˜๋ฉด\n ๊ฒฐ๊ตญ ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค๋ฅธ ์œ„๊ณ„๊ฐ€ ์ƒ๊ธด๋‹ค โ€” ๊ทธ๋ž˜์„œ ๋„ค ๊ฐ’์„ **๋‹จ ๋‹จ์œ„๋กœ ๋ฌถ์–ด** ๋‚ธ๋‹ค.\n\n ๋‹จ ์ด๋ฆ„์€ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ **์—ญํ• **์ด๋‹ค(`lg`/`xl` ์ด ์•„๋‹ˆ๋ผ `title`/`label`). ์—ญํ• ๋กœ ๋‘๋ฉด\n ์†Œ๋น„์ž๊ฐ€ *\"์–ด๋А ํฌ๊ธฐ๋ฅผ ์“ธ๊นŒ\"* ๊ฐ€ ์•„๋‹ˆ๋ผ *\"์ด ๊ธ€์ž๋Š” ๋ฌด์—‡์ธ๊ฐ€\"* ๋ฅผ ๋ฌป๊ฒŒ ๋œ๋‹ค.\n\n โ˜…**ํ•œ๊ธ€ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ๊ณจ๋ž๋‹ค**:\n โ‘ด ํ–‰๊ฐ„์€ **1.4 ์ด์ƒ**. ๋ผํ‹ด ๊ด€๋ก€(1.2)๋Š” ํ•œ๊ธ€์—์„œ ๋‹ต๋‹ตํ•˜๋‹ค โ€” ๋ฐ›์นจ ๋•Œ๋ฌธ์— ๊ธ€์ž ์ƒ์ž๊ฐ€\n ์„ธ๋กœ๋กœ ๊ฝ‰ ์ฐจ ์žˆ์–ด ๋ผํ‹ด๊ณผ ๊ฐ™์€ ํ–‰๊ฐ„์ด๋ฉด ์ค„์ด ๋ถ™์–ด ๋ณด์ธ๋‹ค.\n โ‘ต ์ž๊ฐ„์€ **0 ์ด ๊ธฐ๋ณธ**์ด๊ณ  ํฐ ์ œ๋ชฉ๋งŒ **์Œ์ˆ˜**. ํ•œ๊ธ€์— ์–‘์ˆ˜ ์ž๊ฐ„(letter-spacing)์„ ์ฃผ๋ฉด\n ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค โ€” ๋ผํ‹ด ์†Œ๋ฌธ์ž ์กฐํŒ ๊ด€๋ก€๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๋ฉด ์•ˆ ๋˜๋Š” ์ž๋ฆฌ๋‹ค.\n โ‘ถ `overline` ์—๋งŒ ์–‘์ˆ˜ ์ž๊ฐ„์„ ๋‘”๋‹ค. ๊ทธ ๋‹จ์€ **์˜๋ฌธยท์ˆซ์ž ๋ผ๋ฒจ**์„ ์ „์ œํ•œ ์ž๋ฆฌ์ด๊ณ ,\n ํ•œ๊ธ€์„ ๋„ฃ์„ ์†Œ๋น„์ž๋Š” ์ž๊ฐ„์„ 0 ์œผ๋กœ ๋ฎ์–ด์•ผ ํ•œ๋‹ค(๋ฌธ์„œ์— ๋ช…์‹œ).\n\n โš **`text-transform` ์€ ํ† ํฐ์œผ๋กœ ๋‚ด์ง€ ์•Š๋Š”๋‹ค.** ํ•œ๊ธ€์—๋Š” ๋Œ€๋ฌธ์ž๊ฐ€ ์—†์–ด `uppercase` ๊ฐ€\n ์•„๋ฌด ํšจ๊ณผ๊ฐ€ ์—†๊ณ , ์˜๋ฌธ์ด ์„ž์ด๋ฉด ๊ทธ๊ฒƒ๋งŒ ์ปค์ ธ ์˜คํžˆ๋ ค ์–ด์ˆ˜์„ ํ•ด์ง„๋‹ค.\n ========================================================================== */\n --u-text-display-size: 26px;\n --u-text-display-weight: 700;\n --u-text-display-leading: 1.4;\n --u-text-display-tracking: -0.02em;\n\n --u-text-title-size: 20px;\n --u-text-title-weight: 700;\n --u-text-title-leading: 1.45;\n --u-text-title-tracking: -0.01em;\n\n --u-text-subtitle-size: 16px;\n --u-text-subtitle-weight: 600;\n --u-text-subtitle-leading: 1.5;\n --u-text-subtitle-tracking: 0;\n\n --u-text-body-size: 14px;\n --u-text-body-weight: 400;\n --u-text-body-leading: 1.6;\n --u-text-body-tracking: 0;\n\n --u-text-label-size: 13px;\n --u-text-label-weight: 600;\n --u-text-label-leading: 1.5;\n --u-text-label-tracking: 0;\n\n --u-text-caption-size: 12px;\n --u-text-caption-weight: 400;\n --u-text-caption-leading: 1.5;\n --u-text-caption-tracking: 0;\n\n --u-text-overline-size: 11px;\n --u-text-overline-weight: 700;\n --u-text-overline-leading: 1.45;\n --u-text-overline-tracking: 0.06em;\n\n /* ==========================================================================\n Motion โ€” ์ง€์†์‹œ๊ฐ„ยท์ด์ง•\n โ˜…๊ฐ’์ด ์—†์œผ๋ฉด ์•ฑ๋งˆ๋‹ค ๋‹ค๋ฅธ ์†๋„๊ฐ€ ์ƒ๊ธฐ๊ณ , `prefers-reduced-motion` ์€ **๋ฐ˜๋“œ์‹œ**\n ๋น ๋œจ๋ฆฌ๋Š” ์•ฑ์ด ๋‚˜์˜จ๋‹ค. ์ถ•์„ ์—ฌ๊ธฐ ๋‘๊ณ  ์กด์ค‘ ๊ทœ์น™์€ ์•„๋ž˜ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ์ง„๋‹ค.\n ========================================================================== */\n --u-duration-instant: 80ms;\n --u-duration-fast: 140ms;\n --u-duration-normal: 220ms;\n --u-duration-slow: 320ms;\n --u-ease-standard: cubic-bezier(0.2, 0, 0, 1);\n --u-ease-decelerate: cubic-bezier(0, 0, 0, 1);\n --u-ease-accelerate: cubic-bezier(0.3, 0, 1, 1);\n\n /* Scrollbar Colors */\n --u-scrollbar-color: var(--u-neutral-500);\n --u-scrollbar-color-hover: var(--u-neutral-600);\n --u-scrollbar-track-color: transparent;\n\n /* ==========================================================================\n Font Styles\n โ˜…**CJK ํด๋ฐฑ์„ ์Šคํƒ์— ํฌํ•จํ•œ๋‹ค โ€” ๊ตญ์ œํ™”์ด์ง€ ์ทจํ–ฅ์ด ์•„๋‹ˆ๋‹ค.**\n ์ข…์ „ ์Šคํƒ(`-apple-system, Segoe UI, Noto Sans, Helvetica, Arial`)์—๋Š” **ํ•œ์ค‘์ผ ๊ธ€๋ฆฝ์„\n ๊ฐ€์ง„ ํฐํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์—ˆ๋‹ค.** Windows ์—์„œ ํ•œ๊ธ€์€ `Segoe UI` ์— ์—†์œผ๋ฏ€๋กœ UA ๊ฐ€ ์ž„์˜๋กœ\n ๋ง‘์€ ๊ณ ๋”•์„ ๊ณ ๋ฅด๊ณ , macOS ๋Š” `-apple-system` ์ด Apple SD Gothic Neo ๋ฅผ ์ค€๋‹ค โ‡’ **๊ฐ™์€ ์•ฑ์ด\n OS ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ธ€๊ผด๋กœ ๋ Œ๋”**๋๋‹ค. ํด๋ฐฑ์„ ๋ช…์‹œํ•˜๋ฉด ๊ทธ ์„ ํƒ์ด ๊ฒฐ์ •์ ์ด ๋œ๋‹ค.\n โš **์›นํฐํŠธ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋งŒ๋“ค๋ฉด ์†Œ๋น„์ž์˜ CSPยท\n ์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ์„ ๊นฌ๋‹ค. ์Šคํƒ ๋งจ ์•ž์˜ `Pretendard` ๋Š” **์†Œ๋น„์ž๊ฐ€ ๋กœ๋“œํ–ˆ์„ ๋•Œ๋งŒ** ์žกํžˆ๋Š”\n ์„ ํƒ์  ์ด๋ฆ„์ด๋‹ค(์—†์œผ๋ฉด ์กฐ์šฉํžˆ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค).\n ========================================================================== */\n --u-font-base: 'Pretendard Variable', Pretendard, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, 'Apple SD Gothic Neo', 'Malgun Gothic', 'Noto Sans KR', 'Hiragino Sans', 'Yu Gothic UI', 'Microsoft YaHei', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';\n --u-font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Monaco, 'Courier New', monospace;\n --u-font-serif: 'Georgia', 'Times New Roman', Times, serif;\n --u-font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n --u-font-modern: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --u-font-rounded: 'Nunito', 'Quicksand', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}";
2
+ var dark_css_default = ":root[theme=\"dark\"] {\n color-scheme: dark;\n\n /* Neutral Colors */\n --u-neutral-0: #000000;\n --u-neutral-50: #0A0A0A;\n --u-neutral-100: #121212;\n --u-neutral-200: #1E1E1E;\n --u-neutral-300: #2A2A2A;\n --u-neutral-400: #3D3D3D;\n --u-neutral-500: #525252;\n --u-neutral-600: #6E6E6E;\n --u-neutral-700: #8A8A8A;\n --u-neutral-800: #B0B0B0;\n --u-neutral-900: #D4D4D4;\n --u-neutral-1000: #FFFFFF;\n\n /* Blue Colors */\n --u-blue-0: #030D1A;\n --u-blue-100: #061629;\n --u-blue-200: #0A223B;\n --u-blue-300: #103150;\n --u-blue-400: #174167;\n --u-blue-500: #205281;\n --u-blue-600: #2A659D;\n --u-blue-700: #3678B8;\n --u-blue-800: #478DCE;\n --u-blue-900: #5DA2DF;\n --u-blue-1000: #79BBEA;\n\n /* Green Colors */\n --u-green-0: #06140C;\n --u-green-100: #0A2114;\n --u-green-200: #10301D;\n --u-green-300: #164228;\n --u-green-400: #1F5535;\n --u-green-500: #2A6942;\n --u-green-600: #367E50;\n --u-green-700: #4A9563;\n --u-green-800: #63AB7A;\n --u-green-900: #80BE97;\n --u-green-1000: #9BCFB1;\n\n /* Yellow Colors */\n --u-yellow-0: #1C1300;\n --u-yellow-100: #2D1E00;\n --u-yellow-200: #402B00;\n --u-yellow-300: #553900;\n --u-yellow-400: #6B4900;\n --u-yellow-500: #825A00;\n --u-yellow-600: #9A6C00;\n --u-yellow-700: #B08012;\n --u-yellow-800: #C69635;\n --u-yellow-900: #D9AD5A;\n --u-yellow-1000: #E8C57F;\n\n /* Red Colors */\n --u-red-0: #1C0707;\n --u-red-100: #2C0B0B;\n --u-red-200: #3E1111;\n --u-red-300: #541818;\n --u-red-400: #6C2020;\n --u-red-500: #852A2A;\n --u-red-600: #A13535;\n --u-red-700: #B94949;\n --u-red-800: #CB6262;\n --u-red-900: #D98383;\n --u-red-1000: #E7A2A2;\n\n /* Orange Colors */\n --u-orange-0: #1D0E00;\n --u-orange-100: #2F1700;\n --u-orange-200: #421F00;\n --u-orange-300: #582A00;\n --u-orange-400: #703600;\n --u-orange-500: #8A4500;\n --u-orange-600: #A55600;\n --u-orange-700: #BD6A18;\n --u-orange-800: #D1823C;\n --u-orange-900: #E19D67;\n --u-orange-1000: #EDB992;\n\n /* Teal Colors */\n --u-teal-0: #041411;\n --u-teal-100: #07201B;\n --u-teal-200: #0B2E28;\n --u-teal-300: #10403A;\n --u-teal-400: #16544D;\n --u-teal-500: #1E6860;\n --u-teal-600: #297D74;\n --u-teal-700: #3A9389;\n --u-teal-800: #54A89F;\n --u-teal-900: #73BBB3;\n --u-teal-1000: #93CBC5;\n\n /* Cyan Colors */\n --u-cyan-0: #041318;\n --u-cyan-100: #071F29;\n --u-cyan-200: #0B2D3A;\n --u-cyan-300: #104050;\n --u-cyan-400: #165469;\n --u-cyan-500: #1E6A82;\n --u-cyan-600: #287F9C;\n --u-cyan-700: #3995B5;\n --u-cyan-800: #53AACC;\n --u-cyan-900: #73BEDD;\n --u-cyan-1000: #95CFE8;\n\n /* Purple Colors */\n --u-purple-0: #150A22;\n --u-purple-100: #220F36;\n --u-purple-200: #31164B;\n --u-purple-300: #432064;\n --u-purple-400: #572B80;\n --u-purple-500: #6C379C;\n --u-purple-600: #8245B7;\n --u-purple-700: #975BCB;\n --u-purple-800: #AB79D9;\n --u-purple-900: #BD99E2;\n --u-purple-1000: #CEB8EA;\n\n /* Pink Colors */\n --u-pink-0: #1F0A14;\n --u-pink-100: #310F20;\n --u-pink-200: #451532;\n --u-pink-300: #5C1D45;\n --u-pink-400: #74285A;\n --u-pink-500: #8F336F;\n --u-pink-600: #AB4187;\n --u-pink-700: #C0569D;\n --u-pink-800: #D174B3;\n --u-pink-900: #E095C7;\n --u-pink-1000: #EBB5D9;\n\n /* ==========================================================================\n Role Colors โ€” ์˜๋ฏธ ์—ญํ•  ์ธต\n ์ปดํฌ๋„ŒํŠธ๋Š” ํŒ”๋ ˆํŠธ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด ์ธต์„ ์ฐธ์กฐํ•œ๋‹ค.\n ๋ธŒ๋žœ๋“œ ์ƒ‰ ๊ต์ฒด๋Š” ์•„๋ž˜ 25๊ฐœ๋งŒ ์žฌ์ •์˜ํ•˜๋ฉด ์‹œ๋งจํ‹ฑ ์ธต๊นŒ์ง€ ๋”ฐ๋ผ์˜จ๋‹ค.\n\n ๋‹จ์€ '๊ฐ•๋„' ์ถ•์ด๋‹ค (weakest -> strong). ์šฉ๋„(๋ฐฐ๊ฒฝ/ํ…Œ๋‘๋ฆฌ/ํ…์ŠคํŠธ)๋Š”\n ์†Œ๋น„์ฒ˜๊ฐ€ ์ •ํ•œ๋‹ค -- ๋‹จ์„ ์†์„ฑ์— ๋ฌถ์œผ๋ฉด primary ๋ฒ„ํŠผ์˜ ๋ฐฐ๊ฒฝ์ด ์–ด๋А\n ๋‹จ์ธ์ง€ ๊ฐ™์€ ๋ชจ์ˆœ์ด ์ƒ๊ธด๋‹ค.\n\n โ˜…**๋‹ค๋งŒ ๋‘ ๋‹จ์€ ์šฉ๋„๊ฐ€ ํ™•์ •๋ผ ์žˆ๋‹ค** โ€” ๋Œ€๋น„ ์š”๊ตฌ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.\n `-color` = **๋ฉด**. `--u-*-txt-color` ๊ฐ€ ๊ทธ ์œ„์— ์–นํžˆ๋ฏ€๋กœ on-color ๊ธฐ์ค€ 4.5.\n `-strong` = **๊ธ€์žยท์•„์ด์ฝ˜**. `--u-bg-color` ์œ„์— ๋†“์ด๋ฏ€๋กœ ๋ฐ”ํƒ• ๊ธฐ์ค€ 4.5.\n ๋ผ์ดํŠธ์—์„œ๋Š” ๋ฐ”ํƒ•๋„ on-color ๋„ ํฐ์ƒ‰์ด๋ผ ๋‘ ์š”๊ตฌ๊ฐ€ ํ•œ ์กฐ๊ฑด์œผ๋กœ ํ•ฉ์ณ์ง€์ง€๋งŒ,\n **๋‹คํฌ์—์„œ๋Š” ์ •๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ**์ด๋‹ค(๋ฐ”ํƒ• #121212 ยท on-color #FFFFFF). ๋ฐ”ํƒ•์—์„œ ์ฝํžˆ๋Š”\n ๋ฐ์€ ๋‹จ์€ ํฐ ๊ธ€์ž๋ฅผ ๋ชป ๋ฐ›๊ณ , ํฐ ๊ธ€์ž๋ฅผ ๋ฐ›๋Š” ์–ด๋‘์šด ๋‹จ์€ ๋ฐ”ํƒ•์—์„œ ์•ˆ ์ฝํžŒ๋‹ค.\n โ‡’ ๋‹คํฌ์—์„œ `-color` ์™€ `-strong` ์ด ๋‘ ๋‹จ ๋ฒŒ์–ด์ง€๋Š” ๊ฒƒ์ด ๊ทธ ๊ฒฐ๊ณผ๋‹ค.\n `tests/build/token-contrast.test.ts` ๊ฐ€ ๊ฐ’์„ ์ง€ํ‚จ๋‹ค.\n ========================================================================== */\n\n /* primary โ€” ๋ธŒ๋žœ๋“œ ยท ๊ฐ•์กฐ ยท ํฌ์ปค์Šค ยท ๋งํฌ */\n --u-primary-color-weakest: var(--u-blue-200);\n --u-primary-color-weaker: var(--u-blue-300);\n --u-primary-color-weak: var(--u-blue-500);\n --u-primary-color: var(--u-blue-600); /* ๋ฉด: ํฐ ๊ธ€์ž 6.09 โœ“ */\n --u-primary-color-strong: var(--u-blue-800); /* ๊ธ€์ž: ๋ฐ”ํƒ• 5.32 โœ“ (700 ์€ 4.05 โœ—) */\n\n /* info โ€” ์ •๋ณด ์•ˆ๋‚ด (primary ์™€ ๊ธฐ๋ณธ๊ฐ’์€ ๊ฐ™์œผ๋‚˜ ์—ญํ• ์ด ๋‹ค๋ฅด๋‹ค โ€” ๋ธŒ๋žœ๋”ฉ์€ primary ๋งŒ ๋ฐ”๊พผ๋‹ค) */\n --u-info-color-weakest: var(--u-blue-200);\n --u-info-color-weaker: var(--u-blue-300);\n --u-info-color-weak: var(--u-blue-500);\n --u-info-color: var(--u-blue-600);\n --u-info-color-strong: var(--u-blue-800);\n\n /* success โ€” ์„ฑ๊ณต ยท ์™„๋ฃŒ */\n --u-success-color-weakest: var(--u-green-200);\n --u-success-color-weaker: var(--u-green-300);\n --u-success-color-weak: var(--u-green-500);\n --u-success-color: var(--u-green-600);\n --u-success-color-strong: var(--u-green-700);\n\n /* warning โ€” ์ฃผ์˜ */\n --u-warning-color-weakest: var(--u-yellow-200);\n --u-warning-color-weaker: var(--u-yellow-300);\n --u-warning-color-weak: var(--u-yellow-500);\n --u-warning-color: var(--u-yellow-600);\n --u-warning-color-strong: var(--u-yellow-700);\n\n /* danger โ€” ์˜ค๋ฅ˜ ยท ์œ„ํ—˜ ยท ์œ ํšจ์„ฑ ์‹คํŒจ */\n --u-danger-color-weakest: var(--u-red-200);\n --u-danger-color-weaker: var(--u-red-300);\n --u-danger-color-weak: var(--u-red-500);\n --u-danger-color: var(--u-red-600); /* ๋ฉด: ํฐ ๊ธ€์ž 6.83 โœ“ */\n --u-danger-color-strong: var(--u-red-800); /* ๊ธ€์ž: ๋ฐ”ํƒ• 4.87 โœ“ (700 ์€ 3.67 โœ—) */\n /* Text Colors */\n --u-txt-color: var(--u-neutral-900);\n --u-txt-color-inverse: var(--u-neutral-100);\n\n /* ์œ ์ฑ„์ƒ‰ ๋ฐฐ๊ฒฝ ์œ„์˜ ๊ธ€์ž โ€” warning ๋งŒ ๋‹ค๋ฅด๋‹ค(light.css ์ฐธ์กฐ). */\n --u-primary-txt-color: #FFFFFF;\n --u-info-txt-color: #FFFFFF;\n --u-success-txt-color: #FFFFFF;\n --u-danger-txt-color: #FFFFFF;\n /* โ˜…๋ผ์ดํŠธ ์‹œํŠธ์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์ค‘๋ฆฝ ์ตœ์ƒ๋‹จ์„ ์“ด๋‹ค โ€” ๋‹คํฌ์—์„œ๋Š” ๊ทธ ๊ฐ’์ด #FFFFFF ๋ผ\n ๊ฒฐ๊ณผ๊ฐ€ ์ข…์ „๊ณผ ๊ฐ™๋‹ค(4.65 โœ“). ๋ฆฌํ„ฐ๋Ÿด ๋Œ€์‹  ํ† ํฐ์„ ์“ฐ๋Š” ์ด์œ ๋Š” ๋ผ์ดํŠธ์—์„œ ๋’ค์ง‘ํžˆ๊ธฐ\n ๋•Œ๋ฌธ์ด๋‹ค(#000000). ๋‘ ์‹œํŠธ๊ฐ€ ๊ฐ™์€ ์„ ์–ธ์ด ๋˜์–ด ์–ด๊ธ‹๋‚  ์ž๋ฆฌ๊ฐ€ ์—†์–ด์ง„๋‹ค. */\n --u-warning-txt-color: var(--u-neutral-1000);\n --u-txt-color-hover: var(--u-primary-color-strong);\n --u-txt-color-active: var(--u-primary-color-strong);\n --u-txt-color-disabled: var(--u-neutral-500);\n /* ๋ผ์ดํŠธ์™€ ๊ฐ™์€ ๊ธฐ์ค€ โ€” ๋†“์ด๋Š” ๋ชจ๋“  ๋ฉด์—์„œ AA. neutral-700(#8A8A8A)์€ ๋ฐ”ํƒ• 5.43 ยท\n ์˜ฌ๋ฆผ๋ฉด(neutral-300) 4.16 ยท active ๋ฉด(neutral-400) 3.15 ๋กœ ๋ฏธ๋‹ฌ์ด์—ˆ๋‹ค.\n neutral-800(#B0B0B0) = 8.64 ยท 6.62 ยท 5.01. ๋ณธ๋ฌธ(neutral-900)๊ณผ์˜ ๋Œ€๋น„๋น„ 1.46. */\n --u-txt-color-weak: var(--u-neutral-800);\n --u-txt-color-strong: var(--u-neutral-1000);\n\n --u-link-txt-color: var(--u-primary-color-strong);\n --u-tooltip-txt-color: var(--u-neutral-100);\n\n /* Icon Colors */\n --u-icon-color: var(--u-neutral-800);\n --u-icon-color-inverse: var(--u-neutral-100);\n --u-icon-color-hover: var(--u-primary-color-strong);\n --u-icon-color-active: var(--u-primary-color-strong);\n --u-icon-color-disabled: var(--u-neutral-500);\n\n /* Border Colors\n โ˜…`-weak` ๋Š” `neutral-300` ์ผ ์ˆ˜ ์—†๋‹ค โ€” `--u-bg-color-raised` ๊ฐ€ ๊ฐ™์€ ๋‹จ์ด๋ผ, ์˜ฌ๋ฆผ๋ฉด(์‚ฌ์ด๋“œ๋ฐ”ยท\n ํ‘œ ๋จธ๋ฆฌ/ํ–‰ยท๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ๊ตฌ๋ถ„์„ ) ์œ„์— ๊ทธ๋ฆฌ๋Š” ์•ฝํ•œ ์„ ์ด **๋ฉด๊ณผ ๊ฐ™์€ ์ƒ‰**(๋Œ€๋น„ 1.00)์ด ๋˜์–ด\n ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค. ๋ผ์ดํŠธ๋Š” 200 ๋‹จ์ด ์˜ฌ๋ฆผ๋ฉด(50)๊ณผ ๋–จ์–ด์ ธ ์žˆ์–ด ๋ณด์ธ๋‹ค. ๋žจํ”„์—์„œ ์˜ฌ๋ฆผ๋ฉด(300)\n ์œ„๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ๋‹จ์ด 400 ๋ฟ์ด๋ผ `-weak` ๋Š” ์ด ํ…Œ๋งˆ์—์„œ `--u-border-color` ์™€ ๊ฐ™์€\n ๋‹จ์ด๋‹ค โ€” ๋‹คํฌ์—์„œ๋Š” ยซ์•ฝํ•จ/๋ณดํ†ตยป ๋‘ ๋‹จ์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง€์ง€๋งŒ, ์ข…์ „ `-weak` ๋Š” ๊ทธ๊ฒƒ์ด ์“ฐ์ด๋Š”\n ๋ฉด ์œ„์—์„œ ์• ์ดˆ์— ๊ตฌ๋ณ„๋˜์ง€ ์•Š์•˜๋‹ค. */\n --u-border-color: var(--u-neutral-400);\n --u-border-color-weak: var(--u-neutral-400);\n --u-border-color-strong: var(--u-neutral-500);\n --u-border-color-hover: var(--u-neutral-500);\n\n /* โ˜…์ƒํƒœ ํ…Œ๋‘๋ฆฌ๋Š” `-strong` ๋‹จ์ด๋‹ค โ€” light.css ์˜ ๊ฐ™์€ ์ž๋ฆฌ ์ฃผ์„ ์ฐธ์กฐ.\n ์ด ํ…Œ๋งˆ๊ฐ€ ์‹ค์ œ๋กœ ๋ฏธ๋‹ฌ์ด์—ˆ๋‹ค: focus 2.74 ยท invalid 2.44 โ†’ 4.74 / 4.34. */\n --u-input-border-color: var(--u-neutral-400);\n --u-input-border-color-hover: var(--u-neutral-500);\n --u-input-border-color-focus: var(--u-primary-color-strong);\n --u-input-border-color-invalid: var(--u-danger-color-strong);\n\n /* Background Colors */\n --u-bg-color: var(--u-neutral-100);\n --u-bg-color-inverse: var(--u-neutral-0);\n --u-bg-color-hover: var(--u-neutral-300);\n --u-bg-color-active: var(--u-neutral-400);\n --u-bg-color-disabled: var(--u-neutral-100);\n\n /* ๋ฉด ๋†’์ด โ€” ์ƒ์„ธ๋Š” light.css ์ฐธ์กฐ. ๋‹คํฌ๋Š” **๋ฐ”ํƒ•๋ณด๋‹ค ๋ฐ์€ ์ชฝ**์ด ์œ„๋‹ค.\n neutral-300(#2A2A2A)์€ ๋ฐ”ํƒ•(#121212) ๋Œ€๋น„ 1.42 ๋กœ, ์†Œ๋น„ ์ธก์ด ์˜ค๋ฒ„๋ผ์ด๋“œ๋กœ ์“ฐ๋˜\n neutral-200(1.15)๋ณด๋‹ค ์‹ค์ œ๋กœ ๋” ์ž˜ ๊ตฌ๋ถ„๋œ๋‹ค โ€” ๊ทธ ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋˜ ์ฆ์ƒ์ด\n *\"ํˆด๋ฐ”ยทํ—ค๋”๊ฐ€ ๋ฐฐ๊ฒฝ์— ๋ฌปํžŒ๋‹ค\"* ์˜€๋‹ค. */\n --u-bg-color-raised: var(--u-neutral-300);\n\n /* โ˜…์˜ฌ๋ฆผ๋ฉด ์œ„์˜ hover โ€” `--u-bg-color-hover`(์ „์—ญ, ๋ฐ”ํƒ•๋ฉด ์ „์šฉ)์™€ ๊ฐ’์ด ๊ฐ™์•„์„œ\n (ยซ๋‘˜ ๋‹ค neutral-300ยป) ์นด๋“œยทํ‘œ ๋จธ๋ฆฌ ์œ„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋„ ์•„๋ฌด ์ผ๋„ ์•ˆ ์ผ์–ด๋‚ฌ๋‹ค\n (์†Œ๋น„์ž ์‹ค์ธก). ์ „์—ญ ํ† ํฐ ํ•˜๋‚˜๋กœ๋Š” \"์ง€๊ธˆ ์œ„์— ์žˆ๋Š” ๋ฉด\"์„\n ์•Œ ๋ฐฉ๋ฒ•์ด ์—†์–ด(์ฐธ์กฐ ์ง€์ ๋งˆ๋‹ค ๊ณ„์‚ฐ ๊ธฐ์ค€์ด ๋‹ค๋ฅผ ์ˆ˜ ์—†๋‹ค) **์ „์šฉ ํ† ํฐ**์„ ์‹ ์„คํ•œ๋‹ค.\n\n โš **A์•ˆ**(`raised`๋ฅผ neutral-200์œผ๋กœ) โ€” ๊ณผ๊ฑฐ์— ๊ฑฐ๋ถ€๋œ ๊ฐ’(์œ„ ์ฃผ์„). **B์•ˆ**(์ „์—ญ\n `hover`๋ฅผ neutral-400์œผ๋กœ) โ€” `--u-bg-color-active` ์™€ ์ถฉ๋Œํ•ด ๊ฒฐํ•จ์ด ๋‹ค๋ฅธ ์Œ์œผ๋กœ\n ์˜ฎ๊ฒจ๊ฐ„๋‹ค. โ‡’ hover ๋Š” ๋ณธ๋ž˜ \"ํ˜„์žฌ ๋ฉด๋ณด๋‹ค ํ•œ ๋‹จ ์œ„\"์ด์ง€ ์ ˆ๋Œ€ ๋‹จ์ด ์•„๋‹ˆ๋ฏ€๋กœ\n `color-mix()` ๋กœ raised ์ž์‹ ์„ ๊ธฐ์ค€ ์‚ผ์•„ ์ƒ๋Œ€ ๊ณ„์‚ฐํ•œ๋‹ค.\n\n N=6% ๋Š” raised(Lโ‰ˆ0.023)์™€ active(Lโ‰ˆ0.047, neutral-400) ์‚ฌ์ด ๋Œ€๋น„ ๊ณ„์‚ฐ์œผ๋กœ ๊ณจ๋ž๋‹ค โ€”\n ๊ฒฐ๊ณผ Lโ‰ˆ0.038, raised ๋Œ€๋น„ โ‰ˆ1.21(๋ผ์ดํŠธ์˜ ๊ธฐ์กด \"์•ฝํ•œ\" 1.04๋ณด๋‹ค ๋šœ๋ ทํ•˜๊ณ , `bgโ†’raised`\n ์˜ ๊ธฐ์กด 1.31 ๊ณผ ๋น„์Šทํ•œ ์ฒด๊ฐ), active ์™€๋Š” ๊ฐ’์ด ๋‹ฌ๋ผ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค(โ‰ˆ#373737 vs\n active #3D3D3D). N ์„ ๋” ์˜ฌ๋ฆฌ๋ฉด(โ‰ˆ10%+) active ๋ฅผ ๋„˜์–ด์„œ ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžŒ๋‹ค โ€” ํ™•์ธํ•จ. */\n --u-bg-color-raised-hover: color-mix(in srgb, var(--u-bg-color-raised), white 6%);\n\n /* ์œ ์ฑ„์ƒ‰ ํ‘œ๋ฉด โ€” ๋ผ์ดํŠธ์™€ **๊ฐ™์€ ๋‹จ์ด ์•„๋‹ˆ๋ผ ๊ฐ™์€ ์„ธ๊ธฐ**๋กœ ์ง์ง€์—ˆ๋‹ค(light.css ์ฐธ์กฐ).\n ํŒ”๋ ˆํŠธ ์œ ์ฑ„์ƒ‰ ํ‹ดํŠธ๊ฐ€ ๋‹คํฌ์—์„œ ์ง“๋ˆŒ๋ฆฌ๋ฏ€๋กœ ํ•œ ๋‹จ ์œ„๋ฅผ ์“ด๋‹ค. green ์€ ๋Œ€์นญ์ด๋ผ ๊ทธ๋Œ€๋กœ. */\n --u-primary-bg-color: var(--u-blue-100);\n --u-info-bg-color: var(--u-blue-100);\n --u-success-bg-color: var(--u-green-0);\n --u-danger-bg-color: var(--u-red-100);\n /* warning ํ•ฉ๋ฅ˜ โ€” ๋ผ์ดํŠธ๋Š” yellow-200 ์ด๋‹ค(๋‹จ ์ด๋ฆ„์ด ๋‹ค๋ฅธ ์ด์œ ๋Š” light.css ์ฐธ์กฐ). */\n --u-warning-bg-color: var(--u-yellow-100);\n\n --u-input-bg-color: var(--u-neutral-200);\n --u-panel-bg-color: var(--u-neutral-200);\n --u-overlay-bg-color: rgba(0, 0, 0, 0.7);\n --u-tooltip-bg-color: rgba(255, 255, 255, 0.85);\n\n /* Shadow Colors */\n --u-shadow-color-weaker: rgba(0, 0, 0, 0.15);\n --u-shadow-color-weak: rgba(0, 0, 0, 0.25);\n --u-shadow-color-normal: rgba(0, 0, 0, 0.35);\n --u-shadow-color-strong: rgba(0, 0, 0, 0.45);\n --u-shadow-color-stronger: rgba(0, 0, 0, 0.60);\n\n /* Elevation Scale โ€” ๊ทผ๊ฑฐ๋Š” light.css ์˜ ๊ฐ™์€ ์ž๋ฆฌ ์ฃผ์„ ์ฐธ์กฐ.\n โ˜…๋‹คํฌ๋Š” ์•ŒํŒŒ๊ฐ€ 3๋ฐฐ ๊ฐ€๊นŒ์ด ์ง„ํ•˜๋‹ค โ€” ๋ฆฌํ„ฐ๋Ÿด๋กœ ํฉ์–ด์ ธ ์žˆ๋˜ ์ข…์ „์—๋Š” ์ด ์ฐจ์ด๊ฐ€\n ์ ์šฉ๋˜์ง€ ์•Š์•„ ๋‹คํฌ์—์„œ ๊ทธ๋ฆผ์ž๊ฐ€ ์‚ฌ์‹ค์ƒ ๋ณด์ด์ง€ ์•Š์•˜๋‹ค. */\n --u-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25), 0 1px 1px rgba(0, 0, 0, 0.14); /* = shadow-color-weak */\n --u-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.18); /* = shadow-color-normal */\n --u-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.22); /* = shadow-color-strong */\n --u-shadow-xl: 0 6px 18px rgba(0, 0, 0, 0.60), 0 2px 6px rgba(0, 0, 0, 0.30); /* = shadow-color-stronger */\n\n\n /* Scrollbar Colors */\n --u-scrollbar-color: var(--u-neutral-500);\n --u-scrollbar-color-hover: var(--u-neutral-600);\n --u-scrollbar-track-color: transparent;\n}\n\n/* ==========================================================================\n โ˜…๋ชจ๋“œ์™€ ๋ฌด๊ด€ํ•œ ์Šค์ผ€์ผ โ€” ๋ฐ˜๊ฒฝยท์—ฌ๋ฐฑยท๊ธ€์ž ์Šค์ผ€์ผยท๋ชจ์…˜ยท๊ธ€๊ผด.\n ๊ฐ’์ด light.css ์™€ **๊ฐ™๋‹ค.** ๊ทธ๋Ÿฐ๋ฐ ์œ„ ๋ธ”๋ก(`:root[theme=\"dark\"]`, ํŠน์ด๋„ 0,1,1)์— ๋‘๋ฉด\n `:root`(0,1,0)๋กœ ์ด ํ† ํฐ์„ ๋ฎ๋Š” **๋ชจ๋“  ์ธต**(ํ•˜์šฐ์Šค ํ”„๋ฆฌ์…‹ยท์†Œ๋น„์ž ๋ธŒ๋žœ๋“œ ์‹œํŠธ)์ด ๋‹คํฌ\n ๋ชจ๋“œ์—์„œ๋งŒ **๋กœ๋“œ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ** ์ง„๋‹ค โ€” ์—๋Ÿฌ๋„ ๊ฒฝ๊ณ ๋„ ์—†์ด, ์ƒ‰์€ ์ •์ƒ์œผ๋กœ ๋ฐ”๋€Œ๋ฏ€๋กœ\n ยซ๋‹คํฌ๊ฐ€ ์ž˜ ๋œ๋‹คยป ๋กœ ๋ณด์ธ๋‹ค. `:where()` ๋กœ ํŠน์ด๋„๋ฅผ `:root` ์™€ ๊ฐ™๊ฒŒ ๋‘๋ฉด ์ธต ๋ชจ๋ธ์ด ๋ผ์ดํŠธ์™€\n ๋˜‘๊ฐ™์ด ๋กœ๋“œ ์ˆœ์„œ๋กœ ์„ ๋‹ค.\n โš ์ด ๋ธ”๋ก์„ ์ง€์šฐ์ง€ ๋ง ๊ฒƒ โ€” ์ด ์‹œํŠธ๋งŒ ์“ฐ๋Š” ยซ๊ณ ์ • ๋‹คํฌ ๋””์ž์ธยป ์†Œ๋น„์ž(docs/theming.md)๋Š”\n ์ด ํ† ํฐ๋“ค์„ ์—ฌ๊ธฐ์„œ ๋ฐ›๋Š”๋‹ค. ๋‘ ์‹œํŠธ๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ๊ฐ’์ด ๊ฐ™์œผ๋ฏ€๋กœ ์–ด๋А ์ชฝ์ด ์ด๊ฒจ๋„ ๊ฐ™๋‹ค.\n ========================================================================== */\n:root:where([theme=\"dark\"]) {\n /* ==========================================================================\n Radius Scale โ€” ๋ชจ์„œ๋ฆฌ ๋ฐ˜๊ฒฝ\n ๋ฆฌํ„ฐ๋Ÿด์„ ํฉ๋ฟŒ๋ฆฌ๋ฉด ๊ฐ’์ด ๊ฐˆ๋ฆฐ๋‹ค(์‹ค์ œ๋กœ pill ์ด 999px/9999px ๋‘ ํ‘œ๊ธฐ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์—ˆ๋‹ค).\n ========================================================================== */\n --u-radius-none: 0;\n --u-radius-sm: 3px;\n --u-radius-md: 4px;\n --u-radius-lg: 6px;\n --u-radius-xl: 8px;\n /* โ˜…์ƒ๋‹จ 2๋‹จ์€ **๋ฉด(surface)์šฉ**์ด๋‹ค โ€” ์นด๋“œยทํŒจ๋„ยท๋Œ€ํ™”์ƒ์ž์ฒ˜๋Ÿผ ํฐ ์‚ฌ๊ฐํ˜•์€ ์ปจํŠธ๋กค๊ณผ\n ๊ฐ™์€ ๋ฐ˜๊ฒฝ์„ ์“ฐ๋ฉด ๊ฐ์ ธ ๋ณด์ธ๋‹ค. ๊ธฐ์กด 5๋‹จ์€ **์ปจํŠธ๋กค์šฉ**์ด๊ณ  ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค\n (๋ฐ”๊พธ๋ฉด ๋ชจ๋“  ์†Œ๋น„์ž์˜ ๋ฒ„ํŠผยท์ž…๋ ฅ์ด ๋™์‹œ์— ์›€์ง์ธ๋‹ค). */\n --u-radius-2xl: 12px;\n --u-radius-3xl: 16px;\n --u-radius-pill: 9999px;\n --u-radius-circle: 50%;\n\n /* ==========================================================================\n Space Scale โ€” ์ปจํ…Œ์ด๋„ˆยท์˜ค๋ฒ„๋ ˆ์ด์˜ ์ ˆ๋Œ€ ์—ฌ๋ฐฑ\n โš **์—ฌ๋ฐฑ์€ ํ•˜๋‚˜์˜ ์ถ•์ด ์•„๋‹ˆ๋‹ค.** ์ด ์Šค์ผ€์ผ์€ ์ปจํ…Œ์ด๋„ˆ/์˜ค๋ฒ„๋ ˆ์ด์˜ **๋ ˆ์ด์•„์›ƒ ์—ฌ๋ฐฑ**๋งŒ\n ๋‹ด๋‹นํ•œ๋‹ค. ํผยท์ธ๋ผ์ธ ์š”์†Œ์˜ `em` ์—ฌ๋ฐฑ์€ ์ƒ์†๋œ `font-size` ์— ๋น„๋ก€ํ•˜๋Š” ๊ฒƒ์ด ์˜๋„์ด๋ฏ€๋กœ\n **์—ฌ๊ธฐ๋กœ ํก์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋ฐ˜๊ฒฝ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ…Œ๋งˆ์™€ ๋ฌด๊ด€ํ•˜๋ฏ€๋กœ ๋‘ ์‹œํŠธ๊ฐ€ ๊ฐ™๋‹ค.\n ์ถ• ๊ตฌ๋ถ„๊ณผ ๊ทผ๊ฑฐ๋Š” docs/design-tokens.md ์ฐธ์กฐ.\n ========================================================================== */\n --u-space-3xs: 2px;\n --u-space-2xs: 4px;\n --u-space-xs: 6px;\n --u-space-sm: 8px;\n --u-space-md: 12px;\n --u-space-lg: 16px;\n /* โ˜…์ƒ๋‹จ 4๋‹จ์€ **ํ™”๋ฉด ๋ฆฌ๋“ฌ**์ด๋‹ค โ€” ์นด๋“œ ์•ˆ์ชฝ ์—ฌ๋ฐฑ(20~24)ยท์„น์…˜ ๊ฐ„๊ฒฉ(24~32)ยทํŽ˜์ด์ง€ ์—ฌ๋ฐฑ\n (32~40). ์ข…์ „์—๋Š” ์ด ๊ตฌ๊ฐ„์ด ํ†ต์งธ๋กœ ๋น„์–ด ์žˆ์–ด ์†Œ๋น„์ž๊ฐ€ ์ „๋ถ€ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ ์—ˆ๊ณ ,\n ๊ทธ๋ž˜์„œ ์•ฑ๋งˆ๋‹ค ํ™”๋ฉด ๋ฐ€๋„๊ฐ€ ๋‹ฌ๋ผ์กŒ๋‹ค. `lg`(16px) ์ดํ•˜๋Š” **์š”์†Œ ์‚ฌ์ด**, `xl` ์ด์ƒ์€\n **์˜์—ญ ์‚ฌ์ด**๋กœ ๋‚˜๋ˆ  ์“ด๋‹ค.\n โš `xs: 6px` ๋Š” 4px ๊ฒฉ์ž์—์„œ ๋ฒ—์–ด๋‚˜ ์žˆ์œผ๋‚˜ **๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค** โ€” ์ด๋ฏธ ๋ฐฐ์„ ๋œ ์ปจํŠธ๋กค\n ์—ฌ๋ฐฑ์ด ์ „๋ถ€ ์›€์ง์ธ๋‹ค. ์‹ ๊ทœ ๋‹จ์€ ์ „๋ถ€ 4์˜ ๋ฐฐ์ˆ˜๋กœ ๋‘”๋‹ค. */\n --u-space-xl: 20px;\n --u-space-2xl: 24px;\n --u-space-3xl: 32px;\n --u-space-4xl: 40px;\n\n /* ==========================================================================\n Type Scale โ€” ๊ธ€์ž ํฌ๊ธฐยท๊ตต๊ธฐยทํ–‰๊ฐ„ยท์ž๊ฐ„์˜ **ํ•œ ๋ฒŒ**\n โ˜…**ํฌ๊ธฐ๋งŒ ์ฃผ๋ฉด ์Šค์ผ€์ผ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.** ์†Œ๋น„์ž๊ฐ€ ํฌ๊ธฐ๋งŒ ๋ฐ›๊ณ  ๊ตต๊ธฐยทํ–‰๊ฐ„์„ ๊ฐ์ž ์ •ํ•˜๋ฉด\n ๊ฒฐ๊ตญ ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค๋ฅธ ์œ„๊ณ„๊ฐ€ ์ƒ๊ธด๋‹ค โ€” ๊ทธ๋ž˜์„œ ๋„ค ๊ฐ’์„ **๋‹จ ๋‹จ์œ„๋กœ ๋ฌถ์–ด** ๋‚ธ๋‹ค.\n\n ๋‹จ ์ด๋ฆ„์€ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ **์—ญํ• **์ด๋‹ค(`lg`/`xl` ์ด ์•„๋‹ˆ๋ผ `title`/`label`). ์—ญํ• ๋กœ ๋‘๋ฉด\n ์†Œ๋น„์ž๊ฐ€ *\"์–ด๋А ํฌ๊ธฐ๋ฅผ ์“ธ๊นŒ\"* ๊ฐ€ ์•„๋‹ˆ๋ผ *\"์ด ๊ธ€์ž๋Š” ๋ฌด์—‡์ธ๊ฐ€\"* ๋ฅผ ๋ฌป๊ฒŒ ๋œ๋‹ค.\n\n โ˜…**ํ•œ๊ธ€ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ๊ณจ๋ž๋‹ค**:\n โ‘ด ํ–‰๊ฐ„์€ **1.4 ์ด์ƒ**. ๋ผํ‹ด ๊ด€๋ก€(1.2)๋Š” ํ•œ๊ธ€์—์„œ ๋‹ต๋‹ตํ•˜๋‹ค โ€” ๋ฐ›์นจ ๋•Œ๋ฌธ์— ๊ธ€์ž ์ƒ์ž๊ฐ€\n ์„ธ๋กœ๋กœ ๊ฝ‰ ์ฐจ ์žˆ์–ด ๋ผํ‹ด๊ณผ ๊ฐ™์€ ํ–‰๊ฐ„์ด๋ฉด ์ค„์ด ๋ถ™์–ด ๋ณด์ธ๋‹ค.\n โ‘ต ์ž๊ฐ„์€ **0 ์ด ๊ธฐ๋ณธ**์ด๊ณ  ํฐ ์ œ๋ชฉ๋งŒ **์Œ์ˆ˜**. ํ•œ๊ธ€์— ์–‘์ˆ˜ ์ž๊ฐ„(letter-spacing)์„ ์ฃผ๋ฉด\n ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค โ€” ๋ผํ‹ด ์†Œ๋ฌธ์ž ์กฐํŒ ๊ด€๋ก€๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๋ฉด ์•ˆ ๋˜๋Š” ์ž๋ฆฌ๋‹ค.\n โ‘ถ `overline` ์—๋งŒ ์–‘์ˆ˜ ์ž๊ฐ„์„ ๋‘”๋‹ค. ๊ทธ ๋‹จ์€ **์˜๋ฌธยท์ˆซ์ž ๋ผ๋ฒจ**์„ ์ „์ œํ•œ ์ž๋ฆฌ์ด๊ณ ,\n ํ•œ๊ธ€์„ ๋„ฃ์„ ์†Œ๋น„์ž๋Š” ์ž๊ฐ„์„ 0 ์œผ๋กœ ๋ฎ์–ด์•ผ ํ•œ๋‹ค(๋ฌธ์„œ์— ๋ช…์‹œ).\n\n โš **`text-transform` ์€ ํ† ํฐ์œผ๋กœ ๋‚ด์ง€ ์•Š๋Š”๋‹ค.** ํ•œ๊ธ€์—๋Š” ๋Œ€๋ฌธ์ž๊ฐ€ ์—†์–ด `uppercase` ๊ฐ€\n ์•„๋ฌด ํšจ๊ณผ๊ฐ€ ์—†๊ณ , ์˜๋ฌธ์ด ์„ž์ด๋ฉด ๊ทธ๊ฒƒ๋งŒ ์ปค์ ธ ์˜คํžˆ๋ ค ์–ด์ˆ˜์„ ํ•ด์ง„๋‹ค.\n ========================================================================== */\n --u-text-display-size: 26px;\n --u-text-display-weight: 700;\n --u-text-display-leading: 1.4;\n --u-text-display-tracking: -0.02em;\n\n --u-text-title-size: 20px;\n --u-text-title-weight: 700;\n --u-text-title-leading: 1.45;\n --u-text-title-tracking: -0.01em;\n\n --u-text-subtitle-size: 16px;\n --u-text-subtitle-weight: 600;\n --u-text-subtitle-leading: 1.5;\n --u-text-subtitle-tracking: 0;\n\n --u-text-body-size: 14px;\n --u-text-body-weight: 400;\n --u-text-body-leading: 1.6;\n --u-text-body-tracking: 0;\n\n --u-text-label-size: 13px;\n --u-text-label-weight: 600;\n --u-text-label-leading: 1.5;\n --u-text-label-tracking: 0;\n\n --u-text-caption-size: 12px;\n --u-text-caption-weight: 400;\n --u-text-caption-leading: 1.5;\n --u-text-caption-tracking: 0;\n\n --u-text-overline-size: 11px;\n --u-text-overline-weight: 700;\n --u-text-overline-leading: 1.45;\n --u-text-overline-tracking: 0.06em;\n\n /* ==========================================================================\n Motion โ€” ์ง€์†์‹œ๊ฐ„ยท์ด์ง•\n โ˜…๊ฐ’์ด ์—†์œผ๋ฉด ์•ฑ๋งˆ๋‹ค ๋‹ค๋ฅธ ์†๋„๊ฐ€ ์ƒ๊ธฐ๊ณ , `prefers-reduced-motion` ์€ **๋ฐ˜๋“œ์‹œ**\n ๋น ๋œจ๋ฆฌ๋Š” ์•ฑ์ด ๋‚˜์˜จ๋‹ค. ์ถ•์„ ์—ฌ๊ธฐ ๋‘๊ณ  ์กด์ค‘ ๊ทœ์น™์€ ์•„๋ž˜ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ์ง„๋‹ค.\n ========================================================================== */\n --u-duration-instant: 80ms;\n --u-duration-fast: 140ms;\n --u-duration-normal: 220ms;\n --u-duration-slow: 320ms;\n --u-ease-standard: cubic-bezier(0.2, 0, 0, 1);\n --u-ease-decelerate: cubic-bezier(0, 0, 0, 1);\n --u-ease-accelerate: cubic-bezier(0.3, 0, 1, 1);\n\n /* ==========================================================================\n Font Styles\n โ˜…**CJK ํด๋ฐฑ์„ ์Šคํƒ์— ํฌํ•จํ•œ๋‹ค โ€” ๊ตญ์ œํ™”์ด์ง€ ์ทจํ–ฅ์ด ์•„๋‹ˆ๋‹ค.**\n ์ข…์ „ ์Šคํƒ(`-apple-system, Segoe UI, Noto Sans, Helvetica, Arial`)์—๋Š” **ํ•œ์ค‘์ผ ๊ธ€๋ฆฝ์„\n ๊ฐ€์ง„ ํฐํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์—ˆ๋‹ค.** Windows ์—์„œ ํ•œ๊ธ€์€ `Segoe UI` ์— ์—†์œผ๋ฏ€๋กœ UA ๊ฐ€ ์ž„์˜๋กœ\n ๋ง‘์€ ๊ณ ๋”•์„ ๊ณ ๋ฅด๊ณ , macOS ๋Š” `-apple-system` ์ด Apple SD Gothic Neo ๋ฅผ ์ค€๋‹ค โ‡’ **๊ฐ™์€ ์•ฑ์ด\n OS ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ธ€๊ผด๋กœ ๋ Œ๋”**๋๋‹ค. ํด๋ฐฑ์„ ๋ช…์‹œํ•˜๋ฉด ๊ทธ ์„ ํƒ์ด ๊ฒฐ์ •์ ์ด ๋œ๋‹ค.\n โš **์›นํฐํŠธ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋งŒ๋“ค๋ฉด ์†Œ๋น„์ž์˜ CSPยท\n ์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ์„ ๊นฌ๋‹ค. ์Šคํƒ ๋งจ ์•ž์˜ `Pretendard` ๋Š” **์†Œ๋น„์ž๊ฐ€ ๋กœ๋“œํ–ˆ์„ ๋•Œ๋งŒ** ์žกํžˆ๋Š”\n ์„ ํƒ์  ์ด๋ฆ„์ด๋‹ค(์—†์œผ๋ฉด ์กฐ์šฉํžˆ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค).\n ========================================================================== */\n --u-font-base: 'Pretendard Variable', Pretendard, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, 'Apple SD Gothic Neo', 'Malgun Gothic', 'Noto Sans KR', 'Hiragino Sans', 'Yu Gothic UI', 'Microsoft YaHei', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';\n --u-font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Monaco, 'Courier New', monospace;\n --u-font-serif: 'Georgia', 'Times New Roman', Times, serif;\n --u-font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n --u-font-modern: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --u-font-rounded: 'Nunito', 'Quicksand', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n\n/* โ˜…`prefers-reduced-motion` โ€” light.css ์™€ ๊ฐ™์€ ๊ทœ์น™์„ ์ด ์‹œํŠธ๋„ ์ง„๋‹ค. ์ด ์‹œํŠธ๋งŒ ์“ฐ๋Š”\n ์†Œ๋น„์ž๊ฐ€ ์žˆ๊ณ , ๋‘ ์‹œํŠธ๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์–ด๋А ์‹œํŠธ๊ฐ€ ๋’ค์— ์˜ค๋“  **๋งˆ์ง€๋ง‰ ์„ ์–ธ์ด ์ด 0ms**\n ๊ฐ€ ๋˜๋„๋ก ๊ฐ ์‹œํŠธ๊ฐ€ ์ž๊ธฐ ๋ธ”๋ก ๋’ค์— ๋‘”๋‹ค. ์ข…์ „์—๋Š” ์ง€์†์‹œ๊ฐ„์ด ์œ„ (0,1,1) ๋ธ”๋ก์— ์žˆ์–ด\n ๋‹คํฌ ๋ชจ๋“œ์—์„œ ยซ๋™์ž‘ ์ค„์ด๊ธฐยป ์„ค์ •์ด **๋ฌด์‹œ๋๋‹ค.** */\n@media (prefers-reduced-motion: reduce) {\n :root:where([theme=\"dark\"]) {\n --u-duration-instant: 0ms;\n --u-duration-fast: 0ms;\n --u-duration-normal: 0ms;\n --u-duration-slow: 0ms;\n }\n}\n";
3
3
  //#endregion
4
4
  export { dark_css_default as default };
@@ -38,6 +38,8 @@ var alertMessage = "ุฑุณุงู„ุฉ";
38
38
  var remove = "ุฅุฒุงู„ุฉ";
39
39
  var closeTab = "ุฅุบู„ุงู‚ ุนู„ุงู…ุฉ ุงู„ุชุจูˆูŠุจ";
40
40
  var breadcrumb = "ู…ุณุงุฑ ุงู„ุชู†ู‚ู„";
41
+ var confirm = "ุชุฃูƒูŠุฏ";
42
+ var cancel = "ุฅู„ุบุงุก";
41
43
  var ar_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var ar_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, ar_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, ar_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "Nachricht";
38
38
  var remove = "Entfernen";
39
39
  var closeTab = "Tab schlieรŸen";
40
40
  var breadcrumb = "Navigationspfad";
41
+ var confirm = "Bestรคtigen";
42
+ var cancel = "Abbrechen";
41
43
  var de_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var de_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, de_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, de_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "Message";
38
38
  var remove = "Remove";
39
39
  var closeTab = "Close tab";
40
40
  var breadcrumb = "Breadcrumb";
41
+ var confirm = "Confirm";
42
+ var cancel = "Cancel";
41
43
  var en_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var en_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, en_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, en_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -37,6 +37,8 @@ var alertMessage = "Mensaje";
37
37
  var remove = "Quitar";
38
38
  var closeTab = "Cerrar pestaรฑa";
39
39
  var breadcrumb = "Ruta de navegaciรณn";
40
+ var confirm = "Confirmar";
41
+ var cancel = "Cancelar";
40
42
  var es_default = {
41
43
  valueMissing,
42
44
  badInput,
@@ -76,7 +78,9 @@ var es_default = {
76
78
  alertMessage,
77
79
  remove,
78
80
  closeTab,
79
- breadcrumb
81
+ breadcrumb,
82
+ confirm,
83
+ cancel
80
84
  };
81
85
  //#endregion
82
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, es_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, tooLong, tooShort, typeMismatch, valueMissing };
86
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, es_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "Message";
38
38
  var remove = "Supprimer";
39
39
  var closeTab = "Fermer l'onglet";
40
40
  var breadcrumb = "Fil d'Ariane";
41
+ var confirm = "Confirmer";
42
+ var cancel = "Annuler";
41
43
  var fr_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var fr_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, fr_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, fr_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "Pesan";
38
38
  var remove = "Hapus";
39
39
  var closeTab = "Tutup tab";
40
40
  var breadcrumb = "Navigasi remah roti";
41
+ var confirm = "Konfirmasi";
42
+ var cancel = "Batal";
41
43
  var id_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var id_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, id_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, id_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,7 @@ var alertMessage = "ใƒกใƒƒใ‚ปใƒผใ‚ธ";
38
38
  var remove = "ๅ‰Š้™ค";
39
39
  var closeTab = "ใ‚ฟใƒ–ใ‚’้–‰ใ˜ใ‚‹";
40
40
  var breadcrumb = "ใƒ‘ใƒณใใšใƒชใ‚นใƒˆ";
41
+ var cancel = "ใ‚ญใƒฃใƒณใ‚ปใƒซ";
41
42
  var ja_default = {
42
43
  valueMissing,
43
44
  badInput,
@@ -77,7 +78,9 @@ var ja_default = {
77
78
  alertMessage,
78
79
  remove,
79
80
  closeTab,
80
- breadcrumb
81
+ breadcrumb,
82
+ confirm: "OK",
83
+ cancel
81
84
  };
82
85
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, ja_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
86
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, ja_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "๋ฉ”์‹œ์ง€";
38
38
  var remove = "์ œ๊ฑฐ";
39
39
  var closeTab = "ํƒญ ๋‹ซ๊ธฐ";
40
40
  var breadcrumb = "ํƒ์ƒ‰ ๊ฒฝ๋กœ";
41
+ var confirm = "ํ™•์ธ";
42
+ var cancel = "์ทจ์†Œ";
41
43
  var ko_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var ko_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, ko_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, ko_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "Mensagem";
38
38
  var remove = "Remover";
39
39
  var closeTab = "Fechar aba";
40
40
  var breadcrumb = "Trilha de navegaรงรฃo";
41
+ var confirm = "Confirmar";
42
+ var cancel = "Cancelar";
41
43
  var pt_BR_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var pt_BR_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, pt_BR_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, pt_BR_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "ะกะพะพะฑั‰ะตะฝะธะต";
38
38
  var remove = "ะฃะดะฐะปะธั‚ัŒ";
39
39
  var closeTab = "ะ—ะฐะบั€ั‹ั‚ัŒ ะฒะบะปะฐะดะบัƒ";
40
40
  var breadcrumb = "ะะฐะฒะธะณะฐั†ะธะพะฝะฝะฐั ั†ะตะฟะพั‡ะบะฐ";
41
+ var confirm = "ะŸะพะดั‚ะฒะตั€ะดะธั‚ัŒ";
42
+ var cancel = "ะžั‚ะผะตะฝะฐ";
41
43
  var ru_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var ru_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, ru_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, ru_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "เธ‚เน‰เธญเธ„เธงเธฒเธก";
38
38
  var remove = "เธฅเธš";
39
39
  var closeTab = "เธ›เธดเธ”เนเธ—เน‡เธš";
40
40
  var breadcrumb = "เน€เธชเน‰เธ™เธ—เธฒเธ‡เธเธฒเธฃเธ™เธณเธ—เธฒเธ‡";
41
+ var confirm = "เธขเธทเธ™เธขเธฑเธ™";
42
+ var cancel = "เธขเธเน€เธฅเธดเธ";
41
43
  var th_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var th_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, th_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, th_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "Thรดng bรกo";
38
38
  var remove = "Xรณa";
39
39
  var closeTab = "ฤรณng tab";
40
40
  var breadcrumb = "ฤฦฐแปng dแบซn ฤ‘iแปu hฦฐแป›ng";
41
+ var confirm = "Xรกc nhแบญn";
42
+ var cancel = "Hแปงy";
41
43
  var vi_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var vi_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, vi_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, vi_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "ๆถˆๆฏ";
38
38
  var remove = "็งป้™ค";
39
39
  var closeTab = "ๅ…ณ้—ญๆ ‡็ญพ้กต";
40
40
  var breadcrumb = "้ขๅŒ…ๅฑ‘ๅฏผ่ˆช";
41
+ var confirm = "็กฎๅฎš";
42
+ var cancel = "ๅ–ๆถˆ";
41
43
  var zh_CN_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var zh_CN_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, zh_CN_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, zh_CN_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -38,6 +38,8 @@ var alertMessage = "่จŠๆฏ";
38
38
  var remove = "็งป้™ค";
39
39
  var closeTab = "้—œ้–‰ๅˆ†้ ";
40
40
  var breadcrumb = "้บตๅŒ…ๅฑ‘ๅฐŽ่ฆฝ";
41
+ var confirm = "็ขบๅฎš";
42
+ var cancel = "ๅ–ๆถˆ";
41
43
  var zh_TW_default = {
42
44
  valueMissing,
43
45
  badInput,
@@ -77,7 +79,9 @@ var zh_TW_default = {
77
79
  alertMessage,
78
80
  remove,
79
81
  closeTab,
80
- breadcrumb
82
+ breadcrumb,
83
+ confirm,
84
+ cancel
81
85
  };
82
86
  //#endregion
83
- export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, chooseDate, chooseFile, clear, close, closeTab, copied, copy, decrement, zh_TW_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
87
+ export { alertError, alertInfo, alertMessage, alertNotice, alertSuccess, alertWarning, badInput, breadcrumb, cancel, chooseDate, chooseFile, clear, close, closeTab, confirm, copied, copy, decrement, zh_TW_default as default, filesSelected, goToSlide, hidePassword, increment, nextMonth, nextSlide, noFileChosen, patternMismatch, previousMonth, previousSlide, rangeOverflow, rangeUnderflow, remove, resizePanels, search, showPassword, stepMismatch, time, today, tooLong, tooShort, typeMismatch, valueMissing };
@@ -87,6 +87,12 @@ export declare abstract class UOverlayElement extends UElement {
87
87
  private cleanup;
88
88
  /** host ์ž์ฒด๋ฅผ ํด๋ฆญํ•œ ๊ฒฝ์šฐ(๋ฐฑ๋“œ๋กญ)๋งŒ ๋‹ซ๊ธฐ ์š”์ฒญ */
89
89
  private handlePointerdown;
90
- /** ESC ํ‚ค ์ž…๋ ฅ ์‹œ ๋‹ซ๊ธฐ ์š”์ฒญ (์ตœ์ƒ์œ„ ์˜ค๋ฒ„๋ ˆ์ด์— ๋Œ€ํ•ด์„œ๋งŒ) */
90
+ /**
91
+ * ESC ํ‚ค ์ž…๋ ฅ ์‹œ ๋‹ซ๊ธฐ ์š”์ฒญ (์ตœ์ƒ์œ„ ์˜ค๋ฒ„๋ ˆ์ด์— ๋Œ€ํ•ด์„œ๋งŒ).
92
+ *
93
+ * ์ด๋ฏธ ์†Œ๋น„๋œ Escape(`defaultPrevented`)๋Š” ๋ฐ›์ง€ ์•Š๋Š”๋‹ค โ€” ์˜ค๋ฒ„๋ ˆ์ด ์•ˆ์—์„œ ์—ด๋ฆฐ ๋ชฉ๋กยทํŒ์˜ค๋ฒ„๊ฐ€
94
+ * ์ž๊ธฐ ์ธต์„ ๋‹ซ์œผ๋ฉฐ ๋จน์€ ํ‚ค๋‹ค. ํ•œ ๋ฒˆ์˜ Escape ๋Š” ํ•œ ์ธต๋งŒ ๋‹ซ๋Š”๋‹ค. ์ด ๋ฆฌ์Šค๋„ˆ๋Š” window ๋ฒ„๋ธ”์—
95
+ * ์žˆ์œผ๋ฏ€๋กœ ์•ˆ์ชฝ ์ปจํŠธ๋กค๊ณผ document ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋ชจ๋‘ ๋ˆ ยซ๋’คยป ์— ํŒ๋‹จํ•œ๋‹ค.
96
+ */
91
97
  private handleWindowKeydown;
92
98
  }
@@ -28,7 +28,7 @@ var UOverlayElement = class extends UElement {
28
28
  if (e.composedPath()[0] === this) this.requestClose("backdrop");
29
29
  };
30
30
  this.handleWindowKeydown = (e) => {
31
- if (!this.open || e.key !== "Escape") return;
31
+ if (!this.open || e.key !== "Escape" || e.defaultPrevented) return;
32
32
  if (!OverlayManager.isTopmost(this)) return;
33
33
  e.preventDefault();
34
34
  this.requestClose("escape");
@@ -25,6 +25,7 @@ var UBreadcrumbItem = class UBreadcrumbItem extends UElement {
25
25
  if (this.href) return html`
26
26
  <a part="link"
27
27
  href=${this.href}
28
+ aria-disabled=${ifDefined(this.disabled ? "true" : void 0)}
28
29
  target=${ifDefined(this.target)}
29
30
  rel=${ifDefined(this.rel)}
30
31
  @click=${this.handleAnchorClick}
@@ -201,6 +201,7 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
201
201
  <div class="container" part="container"
202
202
  tabindex=${this.disabled ? "-1" : "0"}
203
203
  role="combobox"
204
+ aria-disabled=${ifDefined(this.disabled ? "true" : void 0)}
204
205
  aria-haspopup="dialog"
205
206
  aria-expanded=${this.open}
206
207
  aria-label=${ifDefined(this.resolvedAriaLabel)}
@@ -72,8 +72,9 @@ var UInput = class UInput extends UFormControlElement {
72
72
  this.options.find((o) => !o.hidden && !o.disabled)?.focus();
73
73
  break;
74
74
  case "Escape":
75
+ if (!this.popoverEl?.open) break;
75
76
  e.preventDefault();
76
- this.popoverEl?.hide();
77
+ this.popoverEl.hide();
77
78
  }
78
79
  };
79
80
  this.handleSuffixIconKeydown = (action) => (e) => {
@@ -74,7 +74,11 @@ var UMenuItem = class UMenuItem extends UElement {
74
74
  }
75
75
  updated(changedProperties) {
76
76
  super.updated(changedProperties);
77
- if (changedProperties.has("disabled")) this.setAttribute("tabindex", this.disabled ? "-1" : "0");
77
+ if (changedProperties.has("disabled")) {
78
+ this.setAttribute("tabindex", this.disabled ? "-1" : "0");
79
+ if (this.disabled) this.setAttribute("aria-disabled", "true");
80
+ else this.removeAttribute("aria-disabled");
81
+ }
78
82
  if (changedProperties.has("expanded") && !this.expanded) this._childItems.forEach((c) => c.expanded = false);
79
83
  if (changedProperties.has("depth") || changedProperties.has("inline")) this.style.setProperty("--menu-item-depth", String(this.inline ? this.depth : 0));
80
84
  }
@@ -59,6 +59,16 @@ export declare class UPopover extends UFloatingElement {
59
59
  private startSafeTimer;
60
60
  private cancelSafeTimer;
61
61
  private handleDocumentClick;
62
+ /**
63
+ * ์ด ๋ฆฌ์Šค๋„ˆ๋Š” `dismiss` ์— `escape` ๊ฐ€ ์žˆ์œผ๋ฉด **์—ฐ๊ฒฐ ์‹œ์ ์—** document ์— ๋ถ™์œผ๋ฏ€๋กœ, ๋‹ซํžŒ
64
+ * ์ธ์Šคํ„ด์Šค๋„ ๋ชจ๋“  Escape ๋ฅผ ๋ฐ›๋Š”๋‹ค. ๋‹ซํžŒ ํŒ์˜ค๋ฒ„๋Š” Escape ๋กœ ํ•  ์ผ์ด ์—†๋‹ค โ€” ์—ฌ๊ธฐ์„œ
65
+ * `preventDefault()` ํ•˜๋ฉด ํ™”๋ฉด์— ํŒ์˜ค๋ฒ„๊ฐ€ ยซ์กด์žฌํ•˜๊ธฐ๋งŒยป ํ•ด๋„ document ๋ฒ„๋ธ” ์‹œ์ ์˜ Escape ๊ฐ€
66
+ * ํ•ญ์ƒ ์†Œ๋น„๋œ ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ, ์†Œ๋น„์ž(๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ ์˜ค๋ฒ„๋ ˆ์ด)๊ฐ€ `defaultPrevented` ๋กœ ยซ์œ„์—์„œ ๋ˆ„๊ฐ€
67
+ * ๋จน์—ˆ๋‚˜ยป ๋ฅผ ๊ฐ€๋ฆด ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.
68
+ *
69
+ * ํ‘œ์‹œ ๋Œ€๊ธฐ ์ค‘(`showDelay`)์ด๋ฉด `targetEl` ์ด ์ด๋ฏธ ์„œ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ๋Œ€๊ธฐ๋Š” ์ทจ์†Œํ•œ๋‹ค โ€” ๋‹ค๋งŒ
70
+ * ์•„์ง ๋ณด์ด์ง€ ์•Š์•˜์œผ๋‹ˆ ์†Œ๋น„ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
71
+ */
62
72
  private handleDocumentKeydown;
63
73
  /**
64
74
  * ํ˜„์žฌ ํ‘œ์‹œ ์ค‘์ด๋ฉฐ ์•ต์ปค๊ฐ€ **์ขŒํ‘œ ๊ธฐ๋ฐ˜ ๊ฐ€์ƒ ์—˜๋ฆฌ๋จผํŠธ**์ธ์ง€ ์—ฌ๋ถ€.
@@ -99,6 +99,7 @@ var UPopover = class UPopover extends UFloatingElement {
99
99
  this.startSafeTimer();
100
100
  };
101
101
  this.handleDocumentClick = (e) => {
102
+ if (!this.open && !this.targetEl) return;
102
103
  if (this.trigger === "contextmenu") {
103
104
  this.hide();
104
105
  return;
@@ -110,7 +111,8 @@ var UPopover = class UPopover extends UFloatingElement {
110
111
  };
111
112
  this.handleDocumentKeydown = (e) => {
112
113
  if (e.key !== "Escape") return;
113
- e.preventDefault();
114
+ if (!this.open && !this.targetEl) return;
115
+ if (this.open) e.preventDefault();
114
116
  this.hide();
115
117
  };
116
118
  this.handleDocumentScroll = () => {
@@ -93,6 +93,7 @@ var URadio = class URadio extends UFormControlElement {
93
93
  >
94
94
  <div class="container" part="container"
95
95
  role="radiogroup"
96
+ aria-disabled=${ifDefined(this.disabled ? "true" : void 0)}
96
97
  aria-label=${ifDefined(this.resolvedAriaLabel)}
97
98
  aria-description=${ifDefined(this.resolvedAriaDescription)}>
98
99
  <slot @slotchange=${this.handleSlotChange}></slot>
@@ -112,6 +112,7 @@ var URating = class URating extends UFormControlElement {
112
112
  .validationMessage=${this.validationMessage}
113
113
  >
114
114
  <div class="symbols" part="container" role="radiogroup"
115
+ aria-disabled=${ifDefined(this.disabled ? "true" : void 0)}
115
116
  aria-label=${ifDefined(this.resolvedAriaLabel)}
116
117
  aria-description=${ifDefined(this.resolvedAriaDescription)}>
117
118
  ${Array.from({ length: this.max }, (_, i) => {
@@ -89,6 +89,14 @@ export declare class USelect extends UFormControlElement<string | string[]> {
89
89
  * updated() ๊ฒฝ๋กœ๋Š” base์˜ silent setValidity()๋งŒ ์ˆ˜ํ–‰ํ•ด Lit ์ค‘๋ณต ์—…๋ฐ์ดํŠธ๋ฅผ ํ”ผํ•œ๋‹ค). */
90
90
  private emitChange;
91
91
  private handleSlotChange;
92
+ /**
93
+ * ๋ชฉ๋ก์ด ๋‹ซํž ๋•Œ ํฌ์ปค์Šค๊ฐ€ ๊ทธ ยซ์•ˆยป(์˜ต์…˜ยท๊ฒ€์ƒ‰ ์ž…๋ ฅ)์— ์žˆ์—ˆ์œผ๋ฉด ์ฝค๋ณด๋ฐ•์Šค๋กœ ๋˜๋Œ๋ฆฐ๋‹ค.
94
+ *
95
+ * ๋˜๋Œ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ํฌ์ปค์Šค๊ฐ€ ์ˆจ์€ ๋ชฉ๋ก ์•ˆ์— ๋‚จ๋Š”๋‹ค โ€” ํ‚ค๋ณด๋“œ ์‚ฌ์šฉ์ž๋Š” ์ž๊ธฐ ์œ„์น˜๋ฅผ ์žƒ๊ณ ,
96
+ * ๊ทธ ์˜ต์…˜์€ ๋‹ค์Œ Escape ๊นŒ์ง€ ๋ฐ›์•„ ์†Œ๋น„ํ•ด ๋ฐ”๊นฅ ์ธต(์˜ค๋ฒ„๋ ˆ์ดยท์†Œ๋น„์ž ํŒจ๋„)์ด ๋‹ซํžˆ์ง€ ์•Š๋Š”๋‹ค.
97
+ * ๋ฐ”๊นฅ ํด๋ฆญ์œผ๋กœ ๋‹ซํž ๋•Œ๋Š” ํฌ์ปค์Šค๊ฐ€ ์ด๋ฏธ ๋‹ค๋ฅธ ๊ณณ์— ์žˆ์œผ๋ฏ€๋กœ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
98
+ */
99
+ private handlePopoverHide;
92
100
  private handleOptionClick;
93
101
  private handleOptionKeydown;
94
102
  private handleSearchInput;
@@ -31,6 +31,10 @@ var USelect = class USelect extends UFormControlElement {
31
31
  this.options = slot.assignedElements({ flatten: true }).filter((el) => el instanceof UOption);
32
32
  this.setup(this.options);
33
33
  };
34
+ this.handlePopoverHide = () => {
35
+ this.open = false;
36
+ if (this.popoverEl?.matches(":focus-within")) this.containerEl?.focus();
37
+ };
34
38
  this.handleOptionClick = (e) => {
35
39
  const option = e.currentTarget;
36
40
  if (option.disabled) return;
@@ -173,6 +177,7 @@ var USelect = class USelect extends UFormControlElement {
173
177
 
174
178
  <div class="container" part="container" tabindex=${this.disabled ? "-1" : "0"}
175
179
  role="combobox"
180
+ aria-disabled=${ifDefined(this.disabled ? "true" : void 0)}
176
181
  aria-label=${ifDefined(this.resolvedAriaLabel)}
177
182
  aria-description=${ifDefined(this.resolvedAriaDescription)}
178
183
  aria-haspopup=${this.searchable ? "dialog" : "listbox"}
@@ -215,7 +220,7 @@ var USelect = class USelect extends UFormControlElement {
215
220
  for=".container"
216
221
  trigger="click"
217
222
  @show=${() => this.open = true}
218
- @hide=${() => this.open = false}
223
+ @hide=${this.handlePopoverHide}
219
224
  strategy="fixed"
220
225
  placement="bottom-start"
221
226
  offset="1"
@@ -1,3 +1,4 @@
1
+ import { PropertyValues } from 'lit';
1
2
  import { UElement } from '../UElement.js';
2
3
  /**
3
4
  * ํƒญ ํŒจ๋„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒญ ์•„์ดํ…œ(ํƒญ ๋ฒ„ํŠผ) ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
@@ -24,6 +25,7 @@ export declare class UTab extends UElement {
24
25
  /** ํƒญ ๋“œ๋ž˜๊ทธ ์—ฌ๋ถ€ */
25
26
  draggable: boolean;
26
27
  connectedCallback(): void;
28
+ protected updated(changedProperties: PropertyValues): void;
27
29
  render(): import('lit-html').TemplateResult<1>;
28
30
  private handleRemoveClick;
29
31
  }
@@ -33,6 +33,13 @@ var UTab = class UTab extends UElement {
33
33
  this.setAttribute("tabindex", "0");
34
34
  if (!this.hasAttribute("slot")) this.setAttribute("slot", "tab");
35
35
  }
36
+ updated(changedProperties) {
37
+ super.updated(changedProperties);
38
+ if (changedProperties.has("disabled")) {
39
+ if (this.disabled) this.setAttribute("aria-disabled", "true");
40
+ else this.removeAttribute("aria-disabled");
41
+ }
42
+ }
36
43
  render() {
37
44
  return html`
38
45
  <div class="base" part="base">
@@ -83,7 +83,11 @@ var UTreeItem = class UTreeItem extends UElement {
83
83
  }
84
84
  updated(changedProperties) {
85
85
  super.updated(changedProperties);
86
- if (changedProperties.has("disabled")) this.setAttribute("tabindex", this.disabled ? "-1" : "0");
86
+ if (changedProperties.has("disabled")) {
87
+ this.setAttribute("tabindex", this.disabled ? "-1" : "0");
88
+ if (this.disabled) this.setAttribute("aria-disabled", "true");
89
+ else this.removeAttribute("aria-disabled");
90
+ }
87
91
  if (changedProperties.has("depth")) this.style.setProperty("--tree-item-depth", String(this.depth));
88
92
  }
89
93
  render() {
@@ -185,47 +185,6 @@
185
185
  --u-danger-color-weak: var(--u-red-500);
186
186
  --u-danger-color: var(--u-red-600); /* ๋ฉด: ํฐ ๊ธ€์ž 6.83 โœ“ */
187
187
  --u-danger-color-strong: var(--u-red-800); /* ๊ธ€์ž: ๋ฐ”ํƒ• 4.87 โœ“ (700 ์€ 3.67 โœ—) */
188
- /* ==========================================================================
189
- Radius Scale โ€” ๋ชจ์„œ๋ฆฌ ๋ฐ˜๊ฒฝ
190
- ๋ฆฌํ„ฐ๋Ÿด์„ ํฉ๋ฟŒ๋ฆฌ๋ฉด ๊ฐ’์ด ๊ฐˆ๋ฆฐ๋‹ค(์‹ค์ œ๋กœ pill ์ด 999px/9999px ๋‘ ํ‘œ๊ธฐ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์—ˆ๋‹ค).
191
- ========================================================================== */
192
- --u-radius-none: 0;
193
- --u-radius-sm: 3px;
194
- --u-radius-md: 4px;
195
- --u-radius-lg: 6px;
196
- --u-radius-xl: 8px;
197
- /* โ˜…์ƒ๋‹จ 2๋‹จ์€ **๋ฉด(surface)์šฉ**์ด๋‹ค โ€” ์นด๋“œยทํŒจ๋„ยท๋Œ€ํ™”์ƒ์ž์ฒ˜๋Ÿผ ํฐ ์‚ฌ๊ฐํ˜•์€ ์ปจํŠธ๋กค๊ณผ
198
- ๊ฐ™์€ ๋ฐ˜๊ฒฝ์„ ์“ฐ๋ฉด ๊ฐ์ ธ ๋ณด์ธ๋‹ค. ๊ธฐ์กด 5๋‹จ์€ **์ปจํŠธ๋กค์šฉ**์ด๊ณ  ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค
199
- (๋ฐ”๊พธ๋ฉด ๋ชจ๋“  ์†Œ๋น„์ž์˜ ๋ฒ„ํŠผยท์ž…๋ ฅ์ด ๋™์‹œ์— ์›€์ง์ธ๋‹ค). */
200
- --u-radius-2xl: 12px;
201
- --u-radius-3xl: 16px;
202
- --u-radius-pill: 9999px;
203
- --u-radius-circle: 50%;
204
-
205
- /* ==========================================================================
206
- Space Scale โ€” ์ปจํ…Œ์ด๋„ˆยท์˜ค๋ฒ„๋ ˆ์ด์˜ ์ ˆ๋Œ€ ์—ฌ๋ฐฑ
207
- โš **์—ฌ๋ฐฑ์€ ํ•˜๋‚˜์˜ ์ถ•์ด ์•„๋‹ˆ๋‹ค.** ์ด ์Šค์ผ€์ผ์€ ์ปจํ…Œ์ด๋„ˆ/์˜ค๋ฒ„๋ ˆ์ด์˜ **๋ ˆ์ด์•„์›ƒ ์—ฌ๋ฐฑ**๋งŒ
208
- ๋‹ด๋‹นํ•œ๋‹ค. ํผยท์ธ๋ผ์ธ ์š”์†Œ์˜ `em` ์—ฌ๋ฐฑ์€ ์ƒ์†๋œ `font-size` ์— ๋น„๋ก€ํ•˜๋Š” ๊ฒƒ์ด ์˜๋„์ด๋ฏ€๋กœ
209
- **์—ฌ๊ธฐ๋กœ ํก์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋ฐ˜๊ฒฝ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ…Œ๋งˆ์™€ ๋ฌด๊ด€ํ•˜๋ฏ€๋กœ ๋‘ ์‹œํŠธ๊ฐ€ ๊ฐ™๋‹ค.
210
- ์ถ• ๊ตฌ๋ถ„๊ณผ ๊ทผ๊ฑฐ๋Š” docs/design-tokens.md ์ฐธ์กฐ.
211
- ========================================================================== */
212
- --u-space-3xs: 2px;
213
- --u-space-2xs: 4px;
214
- --u-space-xs: 6px;
215
- --u-space-sm: 8px;
216
- --u-space-md: 12px;
217
- --u-space-lg: 16px;
218
- /* โ˜…์ƒ๋‹จ 4๋‹จ์€ **ํ™”๋ฉด ๋ฆฌ๋“ฌ**์ด๋‹ค โ€” ์นด๋“œ ์•ˆ์ชฝ ์—ฌ๋ฐฑ(20~24)ยท์„น์…˜ ๊ฐ„๊ฒฉ(24~32)ยทํŽ˜์ด์ง€ ์—ฌ๋ฐฑ
219
- (32~40). ์ข…์ „์—๋Š” ์ด ๊ตฌ๊ฐ„์ด ํ†ต์งธ๋กœ ๋น„์–ด ์žˆ์–ด ์†Œ๋น„์ž๊ฐ€ ์ „๋ถ€ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ ์—ˆ๊ณ ,
220
- ๊ทธ๋ž˜์„œ ์•ฑ๋งˆ๋‹ค ํ™”๋ฉด ๋ฐ€๋„๊ฐ€ ๋‹ฌ๋ผ์กŒ๋‹ค. `lg`(16px) ์ดํ•˜๋Š” **์š”์†Œ ์‚ฌ์ด**, `xl` ์ด์ƒ์€
221
- **์˜์—ญ ์‚ฌ์ด**๋กœ ๋‚˜๋ˆ  ์“ด๋‹ค.
222
- โš `xs: 6px` ๋Š” 4px ๊ฒฉ์ž์—์„œ ๋ฒ—์–ด๋‚˜ ์žˆ์œผ๋‚˜ **๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค** โ€” ์ด๋ฏธ ๋ฐฐ์„ ๋œ ์ปจํŠธ๋กค
223
- ์—ฌ๋ฐฑ์ด ์ „๋ถ€ ์›€์ง์ธ๋‹ค. ์‹ ๊ทœ ๋‹จ์€ ์ „๋ถ€ 4์˜ ๋ฐฐ์ˆ˜๋กœ ๋‘”๋‹ค. */
224
- --u-space-xl: 20px;
225
- --u-space-2xl: 24px;
226
- --u-space-3xl: 32px;
227
- --u-space-4xl: 40px;
228
-
229
188
  /* Text Colors */
230
189
  --u-txt-color: var(--u-neutral-900);
231
190
  --u-txt-color-inverse: var(--u-neutral-100);
@@ -336,6 +295,64 @@
336
295
  --u-shadow-xl: 0 6px 18px rgba(0, 0, 0, 0.60), 0 2px 6px rgba(0, 0, 0, 0.30); /* = shadow-color-stronger */
337
296
 
338
297
 
298
+ /* Scrollbar Colors */
299
+ --u-scrollbar-color: var(--u-neutral-500);
300
+ --u-scrollbar-color-hover: var(--u-neutral-600);
301
+ --u-scrollbar-track-color: transparent;
302
+ }
303
+
304
+ /* ==========================================================================
305
+ โ˜…๋ชจ๋“œ์™€ ๋ฌด๊ด€ํ•œ ์Šค์ผ€์ผ โ€” ๋ฐ˜๊ฒฝยท์—ฌ๋ฐฑยท๊ธ€์ž ์Šค์ผ€์ผยท๋ชจ์…˜ยท๊ธ€๊ผด.
306
+ ๊ฐ’์ด light.css ์™€ **๊ฐ™๋‹ค.** ๊ทธ๋Ÿฐ๋ฐ ์œ„ ๋ธ”๋ก(`:root[theme="dark"]`, ํŠน์ด๋„ 0,1,1)์— ๋‘๋ฉด
307
+ `:root`(0,1,0)๋กœ ์ด ํ† ํฐ์„ ๋ฎ๋Š” **๋ชจ๋“  ์ธต**(ํ•˜์šฐ์Šค ํ”„๋ฆฌ์…‹ยท์†Œ๋น„์ž ๋ธŒ๋žœ๋“œ ์‹œํŠธ)์ด ๋‹คํฌ
308
+ ๋ชจ๋“œ์—์„œ๋งŒ **๋กœ๋“œ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ** ์ง„๋‹ค โ€” ์—๋Ÿฌ๋„ ๊ฒฝ๊ณ ๋„ ์—†์ด, ์ƒ‰์€ ์ •์ƒ์œผ๋กœ ๋ฐ”๋€Œ๋ฏ€๋กœ
309
+ ยซ๋‹คํฌ๊ฐ€ ์ž˜ ๋œ๋‹คยป ๋กœ ๋ณด์ธ๋‹ค. `:where()` ๋กœ ํŠน์ด๋„๋ฅผ `:root` ์™€ ๊ฐ™๊ฒŒ ๋‘๋ฉด ์ธต ๋ชจ๋ธ์ด ๋ผ์ดํŠธ์™€
310
+ ๋˜‘๊ฐ™์ด ๋กœ๋“œ ์ˆœ์„œ๋กœ ์„ ๋‹ค.
311
+ โš ์ด ๋ธ”๋ก์„ ์ง€์šฐ์ง€ ๋ง ๊ฒƒ โ€” ์ด ์‹œํŠธ๋งŒ ์“ฐ๋Š” ยซ๊ณ ์ • ๋‹คํฌ ๋””์ž์ธยป ์†Œ๋น„์ž(docs/theming.md)๋Š”
312
+ ์ด ํ† ํฐ๋“ค์„ ์—ฌ๊ธฐ์„œ ๋ฐ›๋Š”๋‹ค. ๋‘ ์‹œํŠธ๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ๊ฐ’์ด ๊ฐ™์œผ๋ฏ€๋กœ ์–ด๋А ์ชฝ์ด ์ด๊ฒจ๋„ ๊ฐ™๋‹ค.
313
+ ========================================================================== */
314
+ :root:where([theme="dark"]) {
315
+ /* ==========================================================================
316
+ Radius Scale โ€” ๋ชจ์„œ๋ฆฌ ๋ฐ˜๊ฒฝ
317
+ ๋ฆฌํ„ฐ๋Ÿด์„ ํฉ๋ฟŒ๋ฆฌ๋ฉด ๊ฐ’์ด ๊ฐˆ๋ฆฐ๋‹ค(์‹ค์ œ๋กœ pill ์ด 999px/9999px ๋‘ ํ‘œ๊ธฐ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์—ˆ๋‹ค).
318
+ ========================================================================== */
319
+ --u-radius-none: 0;
320
+ --u-radius-sm: 3px;
321
+ --u-radius-md: 4px;
322
+ --u-radius-lg: 6px;
323
+ --u-radius-xl: 8px;
324
+ /* โ˜…์ƒ๋‹จ 2๋‹จ์€ **๋ฉด(surface)์šฉ**์ด๋‹ค โ€” ์นด๋“œยทํŒจ๋„ยท๋Œ€ํ™”์ƒ์ž์ฒ˜๋Ÿผ ํฐ ์‚ฌ๊ฐํ˜•์€ ์ปจํŠธ๋กค๊ณผ
325
+ ๊ฐ™์€ ๋ฐ˜๊ฒฝ์„ ์“ฐ๋ฉด ๊ฐ์ ธ ๋ณด์ธ๋‹ค. ๊ธฐ์กด 5๋‹จ์€ **์ปจํŠธ๋กค์šฉ**์ด๊ณ  ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค
326
+ (๋ฐ”๊พธ๋ฉด ๋ชจ๋“  ์†Œ๋น„์ž์˜ ๋ฒ„ํŠผยท์ž…๋ ฅ์ด ๋™์‹œ์— ์›€์ง์ธ๋‹ค). */
327
+ --u-radius-2xl: 12px;
328
+ --u-radius-3xl: 16px;
329
+ --u-radius-pill: 9999px;
330
+ --u-radius-circle: 50%;
331
+
332
+ /* ==========================================================================
333
+ Space Scale โ€” ์ปจํ…Œ์ด๋„ˆยท์˜ค๋ฒ„๋ ˆ์ด์˜ ์ ˆ๋Œ€ ์—ฌ๋ฐฑ
334
+ โš **์—ฌ๋ฐฑ์€ ํ•˜๋‚˜์˜ ์ถ•์ด ์•„๋‹ˆ๋‹ค.** ์ด ์Šค์ผ€์ผ์€ ์ปจํ…Œ์ด๋„ˆ/์˜ค๋ฒ„๋ ˆ์ด์˜ **๋ ˆ์ด์•„์›ƒ ์—ฌ๋ฐฑ**๋งŒ
335
+ ๋‹ด๋‹นํ•œ๋‹ค. ํผยท์ธ๋ผ์ธ ์š”์†Œ์˜ `em` ์—ฌ๋ฐฑ์€ ์ƒ์†๋œ `font-size` ์— ๋น„๋ก€ํ•˜๋Š” ๊ฒƒ์ด ์˜๋„์ด๋ฏ€๋กœ
336
+ **์—ฌ๊ธฐ๋กœ ํก์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋ฐ˜๊ฒฝ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ…Œ๋งˆ์™€ ๋ฌด๊ด€ํ•˜๋ฏ€๋กœ ๋‘ ์‹œํŠธ๊ฐ€ ๊ฐ™๋‹ค.
337
+ ์ถ• ๊ตฌ๋ถ„๊ณผ ๊ทผ๊ฑฐ๋Š” docs/design-tokens.md ์ฐธ์กฐ.
338
+ ========================================================================== */
339
+ --u-space-3xs: 2px;
340
+ --u-space-2xs: 4px;
341
+ --u-space-xs: 6px;
342
+ --u-space-sm: 8px;
343
+ --u-space-md: 12px;
344
+ --u-space-lg: 16px;
345
+ /* โ˜…์ƒ๋‹จ 4๋‹จ์€ **ํ™”๋ฉด ๋ฆฌ๋“ฌ**์ด๋‹ค โ€” ์นด๋“œ ์•ˆ์ชฝ ์—ฌ๋ฐฑ(20~24)ยท์„น์…˜ ๊ฐ„๊ฒฉ(24~32)ยทํŽ˜์ด์ง€ ์—ฌ๋ฐฑ
346
+ (32~40). ์ข…์ „์—๋Š” ์ด ๊ตฌ๊ฐ„์ด ํ†ต์งธ๋กœ ๋น„์–ด ์žˆ์–ด ์†Œ๋น„์ž๊ฐ€ ์ „๋ถ€ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ ์—ˆ๊ณ ,
347
+ ๊ทธ๋ž˜์„œ ์•ฑ๋งˆ๋‹ค ํ™”๋ฉด ๋ฐ€๋„๊ฐ€ ๋‹ฌ๋ผ์กŒ๋‹ค. `lg`(16px) ์ดํ•˜๋Š” **์š”์†Œ ์‚ฌ์ด**, `xl` ์ด์ƒ์€
348
+ **์˜์—ญ ์‚ฌ์ด**๋กœ ๋‚˜๋ˆ  ์“ด๋‹ค.
349
+ โš `xs: 6px` ๋Š” 4px ๊ฒฉ์ž์—์„œ ๋ฒ—์–ด๋‚˜ ์žˆ์œผ๋‚˜ **๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค** โ€” ์ด๋ฏธ ๋ฐฐ์„ ๋œ ์ปจํŠธ๋กค
350
+ ์—ฌ๋ฐฑ์ด ์ „๋ถ€ ์›€์ง์ธ๋‹ค. ์‹ ๊ทœ ๋‹จ์€ ์ „๋ถ€ 4์˜ ๋ฐฐ์ˆ˜๋กœ ๋‘”๋‹ค. */
351
+ --u-space-xl: 20px;
352
+ --u-space-2xl: 24px;
353
+ --u-space-3xl: 32px;
354
+ --u-space-4xl: 40px;
355
+
339
356
  /* ==========================================================================
340
357
  Type Scale โ€” ๊ธ€์ž ํฌ๊ธฐยท๊ตต๊ธฐยทํ–‰๊ฐ„ยท์ž๊ฐ„์˜ **ํ•œ ๋ฒŒ**
341
358
  โ˜…**ํฌ๊ธฐ๋งŒ ์ฃผ๋ฉด ์Šค์ผ€์ผ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.** ์†Œ๋น„์ž๊ฐ€ ํฌ๊ธฐ๋งŒ ๋ฐ›๊ณ  ๊ตต๊ธฐยทํ–‰๊ฐ„์„ ๊ฐ์ž ์ •ํ•˜๋ฉด
@@ -403,11 +420,6 @@
403
420
  --u-ease-decelerate: cubic-bezier(0, 0, 0, 1);
404
421
  --u-ease-accelerate: cubic-bezier(0.3, 0, 1, 1);
405
422
 
406
- /* Scrollbar Colors */
407
- --u-scrollbar-color: var(--u-neutral-500);
408
- --u-scrollbar-color-hover: var(--u-neutral-600);
409
- --u-scrollbar-track-color: transparent;
410
-
411
423
  /* ==========================================================================
412
424
  Font Styles
413
425
  โ˜…**CJK ํด๋ฐฑ์„ ์Šคํƒ์— ํฌํ•จํ•œ๋‹ค โ€” ๊ตญ์ œํ™”์ด์ง€ ์ทจํ–ฅ์ด ์•„๋‹ˆ๋‹ค.**
@@ -425,4 +437,17 @@
425
437
  --u-font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
426
438
  --u-font-modern: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
427
439
  --u-font-rounded: 'Nunito', 'Quicksand', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
428
- }
440
+ }
441
+
442
+ /* โ˜…`prefers-reduced-motion` โ€” light.css ์™€ ๊ฐ™์€ ๊ทœ์น™์„ ์ด ์‹œํŠธ๋„ ์ง„๋‹ค. ์ด ์‹œํŠธ๋งŒ ์“ฐ๋Š”
443
+ ์†Œ๋น„์ž๊ฐ€ ์žˆ๊ณ , ๋‘ ์‹œํŠธ๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์–ด๋А ์‹œํŠธ๊ฐ€ ๋’ค์— ์˜ค๋“  **๋งˆ์ง€๋ง‰ ์„ ์–ธ์ด ์ด 0ms**
444
+ ๊ฐ€ ๋˜๋„๋ก ๊ฐ ์‹œํŠธ๊ฐ€ ์ž๊ธฐ ๋ธ”๋ก ๋’ค์— ๋‘”๋‹ค. ์ข…์ „์—๋Š” ์ง€์†์‹œ๊ฐ„์ด ์œ„ (0,1,1) ๋ธ”๋ก์— ์žˆ์–ด
445
+ ๋‹คํฌ ๋ชจ๋“œ์—์„œ ยซ๋™์ž‘ ์ค„์ด๊ธฐยป ์„ค์ •์ด **๋ฌด์‹œ๋๋‹ค.** */
446
+ @media (prefers-reduced-motion: reduce) {
447
+ :root:where([theme="dark"]) {
448
+ --u-duration-instant: 0ms;
449
+ --u-duration-fast: 0ms;
450
+ --u-duration-normal: 0ms;
451
+ --u-duration-slow: 0ms;
452
+ }
453
+ }
@@ -22,9 +22,9 @@ export interface DialogOptions {
22
22
  }
23
23
  /** Confirm Dialog ์˜ต์…˜ */
24
24
  export interface ConfirmDialogOptions extends DialogOptions {
25
- /** ํ™•์ธ ๋ฒ„ํŠผ ํ…์ŠคํŠธ (๊ธฐ๋ณธ: 'Confirm') */
25
+ /** ํ™•์ธ ๋ฒ„ํŠผ ํ…์ŠคํŠธ (๊ธฐ๋ณธ: ํ˜„์žฌ ๋กœ์ผ€์ผ์˜ `confirm` โ€” ์˜์–ด๋Š” 'Confirm') */
26
26
  confirmLabel?: string;
27
- /** ์ทจ์†Œ ๋ฒ„ํŠผ ํ…์ŠคํŠธ (๊ธฐ๋ณธ: 'Cancel') */
27
+ /** ์ทจ์†Œ ๋ฒ„ํŠผ ํ…์ŠคํŠธ (๊ธฐ๋ณธ: ํ˜„์žฌ ๋กœ์ผ€์ผ์˜ `cancel` โ€” ์˜์–ด๋Š” 'Cancel') */
28
28
  cancelLabel?: string;
29
29
  }
30
30
  /** Prompt Dialog ์˜ต์…˜ */
@@ -1,4 +1,5 @@
1
1
  import "../components/button/UButton.js";
2
+ import { Locale } from "./Locale.js";
2
3
  import { UDialog } from "../components/dialog/UDialog.js";
3
4
  import "../components/input/UInput.js";
4
5
  import { html, nothing, render } from "lit";
@@ -29,11 +30,11 @@ var Dialog = class {
29
30
  ...options,
30
31
  content: message,
31
32
  actions: [{
32
- label: options?.cancelLabel || "Cancel",
33
+ label: options?.cancelLabel || Locale.getValue("cancel"),
33
34
  value: "cancel",
34
35
  variant: "outlined"
35
36
  }, {
36
- label: options?.confirmLabel || "Confirm",
37
+ label: options?.confirmLabel || Locale.getValue("confirm"),
37
38
  value: "confirm"
38
39
  }]
39
40
  }) === "confirm";
@@ -68,11 +69,11 @@ var Dialog = class {
68
69
  </div>
69
70
  `,
70
71
  actions: [{
71
- label: options?.cancelLabel || "Cancel",
72
+ label: options?.cancelLabel || Locale.getValue("cancel"),
72
73
  value: "cancel",
73
74
  variant: "outlined"
74
75
  }, {
75
- label: options?.confirmLabel || "Confirm",
76
+ label: options?.confirmLabel || Locale.getValue("confirm"),
76
77
  value: "confirm"
77
78
  }]
78
79
  }) === "confirm" ? inputValue : null;
@@ -12,7 +12,7 @@ export type SupportedLocale = 'en' | 'ko' | 'ja' | 'zh-CN' | 'zh-TW' | 'es' | 'f
12
12
  /** ๋‚ด์žฅ ๋กœ์ผ€์ผ์€ ์ž๋™์™„์„ฑ๋˜์ง€๋งŒ, ์ž„์˜์˜ BCP47 ํƒœ๊ทธ๋„ ๊ทธ๋Œ€๋กœ ๋ฐ›๋Š”๋‹ค. */
13
13
  export type LocaleTag = SupportedLocale | (string & {});
14
14
  /** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” chrome ๋ฌธ์ž์—ด ํ‚ค. ์ง€๊ธˆ์€ ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€๋ฟ์ด์ง€๋งŒ ์ดํ›„ ๋‹ค๋ฅธ UI ๋ฌธ๊ตฌ๋„ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋‹ค. */
15
- export type LocaleMessageKey = 'valueMissing' | 'badInput' | 'typeMismatch' | 'patternMismatch' | 'rangeUnderflow' | 'rangeOverflow' | 'stepMismatch' | 'tooShort' | 'tooLong' | 'increment' | 'decrement' | 'clear' | 'today' | 'time' | 'showPassword' | 'hidePassword' | 'previousSlide' | 'nextSlide' | 'goToSlide' | 'chooseDate' | 'previousMonth' | 'nextMonth' | 'close' | 'copy' | 'copied' | 'chooseFile' | 'noFileChosen' | 'filesSelected' | 'resizePanels' | 'breadcrumb' | 'search' | 'alertError' | 'alertWarning' | 'alertSuccess' | 'alertInfo' | 'alertNotice' | 'alertMessage' | 'remove' | 'closeTab';
15
+ export type LocaleMessageKey = 'valueMissing' | 'badInput' | 'typeMismatch' | 'patternMismatch' | 'rangeUnderflow' | 'rangeOverflow' | 'stepMismatch' | 'tooShort' | 'tooLong' | 'increment' | 'decrement' | 'clear' | 'today' | 'time' | 'showPassword' | 'hidePassword' | 'previousSlide' | 'nextSlide' | 'goToSlide' | 'chooseDate' | 'previousMonth' | 'nextMonth' | 'close' | 'copy' | 'copied' | 'chooseFile' | 'noFileChosen' | 'filesSelected' | 'resizePanels' | 'breadcrumb' | 'search' | 'alertError' | 'alertWarning' | 'alertSuccess' | 'alertInfo' | 'alertNotice' | 'alertMessage' | 'remove' | 'closeTab' | 'confirm' | 'cancel';
16
16
  type LocaleTable = Record<LocaleMessageKey, string>;
17
17
  /**
18
18
  * ํ•œ ํŒจํ‚ค์ง€(๋˜๋Š” ์•ฑ ์˜์—ญ)์˜ ๋ฌธ์ž์—ด ๋ฌถ์Œ.
@@ -102,6 +102,24 @@ export declare class Theme {
102
102
  static accent(seed: string | null): void;
103
103
  /** ํ˜„์žฌ ์‹œ๋“œ๋ฅผ ํ˜„์žฌ ํ…Œ๋งˆ์˜ ๋ฐ”ํƒ•์— ๋งž์ถฐ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด ์ ์šฉํ•œ๋‹ค. */
104
104
  private static applyAccent;
105
+ /**
106
+ * ๋‚ด์žฅ ์‹œํŠธ๋ฅผ ๋„ฃ์„ ์ž๋ฆฌ โ€” **๋‹ค๋ฅธ ๋ชจ๋“  ์Šคํƒ€์ผ ยซ์•žยป, ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋„ฃ์€ ๊ฒƒ ยซ๋’คยป**.
107
+ *
108
+ * ๐Ÿ”ด**์™œ ๋งจ ์•ž์ธ๊ฐ€.** ์ด ์‹œํŠธ๋“ค์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ยซ๊ธฐ๋ณธ๊ฐ’ยป ์ธต์ด๋‹ค. ์†Œ๋น„์ž(๋˜๋Š” ํ•˜์šฐ์Šค ํ”„๋ฆฌ์…‹)๊ฐ€
109
+ * ๊ฐ™์€ `--u-*` ํ† ํฐ์„ `:root` ๋กœ ๋ฎ์œผ๋ฉด **ํŠน์ด๋„๊ฐ€ ๋Œ€๋“ฑ**ํ•˜๋ฏ€๋กœ ์Šน๋ถ€๋Š” ๋ฌธ์„œ ์ˆœ์„œ๊ฐ€ ๊ฐ€๋ฅธ๋‹ค โ€”
110
+ * ๊ทธ๋Ÿฐ๋ฐ ์ด ์‹œํŠธ๋Š” **๋Ÿฐํƒ€์ž„์—** ๋ถ™๊ณ  ์†Œ๋น„์ž ์‹œํŠธ๋Š” ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ **ํŒŒ์‹ฑ ์‹œ์ ์—** ์˜ฌ๋ฆฌ๋ฏ€๋กœ,
111
+ * ์ข…์ „(`appendChild`)์—๋Š” ***์–ธ์ œ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์ด ์ด๊ฒผ๋‹ค.*** ์†Œ๋น„์ž ์ž…์žฅ์—์„œ๋Š” ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€
112
+ * **์˜ค๋ฅ˜๋„ ๊ฒฝ๊ณ ๋„ ์—†์ด ๋ฌดํšจ**๊ฐ€ ๋˜๊ณ , ๊ฐ’์ด ์ผ๋ถ€๋งŒ ๋‹ค๋ฅด๋ฉด ใ€Œ์ ์šฉ๋œ ๊ฒƒ์ฒ˜๋Ÿผใ€ ๋ณด์ด๊ธฐ๊นŒ์ง€ ํ•œ๋‹ค.
113
+ *
114
+ * โš **`<meta charset>` ๋ฅ˜๋ฅผ ๋„˜์–ด ๋งจ ์•ž์œผ๋กœ ๋ฐ€์ง€ ์•Š๋Š”๋‹ค** โ€” ์ฒซ ยซ์Šคํƒ€์ผยป ์•ž์—๋งŒ ์„ ๋‹ค.
115
+ * ์Šคํƒ€์ผ์ด ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ๋ถ™์ผ ๊ณณ์ด ์—†์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋์— ๋„ฃ๋Š”๋‹ค(๋’ค์— ์˜ค๋Š” ๊ฒƒ์ด ์ด๊ธด๋‹ค๋Š”
116
+ * ์„ฑ์งˆ์€ ๊ทธ๋Œ€๋กœ๋‹ค).
117
+ *
118
+ * โš **์šฐ๋ฆฌ ์‹œํŠธ๋ผ๋ฆฌ์˜ ์ˆœ์„œ๋Š” ์œ ์ง€ํ•œ๋‹ค** โ€” ๋งค๋ฒˆ `firstChild` ์•ž์— ๋„ฃ์œผ๋ฉด ๋ฒˆ๋“ค ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžŒ๋‹ค.
119
+ * ์‹ค์ œ๋กœ๋Š” `light`/`dark` ์˜ ์ƒ๋Œ€ ์ˆœ์„œ๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์ง€๋งŒ(`dark.css` ๋Š”
120
+ * `:root[theme="dark"]` ๋กœ **ํŠน์ด๋„๊ฐ€ ์ด๊ธด๋‹ค**), ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
121
+ */
122
+ private static builtInAnchor;
105
123
  /** ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์‹œ ๋กœ๊ทธ ์ถœ๋ ฅ ํ•จ์ˆ˜ (์ธ์Šคํ„ด์Šค ์Šค์ฝ”ํ”„) */
106
124
  private static log;
107
125
  }
@@ -73,8 +73,8 @@ var Theme = class {
73
73
  this.log("style already present, skipping", name);
74
74
  continue;
75
75
  }
76
- document.head.appendChild(style);
77
- this.log("appended style to head", name);
76
+ document.head.insertBefore(style, this.builtInAnchor());
77
+ this.log("inserted style at the base layer", name);
78
78
  }
79
79
  } else {
80
80
  document.head.querySelectorAll("style[data-name]").forEach((el) => el.remove());
@@ -218,6 +218,29 @@ var Theme = class {
218
218
  for (const [name, value] of Object.entries(accentCustomProperties(ramp))) root.style.setProperty(name, value);
219
219
  this.log("accent applied", this.accentSeed, "โ†’", ramp);
220
220
  }
221
+ /**
222
+ * ๋‚ด์žฅ ์‹œํŠธ๋ฅผ ๋„ฃ์„ ์ž๋ฆฌ โ€” **๋‹ค๋ฅธ ๋ชจ๋“  ์Šคํƒ€์ผ ยซ์•žยป, ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋„ฃ์€ ๊ฒƒ ยซ๋’คยป**.
223
+ *
224
+ * ๐Ÿ”ด**์™œ ๋งจ ์•ž์ธ๊ฐ€.** ์ด ์‹œํŠธ๋“ค์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ยซ๊ธฐ๋ณธ๊ฐ’ยป ์ธต์ด๋‹ค. ์†Œ๋น„์ž(๋˜๋Š” ํ•˜์šฐ์Šค ํ”„๋ฆฌ์…‹)๊ฐ€
225
+ * ๊ฐ™์€ `--u-*` ํ† ํฐ์„ `:root` ๋กœ ๋ฎ์œผ๋ฉด **ํŠน์ด๋„๊ฐ€ ๋Œ€๋“ฑ**ํ•˜๋ฏ€๋กœ ์Šน๋ถ€๋Š” ๋ฌธ์„œ ์ˆœ์„œ๊ฐ€ ๊ฐ€๋ฅธ๋‹ค โ€”
226
+ * ๊ทธ๋Ÿฐ๋ฐ ์ด ์‹œํŠธ๋Š” **๋Ÿฐํƒ€์ž„์—** ๋ถ™๊ณ  ์†Œ๋น„์ž ์‹œํŠธ๋Š” ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ **ํŒŒ์‹ฑ ์‹œ์ ์—** ์˜ฌ๋ฆฌ๋ฏ€๋กœ,
227
+ * ์ข…์ „(`appendChild`)์—๋Š” ***์–ธ์ œ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์ด ์ด๊ฒผ๋‹ค.*** ์†Œ๋น„์ž ์ž…์žฅ์—์„œ๋Š” ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€
228
+ * **์˜ค๋ฅ˜๋„ ๊ฒฝ๊ณ ๋„ ์—†์ด ๋ฌดํšจ**๊ฐ€ ๋˜๊ณ , ๊ฐ’์ด ์ผ๋ถ€๋งŒ ๋‹ค๋ฅด๋ฉด ใ€Œ์ ์šฉ๋œ ๊ฒƒ์ฒ˜๋Ÿผใ€ ๋ณด์ด๊ธฐ๊นŒ์ง€ ํ•œ๋‹ค.
229
+ *
230
+ * โš **`<meta charset>` ๋ฅ˜๋ฅผ ๋„˜์–ด ๋งจ ์•ž์œผ๋กœ ๋ฐ€์ง€ ์•Š๋Š”๋‹ค** โ€” ์ฒซ ยซ์Šคํƒ€์ผยป ์•ž์—๋งŒ ์„ ๋‹ค.
231
+ * ์Šคํƒ€์ผ์ด ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ๋ถ™์ผ ๊ณณ์ด ์—†์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋์— ๋„ฃ๋Š”๋‹ค(๋’ค์— ์˜ค๋Š” ๊ฒƒ์ด ์ด๊ธด๋‹ค๋Š”
232
+ * ์„ฑ์งˆ์€ ๊ทธ๋Œ€๋กœ๋‹ค).
233
+ *
234
+ * โš **์šฐ๋ฆฌ ์‹œํŠธ๋ผ๋ฆฌ์˜ ์ˆœ์„œ๋Š” ์œ ์ง€ํ•œ๋‹ค** โ€” ๋งค๋ฒˆ `firstChild` ์•ž์— ๋„ฃ์œผ๋ฉด ๋ฒˆ๋“ค ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžŒ๋‹ค.
235
+ * ์‹ค์ œ๋กœ๋Š” `light`/`dark` ์˜ ์ƒ๋Œ€ ์ˆœ์„œ๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์ง€๋งŒ(`dark.css` ๋Š”
236
+ * `:root[theme="dark"]` ๋กœ **ํŠน์ด๋„๊ฐ€ ์ด๊ธด๋‹ค**), ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
237
+ */
238
+ static builtInAnchor() {
239
+ const ours = document.head.querySelectorAll("style[data-name]");
240
+ const last = ours[ours.length - 1];
241
+ if (last) return last.nextSibling;
242
+ return document.head.querySelectorAll("style, link[rel~=\"stylesheet\"]")[0] ?? null;
243
+ }
221
244
  /** ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์‹œ ๋กœ๊ทธ ์ถœ๋ ฅ ํ•จ์ˆ˜ (์ธ์Šคํ„ด์Šค ์Šค์ฝ”ํ”„) */
222
245
  static log(...args) {
223
246
  if (this._isDebugMode) console.log("[theme]", ...args);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@iyulab/components",
3
3
  "description": "web-components library based on lit-element made by iyulab",
4
- "version": "1.43.0",
4
+ "version": "1.44.1",
5
5
  "keywords": [
6
6
  "iyulab",
7
7
  "components",
@@ -78,6 +78,13 @@ import { UButton, UInput } from '@iyulab/components/react';
78
78
  - [`u-form`](./references/components/form.md) โ€” Form group with two-way model binding and validation
79
79
  - [`u-option`](./references/components/option.md) โ€” Selectable option item for `u-select`, `u-radio`, `u-input`
80
80
 
81
+ **`disabled` is exposed where assistive technology and test tools look for it** โ€” on the node that
82
+ carries the control's role, not on the host element. Native nodes use native `disabled`
83
+ (`u-input`, `u-textarea`, `u-checkbox`, `u-switch`, `u-file-input`); role nodes get
84
+ `aria-disabled="true"` (the `combobox` of `u-select`/`u-date-picker`, the `radiogroup` of
85
+ `u-radio`/`u-rating`, the `slider` thumbs). In end-to-end tests, locate controls by role
86
+ (`getByRole('combobox')`) rather than by tag, so actionability checks see the disabled state.
87
+
81
88
  ### Overlay & Floating
82
89
 
83
90
  - [`u-dialog`](./references/components/dialog.md) โ€” Modal/non-modal dialog with configurable placement
@@ -62,6 +62,18 @@ Inherits all `UFloatingElement` properties (see [floating.md](../extensions/floa
62
62
 
63
63
  `click` and `escape` express user intent and always close the popover.
64
64
 
65
+ **Only an open popover consumes `Escape`.** When it closes on `Escape` it calls `preventDefault()`;
66
+ a closed popover leaves the event alone. So `event.defaultPrevented` at the document or window
67
+ level reliably means *something above already handled this key* โ€” use it to decide whether your
68
+ own panel should close:
69
+
70
+ ```ts
71
+ document.addEventListener('keydown', (e) => {
72
+ if (e.key !== 'Escape' || e.defaultPrevented) return; // an open list or popover took it
73
+ closeMyPanel();
74
+ });
75
+ ```
76
+
65
77
  `scroll` and `resize` are viewport-geometry changes and **only close the popover when it is
66
78
  anchored to a coordinate** โ€” i.e. the virtual anchor created by `trigger="contextmenu"`, whose
67
79
  `clientX`/`clientY` stop matching whatever they pointed at once the page reflows.
@@ -8,7 +8,9 @@ Abstract base class for full-screen or contained overlays (dialogs, drawers, sid
8
8
 
9
9
  - **Focus-trap** via `focus-trap` library
10
10
  - **Body scroll lock** while open
11
- - **ESC key** and **backdrop click** close
11
+ - **ESC key** and **backdrop click** close โ€” an `Escape` that something inside the overlay
12
+ already consumed (`defaultPrevented`, e.g. an open select list closing itself) does not close
13
+ the overlay, so one press closes one layer
12
14
  - **OverlayManager** z-index stacking
13
15
 
14
16
  ## When to extend
@@ -55,8 +55,8 @@ interface DialogOptions {
55
55
  }
56
56
 
57
57
  interface ConfirmDialogOptions extends DialogOptions {
58
- confirmLabel?: string; // default: 'Confirm'
59
- cancelLabel?: string; // default: 'Cancel'
58
+ confirmLabel?: string; // default: the active locale's `confirm` (en: 'Confirm')
59
+ cancelLabel?: string; // default: the active locale's `cancel` (en: 'Cancel')
60
60
  }
61
61
 
62
62
  interface PromptDialogOptions extends ConfirmDialogOptions {
@@ -51,6 +51,12 @@ changes**, because those targets are relative to the page background.
51
51
  > from `--u-primary-color-strong`, so they stay on the default ramp and the brand looks
52
52
  > half-applied. (The sheet derives no step from `--u-primary-color` โ€” measured: 0 references.)
53
53
 
54
+ > **Load that block however you like โ€” a plain static `import` is enough.** Since 1.44.0 the
55
+ > built-in sheets are inserted *ahead of* the document's other styles, so your override wins at
56
+ > equal specificity whenever it arrives. Before 1.44.0 they were appended last and a static
57
+ > import silently did nothing; on those versions, load your sheet after `await Theme.init(...)`.
58
+ > Specificity still decides: a `:where(:root)` wrapper drops to 0 and loses regardless of order.
59
+
54
60
  ## API
55
61
 
56
62
  | Member | Type | Description |