@codemieai/code 0.0.55 → 0.0.57

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 (111) hide show
  1. package/README.md +28 -0
  2. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  3. package/dist/agents/core/AgentCLI.js +27 -2
  4. package/dist/agents/core/AgentCLI.js.map +1 -1
  5. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  6. package/dist/agents/core/BaseAgentAdapter.js +20 -6
  7. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  8. package/dist/agents/core/session/ensure-session.d.ts.map +1 -1
  9. package/dist/agents/core/session/ensure-session.js +7 -2
  10. package/dist/agents/core/session/ensure-session.js.map +1 -1
  11. package/dist/agents/core/session/types.d.ts +1 -0
  12. package/dist/agents/core/session/types.d.ts.map +1 -1
  13. package/dist/agents/plugins/claude/claude.plugin.js +4 -4
  14. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  15. package/dist/agents/plugins/claude/plugin/.claude-plugin/plugin.json +1 -1
  16. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/SKILL.md +273 -0
  17. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/style-guide/css/base.css +166 -0
  18. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/style-guide/css/buttons.css +253 -0
  19. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/style-guide/css/components.css +605 -0
  20. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/style-guide/css/forms.css +550 -0
  21. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/style-guide/css/layout.css +410 -0
  22. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/style-guide/css/tokens.css +323 -0
  23. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/style-guide/css/typography.css +155 -0
  24. package/dist/agents/plugins/claude/plugin/skills/codemie-html-report/style-guide/css/utilities.css +238 -0
  25. package/dist/agents/plugins/claude/plugin/skills/msgraph/SKILL.md +10 -8
  26. package/dist/agents/plugins/claude/plugin/skills/msgraph/scripts/msgraph.js +298 -149
  27. package/dist/cli/commands/hook.d.ts +2 -0
  28. package/dist/cli/commands/hook.d.ts.map +1 -1
  29. package/dist/cli/commands/hook.js +36 -31
  30. package/dist/cli/commands/hook.js.map +1 -1
  31. package/dist/cli/commands/setup.js +11 -1
  32. package/dist/cli/commands/setup.js.map +1 -1
  33. package/dist/providers/core/codemie-auth-helpers.d.ts +22 -0
  34. package/dist/providers/core/codemie-auth-helpers.d.ts.map +1 -0
  35. package/dist/providers/core/codemie-auth-helpers.js +118 -0
  36. package/dist/providers/core/codemie-auth-helpers.js.map +1 -0
  37. package/dist/providers/core/index.d.ts +1 -0
  38. package/dist/providers/core/index.d.ts.map +1 -1
  39. package/dist/providers/core/index.js +1 -0
  40. package/dist/providers/core/index.js.map +1 -1
  41. package/dist/providers/core/types.d.ts +4 -0
  42. package/dist/providers/core/types.d.ts.map +1 -1
  43. package/dist/providers/core/types.js.map +1 -1
  44. package/dist/providers/index.d.ts +2 -0
  45. package/dist/providers/index.d.ts.map +1 -1
  46. package/dist/providers/index.js +2 -0
  47. package/dist/providers/index.js.map +1 -1
  48. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.auth.d.ts +11 -0
  49. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.auth.d.ts.map +1 -0
  50. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.auth.js +30 -0
  51. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.auth.js.map +1 -0
  52. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.d.ts +8 -0
  53. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.d.ts.map +1 -0
  54. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.js +88 -0
  55. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.js.map +1 -0
  56. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.d.ts +11 -0
  57. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.d.ts.map +1 -0
  58. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js +119 -0
  59. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js.map +1 -0
  60. package/dist/providers/plugins/anthropic-subscription/index.d.ts +9 -0
  61. package/dist/providers/plugins/anthropic-subscription/index.d.ts.map +1 -0
  62. package/dist/providers/plugins/anthropic-subscription/index.js +9 -0
  63. package/dist/providers/plugins/anthropic-subscription/index.js.map +1 -0
  64. package/dist/providers/plugins/jwt/jwt.setup-steps.js +1 -1
  65. package/dist/providers/plugins/jwt/jwt.setup-steps.js.map +1 -1
  66. package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.d.ts +30 -0
  67. package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.d.ts.map +1 -0
  68. package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.js +111 -0
  69. package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.js.map +1 -0
  70. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +2 -1
  71. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
  72. package/dist/providers/plugins/sso/proxy/plugins/index.js +3 -1
  73. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  74. package/dist/providers/plugins/sso/proxy/plugins/sso.session-sync.plugin.d.ts.map +1 -1
  75. package/dist/providers/plugins/sso/proxy/plugins/sso.session-sync.plugin.js +9 -7
  76. package/dist/providers/plugins/sso/proxy/plugins/sso.session-sync.plugin.js.map +1 -1
  77. package/dist/providers/plugins/sso/proxy/plugins/types.d.ts +1 -0
  78. package/dist/providers/plugins/sso/proxy/plugins/types.d.ts.map +1 -1
  79. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts +2 -0
  80. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts.map +1 -1
  81. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  82. package/dist/providers/plugins/sso/proxy/sso.proxy.js +10 -0
  83. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  84. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js +1 -1
  85. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js.map +1 -1
  86. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.d.ts +2 -2
  87. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.d.ts.map +1 -1
  88. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.js +4 -4
  89. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.js.map +1 -1
  90. package/dist/providers/plugins/sso/sso.auth.d.ts +0 -4
  91. package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
  92. package/dist/providers/plugins/sso/sso.auth.js +3 -13
  93. package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
  94. package/dist/providers/plugins/sso/sso.http-client.d.ts +3 -42
  95. package/dist/providers/plugins/sso/sso.http-client.d.ts.map +1 -1
  96. package/dist/providers/plugins/sso/sso.http-client.js +4 -75
  97. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
  98. package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -1
  99. package/dist/providers/plugins/sso/sso.setup-steps.js +15 -66
  100. package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -1
  101. package/dist/providers/plugins/sso/sso.template.d.ts.map +1 -1
  102. package/dist/providers/plugins/sso/sso.template.js +2 -1
  103. package/dist/providers/plugins/sso/sso.template.js.map +1 -1
  104. package/dist/utils/config.d.ts.map +1 -1
  105. package/dist/utils/config.js +17 -0
  106. package/dist/utils/config.js.map +1 -1
  107. package/dist/utils/processes.d.ts +9 -0
  108. package/dist/utils/processes.d.ts.map +1 -1
  109. package/dist/utils/processes.js +21 -0
  110. package/dist/utils/processes.js.map +1 -1
  111. package/package.json +3 -3
