@deepfuture/dui-theme-default 0.0.1 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +191 -0
  2. package/components/accordion-item.js +11 -10
  3. package/components/alert-dialog-popup.js +9 -17
  4. package/components/avatar.js +2 -2
  5. package/components/badge.js +55 -29
  6. package/components/breadcrumb-ellipsis.js +1 -1
  7. package/components/breadcrumb-link.js +2 -2
  8. package/components/breadcrumb-page.js +1 -1
  9. package/components/breadcrumb-separator.js +1 -1
  10. package/components/breadcrumb.js +3 -2
  11. package/components/button.js +88 -51
  12. package/components/calendar.js +24 -21
  13. package/components/checkbox-group.js +1 -1
  14. package/components/checkbox.js +10 -9
  15. package/components/collapsible.js +11 -10
  16. package/components/combobox.js +65 -19
  17. package/components/command-empty.js +3 -2
  18. package/components/command-group.js +3 -2
  19. package/components/command-input.js +4 -3
  20. package/components/command-item.js +6 -5
  21. package/components/command-list.js +1 -1
  22. package/components/command-separator.js +1 -1
  23. package/components/command-shortcut.js +3 -2
  24. package/components/command.js +2 -2
  25. package/components/data-table.js +20 -19
  26. package/components/dialog-popup.js +9 -17
  27. package/components/dropzone.js +10 -9
  28. package/components/input.js +13 -12
  29. package/components/menu-item.js +11 -9
  30. package/components/menu.js +19 -1
  31. package/components/number-field.js +13 -11
  32. package/components/popover-popup.js +25 -1
  33. package/components/preview-card-popup.js +26 -1
  34. package/components/progress.js +2 -2
  35. package/components/radio.js +11 -10
  36. package/components/scroll-area.js +9 -9
  37. package/components/select.js +62 -10
  38. package/components/sidebar-group-label.js +2 -2
  39. package/components/sidebar-menu-button.js +6 -14
  40. package/components/sidebar-provider.js +6 -14
  41. package/components/sidebar.js +1 -1
  42. package/components/slider.js +8 -7
  43. package/components/switch.js +12 -11
  44. package/components/tab.js +10 -9
  45. package/components/tabs-indicator.js +3 -3
  46. package/components/tabs-panel.js +3 -2
  47. package/components/textarea.js +11 -10
  48. package/components/toggle-group.js +0 -1
  49. package/components/toggle.js +28 -11
  50. package/components/tooltip-popup.js +29 -1
  51. package/components/trunc.js +3 -3
  52. package/index.d.ts +4 -0
  53. package/index.js +6 -0
  54. package/package.json +17 -4
  55. package/prose.d.ts +2 -0
  56. package/prose.js +4 -0
  57. package/tokens-raw.js +1 -1
  58. package/tokens.css +95 -72
  59. package/tokens.js +3 -2
  60. package/types.d.ts +18 -0
  61. package/types.js +8 -0
  62. package/typography.d.ts +104 -0
  63. package/typography.js +103 -0
@@ -1,65 +1,81 @@
1
1
  import { css } from "lit";
