@iyulab/components 1.22.0 โ†’ 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CHANGELOG.md +242 -0
  2. package/LICENSE +1 -1
  3. package/README.md +33 -1
  4. package/dist/components/UOverlayElement.d.ts +18 -0
  5. package/dist/components/UOverlayElement.js +24 -0
  6. package/dist/components/badge/UBadge.d.ts +5 -0
  7. package/dist/components/badge/UBadge.js +9 -0
  8. package/dist/components/badge/UBadge.styles.js +6 -0
  9. package/dist/components/dialog/UDialog.styles.js +1 -1
  10. package/dist/components/drawer/UDrawer.styles.js +1 -1
  11. package/dist/components/expander/UExpander.d.ts +38 -0
  12. package/dist/components/expander/UExpander.js +78 -0
  13. package/dist/components/expander/UExpander.styles.d.ts +1 -0
  14. package/dist/components/expander/UExpander.styles.js +95 -0
  15. package/dist/components/field/UField.styles.js +15 -0
  16. package/dist/components/icon/UIcon.d.ts +17 -4
  17. package/dist/components/icon/UIcon.js +9 -6
  18. package/dist/components/panel/UPanel.d.ts +0 -2
  19. package/dist/components/panel/UPanel.js +0 -5
  20. package/dist/components/skeleton/USkeleton.d.ts +7 -0
  21. package/dist/components/skeleton/USkeleton.js +7 -1
  22. package/dist/components/skeleton/USkeleton.styles.js +64 -0
  23. package/dist/components/tab-panel/UTabPanel.d.ts +4 -2
  24. package/dist/components/tab-panel/UTabPanel.js +0 -5
  25. package/dist/components/tag/UTag.d.ts +7 -0
  26. package/dist/components/tag/UTag.js +10 -1
  27. package/dist/components/tag/UTag.styles.js +4 -0
  28. package/dist/components/text/UText.d.ts +38 -0
  29. package/dist/components/text/UText.js +45 -0
  30. package/dist/components/text/UText.styles.d.ts +1 -0
  31. package/dist/components/text/UText.styles.js +91 -0
  32. package/dist/components/tree/UTree.d.ts +4 -2
  33. package/dist/components/tree/UTree.js +0 -5
  34. package/dist/components/tree-item/UTreeItem.d.ts +4 -1
  35. package/dist/components/tree-item/UTreeItem.js +0 -5
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +3 -1
  38. package/dist/react/UExpander.d.ts +16 -0
  39. package/dist/react/UExpander.js +13 -0
  40. package/dist/react/UText.d.ts +12 -0
  41. package/dist/react/UText.js +10 -0
  42. package/dist/react/index.d.ts +2 -0
  43. package/dist/react/index.js +2 -0
  44. package/dist/utilities/Dialog.js +1 -1
  45. package/dist/utilities/Locale.d.ts +34 -0
  46. package/dist/utilities/Locale.js +43 -6
  47. package/dist/utilities/Theme.d.ts +37 -0
  48. package/dist/utilities/Theme.js +65 -0
  49. package/dist/utilities/accent.d.ts +52 -0
  50. package/dist/utilities/accent.js +127 -0
  51. package/dist/utilities/icons.js +1 -1
  52. package/dist/utilities/statusIcon.d.ts +31 -0
  53. package/dist/utilities/statusIcon.js +34 -0
  54. package/package.json +5 -3
  55. package/skills/iyulab-components/SKILL.md +4 -1
  56. package/skills/iyulab-components/references/components/badge.md +2 -1
  57. package/skills/iyulab-components/references/components/button.md +3 -1
  58. package/skills/iyulab-components/references/components/copy-button.md +80 -0
  59. package/skills/iyulab-components/references/components/drawer.md +30 -0
  60. package/skills/iyulab-components/references/components/expander.md +70 -0
  61. package/skills/iyulab-components/references/components/icon.md +12 -0
  62. package/skills/iyulab-components/references/components/input.md +6 -0
  63. package/skills/iyulab-components/references/components/panel.md +6 -4
  64. package/skills/iyulab-components/references/components/skeleton.md +12 -0
  65. package/skills/iyulab-components/references/components/tab-panel.md +4 -5
  66. package/skills/iyulab-components/references/components/tag.md +18 -1
  67. package/skills/iyulab-components/references/components/text.md +79 -0
  68. package/skills/iyulab-components/references/components/textarea.md +5 -0
  69. package/skills/iyulab-components/references/components/tree.md +2 -4
  70. package/skills/iyulab-components/references/usage.md +73 -2
  71. package/skills/iyulab-components/references/utilities/theme.md +23 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,247 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.24.0] - 2026-08-04
