@iyulab/components 1.13.0 → 1.14.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 (48) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/dist/components/UElement.styles.js +8 -8
  3. package/dist/components/UOverlayElement.styles.js +1 -1
  4. package/dist/components/alert/UAlert.styles.js +21 -21
  5. package/dist/components/avatar/UAvatar.styles.js +5 -5
  6. package/dist/components/badge/UBadge.styles.js +22 -22
  7. package/dist/components/breadcrumb/UBreadcrumb.styles.js +2 -2
  8. package/dist/components/breadcrumb-item/UBreadcrumbItem.styles.js +2 -2
  9. package/dist/components/button/UButton.styles.js +28 -28
  10. package/dist/components/card/UCard.styles.js +5 -5
  11. package/dist/components/carousel/UCarousel.styles.js +8 -8
  12. package/dist/components/checkbox/UCheckbox.styles.js +20 -20
  13. package/dist/components/copy-button/UCopyButton.styles.js +2 -2
  14. package/dist/components/dialog/UDialog.styles.js +4 -4
  15. package/dist/components/divider/UDivider.styles.js +2 -2
  16. package/dist/components/drawer/UDrawer.styles.js +3 -3
  17. package/dist/components/field/UField.styles.js +4 -4
  18. package/dist/components/icon-button/UIconButton.styles.js +2 -2
  19. package/dist/components/input/UInput.styles.js +30 -30
  20. package/dist/components/menu/UMenu.styles.js +4 -4
  21. package/dist/components/menu-item/UMenuItem.styles.js +7 -7
  22. package/dist/components/option/UOption.styles.js +9 -9
  23. package/dist/components/progress-bar/UProgressBar.styles.js +12 -12
  24. package/dist/components/progress-ring/UProgressRing.styles.js +11 -11
  25. package/dist/components/radio/URadio.styles.js +6 -6
  26. package/dist/components/rating/URating.styles.js +3 -3
  27. package/dist/components/select/USelect.styles.js +34 -34
  28. package/dist/components/skeleton/USkeleton.d.ts +2 -2
  29. package/dist/components/skeleton/USkeleton.styles.js +5 -5
  30. package/dist/components/slider/USlider.styles.js +10 -10
  31. package/dist/components/spinner/USpinner.styles.js +11 -11
  32. package/dist/components/split-panel/USplitPanel.styles.js +3 -3
  33. package/dist/components/switch/USwitch.styles.js +10 -10
  34. package/dist/components/tab/UTab.styles.js +3 -3
  35. package/dist/components/tab-panel/UTabPanel.styles.js +22 -22
  36. package/dist/components/tag/UTag.styles.js +55 -55
  37. package/dist/components/textarea/UTextarea.styles.js +25 -25
  38. package/dist/components/tooltip/UTooltip.styles.js +3 -3
  39. package/dist/components/tree/UTree.d.ts +1 -1
  40. package/dist/components/tree/UTree.styles.js +6 -3
  41. package/dist/components/tree-item/UTreeItem.styles.js +7 -7
  42. package/dist/plugins/vite-plugin-glob-resolve.d.ts +12 -0
  43. package/dist/plugins/vite-plugin-glob-resolve.js +66 -0
  44. package/dist/plugins/vite-plugin-react-wrapper.d.ts +54 -0
  45. package/dist/plugins/vite-plugin-react-wrapper.js +294 -0
  46. package/dist/utilities/Theme.d.ts +16 -1
  47. package/dist/utilities/Theme.js +22 -1
  48. package/package.json +5 -6
@@ -2,9 +2,9 @@ import { css } from "lit";
2
2
  //#region src/components/tag/UTag.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --tag-fill-color: var(--u-primary-color);