2
2
  export const buttonStyles = css `
3
+ /* =================================================================
4
+ * Two-axis variant system:
5
+ * variant → semantic intent (neutral, primary, danger)
6
+ * appearance → visual treatment (filled, outline, ghost, link)
7
+ *
8
+ * Uses the --_interact alpha overlay pattern for hover/active states.
9
+ * ================================================================= */
10
+
3
11
  /* ---------------------------------------------------------------
4
- * Variables: only what variants and sizes actually toggle.
5
- * Everything else — filters, transforms, clip-paths, shadows,
6
- * text-decoration — consumers style via ::part(root).
12
+ * Layer 1 Intent (sets --_intent-* private tokens)
7
13
  * --------------------------------------------------------------- */
8
- :host {
9
- --button-bg: var(--primary);
10
- --button-fg: var(--primary-foreground);
11
- --button-border: transparent;
12
- --button-hover-bg: color-mix(in oklch, var(--button-bg) 95%, var(--foreground));
13
- --button-active-bg: color-mix(in oklch, var(--button-bg) 90%, var(--foreground));
14
- --button-height: var(--component-height-md);
15
- --button-width: auto;
16
- --button-padding-y: var(--space-2);
17
- --button-padding-x: var(--space-2_5);
18
- --button-gap: var(--space-1_5);
19
- --button-radius: var(--radius-md);
20
- --button-font-size: var(--font-size-sm);
21
- --button-icon-size: var(--space-4_5);
14
+
15
+ :host,
16
+ :host([variant=""]),
17
+ :host([variant="neutral"]) {
18
+ --_intent-base: var(--foreground);
19
+ --_intent-base-fg: var(--background);
20
+ --_intent-subtle-fg: var(--text-1);
22
21
  }
23
22
 
24
- /* --- Variants (swap colors) --- */
23
+ :host([variant="primary"]) {
24
+ --_intent-base: var(--accent);
25
+ --_intent-base-fg: oklch(from var(--accent) 0.98 0.01 h);
26
+ --_intent-subtle-fg: var(--accent-text);
27
+ }
25
28
 
26
- :host([variant="secondary"]) {
27
- --button-bg: var(--secondary);
28
- --button-fg: var(--secondary-foreground);
29
- --button-border: transparent;
29
+ :host([variant="danger"]) {
30
+ --_intent-base: var(--destructive);
31
+ --_intent-base-fg: oklch(from var(--destructive) 0.98 0.01 h);
32
+ --_intent-subtle-fg: var(--destructive-text);
30
33
  }
31
34
 
32
- :host([variant="destructive"]) {
33
- --button-bg: var(--destructive);
34
- --button-fg: var(--destructive-foreground);
35
+ /* ---------------------------------------------------------------
36
+ * Layer 2 — Appearance (maps --_intent-* to --button-*)
37
+ * --------------------------------------------------------------- */
38
+
39
+ :host,
40
+ :host([appearance=""]),
41
+ :host([appearance="filled"]) {
42
+ --button-bg: var(--_intent-base);
43
+ --button-fg: var(--_intent-base-fg);
35
44
  --button-border: transparent;
36
45
  }
37
46
 
38
- :host([variant="outline"]) {
39
- --button-fg: var(--foreground);
40
- --button-border: var(--input);
41
- --button-bg: var(--input-bg);
42
- --button-hover-bg: var(--muted);
43
- --button-active-bg: var(--muted);
47
+ :host([appearance="outline"]) {
48
+ --button-bg: transparent;
49
+ --button-fg: var(--_intent-subtle-fg);
50
+ --button-border: var(--border);
44
51
  }
45
52
 
46
- :host([variant="ghost"]) {
53
+ :host([appearance="ghost"]) {
47
54
  --button-bg: transparent;
48
- --button-fg: var(--foreground);
55
+ --button-fg: var(--_intent-subtle-fg);
49
56
  --button-border: transparent;
50
- --button-hover-bg: var(--muted);
51
- --button-active-bg: var(--muted);
52
57
  }
53
58
 
54
- :host([variant="link"]) {
59
+ :host([appearance="link"]) {
55
60
  --button-bg: transparent;
56
- --button-fg: var(--foreground);
61
+ --button-fg: var(--_intent-subtle-fg);
57
62
  --button-border: transparent;
58
- --button-hover-bg: transparent;
59
- --button-active-bg: transparent;
60
63
  }
61
64
 
62
- /* --- Sizes (swap dimensions) --- */
65
+ /* ---------------------------------------------------------------
66
+ * Sizes (swap dimensions)
67
+ * --------------------------------------------------------------- */
68
+
69
+ :host {
70
+ --button-height: var(--component-height-md);
71
+ --button-width: auto;
72
+ --button-padding-y: var(--space-2);
73
+ --button-padding-x: var(--space-2_5);
74
+ --button-gap: var(--space-1_5);
75
+ --button-radius: var(--radius-md);
76
+ --button-font-size: var(--font-size-sm);
77
+ --button-icon-size: var(--space-4_5);
78
+ }
63
79
 
64
80
  :host([size="sm"]) {
65
81
  --button-height: var(--component-height-sm);
@@ -79,7 +95,9 @@ export const buttonStyles = css `
79
95
  --button-icon-size: var(--space-4_5);
80
96
  }
81
97
 
82
- /* --- Base appearance --- */
98
+ /* ---------------------------------------------------------------
99
+ * Base appearance
100
+ * --------------------------------------------------------------- */
83
101
 
