@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,73 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.14.1] - 2026-08-01
4
+
5
+ ### Fixed
6
+
7
+ - ★**Vite 플러그인 진입점이 게시본에 실려 있지 않던 문제 수정** —
8
+ `@iyulab/components/plugins/vite-plugin-react-wrapper.js` 를 임포트하는 소비 패키지의
9
+ **빌드가 실패**했다(`ERR_MODULE_NOT_FOUND`).
10
+
11
+ 플러그인을 타입 검사 전용(`noEmit`)으로 바꾸면서 `.js` 산출물이 사라졌는데
12
+ `exports`·`files` 선언은 그대로 남아 있었다. **이 패키지 안에서는 아무 증상이 없다** —
13
+ 로컬 빌드는 상대 경로로 `.ts` 소스를 직접 읽기 때문이다. 깨지는 곳은 게시본을 설치한
14
+ 다른 패키지이고, 그것도 버전 범위가 새 버전을 잡을 때까지 잠복한다.
15
+
16
+ 산출물을 **`dist/plugins/`** 로 내보내고 `exports` 가 그곳을 가리키게 했다.
17
+ **임포트 경로는 종전과 같다** — 소비 패키지는 변경할 것이 없다.
18
+ (산출물을 소스 옆이 아니라 `dist/` 밑에 두는 것은 의도적이다. 옆에 두면 확장자 없는
19
+ 임포트가 컴파일본을 소스보다 먼저 잡아 로컬만 낡은 산출물을 쓰게 된다.)
20
+
21
+ `exports` 대상이 실재하는지 검사하는 테스트를 추가했다 — 게시 계약은 게시하는 쪽에서
22
+ 확인해야 한다. 소비하는 쪽은 너무 늦게 안다.
23
+
24
+ ## [1.14.0] - 2026-08-01
25
+
26
+ ### Added
27
+
28
+ - **토큰 시트 없이도 렌더된다** — 시트 토큰 참조 **411곳**에 use-site 리터럴 폴백을
29
+ 배선했다(`var(--u-txt-color)` → `var(--u-txt-color, #212121)`).
30
+
31
+ 토큰 시트(`styles/tokens.css`)를 로드하지 않으면 `var(--u-*)` 는 무효가 되고 **그 선언이
32
+ 통째로 버려진다** — 색이 빠지는 게 아니라 규칙이 사라지는 것이라, 텍스트가 안 보이거나
33
+ 패널이 완전히 투명해진다. 이제 시트가 없어도 기본 테마 값으로 렌더된다.
34
+
35
+ **시트를 쓰는 경우 시각 변화는 없다** — 폴백은 시트가 없을 때만 평가된다. 리터럴이
36
+ 시트 값과 어긋나지 않도록 대조 테스트가 강제하며, 폴백은 손으로 쓰지 않고 생성한다.
37
+
38
+ - **`Theme.resolved()`** — 문서에 **실제로 적용된** 테마(`'light' | 'dark'`)를 돌려준다.
39
+
40
+ `Theme.get()` 은 사용자의 **선호**를 돌려주며 거기에는 `'system'` 이 있고, 그것이
41
+ 기본값이다. 그래서 `get() === 'dark'` 로 분기하는 소비자는 **system + OS 다크에서
42
+ 밝은 화면을 그리게 된다** — 가장 흔한 경로에서 틀린다. 실효 테마를 알 방법이 없어
43
+ 소비자마다 다르게 추측하고 있었다.
44
+
45
+ ⚠**폰트 계열(`--u-font-*`)은 예외**다 — 폴백을 배선하지 않았다. 폰트 스택은 리터럴이
46
+ 100자를 넘어 모든 사용처에 굽으면 얻는 것보다 잃는 것이 크고, 시트가 없으면 UA 기본
47
+ 폰트로 대체되어 **화면이 깨지지 않는다**(색·테두리는 깨진다).
48
+
49
+ ### Fixed
50
+
51
+ - ★**토큰 시트를 쓰지 않을 때 버튼만 다른 브랜드 색으로 렌더되던 문제 수정** —
52
+ `u-button` 의 폴백 3곳(`#3b82f6`·`#2563eb`·`#1d4ed8`)이 디자인 시트의 파랑
53
+ (`#2196F3`·`#1E88E5`·`#1976D2`)과 다른 계열이었다. 시트를 로드한 환경에서는 폴백이
54
+ 평가되지 않아 드러나지 않았고, **시트 없이 쓰는 소비자에게만** 버튼이 다른 파랑으로
55
+ 보였다. 시트 값으로 맞췄다.
56
+ - **오버레이 배경 불투명도 불일치 수정** — 폴백이 `rgba(0,0,0,0.4)`, 시트가 `0.5` 였다.
57
+ - **`u-badge` 의 폴백이 다른 명도 단을 가리키던 문제 수정** —
58
+ `var(--u-primary-color, var(--u-blue-500))` 이 시트 정의(`--u-blue-600`)와 어긋나 있었다.
59
+
60
+ ### Changed
61
+
62
+ - **토큰 시트 부재 경고 문구를 실제 거동에 맞췄다.** 종전에는 *"테두리·배경·색이 무효가
63
+ 됩니다"* 였으나 폴백 배선으로 더는 무효가 되지 않는다. 이제 남는 손실을 정확히 말한다 —
64
+ **다크 테마와 테마 변수 오버라이드가 적용되지 않는다.** 경고 자체는 유지한다: 폴백은
65
+ *"조용히 사라지지 않게"* 하는 안전망이지 *"시트 없이 써도 된다"* 가 아니다.
66
+ - **`u-tree` 의 기본 글자 크기가 `rem` 에서 `em` 으로 바뀌었다.** 루트 기준이라 소비자가
67
+ 컨테이너 타이포를 키워도 트리만 따라오지 않았다. **기본 상황에서는 두 단위가 같은 값
68
+ (14px)이므로 시각 변화가 없고**, 상속 컨텍스트에서만 동작이 달라진다 —
69
+ `<div style="font-size:24px"><u-tree>` 안에서 트리가 21px 로 함께 커진다.
70
+
3
71
  ## [1.13.0] - 2026-08-01