4
+
5
+ ### Added
6
+
7
+ - ๐Ÿ”ด**`u-text` โ€” ์˜๋ฏธ ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ์Šค์ผ€์ผ(7๋‹จ)์„ ๋งˆํฌ์—…์—์„œ ์“ฐ๋Š” ์ž๋ฆฌ.**
8
+ ์‹œํŠธ๋Š” `1.21.0` ๋ถ€ํ„ฐ ๋‹จ๋งˆ๋‹ค **ํฌ๊ธฐยท๊ตต๊ธฐยทํ–‰๊ฐ„ยท์ž๊ฐ„** ๋„ค ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์—ˆ์ง€๋งŒ **๊ทธ ๋‹จ์„
9
+ ์ ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์—ˆ๋‹ค** โ€” ์†Œ๋น„์ž๊ฐ€ ์Šค์ผ€์ผ์„ ์“ฐ๋ ค๋ฉด ์ž๊ธฐ CSS ์—์„œ ํ† ํฐ์„ ์ง์ ‘
10
+ ์ฐธ์กฐํ•ด์•ผ ํ–ˆ๊ณ , ๊ทธ๋Ÿฌ๋ฉด ยซ์ปดํฌ๋„ŒํŠธ๋งŒ์œผ๋กœ ํ™”๋ฉด์„ ์ง“๋Š”๋‹คยป๊ฐ€ ๊ทธ ์ž๋ฆฌ์—์„œ ๊นจ์กŒ๋‹ค.
11
+ โ‡’ ์šฐ๋ฆฌ๊ฐ€ ์ค€ ๊ฒƒ์€ **๊ฐ’**์ด๊ณ  ํ•„์š”ํ–ˆ๋˜ ๊ฒƒ์€ **์ž๋ฆฌ**๋‹ค.
12
+
13
+ ```html
14
+ <u-text level="1" variant="display">๋ฌธ์„œ ์ œ๋ชฉ</u-text>
15
+ <u-text variant="subtitle" tone="weak">ํ•œ ์ค„ ์„ค๋ช…</u-text>
16
+ <u-text>๋ณธ๋ฌธ</u-text>
17
+ <u-text variant="caption" tone="weak">๋ณด์กฐ ๋ฌธ๊ตฌ</u-text>
18
+ ```
19
+
20
+ โ˜…**์‹œ๊ฐ ์ถ•(`variant`)๊ณผ ์˜๋ฏธ ์ถ•(`level`)์ด ๋…๋ฆฝ**์ด๋‹ค โ€” `level` ์„ ์ฃผ๋ฉด ์„€๋„ ๋ฃจํŠธ์— ์‹ค์ œ
21
+ `<h1>`~`<h6>` ์„ ๋ Œ๋”ํ•ด heading ์œผ๋กœ ์ฝํžˆ๊ณ (์Šฌ๋กฏ ํ…์ŠคํŠธ๊ฐ€ ์ ‘๊ทผ๊ฐ€๋Šฅ ์ด๋ฆ„), ์ฃผ์ง€ ์•Š์œผ๋ฉด
22
+ `<p>` ๋‹ค. ๊ทธ๋ž˜์„œ *"ํŽ˜์ด์ง€์˜ ๋‘ ๋ฒˆ์งธ ์ œ๋ชฉ์ด ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐ€์žฅ ํฐ"* ๋ฐฐ์น˜๊ฐ€ ๋งˆํฌ์—…์„
23
+ ๊ฑฐ์ง“๋ง์‹œํ‚ค์ง€ ์•Š๊ณ  ํ‘œํ˜„๋œ๋‹ค.
24
+
25
+ โš **`tone` ์€ ์ค‘๋ฆฝ ๊ฐ•์กฐ ์ถ•์ด๋‹ค**(`default`ยท`weak`ยท`strong`ยท`inverse`) โ€” ์—ญํ• ์ƒ‰์ด
26
+ ์•„๋‹ˆ๋‹ค. ์†Œ๋น„ ํ™”๋ฉด ์‹ค์ธก์—์„œ ๋‚˜์˜จ ์ƒ‰ ๋‹ค์„ฏ ์ค‘ ์…‹์ด ์ด ์ถ•์ด์—ˆ๊ณ  ๋‚˜๋จธ์ง€ ๋‘˜์€ **๋งํฌ**์™€
27
+ **์ฝœ์•„์›ƒ ๋ฐ•์Šค**๋ผ ์ด ์ปดํฌ๋„ŒํŠธ์˜ ์ถ•์ด ์•„๋‹ˆ์—ˆ๋‹ค.
28
+
29
+ โš **๊ฐ’์„ ์ƒˆ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€” 7๋‹จ ร— 4์†์„ฑ์„ ์‹œํŠธ์—์„œ ์ฝ๊ธฐ๋งŒ ํ•œ๋‹ค. ํšŒ๊ท€ 12๊ฑด์ด
30
+ *"์–ด๋–ค ํฌ๊ธฐ์ธ๊ฐ€"* ๊ฐ€ ์•„๋‹ˆ๋ผ ***"์‹œํŠธ๊ฐ€ ๋งํ•œ ๊ทธ ๊ฐ’์„ ์“ฐ๋Š”๊ฐ€"*** ๋ฅผ ์žฐ๋‹ค.
31
+ ๊ฐ™์€ ์ด์œ ๋กœ `overline` ์— `text-transform: uppercase` ๋ฅผ **๋ถ™์ด์ง€ ์•Š์•˜๋‹ค** โ€” ๊ด€์Šต์ด๊ธด ํ•˜๋‚˜
32
+ ์†Œ๋น„์ž๊ฐ€ ์“ด ๊ธ€์ž๋ฅผ ๋ฐ”๊พธ๊ณ , CJK ์—๋Š” ํšจ๊ณผ๊ฐ€ ์—†์–ด **๊ฐ™์€ ๋‹จ์ด ์–ธ์–ด์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ธ๋‹ค.**
33
+
34
+ ### Fixed
35
+
36
+ - ๐Ÿ”ด**`u-field` ์•ˆ์˜ ์ปจํŠธ๋กค์ด ํ•„๋“œ ํญ์„ ์ฑ„์šฐ์ง€ ์•Š์•„ ํผ ๊ฒฉ์ž๊ฐ€ ์–ด๊ธ‹๋‚ฌ๋‹ค.** ์‹ค์ธก: ๊ฐ™์€ 231px
37
+ ์นธ ์•ˆ์—์„œ `u-input` 202 ยท `u-select` 71/92/108 ยท `u-textarea` 168 โ€” **์˜ค๋ฅธ์ชฝ ๋์ด ๋‹ค์„ฏ
38
+ ๊ตฐ๋ฐ์—์„œ ๋‹ค ๋‹ฌ๋ž๋‹ค.** ์ปจํŠธ๋กค ์ž์‹ ์˜ ๊ธฐ๋ณธ๊ฐ’(`inline-block`)์€ ์˜ณ์ง€๋งŒ, `u-field` ๋กœ ๊ฐ์‹ผ
39
+ ์ˆœ๊ฐ„ ๊ทธ๊ฒƒ์€ **ํผ์˜ ํ•œ ์นธ**์ด๋‹ค โ‡’ ๋ผ๋ฒจยท์„ค๋ช…ยท๊ฒ€์ฆ ๋ฌธ๊ตฌ์˜ ๋ฐฐ์น˜๋ฅผ ์ฑ…์ž„์ง€๋Š” ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€
40
+ ํญ๋„ ํ•จ๊ป˜ ์ •ํ•œ๋‹ค(`::slotted(*) { width: 100% }`).
41
+ โš ์†Œ๋น„์ž๊ฐ€ ์ธ๋ผ์ธ `style` ๋กœ ํญ์„ ์ฃผ๋ฉด ๊ทธ์ชฝ์ด ์ด๊ธด๋‹ค.
42
+
43
+ ### Added
44
+
45
+ - **`u-icon[fallback]`** โ€” ์ด๋ฆ„ยทURL ์ด ํ•ด์„๋˜์ง€ ์•Š์„ ๋•Œ ๋Œ€์‹  ๊ทธ๋ฆด SVG ์›๋ฌธ.
46
+ ยซ์•„์ด์ฝ˜์ด ์•ˆ ๋ณด์ธ๋‹คยป๊ฐ€ **ยซ๋ˆ„๋ฅผ ๊ฒƒ์ด ์—†๋‹คยป** ๊ฐ€ ๋˜๋Š” ์ž๋ฆฌ๊ฐ€ ์žˆ๋‹ค(์ ‘ํžŒ ์‚ฌ์ด๋“œ๋ฐ”์˜ ๋ฉ”๋‰ด ํ•ญ๋ชฉ).
47
+ ํ•ด์„ ์‹คํŒจ๋Š” ์ด๋ฆ„ ๋ฏธ์ง€์ • ยท 404 ยท SVG ํŒŒ์‹ฑ ์‹คํŒจ๋ฅผ **๋ชจ๋‘** ํฌํ•จํ•œ๋‹ค.
48
+
49
+ ### Documentation
50
+
51
+ - ๐Ÿ”ด**`Theme.accent(seed)` ๊ฐ€ `primary` ์—ญํ•  ํ† ํฐ **7์ข… ์ค‘ 6์ข…**๋งŒ ์„ธํŒ…ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ–ˆ๋‹ค.**
52
+ `--u-primary-bg-color`(`u-tag` ์˜ `--tag-hue-surface` ๊ฐ€ ์ฝ๋Š” ยซ๊ธ€์ž๋ฅผ ์–น๋Š” ์˜…์€ ๋ฉดยป)๋Š”
53
+ ์‹œํŠธ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‚จ์œผ๋ฏ€๋กœ, **์‹œ๋“œ๋งŒ ๋„ฃ์œผ๋ฉด ํƒœ๊ทธยท์„ ํƒ๋œ ํ–‰ ๊ฐ™์€ ์˜…์€ ๋ฉด์ด ํŒŒ๋ž‘์œผ๋กœ ๋‚จ๋Š”๋‹ค.**
54
+ ์‹ค์ธก๋œ ์ฆ์ƒ์ด *"๋ฒ„ํŠผ์€ ๋ธŒ๋žœ๋“œ์ธ๋ฐ ์„ ํƒ๋œ ํ‘œ ํ–‰์€ ํŒŒ๋ž‘"* ์ด๋‹ค.
55
+ โ‡’ `usage.md` ๋ธŒ๋žœ๋“œ ์ ˆ์— **7์ข… ํ‘œ**์™€ ํ•œ ์ค„ ํ•ด๋ฒ•์„, `Theme.accent` JSDoc ์— ๊ฐ™์€ ๋‚ด์šฉ์„ ์ ์—ˆ๋‹ค.
56
+
57
+ โš **ํŒŒ์ƒ์„ ๋ถ™์ด์ง€ ์•Š์€ ์ด์œ **: ์ด ํ† ํฐ์€ `info`ยท`success`ยท`danger`ยท`warning` ๊ณผ ํ•œ ์„ธํŠธ๋กœ
58
+ **5๊ณ„์—ด ร— 2ํ…Œ๋งˆ = 10๊ฐœ ๊ฐ’์ด ์†์œผ๋กœ ์ง์ง€์–ด์ ธ** ์žˆ๊ณ , ๋‘ ํ…Œ๋งˆ๊ฐ€ ๊ฐ™์€ ๊ณ„์•ฝ์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค
59
+ (๋ฐ”ํƒ• ๋Œ€๋น„๋น„ ์‹ค์ธก โ€” ๋ผ์ดํŠธ **1.142** ยท ๋‹คํฌ **1.030**). ๋„์ถœ์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ํŒ”๋ ˆํŠธ
60
+ ๊ฐ’ ๊ฒฐ์ •์ด๋ผ ๋ณ„๋„ ํŒ๋‹จ์ด ํ•„์š”ํ•˜๋‹ค.
61
+
62
+ ๋ธŒ๋ผ์šฐ์ € ํšŒ๊ท€ 2๊ฑด์ด ์ด ๋ฌธ์„œ๊ฐ€ ์ฐธ์ธ์ง€ ์žฐ๋‹ค โ€” **๊ฒฐ์†์„ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ**, ๋‚˜์ค‘์— ํŒŒ์ƒ์ด
63
+ ๋ถ™์œผ๋ฉด ๊ทธ ํ…Œ์ŠคํŠธ๊ฐ€ ๋’ค์ง‘ํžˆ๋ฉด์„œ ๋ฌธ์„œ๋„ ๊ณ ์น˜๋ผ๊ณ  ์•Œ๋ฆฐ๋‹ค.
64
+
65
+ ## [1.23.0] - 2026-08-04
66
+
67
+ ### Added
68
+
69
+ - **`u-expander` โ€” ์ œ๋ชฉ์„ ๋ˆŒ๋Ÿฌ ๋ณธ๋ฌธ์„ ์ ‘๊ณ  ํŽด๋Š” ๋””์Šคํด๋กœ์ €.**
70
+
71
+ ```html
72
+ <u-expander label="๋ฐฐ์†ก ์ •๋ณด" open>
73
+ <p>๋ณธ๋ฌธ</p>
74
+ </u-expander>
75
+ ```
76
+
77
+ ํ—ค๋”๋Š” **๋„ค์ดํ‹ฐ๋ธŒ `<button>`** ์ด๋ผ Enter/Spaceยทํฌ์ปค์Šค ์ˆœ์„œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ์˜จ๋‹ค. ๋†’์ด ์ „ํ™˜์€
78
+ grid ํŠธ๋ž™(`0fr` โ†” `1fr`)์ด๋ผ ์ฝ˜ํ…์ธ  ๋†’์ด๋ฅผ JS ๋กœ ์žฌ์ง€ ์•Š์œผ๋ฉฐ, `prefers-reduced-motion:
79
+ reduce` ์—์„œ ๋ฉˆ์ถ˜๋‹ค(์ ‘ํž˜/ํŽผ์นจ์˜ ๊ฒฐ๊ณผ๋Š” ์ •์ง€ ์ƒํƒœ์—์„œ๋„ ๊ทธ๋Œ€๋กœ ์ฝํžˆ๋ฏ€๋กœ ์ด ์ „ํ™˜์€ ์žฅ์‹์ด๋‹ค).
80
+
81
+ โš **์ ‘ํž˜์˜ ์š”์ ์€ ๋†’์ด๊ฐ€ ์•„๋‹ˆ๋ผ ยซ๋„๋‹ฌ ๋ถˆ๊ฐ€ยป๋‹ค** โ€” `overflow: hidden` ๋งŒ์œผ๋กœ ์ ‘์œผ๋ฉด ํ™”๋ฉด์—์„œ
82
+ ์‚ฌ๋ผ์ง„ ์ฝ˜ํ…์ธ ๊ฐ€ **์ ‘๊ทผ์„ฑ ํŠธ๋ฆฌ์™€ ํƒญ ์ˆœ์„œ์— ๊ทธ๋Œ€๋กœ ๋‚จ๋Š”๋‹ค.** `visibility` ๋ฅผ ํ•จ๊ป˜ ์˜ฎ๊ฒจ
83
+ ์ ‘ํžŒ ๋ณธ๋ฌธ์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ๋‹ค(ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ด ์กฐ๊ฑด๋งŒ ๋”ฐ๋กœ ์žฐ๋‹ค).
84
+
85
+ ### Changed
86
+
87
+ - **์ฝ˜์†” ์ง„๋‹จ ๋ฌธ๊ตฌ๊ฐ€ ์˜์–ด๋กœ ์ด์ฃผํ–ˆ๋‹ค** โ€” ํ† ํฐ ์‹œํŠธ ๋ถ€์žฌ ๊ฒฝ๊ณ  ยท `[Dialog]` ํ‘œ์‹œ ์‹คํŒจ ยท
88
+ `[IconRegistry]` ๋ฆฌ์กธ๋ธŒ ์‹คํŒจ. ํ™”๋ฉด ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ **๊ฐœ๋ฐœ์ž ๋Œ€๋ฉด ์ง„๋‹จ**์ด๊ณ , ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ๊ณผ
89
+ ์ด์Šˆ ์žฌํ˜„ ๊ณต์œ ์—์„œ ์˜์–ด๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค๋Š” ํŒ๋‹จ์ด๋‹ค(๋กœ์ผ€์ผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค โ€” ์‚ฌ์šฉ์ž๊ฐ€
90
+ ์ฝ๋Š” ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋‹ค). ๋ฌธ๊ตฌ๋ฅผ ํŒ๋ณ„์‹์œผ๋กœ ์“ฐ๋˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด *"๋ฌด์—‡์„ ๋งํ•˜๋Š”๊ฐ€"* ๋กœ ์ขํž ๊ฒƒ.
91
+
92
+ ### Removed
93
+
94
+ - ๐Ÿ”ด**ํ•œ ๋ฒˆ๋„ ๋™์ž‘ํ•œ ์  ์—†๋Š” ์„ ์–ธ 3์ข…์„ ๊ฑท์—ˆ๋‹ค.** ์ „๋ถ€ ยซ์„ ์–ธ + ๋ฌธ์„œยป๋งŒ ์žˆ๊ณ  ๊ทธ ๊ฐ’์„ ์ฝ๋Š”
95
+ ์ฝ”๋“œ๊ฐ€ **์–ด๋””์—๋„ ์—†์—ˆ๋‹ค**(์ „์ˆ˜ ๊ฒ€์ƒ‰). ๋™์ž‘์ด ์—†์—ˆ์œผ๋ฏ€๋กœ **๊นจ์งˆ ๋™์ž‘๋„ ์—†๋‹ค.**
96
+
97
+ | ์ œ๊ฑฐ | ๋ฌธ์„œ๊ฐ€ ์•ฝ์†ํ•˜๋˜ ๊ฒƒ | ๋Œ€์ฒด |
98
+ |---|---|---|
99
+ | `u-panel[collapsible]` | *"Allow the panel to collapse"* | **`u-expander`**(์œ„) |
100
+ | `u-tab-panel[editable]` | *"Allow adding/removing tabs"* | ์—†์Œ โ€” ํƒญ ์ถ”๊ฐ€/์‚ญ์ œ๋Š” ์†Œ๋น„์ž๊ฐ€ ์Šฌ๋กฏ์„ ์ง์ ‘ ๋‹ค๋ฃฌ๋‹ค |
101
+ | `u-tree[droppable]` ยท `u-tree-item[droppable]` | *"Enable drop" / "Accepts drops"* | ์—†์Œ โ€” ์•„๋ž˜ ์ฐธ์กฐ |
102
+
103
+ โš **`draggable` ์€ ๋‚จ๋Š”๋‹ค** โ€” ๊ทธ๊ฒƒ์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ „์—ญ ์†์„ฑ์ด๋ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋“œ๋ž˜๊ทธ ์ž์ฒด๋Š”
104
+ ์ผœ ์ค€๋‹ค. ๋‹ค๋งŒ ๋ฌธ์„œ๊ฐ€ *"Allow reordering tabs by drag"*ยท*"Enable drag"* ๋กœ **์žฌ์ •๋ ฌ/๋“œ๋กญ
105
+ ๊ธฐ๋Šฅ์„ ์•ฝ์†**ํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๊ทธ๋Ÿฐ ์ฝ”๋“œ๋Š” ์กด์žฌํ•œ ์ ์ด ์—†๋‹ค โ‡’ **๋ฌธ์„œ๋ฅผ ์‚ฌ์‹ค๋กœ ์ •์ •**ํ–ˆ๋‹ค
106
+ (*"native drag attribute โ€” no built-in reordering"*). ๋“œ๋ž˜๊ทธ ์žฌ์ •๋ ฌยทํŠธ๋ฆฌ ๋“œ๋กญ์€ ์ˆ˜์š”๊ฐ€
107
+ ๋ชจ์ด๋ฉด ๊ธฐ๋Šฅ์œผ๋กœ ์„ค๊ณ„ํ•œ๋‹ค.
108
+
109
+ - **`Locale.namespace()` โ€” ์ƒ์œ„ ํŒจํ‚ค์ง€๊ฐ€ ์ž๊ธฐ ํ™”๋ฉด ๋ฌธ์ž์—ด์„ ๋‹ด์„ ์ž๋ฆฌ.**
110
+
111
+ ```ts
112
+ const t = Locale.namespace<'empty' | 'loading'>('u-data-view');
113
+ t.register('en', { empty: 'No data', loading: 'Loadingโ€ฆ' });
114
+ t.register('ko', { empty: '๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค' });
115
+ t.text('empty'); // ํ™œ์„ฑ ๋กœ์ผ€์ผ ๊ธฐ์ค€
116
+ ```
117
+
118
+ ์ข…์ „์˜ `Locale.register`/`getValue` ๋Š” **๊ฒ€์ฆ ๋ฉ”์‹œ์ง€ 9ํ‚ค์˜ ๋‹ซํžŒ ์œ ๋‹ˆ์˜จ**(`LocaleMessageKey`)๋งŒ
119
+ ๋ฐ›๋Š”๋‹ค. ์ƒ์œ„ ํŒจํ‚ค์ง€์˜ ํ™”๋ฉด ๋ฌธ์ž์—ด์€ ๊ทธ ์œ ๋‹ˆ์˜จ์— ์—†๊ณ , ๋„ฃ์œผ๋ฉด ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†Œ๋น„์ž
120
+ ๋„๋ฉ”์ธ ์–ดํœ˜๊ฐ€ ์Œ“์ธ๋‹ค. โ‡’ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ ํŒจํ‚ค์ง€๊ฐ€ **์ž๊ธฐ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์†์œผ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜**
121
+ ๋ฌธ์ž์—ด์„ ํ•˜๋“œ์ฝ”๋”ฉํ•ด ์™”๋‹ค.
122
+
123
+ โš **์ˆœ์ˆ˜ ๊ฐ€์‚ฐ์ด๋‹ค** โ€” `LocaleMessageKey`ยท`register`ยท`getValue` ์„ธ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ•˜๋‚˜๋„
124
+ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ํ‚ค ์œ ๋‹ˆ์˜จ์€ **์†Œ๋น„์ž๊ฐ€** ์ œ๋„ค๋ฆญ์œผ๋กœ ์ •ํ•˜๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ‚ค์…‹์€ ์ปค์ง€์ง€ ์•Š๋Š”๋‹ค.
125
+
126
+ ์กฐํšŒ ์‚ฌ์Šฌ(์ •ํ™• ์ผ์น˜ โ†’ base ์–ธ์–ด โ†’ `en`)๊ณผ `{name}` ์น˜ํ™˜์€ ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€์™€ **๊ฐ™์€ ๊ตฌํ˜„์„
127
+ ๊ณต์œ ํ•œ๋‹ค** โ€” ๋‘ ๋ฒŒ๋กœ ๋‘๋ฉด ํ•œ์ชฝ๋งŒ ๊ณ ์ณ์ง„๋‹ค. ์‚ฌ์Šฌ์— ์—†๋Š” ํ‚ค๋Š” **ํ‚ค ์ž์ฒด**๋ฅผ ๋Œ๋ ค์ค€๋‹ค
128
+ (์กฐ์šฉํžˆ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ™”๋ฉด์— ๋“œ๋Ÿฌ๋‚˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค).
129
+
130
+ - **`Theme.accent(seed)` โ€” ๋ธŒ๋žœ๋“œ ์ƒ‰ ํ•˜๋‚˜๋กœ `--u-primary-*` ๋žจํ”„๋ฅผ ๋งŒ๋“ ๋‹ค.**
131
+
132
+ ```ts
133
+ Theme.accent('#6A1B9A'); // ๋žจํ”„ 5๋‹จ + ๋ฉด ์œ„ ๊ธ€์ž์ƒ‰์ด ๊ณ„์‚ฐ๋œ๋‹ค
134
+ Theme.accent(null); // ํ•ด์ œ โ€” ์‹œํŠธ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ
135
+ ```
136
+
137
+ ์ข…์ „์—๋Š” ์†Œ๋น„์ž๊ฐ€ ๋žจํ”„๋ฅผ **์†์œผ๋กœ ์—ด ์ค„ ์ ์—ˆ๊ณ **, ๊ทธ ๊ฐ’์ด ๋Œ€๋น„ ๊ณ„์•ฝ์„ ๋งŒ์กฑํ•˜๋Š”์ง€๋Š”
138
+ ์•„๋ฌด๊ฒƒ๋„ ํ™•์ธํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด์ œ **๊ณ„์‚ฐํ•ด์„œ** ๋„ฃ๋Š”๋‹ค โ€” ๋ฉด ์œ„ ๊ธ€์ž 4.5 ยท ๋ฐ”ํƒ• ์œ„ ๊ธ€์ž 4.5 ยท
139
+ `-strong` โ†” `-color` ๊ตฌ๋ถ„ 1.20 ยท ๊ทธ๋ž˜ํ”ฝ 3.0.
140
+
141
+ โš **CSS `color-mix()` ๋งŒ์œผ๋กœ๋Š” ์•ˆ ๋œ๋‹ค** โ€” ๊ณ ์ • ๋น„์œจ์€ ๋ฐ์€ ์‹œ๋“œ์—์„œ ๊นจ์ง„๋‹ค(๋…ธ๋ž‘์˜
142
+ `-strong` ์ด ๋ฐ”ํƒ• ๋Œ€๋น„ **2.21**, ๊ธฐ์ค€ 4.5). ๋ชฉํ‘œ ๋Œ€๋น„๊นŒ์ง€ ์„ž์œผ๋ ค๋ฉด ๋Œ€๋น„๋ฅผ **๊ณ„์‚ฐ**ํ•ด์•ผ
143
+ ํ•˜๊ณ  CSS ์—๋Š” ๊ทธ ์ˆ˜๋‹จ์ด ์—†๋‹ค. โ‡’ ๊ณ„์‚ฐ์€ JS, ๊ฒฐ๊ณผ๋งŒ ์ปค์Šคํ…€ ํ”„๋กœํผํ‹ฐ๋กœ.
144
+
145
+ โš **ํ…Œ๋งˆ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋‹ค์‹œ ๊ณ„์‚ฐ๋œ๋‹ค** โ€” ๋Œ€๋น„ ๋ชฉํ‘œ๊ฐ€ ยซ๋ฐ”ํƒ• ๊ธฐ์ค€ยป์ด๋ผ ๋ผ์ดํŠธ์™€ ๋‹คํฌ๋Š” ๊ฐ™์€
146
+ ์‹œ๋“œ์—์„œ **๋‹ค๋ฅธ ๋žจํ”„**๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋ฐ”ํƒ•์€ ๊ณ„์‚ฐ ์‹œ์ ์˜ `--u-bg-color` ๋ฅผ ์ฝ์œผ๋ฏ€๋กœ ์†Œ๋น„์ž๊ฐ€
147
+ ๋ฐ”ํƒ•์„ ๋ฎ์—ˆ์œผ๋ฉด ๊ทธ ๊ฐ’์ด ๊ธฐ์ค€์ด ๋œ๋‹ค.
148
+
149
+ - **`u-skeleton` ์— `lines` โ€” ์—ฌ๋Ÿฌ ์ค„ ์ž๋ฆฌํ‘œ์‹œ์ž.**
150
+
151
+ ```html
152
+ <u-skeleton lines="3" height="1em"></u-skeleton> <!-- ๋ง‰๋Œ€ 3๊ฐœ ยท ๋งˆ์ง€๋ง‰ ์ค„์€ ์งง๊ฒŒ -->
153
+ ```
154
+
155
+ ์ข…์ „์—๋Š” ๋ชฉ๋ก ํ•œ ์ค„ยท๋ฌธ๋‹จ ์ž๋ฆฌํ‘œ์‹œ์ž๋ฅผ ๋งŒ๋“ค ๋•Œ **ํญ๋งŒ ๋‹ค๋ฅธ ๋ง‰๋Œ€๋ฅผ ์†์œผ๋กœ ๋ฐ˜๋ณต**ํ•ด์•ผ ํ–ˆ๋‹ค
156
+ (์ด ๋ฆฌํฌ ์•ˆ์—์„œ๋งŒ 12์‚ฌ์šฉ์ฒ˜). ๋งˆ์ง€๋ง‰ ์ค„์„ ์งง๊ฒŒ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์€ ์žฅ์‹์ด ์•„๋‹ˆ๋ผ **๋ฌธ๋‹จ์˜ ๋**์„
157
+ ๋‚˜ํƒ€๋‚ด๋Š” ์‹ ํ˜ธ๋‹ค(`--skeleton-last-line-width`, ๊ธฐ๋ณธ 60%). ์ค„ ๊ฐ„๊ฒฉ์€
158
+ `--skeleton-line-gap`(๊ธฐ๋ณธ `0.5em`).
159
+
160
+ โš **๋‹จ์ผ ๋ง‰๋Œ€์˜ ๋ชจ์–‘์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค** โ€” `lines` ๊ฐ€ ์—†์œผ๋ฉด ์ข…์ „๊ณผ ์™„์ „ํžˆ ๊ฐ™๊ณ , ํšŒ๊ท€
161
+ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ทธ ๊ณ„์•ฝ์„ ๊ฐ์‹œํ•œ๋‹ค. `pulse`/`shimmer` ๋Š” ์ค„๋งˆ๋‹ค ์ ์šฉ๋˜๋ฉฐ `prefers-reduced-motion`
162
+ ์—์„œ ํ•จ๊ป˜ ๋ฉˆ์ถ˜๋‹ค.
163
+
164
+ - **์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ์—ด๋ฆด ๋•Œ `autofocus` ๋ฅผ ์กด์ค‘ํ•˜๊ณ , ์—†์œผ๋ฉด ์ฒซ ์ž…๋ ฅ์œผ๋กœ ๊ฐ„๋‹ค** (`u-dialog`ยท`u-drawer`).
165
+
166
+ ```html
167
+ <u-drawer closable>
168
+ <span slot="header">์ฃผ๋ฌธ ํŽธ์ง‘</span>
169
+ <u-input label="์ˆ˜๋Ÿ‰" autofocus></u-input> <!-- ์—ฌ๊ธฐ๋กœ ๊ฐ„๋‹ค -->
170
+ </u-drawer>
171
+ ```
172
+
173
+ ์ข…์ „์—๋Š” `focus-trap` ์˜ ๊ธฐ๋ณธ๊ฐ’(**์ฒซ tabbable ๋…ธ๋“œ**)์— ๋งก๊ฒจ์ ธ ์žˆ์—ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ โ‘ด`autofocus`
174
+ ๊ฐ€ **๋ฌด์‹œ๋˜๊ณ **(focus-trap ์€ ๊ทธ ์†์„ฑ์„ ๋ณด์ง€ ์•Š๋Š”๋‹ค) โ‘ต**๋ฒ„ํŠผ์ด ๋งˆํฌ์—… ์•ž์— ์žˆ์œผ๋ฉด ๋ฒ„ํŠผ์ด
175
+ ํฌ์ปค์Šค๋ฅผ ๊ฐ€์ ธ๊ฐ”๋‹ค**(ํ™•์ธ/์ทจ์†Œ๊ฐ€ ๋จผ์ € ์˜ค๋Š” ๋‹ค์ด์–ผ๋กœ๊ทธ๊ฐ€ ๊ทธ ๋ชจ์–‘์ด๋‹ค โ€” ์‹ค์ธก: ์ž…๋ ฅ์ด ์•„๋‹ˆ๋ผ
176
+ ์ฒซ ๋ฒ„ํŠผ). โ‡’ ์ˆœ์„œ๋ฅผ ๊ณ„์•ฝ์œผ๋กœ ๊ณ ์ •ํ•œ๋‹ค: `[autofocus]` โ†’ ์ฒซ ์ž…๋ ฅ ์ปจํŠธ๋กค โ†’ ์ฒซ tabbable.
177
+
178
+ โš **์‹œ๊ฐ์  ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค** โ€” ๋ฒ„ํŠผ์ด ์•ž์— ์˜ค๋Š” ๋‹ค์ด์–ผ๋กœ๊ทธ๋Š” ์ด์ œ **์ž…๋ ฅ**์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.
179
+ ๊ธฐ์กด ๋™์ž‘์„ ์›ํ•˜๋ฉด ๊ทธ ๋ฒ„ํŠผ์— `autofocus` ๋ฅผ ์ค€๋‹ค.
180
+
181
+ - **`u-tag`ยท`u-badge` ์— `icon` โ€” ์ƒํƒœ๊ฐ€ ยซ์ƒ‰ ์—†์ด๋„ยป ๊ตฌ๋ถ„๋œ๋‹ค.**
182
+
183
+ ```html
184
+ <u-tag color="danger" icon>์‹คํŒจ</u-tag> <!-- โœ• ์›ํ˜• ์•„์ด์ฝ˜ -->
185
+ <u-tag color="success" icon>์™„๋ฃŒ</u-tag> <!-- โœ“ ์›ํ˜• ์•„์ด์ฝ˜ -->
186
+ ```
187
+
188
+ ๋Œ€๋น„ ๊ณ„์•ฝ(1.20.0)์€ ๊ฐ ์ƒํƒœ์ƒ‰์ด **์ž๊ธฐ ๋ฐ”ํƒ•์—์„œ ์ฝํžˆ๋Š”๊ฐ€**๋ฅผ ์ง€ํ‚ค์ง€๋งŒ *๊ตฌ๋ณ„๋˜๋Š”๊ฐ€* ๋Š” ์ง€ํ‚ค์ง€
189
+ ์•Š๋Š”๋‹ค โ€” ์ƒ‰๊ฐ ์ด์ƒ(๋‚จ์„ฑ ์•ฝ 8%)์ด๋‚˜ ํ‘๋ฐฑ ์ธ์‡„์—์„œ๋Š” ยซ์„ฑ๊ณตยป๊ณผ ยซ์‹คํŒจยป๊ฐ€ ๊ฐ™์€ ํšŒ์ƒ‰ ์•Œ์•ฝ์ด ๋œ๋‹ค.
190
+ ์—ญํ•  ์ƒ‰ ์ถฉ๋Œ ๊ฒ€์‚ฌ๊ฐ€ **์ƒ‰ ๊ณต๊ฐ„์—์„œ**(ฮ”E) ์„ธ์šด ๊ตฌ๋ถ„์„ ์ด ์ถ•์€ **๋ชจ์–‘ ๊ณต๊ฐ„์—์„œ** ์„ธ์šด๋‹ค.
191
+
192
+ โš **์˜๋ฏธ๊ฐ€ ์—†๋Š” ์ƒ‰์—๋Š” ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค** โ€” ์žฅ์‹ ์ถ•(`blue`ยท`purple` โ€ฆ)์€ *์ƒ‰ ์ž์ฒด*๋ฅผ ๋œปํ•˜๊ณ 
193
+ `neutral`ยท`primary` ๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์—†๋Š” ์˜๋ฏธ๋ฅผ ์•„์ด์ฝ˜์œผ๋กœ ์ง€์–ด๋‚ด๋ฉด ๊ทธ ์•„์ด์ฝ˜์ด **์ž˜๋ชป๋œ
194
+ ์ •๋ณด๋ฅผ ๋‚˜๋ฅธ๋‹ค**. `u-badge variant="dot"` ๋„ ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค.
195
+
196
+ โš **๋ Œ๋”๋Š” ๊ฐ€์‚ฐ์ด๋‹ค** โ€” `icon` ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด ์ข…์ „ ๊ทธ๋Œ€๋กœ๋‹ค. ์•„์ด์ฝ˜์€ **๋‚ด์žฅ ๋ฒˆ๋“ค**์—์„œ ์˜ค๋ฏ€๋กœ
197
+ ๋„คํŠธ์›Œํฌ๋ฅผ ํƒ€์ง€ ์•Š๋Š”๋‹ค(์˜คํ”„๋ผ์ธ์—์„œ๋„ ๊ทธ๋ ค์ง„๋‹ค).
198
+
199
+ โš **๋‹ค๋งŒ ๋ฒˆ๋“ค ํฌ๊ธฐ๋Š” ๊ฐ€์‚ฐ์ด ์•„๋‹ˆ๋‹ค** โ€” `u-tag`ยท`u-badge` ๊ฐ€ `u-icon` ์„ import ํ•˜๊ณ , ๋‚ด๋ถ€
200
+ ์•„์ด์ฝ˜ ๋ฒˆ๋“ค์€ **๋นŒ๋“œ ์‹œ์  eager glob** ์ด๋‹ค. ๊ทธ๋ž˜์„œ `dist/components/tag/UTag.js` ๋งŒ deep
201
+ import ํ•˜๋˜ ์†Œ๋น„์ž๋„ ์ด์ œ `UIcon`(2.3 KB)๊ณผ ๋‚ด์žฅ SVG ์„ธํŠธ(**~9.8 KB**, 19์ข…)๋ฅผ ํ•จ๊ป˜ ๋ฐ›๋Š”๋‹ค.
202
+ ์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๋Š” ์†Œ๋น„์ž์—๊ฒŒ๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค(์ด๋ฏธ ํฌํ•จ๋ผ ์žˆ๋‹ค).
203
+
204
+ - **`u-skeleton` ์˜ `pulse`/`shimmer` ๊ฐ€ `prefers-reduced-motion: reduce` ์—์„œ ๋ฉˆ์ถ˜๋‹ค.**
205
+
206
+ โš **์Šคํ”ผ๋„ˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ˆ๋‹ค** โ€” ๊ฐˆ๋ฆผ๊ธธ์€ *๋ฉˆ์ถ”๋ƒ ๋งˆ๋ƒ*๊ฐ€ ์•„๋‹ˆ๋ผ **์–ด๋А ์›€์ง์ž„์ด ์˜๋ฏธ๋ฅผ
207
+ ๋‚˜๋ฅด๋Š”๊ฐ€**์˜€๋‹ค. ์Šคํ”ผ๋„ˆ์˜ ํšŒ์ „์€ **์‹ ํ˜ธ**๋ผ ์ฃฝ์ด๋ฉด ์ง„ํ–‰ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค(WCAG 2.2.2 ๋Š”
208
+ ๋กœ๋”ฉ ํ‘œ์‹œ์ฒ˜๋Ÿผ ์›€์ง์ž„์ด ๋ณธ์งˆ์ธ ๊ฒƒ์„ ์˜ˆ์™ธ๋กœ ๋‘”๋‹ค). ์Šค์ผˆ๋ ˆํ†ค์€ **๊ธฐ๋ณธ๊ฐ’์ด ์ด๋ฏธ ์ •์ **์ด๊ณ 
209
+ ์ •์ง€ํ•œ ๋ธ”๋ก์ด ยซ๋กœ๋”ฉ ์ค‘ยป์„ ๊ทธ๋Œ€๋กœ ๋‚˜๋ฅด๋ฏ€๋กœ `pulse`/`shimmer` ๋Š” ์žฅ์‹์ด๋‹ค.
210
+
211
+ โš ์‹œํŠธ์˜ reduce ๊ทœ์น™(`--u-duration-*: 0ms`)์€ **`animation` ์„ ์“ฐ๋Š” ์ž๋ฆฌ์— ๋‹ฟ์ง€ ์•Š๋Š”๋‹ค** โ€”
212
+ ์ง€์†์‹œ๊ฐ„ ์ถ•์„ ๊ฒฝ์œ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ˜๋‹ค.
213
+
214
+ ### Changed
215
+
216
+ - โš **`u-dialog`ยท`u-drawer` ์ œ๋ชฉ์ด 2px ์ž‘์•„์ง„๋‹ค** โ€” `18px` ๋ฆฌํ„ฐ๋Ÿด โ†’ `--u-text-subtitle-size`(16px).
217
+
218
+ ์ข…์ „์—๋Š” *๋‹ค์ด์–ผ๋กœ๊ทธ ์ œ๋ชฉ 18 ยท ์–ผ๋Ÿฟ ์ œ๋ชฉ 16* ์œผ๋กœ **๊ฐ™์€ ์œ„๊ณ„๊ฐ€ ๋‘ ๊ฐ’**์ด์—ˆ๋‹ค. 18px ๋Š”
219
+ ํƒ€์ž… ์Šค์ผ€์ผ 7๋‹จ์— **์—†๋Š” ๋‹จ**์ด๋ผ ๋ฆฌํ„ฐ๋Ÿด๋กœ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ทธ๋ž˜์„œ ์†Œ๋น„์ž๊ฐ€ ์Šค์ผ€์ผ์„
220
+ ์กฐ์œจํ•ด๋„ ์ด ๋‘ ์ž๋ฆฌ๋Š” ๋”ฐ๋ผ์˜ค์ง€ ์•Š์•˜๋‹ค.
221
+
222
+ โš **๋‹จ์„ ๋Š˜๋ฆฌ์ง€ ์•Š์•˜๋‹ค** โ€” 18px ๋ฅผ ์š”๊ตฌํ•˜๋Š” ํƒ€์ดํฌ ์ž๋ฆฌ๋Š” ์ „์ˆ˜ **๋‘˜๋ฟ**์ด๊ณ (`u-copy-button`
223
+ ์˜ 18px ๋Š” ์•„์ด์ฝ˜ ํฌ๊ธฐ๋‹ค), ๋‹จ์ผ ์ˆ˜์š”๋กœ ์ถ•์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์€ ์„ ์ œ ํ™•์žฅ์ด๋‹ค. ๊ฐ™์€ ํŒจํ‚ค์ง€์˜
224
+ `u-alert` ๊ฐ€ ์ด๋ฏธ `subtitle` ์„ ์“ฐ๊ณ  ์žˆ์–ด **์„ ๋ก€๋ฅผ ๋”ฐ๋ž๋‹ค**.
225
+
226
+ โš **ํ—ค๋”์˜ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์€ `font-size: inherit` ์ด๋ผ ํ•จ๊ป˜ 2px ์ž‘์•„์ง„๋‹ค.**
227
+
228
+ `tests/build/type-scale.test.ts` ๊ฐ€ *"์ œ๋ชฉ ์œ„๊ณ„๋ฅผ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ™์€ ๋‹จ์„ ์ฝ๋Š”๊ฐ€"* ๋ฅผ
229
+ ๋Œ€์กฐํ•œ๋‹ค โ€” ๋ฆฌํ„ฐ๋Ÿด๋กœ ๋‹ค์‹œ ๊ฐˆ๋ผ์ง€๋ฉด ๋ฐœํ™”ํ•œ๋‹ค.
230
+
231
+ ### Fixed
232
+
233
+ - **์—ญํ•  ์ƒ‰์˜ ยซ์˜๋ฏธ ์ถฉ๋Œยป ๊ฒ€์‚ฌ๋ฅผ ๋’€๋‹ค**(`tests/build/role-color-collision.test.ts`).
234
+ ๋Œ€๋น„ ๊ฒ€์‚ฌ๋Š” ๊ฐ ์—ญํ• ์ƒ‰์„ **์ž๊ธฐ ๋ฐ”ํƒ•์— ๋Œ€ํ•ด** ์žฌ๋ฏ€๋กœ *"์ €์žฅ(primary)๊ณผ ์‚ญ์ œ(danger)๊ฐ€
235
+ ๊ฐ™์€ ์ƒ‰"* ์ธ ์ƒํƒœ๋„ **์–‘์ชฝ ๋‹ค ํ†ต๊ณผํ•œ๋‹ค** โ€” ๋Œ€๋น„๋Š” *์ฝํžˆ๋Š”๊ฐ€*๋ฅผ ๋ฌป์ง€ *๊ตฌ๋ณ„๋˜๋Š”๊ฐ€*๋ฅผ ๋ฌป์ง€
236
+ ์•Š๋Š”๋‹ค. ์ด์ œ ์—ญํ• ๋ผ๋ฆฌ์˜ ๊ฑฐ๋ฆฌ๋ฅผ CIELAB ฮ”E ๋กœ ์žฐ๋‹ค(์ž„๊ณ„ 20).
237
+
238
+ โš **`primary` ์™€ `info` ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์˜๋„์ ์œผ๋กœ ๊ฐ™์œผ๋ฏ€๋กœ ๋ฉด์ œ**๋‹ค(๋ธŒ๋žœ๋”ฉ์€ `primary` ๋งŒ
239
+ ๋ฐ”๊พผ๋‹ค). ๋ฉด์ œ์Œ์˜ **๊ทผ๊ฑฐ๊ฐ€ ์‹œํŠธ ์ฃผ์„์— ๋‚จ์•„ ์žˆ๋Š”์ง€**๋„ ํ•จ๊ป˜ ์žฐ๋‹ค โ€” ๊ทผ๊ฑฐ ์—†๋Š” ๋ฉด์ œ๊ฐ€
240
+ ์Œ“์ด๋ฉด ๊ฒ€์‚ฌ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์ง€ํ‚ค์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
241
+
242
+ ์‹ค์ธก: ๋ฉด์ œ์Œ์„ ๋บ€ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๊ฐ€ **38.7**(๋ผ์ดํŠธ `-strong` ์˜ warning/danger)์ด๋ผ ์ •์ƒ์ ์ธ
243
+ ๋žจํ”„ ์กฐ์œจ์—๋Š” ๋ฐœํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค.
244
+
3
245
  ## [1.22.0] - 2026-08-03