84
102
  [part="root"] {
85
103
  --icon-size: var(--button-icon-size);
@@ -98,40 +116,59 @@ export const buttonStyles = css `
98
116
  letter-spacing: var(--letter-spacing-tight);
99
117
  line-height: var(--line-height-snug);
100
118
  white-space: nowrap;
119
+ transition-property: background, box-shadow, filter, transform, border-color;
101
120
  transition-duration: var(--duration-faster);
102
121
  transition-timing-function: var(--ease-out-3);
103
122
  }
104
123
 
105
- /* --- Interactive states --- */
124
+ /* ---------------------------------------------------------------
125
+ * Interactive states — filled variant uses filter for hover/active
126
+ * --------------------------------------------------------------- */
127
+
128
+ /* Filled: darken on hover, more on active */
129
+ :host(:not([appearance="outline"]):not([appearance="ghost"]):not([appearance="link"]))
130
+ [part="root"]:hover:not(:disabled):not([aria-disabled="true"]) {
131
+ filter: brightness(0.88);
132
+ }
133
+
134
+ :host(:not([appearance="outline"]):not([appearance="ghost"]):not([appearance="link"]))
135
+ [part="root"]:active:not(:disabled):not([aria-disabled="true"]) {
136
+ filter: brightness(0.80);
137
+ }
106
138
 
107
- [part="root"]:hover:not(:disabled):not([aria-disabled="true"]) {
108
- background: var(--button-hover-bg);
139
+ /* Ghost / outline: alpha overlay on foreground */
140
+ :host([appearance="ghost"]) [part="root"]:hover:not(:disabled):not([aria-disabled="true"]),
141
+ :host([appearance="outline"]) [part="root"]:hover:not(:disabled):not([aria-disabled="true"]) {
142
+ background: oklch(from var(--foreground) l c h / 0.05);
109
143
  }
110
144
 
111
- [part="root"]:active:not(:disabled):not([aria-disabled="true"]) {
112
- background: var(--button-active-bg);
145
+ :host([appearance="ghost"]) [part="root"]:active:not(:disabled):not([aria-disabled="true"]),
146
+ :host([appearance="outline"]) [part="root"]:active:not(:disabled):not([aria-disabled="true"]) {
147
+ background: oklch(from var(--foreground) l c h / 0.10);
113
148
  }
114
149
 
115
150
  [part="root"]:focus-visible {
116
151
  outline: none;
117
152
  box-shadow:
118
- 0 0 0 var(--space-0_5) var(--background),
119
- 0 0 0 var(--space-1) var(--ring);
153
+ 0 0 0 var(--focus-ring-offset) var(--background),
154
+ 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color);
120
155
  }
121
156
 
122
157
  [part="root"]:disabled,
123
158
  [part="root"][aria-disabled="true"] {
124
- opacity: 0.2;
159
+ opacity: 0.4;
125
160
  cursor: not-allowed;
126
161
  }
127
162
 
128
- :host([variant="link"])
163
+ /* Link appearance: underline on hover */
164
+ :host([appearance="link"])
129
165
  [part="root"]:hover:not(:disabled):not([aria-disabled="true"]) {
130
166
  text-decoration: underline;
131
167
  text-underline-offset: 4px;
132
168
  }
133
169
 
170
+ /* Open state (e.g. button is a popover trigger) */
134
171
  :host([data-open]) [part="root"]:not(:disabled):not([aria-disabled="true"]) {
135
- background: var(--button-hover-bg);
172
+ background: oklch(from var(--foreground) l c h / 0.05);
136
173
  }
137
174
  `;
@@ -1,9 +1,10 @@
1
1
  import { css } from "lit";
2
+ import { type } from "../typography.js";
2
3
  export const calendarStyles = css `
3
4
  [part="root"] {
4
5
  padding: var(--space-3);
5
6
  font-family: var(--font-sans);
6
- font-size: var(--font-size-sm);
7
+ ${type("sm")}
7
8
  }
8
9
 
9
10
  [part="header"] {
@@ -11,9 +12,9 @@ export const calendarStyles = css `
11
12
  }
12
13
 
13
14
  [part="heading"] {
14
- font-size: var(--font-size-sm);
15
+ ${type("sm")}
15
16
  font-weight: var(--font-weight-medium);
16
- color: var(--foreground);
17
+ color: var(--text-1);
17
18
  }
