bonsai-search 3.0.8

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,861 @@
1
+ /* Bonsai Search SDK Styles
2
+ * Ported from React prototype design system
3
+ * All classes prefixed with bonsai- for isolation
4
+ */
5
+
6
+ /* ============================================================================
7
+ * CSS VARIABLES - Design Tokens
8
+ * ============================================================================ */
9
+ :root {
10
+ /* Colors - Default theme */
11
+ --bonsai-brand-color: #0a5b3b;
12
+ --bonsai-text-color: #303030;
13
+ --bonsai-suggestions-text-color: #303030;
14
+ --bonsai-input-text-color: #303030;
15
+ --bonsai-results-text-color: #303030;
16
+ --bonsai-card-text-color: #303030;
17
+ --bonsai-muted-color: #9ca3af;
18
+ --bonsai-input-bg: #f5f5f5;
19
+ --bonsai-card-bg: #f5f5f5;
20
+ --bonsai-canvas-color: #fafafa;
21
+ --bonsai-surface-color: #ffffff;
22
+ --bonsai-border-color: rgba(0, 0, 0, 0.06);
23
+ --bonsai-border-color-hover: rgba(0, 0, 0, 0.12);
24
+ --bonsai-hover-bg: rgba(0, 0, 0, 0.04);
25
+ --bonsai-suggestions-hover-bg: rgba(0, 0, 0, 0.04);
26
+ --bonsai-error-bg: rgba(220, 53, 69, 0.1);
27
+ --bonsai-error-color: #c82333;
28
+
29
+ /* Spacing (4px base) */
30
+ --bonsai-space-1: 0.25rem;
31
+ /* 4px */
32
+ --bonsai-space-2: 0.5rem;
33
+ /* 8px */
34
+ --bonsai-space-3: 0.75rem;
35
+ /* 12px */
36
+ --bonsai-space-4: 1rem;
37
+ /* 16px */
38
+ --bonsai-space-5: 1.25rem;
39
+ /* 20px */
40
+ --bonsai-space-6: 1.5rem;
41
+ /* 24px */
42
+
43
+ /* Typography */
44
+ --bonsai-font-heading: system-ui, -apple-system, sans-serif;
45
+ --bonsai-font-body: system-ui, -apple-system, sans-serif;
46
+ --bonsai-font-mono: ui-monospace, monospace;
47
+ --bonsai-font-size-xs: 0.75rem;
48
+ /* 12px */
49
+ --bonsai-font-size-sm: 0.875rem;
50
+ /* 14px */
51
+ --bonsai-font-size-base: 1rem;
52
+ /* 16px */
53
+ --bonsai-font-size-lg: 1.125rem;
54
+ /* 18px */
55
+ --bonsai-font-size-xl: 1.25rem;
56
+ /* 20px */
57
+
58
+ /* Border Radius */
59
+ --bonsai-radius-none: 0;
60
+ --bonsai-radius-sm: 0.25rem;
61
+ /* 4px */
62
+ --bonsai-radius-md: 0.375rem;
63
+ /* 6px */
64
+ --bonsai-radius-lg: 0.5rem;
65
+ /* 8px */
66
+ --bonsai-radius-xl: 0.75rem;
67
+ /* 12px */
68
+ --bonsai-radius-full: 9999px;
69
+
70
+ /* Animation */
71
+ --bonsai-duration-fast: 150ms;
72
+ --bonsai-duration-base: 200ms;
73
+ --bonsai-duration-slow: 300ms;
74
+ --bonsai-easing: cubic-bezier(0, 0, 0.2, 1);
75
+
76
+ /* Shadows */
77
+ --bonsai-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
78
+ --bonsai-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
79
+ --bonsai-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
80
+
81
+ /* Component Sizes */
82
+ --bonsai-search-min-height: 3.5rem;
83
+ /* 56px */
84
+ --bonsai-search-max-width: 42rem;
85
+ /* 672px */
86
+ --bonsai-icon-size: 1.25rem;
87
+ /* 20px */
88
+ --bonsai-icon-size-sm: 1rem;
89
+ /* 16px */
90
+ }
91
+
92
+ :host([data-theme="dark"]) {
93
+ --bonsai-text-color: #e5e7eb;
94
+ --bonsai-suggestions-text-color: #e5e7eb;
95
+ --bonsai-input-text-color: #e5e7eb;
96
+ --bonsai-results-text-color: #e5e7eb;
97
+ --bonsai-card-text-color: #e5e7eb;
98
+ --bonsai-muted-color: #a1a1aa;
99
+ --bonsai-input-bg: #1f2229;
100
+ --bonsai-card-bg: #1f2229;
101
+ --bonsai-canvas-color: #0f1115;
102
+ --bonsai-surface-color: #181a20;
103
+ --bonsai-border-color: rgba(255, 255, 255, 0.08);
104
+ --bonsai-border-color-hover: rgba(255, 255, 255, 0.14);
105
+ --bonsai-hover-bg: rgba(255, 255, 255, 0.06);
106
+ --bonsai-suggestions-hover-bg: rgba(255, 255, 255, 0.06);
107
+ --bonsai-error-bg: rgba(248, 113, 113, 0.15);
108
+ --bonsai-error-color: #fca5a5;
109
+ --bonsai-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.5);
110
+ --bonsai-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.55), 0 2px 4px -2px rgb(0 0 0 / 0.5);
111
+ --bonsai-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.6), 0 4px 6px -4px rgb(0 0 0 / 0.55);
112
+ }
113
+
114
+ /* ============================================================================
115
+ * BASE CONTAINER
116
+ * ============================================================================ */
117
+ .bonsai-search-container {
118
+ max-width: var(--bonsai-search-max-width);
119
+ font-family: var(--bonsai-font-heading);
120
+ box-sizing: border-box;
121
+ }
122
+
123
+ .bonsai-search-container *,
124
+ .bonsai-search-container *::before,
125
+ .bonsai-search-container *::after {
126
+ box-sizing: border-box;
127
+ }
128
+
129
+ .bonsai-search-wrapper {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: var(--bonsai-space-1);
133
+ position: relative;
134
+ }
135
+
136
+ /* ============================================================================
137
+ * SEARCH INPUT CONTAINER
138
+ * ============================================================================ */
139
+ .bonsai-search-bar {
140
+ position: relative;
141
+ z-index: 2;
142
+ display: flex;
143
+ align-items: center;
144
+ min-height: var(--bonsai-search-min-height);
145
+ background-color: var(--bonsai-input-bg);
146
+ border-radius: var(--bonsai-radius-lg);
147
+ transition: box-shadow var(--bonsai-duration-base) var(--bonsai-easing);
148
+ }
149
+
150
+ .bonsai-search-bar.bonsai-focused {
151
+ box-shadow: 0 0 0 2px var(--bonsai-brand-color);
152
+ }
153
+
154
+ /* ============================================================================
155
+ * SEARCH ICON (Left side)
156
+ * ============================================================================ */
157
+ .bonsai-search-icon {
158
+ display: flex;
159
+ align-items: center;
160
+ justify-content: center;
161
+ padding-left: var(--bonsai-space-4);
162
+ padding-right: var(--bonsai-space-2);
163
+ color: var(--bonsai-input-text-color, var(--bonsai-text-color));
164
+ transition: color var(--bonsai-duration-base) var(--bonsai-easing);
165
+ }
166
+
167
+ .bonsai-search-bar:hover .bonsai-search-icon,
168
+ .bonsai-search-bar.bonsai-focused .bonsai-search-icon {
169
+ color: var(--bonsai-input-text-color, var(--bonsai-text-color));
170
+ }
171
+
172
+ .bonsai-search-icon svg {
173
+ width: var(--bonsai-icon-size);
174
+ height: var(--bonsai-icon-size);
175
+ stroke: currentColor;
176
+ stroke-width: 2;
177
+ fill: none;
178
+ }
179
+
180
+ /* ============================================================================
181
+ * INPUT FIELD
182
+ * ============================================================================ */
183
+ .bonsai-search-input {
184
+ flex: 1;
185
+ min-width: 0;
186
+ padding: var(--bonsai-space-4) var(--bonsai-space-4) var(--bonsai-space-4) 0;
187
+ border: none;
188
+ background: transparent;
189
+ font-family: var(--bonsai-font-body);
190
+ font-size: var(--bonsai-font-size-base);
191
+ color: var(--bonsai-input-text-color, var(--bonsai-text-color));
192
+ outline: none;
193
+ }
194
+
195
+ .bonsai-search-input::placeholder {
196
+ color: var(--bonsai-muted-color);
197
+ }
198
+
199
+ .bonsai-search-input:disabled {
200
+ cursor: not-allowed;
201
+ opacity: 0.7;
202
+ }
203
+
204
+ /* Webkit search clear button styling */
205
+ .bonsai-search-input::-webkit-search-cancel-button {
206
+ -webkit-appearance: none;
207
+ appearance: none;
208
+ width: var(--bonsai-icon-size-sm);
209
+ height: var(--bonsai-icon-size-sm);
210
+ cursor: pointer;
211
+ background-color: var(--bonsai-muted-color);
212
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 6L6 18'%3E%3C/path%3E%3Cpath d='M6 6l12 12'%3E%3C/path%3E%3C/svg%3E");
213
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 6L6 18'%3E%3C/path%3E%3Cpath d='M6 6l12 12'%3E%3C/path%3E%3C/svg%3E");
214
+ mask-size: contain;
215
+ -webkit-mask-size: contain;
216
+ mask-repeat: no-repeat;
217
+ -webkit-mask-repeat: no-repeat;
218
+ mask-position: center;
219
+ -webkit-mask-position: center;
220
+ opacity: 0.7;
221
+ transition: opacity var(--bonsai-duration-fast) var(--bonsai-easing);
222
+ }
223
+
224
+ .bonsai-search-input::-webkit-search-cancel-button:hover {
225
+ opacity: 1;
226
+ }
227
+
228
+ /* ============================================================================
229
+ * ACTION BUTTONS AREA (Right side)
230
+ * ============================================================================ */
231
+ .bonsai-search-actions {
232
+ display: flex;
233
+ align-items: center;
234
+ gap: var(--bonsai-space-2);
235
+ padding-right: var(--bonsai-space-3);
236
+ flex: 0 0 auto;
237
+ min-width: max-content;
238
+ }
239
+
240
+ /* Submit Button */
241
+ .bonsai-submit-btn {
242
+ display: none;
243
+ align-items: center;
244
+ justify-content: center;
245
+ width: 2rem;
246
+ height: 2rem;
247
+ padding: var(--bonsai-space-2);
248
+ border: none;
249
+ border-radius: var(--bonsai-radius-lg);
250
+ background-color: var(--bonsai-brand-color);
251
+ cursor: pointer;
252
+ touch-action: manipulation;
253
+ flex-shrink: 0;
254
+ transition:
255
+ opacity var(--bonsai-duration-fast) var(--bonsai-easing),
256
+ transform var(--bonsai-duration-fast) var(--bonsai-easing);
257
+ }
258
+
259
+ .bonsai-submit-btn.bonsai-visible {
260
+ display: flex;
261
+ }
262
+
263
+ .bonsai-submit-btn:hover {
264
+ opacity: 0.8;
265
+ }
266
+
267
+ .bonsai-submit-btn:active {
268
+ transform: scale(0.95);
269
+ }
270
+
271
+ .bonsai-submit-btn svg {
272
+ width: var(--bonsai-icon-size-sm);
273
+ height: var(--bonsai-icon-size-sm);
274
+ stroke: white;
275
+ stroke-width: 2;
276
+ fill: none;
277
+ }
278
+
279
+ /* Loading State */
280
+ .bonsai-loading-state {
281
+ display: none;
282
+ align-items: center;
283
+ gap: var(--bonsai-space-2);
284
+ flex-shrink: 0;
285
+ }
286
+
287
+ .bonsai-loading-state.bonsai-visible {
288
+ display: flex;
289
+ }
290
+
291
+ .bonsai-loading-text {
292
+ position: relative;
293
+ height: 1.25rem;
294
+ overflow: hidden;
295
+ min-width: 5rem;
296
+ text-align: right;
297
+ }
298
+
299
+ .bonsai-loading-text-inner {
300
+ display: flex;
301
+ flex-direction: column;
302
+ transition: transform var(--bonsai-duration-base) var(--bonsai-easing);
303
+ }
304
+
305
+ .bonsai-loading-text span {
306
+ display: block;
307
+ height: 1.25rem;
308
+ line-height: 1.25rem;
309
+ font-family: var(--bonsai-font-mono);
310
+ font-size: var(--bonsai-font-size-sm);
311
+ color: var(--bonsai-muted-color);
312
+ white-space: nowrap;
313
+ }
314
+
315
+ /* Spinner */
316
+ .bonsai-spinner {
317
+ width: var(--bonsai-icon-size-sm);
318
+ height: var(--bonsai-icon-size-sm);
319
+ animation: bonsai-spin 1s linear infinite;
320
+ transform-origin: center;
321
+ }
322
+
323
+ .bonsai-spinner svg {
324
+ display: block;
325
+ width: 100%;
326
+ height: 100%;
327
+ transform-origin: center;
328
+ }
329
+
330
+ .bonsai-spinner-track {
331
+ stroke: var(--bonsai-muted-color);
332
+ stroke-opacity: 0.25;
333
+ }
334
+
335
+ .bonsai-spinner-fill {
336
+ fill: var(--bonsai-brand-color);
337
+ }
338
+
339
+ @keyframes bonsai-spin {
340
+ from {
341
+ transform: rotate(0deg);
342
+ }
343
+
344
+ to {
345
+ transform: rotate(360deg);
346
+ }
347
+ }
348
+
349
+ /* Done State */
350
+ .bonsai-done-state {
351
+ display: none;
352
+ align-items: center;
353
+ gap: var(--bonsai-space-2);
354
+ flex-shrink: 0;
355
+ }
356
+
357
+ .bonsai-done-state.bonsai-visible {
358
+ display: flex;
359
+ }
360
+
361
+ .bonsai-done-text {
362
+ font-family: var(--bonsai-font-mono);
363
+ font-size: var(--bonsai-font-size-sm);
364
+ color: var(--bonsai-muted-color);
365
+ }
366
+
367
+ .bonsai-done-icon svg {
368
+ width: var(--bonsai-icon-size-sm);
369
+ height: var(--bonsai-icon-size-sm);
370
+ stroke: var(--bonsai-text-color);
371
+ stroke-width: 2;
372
+ fill: none;
373
+ }
374
+
375
+ /* Reset/Retry Button */
376
+ .bonsai-reset-btn {
377
+ display: none;
378
+ align-items: center;
379
+ gap: var(--bonsai-space-2);
380
+ padding: 0;
381
+ border: none;
382
+ background: transparent;
383
+ cursor: pointer;
384
+ touch-action: manipulation;
385
+ flex-shrink: 0;
386
+ transition: opacity var(--bonsai-duration-fast) var(--bonsai-easing);
387
+ }
388
+
389
+ .bonsai-reset-btn.bonsai-visible {
390
+ display: flex;
391
+ }
392
+
393
+ .bonsai-reset-btn:hover {
394
+ opacity: 0.7;
395
+ }
396
+
397
+ .bonsai-reset-text {
398
+ font-family: var(--bonsai-font-mono);
399
+ font-size: var(--bonsai-font-size-sm);
400
+ color: var(--bonsai-muted-color);
401
+ }
402
+
403
+ .bonsai-reset-icon {
404
+ transition: transform var(--bonsai-duration-slow) var(--bonsai-easing);
405
+ transform-origin: center;
406
+ }
407
+
408
+ .bonsai-reset-btn:hover .bonsai-reset-icon {
409
+ transform: rotate(-180deg);
410
+ }
411
+
412
+ .bonsai-reset-icon svg {
413
+ width: var(--bonsai-icon-size-sm);
414
+ height: var(--bonsai-icon-size-sm);
415
+ stroke: var(--bonsai-muted-color);
416
+ stroke-width: 2;
417
+ fill: none;
418
+ transform-origin: center;
419
+ display: block;
420
+ }
421
+
422
+ /* ============================================================================
423
+ * SUGGESTIONS DROPDOWN
424
+ * ============================================================================ */
425
+ .bonsai-suggestions {
426
+ position: absolute;
427
+ top: calc(100% + var(--bonsai-space-1));
428
+ left: 0;
429
+ right: 0;
430
+ background-color: var(--bonsai-input-bg);
431
+ border-radius: var(--bonsai-radius-lg);
432
+ box-shadow: var(--bonsai-shadow-lg);
433
+ overflow: hidden;
434
+ z-index: 10;
435
+ opacity: 0;
436
+ transform: translateY(-10px);
437
+ pointer-events: none;
438
+ transition:
439
+ opacity var(--bonsai-duration-fast) var(--bonsai-easing),
440
+ transform var(--bonsai-duration-fast) var(--bonsai-easing);
441
+ }
442
+
443
+ .bonsai-suggestions.bonsai-visible {
444
+ opacity: 1;
445
+ transform: translateY(0);
446
+ pointer-events: auto;
447
+ }
448
+
449
+ .bonsai-suggestion-item {
450
+ display: flex;
451
+ align-items: center;
452
+ justify-content: space-between;
453
+ width: 100%;
454
+ padding: var(--bonsai-space-2) var(--bonsai-space-4);
455
+ border: none;
456
+ background: transparent;
457
+ font-family: var(--bonsai-font-body);
458
+ font-size: var(--bonsai-font-size-sm);
459
+ color: var(--bonsai-suggestions-text-color, var(--bonsai-text-color));
460
+ text-align: left;
461
+ cursor: pointer;
462
+ transition: background-color var(--bonsai-duration-fast) var(--bonsai-easing);
463
+ }
464
+
465
+ .bonsai-suggestion-item:hover {
466
+ background-color: var(--bonsai-suggestions-hover-bg, var(--bonsai-hover-bg));
467
+ }
468
+
469
+ .bonsai-suggestion-arrow {
470
+ opacity: 0;
471
+ visibility: hidden;
472
+ transition:
473
+ opacity var(--bonsai-duration-fast) var(--bonsai-easing),
474
+ visibility 0s linear var(--bonsai-duration-fast);
475
+ }
476
+
477
+ .bonsai-suggestion-item:hover .bonsai-suggestion-arrow {
478
+ opacity: 1;
479
+ visibility: visible;
480
+ transition-delay: 0s;
481
+ }
482
+
483
+ .bonsai-suggestion-arrow svg {
484
+ width: var(--bonsai-icon-size-sm);
485
+ height: var(--bonsai-icon-size-sm);
486
+ stroke: var(--bonsai-muted-color);
487
+ stroke-width: 2;
488
+ fill: none;
489
+ }
490
+
491
+ /* ============================================================================
492
+ * POWERED BY BRANDING
493
+ * ============================================================================ */
494
+ .bonsai-powered-by {
495
+ position: relative;
496
+ z-index: 1;
497
+ height: 1.5rem;
498
+ margin-top: var(--bonsai-space-1);
499
+ text-align: right;
500
+ font-family: var(--bonsai-font-mono);
501
+ font-size: var(--bonsai-font-size-xs);
502
+ color: var(--bonsai-muted-color);
503
+ opacity: 1;
504
+ transition: opacity var(--bonsai-duration-base) var(--bonsai-easing);
505
+ }
506
+
507
+ .bonsai-powered-by.bonsai-hidden {
508
+ opacity: 0;
509
+ }
510
+
511
+ .bonsai-powered-by a {
512
+ color: var(--bonsai-brand-color);
513
+ text-decoration: none;
514
+ display: inline-flex;
515
+ align-items: center;
516
+ gap: 0;
517
+ transition: gap var(--bonsai-duration-base) var(--bonsai-easing);
518
+ }
519
+
520
+ .bonsai-powered-by a:hover {
521
+ gap: var(--bonsai-space-1);
522
+ }
523
+
524
+ .bonsai-powered-by-dot {
525
+ display: inline-block;
526
+ width: 0;
527
+ height: 0.5rem;
528
+ border-radius: var(--bonsai-radius-full);
529
+ background-color: var(--bonsai-brand-color);
530
+ transform: scale(0);
531
+ transition:
532
+ width var(--bonsai-duration-base) var(--bonsai-easing),
533
+ transform var(--bonsai-duration-base) var(--bonsai-easing);
534
+ }
535
+
536
+ .bonsai-powered-by a:hover .bonsai-powered-by-dot {
537
+ width: 0.5rem;
538
+ transform: scale(1);
539
+ }
540
+
541
+ /* ============================================================================
542
+ * RESULTS SECTION
543
+ * ============================================================================ */
544
+ .bonsai-results {
545
+ margin-top: var(--bonsai-space-2);
546
+ padding: var(--bonsai-space-4);
547
+ opacity: 0;
548
+ transform: translateY(20px);
549
+ transition:
550
+ opacity var(--bonsai-duration-slow) var(--bonsai-easing),
551
+ transform var(--bonsai-duration-slow) var(--bonsai-easing);
552
+ }
553
+
554
+ .bonsai-results.bonsai-visible {
555
+ opacity: 1;
556
+ transform: translateY(0);
557
+ }
558
+
559
+ /* AI Summary / Recommendation Text */
560
+ .bonsai-summary {
561
+ margin-bottom: var(--bonsai-space-6);
562
+ }
563
+
564
+ .bonsai-summary-text {
565
+ font-family: var(--bonsai-font-body);
566
+ font-size: var(--bonsai-font-size-base);
567
+ line-height: 1.6;
568
+ color: var(--bonsai-results-text-color, var(--bonsai-text-color));
569
+ margin: 0;
570
+ }
571
+
572
+ /* Markdown formatting within summary text */
573
+ .bonsai-summary-text h1,
574
+ .bonsai-summary-text h2,
575
+ .bonsai-summary-text h3,
576
+ .bonsai-summary-text h4,
577
+ .bonsai-summary-text h5,
578
+ .bonsai-summary-text h6 {
579
+ font-family: var(--bonsai-font-heading);
580
+ font-weight: 600;
581
+ color: var(--bonsai-results-text-color, var(--bonsai-text-color));
582
+ margin: var(--bonsai-space-4) 0 var(--bonsai-space-2) 0;
583
+ line-height: 1.25;
584
+ }
585
+
586
+ .bonsai-summary-text h1 {
587
+ font-size: var(--bonsai-font-size-xl);
588
+ }
589
+
590
+ .bonsai-summary-text h2 {
591
+ font-size: var(--bonsai-font-size-lg);
592
+ }
593
+
594
+ .bonsai-summary-text h3 {
595
+ font-size: var(--bonsai-font-size-base);
596
+ }
597
+
598
+ .bonsai-summary-text h4,
599
+ .bonsai-summary-text h5,
600
+ .bonsai-summary-text h6 {
601
+ font-size: var(--bonsai-font-size-sm);
602
+ }
603
+
604
+ .bonsai-summary-text p {
605
+ margin: var(--bonsai-space-2) 0;
606
+ }
607
+
608
+ .bonsai-summary-text p:first-child {
609
+ margin-top: 0;
610
+ }
611
+
612
+ .bonsai-summary-text p:last-child {
613
+ margin-bottom: 0;
614
+ }
615
+
616
+ .bonsai-summary-text strong {
617
+ font-weight: 600;
618
+ color: var(--bonsai-results-text-color, var(--bonsai-text-color));
619
+ }
620
+
621
+ .bonsai-summary-text em {
622
+ font-style: italic;
623
+ }
624
+
625
+ .bonsai-summary-text ul,
626
+ .bonsai-summary-text ol {
627
+ margin: var(--bonsai-space-2) 0;
628
+ padding-left: var(--bonsai-space-5);
629
+ }
630
+
631
+ .bonsai-summary-text li {
632
+ margin: var(--bonsai-space-1) 0;
633
+ }
634
+
635
+ .bonsai-summary-text a {
636
+ color: var(--bonsai-brand-color);
637
+ text-decoration: underline;
638
+ text-underline-offset: 2px;
639
+ }
640
+
641
+ .bonsai-summary-text a:hover {
642
+ text-decoration: none;
643
+ }
644
+
645
+ /* Results Header */
646
+ .bonsai-results-header {
647
+ font-family: var(--bonsai-font-heading);
648
+ font-size: var(--bonsai-font-size-sm);
649
+ font-weight: 500;
650
+ color: var(--bonsai-muted-color);
651
+ text-transform: uppercase;
652
+ letter-spacing: 0.05em;
653
+ margin: 0 0 var(--bonsai-space-3) 0;
654
+ /* border-top: 1px solid rgba(0, 0, 0, 0.06); */
655
+ }
656
+
657
+ /* Results Grid */
658
+ .bonsai-results-grid {
659
+ display: grid;
660
+ grid-template-columns: repeat(var(--bonsai-results-columns, 3), 1fr);
661
+ gap: var(--bonsai-space-4);
662
+ }
663
+
664
+ @media (max-width: 640px) {
665
+ .bonsai-results-grid {
666
+ grid-template-columns: repeat(2, 1fr);
667
+ }
668
+ }
669
+
670
+ @media (max-width: 400px) {
671
+ .bonsai-results-grid {
672
+ grid-template-columns: 1fr;
673
+ }
674
+ }
675
+
676
+ /* ============================================================================
677
+ * RESULT CARD
678
+ * ============================================================================ */
679
+ .bonsai-result-card {
680
+ display: flex;
681
+ flex-direction: column;
682
+ overflow: hidden;
683
+ border-radius: var(--bonsai-radius-md);
684
+ border: 1px solid var(--bonsai-border-color);
685
+ background-color: var(--bonsai-card-bg);
686
+ text-decoration: none;
687
+ cursor: pointer;
688
+ opacity: 0;
689
+ transform: translateY(10px);
690
+ transition:
691
+ opacity var(--bonsai-duration-base) var(--bonsai-easing),
692
+ transform var(--bonsai-duration-base) var(--bonsai-easing),
693
+ border-color var(--bonsai-duration-fast) var(--bonsai-easing);
694
+ }
695
+
696
+ .bonsai-result-card.bonsai-animate-in {
697
+ opacity: 1;
698
+ transform: translateY(0);
699
+ }
700
+
701
+ .bonsai-result-card:hover {
702
+ border-color: var(--bonsai-border-color-hover);
703
+ }
704
+
705
+ /* Card Image */
706
+ .bonsai-result-image {
707
+ width: 100%;
708
+ aspect-ratio: 1;
709
+ object-fit: var(--bonsai-image-object-fit, cover);
710
+ background-color: var(--bonsai-surface-color);
711
+ }
712
+
713
+ .bonsai-result-image-placeholder {
714
+ width: 100%;
715
+ aspect-ratio: 1;
716
+ background-color: var(--bonsai-surface-color);
717
+ opacity: 0.2;
718
+ }
719
+
720
+ /* Card Content */
721
+ .bonsai-result-content {
722
+ flex: 1;
723
+ min-width: 0;
724
+ padding: var(--bonsai-space-3) var(--bonsai-space-4);
725
+ transition: background-color var(--bonsai-duration-fast) var(--bonsai-easing);
726
+ }
727
+
728
+ .bonsai-result-card:hover .bonsai-result-content {
729
+ background-color: var(--bonsai-hover-bg);
730
+ }
731
+
732
+ .bonsai-result-title {
733
+ font-family: var(--bonsai-font-heading);
734
+ font-size: var(--bonsai-font-size-base);
735
+ font-weight: 500;
736
+ line-height: 1.25;
737
+ color: var(--bonsai-card-text-color, var(--bonsai-text-color));
738
+ margin: 0;
739
+ overflow: hidden;
740
+ text-overflow: ellipsis;
741
+ white-space: nowrap;
742
+ }
743
+
744
+ .bonsai-result-price-container {
745
+ display: flex;
746
+ align-items: center;
747
+ gap: var(--bonsai-space-2);
748
+ margin: var(--bonsai-space-1) 0 0 0;
749
+ }
750
+
751
+ .bonsai-result-caption {
752
+ font-family: var(--bonsai-font-body);
753
+ font-size: var(--bonsai-font-size-sm);
754
+ line-height: 1.5;
755
+ color: var(--bonsai-card-text-color, var(--bonsai-text-color));
756
+ opacity: 0.75;
757
+ margin: var(--bonsai-space-1) 0 0 0;
758
+ display: -webkit-box;
759
+ -webkit-line-clamp: 2;
760
+ -webkit-box-orient: vertical;
761
+ overflow: hidden;
762
+ }
763
+
764
+ .bonsai-result-price {
765
+ font-family: var(--bonsai-font-body);
766
+ font-size: var(--bonsai-font-size-sm);
767
+ font-weight: 600;
768
+ line-height: 1.5;
769
+ color: var(--bonsai-card-text-color, var(--bonsai-text-color));
770
+ }
771
+
772
+ .bonsai-result-compare-at {
773
+ font-family: var(--bonsai-font-body);
774
+ font-size: var(--bonsai-font-size-sm);
775
+ line-height: 1.5;
776
+ color: var(--bonsai-card-text-color, var(--bonsai-text-color));
777
+ opacity: 0.5;
778
+ margin: 0;
779
+ text-decoration: line-through;
780
+ }
781
+
782
+ /* ============================================================================
783
+ * RECOMMENDATIONS LOADING INDICATOR
784
+ * ============================================================================ */
785
+ .bonsai-recommendations-loading {
786
+ display: flex;
787
+ align-items: center;
788
+ gap: var(--bonsai-space-3);
789
+ padding: var(--bonsai-space-4);
790
+ margin-bottom: var(--bonsai-space-4);
791
+ background-color: var(--bonsai-input-bg);
792
+ border-radius: var(--bonsai-radius-lg);
793
+ }
794
+
795
+ .bonsai-recommendations-loading-spinner {
796
+ width: var(--bonsai-icon-size);
797
+ height: var(--bonsai-icon-size);
798
+ animation: bonsai-spin 1s linear infinite;
799
+ }
800
+
801
+ .bonsai-recommendations-loading-spinner svg {
802
+ width: 100%;
803
+ height: 100%;
804
+ }
805
+
806
+ .bonsai-recommendations-loading-text {
807
+ font-family: var(--bonsai-font-body);
808
+ font-size: var(--bonsai-font-size-sm);
809
+ color: var(--bonsai-muted-color);
810
+ }
811
+
812
+ /* ============================================================================
813
+ * RECOMMENDATION PRODUCTS (existing SDK feature)
814
+ * ============================================================================ */
815
+ .bonsai-recommendation-products {
816
+ margin-top: var(--bonsai-space-4);
817
+ padding-top: var(--bonsai-space-4);
818
+ }
819
+
820
+ .bonsai-recommendation-products-header {
821
+ font-family: var(--bonsai-font-heading);
822
+ font-size: var(--bonsai-font-size-xl);
823
+ font-weight: 500;
824
+ color: var(--bonsai-results-text-color, var(--bonsai-text-color));
825
+ margin: 0 0 var(--bonsai-space-3) 0;
826
+ }
827
+
828
+ /* ============================================================================
829
+ * EMPTY & ERROR STATES
830
+ * ============================================================================ */
831
+ .bonsai-empty-state {
832
+ text-align: center;
833
+ padding: var(--bonsai-space-6);
834
+ font-family: var(--bonsai-font-body);
835
+ font-size: var(--bonsai-font-size-sm);
836
+ color: var(--bonsai-muted-color);
837
+ }
838
+
839
+ .bonsai-error {
840
+ padding: var(--bonsai-space-4);
841
+ border-radius: var(--bonsai-radius-lg);
842
+ background-color: var(--bonsai-error-bg);
843
+ color: var(--bonsai-error-color);
844
+ font-family: var(--bonsai-font-body);
845
+ font-size: var(--bonsai-font-size-sm);
846
+ }
847
+
848
+ /* ============================================================================
849
+ * UTILITY CLASSES
850
+ * ============================================================================ */
851
+ .bonsai-sr-only {
852
+ position: absolute;
853
+ width: 1px;
854
+ height: 1px;
855
+ padding: 0;
856
+ margin: -1px;
857
+ overflow: hidden;
858
+ clip: rect(0, 0, 0, 0);
859
+ white-space: nowrap;
860
+ border: 0;
861
+ }