@atelier-ui/react 0.1.9 → 0.1.11

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 (35) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/package.json +1 -1
  3. package/src/lib/accordion/llm-accordion.css +120 -0
  4. package/src/lib/alert/llm-alert.css +80 -0
  5. package/src/lib/avatar/llm-avatar.css +106 -0
  6. package/src/lib/badge/llm-badge.css +60 -0
  7. package/src/lib/breadcrumbs/llm-breadcrumbs.css +62 -0
  8. package/src/lib/button/llm-button.css +139 -0
  9. package/src/lib/card/llm-card.css +70 -0
  10. package/src/lib/chat/llm-chat.css +446 -0
  11. package/src/lib/checkbox/llm-checkbox.css +123 -0
  12. package/src/lib/code-block/llm-code-block.css +112 -0
  13. package/src/lib/combobox/llm-combobox.css +169 -0
  14. package/src/lib/dialog/llm-dialog.css +174 -0
  15. package/src/lib/drawer/llm-drawer.css +228 -0
  16. package/src/lib/icon/llm-icon.css +29 -0
  17. package/src/lib/input/llm-input.css +94 -0
  18. package/src/lib/menu/llm-menu.css +85 -0
  19. package/src/lib/pagination/llm-pagination.css +80 -0
  20. package/src/lib/progress/llm-progress.css +69 -0
  21. package/src/lib/radio/llm-radio.css +78 -0
  22. package/src/lib/radio-group/llm-radio-group.css +31 -0
  23. package/src/lib/select/llm-select.css +83 -0
  24. package/src/lib/skeleton/llm-skeleton.css +51 -0
  25. package/src/lib/spec.d.ts +2 -2
  26. package/src/lib/spec.d.ts.map +1 -1
  27. package/src/lib/spec.js.map +1 -1
  28. package/src/lib/stepper/llm-stepper.css +171 -0
  29. package/src/lib/table/llm-table.css +200 -0
  30. package/src/lib/tabs/llm-tabs.css +120 -0
  31. package/src/lib/textarea/llm-textarea.css +100 -0
  32. package/src/lib/toast/llm-toast.css +137 -0
  33. package/src/lib/toggle/llm-toggle.css +118 -0
  34. package/src/lib/tooltip/llm-tooltip.css +80 -0
  35. package/styles/tokens.css +346 -0