18
19
 
19
20
  [part="prev"],
@@ -21,7 +22,7 @@ export const calendarStyles = css `
21
22
  width: var(--space-7);
22
23
  height: var(--space-7);
23
24
  border-radius: var(--radius-md);
24
- color: var(--muted-foreground);
25
+ color: var(--text-2);
25
26
  font-size: var(--font-size-lg);
26
27
  transition-property: background, color;
27
28
  transition-duration: var(--duration-fast);
@@ -30,17 +31,17 @@ export const calendarStyles = css `
30
31
  @media (hover: hover) {
31
32
  [part="prev"]:hover,
32
33
  [part="next"]:hover {
33
- background: var(--muted);
34
- color: var(--foreground);
34
+ background: var(--surface-1);
35
+ color: var(--text-1);
35
36
  }
36
37
  }
37
38
 
38
39
  [part="weekday"] {
39
40
  width: var(--space-8);
40
41
  height: var(--space-8);
41
- font-size: var(--font-size-xs);
42
- font-weight: var(--font-weight-normal);
43
- color: var(--muted-foreground);
42
+ ${type("xs")}
43
+ font-weight: var(--font-weight-regular);
44
+ color: var(--text-2);
44
45
  display: flex;
45
46
  align-items: center;
46
47
  justify-content: center;
@@ -50,39 +51,41 @@ export const calendarStyles = css `
50
51
  width: var(--space-8);
51
52
  height: var(--space-8);
52
53
  border-radius: var(--radius-md);
53
- font-size: var(--font-size-sm);
54
- color: var(--foreground);
54
+ ${type("sm")}
55
+ color: var(--text-1);
55
56
  transition-property: background, color;
56
57
  transition-duration: var(--duration-fast);
57
58
  }
58
59
 
59
60
  @media (hover: hover) {
60
61
  [part="day"]:hover:not(:disabled):not([data-selected]) {
61
- background: var(--muted);
62
+ background: var(--surface-1);
62
63
  }
63
64
  }
64
65
 
65
66
  [part="day"][data-today]:not([data-selected]) {
66
- background: var(--accent);
67
- color: var(--accent-foreground);
67
+ background: var(--accent-subtle);
68
+ color: var(--accent-text);
68
69
  }
69
70
 
70
71
  [part="day"][data-selected] {
71
- background: var(--primary);
72
- color: var(--primary-foreground);
72
+ background: var(--accent);
73
+ color: oklch(from var(--accent) 0.98 0.01 h);
73
74
  }
74
75
 
75
76
  [part="day"][data-outside-month] {
76
- color: var(--muted-foreground);
77
- opacity: 0.5;
77
+ color: var(--text-2);
78
+ opacity: 0.4;
78
79
  }
79
80
 
80
81
  [part="day"]:disabled {
81
- opacity: 0.3;
82
+ opacity: 0.4;
82
83
  }
83
84
 
84
85
  [part="day"]:focus-visible {
85
- outline: 2px solid var(--ring);
86
- outline-offset: 2px;
86
+ outline: none;
87
+ box-shadow:
88
+ 0 0 0 var(--focus-ring-offset) var(--background),
89
+ 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color);
87
90
  }
88
91
  `;
@@ -5,6 +5,6 @@ export const checkboxGroupStyles = css `
5
5
  }
6
6
 
7
7
  [part="root"][data-disabled] {
8
- opacity: 0.5;
8
+ opacity: 0.4;
9
9
  }
10
10
  `;
@@ -12,29 +12,30 @@ export const checkboxStyles = css `
12
12
  (var(--line-height-normal) * 1em - var(--checkbox-size)) / 2
13
13
  );
14
14
  border-radius: var(--radius-sm);
15
+ transition-property: background, border-color, box-shadow, filter, transform;
15
16
  transition-duration: var(--duration-fast);
16
17
  }
17
18
 
18
19
  [part="root"][data-unchecked] {
19
- border: var(--border-width-thin) solid var(--input);
20
+ border: var(--border-width-thin) solid var(--border);
20
21
  background: transparent;
21
22
  }
22
23
 
23
24
  [part="root"][data-checked],
24
25
  [part="root"][data-indeterminate] {
25
- background: var(--primary);
26
- border: var(--border-width-thin) solid var(--primary);
26
+ background: var(--accent);
27
+ border: var(--border-width-thin) solid var(--accent);
27
28
  }
28
29
 
29
30
  [part="root"][data-disabled] {
30
- opacity: 0.5;
31
+ opacity: 0.4;
31
32
  }
32
33
 
33
34
  [part="root"]:focus-visible {
34
35
  outline: none;
35
36
  box-shadow:
36
- 0 0 0 var(--space-0_5) var(--background),
37
- 0 0 0 var(--space-1) var(--ring);
37
+ 0 0 0 var(--focus-ring-offset) var(--background),
38
+ 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color);
38
39
  }
39
40
 
40
41
  [part="root"][data-invalid] {
@@ -43,11 +44,11 @@ export const checkboxStyles = css `
43
44
  }