@@ -0,0 +1,550 @@
1
+ /**
2
+ * CodeMie Form Components
3
+ * Input, Textarea, Select, Checkbox, Radio, Switch.
4
+ */
5
+
6
+ /* ============================================================
7
+ FORM GROUP (field wrapper)
8
+ ============================================================ */
9
+ .form-group {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--space-1);
13
+ }
14
+
15
+ /* ============================================================
16
+ LABEL
17
+ ============================================================ */
18
+ .form-label {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: var(--space-0-5);
22
+ font-size: var(--text-xs);
23
+ font-weight: 500;
24
+ color: var(--color-text-muted);
25
+ }
26
+
27
+ .form-label .required {
28
+ color: var(--color-error);
29
+ margin-left: 1px;
30
+ }
31
+
32
+ /* ============================================================
33
+ INPUT
34
+ ============================================================ */
35
+ .input-wrapper {
36
+ display: flex;
37
+ align-items: stretch;
38
+ min-height: 32px;
39
+ max-height: 32px;
40
+ border: 1px solid var(--color-border-primary);
41
+ border-radius: var(--radius-lg);
42
+ background-color: var(--color-bg-input);
43
+ transition:
44
+ border-color var(--transition-base),
45
+ box-shadow var(--transition-base);
46
+ overflow: hidden;
47
+ }
48
+
49
+ .input-wrapper:hover:not(.input-disabled) {
50
+ border-color: var(--color-border-secondary);
51
+ }
52
+
53
+ .input-wrapper:focus-within:not(.input-disabled) {
54
+ border-color: var(--color-border-secondary);
55
+ }
56
+
57
+ .input-wrapper.input-error {
58
+ border-color: var(--color-border-error);
59
+ }
60
+
61
+ .input-wrapper.input-disabled {
62
+ opacity: 0.6;
63
+ cursor: not-allowed;
64
+ }
65
+
66
+ /* The actual <input> inside wrapper */
67
+ .form-input {
68
+ flex: 1;
69
+ background: transparent;
70
+ border: none;
71
+ outline: none;
72
+ font-family: var(--font-sans);
73
+ font-size: var(--text-sm);
74
+ color: var(--color-text-primary);
75
+ padding: 0 var(--space-2);
76
+ min-width: 0;
77
+ }
78
+
79
+ .form-input::placeholder {
80
+ color: var(--color-text-placeholder);
81
+ }
82
+
83
+ .form-input:disabled {
84
+ cursor: not-allowed;
85
+ }
86
+
87
+ /* Standalone input (no wrapper needed) */
88
+ input.input,
89
+ .input {
90
+ display: block;
91
+ width: 100%;
92
+ height: 32px;
93
+ padding: 0 var(--space-2);
94
+ background-color: var(--color-bg-input);
95
+ border: 1px solid var(--color-border-primary);
96
+ border-radius: var(--radius-lg);
97
+ font-family: var(--font-sans);
98
+ font-size: var(--text-sm);
99
+ color: var(--color-text-primary);
100
+ outline: none;
101
+ transition: border-color var(--transition-base);
102
+ }
103
+
104
+ input.input::placeholder,
105
+ .input::placeholder {
106
+ color: var(--color-text-placeholder);
107
+ }
108
+
109
+ input.input:hover,
110
+ .input:hover {
111
+ border-color: var(--color-border-secondary);
112
+ }
113
+
114
+ input.input:focus,
115
+ .input:focus {
116
+ border-color: var(--color-border-secondary);
117
+ }
118
+
119
+ input.input.input-error,
120
+ .input.input-error {
121
+ border-color: var(--color-border-error);
122
+ }
123
+
124
+ input.input:disabled,
125
+ .input:disabled {
126
+ opacity: 0.6;
127
+ cursor: not-allowed;
128
+ }
129
+
130
+ /* Sizes */
131
+ .input-lg {
132
+ height: 40px;
133
+ font-size: var(--text-base);
134
+ padding: 0 var(--space-3);
135
+ }
136
+
137
+ /* Input prefix / suffix labels */
138
+ .input-prefix,
139
+ .input-suffix {
140
+ display: flex;
141
+ align-items: center;
142
+ padding: 0 var(--space-2);
143
+ font-size: var(--text-xs);
144
+ color: var(--color-text-tertiary);
145
+ background-color: var(--color-bg-input-prefix);
146
+ white-space: nowrap;
147
+ flex-shrink: 0;
148
+ border-right: 1px solid var(--color-border-subtle);
149
+ }
150
+
151
+ .input-suffix {
152
+ border-right: none;
153
+ border-left: 1px solid var(--color-border-subtle);
154
+ }
155
+
156
+ .input-adornment {
157
+ display: flex;
158
+ align-items: center;
159
+ padding: 0 var(--space-2);
160
+ color: var(--color-icon-tertiary);
161
+ flex-shrink: 0;
162
+ }
163
+
164
+ /* ============================================================
165
+ TEXTAREA
166
+ ============================================================ */
167
+ textarea.textarea,
168
+ .textarea {
169
+ display: block;
170
+ width: 100%;
171
+ min-height: 80px;
172
+ max-height: 384px; /* max-h-96 */
173
+ padding: var(--space-2-5) var(--space-3);
174
+ background-color: var(--color-bg-input);
175
+ border: 1px solid var(--color-border-primary);
176
+ border-radius: var(--radius-lg);
177
+ font-family: var(--font-sans);
178
+ font-size: var(--text-sm);
179
+ color: var(--color-text-primary);
180
+ outline: none;
181
+ resize: vertical;
182
+ line-height: 1.5;
183
+ transition: border-color var(--transition-base);
184
+ }
185
+
186
+ textarea.textarea::placeholder,
187
+ .textarea::placeholder {
188
+ color: var(--color-text-placeholder);
189
+ }
190
+
191
+ textarea.textarea:hover,
192
+ .textarea:hover {
193
+ border-color: var(--color-border-secondary);
194
+ }
195
+
196
+ textarea.textarea:focus,
197
+ .textarea:focus {
198
+ border-color: var(--color-border-secondary);
199
+ }
200
+
201
+ textarea.textarea.textarea-error,
202
+ .textarea.textarea-error {
203
+ border-color: var(--color-border-error);
204
+ }
205
+
206
+ textarea.textarea:disabled,
207
+ .textarea:disabled {
208
+ background-color: var(--color-bg-secondary);
209
+ color: var(--color-text-tertiary);
210
+ cursor: not-allowed;
211
+ opacity: 0.7;
212
+ }
213
+
214
+ /* ============================================================
215
+ SELECT
216
+ ============================================================ */
217
+ .select-trigger {
218
+ display: flex;
219
+ align-items: center;
220
+ justify-content: space-between;
221
+ height: 32px;
222
+ padding: 0 var(--space-2);
223
+ background-color: var(--color-bg-input);
224
+ border: 1px solid var(--color-border-primary);
225
+ border-radius: var(--radius-lg);
226
+ font-family: var(--font-sans);
227
+ font-size: var(--text-sm);
228
+ color: var(--color-text-primary);
229
+ cursor: pointer;
230
+ user-select: none;
231
+ transition: border-color var(--transition-base);
232
+ gap: var(--space-2);
233
+ }
234
+
235
+ .select-trigger:hover {
236
+ border-color: var(--color-border-secondary);
237
+ }
238
+
239
+ .select-trigger.select-open {
240
+ border-color: var(--color-border-secondary);
241
+ }
242
+
243
+ .select-trigger .select-arrow {
244
+ color: var(--color-icon-tertiary);
245
+ flex-shrink: 0;
246
+ transition: transform var(--transition-base);
247
+ }
248
+
249
+ .select-trigger.select-open .select-arrow {
250
+ transform: rotate(180deg);
251
+ }
252
+
253
+ /* Native select fallback */
254
+ select.select {
255
+ display: block;
256
+ width: 100%;
257
+ height: 32px;
258
+ padding: 0 var(--space-2);
259
+ background-color: var(--color-bg-input);
260
+ border: 1px solid var(--color-border-primary);
261
+ border-radius: var(--radius-lg);
262
+ font-family: var(--font-sans);
263
+ font-size: var(--text-sm);
264
+ color: var(--color-text-primary);
265
+ outline: none;
266
+ cursor: pointer;
267
+ appearance: none;
268
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
269
+ background-repeat: no-repeat;
270
+ background-position: right 8px center;
271
+ padding-right: 28px;
272
+ }
273
+
274
+ select.select:hover {
275
+ border-color: var(--color-border-secondary);
276
+ }
277
+
278
+ select.select:focus {
279
+ border-color: var(--color-border-secondary);
280
+ }
281
+
282
+ /* Dropdown panel */
283
+ .select-panel {
284
+ position: absolute;
285
+ z-index: var(--z-dropdown);
286
+ min-width: 160px;
287
+ max-width: 256px;
288
+ margin-top: var(--space-2);
289
+ padding: var(--space-1-5);
290
+ background-color: var(--color-bg-elevated);
291
+ border: 1px solid var(--color-border-panel);
292
+ border-radius: var(--radius-lg);
293
+ box-shadow: var(--shadow-md);
294
+ max-height: 240px;
295
+ overflow-y: auto;
296
+ }
297
+
298
+ .select-option {
299
+ display: block;
300
+ padding: var(--space-1-5) var(--space-2-5);
301
+ font-size: var(--text-sm);
302
+ color: var(--color-text-primary);
303
+ border-radius: var(--radius-md);
304
+ cursor: pointer;
305
+ transition: background-color var(--transition-fast);
306
+ white-space: nowrap;
307
+ overflow: hidden;
308
+ text-overflow: ellipsis;
309
+ }
310
+
311
+ .select-option:hover {
312
+ background-color: var(--color-bg-hover-strong);
313
+ }
314
+
315
+ .select-option.selected {
316
+ background-color: var(--color-bg-hover);
317
+ font-weight: 500;
318
+ }
319
+
320
+ /* ============================================================
321
+ CHECKBOX
322
+ ============================================================ */
323
+ .checkbox-wrapper {
324
+ display: inline-flex;
325
+ align-items: center;
326
+ gap: var(--space-2);
327
+ cursor: pointer;
328
+ user-select: none;
329
+ }
330
+
331
+ .checkbox-wrapper input[type='checkbox'] {
332
+ position: absolute;
333
+ opacity: 0;
334
+ width: 0;
335
+ height: 0;
336
+ }
337
+
338
+ .checkbox-box {
339
+ display: flex;
340
+ align-items: center;
341
+ justify-content: center;
342
+ width: 20px;
343
+ height: 20px;
344
+ flex-shrink: 0;
345
+ border-radius: var(--radius-md);
346
+ border: 2px solid var(--color-border-primary);
347
+ background-color: var(--color-bg-elevated);
348
+ transition:
349
+ border-color var(--transition-fast),
350
+ background-color var(--transition-fast);
351
+ }
352
+
353
+ .checkbox-wrapper:hover .checkbox-box {
354
+ border-color: var(--color-border-secondary);
355
+ }
356
+
357
+ .checkbox-wrapper input[type='checkbox']:checked + .checkbox-box {
358
+ border-color: var(--color-text-primary);
359
+ background-color: var(--color-text-primary);
360
+ }
361
+
362
+ .checkbox-check {
363
+ display: none;
364
+ width: 12px;
365
+ height: 12px;
366
+ color: var(--color-bg-page);
367
+ }
368
+
369
+ .checkbox-wrapper input[type='checkbox']:checked + .checkbox-box .checkbox-check {
370
+ display: block;
371
+ }
372
+
373
+ .checkbox-label {
374
+ font-size: var(--text-sm);
375
+ color: var(--color-text-primary);
376
+ }
377
+
378
+ .checkbox-wrapper.disabled {
379
+ opacity: 0.6;
380
+ cursor: not-allowed;
381
+ pointer-events: none;
382
+ }
383
+
384
+ /* ============================================================
385
+ RADIO
386
+ ============================================================ */
387
+ .radio-wrapper {
388
+ display: inline-flex;
389
+ align-items: center;
390
+ gap: var(--space-2);
391
+ cursor: pointer;
392
+ user-select: none;
393
+ }
394
+
395
+ .radio-wrapper input[type='radio'] {
396
+ position: absolute;
397
+ opacity: 0;
398
+ width: 0;
399
+ height: 0;
400
+ }
401
+
402
+ .radio-dot {
403
+ display: flex;
404
+ align-items: center;
405
+ justify-content: center;
406
+ width: 18px;
407
+ height: 18px;
408
+ flex-shrink: 0;
409
+ border-radius: var(--radius-full);
410
+ border: 2px solid var(--color-border-primary);
411
+ background-color: var(--color-bg-elevated);
412
+ transition:
413
+ border-color var(--transition-fast),
414
+ background-color var(--transition-fast);
415
+ }
416
+
417
+ .radio-dot::after {
418
+ content: '';
419
+ width: 8px;
420
+ height: 8px;
421
+ border-radius: var(--radius-full);
422
+ background-color: var(--color-bg-page);
423
+ opacity: 0;
424
+ transition: opacity var(--transition-fast);
425
+ }
426
+
427
+ .radio-wrapper:hover .radio-dot {
428
+ border-color: var(--color-border-secondary);
429
+ }
430
+
431
+ .radio-wrapper input[type='radio']:checked + .radio-dot {
432
+ border-color: var(--color-text-primary);
433
+ background-color: var(--color-text-primary);
434
+ }
435
+
436
+ .radio-wrapper input[type='radio']:checked + .radio-dot::after {
437
+ opacity: 1;
438
+ }
439
+
440
+ .radio-label {
441
+ font-size: var(--text-sm);
442
+ color: var(--color-text-primary);
443
+ }
444
+
445
+ /* ============================================================
446
+ SWITCH (Toggle)
447
+ ============================================================ */
448
+ .switch-wrapper {
449
+ display: inline-flex;
450
+ align-items: center;
451
+ gap: var(--space-2);
452
+ cursor: pointer;
453
+ user-select: none;
454
+ }
455
+
456
+ .switch-wrapper input[type='checkbox'] {
457
+ position: absolute;
458
+ opacity: 0;
459
+ width: 0;
460
+ height: 0;
461
+ }
462
+
463
+ .switch-track {
464
+ position: relative;
465
+ width: 32px;
466
+ height: 16px;
467
+ border-radius: var(--radius-full);
468
+ background: var(--gradient-switch-off);
469
+ border: 1px solid var(--color-border-primary);
470
+ transition:
471
+ background var(--transition-base),
472
+ border-color var(--transition-base);
473
+ flex-shrink: 0;
474
+ }
475
+
476
+ .switch-wrapper input[type='checkbox']:checked + .switch-track {
477
+ background: var(--gradient-switch-on);
478
+ border-color: var(--color-border-accent);
479
+ }
480
+
481
+ .switch-knob {
482
+ position: absolute;
483
+ top: 1px;
484
+ left: 2px;
485
+ width: 12px;
486
+ height: 12px;
487
+ border-radius: var(--radius-full);
488
+ background-color: #CCCCCC;
489
+ transition: transform var(--transition-base), background-color var(--transition-base);
490
+ pointer-events: none;
491
+ }
492
+
493
+ .switch-wrapper input[type='checkbox']:checked ~ .switch-track .switch-knob {
494
+ transform: translateX(16px);
495
+ background-color: #FFFFFF;
496
+ }
497
+
498
+ /* Alternative pure CSS switch using :has() or JS class */
499
+ .switch-track.switch-on .switch-knob {
500
+ transform: translateX(16px);
501
+ background-color: #FFFFFF;
502
+ }
503
+
504
+ .switch-label {
505
+ font-size: var(--text-xs);
506
+ color: var(--color-text-muted);
507
+ transition: color var(--transition-fast);
508
+ }
509
+
510
+ .switch-wrapper:hover .switch-label {
511
+ color: var(--color-border-accent);
512
+ }
513
+
514
+ /* ============================================================
515
+ FORM ERROR / HELPER TEXT
516
+ ============================================================ */
517
+ .form-error {
518
+ font-size: var(--text-sm);
519
+ color: var(--color-error-text);
520
+ display: flex;
521
+ align-items: center;
522
+ gap: var(--space-1);
523
+ margin-top: var(--space-0-5);
524
+ }
525
+
526
+ .form-helper {
527
+ font-size: var(--text-xs);
528
+ color: var(--color-text-muted);
529
+ margin-top: var(--space-0-5);
530
+ }
531
+
532
+ /* ============================================================
533
+ SEARCH INPUT
534
+ ============================================================ */
535
+ .search-input-wrapper {
536
+ position: relative;
537
+ display: flex;
538
+ align-items: center;
539
+ }
540
+
541
+ .search-input-wrapper .search-icon {
542
+ position: absolute;
543
+ left: var(--space-2);
544
+ color: var(--color-icon-tertiary);
545
+ pointer-events: none;
546
+ }
547
+
548
+ .search-input-wrapper input {
549
+ padding-left: 28px;
550
+ }