4
72
 
5
73
  ### Added
@@ -17,11 +17,11 @@ var styles = css`
17
17
 
18
18
  /* Focus Styles */
19
19
  :host(:focus-visible) {
20
- outline: 2px solid var(--u-primary-color-weak);
20
+ outline: 2px solid var(--u-primary-color-weak, #2196F3);
21
21
  outline-offset: 2px;
22
22
  }
23
23
  :focus-visible {
24
- outline: 2px solid var(--u-primary-color-weak);
24
+ outline: 2px solid var(--u-primary-color-weak, #2196F3);
25
25
  outline-offset: 2px;
26
26
  }
27
27
 
@@ -36,31 +36,31 @@ var styles = css`
36
36
  /* Scrollbar Styles */
37
37
  :host([scrollable]) {
38
38
  scrollbar-width: thin;
39
- scrollbar-color: var(--u-scrollbar-color) var(--u-scrollbar-track-color);
39
+ scrollbar-color: var(--u-scrollbar-color, #BDBDBD) var(--u-scrollbar-track-color, transparent);
40
40
  }
41
41
  :host([scrollable])::-webkit-scrollbar {
42
42
  width: 8px;
43
43
  height: 8px;
44
44
  }
45
45
  :host([scrollable])::-webkit-scrollbar-thumb {
46
- background: var(--u-scrollbar-color);
46
+ background: var(--u-scrollbar-color, #BDBDBD);
47
47
  }
48
48
  :host([scrollable])::-webkit-scrollbar-track {
49
- background: var(--u-scrollbar-track-color);
49
+ background: var(--u-scrollbar-track-color, transparent);
50
50
  }
51
51
  [scrollable] {
52
52
  scrollbar-width: thin;
53
- scrollbar-color: var(--u-scrollbar-color) var(--u-scrollbar-track-color);
53
+ scrollbar-color: var(--u-scrollbar-color, #BDBDBD) var(--u-scrollbar-track-color, transparent);
54
54
  }
55
55
  [scrollable]::-webkit-scrollbar {
56
56
  width: 8px;
57
57
  height: 8px;
58
58
  }
59
59
  [scrollable]::-webkit-scrollbar-thumb {
60
- background: var(--u-scrollbar-color);
60
+ background: var(--u-scrollbar-color, #BDBDBD);
61
61
  }
62
62
  [scrollable]::-webkit-scrollbar-track {
63
- background: var(--u-scrollbar-track-color);
63
+ background: var(--u-scrollbar-track-color, transparent);
64
64
  }
65
65
  `;
66
66
  //#endregion
@@ -6,7 +6,7 @@ var styles = css`
6
6
  z-index: 9999;
7
7
  inset: 0;
8
8
  display: flex;
9
- background: var(--u-overlay-bg-color, rgba(0, 0, 0, 0.4));
9
+ background: var(--u-overlay-bg-color, rgba(0, 0, 0, 0.5));
10
10
 
11
11
  opacity: 0;
12
12
  visibility: hidden;
@@ -3,34 +3,34 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  /* === Status Colors === */
5
5
  :host {
6
- --alert-icon-color: var(--u-neutral-700);
7
- --alert-border-color: var(--u-neutral-300);
8
- --alert-background-color: var(--u-neutral-200);
6
+ --alert-icon-color: var(--u-neutral-700, #616161);
7
+ --alert-border-color: var(--u-neutral-300, #E0E0E0);
8
+ --alert-background-color: var(--u-neutral-200, #EEEEEE);
9
9
  }
10
10
  :host([status="error"]) {
11
- --alert-icon-color: var(--u-danger-color-strong);
12
- --alert-border-color: var(--u-danger-color-weaker);
13
- --alert-background-color: var(--u-danger-color-weakest);
11
+ --alert-icon-color: var(--u-danger-color-strong, #D32F2F);
12
+ --alert-border-color: var(--u-danger-color-weaker, #E57373);
13
+ --alert-background-color: var(--u-danger-color-weakest, #EF9A9A);
14
14
  }
15
15
  :host([status="warning"]) {
16
- --alert-icon-color: var(--u-warning-color-strong);
17
- --alert-border-color: var(--u-warning-color-weaker);
18
- --alert-background-color: var(--u-warning-color-weakest);
16
+ --alert-icon-color: var(--u-warning-color-strong, #FBC02D);
17
+ --alert-border-color: var(--u-warning-color-weaker, #FFF176);
18
+ --alert-background-color: var(--u-warning-color-weakest, #FFF59D);
19
19
  }
20
20
  :host([status="info"]) {
21
- --alert-icon-color: var(--u-info-color-strong);
22
- --alert-border-color: var(--u-info-color-weaker);
23
- --alert-background-color: var(--u-info-color-weakest);
21
+ --alert-icon-color: var(--u-info-color-strong, #1976D2);
22
+ --alert-border-color: var(--u-info-color-weaker, #64B5F6);
23
+ --alert-background-color: var(--u-info-color-weakest, #90CAF9);
24
24
  }
25
25
  :host([status="success"]) {
26
- --alert-icon-color: var(--u-success-color-strong);
27
- --alert-border-color: var(--u-success-color-weaker);
28
- --alert-background-color: var(--u-success-color-weakest);
26
+ --alert-icon-color: var(--u-success-color-strong, #388E3C);
27
+ --alert-border-color: var(--u-success-color-weaker, #81C784);
28
+ --alert-background-color: var(--u-success-color-weakest, #A5D6A7);
29
29
  }
30
30
  :host([status="notice"]) {
31
- --alert-icon-color: var(--u-neutral-700);
32
- --alert-border-color: var(--u-neutral-300);
33
- --alert-background-color: var(--u-neutral-200);
31
+ --alert-icon-color: var(--u-neutral-700, #616161);
32
+ --alert-border-color: var(--u-neutral-300, #E0E0E0);
33
+ --alert-background-color: var(--u-neutral-200, #EEEEEE);
34
34
  }
35
35
 
36
36
  :host {
@@ -39,8 +39,8 @@ var styles = css`
39
39
  min-width: 200px;
40
40
  max-width: 100%;
41
41
  max-height: 50vh;
42
- border-radius: var(--u-radius-xl);
43
- box-shadow: 0 4px 12px var(--u-shadow-color-normal);
42
+ border-radius: var(--u-radius-xl, 8px);
43
+ box-shadow: 0 4px 12px var(--u-shadow-color-normal, rgba(0, 0, 0, 0.12));
44
44
 
45
45
  opacity: 0;
46
46
  transform: scale(0.8);
@@ -122,7 +122,7 @@ var styles = css`
122
122
  flex-shrink: 0;
123
123
  padding: var(--u-space-2xs, 4px);
124
124
  font-size: inherit;
125
- border-radius: var(--u-radius-md);
125
+ border-radius: var(--u-radius-md, 4px);
126
126
  }
127
127
 
128
128
  .content {
@@ -9,24 +9,24 @@ var styles = css`
9
9
  height: 2.5em;
10
10
  font-family: var(--u-font-base);
11
11
  font-weight: 600;
12
- color: var(--u-neutral-0);
13
- background-color: var(--u-neutral-500);
12
+ color: var(--u-neutral-0, #FFFFFF);
13
+ background-color: var(--u-neutral-500, #9E9E9E);
14
14
  vertical-align: middle;
15
15
  overflow: hidden;
16
16
  user-select: none;
17
17
  }
18
18
 
19
19
  :host([shape="circle"]) {
20
- border-radius: var(--u-radius-circle);
20
+ border-radius: var(--u-radius-circle, 50%);
21
21
  }
22
22
  :host([shape="square"]) {
23
- border-radius: var(--u-radius-none);
23
+ border-radius: var(--u-radius-none, 0);
24
24
  }
25
25
  :host([shape="rounded"]) {
26
26
  border-radius: 0.375em;
27
27
  }
28
28
  :host([outline]) {
29
- box-shadow: 0 0 0 0.125em var(--u-border-color);
29
+ box-shadow: 0 0 0 0.125em var(--u-border-color, #E0E0E0);
30
30
  }
31
31
 
32
32
  img {
@@ -34,56 +34,56 @@ var styles = css`
34
34
  border-radius: 0.2em;
35
35
  }
36
36
  :host([variant="pill"]) {
37
- border-radius: var(--u-radius-pill);
37
+ border-radius: var(--u-radius-pill, 9999px);
38
38
  }
39
39
  :host([variant="dot"]) {
40
40
  width: 0.6em;
41
41
  height: 0.6em;
42
42
  min-width: 0.6em;
43
43
  min-height: 0.6em;
44
- border-radius: var(--u-radius-circle);
44
+ border-radius: var(--u-radius-circle, 50%);
45
45
  }
46
46
 
47
47
  /* === Color (색상) === */
48
48
  :host([color="neutral"]) {
49
- color: var(--u-neutral-800);
50
- background-color: var(--u-neutral-200);
49
+ color: var(--u-neutral-800, #424242);
50
+ background-color: var(--u-neutral-200, #EEEEEE);
51
51
  }
52
52
  :host([color="blue"]) {
53
- color: var(--u-neutral-0);
54
- background-color: var(--u-primary-color, var(--u-blue-500));
53
+ color: var(--u-neutral-0, #FFFFFF);
54
+ background-color: var(--u-primary-color, #1E88E5);
55
55
  }
56
56
  :host([color="green"]) {
57
- color: var(--u-neutral-0);
58
- background-color: var(--u-green-500);
57
+ color: var(--u-neutral-0, #FFFFFF);
58
+ background-color: var(--u-green-500, #4CAF50);
59
59
  }
60
60
  :host([color="yellow"]) {
61
- color: var(--u-neutral-0);
62
- background-color: var(--u-yellow-600);
61
+ color: var(--u-neutral-0, #FFFFFF);
62
+ background-color: var(--u-yellow-600, #FDD835);
63
63
  }
64
64
  :host([color="red"]) {
65
- color: var(--u-neutral-0);
66
- background-color: var(--u-red-500);
65
+ color: var(--u-neutral-0, #FFFFFF);
66
+ background-color: var(--u-red-500, #F44336);
67
67
  }
68
68
  :host([color="orange"]) {
69
- color: var(--u-neutral-0);
70
- background-color: var(--u-orange-500);
69
+ color: var(--u-neutral-0, #FFFFFF);
70
+ background-color: var(--u-orange-500, #FF9800);
71
71
  }
72
72
  :host([color="teal"]) {
73
- color: var(--u-neutral-0);
74
- background-color: var(--u-teal-500);
73
+ color: var(--u-neutral-0, #FFFFFF);
74
+ background-color: var(--u-teal-500, #009688);
75
75
  }
76
76
  :host([color="cyan"]) {
77
- color: var(--u-neutral-0);
78
- background-color: var(--u-cyan-500);
77
+ color: var(--u-neutral-0, #FFFFFF);
78
+ background-color: var(--u-cyan-500, #00BCD4);
79
79
  }
80
80
  :host([color="purple"]) {
81
- color: var(--u-neutral-0);
82
- background-color: var(--u-purple-500);
81
+ color: var(--u-neutral-0, #FFFFFF);
82
+ background-color: var(--u-purple-500, #9C27B0);
83
83
  }
84
84
  :host([color="pink"]) {
85
- color: var(--u-neutral-0);
86
- background-color: var(--u-pink-500);
85
+ color: var(--u-neutral-0, #FFFFFF);
86
+ background-color: var(--u-pink-500, #E91E63);
87
87
  }
88
88
 
89
89
  /* === Anchor (위치 고정) === */
@@ -5,7 +5,7 @@ var styles = css`
5
5
  display: block;
6
6
  font-size: inherit;
7
7
  font-family: var(--u-font-base);
8
- color: var(--u-txt-color);
8
+ color: var(--u-txt-color, #212121);
9
9
  user-select: none;
10
10
  }
11
11
 
@@ -28,7 +28,7 @@ var styles = css`
28
28
  flex-shrink: 0;
29
29
  display: inline-flex;
30
30
  align-items: center;
31
- color: var(--u-txt-color-weak);
31
+ color: var(--u-txt-color-weak, #9E9E9E);
32
32
  font-size: 0.75em;
33
33
  user-select: none;
34
34
  }
@@ -6,13 +6,13 @@ var styles = css`
6
6
  align-items: center;
7
7
  gap: 0.2em;
8
8
  flex-shrink: 0;
9
- color: var(--u-txt-color-weak);
9
+ color: var(--u-txt-color-weak, #9E9E9E);
10
10
  font-size: inherit;
11
11
  line-height: 1.5em;
12
12
  cursor: pointer;
13
13
  }
14
14
  :host:hover {
15
- color: var(--u-primary-color-strong);
15
+ color: var(--u-primary-color-strong, #1976D2);
16
16
  }
17
17
  :host([disabled]) {
18
18
  opacity: 0.5;
@@ -3,17 +3,17 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  /* --btn-color 하나만 정해지면 hover/active/surface/outline 톤이 전부 자동 파생 */
6
- --btn-color: var(--u-primary-color);
6
+ --btn-color: var(--u-primary-color, #1E88E5);
7
7
  --btn-color-hover: color-mix(in srgb, var(--btn-color) 85%, black);
8
8
  --btn-color-active: color-mix(in srgb, var(--btn-color) 70%, black);
9
- --btn-color-surface: color-mix(in srgb, var(--btn-color) 12%, var(--u-bg-color));
10
- --btn-color-surface-hover: color-mix(in srgb, var(--btn-color) 22%, var(--u-bg-color));
11
- --btn-color-surface-active: color-mix(in srgb, var(--btn-color) 32%, var(--u-bg-color));
12
- --btn-color-border: color-mix(in srgb, var(--btn-color) 45%, var(--u-bg-color));
13
- --btn-color-border-hover: color-mix(in srgb, var(--btn-color) 60%, var(--u-bg-color));
14
- --btn-color-border-active: color-mix(in srgb, var(--btn-color) 75%, var(--u-bg-color));
15
- --btn-color-outline-hover: color-mix(in srgb, var(--btn-color) 6%, var(--u-bg-color));
16
- --btn-color-outline-active: color-mix(in srgb, var(--btn-color) 12%, var(--u-bg-color));
9
+ --btn-color-surface: color-mix(in srgb, var(--btn-color) 12%, var(--u-bg-color, #FFFFFF));
10
+ --btn-color-surface-hover: color-mix(in srgb, var(--btn-color) 22%, var(--u-bg-color, #FFFFFF));
11
+ --btn-color-surface-active: color-mix(in srgb, var(--btn-color) 32%, var(--u-bg-color, #FFFFFF));
12
+ --btn-color-border: color-mix(in srgb, var(--btn-color) 45%, var(--u-bg-color, #FFFFFF));
13
+ --btn-color-border-hover: color-mix(in srgb, var(--btn-color) 60%, var(--u-bg-color, #FFFFFF));
14
+ --btn-color-border-active: color-mix(in srgb, var(--btn-color) 75%, var(--u-bg-color, #FFFFFF));
15
+ --btn-color-outline-hover: color-mix(in srgb, var(--btn-color) 6%, var(--u-bg-color, #FFFFFF));
16
+ --btn-color-outline-active: color-mix(in srgb, var(--btn-color) 12%, var(--u-bg-color, #FFFFFF));
17
17
  }
18
18
 
19
19
  :host {
@@ -23,7 +23,7 @@ var styles = css`
23
23
  font-size: 14px;
24
24
  font-weight: 500;
25
25
  line-height: 1.5;
26
- border-radius: var(--u-radius-lg);
26
+ border-radius: var(--u-radius-lg, 6px);
27
27
  background-color: transparent;
28
28
 
29
29
  transition: all 0.2s ease;
@@ -33,14 +33,14 @@ var styles = css`
33
33
  }
34
34
 
35
35
  /* === Color tokens === */
36
- :host([color="blue"]) { --btn-color: var(--u-blue-600); }
37
- :host([color="green"]) { --btn-color: var(--u-green-600); }
38
- :host([color="red"]) { --btn-color: var(--u-red-600); }
39
- :host([color="orange"]) { --btn-color: var(--u-orange-600); }
40
- :host([color="teal"]) { --btn-color: var(--u-teal-600); }
41
- :host([color="cyan"]) { --btn-color: var(--u-cyan-600); }
42
- :host([color="purple"]) { --btn-color: var(--u-purple-600); }
43
- :host([color="pink"]) { --btn-color: var(--u-pink-600); }
36
+ :host([color="blue"]) { --btn-color: var(--u-blue-600, #1E88E5); }
37
+ :host([color="green"]) { --btn-color: var(--u-green-600, #43A047); }
38
+ :host([color="red"]) { --btn-color: var(--u-red-600, #E53935); }
39
+ :host([color="orange"]) { --btn-color: var(--u-orange-600, #FB8C00); }
40
+ :host([color="teal"]) { --btn-color: var(--u-teal-600, #00897B); }
41
+ :host([color="cyan"]) { --btn-color: var(--u-cyan-600, #00ACC1); }
42
+ :host([color="purple"]) { --btn-color: var(--u-purple-600, #8E24AA); }
43
+ :host([color="pink"]) { --btn-color: var(--u-pink-600, #D81B60); }
44
44
 
45
45
  /* === Size === */
46
46
  :host([size="sm"]) {
@@ -69,7 +69,7 @@ var styles = css`
69
69
  visibility: hidden;
70
70
  }
71
71
  :host([rounded]) {
72
- border-radius: var(--u-radius-pill);
72
+ border-radius: var(--u-radius-pill, 9999px);
73
73
  }
74
74
  :host([has-spinner]) u-spinner {
75
75
  display: none;
@@ -94,7 +94,7 @@ var styles = css`
94
94
 
95
95
  /* surface: 채우기 + 경계 */
96
96
  :host([variant="surface"]) {
97
- color: var(--u-txt-color);
97
+ color: var(--u-txt-color, #212121);
98
98
  background-color: var(--btn-color-surface);
99
99
  --btn-border-color: var(--btn-color-border);
100
100
  }
@@ -109,7 +109,7 @@ var styles = css`
109
109
 
110
110
  /* filled: 채우기만 */
111
111
  :host([variant="filled"]) {
112
- color: var(--u-txt-color);
112
+ color: var(--u-txt-color, #212121);
113
113
  background-color: var(--btn-color-surface);
114
114
  --btn-border-color: transparent;
115
115
  }
@@ -122,7 +122,7 @@ var styles = css`
122
122
 
123
123
  /* outlined: 경계만 */
124
124
  :host([variant="outlined"]) {
125
- color: var(--u-txt-color);
125
+ color: var(--u-txt-color, #212121);
126
126
  --btn-border-color: var(--btn-color-border);
127
127
  background-color: transparent;
128
128
  }
@@ -137,30 +137,30 @@ var styles = css`
137
137
 
138
138
  /* ghost: transparent */
139
139
  :host([variant="ghost"]) {
140
- color: var(--u-txt-color);
140
+ color: var(--u-txt-color, #212121);
141
141
  --btn-border-color: transparent;
142
142
  background-color: transparent;
143
143
  }
144
144
  :host([variant="ghost"]:hover) {
145
- background-color: var(--u-bg-color-hover);
145
+ background-color: var(--u-bg-color-hover, #F5F5F5);
146
146
  }
147
147
  :host([variant="ghost"]:active) {
148
- background-color: var(--u-bg-color-active);
148
+ background-color: var(--u-bg-color-active, #EEEEEE);
149
149
  }
150
150
 
151
151
  /* link: blue 링크 스타일 (기본값, color="neutral"일 때도 유지 — 기존 동작 보존) */
152
152
  :host([variant="link"]) {
153
- color: var(--u-primary-color-weak, #3b82f6);
153
+ color: var(--u-primary-color-weak, #2196F3);
154
154
  --btn-border-color: transparent;
155
155
  background-color: transparent;
156
156
  --btn-padding-inline: 0;
157
157
  }
158
158
  :host([variant="link"]:hover) {
159
- color: var(--u-primary-color, #2563eb);
159
+ color: var(--u-primary-color, #1E88E5);
160
160
  text-decoration: underline;
161
161
  }
162
162
  :host([variant="link"]:active) {
163
- color: var(--u-primary-color-strong, #1d4ed8);
163
+ color: var(--u-primary-color-strong, #1976D2);
164
164
  }
165
165
  /* link + 명시적 non-neutral color: 링크 자체 색상을 재정의 (예: 파괴적 액션 링크) */
166
166
  :host([variant="link"][color]:not([color="neutral"])) {
@@ -3,13 +3,13 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  display: flex;
6
- border-radius: var(--u-radius-xl);
7
- background-color: var(--u-panel-bg-color);
6
+ border-radius: var(--u-radius-xl, 8px);
7
+ background-color: var(--u-panel-bg-color, #FFFFFF);
8
8
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
9
9
  overflow: hidden;
10
10
 
11
11
  --card-border-width: 1px;
12
- --card-border-color: var(--u-border-color);
12
+ --card-border-color: var(--u-border-color, #E0E0E0);
13
13
  }
14
14
 
15
15
  /* 테두리는 내부 요소가 진다 — :host 에 두면 소비 앱 CSS 리셋에 지워진다. */
@@ -63,7 +63,7 @@ var styles = css`
63
63
  .header {
64
64
  display: none;
65
65
  padding: var(--u-space-lg, 16px);
66
- border-bottom: 1px solid var(--u-border-color);
66
+ border-bottom: 1px solid var(--u-border-color, #E0E0E0);
67
67
  }
68
68
  .header.has-content {
69
69
  display: block;
@@ -81,7 +81,7 @@ var styles = css`
81
81
  .footer {
82
82
  display: none;
83
83
  padding: var(--u-space-lg, 16px);
84
- border-top: 1px solid var(--u-border-color);
84
+ border-top: 1px solid var(--u-border-color, #E0E0E0);
85
85
  }
86
86
  .footer.has-content {
87
87
  display: block;
@@ -58,17 +58,17 @@ var styles = css`
58
58
  transform: translateY(-50%);
59
59
  padding: var(--u-space-sm, 8px);
60
60
  font-size: 20px;
61
- color: var(--u-neutral-900);
62
- background-color: var(--u-neutral-100);
61
+ color: var(--u-neutral-900, #212121);
62
+ background-color: var(--u-neutral-100, #F5F5F5);
63
63
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
64
64
  }
65
65
  .nav-button:hover {
66
- background-color: var(--u-neutral-200);
66
+ background-color: var(--u-neutral-200, #EEEEEE);
67
67
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
68
68
  transform: translateY(-50%) scale(1.1);
69
69
  }
70
70
  .nav-button:active {
71
- background-color: var(--u-neutral-300);
71
+ background-color: var(--u-neutral-300, #E0E0E0);
72
72
  transform: translateY(-50%) scale(0.95);
73
73
  }
74
74
 
@@ -94,18 +94,18 @@ var styles = css`
94
94
  height: 10px;
95
95
  padding: 0;
96
96
  border: none;
97
- border-radius: var(--u-radius-circle);
98
- background-color: var(--u-neutral-400);
97
+ border-radius: var(--u-radius-circle, 50%);
98
+ background-color: var(--u-neutral-400, #BDBDBD);
99
99
  cursor: pointer;
100
100
  transition: all 0.2s ease;
101
101
  }
102
102
  .dot:hover {
103
- background-color: var(--u-neutral-200);
103
+ background-color: var(--u-neutral-200, #EEEEEE);
104
104
  }
105
105
  .dot[active] {
106
106
  width: 24px;
107
107
  border-radius: 5px;
108
- background-color: var(--u-neutral-100);
108
+ background-color: var(--u-neutral-100, #F5F5F5);
109
109
  }
110
110
  `;
111
111
  //#endregion