44
45
 
45
46
  [part="indicator"] {
46
- color: var(--primary-foreground);
47
+ color: oklch(from var(--accent) 0.98 0.01 h);
47
48
  }
48
49
 
49
50
  .Icon {
50
- width: 12px;
51
- height: 12px;
51
+ width: var(--space-3);
52
+ height: var(--space-3);
52
53
  }
53
54
  `;
@@ -1,4 +1,5 @@
1
1
  import { css } from "lit";
2
+ import { type } from "../typography.js";
2
3
  export const collapsibleStyles = css `
3
4
  /* ── Trigger ── */
4
5
 
@@ -6,32 +7,32 @@ export const collapsibleStyles = css `
6
7
  gap: var(--space-4);
7
8
  padding-block: var(--space-2);
8
9
  padding-inline: var(--space-4);
9
- color: var(--foreground);
10
+ color: var(--text-1);
10
11
  font-family: var(--font-sans);
11
12
  font-weight: var(--font-weight-semibold);
12
- font-size: var(--font-size-sm);
13
+ ${type("sm")}
13
14
  height: var(--component-height-md);
14
- line-height: var(--line-height-normal);
15
15
  border-radius: var(--radius-sm);
16
+ transition-property: background, box-shadow, filter, transform;
16
17
  transition-duration: var(--duration-fast);
17
18
  transition-timing-function: var(--ease-out-3);
18
19
  }
19
20
 
20
21
  @media (hover: hover) {
21
22
  [part="trigger"]:hover {
22
- background: color-mix(in oklch, var(--muted) 50%, transparent);
23
+ background: oklch(from var(--foreground) l c h / 0.05);
23
24
  }
24
25
  }
25
26
 
26
27
  [part="trigger"]:focus-visible {
27
28
  box-shadow:
28
- 0 0 0 var(--space-0_5) var(--background),
29
- 0 0 0 var(--space-1) var(--ring);
29
+ 0 0 0 var(--focus-ring-offset) var(--background),
30
+ 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color);
30
31
  z-index: 1;
31
32
  }
32
33
 
33
34
  [part="trigger"][data-disabled] {
34
- opacity: 0.5;
35
+ opacity: 0.4;
35
36
  }
36
37
 
37
38
  /* ── Indicator ── */
@@ -39,6 +40,7 @@ export const collapsibleStyles = css `
39
40
  [part="indicator"] {
40
41
  width: var(--space-4);
41
42
  height: var(--space-4);
43
+ transition-property: transform;
42
44
  transition-duration: var(--duration-fast);
43
45
  transition-timing-function: var(--ease-out-3);
44
46
  }
@@ -62,10 +64,9 @@ export const collapsibleStyles = css `
62
64
  [part="content"] {
63
65
  padding: var(--space-1) var(--space-4) var(--space-3);
64
66
  font-family: var(--font-sans);
65
- font-size: var(--font-size-sm);
67
+ ${type("sm")}
66
68
  font-weight: var(--font-weight-regular);
67
- line-height: var(--line-height-normal);
68
- color: color-mix(in oklch, var(--foreground) 80%, transparent);
69
+ color: var(--text-2);
69
70
  }
70
71
 
71
72
  /* ── Reduced motion ── */
@@ -1,40 +1,40 @@
1
1
  import { css } from "lit";
2
+ import { type } from "../typography.js";
2
3
  export const comboboxStyles = css `
3
4
  /* ---- Chips (multi-select container) ---- */
4
5
 
