@intentai/react 1.0.2 → 2.0.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.
@@ -0,0 +1,1047 @@
1
+ /**
2
+ * Premium Voice Widget Styles
3
+ * Version: 2.0
4
+ *
5
+ * A premium, glassmorphic design system for the Intent AI voice feedback widget.
6
+ * Features organic animations, smart contextual awareness, and delightful micro-interactions.
7
+ */
8
+
9
+ /* ============================================================================
10
+ CSS CUSTOM PROPERTIES (DESIGN TOKENS)
11
+ ============================================================================ */
12
+
13
+ @layer widget-tokens {
14
+ .fiq-premium-widget {
15
+ /* -------------------------------------------------------------------------
16
+ COLOR PALETTE
17
+ ------------------------------------------------------------------------- */
18
+
19
+ /* Primary - Emerald */
20
+ --widget-primary: #10b981;
21
+ --widget-primary-hover: #059669;
22
+ --widget-primary-light: #34d399;
23
+ --widget-primary-dark: #047857;
24
+ --widget-primary-glow: rgba(16, 185, 129, 0.4);
25
+ --widget-primary-subtle: rgba(16, 185, 129, 0.1);
26
+
27
+ /* Accent - Cyan */
28
+ --widget-accent: #22d3d3;
29
+ --widget-accent-light: #67e8f9;
30
+ --widget-accent-dark: #0891b2;
31
+ --widget-accent-glow: rgba(34, 211, 211, 0.3);
32
+
33
+ /* Glass Surfaces (Dark Theme) */
34
+ --widget-glass-bg: rgba(24, 24, 27, 0.85);
35
+ --widget-glass-bg-solid: #18181b;
36
+ --widget-glass-border: rgba(63, 63, 70, 0.5);
37
+ --widget-glass-border-hover: rgba(63, 63, 70, 0.8);
38
+ --widget-glass-highlight: rgba(255, 255, 255, 0.05);
39
+ --widget-glass-shadow: rgba(0, 0, 0, 0.5);
40
+
41
+ /* Recording State */
42
+ --widget-recording: #ef4444;
43
+ --widget-recording-dark: #dc2626;
44
+ --widget-recording-glow: rgba(239, 68, 68, 0.4);
45
+ --widget-recording-pulse: rgba(239, 68, 68, 0.2);
46
+
47
+ /* Success State */
48
+ --widget-success: #22c55e;
49
+ --widget-success-dark: #16a34a;
50
+ --widget-success-glow: rgba(34, 197, 94, 0.4);
51
+
52
+ /* Error State */
53
+ --widget-error: #ef4444;
54
+ --widget-error-glow: rgba(239, 68, 68, 0.4);
55
+
56
+ /* Warning State */
57
+ --widget-warning: #f59e0b;
58
+ --widget-warning-glow: rgba(245, 158, 11, 0.4);
59
+
60
+ /* Emotional States */
61
+ --widget-frustrated: #f97316;
62
+ --widget-delighted: #eab308;
63
+ --widget-confused: #8b5cf6;
64
+ --widget-neutral: #6b7280;
65
+
66
+ /* Text Colors */
67
+ --widget-text-primary: #fafafa;
68
+ --widget-text-secondary: #a1a1aa;
69
+ --widget-text-muted: #71717a;
70
+ --widget-text-disabled: #52525b;
71
+ --widget-text-inverse: #18181b;
72
+
73
+ /* -------------------------------------------------------------------------
74
+ SPACING SCALE (8px base)
75
+ ------------------------------------------------------------------------- */
76
+ --widget-space-1: 4px;
77
+ --widget-space-2: 8px;
78
+ --widget-space-3: 12px;
79
+ --widget-space-4: 16px;
80
+ --widget-space-5: 20px;
81
+ --widget-space-6: 24px;
82
+ --widget-space-8: 32px;
83
+ --widget-space-10: 40px;
84
+ --widget-space-12: 48px;
85
+
86
+ /* -------------------------------------------------------------------------
87
+ TYPOGRAPHY
88
+ ------------------------------------------------------------------------- */
89
+ --widget-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
90
+ --widget-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
91
+
92
+ --widget-font-size-xs: 11px;
93
+ --widget-font-size-sm: 13px;
94
+ --widget-font-size-md: 15px;
95
+ --widget-font-size-lg: 18px;
96
+ --widget-font-size-xl: 22px;
97
+ --widget-font-size-2xl: 28px;
98
+ --widget-font-size-3xl: 36px;
99
+
100
+ --widget-line-height-tight: 1.2;
101
+ --widget-line-height-normal: 1.5;
102
+ --widget-line-height-relaxed: 1.7;
103
+
104
+ --widget-font-weight-normal: 400;
105
+ --widget-font-weight-medium: 500;
106
+ --widget-font-weight-semibold: 600;
107
+ --widget-font-weight-bold: 700;
108
+
109
+ /* -------------------------------------------------------------------------
110
+ BORDER RADIUS
111
+ ------------------------------------------------------------------------- */
112
+ --widget-radius-sm: 6px;
113
+ --widget-radius-md: 10px;
114
+ --widget-radius-lg: 14px;
115
+ --widget-radius-xl: 20px;
116
+ --widget-radius-2xl: 28px;
117
+ --widget-radius-full: 9999px;
118
+
119
+ /* -------------------------------------------------------------------------
120
+ SHADOWS
121
+ ------------------------------------------------------------------------- */
122
+ --widget-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
123
+ --widget-shadow-md: 0 4px 12px -2px rgba(0, 0, 0, 0.4);
124
+ --widget-shadow-lg: 0 12px 24px -4px rgba(0, 0, 0, 0.5);
125
+ --widget-shadow-xl: 0 20px 40px -8px rgba(0, 0, 0, 0.6);
126
+ --widget-shadow-glow: 0 0 40px -10px var(--widget-primary-glow);
127
+ --widget-shadow-glow-lg: 0 0 60px -5px var(--widget-primary-glow);
128
+ --widget-shadow-recording: 0 0 50px -5px var(--widget-recording-glow);
129
+
130
+ /* -------------------------------------------------------------------------
131
+ TRANSITIONS & ANIMATIONS
132
+ ------------------------------------------------------------------------- */
133
+ --widget-duration-instant: 50ms;
134
+ --widget-duration-fast: 150ms;
135
+ --widget-duration-normal: 250ms;
136
+ --widget-duration-slow: 400ms;
137
+ --widget-duration-slower: 600ms;
138
+
139
+ --widget-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
140
+ --widget-ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);
141
+ --widget-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
142
+ --widget-ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
143
+
144
+ /* -------------------------------------------------------------------------
145
+ Z-INDEX LAYERS
146
+ ------------------------------------------------------------------------- */
147
+ --widget-z-base: 2147483640;
148
+ --widget-z-modal: 2147483641;
149
+ --widget-z-tooltip: 2147483642;
150
+ --widget-z-notification: 2147483643;
151
+ }
152
+
153
+ /* Light theme overrides */
154
+ .fiq-premium-widget[data-theme='light'] {
155
+ --widget-glass-bg: rgba(255, 255, 255, 0.9);
156
+ --widget-glass-bg-solid: #ffffff;
157
+ --widget-glass-border: rgba(0, 0, 0, 0.1);
158
+ --widget-glass-border-hover: rgba(0, 0, 0, 0.2);
159
+ --widget-glass-highlight: rgba(0, 0, 0, 0.02);
160
+ --widget-glass-shadow: rgba(0, 0, 0, 0.15);
161
+
162
+ --widget-text-primary: #18181b;
163
+ --widget-text-secondary: #52525b;
164
+ --widget-text-muted: #71717a;
165
+ --widget-text-disabled: #a1a1aa;
166
+ --widget-text-inverse: #fafafa;
167
+ }
168
+ }
169
+
170
+ /* ============================================================================
171
+ BASE STYLES
172
+ ============================================================================ */
173
+
174
+ @layer widget-base {
175
+ .fiq-premium-widget {
176
+ font-family: var(--widget-font-family);
177
+ font-size: var(--widget-font-size-md);
178
+ line-height: var(--widget-line-height-normal);
179
+ color: var(--widget-text-primary);
180
+ -webkit-font-smoothing: antialiased;
181
+ -moz-osx-font-smoothing: grayscale;
182
+ }
183
+
184
+ .fiq-premium-widget *,
185
+ .fiq-premium-widget *::before,
186
+ .fiq-premium-widget *::after {
187
+ box-sizing: border-box;
188
+ margin: 0;
189
+ padding: 0;
190
+ }
191
+
192
+ .fiq-premium-widget button {
193
+ font-family: inherit;
194
+ font-size: inherit;
195
+ cursor: pointer;
196
+ border: none;
197
+ background: none;
198
+ color: inherit;
199
+ }
200
+
201
+ .fiq-premium-widget button:disabled {
202
+ cursor: not-allowed;
203
+ }
204
+
205
+ /* Focus styles */
206
+ .fiq-premium-widget *:focus-visible {
207
+ outline: 2px solid var(--widget-primary);
208
+ outline-offset: 2px;
209
+ }
210
+
211
+ .fiq-premium-widget button:focus-visible {
212
+ border-radius: var(--widget-radius-md);
213
+ }
214
+ }
215
+
216
+ /* ============================================================================
217
+ TRIGGER BUTTON
218
+ ============================================================================ */
219
+
220
+ @layer widget-trigger {
221
+ .fiq-trigger {
222
+ position: relative;
223
+ width: 56px;
224
+ height: 56px;
225
+ border-radius: var(--widget-radius-full);
226
+ background: var(--widget-glass-bg);
227
+ backdrop-filter: blur(20px) saturate(180%);
228
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
229
+ border: 1px solid var(--widget-glass-border);
230
+ box-shadow:
231
+ inset 0 0 0 1px var(--widget-glass-highlight),
232
+ var(--widget-shadow-lg),
233
+ var(--widget-shadow-glow);
234
+ transition:
235
+ transform var(--widget-duration-normal) var(--widget-ease-out-back),
236
+ box-shadow var(--widget-duration-normal) var(--widget-ease-out);
237
+ display: flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ }
241
+
242
+ .fiq-trigger:hover {
243
+ transform: scale(1.08);
244
+ box-shadow:
245
+ inset 0 0 0 1px var(--widget-glass-highlight),
246
+ var(--widget-shadow-xl),
247
+ var(--widget-shadow-glow-lg);
248
+ }
249
+
250
+ .fiq-trigger:active {
251
+ transform: scale(0.95);
252
+ }
253
+
254
+ /* Inner gradient ring */
255
+ .fiq-trigger::before {
256
+ content: '';
257
+ position: absolute;
258
+ inset: 3px;
259
+ border-radius: var(--widget-radius-full);
260
+ background: linear-gradient(
261
+ 135deg,
262
+ var(--widget-primary) 0%,
263
+ var(--widget-accent) 100%
264
+ );
265
+ opacity: 0.9;
266
+ transition: opacity var(--widget-duration-fast);
267
+ }
268
+
269
+ .fiq-trigger:hover::before {
270
+ opacity: 1;
271
+ }
272
+
273
+ /* Breathing ring */
274
+ .fiq-breathing-ring {
275
+ position: absolute;
276
+ inset: -8px;
277
+ border-radius: var(--widget-radius-full);
278
+ background: radial-gradient(
279
+ circle,
280
+ var(--widget-primary-glow) 0%,
281
+ transparent 70%
282
+ );
283
+ pointer-events: none;
284
+ animation: breathe 4s ease-in-out infinite;
285
+ }
286
+
287
+ @keyframes breathe {
288
+ 0%, 100% {
289
+ opacity: 0.5;
290
+ transform: scale(1);
291
+ }
292
+ 50% {
293
+ opacity: 0.8;
294
+ transform: scale(1.15);
295
+ }
296
+ }
297
+
298
+ /* Icon container */
299
+ .fiq-trigger-icon {
300
+ position: relative;
301
+ z-index: 1;
302
+ color: white;
303
+ }
304
+
305
+ /* Scroll-aware states */
306
+ .fiq-trigger[data-scroll='scrolling'] {
307
+ transform: scale(0.85);
308
+ opacity: 0.3;
309
+ }
310
+
311
+ /* Frustration indicator */
312
+ .fiq-frustration-badge {
313
+ position: absolute;
314
+ top: -4px;
315
+ right: -4px;
316
+ width: 18px;
317
+ height: 18px;
318
+ border-radius: var(--widget-radius-full);
319
+ background: var(--widget-frustrated);
320
+ border: 2px solid var(--widget-glass-bg-solid);
321
+ display: flex;
322
+ align-items: center;
323
+ justify-content: center;
324
+ font-size: var(--widget-font-size-xs);
325
+ font-weight: var(--widget-font-weight-bold);
326
+ color: white;
327
+ animation: pulse 2s ease-in-out infinite;
328
+ }
329
+
330
+ @keyframes pulse {
331
+ 0%, 100% {
332
+ transform: scale(1);
333
+ }
334
+ 50% {
335
+ transform: scale(1.1);
336
+ }
337
+ }
338
+ }
339
+
340
+ /* ============================================================================
341
+ MODAL CONTAINER
342
+ ============================================================================ */
343
+
344
+ @layer widget-modal {
345
+ .fiq-modal {
346
+ position: relative;
347
+ background: var(--widget-glass-bg);
348
+ backdrop-filter: blur(20px) saturate(180%);
349
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
350
+ border: 1px solid var(--widget-glass-border);
351
+ border-radius: var(--widget-radius-xl);
352
+ box-shadow: var(--widget-shadow-xl);
353
+ overflow: hidden;
354
+ display: flex;
355
+ flex-direction: column;
356
+ }
357
+
358
+ /* Header */
359
+ .fiq-modal-header {
360
+ display: flex;
361
+ justify-content: space-between;
362
+ align-items: center;
363
+ padding: var(--widget-space-5) var(--widget-space-6);
364
+ border-bottom: 1px solid var(--widget-glass-border);
365
+ }
366
+
367
+ .fiq-modal-title {
368
+ font-size: var(--widget-font-size-lg);
369
+ font-weight: var(--widget-font-weight-bold);
370
+ color: var(--widget-text-primary);
371
+ }
372
+
373
+ .fiq-modal-close {
374
+ width: 32px;
375
+ height: 32px;
376
+ border-radius: var(--widget-radius-md);
377
+ display: flex;
378
+ align-items: center;
379
+ justify-content: center;
380
+ color: var(--widget-text-secondary);
381
+ transition:
382
+ background var(--widget-duration-fast),
383
+ color var(--widget-duration-fast),
384
+ transform var(--widget-duration-fast) var(--widget-ease-out-back);
385
+ }
386
+
387
+ .fiq-modal-close:hover {
388
+ background: var(--widget-glass-highlight);
389
+ color: var(--widget-text-primary);
390
+ transform: rotate(90deg);
391
+ }
392
+
393
+ /* Content area */
394
+ .fiq-modal-content {
395
+ flex: 1;
396
+ overflow-y: auto;
397
+ padding: var(--widget-space-6);
398
+ }
399
+
400
+ /* Footer */
401
+ .fiq-modal-footer {
402
+ padding: var(--widget-space-4) var(--widget-space-6);
403
+ border-top: 1px solid var(--widget-glass-border);
404
+ }
405
+ }
406
+
407
+ /* ============================================================================
408
+ TAB NAVIGATION
409
+ ============================================================================ */
410
+
411
+ @layer widget-tabs {
412
+ .fiq-tabs {
413
+ display: flex;
414
+ border-bottom: 1px solid var(--widget-glass-border);
415
+ }
416
+
417
+ .fiq-tab {
418
+ flex: 1;
419
+ padding: var(--widget-space-3) 0;
420
+ font-size: var(--widget-font-size-sm);
421
+ font-weight: var(--widget-font-weight-medium);
422
+ color: var(--widget-text-secondary);
423
+ position: relative;
424
+ transition: color var(--widget-duration-fast);
425
+ }
426
+
427
+ .fiq-tab:hover {
428
+ color: var(--widget-text-primary);
429
+ background: var(--widget-glass-highlight);
430
+ }
431
+
432
+ .fiq-tab[data-active='true'] {
433
+ color: var(--widget-primary);
434
+ }
435
+
436
+ .fiq-tab-indicator {
437
+ position: absolute;
438
+ bottom: -1px;
439
+ left: 0;
440
+ right: 0;
441
+ height: 2px;
442
+ background: var(--widget-primary);
443
+ }
444
+ }
445
+
446
+ /* ============================================================================
447
+ CATEGORY SELECTOR
448
+ ============================================================================ */
449
+
450
+ @layer widget-categories {
451
+ .fiq-category-label {
452
+ display: block;
453
+ font-size: var(--widget-font-size-xs);
454
+ font-weight: var(--widget-font-weight-semibold);
455
+ color: var(--widget-text-secondary);
456
+ text-transform: uppercase;
457
+ letter-spacing: 0.05em;
458
+ margin-bottom: var(--widget-space-3);
459
+ }
460
+
461
+ .fiq-category-grid {
462
+ display: grid;
463
+ grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));
464
+ gap: var(--widget-space-3);
465
+ }
466
+
467
+ .fiq-category-chip {
468
+ display: flex;
469
+ flex-direction: column;
470
+ align-items: center;
471
+ gap: var(--widget-space-2);
472
+ padding: var(--widget-space-3) var(--widget-space-2);
473
+ background: var(--widget-glass-bg);
474
+ border: 2px solid var(--widget-glass-border);
475
+ border-radius: var(--widget-radius-lg);
476
+ transition:
477
+ transform var(--widget-duration-fast) var(--widget-ease-out-back),
478
+ background var(--widget-duration-fast),
479
+ border-color var(--widget-duration-fast),
480
+ box-shadow var(--widget-duration-fast);
481
+ }
482
+
483
+ .fiq-category-chip:hover {
484
+ transform: translateY(-2px) scale(1.02);
485
+ border-color: var(--widget-glass-border-hover);
486
+ box-shadow: var(--widget-shadow-md);
487
+ }
488
+
489
+ .fiq-category-chip:active {
490
+ transform: scale(0.95);
491
+ }
492
+
493
+ .fiq-category-chip[data-selected='true'] {
494
+ background: var(--widget-primary);
495
+ border-color: var(--widget-primary);
496
+ }
497
+
498
+ .fiq-category-icon {
499
+ font-size: 20px;
500
+ transition: transform var(--widget-duration-normal) var(--widget-ease-out-back);
501
+ }
502
+
503
+ .fiq-category-chip[data-selected='true'] .fiq-category-icon {
504
+ animation: iconBounce 0.4s var(--widget-ease-out-back);
505
+ }
506
+
507
+ @keyframes iconBounce {
508
+ 0% { transform: scale(1); }
509
+ 50% { transform: scale(1.3) rotate(10deg); }
510
+ 75% { transform: scale(1.1) rotate(-5deg); }
511
+ 100% { transform: scale(1) rotate(0); }
512
+ }
513
+
514
+ .fiq-category-name {
515
+ font-size: var(--widget-font-size-xs);
516
+ font-weight: var(--widget-font-weight-medium);
517
+ color: var(--widget-text-primary);
518
+ }
519
+
520
+ .fiq-category-chip[data-selected='true'] .fiq-category-name {
521
+ color: white;
522
+ }
523
+ }
524
+
525
+ /* ============================================================================
526
+ AMBIENT ORB VISUALIZATION
527
+ ============================================================================ */
528
+
529
+ @layer widget-orb {
530
+ .fiq-ambient-orb {
531
+ position: relative;
532
+ display: flex;
533
+ align-items: center;
534
+ justify-content: center;
535
+ margin: 0 auto;
536
+ }
537
+
538
+ .fiq-orb-svg {
539
+ filter: drop-shadow(0 0 20px var(--widget-primary-glow));
540
+ }
541
+
542
+ .fiq-orb-main {
543
+ fill: url(#orbGradient);
544
+ transition: transform var(--widget-duration-fast) var(--widget-ease-out);
545
+ }
546
+
547
+ .fiq-orb-pulse {
548
+ fill: none;
549
+ stroke: var(--widget-primary-glow);
550
+ stroke-width: 2;
551
+ }
552
+
553
+ .fiq-orb-icon {
554
+ fill: none;
555
+ stroke: white;
556
+ stroke-width: 2.5;
557
+ stroke-linecap: round;
558
+ stroke-linejoin: round;
559
+ }
560
+
561
+ /* Recording state */
562
+ .fiq-ambient-orb[data-recording='true'] .fiq-orb-svg {
563
+ filter: drop-shadow(0 0 30px var(--widget-recording-glow));
564
+ }
565
+
566
+ .fiq-ambient-orb[data-recording='true'] .fiq-orb-main {
567
+ fill: var(--widget-recording);
568
+ }
569
+
570
+ /* Particles */
571
+ .fiq-particle {
572
+ position: absolute;
573
+ border-radius: var(--widget-radius-full);
574
+ pointer-events: none;
575
+ }
576
+ }
577
+
578
+ /* ============================================================================
579
+ RECORDING TIMER
580
+ ============================================================================ */
581
+
582
+ @layer widget-timer {
583
+ .fiq-timer {
584
+ text-align: center;
585
+ margin-top: var(--widget-space-4);
586
+ }
587
+
588
+ .fiq-timer-display {
589
+ font-size: var(--widget-font-size-3xl);
590
+ font-weight: var(--widget-font-weight-bold);
591
+ font-family: var(--widget-font-mono);
592
+ color: var(--widget-text-primary);
593
+ letter-spacing: 0.05em;
594
+ }
595
+
596
+ .fiq-timer[data-warning='true'] .fiq-timer-display {
597
+ color: var(--widget-recording);
598
+ animation: timerPulse 0.5s ease-in-out infinite alternate;
599
+ }
600
+
601
+ @keyframes timerPulse {
602
+ from { transform: scale(1); }
603
+ to { transform: scale(1.05); }
604
+ }
605
+
606
+ .fiq-timer-progress {
607
+ width: 160px;
608
+ height: 4px;
609
+ background: var(--widget-glass-border);
610
+ border-radius: var(--widget-radius-full);
611
+ margin: var(--widget-space-3) auto;
612
+ overflow: hidden;
613
+ }
614
+
615
+ .fiq-timer-progress-bar {
616
+ height: 100%;
617
+ background: var(--widget-primary);
618
+ border-radius: var(--widget-radius-full);
619
+ transition: width 0.5s linear, background var(--widget-duration-fast);
620
+ }
621
+
622
+ .fiq-timer[data-warning='true'] .fiq-timer-progress-bar {
623
+ background: var(--widget-recording);
624
+ }
625
+ }
626
+
627
+ /* ============================================================================
628
+ TRANSCRIPTION DISPLAY
629
+ ============================================================================ */
630
+
631
+ @layer widget-transcription {
632
+ .fiq-transcription {
633
+ padding: var(--widget-space-4);
634
+ background: var(--widget-glass-bg);
635
+ border: 1px solid var(--widget-glass-border);
636
+ border-radius: var(--widget-radius-lg);
637
+ min-height: 80px;
638
+ max-height: 140px;
639
+ overflow-y: auto;
640
+ }
641
+
642
+ .fiq-transcription-text {
643
+ font-size: var(--widget-font-size-sm);
644
+ line-height: var(--widget-line-height-relaxed);
645
+ color: var(--widget-text-primary);
646
+ }
647
+
648
+ .fiq-transcription-placeholder {
649
+ color: var(--widget-text-muted);
650
+ font-style: italic;
651
+ }
652
+
653
+ .fiq-transcription-cursor {
654
+ display: inline-block;
655
+ width: 2px;
656
+ height: 1.2em;
657
+ background: var(--widget-primary);
658
+ margin-left: 2px;
659
+ vertical-align: text-bottom;
660
+ animation: cursorBlink 1s step-end infinite;
661
+ }
662
+
663
+ @keyframes cursorBlink {
664
+ 50% { opacity: 0; }
665
+ }
666
+
667
+ .fiq-listening-indicator {
668
+ display: flex;
669
+ align-items: center;
670
+ gap: var(--widget-space-2);
671
+ margin-top: var(--widget-space-3);
672
+ font-size: var(--widget-font-size-xs);
673
+ color: var(--widget-text-secondary);
674
+ }
675
+
676
+ .fiq-listening-dots {
677
+ display: flex;
678
+ gap: 4px;
679
+ }
680
+
681
+ .fiq-listening-dot {
682
+ width: 6px;
683
+ height: 6px;
684
+ border-radius: var(--widget-radius-full);
685
+ background: var(--widget-primary);
686
+ animation: dotPulse 1s ease-in-out infinite;
687
+ }
688
+
689
+ .fiq-listening-dot:nth-child(2) {
690
+ animation-delay: 0.15s;
691
+ }
692
+
693
+ .fiq-listening-dot:nth-child(3) {
694
+ animation-delay: 0.3s;
695
+ }
696
+
697
+ @keyframes dotPulse {
698
+ 0%, 100% {
699
+ transform: scale(1);
700
+ opacity: 0.5;
701
+ }
702
+ 50% {
703
+ transform: scale(1.4);
704
+ opacity: 1;
705
+ }
706
+ }
707
+ }
708
+
709
+ /* ============================================================================
710
+ TEXT INPUT
711
+ ============================================================================ */
712
+
713
+ @layer widget-text-input {
714
+ .fiq-textarea {
715
+ width: 100%;
716
+ min-height: 150px;
717
+ padding: var(--widget-space-4);
718
+ font-family: var(--widget-font-family);
719
+ font-size: var(--widget-font-size-sm);
720
+ line-height: var(--widget-line-height-relaxed);
721
+ color: var(--widget-text-primary);
722
+ background: var(--widget-glass-bg);
723
+ border: 1px solid var(--widget-glass-border);
724
+ border-radius: var(--widget-radius-lg);
725
+ resize: vertical;
726
+ transition: border-color var(--widget-duration-fast);
727
+ }
728
+
729
+ .fiq-textarea::placeholder {
730
+ color: var(--widget-text-muted);
731
+ }
732
+
733
+ .fiq-textarea:hover {
734
+ border-color: var(--widget-glass-border-hover);
735
+ }
736
+
737
+ .fiq-textarea:focus {
738
+ outline: none;
739
+ border-color: var(--widget-primary);
740
+ box-shadow: 0 0 0 3px var(--widget-primary-subtle);
741
+ }
742
+
743
+ .fiq-char-count {
744
+ display: flex;
745
+ justify-content: flex-end;
746
+ margin-top: var(--widget-space-2);
747
+ font-size: var(--widget-font-size-xs);
748
+ color: var(--widget-text-muted);
749
+ }
750
+ }
751
+
752
+ /* ============================================================================
753
+ BUTTONS
754
+ ============================================================================ */
755
+
756
+ @layer widget-buttons {
757
+ .fiq-button {
758
+ display: inline-flex;
759
+ align-items: center;
760
+ justify-content: center;
761
+ gap: var(--widget-space-2);
762
+ padding: var(--widget-space-3) var(--widget-space-6);
763
+ font-size: var(--widget-font-size-md);
764
+ font-weight: var(--widget-font-weight-semibold);
765
+ border-radius: var(--widget-radius-lg);
766
+ transition:
767
+ transform var(--widget-duration-fast) var(--widget-ease-out-back),
768
+ background var(--widget-duration-fast),
769
+ box-shadow var(--widget-duration-fast);
770
+ }
771
+
772
+ .fiq-button:disabled {
773
+ opacity: 0.5;
774
+ cursor: not-allowed;
775
+ }
776
+
777
+ .fiq-button:not(:disabled):hover {
778
+ transform: translateY(-2px);
779
+ }
780
+
781
+ .fiq-button:not(:disabled):active {
782
+ transform: scale(0.97);
783
+ }
784
+
785
+ /* Primary variant */
786
+ .fiq-button--primary {
787
+ background: var(--widget-primary);
788
+ color: white;
789
+ box-shadow: 0 4px 12px -4px var(--widget-primary-glow);
790
+ }
791
+
792
+ .fiq-button--primary:not(:disabled):hover {
793
+ background: var(--widget-primary-hover);
794
+ box-shadow: 0 8px 20px -4px var(--widget-primary-glow);
795
+ }
796
+
797
+ /* Secondary variant */
798
+ .fiq-button--secondary {
799
+ background: var(--widget-glass-bg);
800
+ color: var(--widget-text-primary);
801
+ border: 1px solid var(--widget-glass-border);
802
+ }
803
+
804
+ .fiq-button--secondary:not(:disabled):hover {
805
+ background: var(--widget-glass-highlight);
806
+ border-color: var(--widget-glass-border-hover);
807
+ }
808
+
809
+ /* Ghost variant */
810
+ .fiq-button--ghost {
811
+ background: transparent;
812
+ color: var(--widget-text-secondary);
813
+ }
814
+
815
+ .fiq-button--ghost:not(:disabled):hover {
816
+ background: var(--widget-glass-highlight);
817
+ color: var(--widget-text-primary);
818
+ }
819
+
820
+ /* Recording variant */
821
+ .fiq-button--recording {
822
+ background: var(--widget-recording);
823
+ color: white;
824
+ box-shadow: 0 4px 12px -4px var(--widget-recording-glow);
825
+ animation: recordingPulse 2s ease-in-out infinite;
826
+ }
827
+
828
+ @keyframes recordingPulse {
829
+ 0%, 100% {
830
+ box-shadow: 0 4px 12px -4px var(--widget-recording-glow);
831
+ }
832
+ 50% {
833
+ box-shadow: 0 8px 24px -4px var(--widget-recording-glow);
834
+ }
835
+ }
836
+
837
+ /* Full width */
838
+ .fiq-button--full {
839
+ width: 100%;
840
+ }
841
+
842
+ /* Loading spinner */
843
+ .fiq-button-spinner {
844
+ width: 18px;
845
+ height: 18px;
846
+ border: 2px solid rgba(255, 255, 255, 0.3);
847
+ border-top-color: white;
848
+ border-radius: var(--widget-radius-full);
849
+ animation: spin 0.8s linear infinite;
850
+ }
851
+
852
+ @keyframes spin {
853
+ to { transform: rotate(360deg); }
854
+ }
855
+ }
856
+
857
+ /* ============================================================================
858
+ SUCCESS CELEBRATION
859
+ ============================================================================ */
860
+
861
+ @layer widget-success {
862
+ .fiq-success {
863
+ display: flex;
864
+ flex-direction: column;
865
+ align-items: center;
866
+ justify-content: center;
867
+ padding: var(--widget-space-10);
868
+ text-align: center;
869
+ position: relative;
870
+ overflow: hidden;
871
+ }
872
+
873
+ .fiq-success-icon {
874
+ margin-bottom: var(--widget-space-5);
875
+ }
876
+
877
+ .fiq-success-circle {
878
+ fill: var(--widget-success);
879
+ filter: drop-shadow(0 4px 12px var(--widget-success-glow));
880
+ }
881
+
882
+ .fiq-success-check {
883
+ fill: none;
884
+ stroke: white;
885
+ stroke-width: 5;
886
+ stroke-linecap: round;
887
+ stroke-linejoin: round;
888
+ }
889
+
890
+ .fiq-success-title {
891
+ font-size: var(--widget-font-size-xl);
892
+ font-weight: var(--widget-font-weight-bold);
893
+ color: var(--widget-text-primary);
894
+ margin-bottom: var(--widget-space-2);
895
+ }
896
+
897
+ .fiq-success-message {
898
+ font-size: var(--widget-font-size-sm);
899
+ color: var(--widget-text-secondary);
900
+ }
901
+
902
+ .fiq-success-timer {
903
+ position: absolute;
904
+ bottom: var(--widget-space-5);
905
+ left: 50%;
906
+ transform: translateX(-50%);
907
+ width: 100px;
908
+ height: 3px;
909
+ background: var(--widget-glass-border);
910
+ border-radius: var(--widget-radius-full);
911
+ overflow: hidden;
912
+ }
913
+
914
+ .fiq-success-timer-bar {
915
+ height: 100%;
916
+ background: var(--widget-primary);
917
+ animation: timerCountdown 3s linear forwards;
918
+ }
919
+
920
+ @keyframes timerCountdown {
921
+ from { width: 100%; }
922
+ to { width: 0%; }
923
+ }
924
+
925
+ /* Confetti */
926
+ .fiq-confetti {
927
+ position: absolute;
928
+ top: 50%;
929
+ left: 50%;
930
+ pointer-events: none;
931
+ }
932
+
933
+ .fiq-confetti-particle {
934
+ position: absolute;
935
+ animation: confettiFall 1.2s var(--widget-ease-out) forwards;
936
+ }
937
+
938
+ @keyframes confettiFall {
939
+ 0% {
940
+ opacity: 1;
941
+ transform: scale(0) translate(0, 0);
942
+ }
943
+ 100% {
944
+ opacity: 0;
945
+ transform: scale(1) translate(var(--confetti-x), calc(var(--confetti-y) + 50px));
946
+ }
947
+ }
948
+ }
949
+
950
+ /* ============================================================================
951
+ ACCESSIBILITY
952
+ ============================================================================ */
953
+
954
+ @layer widget-a11y {
955
+ /* Screen reader only */
956
+ .fiq-sr-only {
957
+ position: absolute;
958
+ width: 1px;
959
+ height: 1px;
960
+ padding: 0;
961
+ margin: -1px;
962
+ overflow: hidden;
963
+ clip: rect(0, 0, 0, 0);
964
+ white-space: nowrap;
965
+ border: 0;
966
+ }
967
+
968
+ /* Reduced motion */
969
+ @media (prefers-reduced-motion: reduce) {
970
+ .fiq-premium-widget *,
971
+ .fiq-premium-widget *::before,
972
+ .fiq-premium-widget *::after {
973
+ animation-duration: 0.01ms !important;
974
+ animation-iteration-count: 1 !important;
975
+ transition-duration: 0.01ms !important;
976
+ }
977
+ }
978
+
979
+ /* High contrast mode */
980
+ @media (prefers-contrast: high) {
981
+ .fiq-premium-widget {
982
+ --widget-glass-border: rgba(255, 255, 255, 0.5);
983
+ }
984
+
985
+ .fiq-premium-widget *:focus-visible {
986
+ outline: 3px solid white;
987
+ outline-offset: 3px;
988
+ }
989
+
990
+ .fiq-button--primary {
991
+ border: 2px solid white;
992
+ }
993
+ }
994
+
995
+ /* Forced colors mode (Windows High Contrast) */
996
+ @media (forced-colors: active) {
997
+ .fiq-premium-widget {
998
+ forced-color-adjust: none;
999
+ }
1000
+
1001
+ .fiq-button {
1002
+ border: 2px solid ButtonText;
1003
+ }
1004
+
1005
+ .fiq-button--primary {
1006
+ background: Highlight;
1007
+ color: HighlightText;
1008
+ }
1009
+ }
1010
+ }
1011
+
1012
+ /* ============================================================================
1013
+ RESPONSIVE ADJUSTMENTS
1014
+ ============================================================================ */
1015
+
1016
+ @layer widget-responsive {
1017
+ /* Mobile viewport */
1018
+ @media (max-width: 480px) {
1019
+ .fiq-modal {
1020
+ position: fixed;
1021
+ inset: auto 0 0 0;
1022
+ border-radius: var(--widget-radius-xl) var(--widget-radius-xl) 0 0;
1023
+ max-height: 90vh;
1024
+ }
1025
+
1026
+ .fiq-category-grid {
1027
+ grid-template-columns: repeat(3, 1fr);
1028
+ }
1029
+
1030
+ .fiq-button {
1031
+ padding: var(--widget-space-4) var(--widget-space-6);
1032
+ }
1033
+ }
1034
+
1035
+ /* Touch devices */
1036
+ @media (hover: none) and (pointer: coarse) {
1037
+ .fiq-trigger {
1038
+ width: 64px;
1039
+ height: 64px;
1040
+ }
1041
+
1042
+ .fiq-button,
1043
+ .fiq-category-chip {
1044
+ min-height: 48px;
1045
+ }
1046
+ }
1047
+ }