@@ -0,0 +1,169 @@
1
+ /* ============================================================
2
+ llm-combobox.css
3
+ ============================================================ */
4
+
5
+ .llm-combobox {
6
+ display: block;
7
+ position: relative;
8
+ font-family: var(--ui-font-family);
9
+ font-size: var(--ui-font-size-md);
10
+ }
11
+
12
+ /* ---------------------------------------------------------------------------
13
+ Input wrapper
14
+ --------------------------------------------------------------------------- */
15
+ .llm-combobox-wrapper {
16
+ position: relative;
17
+ display: flex;
18
+ align-items: center;
19
+ }
20
+
21
+ .llm-combobox-input {
22
+ width: 100%;
23
+ min-height: 2.5rem;
24
+ box-sizing: border-box;
25
+ padding: 0.625rem var(--ui-spacing-8) 0.625rem var(--ui-spacing-4);
26
+ font-family: inherit;
27
+ font-size: inherit;
28
+ color: var(--ui-color-text);
29
+ background-color: var(--ui-color-input-bg);
30
+ border: 1px solid var(--ui-color-input-border);
31
+ border-radius: var(--ui-radius-md);
32
+ outline: none;
33
+ transition:
34
+ border-color var(--ui-transition-fast),
35
+ box-shadow var(--ui-transition-fast),
36
+ background-color var(--ui-transition-fast);
37
+ cursor: text;
38
+ }
39
+
40
+ .llm-combobox-input::placeholder {
41
+ color: var(--ui-color-placeholder);
42
+ }
43
+
44
+ .llm-combobox-input:hover:not(:disabled) {
45
+ border-color: var(--ui-color-input-border-hover);
46
+ }
47
+
48
+ .llm-combobox-input:focus-visible,
49
+ .llm-combobox.is-open .llm-combobox-input {
50
+ border-color: var(--ui-color-input-border-focus);
51
+ box-shadow: var(--ui-focus-ring);
52
+ }
53
+
54
+ .llm-combobox.is-invalid .llm-combobox-input {
55
+ border-color: var(--ui-color-input-border-invalid);
56
+ }
57
+
58
+ .llm-combobox.is-invalid .llm-combobox-input:focus-visible {
59
+ border-color: var(--ui-color-input-border-invalid);
60
+ box-shadow: 0 0 0 2px var(--ui-color-surface), 0 0 0 4px var(--ui-color-danger);
61
+ }
62
+
63
+ .llm-combobox.is-disabled {
64
+ opacity: var(--ui-opacity-disabled);
65
+ cursor: not-allowed;
66
+ }
67
+
68
+ .llm-combobox.is-disabled .llm-combobox-input {
69
+ cursor: not-allowed;
70
+ }
71
+
72
+ /* ---------------------------------------------------------------------------
73
+ Chevron icon
74
+ --------------------------------------------------------------------------- */
75
+ .llm-combobox-icon {
76
+ position: absolute;
77
+ right: var(--ui-spacing-4);
78
+ pointer-events: none;
79
+ color: var(--ui-color-text-muted);
80
+ transition: transform var(--ui-transition-fast);
81
+ display: flex;
82
+ align-items: center;
83
+ }
84
+
85
+ .llm-combobox.is-open .llm-combobox-icon {
86
+ transform: rotate(180deg);
87
+ }
88
+
89
+ /* ---------------------------------------------------------------------------
90
+ Panel
91
+ --------------------------------------------------------------------------- */
92
+ .llm-combobox-panel {
93
+ position: absolute;
94
+ left: 0;
95
+ top: calc(100% + var(--ui-spacing-2));
96
+ width: 100%;
97
+ max-height: 16rem;
98
+ overflow-y: auto;
99
+ margin: 0;
100
+ padding: var(--ui-spacing-2) 0;
101
+ background-color: var(--ui-color-surface-raised);
102
+ border: 1px solid var(--ui-color-border);
103
+ border-radius: var(--ui-radius-md);
104
+ box-shadow: var(--ui-shadow-lg);
105
+ z-index: 100;
106
+ list-style: none;
107
+ }
108
+
109
+ /* ---------------------------------------------------------------------------
110
+ Options
111
+ --------------------------------------------------------------------------- */
112
+ .llm-combobox-option {
113
+ display: flex;
114
+ align-items: center;
115
+ justify-content: space-between;
116
+ min-height: 2.25rem;
117
+ padding: var(--ui-spacing-2) var(--ui-spacing-4);
118
+ cursor: pointer;
119
+ color: var(--ui-color-text);
120
+ font-size: var(--ui-font-size-md);
121
+ transition: background-color var(--ui-transition-fast);
122
+ }
123
+
124
+ .llm-combobox-option:hover:not(.is-disabled) {
125
+ background-color: var(--ui-color-surface-sunken);
126
+ }
127
+
128
+ .llm-combobox-option.is-active {
129
+ background-color: var(--ui-color-primary-light);
130
+ color: var(--ui-color-primary);
131
+ }
132
+
133
+ .llm-combobox-option.is-selected {
134
+ font-weight: var(--ui-font-weight-semibold);
135
+ }
136
+
137
+ .llm-combobox-option.is-disabled {
138
+ opacity: var(--ui-opacity-disabled);
139
+ cursor: not-allowed;
140
+ }
141
+
142
+ .llm-combobox-check {
143
+ color: var(--ui-color-primary);
144
+ flex-shrink: 0;
145
+ }
146
+
147
+ /* ---------------------------------------------------------------------------
148
+ No results
149
+ --------------------------------------------------------------------------- */
150
+ .llm-combobox-no-results {
151
+ padding: var(--ui-spacing-4);
152
+ text-align: center;
153
+ color: var(--ui-color-text-muted);
154
+ font-size: var(--ui-font-size-sm);
155
+ }
156
+
157
+ /* ---------------------------------------------------------------------------
158
+ Errors
159
+ --------------------------------------------------------------------------- */
160
+ .llm-combobox-errors {
161
+ margin-top: var(--ui-spacing-2);
162
+ }
163
+
164
+ .llm-combobox-error-message {
165
+ margin: 0;
166
+ font-size: var(--ui-font-size-sm);
167
+ color: var(--ui-color-error-text);
168
+ line-height: var(--ui-line-height-normal);
169
+ }
@@ -0,0 +1,174 @@
1
+ /* ── Native <dialog> reset + base ──────────────────────────────────────────── */
2
+ .llm-dialog {
3
+ all: unset;
4
+ position: fixed;
5
+ inset: 0;
6
+ margin: auto;
7
+ width: fit-content;
8
+ height: fit-content;
9
+ display: none; /* hidden by default; showModal() moves to top layer */
10
+ flex-direction: column;
11
+ max-width: 100vw;
12
+ max-height: calc(100dvh - var(--ui-spacing-8));
13
+ border-radius: var(--ui-radius-lg);
14
+ background: var(--ui-color-surface);
15
+ box-shadow: var(--ui-shadow-xl, 0 20px 60px rgba(0, 0, 0, 0.3));
16
+ color: var(--ui-color-text);
17
+ overflow: hidden;
18
+
19
+ /* Open/close animation */
20
+ opacity: 0;
21
+ transform: scale(0.95);
22
+ transition:
23
+ opacity var(--ui-duration-slow) var(--ui-ease-out, ease-out),
24
+ transform var(--ui-duration-slow) var(--ui-ease-out, ease-out),
25
+ display var(--ui-duration-slow) allow-discrete,
26
+ overlay var(--ui-duration-slow) allow-discrete;
27
+ }
28
+
29
+ .llm-dialog[open] {
30
+ display: flex;
31
+ opacity: 1;
32
+ transform: scale(1);
33
+ }
34
+
35
+ @starting-style {
36
+ .llm-dialog[open] {
37
+ opacity: 0;
38
+ transform: scale(0.95);
39
+ }
40
+ }
41
+
42
+ /* ── Backdrop ────────────────────────────────────────────────────────────── */
43
+ .llm-dialog::backdrop {
44
+ background: var(--ui-color-overlay);
45
+ backdrop-filter: blur(2px);
46
+ transition:
47
+ opacity var(--ui-duration-slow) var(--ui-ease-out, ease-out),
48
+ display var(--ui-duration-slow) allow-discrete,
49
+ overlay var(--ui-duration-slow) allow-discrete;
50
+ }
51
+
52
+ @starting-style {
53
+ .llm-dialog[open]::backdrop {
54
+ opacity: 0;
55
+ }
56
+ }
57
+
58
+ @media (prefers-color-scheme: dark) {
59
+ .llm-dialog::backdrop {
60
+ background: var(--ui-color-overlay);
61
+ }
62
+ }
63
+
64
+ [data-theme='dark'] .llm-dialog::backdrop {
65
+ background: var(--ui-color-overlay);
66
+ }
67
+
68
+ /* ── Panel (inner wrapper) ───────────────────────────────────────────────── */
69
+ .panel {
70
+ display: flex;
71
+ flex-direction: column;
72
+ width: 100%;
73
+ max-height: inherit;
74
+ overflow: hidden;
75
+ }
76
+
77
+ /* ── Size variants ───────────────────────────────────────────────────────────
78
+ * Scoped to the dialog. React applies size-* on the <dialog class="llm-dialog">
79
+ * itself; Angular/Vue apply it on the inner .panel — hence the selector pair
80
+ * (`dialog > .panel` covers both, including Angular's emulated-scoped template,
81
+ * which never carries the `llm-dialog` class). Bare `.size-*` selectors leaked
82
+ * globally and resized unrelated elements (e.g. `llm-button size-md`). */
83
+ .llm-dialog.size-sm,
84
+ dialog > .panel.size-sm {
85
+ width: min(24rem, 90vw);
86
+ }
87
+
88
+ .llm-dialog.size-md,
89
+ dialog > .panel.size-md {
90
+ width: min(36rem, 90vw);
91
+ }
92
+
93
+ .llm-dialog.size-lg,
94
+ dialog > .panel.size-lg {
95
+ width: min(48rem, 90vw);
96
+ }
97
+
98
+ .llm-dialog.size-xl,
99
+ dialog > .panel.size-xl {
100
+ width: min(64rem, 90vw);
101
+ }
102
+
103
+ .llm-dialog.size-full,
104
+ dialog > .panel.size-full {
105
+ width: 100vw;
106
+ height: 100dvh;
107
+ max-width: 100vw;
108
+ max-height: 100dvh;
109
+ border-radius: 0;
110
+ margin: 0;
111
+ }
112
+
113
+ /* ── Sub-components ──────────────────────────────────────────────────────── */
114
+ .llm-dialog-header {
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: space-between;
118
+ padding: var(--ui-spacing-5) var(--ui-spacing-6);
119
+ border-bottom: 1px solid var(--ui-color-border);
120
+ font-size: var(--ui-font-size-xl);
121
+ font-weight: 600;
122
+ letter-spacing: var(--ui-letter-spacing-tight);
123
+ color: var(--ui-color-text);
124
+ flex-shrink: 0;
125
+ }
126
+
127
+ .llm-dialog-content {
128
+ display: block;
129
+ padding: var(--ui-spacing-6);
130
+ overflow-y: auto;
131
+ flex: 1;
132
+ color: var(--ui-color-text);
133
+ }
134
+
135
+ .llm-dialog-footer {
136
+ display: flex;
137
+ align-items: center;
138
+ justify-content: flex-end;
139
+ gap: var(--ui-spacing-3);
140
+ padding: var(--ui-spacing-5) var(--ui-spacing-6);
141
+ border-top: 1px solid var(--ui-color-border);
142
+ flex-shrink: 0;
143
+ }
144
+
145
+ /* ── Close button ──────────────────────────────────────────────────────────── */
146
+ .close-btn {
147
+ display: inline-flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ flex-shrink: 0;
151
+ width: 2rem;
152
+ height: 2rem;
153
+ padding: 0;
154
+ margin-left: var(--ui-spacing-3);
155
+ background: transparent;
156
+ border: none;
157
+ border-radius: var(--ui-radius-sm);
158
+ cursor: pointer;
159
+ color: var(--ui-color-text-muted);
160
+ transition:
161
+ background-color var(--ui-transition-fast),
162
+ color var(--ui-transition-fast);
163
+ line-height: 1;
164
+ }
165
+
166
+ .close-btn:hover {
167
+ background-color: var(--ui-color-surface-sunken);
168
+ color: var(--ui-color-text);
169
+ }
170
+
171
+ .close-btn:focus-visible {
172
+ outline: none;
173
+ box-shadow: var(--ui-focus-ring);
174
+ }
@@ -0,0 +1,228 @@
1
+ /* ── Host wrapper ──────────────────────────────────────────────────────────── */
2
+ .llm-drawer-host {
3
+ display: contents;
4
+ }
5
+
6
+ /* ── Native <dialog> base ──────────────────────────────────────────────────── */
7
+ .llm-drawer-host dialog {
8
+ all: unset;
9
+ position: fixed;
10
+ display: none;
11
+ flex-direction: column;
12
+ background: var(--ui-color-surface);
13
+ box-shadow: var(--ui-shadow-xl, 0 20px 60px rgba(0, 0, 0, 0.3));
14
+ color: var(--ui-color-text);
15
+ overflow: hidden;
16
+ transition:
17
+ transform var(--ui-duration-slow) var(--ui-ease-out, ease-out),
18
+ display var(--ui-duration-slow) allow-discrete,
19
+ overlay var(--ui-duration-slow) allow-discrete;
20
+ }
21
+
22
+ .llm-drawer-host dialog[open] {
23
+ display: flex;
24
+ transform: translate(0, 0) !important;
25
+ }
26
+
27
+ /* ── Backdrop ──────────────────────────────────────────────────────────────── */
28
+ .llm-drawer-host dialog::backdrop {
29
+ background: var(--ui-color-overlay);
30
+ backdrop-filter: blur(2px);
31
+ transition:
32
+ opacity var(--ui-duration-slow) var(--ui-ease-out, ease-out),
33
+ display var(--ui-duration-slow) allow-discrete,
34
+ overlay var(--ui-duration-slow) allow-discrete;
35
+ }
36
+
37
+ @starting-style {
38
+ .llm-drawer-host dialog[open]::backdrop {
39
+ opacity: 0;
40
+ }
41
+ }
42
+
43
+ @media (prefers-color-scheme: dark) {
44
+ .llm-drawer-host dialog::backdrop {
45
+ background: var(--ui-color-overlay);
46
+ }
47
+ }
48
+
49
+ [data-theme='dark'] .llm-drawer-host dialog::backdrop {
50
+ background: var(--ui-color-overlay);
51
+ }
52
+
53
+ /* ── Panel (inner wrapper) ─────────────────────────────────────────────────── */
54
+ .llm-drawer-host .panel {
55
+ display: flex;
56
+ flex-direction: column;
57
+ width: 100%;
58
+ height: 100%;
59
+ overflow: hidden;
60
+ }
61
+
62
+ /* ═══════════════════════════════════════════════════════════════════════════ */
63
+ /* POSITION VARIANTS */
64
+ /* ═══════════════════════════════════════════════════════════════════════════ */
65
+
66
+ /* ── Right ─────────────────────────────────────────────────────────────────── */
67
+ .llm-drawer-host.position-right dialog {
68
+ inset: 0 0 0 auto;
69
+ height: 100dvh;
70
+ transform: translateX(100%);
71
+ }
72
+
73
+ @starting-style {
74
+ .llm-drawer-host.position-right dialog[open] {
75
+ transform: translateX(100%);
76
+ }
77
+ }
78
+
79
+ /* ── Left ──────────────────────────────────────────────────────────────────── */
80
+ .llm-drawer-host.position-left dialog {
81
+ inset: 0 auto 0 0;
82
+ height: 100dvh;
83
+ transform: translateX(-100%);
84
+ }
85
+
86
+ @starting-style {
87
+ .llm-drawer-host.position-left dialog[open] {
88
+ transform: translateX(-100%);
89
+ }
90
+ }
91
+
92
+ /* ── Top ───────────────────────────────────────────────────────────────────── */
93
+ .llm-drawer-host.position-top dialog {
94
+ inset: 0 0 auto 0;
95
+ width: 100vw;
96
+ transform: translateY(-100%);
97
+ }
98
+
99
+ @starting-style {
100
+ .llm-drawer-host.position-top dialog[open] {
101
+ transform: translateY(-100%);
102
+ }
103
+ }
104
+
105
+ /* ── Bottom ────────────────────────────────────────────────────────────────── */
106
+ .llm-drawer-host.position-bottom dialog {
107
+ inset: auto 0 0 0;
108
+ width: 100vw;
109
+ transform: translateY(100%);
110
+ }
111
+
112
+ @starting-style {
113
+ .llm-drawer-host.position-bottom dialog[open] {
114
+ transform: translateY(100%);
115
+ }
116
+ }
117
+
118
+ /* ═══════════════════════════════════════════════════════════════════════════ */
119
+ /* SIZE VARIANTS (left/right = width; top/bottom = height) */
120
+ /* ═══════════════════════════════════════════════════════════════════════════ */
121
+
122
+ /* Left / Right widths */
123
+ .llm-drawer-host.position-right.size-sm dialog,
124
+ .llm-drawer-host.position-left.size-sm dialog {
125
+ width: 20rem;
126
+ }
127
+
128
+ .llm-drawer-host.position-right.size-md dialog,
129
+ .llm-drawer-host.position-left.size-md dialog {
130
+ width: 28rem;
131
+ }
132
+
133
+ .llm-drawer-host.position-right.size-lg dialog,
134
+ .llm-drawer-host.position-left.size-lg dialog {
135
+ width: 40rem;
136
+ }
137
+
138
+ .llm-drawer-host.position-right.size-full dialog,
139
+ .llm-drawer-host.position-left.size-full dialog {
140
+ width: 100vw;
141
+ }
142
+
143
+ /* Top / Bottom heights */
144
+ .llm-drawer-host.position-top.size-sm dialog,
145
+ .llm-drawer-host.position-bottom.size-sm dialog {
146
+ height: 12rem;
147
+ }
148
+
149
+ .llm-drawer-host.position-top.size-md dialog,
150
+ .llm-drawer-host.position-bottom.size-md dialog {
151
+ height: 20rem;
152
+ }
153
+
154
+ .llm-drawer-host.position-top.size-lg dialog,
155
+ .llm-drawer-host.position-bottom.size-lg dialog {
156
+ height: 32rem;
157
+ }
158
+
159
+ .llm-drawer-host.position-top.size-full dialog,
160
+ .llm-drawer-host.position-bottom.size-full dialog {
161
+ height: 100dvh;
162
+ }
163
+
164
+ /* ═══════════════════════════════════════════════════════════════════════════ */
165
+ /* SUB-COMPONENTS */
166
+ /* ═══════════════════════════════════════════════════════════════════════════ */
167
+
168
+ .llm-drawer-header {
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: space-between;
172
+ padding: var(--ui-spacing-5) var(--ui-spacing-6);
173
+ border-bottom: 1px solid var(--ui-color-border);
174
+ font-size: var(--ui-font-size-xl);
175
+ font-weight: 600;
176
+ letter-spacing: var(--ui-letter-spacing-tight);
177
+ color: var(--ui-color-text);
178
+ flex-shrink: 0;
179
+ }
180
+
181
+ .llm-drawer-content {
182
+ display: block;
183
+ padding: var(--ui-spacing-6);
184
+ overflow-y: auto;
185
+ flex: 1;
186
+ color: var(--ui-color-text);
187
+ }
188
+
189
+ .llm-drawer-footer {
190
+ display: flex;
191
+ align-items: center;
192
+ justify-content: flex-end;
193
+ gap: var(--ui-spacing-3);
194
+ padding: var(--ui-spacing-5) var(--ui-spacing-6);
195
+ border-top: 1px solid var(--ui-color-border);
196
+ flex-shrink: 0;
197
+ }
198
+
199
+ /* ── Close button ──────────────────────────────────────────────────────────── */
200
+ .close-btn {
201
+ display: inline-flex;
202
+ align-items: center;
203
+ justify-content: center;
204
+ flex-shrink: 0;
205
+ width: 2rem;
206
+ height: 2rem;
207
+ padding: 0;
208
+ margin-left: var(--ui-spacing-3);
209
+ background: transparent;
210
+ border: none;
211
+ border-radius: var(--ui-radius-sm);
212
+ cursor: pointer;
213
+ color: var(--ui-color-text-muted);
214
+ transition:
215
+ background-color var(--ui-transition-fast),
216
+ color var(--ui-transition-fast);
217
+ line-height: 1;
218
+ }
219
+
220
+ .close-btn:hover {
221
+ background-color: var(--ui-color-surface-sunken);
222
+ color: var(--ui-color-text);
223
+ }
224
+
225
+ .close-btn:focus-visible {
226
+ outline: none;
227
+ box-shadow: var(--ui-focus-ring);
228
+ }
@@ -0,0 +1,29 @@
1
+ .llm-icon {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ font-family: var(--ui-font-family);
6
+ font-weight: var(--ui-font-weight-medium);
7
+ line-height: 1;
8
+ color: currentColor;
9
+ user-select: none;
10
+ flex-shrink: 0;
11
+ }
12
+
13
+ .llm-icon.size-sm {
14
+ width: 1rem;
15
+ height: 1rem;
16
+ font-size: var(--ui-font-size-sm);
17
+ }
18
+
19
+ .llm-icon.size-md {
20
+ width: 1.25rem;
21
+ height: 1.25rem;
22
+ font-size: var(--ui-font-size-md);
23
+ }
24
+
25
+ .llm-icon.size-lg {
26
+ width: 1.5rem;
27
+ height: 1.5rem;
28
+ font-size: var(--ui-font-size-lg);
29
+ }
@@ -0,0 +1,94 @@
1
+ .llm-input {
2
+ display: block;
3
+ font-family: var(--ui-font-family);
4
+ font-size: var(--ui-font-size-md);
5
+ }
6
+
7
+ .llm-input input {
8
+ display: block;
9
+ width: 100%;
10
+ min-height: 2.5rem;
11
+ padding: 0.625rem var(--ui-spacing-4);
12
+ font-size: inherit;
13
+ font-family: inherit;
14
+ line-height: var(--ui-line-height-normal);
15
+ color: var(--ui-color-text);
16
+ background-color: var(--ui-color-input-bg);
17
+ border: 1px solid var(--ui-color-input-border);
18
+ border-radius: var(--ui-radius-md);
19
+ transition: border-color var(--ui-transition-fast),
20
+ box-shadow var(--ui-transition-fast),
21
+ background-color var(--ui-transition-fast);
22
+ outline: none;
23
+ box-sizing: border-box;
24
+ }
25
+
26
+ .llm-input input::placeholder {
27
+ color: var(--ui-color-placeholder);
28
+ }
29
+
30
+ .llm-input input:hover:not(:disabled):not(:read-only) {
31
+ border-color: var(--ui-color-input-border-hover);
32
+ }
33
+
34
+ .llm-input input:focus {
35
+ border-color: var(--ui-color-input-border-focus);
36
+ background-color: var(--ui-color-input-bg-focus);
37
+ box-shadow: var(--ui-focus-ring);
38
+ }
39
+
40
+ .llm-input .input-field {
41
+ position: relative;
42
+ }
43
+
44
+ /* Invalid state */
45
+ .llm-input.is-invalid input {
46
+ border-color: var(--ui-color-input-border-invalid);
47
+ padding-right: 2.25rem;
48
+ }
49
+
50
+ .llm-input.is-invalid input:focus {
51
+ border-color: var(--ui-color-input-border-invalid);
52
+ box-shadow: 0 0 0 2px var(--ui-color-surface), 0 0 0 4px var(--ui-color-danger);
53
+ }
54
+
55
+ /* Non-color invalid indicator (WCAG 1.4.1) */
56
+ .llm-input.is-invalid .input-field::before {
57
+ content: '✕';
58
+ position: absolute;
59
+ top: 50%;
60
+ transform: translateY(-50%);
61
+ right: 0.875rem;
62
+ color: var(--ui-color-danger);
63
+ font-weight: 700;
64
+ line-height: 1;
65
+ pointer-events: none;
66
+ }
67
+
68
+ /* Disabled state */
69
+ .llm-input.is-disabled {
70
+ opacity: var(--ui-opacity-disabled);
71
+ cursor: not-allowed;
72
+ }
73
+
74
+ .llm-input.is-disabled input {
75
+ cursor: not-allowed;
76
+ }
77
+
78
+ /* Readonly state */
79
+ .llm-input.is-readonly input {
80
+ background-color: var(--ui-color-surface-sunken);
81
+ cursor: default;
82
+ }
83
+
84
+ /* Error messages */
85
+ .llm-input .errors {
86
+ margin-top: var(--ui-spacing-2);
87
+ }
88
+
89
+ .llm-input .error-message {
90
+ margin: 0;
91
+ font-size: var(--ui-font-size-sm);
92
+ color: var(--ui-color-error-text);
93
+ line-height: var(--ui-line-height-normal);
94
+ }