5
6
  .Chips {
6
7
  gap: var(--space-1);
7
- border: var(--border-width-thin) solid var(--input);
8
+ border: var(--border-width-thin) solid var(--border);
8
9
  border-radius: var(--radius-md);
9
10
  padding: var(--space-1) var(--space-8) var(--space-1) var(--space-1_5);
10
11
  min-height: var(--component-height-md);
11
- background: var(--input-bg);
12
+ background: var(--sunken);
12
13
  transition-property: border-color, box-shadow;
13
14
  transition-duration: var(--duration-fast);
14
15
  }
15
16
 
16
17
  .Chips:focus-within:has(:focus-visible) {
17
18
  box-shadow:
18
- 0 0 0 var(--space-0_5) var(--background),
19
- 0 0 0 var(--space-1) var(--ring);
19
+ 0 0 0 var(--focus-ring-offset) var(--background),
20
+ 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color);
20
21
  }
21
22
 
22
23
  .Chips[data-disabled] {
23
- opacity: 0.5;
24
+ opacity: 0.4;
24
25
  }
25
26
 
26
27
  /* ---- Input ---- */
27
28
 
28
29
  .Input {
29
30
  height: var(--component-height-md);
30
- color: var(--foreground);
31
+ color: var(--text-1);
31
32
  font-family: var(--font-sans);
32
- font-size: var(--font-size-sm);
33
- line-height: var(--line-height-normal);
33
+ ${type("sm")}
34
34
  }
35
35
 
36
36
  .Input::placeholder {
37
- color: var(--muted-foreground);
37
+ color: var(--text-3);
38
38
  }
39
39
 
40
40
  /* Single-select input wrapper */
@@ -42,27 +42,27 @@ export const comboboxStyles = css `
42
42
  width: 100%;
43
43
  min-height: var(--component-height-md);
44
44
  padding: var(--space-2) var(--space-8) var(--space-2) var(--space-2);
45
- border: var(--border-width-thin) solid var(--input);
45
+ border: var(--border-width-thin) solid var(--border);
46
46
  border-radius: var(--radius-md);
47
47
  transition-property: border-color, box-shadow;
48
48
  transition-duration: var(--duration-fast);
49
- background: var(--input-bg);
49
+ background: var(--sunken);
50
50
  }
51
51
 
52
52
  .InputWrapper .Input:focus-visible {
53
53
  box-shadow:
54
- 0 0 0 var(--space-0_5) var(--background),
55
- 0 0 0 var(--space-1) var(--ring);
54
+ 0 0 0 var(--focus-ring-offset) var(--background),
55
+ 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color);
56
56
  }
57
57
 
58
58
  .InputWrapper .Input[data-disabled] {
59
- opacity: 0.5;
59
+ opacity: 0.4;
60
60
  }
61
61
 
62
62
  .Arrow {
63
63
  --icon-size: var(--space-4);
64
64
  right: var(--space-3);
65
- color: var(--foreground);
65
+ color: var(--text-1);
66
66
  }
67
67
 
68
68
  /* Multi-select input (inside chips) */
@@ -75,10 +75,10 @@ export const comboboxStyles = css `
75
75
 
76
76
  .Chip {
77
77
  gap: var(--space-1);
78
- background: var(--secondary);
79
- color: var(--secondary-foreground);
78
+ background: oklch(from var(--foreground) l c h / 0.05);
79
+ color: var(--text-1);
80
80
  border-radius: var(--radius-sm);
81
- font-size: var(--font-size-xs);
81
+ ${type("xs")}
82
82
  padding: var(--space-0_5) var(--space-0_5) var(--space-0_5) var(--space-2);
83
83
  }
84
84
 