4
246
 
5
247
  ### Added
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) [year] [fullname]
3
+ Copyright (c) 2024 iyulab
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -76,7 +76,7 @@ npx skills add ./node_modules/@iyulab/components
76
76
 
77
77
  **Navigation** โ€” `u-menu`, `u-menu-item`, `u-tab-panel`, `u-breadcrumb`, `u-breadcrumb-item`, `u-tree`, `u-tree-item`
78
78
 
79
- **Layout & Display** โ€” `u-avatar`, `u-card`, `u-carousel`, `u-divider`, `u-icon`, `u-panel`, `u-split-panel`, `u-tag`
79
+ **Layout & Display** โ€” `u-avatar`, `u-card`, `u-carousel`, `u-divider`, `u-icon`, `u-panel`, `u-split-panel`, `u-tag`, `u-text`
80
80
 
81
81
  ## Theming
82
82
 
@@ -104,6 +104,38 @@ Theme.set('system');
104
104
 
105
105
  ์ž์„ธํ•œ ๋‚ด์šฉ์€ [docs/theming.md](./docs/theming.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
106
106
 
107
+ ## Localization
108
+
109
+ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ **์Šค์Šค๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ž์—ด**(๊ฒ€์ฆ ๋ฉ”์‹œ์ง€)์€ ๋‚ด์žฅ ๋กœ์ผ€์ผ 14์ข…์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ,
110
+ ํ™œ์„ฑ ๋กœ์ผ€์ผ ํ•˜๋‚˜๋กœ ์ „๋ถ€ ๋”ฐ๋ผ์˜ต๋‹ˆ๋‹ค.
111
+
112
+ ```ts
113
+ import { Locale } from '@iyulab/components';
114
+
115
+ Locale.set('ko'); // ํ™œ์„ฑ ๋กœ์ผ€์ผ
116
+ Locale.register('nl', { valueMissing: 'โ€ฆ' }); // ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€ override
117
+ ```
118
+
119
+ ### ๋„ค์ž„์ŠคํŽ˜์ด์Šค โ€” ์ƒ์œ„ ํŒจํ‚ค์ง€ยท์•ฑ์˜ ๋ฌธ์ž์—ด (1.23.0~)
120
+
121
+ ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€ ํ‚ค์…‹์€ **๋‹ซํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค**(9ํ‚ค). ๊ทธ ์œ„์— ์ž๊ธฐ ๋ฌธ์ž์—ด์„ ๋‹ด์œผ๋ ค๋ฉด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ
122
+ ์”๋‹ˆ๋‹ค โ€” ํ‚ค ์œ ๋‹ˆ์˜จ์€ **์“ฐ๋Š” ์ชฝ์ด** ์ •ํ•˜๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ‚ค์…‹์€ ์ปค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
123
+
124
+ ```ts
125
+ const t = Locale.namespace<'empty' | 'loading'>('u-data-view');
126
+
127
+ t.register('en', { empty: 'No data', loading: 'Loadingโ€ฆ' }); // ๊ธฐ๋ณธ์€ ์˜์–ด
128
+ t.register('ko', { empty: '๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค' }); // ํ•„์š”ํ•œ ์–ธ์–ด๋งŒ ์ถ”๊ฐ€
129
+
130
+ t.text('empty'); // ํ™œ์„ฑ ๋กœ์ผ€์ผ ๊ธฐ์ค€
131
+ t.text('greet', { who: 'Ann' }); // {name} ์น˜ํ™˜
132
+ ```
133
+
134
+ - ์กฐํšŒ ์‚ฌ์Šฌ์€ ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค: **์ •ํ™• ์ผ์น˜ โ†’ base ์–ธ์–ด(`ko-KR` โ†’ `ko`) โ†’ `en`**.
135
+ - ๊ฐ™์€ ์ด๋ฆ„์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” **๊ฐ™์€ ์ €์žฅ์†Œ**๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค(๋ชจ๋“ˆ ์–ด๋””์„œ ๋งŒ๋“ค์–ด๋„ ๋ฉ๋‹ˆ๋‹ค).
136
+ - ์‚ฌ์Šฌ์— ์—†๋Š” ํ‚ค๋Š” **ํ‚ค ์ž์ฒด**๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค โ€” ์กฐ์šฉํžˆ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
137
+ - `Locale.set()` ํ•˜๋‚˜๋กœ ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€์™€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํ•จ๊ป˜ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.
138
+
107
139
  ## Documentation
108
140
 
109
141
  | ๋ฌธ์„œ | ๋‚ด์šฉ |
@@ -65,6 +65,24 @@ export declare abstract class UOverlayElement extends UElement {
65
65
  requestClose(source: string): void;
66
66
  /** ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ์—ด๋ฆด ๋•Œ ์„ค์ •์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. */
67
67
  private setup;
68
+ /**
69
+ * ์—ด๋ฆด ๋•Œ ํฌ์ปค์Šค๋ฅผ ๋ฐ›์„ ์š”์†Œ๋ฅผ ์ •ํ•œ๋‹ค โ€” **์ž…๋ ฅ์„ ๋จผ์ € ๋ณธ๋‹ค.**
70
+ *
71
+ * ์ˆœ์„œ: `[autofocus]` โ†’ ์ฒซ ์ž…๋ ฅ ์ปจํŠธ๋กค โ†’ (์—†์œผ๋ฉด) focus-trap ๊ธฐ๋ณธ๊ฐ’(์ฒซ tabbable).
72
+ *
73
+ * ๐Ÿ”ด**๋‘ ๋ถ„๊ธฐ๊ฐ€ ยซ๊ฐ๊ฐยป ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋˜๋Œ๋ ค ์žฌ์„œ ๊ฐˆ๋ž๋‹ค** โ€” ์ด ํ•จ์ˆ˜๋Š” ๊ทธ ๊ธฐ๋ก์ด๋‹ค.
74
+ *
75
+ * `[autofocus]` โ†’ `u-drawer` ์—์„œ ๊ฐˆ๋ฆฐ๋‹ค. `focus-trap` ์€ ๊ทธ ์†์„ฑ์„ ์กด์ค‘ํ•˜์ง€ ์•Š๋Š”๋‹ค
76
+ * (v7 `getInitialFocusNode` ๋Š” ยซ์ฒซ tabbableยป ๋กœ ํด๋ฐฑํ•œ๋‹ค).
77
+ * ์ฒซ ์ž…๋ ฅ ์šฐ์„  โ†’ `u-dialog` ์—์„œ ๊ฐˆ๋ฆฐ๋‹ค. ๋ฒ„ํŠผ์ด DOM ์ˆœ์„œ์ƒ ์•ž์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ **๋ฒ„ํŠผ**์„
78
+ * ์žก๋Š”๋‹ค(์‹ค์ธก: ์ œ๊ฑฐํ•˜๋ฉด `button#b1`, ๋ณต์›ํ•˜๋ฉด `input`).
79
+ *
80
+ * โš **`u-drawer` ๋งŒ์œผ๋กœ๋Š” ๋‘ ๋ฒˆ์งธ ๋ถ„๊ธฐ๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค** โ€” ์Šฌ๋กฏ ๋ฐฐ์น˜ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ๊ฐ’๋„
81
+ * ์šฐ์—ฐํžˆ ์ฒซ ์ž…๋ ฅ์— ๋–จ์–ด์ง„๋‹ค. *"๋˜๋Œ๋ ค๋„ ํ†ต๊ณผํ•œ๋‹ค"* ๋ฅผ *"์ด ์ฝ”๋“œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ํ•œ๋‹ค"* ๋กœ
82
+ * ์ฝ์„ ๋ป”ํ–ˆ๊ณ , **ํŒ๋ณ„ํ•˜๋Š” ์ž…๋ ฅ์„ ์ฐพ์€ ๋’ค์—์•ผ** ๊ฐˆ๋ ธ๋‹ค.
83
+ * (`tests/browser/overlay-initial-focus.browser.test.ts` ๊ฐ€ ๋‘˜ ๋‹ค ๊ฐ์‹œํ•œ๋‹ค.)
84
+ */
85
+ private resolveInitialFocus;
68
86
  /** ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ๋‹ซํž ๋•Œ ์„ค์ •์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. */
69
87
  private cleanup;
70
88
  /** host ์ž์ฒด๋ฅผ ํด๋ฆญํ•œ ๊ฒฝ์šฐ(๋ฐฑ๋“œ๋กญ)๋งŒ ๋‹ซ๊ธฐ ์š”์ฒญ */
@@ -102,12 +102,36 @@ var UOverlayElement = class extends UElement {
102
102
  clickOutsideDeactivates: false,
103
103
  allowOutsideClick: true,
104
104
  fallbackFocus: this,
105
+ initialFocus: () => this.resolveInitialFocus(),
105
106
  trapStack: OverlayManager.trapStack,
106
107
  tabbableOptions: { getShadowRoot: true }
107
108
  });
108
109
  this.focusTrap.activate();
109
110
  }