6
- --tag-color: var(--u-neutral-800);
7
- --tag-bg-color: var(--u-neutral-100);
5
+ --tag-fill-color: var(--u-primary-color, #1E88E5);
6
+ --tag-color: var(--u-neutral-800, #424242);
7
+ --tag-bg-color: var(--u-neutral-100, #F5F5F5);
8
8
  --tag-border-color: transparent;
9
9
  }
10
10
 
@@ -16,73 +16,73 @@ var styles = css`
16
16
  슬롯이 비면(color="neutral") variant 규칙의 폴백 = 브랜드 경로를 탄다.
17
17
  ========================================================================== */
18
18
  :host([color="blue"]) {
19
- --tag-hue-solid: var(--u-blue-500);
20
- --tag-hue-line: var(--u-blue-300);
21
- --tag-hue-surface: var(--u-blue-100);
22
- --tag-hue-text: var(--u-blue-800);
23
- --tag-hue-text-outlined: var(--u-blue-600);
19
+ --tag-hue-solid: var(--u-blue-500, #2196F3);
20
+ --tag-hue-line: var(--u-blue-300, #64B5F6);
21
+ --tag-hue-surface: var(--u-blue-100, #BBDEFB);
22
+ --tag-hue-text: var(--u-blue-800, #1565C0);
23
+ --tag-hue-text-outlined: var(--u-blue-600, #1E88E5);
24
24
  }
25
25
  :host([color="green"]) {
26
- --tag-hue-solid: var(--u-green-500);
27
- --tag-hue-line: var(--u-green-300);
28
- --tag-hue-surface: var(--u-green-100);
29
- --tag-hue-text: var(--u-green-800);
30
- --tag-hue-text-outlined: var(--u-green-600);
26
+ --tag-hue-solid: var(--u-green-500, #4CAF50);
27
+ --tag-hue-line: var(--u-green-300, #81C784);
28
+ --tag-hue-surface: var(--u-green-100, #C8E6C9);
29
+ --tag-hue-text: var(--u-green-800, #2E7D32);
30
+ --tag-hue-text-outlined: var(--u-green-600, #43A047);
31
31
  }
32
32
  /* yellow 는 명도가 높아 solid·outlined 텍스트를 한 단 진하게 쓴다 */
33
33
  :host([color="yellow"]) {
34
- --tag-hue-solid: var(--u-yellow-600);
35
- --tag-hue-line: var(--u-yellow-300);
36
- --tag-hue-surface: var(--u-yellow-100);
37
- --tag-hue-text: var(--u-yellow-800);
38
- --tag-hue-text-outlined: var(--u-yellow-700);
34
+ --tag-hue-solid: var(--u-yellow-600, #FDD835);
35
+ --tag-hue-line: var(--u-yellow-300, #FFF176);
36
+ --tag-hue-surface: var(--u-yellow-100, #FFF9C4);
37
+ --tag-hue-text: var(--u-yellow-800, #F9A825);
38
+ --tag-hue-text-outlined: var(--u-yellow-700, #FBC02D);
39
39
  }
40
40
  :host([color="red"]) {
41
- --tag-hue-solid: var(--u-red-500);
42
- --tag-hue-line: var(--u-red-300);
43
- --tag-hue-surface: var(--u-red-100);
44
- --tag-hue-text: var(--u-red-800);
45
- --tag-hue-text-outlined: var(--u-red-600);
41
+ --tag-hue-solid: var(--u-red-500, #F44336);
42
+ --tag-hue-line: var(--u-red-300, #E57373);
43
+ --tag-hue-surface: var(--u-red-100, #FFCDD2);
44
+ --tag-hue-text: var(--u-red-800, #C62828);
45
+ --tag-hue-text-outlined: var(--u-red-600, #E53935);
46
46
  }
47
47
  :host([color="orange"]) {
48
- --tag-hue-solid: var(--u-orange-500);
49
- --tag-hue-line: var(--u-orange-300);
50
- --tag-hue-surface: var(--u-orange-100);
51
- --tag-hue-text: var(--u-orange-800);
52
- --tag-hue-text-outlined: var(--u-orange-600);
48
+ --tag-hue-solid: var(--u-orange-500, #FF9800);
49
+ --tag-hue-line: var(--u-orange-300, #FFB74D);
50
+ --tag-hue-surface: var(--u-orange-100, #FFE0B2);
51
+ --tag-hue-text: var(--u-orange-800, #EF6C00);
52
+ --tag-hue-text-outlined: var(--u-orange-600, #FB8C00);
53
53
  }
54
54
  :host([color="teal"]) {
55
- --tag-hue-solid: var(--u-teal-500);
56
- --tag-hue-line: var(--u-teal-300);
57
- --tag-hue-surface: var(--u-teal-100);
58
- --tag-hue-text: var(--u-teal-800);
59
- --tag-hue-text-outlined: var(--u-teal-600);
55
+ --tag-hue-solid: var(--u-teal-500, #009688);
56
+ --tag-hue-line: var(--u-teal-300, #4DB6AC);
57
+ --tag-hue-surface: var(--u-teal-100, #B2DFDB);
58
+ --tag-hue-text: var(--u-teal-800, #00695C);
59
+ --tag-hue-text-outlined: var(--u-teal-600, #00897B);
60
60
  }
61
61
  :host([color="cyan"]) {
62
- --tag-hue-solid: var(--u-cyan-500);
63
- --tag-hue-line: var(--u-cyan-300);
64
- --tag-hue-surface: var(--u-cyan-100);
65
- --tag-hue-text: var(--u-cyan-800);
66
- --tag-hue-text-outlined: var(--u-cyan-600);
62
+ --tag-hue-solid: var(--u-cyan-500, #00BCD4);
63
+ --tag-hue-line: var(--u-cyan-300, #4DD0E1);
64
+ --tag-hue-surface: var(--u-cyan-100, #B2EBF2);
65
+ --tag-hue-text: var(--u-cyan-800, #00838F);
66
+ --tag-hue-text-outlined: var(--u-cyan-600, #00ACC1);
67
67
  }
68
68
  :host([color="purple"]) {
69
- --tag-hue-solid: var(--u-purple-500);
70
- --tag-hue-line: var(--u-purple-300);
71
- --tag-hue-surface: var(--u-purple-100);
72
- --tag-hue-text: var(--u-purple-800);
73
- --tag-hue-text-outlined: var(--u-purple-600);
69
+ --tag-hue-solid: var(--u-purple-500, #9C27B0);
70
+ --tag-hue-line: var(--u-purple-300, #BA68C8);
71
+ --tag-hue-surface: var(--u-purple-100, #E1BEE7);
72
+ --tag-hue-text: var(--u-purple-800, #6A1B9A);
73
+ --tag-hue-text-outlined: var(--u-purple-600, #8E24AA);
74
74
  }
75
75
  :host([color="pink"]) {
76
- --tag-hue-solid: var(--u-pink-500);
77
- --tag-hue-line: var(--u-pink-300);
78
- --tag-hue-surface: var(--u-pink-100);
79
- --tag-hue-text: var(--u-pink-800);
80
- --tag-hue-text-outlined: var(--u-pink-600);
76
+ --tag-hue-solid: var(--u-pink-500, #E91E63);
77
+ --tag-hue-line: var(--u-pink-300, #F06292);
78
+ --tag-hue-surface: var(--u-pink-100, #F8BBD0);
79
+ --tag-hue-text: var(--u-pink-800, #AD1457);
80
+ --tag-hue-text-outlined: var(--u-pink-600, #D81B60);
81
81
  }
82
82
 
83
83
  /* Variant: solid (강한 채움, 색 미지정 시 --tag-fill-color = 브랜드) */
84
84
  :host([variant="solid"]) {
85
- --tag-color: var(--u-neutral-0);
85
+ --tag-color: var(--u-neutral-0, #FFFFFF);
86
86
  --tag-bg-color: var(--tag-hue-solid, var(--tag-fill-color));
87
87
  --tag-border-color: var(--tag-hue-solid, var(--tag-fill-color));
88
88
  }
@@ -90,14 +90,14 @@ var styles = css`
90
90
  /* Variant: surface (채우기 + 테두리, 기본 색상은 --u-primary-color) */
91
91
  :host([variant="surface"]) {
92
92
  --tag-color: var(--tag-hue-text, color-mix(in srgb, var(--tag-fill-color) 70%, black));
93
- --tag-bg-color: var(--tag-hue-surface, color-mix(in srgb, var(--tag-fill-color) 15%, var(--u-bg-color)));
94
- --tag-border-color: var(--tag-hue-line, color-mix(in srgb, var(--tag-fill-color) 40%, var(--u-bg-color)));
93
+ --tag-bg-color: var(--tag-hue-surface, color-mix(in srgb, var(--tag-fill-color) 15%, var(--u-bg-color, #FFFFFF)));
94
+ --tag-border-color: var(--tag-hue-line, color-mix(in srgb, var(--tag-fill-color) 40%, var(--u-bg-color, #FFFFFF)));
95
95
  }
96
96
 
97
97
  /* Variant: filled (채우기만, 테두리 없음, 기본 색상은 --u-primary-color) */
98
98
  :host([variant="filled"]) {
99
99
  --tag-color: var(--tag-hue-text, color-mix(in srgb, var(--tag-fill-color) 70%, black));
100
- --tag-bg-color: var(--tag-hue-surface, color-mix(in srgb, var(--tag-fill-color) 15%, var(--u-bg-color)));
100
+ --tag-bg-color: var(--tag-hue-surface, color-mix(in srgb, var(--tag-fill-color) 15%, var(--u-bg-color, #FFFFFF)));
101
101
  --tag-border-color: transparent;
102
102
  }
103
103
 
@@ -105,14 +105,14 @@ var styles = css`
105
105
  :host([variant="outlined"]) {
106
106
  --tag-color: var(--tag-hue-text-outlined, color-mix(in srgb, var(--tag-fill-color) 85%, black));
107
107
  --tag-bg-color: transparent;
108
- --tag-border-color: var(--tag-hue-line, color-mix(in srgb, var(--tag-fill-color) 40%, var(--u-bg-color)));
108
+ --tag-border-color: var(--tag-hue-line, color-mix(in srgb, var(--tag-fill-color) 40%, var(--u-bg-color, #FFFFFF)));
109
109
  }
110
110
 
111
111
  :host {
112
112
  display: inline-flex;
113
113
  font-size: 12px;
114
114
  font-weight: 500;
115
- border-radius: var(--u-radius-md);
115
+ border-radius: var(--u-radius-md, 4px);
116
116
 
117
117
  --tag-padding-block: 0.25em;
118
118
  --tag-padding-inline: 0.5em;
@@ -137,7 +137,7 @@ var styles = css`
137
137
  border-radius: inherit;
138
138
  }
139
139
  :host([rounded]) {
140
- border-radius: var(--u-radius-pill);
140
+ border-radius: var(--u-radius-pill, 9999px);
141
141
  }
142
142
 
143
143
  /*
@@ -3,7 +3,7 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  display: inline-block;
6
- color: var(--u-txt-color);
6
+ color: var(--u-txt-color, #212121);
7
7
  font-size: inherit;
8
8
  font-family: var(--u-font-base);
9
9
  }
@@ -12,84 +12,84 @@ var styles = css`
12
12
  .container {
13
13
  display: flex;
14
14
  padding: 0.3em 0.6em;
15
- border: 1px solid var(--u-input-border-color);
15
+ border: 1px solid var(--u-input-border-color, #E0E0E0);
16
16
  border-radius: 0.25em;
17
- background-color: var(--u-input-bg-color);
17
+ background-color: var(--u-input-bg-color, #FFFFFF);
18
18
  transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
19
19
  }
20
20
  :host([readonly]) .container,
21
21
  :host([disabled]) .container {
22
- border-color: var(--u-border-color-weak);
23
- background-color: var(--u-bg-color-disabled);
22
+ border-color: var(--u-border-color-weak, #EEEEEE);
23
+ background-color: var(--u-bg-color-disabled, #FAFAFA);
24
24
  }
25
25
  :host(:not([readonly]):not([disabled])) .container:hover {
26
- box-shadow: 0 0 0 1px var(--u-input-border-color-hover);
26
+ box-shadow: 0 0 0 1px var(--u-input-border-color-hover, #BDBDBD);
27
27
  }
28
28
  :host(:not([readonly]):not([disabled])) .container:focus-within {
29
- box-shadow: 0 0 0 1px var(--u-input-border-color-focus);
29
+ box-shadow: 0 0 0 1px var(--u-input-border-color-focus, #1E88E5);
30
30
  }
31
31
  :host([invalid]:not([readonly]):not([disabled])) .container {
32
- box-shadow: 0 0 0 1px var(--u-input-border-color-invalid);
32
+ box-shadow: 0 0 0 1px var(--u-input-border-color-invalid, #E53935);
33
33
  }
34
34
 
35
35
  /* ===== Variant: filled ===== */
36
36
  :host([variant="filled"]) .container {
37
37
  border-color: transparent;
38
- background-color: var(--u-neutral-200);
38
+ background-color: var(--u-neutral-200, #EEEEEE);
39
39
  border-radius: 0.25em 0.25em 0 0;
40
- border-bottom: 2px solid var(--u-input-border-color);
40
+ border-bottom: 2px solid var(--u-input-border-color, #E0E0E0);
41
41
  }
42
42
  :host([variant="filled"][readonly]) .container,
43
43
  :host([variant="filled"][disabled]) .container {
44
- background-color: var(--u-bg-color-disabled);
45
- border-bottom-color: var(--u-border-color-weak);
44
+ background-color: var(--u-bg-color-disabled, #FAFAFA);
45
+ border-bottom-color: var(--u-border-color-weak, #EEEEEE);
46
46
  }
47
47
  :host([variant="filled"]:not([readonly]):not([disabled])) .container:hover {
48
48
  box-shadow: none;
49
- background-color: var(--u-neutral-300);
50
- border-bottom-color: var(--u-input-border-color-hover);
49
+ background-color: var(--u-neutral-300, #E0E0E0);
50
+ border-bottom-color: var(--u-input-border-color-hover, #BDBDBD);
51
51
  }
52
52
  :host([variant="filled"]:not([readonly]):not([disabled])) .container:focus-within {
53
53
  box-shadow: none;
54
- border-bottom-color: var(--u-input-border-color-focus);
54
+ border-bottom-color: var(--u-input-border-color-focus, #1E88E5);
55
55
  }
56
56
  :host([variant="filled"][invalid]:not([readonly]):not([disabled])) .container {
57
57
  box-shadow: none;
58
- border-bottom-color: var(--u-input-border-color-invalid);
58
+ border-bottom-color: var(--u-input-border-color-invalid, #E53935);
59
59
  }
60
60
 
61
61
  /* ===== Variant: underlined ===== */
62
62
  :host([variant="underlined"]) .container {
63
63
  border: none;
64
- border-radius: var(--u-radius-none);
64
+ border-radius: var(--u-radius-none, 0);
65
65
  background-color: transparent;
66
66
  padding-left: 0;
67
67
  padding-right: 0;
68
- border-bottom: 1px solid var(--u-input-border-color);
68
+ border-bottom: 1px solid var(--u-input-border-color, #E0E0E0);
69
69
  }
70
70
  :host([variant="underlined"][readonly]) .container,
71
71
  :host([variant="underlined"][disabled]) .container {
72
72
  background-color: transparent;
73
- border-bottom-color: var(--u-border-color-weak);
73
+ border-bottom-color: var(--u-border-color-weak, #EEEEEE);
74
74
  }
75
75
  :host([variant="underlined"]:not([readonly]):not([disabled])) .container:hover {
76
76
  box-shadow: none;
77
- border-bottom-color: var(--u-input-border-color-hover);
77
+ border-bottom-color: var(--u-input-border-color-hover, #BDBDBD);
78
78
  }
79
79
  :host([variant="underlined"]:not([readonly]):not([disabled])) .container:focus-within {
80
80
  box-shadow: none;
81
- border-bottom-color: var(--u-input-border-color-focus);
81
+ border-bottom-color: var(--u-input-border-color-focus, #1E88E5);
82
82
  border-bottom-width: 2px;
83
83
  }
84
84
  :host([variant="underlined"][invalid]:not([readonly]):not([disabled])) .container {
85
85
  box-shadow: none;
86
- border-bottom-color: var(--u-input-border-color-invalid);
86
+ border-bottom-color: var(--u-input-border-color-invalid, #E53935);
87
87
  }
88
88
 
89
89
  /* ===== Variant: borderless ===== */
90
90
  :host([variant="borderless"]) .container {
91
91
  border: none;
92
- border-radius: var(--u-radius-none);
92
+ border-radius: var(--u-radius-none, 0);
93
93
  background-color: transparent;
94
94
  padding: 0;
95
95
  box-shadow: none;
@@ -117,7 +117,7 @@ var styles = css`
117
117
  word-wrap: break-word;
118
118
  }
119
119
  textarea::placeholder {
120
- color: var(--u-txt-color-weak);
120
+ color: var(--u-txt-color-weak, #9E9E9E);
121
121
  }
122
122
  textarea:disabled {
123
123
  cursor: not-allowed;
@@ -155,7 +155,7 @@ var styles = css`
155
155
  .counter {
156
156
  margin-top: 0.25em;
157
157
  text-align: right;
158
- color: var(--u-txt-color-weak);
158
+ color: var(--u-txt-color-weak, #9E9E9E);
159
159
  font-size: 0.75em;
160
160
  line-height: 1.2;
161
161
  }
@@ -6,12 +6,12 @@ var styles = css`
6
6
  }
7
7
 
8
8
  :host {
9
- color: var(--u-tooltip-txt-color);
9
+ color: var(--u-tooltip-txt-color, #FFFFFF);
10
10
  font-family: var(--u-font-display, inherit);
11
11
  font-size: 12px;
12
12
  line-height: 1.25;
13
- border-radius: var(--u-radius-md);
14
- background-color: var(--u-tooltip-bg-color);
13
+ border-radius: var(--u-radius-md, 4px);
14
+ background-color: var(--u-tooltip-bg-color, rgba(0, 0, 0, 0.75));
15
15
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.2);
16
16
  transform: scale(0.9);
17
17
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0s 0.2s;
@@ -10,7 +10,7 @@ import { UTreeItem, TreeItemTrigger } from '../tree-item/UTreeItem.js';
10
10
  * @cssprop tree-indent-guide-offset - 들여쓰기 가이드 선의 좌측 간격 (기본값: 8px)
11
11
  * @cssprop tree-indent-guide-width - 들여쓰기 가이드 선의 두께 (기본값: 1px)
12
12
  * @cssprop tree-indent-guide-style - 들여쓰기 가이드 선의 스타일 (기본값: solid)
13
- * @cssprop tree-indent-guide-color - 들여쓰기 가이드 선의 색상 (기본값: var(--u-border-color-weak))
13
+ * @cssprop tree-indent-guide-color - 들여쓰기 가이드 선의 색상 (기본값: var(--u-border-color-weak, #EEEEEE))
14
14
  *
15
15
  * @event change - 선택된 아이템이 변경될 때 발생
16
16
  *
@@ -6,13 +6,16 @@ var styles = css`
6
6
  --tree-indent-guide-offset: 8px;
7
7
  --tree-indent-guide-width: 1px;
8
8
  --tree-indent-guide-style: solid;
9
- --tree-indent-guide-color: var(--u-border-color-weak);
9
+ --tree-indent-guide-color: var(--u-border-color-weak, #EEEEEE);
10
10
  }
11
11
 
12
12
  :host {
13
13
  display: block;
14
- font-size: 0.875rem;
15
- color: var(--u-txt-color);
14
+ /* rem 이 아니라 em 이다 — 루트 기준이면 소비자가 컨테이너 타이포를 키워도
15
+ 트리만 따라오지 않는다. 기본 상황(루트 16px)에서는 두 단위가 같은 14px 이므로
16
+ 시각은 바뀌지 않고, 상속 컨텍스트에서만 동작이 달라진다. */
17
+ font-size: 0.875em;
18
+ color: var(--u-txt-color, #212121);
16
19
  }
17
20
  `;
18
21
  //#endregion
@@ -3,7 +3,7 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  --tree-item-depth: 0;
6
- --tree-item-color: var(--u-primary-color);
6
+ --tree-item-color: var(--u-primary-color, #1E88E5);
7
7
  }
8
8
 
9
9
  :host {
@@ -33,12 +33,12 @@ var styles = css`
33
33
  }
34
34
  :host(:not([disabled])[trigger="item"]) .header:hover,
35
35
  :host(:not([disabled])[trigger="item"]:focus-visible) .header {
36
- background-color: var(--u-bg-color-hover);
36
+ background-color: var(--u-bg-color-hover, #F5F5F5);
37
37
  }
38
38
  .header[selected] {
39
39
  color: color-mix(in srgb, var(--tree-item-color) 85%, black);
40
40
  font-weight: 600;
41
- background-color: color-mix(in srgb, var(--tree-item-color) 15%, var(--u-bg-color));
41
+ background-color: color-mix(in srgb, var(--tree-item-color) 15%, var(--u-bg-color, #FFFFFF));
42
42
  }
43
43
 
44
44
  ::slotted([slot="prefix"]) {
@@ -67,14 +67,14 @@ var styles = css`
67
67
  justify-content: center;
68
68
  width: 18px;
69
69
  height: 18px;
70
- border-radius: var(--u-radius-sm);
70
+ border-radius: var(--u-radius-sm, 3px);
71
71
  }
72
72
  .prefix-toggler u-icon {
73
73
  font-size: 12px;
74
74
  }
75
75
  :host(:not([disabled])[trigger="icon"]) .prefix-toggler:hover,
76
76
  :host(:not([disabled])[trigger="icon"]:focus-visible) .prefix-toggler {
77
- background-color: var(--u-bg-color-hover);
77
+ background-color: var(--u-bg-color-hover, #F5F5F5);
78
78
  }
79
79
 
80
80
  /* ── checkbox ── */
@@ -86,8 +86,8 @@ var styles = css`
86
86
  justify-content: center;
87
87
  width: 16px;
88
88
  height: 16px;
89
- border-radius: var(--u-radius-sm);
90
- border: 1.5px solid var(--u-input-border-color);
89
+ border-radius: var(--u-radius-sm, 3px);
90
+ border: 1.5px solid var(--u-input-border-color, #E0E0E0);
91
91
  background-color: transparent;
92
92
  transition: background-color 0.15s ease, border-color 0.15s ease;
93
93
  cursor: pointer;
@@ -0,0 +1,12 @@
1
+ import type { Plugin } from 'vite';
2
+ /**
3
+ * Rolldown의 preserveModules 모드에서 import.meta.glob의 query 옵션 사용 시
4
+ * 빈 export가 생성되는 문제를 해결하는 플러그인.
5
+ *
6
+ * - `?raw`: 파일 내용을 문자열로 반환
7
+ * - `?inline`: 파일 내용을 문자열로 반환
8
+ * - `?url`: 파일을 asset으로 emit하고 URL을 반환
9
+ *
10
+ * 가상 모듈(\0 prefix)로 변환하여 파일명에 `?`가 포함되는 것을 방지합니다.
11
+ */
12
+ export default function globResolve(): Plugin;
@@ -0,0 +1,66 @@
1
+ import { readFileSync } from 'fs';
2
+ import { resolve, dirname, basename } from 'path';
3
+ import { createHash } from 'crypto';
4
+ const VIRTUAL_PREFIX = '\0glob-assets';
5
+ const SUPPORTED_QUERIES = ['?raw', '?inline', '?url'];
6
+ function shortHash(input) {
7
+ return createHash('md5').update(input).digest('hex').slice(0, 8);
8
+ }
9
+ /**
10
+ * Rolldown의 preserveModules 모드에서 import.meta.glob의 query 옵션 사용 시
11
+ * 빈 export가 생성되는 문제를 해결하는 플러그인.
12
+ *
13
+ * - `?raw`: 파일 내용을 문자열로 반환
14
+ * - `?inline`: 파일 내용을 문자열로 반환
15
+ * - `?url`: 파일을 asset으로 emit하고 URL을 반환
16
+ *
17
+ * 가상 모듈(\0 prefix)로 변환하여 파일명에 `?`가 포함되는 것을 방지합니다.
18
+ */
19
+ export default function globResolve() {
20
+ const idToAbsPath = new Map();
21
+ return {
22
+ name: 'vite:glob-resolve',
23
+ enforce: 'pre',
24
+ resolveId(source, importer) {
25
+ for (const query of SUPPORTED_QUERIES) {
26
+ if (source.endsWith(query)) {
27
+ const rawPath = source.slice(0, -query.length);
28
+ const absPath = importer
29
+ ? resolve(dirname(importer), rawPath)
30
+ : rawPath;
31
+ const name = basename(absPath);
32
+ const hash = shortHash(absPath);
33
+ const queryName = query.slice(1);
34
+ const virtualId = `${VIRTUAL_PREFIX}_${queryName}/${name}.${hash}`;
35
+ idToAbsPath.set(virtualId, absPath);
36
+ return virtualId;
37
+ }
38
+ }
39
+ return null;
40
+ },
41
+ load(id) {
42
+ if (!id.startsWith(VIRTUAL_PREFIX))
43
+ return null;
44
+ const absPath = idToAbsPath.get(id);
45
+ if (!absPath)
46
+ return null;
47
+ // virtualId에서 queryName 추출: "\0glob-assets_{queryName}/..."
48
+ const queryName = id.slice(VIRTUAL_PREFIX.length + 1).split('/')[0];
49
+ if (queryName === 'raw' || queryName === 'inline') {
50
+ const content = readFileSync(absPath, 'utf-8');
51
+ return `export default ${JSON.stringify(content)};`;
52
+ }
53
+ if (queryName === 'url') {
54
+ const source = readFileSync(absPath);
55
+ const fileName = basename(absPath);
56
+ const ref = this.emitFile({
57
+ type: 'asset',
58
+ name: fileName,
59
+ source,
60
+ });
61
+ return `export default import.meta.ROLLUP_FILE_URL_${ref};`;
62
+ }
63
+ return null;
64
+ }
65
+ };
66
+ }
@@ -0,0 +1,54 @@
1
+ import type { Plugin } from 'vite';
2
+ interface ComponentEvent {
3
+ name: string;
4
+ reactName: string;
5
+ detailType: string;
6
+ /**
7
+ * detail 타입 모듈의 **절대 소스 경로** (없으면 '').
8
+ *
9
+ * 상대 경로가 아니라 절대 경로인 이유: 이벤트는 상속 체인의 어느 파일에서든 선언될 수
10
+ * 있고, 그 파일의 import 경로는 **선언한 파일 기준**이다. 예를 들어
11
+ * `src/components/UOverlayElement.ts` 는 `../events/ShowEvent.js`(= `src/events/`)를
12
+ * 가리키는데, 이것을 상속받는 `src/components/dialog/UDialog.ts` 기준으로 풀면
13
+ * `src/components/events/`(존재하지 않음)가 된다. 수집 시점에 선언 파일 기준으로
14
+ * 절대화해 이 어긋남을 원천 차단한다.
15
+ */
16
+ detailSource: string;
17
+ }
18
+ interface PluginOptions {
19
+ /** 컴포넌트 소스 디렉토리 경로 (기본값: 'src/components') */
20
+ input?: string;
21
+ /** React 래퍼 출력 폴더 - 빌드 outDir 기준 상대 경로 (기본값: 'react') */
22
+ output?: string;
23
+ /** 래퍼 생성에서 제외할 glob 패턴 목록 (cwd: 프로젝트 루트) */
24
+ exclude?: string[];
25
+ }
26
+ /**
27
+ * Lit Element 컴포넌트를 React 래퍼로 자동 생성하는 Vite 플러그인
28
+ */
29
+ export default function reactWrapperPlugin(options: PluginOptions): Plugin;
30
+ /**
31
+ * 이벤트가 **정적으로 수집되지 않는 형태**로 발화되는지 검사한다. 반환값이 비어 있지 않으면
32
+ * 빌드를 실패시킨다 — 누락된 이벤트는 React 소비자 쪽에서 에러도 경고도 없이 죽으므로
33
+ * 경고로 두면 아무도 알아채지 못한다.
34
+ *
35
+ * `content` 는 **leaf 파일 본문만**이다 — 베이스까지 훑으면 `UElement` 의 `fire`/`relay`
36
+ * 구현 자체가 걸려 전 컴포넌트가 위반이 된다. 베이스에서 발화하는 이벤트는 상속 수집
37
+ * ({@link collectComponentEvents})이 이미 채우므로 여기서 볼 필요가 없다.
38
+ */
39
+ export declare function findEventDeclarationViolations(content: string, className: string, tagName: string, eventCount: number): string[];
40
+ /**
41
+ * 컴포넌트가 노출하는 이벤트를 **상속 체인 전체**에서 수집한다.
42
+ *
43
+ * leaf 파일만 읽으면 베이스 클래스가 발화하는 이벤트를 놓친다 — 예를 들어 `UDialog`·
44
+ * `UDrawer` 는 `show`/`hide` 를 **`UOverlayElement` 가** 발화하므로, leaf 만 보면
45
+ * `events: {}` 가 생성되고 React 소비자는 그 이벤트를 **구독할 방법이 없다**(에러도 경고도
46
+ * 없이 조용히 실패한다).
47
+ *
48
+ * 수집 순서는 **베이스 → leaf**다. `@event` 는 이름만 주고(detail=unknown) 기존 항목을
49
+ * 덮지 않는 반면 `this.fire<T>('name')` 은 타입까지 주며 덮으므로, 이 순서에서
50
+ * ⑴베이스의 타입 정보가 leaf 의 `@event` 재선언에 지워지지 않고
51
+ * ⑵leaf 가 같은 이벤트를 더 구체적 타입으로 발화하면 그것이 이긴다.
52
+ */
53
+ export declare function collectComponentEvents(filePath: string): ComponentEvent[];
54
+ export {};