@@ -92,8 +92,54 @@ export const comboboxStyles = css `
92
92
  .ChipRemove:hover {
93
93
  background: color-mix(
94
94
  in oklch,
95
- var(--secondary-foreground) 15%,
95
+ var(--text-1) 15%,
96
96
  transparent
97
97
  );
98
98
  }
99
+
100
+ /* ---- Popup (rendered in portal shadow root) ---- */
101
+
102
+ .Popup {
103
+ background: var(--surface-3);
104
+ border: var(--border-width-thin) solid var(--border);
105
+ border-radius: var(--radius-md);
106
+ box-shadow: var(--shadow-md);
107
+ transition-duration: var(--duration-fast);
108
+ transition-timing-function: var(--ease-out-3);
109
+ }
110
+
111
+ .Popup[data-starting-style],
112
+ .Popup[data-ending-style] {
113
+ transform: translateY(calc(var(--space-1) * -1));
114
+ }
115
+
116
+ .List {
117
+ padding: var(--space-1);
118
+ }
119
+
120
+ .Item {
121
+ gap: var(--space-2);
122
+ padding: var(--space-2) var(--space-2) var(--space-2) var(--space-3);
123
+ border-radius: var(--radius-sm);
124
+ ${type("sm")}
125
+ font-family: var(--font-sans);
126
+ color: var(--text-1);
127
+ }
128
+
129
+ .Item:hover,
130
+ .Item[data-highlighted] {
131
+ background: oklch(from var(--foreground) l c h / 0.05);
132
+ color: var(--text-1);
133
+ }
134
+
135
+ .ItemIndicator {
136
+ --icon-size: var(--space-3_5);
137
+ }
138
+
139
+ .Empty {
140
+ padding: var(--space-3);
141
+ ${type("sm")}
142
+ color: var(--text-2);
143
+ text-align: center;
144
+ }
99
145
  `;
@@ -1,8 +1,9 @@
1
1
  import { css } from "lit";
2
+ import { type } from "../typography.js";
2
3
  export const commandEmptyStyles = css `
3
4
  .Empty {
4
5
  padding: var(--space-6);
5
- font-size: var(--font-size-sm);
6
- color: var(--muted-foreground);
6
+ ${type("sm")}
7
+ color: var(--text-2);
7
8
  }
8
9
  `;
@@ -1,4 +1,5 @@
1
1
  import { css } from "lit";
2
+ import { type } from "../typography.js";
2
3
  export const commandGroupStyles = css `
3
4
  .Group {
4
5
  padding: var(--space-1_5);
@@ -6,8 +7,8 @@ export const commandGroupStyles = css `
6
7
 
7
8
  .Heading {
8
9
  padding: var(--space-1_5) var(--space-2);
9
- font-size: var(--font-size-xs);
10
+ ${type("xs")}
10
11
  font-weight: var(--font-weight-medium);
11
- color: var(--muted-foreground);
12
+ color: var(--text-2);
12
13
  }
13
14
  `;
@@ -1,4 +1,5 @@
1
1
  import { css } from "lit";
2
+ import { type } from "../typography.js";
2
3
  export const commandInputStyles = css `
3
4
  .InputWrapper {
4
5
  gap: var(--space-2);
@@ -7,7 +8,7 @@ export const commandInputStyles = css `
7
8
  }
8
9
 
9
10
  .SearchIcon {
10
- color: var(--muted-foreground);
11
+ color: var(--text-2);
11
12
  width: var(--space-4);
12
13
  height: var(--space-4);
13
14
  }
@@ -15,10 +16,10 @@ export const commandInputStyles = css `
15
16
  .Input {
16
17
  height: var(--component-height-lg);
17
18
  border-radius: var(--radius-md);
18
- font-size: var(--font-size-sm);
19
+ ${type("sm")}
19
20
  }
20
21
 
21
22
  .Input::placeholder {
22
- color: var(--muted-foreground);
23
+ color: var(--text-3);
23
24
  }
24
25
  `;
@@ -1,24 +1,25 @@
1
1
  import { css } from "lit";
2
+ import { type } from "../typography.js";
2
3
  export const commandItemStyles = css `
3
4
  .Item {
4
5
  gap: var(--space-2);
5
6
  border-radius: var(--radius-sm);
6
7
  padding: var(--space-1_5) var(--space-2);
7
- font-size: var(--font-size-sm);
8
+ ${type("sm")}
8
9
  font-weight: var(--font-weight-medium);
9
10
  }
10
11
 
11
12
  .Item[data-selected] {
12
- background: var(--secondary);
13
- color: var(--foreground);
13
+ background: oklch(from var(--foreground) l c h / 0.05);
14
+ color: var(--text-1);
14
15
  }
15
16
 
16
17
  .Item[aria-disabled="true"] {
17
- opacity: 0.5;
18
+ opacity: 0.4;
18
19
  }
19
20
 
20
21
  ::slotted(dui-icon) {
21
22
  --icon-size: var(--space-4);
22
- color: var(--muted-foreground);
23
+ color: var(--text-2);
23
24
  }
24
25
  `;