110
111
  }
112
+ /**
113
+ * ์—ด๋ฆด ๋•Œ ํฌ์ปค์Šค๋ฅผ ๋ฐ›์„ ์š”์†Œ๋ฅผ ์ •ํ•œ๋‹ค โ€” **์ž…๋ ฅ์„ ๋จผ์ € ๋ณธ๋‹ค.**
114
+ *
115
+ * ์ˆœ์„œ: `[autofocus]` โ†’ ์ฒซ ์ž…๋ ฅ ์ปจํŠธ๋กค โ†’ (์—†์œผ๋ฉด) focus-trap ๊ธฐ๋ณธ๊ฐ’(์ฒซ tabbable).
116
+ *
117
+ * ๐Ÿ”ด**๋‘ ๋ถ„๊ธฐ๊ฐ€ ยซ๊ฐ๊ฐยป ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋˜๋Œ๋ ค ์žฌ์„œ ๊ฐˆ๋ž๋‹ค** โ€” ์ด ํ•จ์ˆ˜๋Š” ๊ทธ ๊ธฐ๋ก์ด๋‹ค.
118
+ *
119
+ * `[autofocus]` โ†’ `u-drawer` ์—์„œ ๊ฐˆ๋ฆฐ๋‹ค. `focus-trap` ์€ ๊ทธ ์†์„ฑ์„ ์กด์ค‘ํ•˜์ง€ ์•Š๋Š”๋‹ค
120
+ * (v7 `getInitialFocusNode` ๋Š” ยซ์ฒซ tabbableยป ๋กœ ํด๋ฐฑํ•œ๋‹ค).
121
+ * ์ฒซ ์ž…๋ ฅ ์šฐ์„  โ†’ `u-dialog` ์—์„œ ๊ฐˆ๋ฆฐ๋‹ค. ๋ฒ„ํŠผ์ด DOM ์ˆœ์„œ์ƒ ์•ž์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ **๋ฒ„ํŠผ**์„
122
+ * ์žก๋Š”๋‹ค(์‹ค์ธก: ์ œ๊ฑฐํ•˜๋ฉด `button#b1`, ๋ณต์›ํ•˜๋ฉด `input`).
123
+ *
124
+ * โš **`u-drawer` ๋งŒ์œผ๋กœ๋Š” ๋‘ ๋ฒˆ์งธ ๋ถ„๊ธฐ๋ฅผ ํŒ๋ณ„ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค** โ€” ์Šฌ๋กฏ ๋ฐฐ์น˜ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ๊ฐ’๋„
125
+ * ์šฐ์—ฐํžˆ ์ฒซ ์ž…๋ ฅ์— ๋–จ์–ด์ง„๋‹ค. *"๋˜๋Œ๋ ค๋„ ํ†ต๊ณผํ•œ๋‹ค"* ๋ฅผ *"์ด ์ฝ”๋“œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ํ•œ๋‹ค"* ๋กœ
126
+ * ์ฝ์„ ๋ป”ํ–ˆ๊ณ , **ํŒ๋ณ„ํ•˜๋Š” ์ž…๋ ฅ์„ ์ฐพ์€ ๋’ค์—์•ผ** ๊ฐˆ๋ ธ๋‹ค.
127
+ * (`tests/browser/overlay-initial-focus.browser.test.ts` ๊ฐ€ ๋‘˜ ๋‹ค ๊ฐ์‹œํ•œ๋‹ค.)
128
+ */
129
+ resolveInitialFocus() {
130
+ const explicit = this.querySelector("[autofocus]");
131
+ if (explicit) return explicit;
132
+ const control = this.querySelector("input, select, textarea, u-input, u-textarea, u-select, u-checkbox, u-radio, u-switch, u-slider");
133
+ if (control) return control;
134
+ }
111
135
  /** ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ๋‹ซํž ๋•Œ ์„ค์ •์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. */
112
136
  cleanup() {
113
137
  this.focusTrap?.deactivate();
@@ -22,6 +22,11 @@ export declare class UBadge extends UElement {
22
22
  color: BadgeColor;
23
23
  /** ๋ถ€๋ชจ ์š”์†Œ ๊ธฐ์ค€ ๋ฐฐ์น˜ ์œ„์น˜ (์„ค์ • ์‹œ position: absolute) */
24
24
  anchor?: BadgeAnchor;
25
+ /**
26
+ * ์ƒํƒœ๋ฅผ **์ƒ‰๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ** ๋‚˜๋ฅด๋Š” ์•„์ด์ฝ˜์„ ๋ถ™์ž…๋‹ˆ๋‹ค(`info`ยท`success`ยท`warning`ยท`danger`).
27
+ * ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์ƒ‰(`neutral`ยท`primary`ยท์žฅ์‹ ์ถ•)๊ณผ `variant="dot"` ์—์„œ๋Š” ๊ทธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
28
+ */
29
+ icon: boolean;
25
30
  render(): import('lit-html').TemplateResult<1> | typeof nothing;
26
31
  }
27
32
  declare global {
@@ -1,6 +1,8 @@
1
1
  import { UElement } from "../UElement.js";
2
2
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
3
3
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
4
+ import "../icon/UIcon.js";
5
+ import { statusIcon } from "../../utilities/statusIcon.js";
4
6
  import { styles } from "./UBadge.styles.js";
5
7
  import { html, nothing } from "lit";
6
8
  import { customElement, property } from "lit/decorators.js";
@@ -10,14 +12,17 @@ var UBadge = class UBadge extends UElement {
10
12
  super(..._args);
11
13
  this.variant = "pill";
12
14
  this.color = "blue";
15
+ this.icon = false;
13
16
  }
14
17
  static {
15
18
  this.styles = [super.styles, styles];
16
19
  }
17
20
  render() {
18
21
  if (this.variant === "dot") return nothing;
22
+ const iconName = this.icon ? statusIcon(this.color) : void 0;
19
23
  return html`
20
24
  <div class="base" part="base">
25
+ ${iconName ? html`<u-icon class="icon" part="icon" lib="internal" name=${iconName}></u-icon>` : nothing}
21
26
  <slot name="prefix"></slot>
22
27
  <slot></slot>
23
28
  <slot name="suffix"></slot>
@@ -37,6 +42,10 @@ __decorate([property({
37
42
  type: String,
38
43
  reflect: true
39
44
  }), __decorateMetadata("design:type", Object)], UBadge.prototype, "anchor", void 0);
45
+ __decorate([property({
46
+ type: Boolean,
47
+ reflect: true
48
+ }), __decorateMetadata("design:type", Object)], UBadge.prototype, "icon", void 0);
40
49
  UBadge = __decorate([customElement("u-badge")], UBadge);
41
50
  //#endregion
42
51
  export { UBadge };
@@ -140,6 +140,12 @@ var styles = css`
140
140
  transform: translate(-50%, 50%);
141
141
  }
142
142
 
143
+ /* ์ƒํƒœ ์•„์ด์ฝ˜ โ€” prefix ์Šฌ๋กฏ๊ณผ ๊ฐ™์€ ๊ฐ„๊ฒฉ์„ ์“ด๋‹ค. */
144
+ .icon {
145
+ flex-shrink: 0;
146
+ margin-right: 0.25em;
147
+ }
148
+
143
149
  /* === Slots === */
144
150
  ::slotted([slot="prefix"]) {
145
151
  margin-right: 0.25em;
@@ -89,7 +89,7 @@ var styles = css`
89
89
  justify-content: space-between;
90
90
  gap: var(--u-space-sm, 8px);
91
91
  padding: var(--u-space-md, 12px) var(--u-space-lg, 16px);
92
- font-size: 18px;
92
+ font-size: var(--u-text-subtitle-size, 16px);
93
93
  font-weight: 600;
94
94
  line-height: 1.3;
95
95
  border-bottom: 1px solid var(--u-border-color, #E0E0E0);
@@ -77,7 +77,7 @@ var styles = css`
77
77
  justify-content: space-between;
78
78
  gap: var(--u-space-sm, 8px);
79
79
  padding: var(--u-space-md, 12px) var(--u-space-lg, 16px);
80
- font-size: 18px;
80
+ font-size: var(--u-text-subtitle-size, 16px);
81
81
  font-weight: 600;
82
82
  line-height: 1.3;
83
83
  border-bottom: 1px solid var(--u-border-color, #E0E0E0);
@@ -0,0 +1,38 @@
1
+ import { UElement } from '../UElement.js';
2
+ /**
3
+ * ์ œ๋ชฉ์„ ๋ˆŒ๋Ÿฌ ๋ณธ๋ฌธ์„ ์ ‘๊ณ  ํŽด๋Š” ๋””์Šคํด๋กœ์ €(์ต์ŠคํŒฌ๋”) ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
4
+ *
5
+ * @slot - ํŽผ์ณค์„ ๋•Œ ๋ณด์ด๋Š” ๋ณธ๋ฌธ
6
+ * @slot header - ์ œ๋ชฉ ์˜์—ญ์„ ํ†ต์งธ๋กœ ๋Œ€์ฒดํ•˜๋Š” ์ฝ˜ํ…์ธ  (`label` ๋ณด๋‹ค ์šฐ์„ )
7
+ * @slot suffix - ์ œ๋ชฉ ์šฐ์ธก์— ๋†“์ด๋Š” ์ฝ˜ํ…์ธ  (์ƒํƒœ ๋ฐฐ์ง€ยท๋ณด์กฐ ์•ก์…˜ ๋“ฑ)
8
+ *
9
+ * @csspart header - ์ œ๋ชฉ ๋ฒ„ํŠผ ์˜์—ญ
10
+ * @csspart icon - ํŽผ์นจ ํ‘œ์‹œ ์•„์ด์ฝ˜
11
+ * @csspart label - ์ œ๋ชฉ ํ…์ŠคํŠธ ์˜์—ญ
12
+ * @csspart content - ๋ณธ๋ฌธ์„ ๊ฐ์‹ธ๋Š” ์˜์—ญ
13
+ *
14
+ * @event expand - ํŽผ์ณ์งˆ ๋•Œ ๋ฐœ์ƒ (์ทจ์†Œ ๊ฐ€๋Šฅ)
15
+ * @event collapse - ์ ‘ํž ๋•Œ ๋ฐœ์ƒ (์ทจ์†Œ ๊ฐ€๋Šฅ)
16
+ */
17
+ export declare class UExpander extends UElement {
18
+ static styles: import('lit').CSSResultGroup[];
19
+ /** ํŽผ์นจ ์—ฌ๋ถ€ */
20
+ open: boolean;
21
+ /** ๋น„ํ™œ์„ฑํ™” ์—ฌ๋ถ€ */
22
+ disabled: boolean;
23
+ /** ์ œ๋ชฉ ํ…์ŠคํŠธ (`header` ์Šฌ๋กฏ์ด ์žˆ์œผ๋ฉด ๊ทธ์ชฝ์ด ์ด๊น๋‹ˆ๋‹ค) */
24
+ label: string;
25
+ render(): import('lit-html').TemplateResult<1>;
26
+ /** ํŽผ์นฉ๋‹ˆ๋‹ค. `expand` ์ด๋ฒคํŠธ๊ฐ€ ์ทจ์†Œ๋˜๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๊ณ  `false` ๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. */
27
+ expand(): boolean;
28
+ /** ์ ‘์Šต๋‹ˆ๋‹ค. `collapse` ์ด๋ฒคํŠธ๊ฐ€ ์ทจ์†Œ๋˜๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๊ณ  `false` ๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. */
29
+ collapse(): boolean;
30
+ /** ํ˜„์žฌ ์ƒํƒœ์˜ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. */
31
+ toggle(): boolean;
32
+ private handleClick;
33
+ }
34
+ declare global {
35
+ interface HTMLElementTagNameMap {
36
+ 'u-expander': UExpander;
37
+ }
38
+ }
@@ -0,0 +1,78 @@
1
+ import { UElement } from "../UElement.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
4
+ import "../icon/UIcon.js";
5
+ import { styles } from "./UExpander.styles.js";
6
+ import { html } from "lit";
7
+ import { customElement, property } from "lit/decorators.js";
8
+ //#region src/components/expander/UExpander.ts
9
+ var UExpander = class UExpander extends UElement {
10
+ constructor(..._args) {
11
+ super(..._args);
12
+ this.open = false;
13
+ this.disabled = false;
14
+ this.label = "";
15
+ this.handleClick = () => {
16
+ this.toggle();
17
+ };
18
+ }
19
+ static {
20
+ this.styles = [super.styles, styles];
21
+ }
22
+ render() {
23
+ return html`
24
+ <div class="frame">
25
+ <button class="header" part="header" type="button"
26
+ aria-expanded=${this.open ? "true" : "false"}
27
+ aria-controls="content"
28
+ ?disabled=${this.disabled}
29
+ @click=${this.handleClick}
30
+ >
31
+ <u-icon class="icon" part="icon" lib="internal" name="chevron-right"></u-icon>
32
+ <span class="label" part="label"><slot name="header">${this.label}</slot></span>
33
+ <slot name="suffix"></slot>
34
+ </button>
35
+
36
+ <div class="content" part="content" id="content" role="region">
37
+ <div class="inner">
38
+ <div class="body"><slot></slot></div>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ `;
43
+ }
44
+ /** ํŽผ์นฉ๋‹ˆ๋‹ค. `expand` ์ด๋ฒคํŠธ๊ฐ€ ์ทจ์†Œ๋˜๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๊ณ  `false` ๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. */
45
+ expand() {
46
+ if (this.disabled || this.open) return false;
47
+ if (this.fire("expand")) {
48
+ this.open = true;
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ /** ์ ‘์Šต๋‹ˆ๋‹ค. `collapse` ์ด๋ฒคํŠธ๊ฐ€ ์ทจ์†Œ๋˜๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๊ณ  `false` ๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. */
54
+ collapse() {
55
+ if (this.disabled || !this.open) return false;
56
+ if (this.fire("collapse")) {
57
+ this.open = false;
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+ /** ํ˜„์žฌ ์ƒํƒœ์˜ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. */
63
+ toggle() {
64
+ return this.open ? this.collapse() : this.expand();
65
+ }
66
+ };
67
+ __decorate([property({
68
+ type: Boolean,
69
+ reflect: true
70
+ }), __decorateMetadata("design:type", Object)], UExpander.prototype, "open", void 0);
71
+ __decorate([property({
72
+ type: Boolean,
73
+ reflect: true
74
+ }), __decorateMetadata("design:type", Object)], UExpander.prototype, "disabled", void 0);
75
+ __decorate([property({ type: String }), __decorateMetadata("design:type", Object)], UExpander.prototype, "label", void 0);
76
+ UExpander = __decorate([customElement("u-expander")], UExpander);
77
+ //#endregion
78
+ export { UExpander };
@@ -0,0 +1 @@
1
+ export declare const styles: import('lit').CSSResult;