@poirazis/supercomponents-shared 0.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.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -0
  3. package/dist/index.js +30635 -0
  4. package/dist/index.umd.cjs +12 -0
  5. package/dist/style.css +1 -0
  6. package/package.json +117 -0
  7. package/src/index.js +29 -0
  8. package/src/index.ts +31 -0
  9. package/src/lib/Actions/autoresize_textarea.js +14 -0
  10. package/src/lib/Actions/click_outside.js +80 -0
  11. package/src/lib/Actions/index.js +4 -0
  12. package/src/lib/Actions/position_dropdown.js +129 -0
  13. package/src/lib/SuperButton/SuperButton.svelte +341 -0
  14. package/src/lib/SuperFieldLabel/SuperFieldLabel.svelte +91 -0
  15. package/src/lib/SuperFieldsCommon.css +54 -0
  16. package/src/lib/SuperList/SuperList.svelte +308 -0
  17. package/src/lib/SuperList/drag-handle.svelte +31 -0
  18. package/src/lib/SuperPopover/SuperPopover.svelte +134 -0
  19. package/src/lib/SuperTable/SuperTable.css +410 -0
  20. package/src/lib/SuperTable/SuperTable.svelte +1332 -0
  21. package/src/lib/SuperTable/constants.js +85 -0
  22. package/src/lib/SuperTable/controls/ColumnsSection.svelte +34 -0
  23. package/src/lib/SuperTable/controls/ControlSection.svelte +3 -0
  24. package/src/lib/SuperTable/controls/RowButtonsColumn.svelte +169 -0
  25. package/src/lib/SuperTable/controls/SelectionColumn.svelte +174 -0
  26. package/src/lib/SuperTable/controls/SuperTableWelcome.svelte +58 -0
  27. package/src/lib/SuperTable/overlays/AddNewRowOverlay.svelte +52 -0
  28. package/src/lib/SuperTable/overlays/EmptyResultSetOverlay.svelte +13 -0
  29. package/src/lib/SuperTable/overlays/LoadingOverlay.svelte +3 -0
  30. package/src/lib/SuperTable/overlays/RowContextMenu copy.svelte +57 -0
  31. package/src/lib/SuperTable/overlays/RowContextMenu.svelte +58 -0
  32. package/src/lib/SuperTable/overlays/ScrollbarsOverlay.svelte +184 -0
  33. package/src/lib/SuperTable/overlays/SelectedActionsOverlay.svelte +64 -0
  34. package/src/lib/SuperTable/state/API.js +0 -0
  35. package/src/lib/SuperTable/state/SuperTableStateMachine.js +0 -0
  36. package/src/lib/SuperTable/types.js +0 -0
  37. package/src/lib/SuperTableCells/CellAttachment.svelte +288 -0
  38. package/src/lib/SuperTableCells/CellBoolean.svelte +158 -0
  39. package/src/lib/SuperTableCells/CellColor.svelte +460 -0
  40. package/src/lib/SuperTableCells/CellCommon.css +319 -0
  41. package/src/lib/SuperTableCells/CellDatetime.svelte +180 -0
  42. package/src/lib/SuperTableCells/CellIcon.svelte +627 -0
  43. package/src/lib/SuperTableCells/CellJSON.svelte +297 -0
  44. package/src/lib/SuperTableCells/CellLink.svelte +274 -0
  45. package/src/lib/SuperTableCells/CellLinkAdvanced.svelte +298 -0
  46. package/src/lib/SuperTableCells/CellLinkPickerSelect.svelte +355 -0
  47. package/src/lib/SuperTableCells/CellLinkPickerTable.svelte +91 -0
  48. package/src/lib/SuperTableCells/CellLinkPickerTree.svelte +226 -0
  49. package/src/lib/SuperTableCells/CellNumber.svelte +179 -0
  50. package/src/lib/SuperTableCells/CellNumberSimple.svelte +56 -0
  51. package/src/lib/SuperTableCells/CellOptions.svelte +631 -0
  52. package/src/lib/SuperTableCells/CellOptionsAdvanced.svelte +684 -0
  53. package/src/lib/SuperTableCells/CellSkeleton.svelte +59 -0
  54. package/src/lib/SuperTableCells/CellString.svelte +178 -0
  55. package/src/lib/SuperTableCells/CellStringSimple.svelte +55 -0
  56. package/src/lib/SuperTableCells/index.js +21 -0
  57. package/src/lib/SuperTableCells/remixIcons.js +6772 -0
  58. package/src/lib/SuperTableColumn/SuperTableColumn.svelte +392 -0
  59. package/src/lib/SuperTableColumn/index.js +9 -0
  60. package/src/lib/SuperTableColumn/parts/SuperColumnBody.svelte +57 -0
  61. package/src/lib/SuperTableColumn/parts/SuperColumnFooter.svelte +14 -0
  62. package/src/lib/SuperTableColumn/parts/SuperColumnHeader.svelte +228 -0
  63. package/src/lib/SuperTableColumn/parts/SuperColumnRow.svelte +142 -0
  64. package/src/lib/SuperTableColumn/parts/SuperColumnRowNew.svelte +34 -0
  65. package/src/lib/SuperTree/SuperTree.svelte +117 -0
  66. package/src/types/svelte-portal.d.ts +1 -0
@@ -0,0 +1,627 @@
1
+ <script>
2
+ import SuperPopover from "../SuperPopover/SuperPopover.svelte";
3
+ import { createEventDispatcher, onMount } from "svelte";
4
+ import { ALL_ICONS, ICON_CATEGORIES, ICONS_BY_CATEGORY } from "./remixIcons";
5
+ import VirtualList from "svelte-virtual-list";
6
+
7
+ // Initialize categories with the correct structure
8
+ $: categories = Object.entries(ICON_CATEGORIES).map(([id, label]) => ({
9
+ id,
10
+ label,
11
+ icons: ICONS_BY_CATEGORY[id] || [],
12
+ }));
13
+
14
+ // Set the default selected category
15
+ $: if (categories.length > 0 && !selectedCategory) {
16
+ selectedCategory = "all";
17
+ }
18
+
19
+ export let value;
20
+ export let cellOptions = {};
21
+ export let align = "left";
22
+
23
+ let open = false;
24
+ let preview;
25
+ let searchQuery = "";
26
+ let selectedCategory = "all";
27
+ let hoveredIcon = "";
28
+ $: readonly = cellOptions?.readonly || cellOptions?.disabled;
29
+
30
+ const dispatch = createEventDispatcher();
31
+
32
+ // Icon state management
33
+ let filled = false;
34
+ let iconName = "";
35
+
36
+ // Update icon name and variant when value changes
37
+ $: if (value) {
38
+ const match = value.match(/^ri-(.+?)(?:-(line|fill))?$/);
39
+ if (match) {
40
+ iconName = match[1];
41
+ filled = match[2] === "fill";
42
+ } else {
43
+ iconName = value.replace(/^ri-/, "");
44
+ filled = false; // Default to line variant if no variant specified
45
+ }
46
+ } else {
47
+ iconName = "";
48
+ filled = false;
49
+ }
50
+
51
+ // Filter icons to only include the selected variant (line or fill)
52
+ function filterIcons(icons) {
53
+ const variant = filled ? "-fill" : "-line";
54
+ const baseIcons = new Set();
55
+
56
+ return icons
57
+ .filter((icon) => icon.endsWith(variant))
58
+ .map((icon) => {
59
+ // Get the base name without any variant
60
+ const baseName = icon.endsWith("-fill")
61
+ ? icon.slice(0, -5) // remove '-fill'
62
+ : icon.endsWith("-line")
63
+ ? icon.slice(0, -5) // remove '-line'
64
+ : icon; // no variant
65
+ return { baseName, fullName: icon };
66
+ })
67
+ .filter(({ baseName }) => {
68
+ if (!baseIcons.has(baseName)) {
69
+ baseIcons.add(baseName);
70
+ return true;
71
+ }
72
+ return false;
73
+ })
74
+ .map(({ fullName }) => fullName);
75
+ }
76
+
77
+ // Grid configuration
78
+ const buttonSize = 32; // Fixed button size in pixels
79
+ const rowsToShow = 8;
80
+ const containerPadding = 8; // pixels for top/bottom padding of container
81
+ const itemHeight = buttonSize; // Fixed height per row for the virtual list
82
+ const iconSize = 24; // Size of the icons in pixels
83
+ const iconPadding = 4; // Padding around icons in pixels
84
+ const rowHeight = buttonSize + iconPadding * 2; // Total height for each row including padding
85
+ let rowData = [];
86
+
87
+ $: itemsPerRow = cellOptions?.showCategories ? 9 : 6;
88
+ $: containerHeight = buttonSize * rowsToShow + containerPadding * 2;
89
+ $: rowData = generateRowData(
90
+ filled,
91
+ value,
92
+ itemsPerRow,
93
+ selectedCategory,
94
+ searchQuery
95
+ );
96
+
97
+ function generateRowData(useFilled) {
98
+ const currentCategory = categories.find(
99
+ (cat) => cat.id === selectedCategory
100
+ );
101
+ if (!currentCategory) return [];
102
+
103
+ // Filter to show the selected variant and remove duplicates
104
+ const variant = useFilled ? "-fill" : "-line";
105
+ let icons = [...currentCategory.icons]
106
+ .filter((icon) => icon.endsWith(variant))
107
+ .map((icon) => {
108
+ // Get the base name without any variant
109
+ const baseName = icon.endsWith("-fill")
110
+ ? icon.slice(0, -5) // remove '-fill'
111
+ : icon.endsWith("-line")
112
+ ? icon.slice(0, -5) // remove '-line'
113
+ : icon; // no variant
114
+ return { baseName, fullName: icon };
115
+ })
116
+ .filter(
117
+ ({ baseName }, index, self) =>
118
+ index === self.findIndex((i) => i.baseName === baseName)
119
+ )
120
+ .map(({ fullName }) => fullName);
121
+
122
+ if (searchQuery) {
123
+ const query = searchQuery.toLowerCase();
124
+ icons = icons.filter((icon) => {
125
+ const baseName = icon.replace(/-line|-fill$/, "");
126
+ return baseName.toLowerCase().includes(query);
127
+ });
128
+ }
129
+
130
+ // Group icons into rows for the virtual list
131
+ const rows = [];
132
+ for (let i = 0; i < icons.length; i += itemsPerRow) {
133
+ rows.push(icons.slice(i, i + itemsPerRow));
134
+ }
135
+
136
+ return rows;
137
+ }
138
+
139
+ // Reactive updates are handled in the reactive block above
140
+
141
+ const onChange = (icon) => {
142
+ const baseName = icon.replace(/-line|-fill$/, "");
143
+ const variant = filled ? "-fill" : "-line";
144
+ const newValue = `ri-${baseName}${variant}`;
145
+ const selectedValue = newValue === value ? "" : newValue;
146
+ value = selectedValue;
147
+ dispatch("change", selectedValue);
148
+ open = false;
149
+ };
150
+
151
+ // Toggle between filled and line variants
152
+ function toggleFilled() {
153
+ filled = !filled;
154
+ // The reactive statement will handle updating rowData
155
+ }
156
+
157
+ // Handle mouse enter on icon button
158
+ function handleMouseEnter(icon) {
159
+ hoveredIcon = "ri-" + icon;
160
+ }
161
+
162
+ const handleKeydown = (event, icon) => {
163
+ if (event.key === "Enter" || event.key === " ") {
164
+ event.preventDefault();
165
+ onChange(icon);
166
+ }
167
+ };
168
+
169
+ const clearSelection = () => {
170
+ value = "";
171
+ dispatch("change", null);
172
+ hoveredIcon = null;
173
+ };
174
+ </script>
175
+
176
+ <!-- Main preview button -->
177
+ <div
178
+ bind:this={preview}
179
+ class="preview-icon"
180
+ class:readonly
181
+ on:click={!readonly
182
+ ? () => {
183
+ console.log(open);
184
+ open = !open;
185
+ }
186
+ : null}
187
+ on:keydown={(e) => {
188
+ if (e.key === "Enter" || e.key === " ") {
189
+ e.preventDefault();
190
+ if (!readonly) {
191
+ open = !open;
192
+ }
193
+ }
194
+ }}
195
+ tabindex={readonly ? -1 : 0}
196
+ role="button"
197
+ aria-haspopup="dialog"
198
+ aria-expanded={open}
199
+ aria-label="Select icon"
200
+ >
201
+ {#if value}
202
+ <i class={hoveredIcon || value} />
203
+ {:else}
204
+ <div class="empty-state">
205
+ <i class={hoveredIcon || "ri-image-line"} />
206
+ </div>
207
+ {/if}
208
+ </div>
209
+
210
+ <!-- Icon Picker Popover -->
211
+ <SuperPopover {open} on:close={() => (open = false)} anchor={preview} {align}>
212
+ <div
213
+ class="icon-picker"
214
+ class:with-categories={cellOptions.showCategories}
215
+ style="
216
+ --icon-size: {iconSize};
217
+ --icon-padding: {iconPadding};
218
+ --items-per-row: {itemsPerRow};
219
+ --row-height: {rowHeight};
220
+ "
221
+ >
222
+ <div class="header">
223
+ {#if cellOptions.showCategories}
224
+ <div class="category-tabs">
225
+ {#each categories as category}
226
+ <button
227
+ class:selected={selectedCategory === category.id}
228
+ on:click={() => (selectedCategory = category.id)}
229
+ aria-label={`Show ${category.label} icons`}
230
+ >
231
+ {category.label}
232
+ </button>
233
+ {/each}
234
+ </div>
235
+ {/if}
236
+ <div class="search-container">
237
+ <i class="ri-search-line search-icon" />
238
+ <input
239
+ type="text"
240
+ bind:value={searchQuery}
241
+ placeholder="Search icons..."
242
+ class="search-input"
243
+ aria-label="Search icons"
244
+ />
245
+ {#if searchQuery}
246
+ <button
247
+ class="clear-search"
248
+ on:click={() => (searchQuery = "")}
249
+ aria-label="Clear search"
250
+ >
251
+ <i class="ri-close-line" />
252
+ </button>
253
+ {/if}
254
+ </div>
255
+ </div>
256
+
257
+ <div class="icons-grid-container">
258
+ {#if rowData.length > 0}
259
+ <VirtualList
260
+ items={rowData}
261
+ {itemHeight}
262
+ height={containerHeight}
263
+ width="100%"
264
+ let:item={rowIcons}
265
+ let:index={rowIndex}
266
+ let:style
267
+ >
268
+ <div class="icons-row" {style}>
269
+ {#each rowIcons as icon}
270
+ <button
271
+ class="icon-button"
272
+ class:selected={value === `ri-${icon}`}
273
+ on:click={() => onChange(icon)}
274
+ on:keydown={(e) => handleKeydown(e, icon)}
275
+ on:mouseenter={() => handleMouseEnter(icon)}
276
+ on:mouseleave={() => (hoveredIcon = "")}
277
+ aria-label={`Select ${icon} icon`}
278
+ tabindex="0"
279
+ >
280
+ <i class="ri-{icon}" />
281
+ </button>
282
+ {/each}
283
+ </div>
284
+ </VirtualList>
285
+ {:else}
286
+ <div class="no-results">
287
+ <i class="ri-search-line" />
288
+ <p>No icons found</p>
289
+ </div>
290
+ {/if}
291
+ </div>
292
+
293
+ <div class="footer">
294
+ <div class="footer-left">
295
+ <label class="checkbox-container">
296
+ <input
297
+ type="checkbox"
298
+ checked={filled}
299
+ on:click={toggleFilled}
300
+ on:keydown={(e) => e.key === "Enter" && toggleFilled()}
301
+ />
302
+ <span class="checkmark"></span>
303
+ <span class="checkbox-label">Filled</span>
304
+ </label>
305
+ </div>
306
+ {#if value}
307
+ <button class="clear-button" on:click={clearSelection}>
308
+ <i class="ri-close-line" /> Clear
309
+ </button>
310
+ {/if}
311
+ </div>
312
+ </div>
313
+ </SuperPopover>
314
+
315
+ <style lang="scss">
316
+ .preview-icon {
317
+ position: relative;
318
+ display: inline-flex;
319
+ align-items: center;
320
+ justify-content: center;
321
+ width: 32px;
322
+ height: 32px;
323
+ border: 1px solid var(--spectrum-global-color-gray-300);
324
+ border-radius: 4px;
325
+ background-color: var(--spectrum-global-color-gray-75);
326
+ cursor: pointer;
327
+ font-size: 1rem;
328
+ transition: all 0.2s ease-in-out;
329
+ padding: 2px;
330
+ }
331
+
332
+ .preview-icon:hover:not(.readonly) {
333
+ border-color: var(--spectrum-global-color-gray-400);
334
+ background-color: var(--spectrum-global-color-gray-100);
335
+ }
336
+
337
+ .preview-icon:focus {
338
+ outline: none;
339
+ }
340
+
341
+ .preview-icon.circle {
342
+ border-radius: 50%;
343
+ }
344
+
345
+ .preview-icon.readonly {
346
+ cursor: default;
347
+ opacity: 0.7;
348
+ }
349
+
350
+ .empty-state {
351
+ color: var(--spectrum-global-color-gray-500);
352
+ }
353
+
354
+ .icon-picker {
355
+ max-height: 400px;
356
+ max-width: 14rem;
357
+ display: flex;
358
+ flex-direction: column;
359
+ background: var(--spectrum-global-color-gray-50);
360
+ border-radius: 4px;
361
+ overflow: hidden;
362
+ gap: 0.5rem;
363
+
364
+ &.with-categories {
365
+ max-width: 20rem;
366
+ }
367
+ }
368
+
369
+ .header {
370
+ display: flex;
371
+ flex-direction: column;
372
+ gap: 0.5rem;
373
+ }
374
+
375
+ .search-container {
376
+ position: relative;
377
+ }
378
+
379
+ .search-icon {
380
+ position: absolute;
381
+ left: 8px;
382
+ top: 50%;
383
+ transform: translateY(-50%);
384
+ color: var(--spectrum-global-color-gray-500);
385
+ pointer-events: none;
386
+ }
387
+
388
+ .search-input {
389
+ width: 100%;
390
+ padding: 12px 32px;
391
+ background: transparent;
392
+ border: none;
393
+ border-bottom: 1px solid var(--spectrum-global-color-gray-300);
394
+ border-radius: 0;
395
+ font-size: 14px;
396
+ color: var(--spectrum-global-color-gray-700);
397
+ outline: none;
398
+ transition: border-color 0.2s ease;
399
+ }
400
+
401
+ .search-input:focus {
402
+ outline: none;
403
+ }
404
+
405
+ .clear-search {
406
+ position: absolute;
407
+ right: 12px;
408
+ top: 50%;
409
+ transform: translateY(-50%);
410
+ background: none;
411
+ border: none;
412
+ color: var(--spectrum-global-color-gray-500);
413
+ cursor: pointer;
414
+ padding: 4px;
415
+ display: flex;
416
+ align-items: center;
417
+ justify-content: center;
418
+ }
419
+
420
+ .category-tabs {
421
+ display: flex;
422
+ overflow-x: auto;
423
+ gap: 4px;
424
+ scrollbar-width: none;
425
+ padding: 0.5rem;
426
+ padding-bottom: none;
427
+ }
428
+
429
+ .category-tabs::-webkit-scrollbar {
430
+ display: none; /* Hide scrollbar for Chrome/Safari */
431
+ }
432
+
433
+ .category-tabs button {
434
+ padding: 6px 12px;
435
+ border: none;
436
+ background: none;
437
+ border-bottom: 2px solid transparent;
438
+ font-size: 12px;
439
+ font-weight: 500;
440
+ color: var(--spectrum-global-color-gray-700);
441
+ cursor: pointer;
442
+ white-space: nowrap;
443
+ transition: all 0.2s ease;
444
+ height: 1.75rem;
445
+ }
446
+
447
+ .category-tabs button:hover {
448
+ background-color: var(--spectrum-global-color-gray-200);
449
+ }
450
+
451
+ .category-tabs button.selected {
452
+ color: var(--spectrum-global-color-blue-600);
453
+ border-bottom: 2px solid var(--spectrum-global-color-blue-600);
454
+ background: none;
455
+ }
456
+
457
+ .icons-grid-container {
458
+ position: relative;
459
+ overflow: hidden;
460
+ width: 100%;
461
+ padding-left: 0.5rem;
462
+ }
463
+
464
+ .icons-row {
465
+ display: grid;
466
+ grid-template-columns: repeat(6, 1fr);
467
+ width: 100%;
468
+ box-sizing: border-box;
469
+ height: 32px;
470
+ align-items: center;
471
+ }
472
+
473
+ .with-categories .icons-row {
474
+ grid-template-columns: repeat(9, 1fr);
475
+ }
476
+
477
+ .icon-button {
478
+ display: flex;
479
+ align-items: center;
480
+ justify-content: center;
481
+ border: 1px solid transparent;
482
+ background: none;
483
+ border-radius: 4px;
484
+ cursor: pointer;
485
+ color: var(--spectrum-global-color-gray-700);
486
+ width: 32px;
487
+ height: 32px;
488
+ box-sizing: border-box;
489
+ font-size: 20px;
490
+ opacity: 0.9;
491
+ }
492
+ .icon-button:hover {
493
+ background-color: var(--spectrum-global-color-gray-100);
494
+ color: var(--spectrum-global-color-gray-800);
495
+ opacity: 1;
496
+ }
497
+
498
+ .icon-button:focus {
499
+ outline: none;
500
+ }
501
+
502
+ .icon-button.selected {
503
+ color: var(--spectrum-global-color-gray-800);
504
+ border: 1px dotted var(--spectrum-global-color-blue-500);
505
+ background-color: var(--spectrum-global-color-gray-200);
506
+ }
507
+
508
+ .no-results {
509
+ grid-column: 1 / -1;
510
+ display: flex;
511
+ flex-direction: column;
512
+ align-items: center;
513
+ justify-content: center;
514
+ padding: 24px;
515
+ color: var(--spectrum-global-color-gray-600);
516
+ text-align: center;
517
+ }
518
+
519
+ .no-results i {
520
+ font-size: 24px;
521
+ margin-bottom: 8px;
522
+ color: var(--spectrum-global-color-gray-500);
523
+ }
524
+
525
+ .footer {
526
+ padding: 0 0.5rem;
527
+ border-top: 1px solid var(--spectrum-global-color-gray-200);
528
+ height: 2rem;
529
+ display: flex;
530
+ justify-content: space-between;
531
+ align-items: center;
532
+ font-size: 0.75rem;
533
+ }
534
+
535
+ .footer-left {
536
+ display: flex;
537
+ align-items: center;
538
+ height: 100%;
539
+ }
540
+
541
+ .checkbox-container {
542
+ display: flex;
543
+ align-items: center;
544
+ position: relative;
545
+ padding-left: 20px;
546
+ margin: 0;
547
+ cursor: pointer;
548
+ height: 100%;
549
+ color: var(--spectrum-global-color-gray-700);
550
+ -webkit-user-select: none;
551
+ -moz-user-select: none;
552
+ -ms-user-select: none;
553
+ user-select: none;
554
+ white-space: nowrap;
555
+ }
556
+
557
+ .checkbox-container input {
558
+ position: absolute;
559
+ opacity: 0;
560
+ cursor: pointer;
561
+ height: 0;
562
+ width: 0;
563
+ }
564
+
565
+ .checkmark {
566
+ position: absolute;
567
+ top: 50%;
568
+ left: 0;
569
+ transform: translateY(-50%);
570
+ height: 12px;
571
+ width: 12px;
572
+ background-color: var(--spectrum-global-color-gray-100);
573
+ border: 1px solid var(--spectrum-global-color-gray-400);
574
+ border-radius: 2px;
575
+ transition: all 0.2s ease;
576
+ }
577
+
578
+ .checkbox-container:hover input ~ .checkmark {
579
+ border-color: var(--spectrum-global-color-gray-600);
580
+ }
581
+
582
+ .checkbox-container input:checked ~ .checkmark {
583
+ background-color: var(--spectrum-global-color-blue-500);
584
+ border-color: var(--spectrum-global-color-blue-500);
585
+ }
586
+
587
+ .checkmark:after {
588
+ content: "";
589
+ position: absolute;
590
+ display: none;
591
+ }
592
+
593
+ .checkbox-container input:checked ~ .checkmark:after {
594
+ display: block;
595
+ }
596
+
597
+ .checkbox-container .checkmark:after {
598
+ left: 3px;
599
+ top: 0;
600
+ width: 4px;
601
+ height: 7px;
602
+ border: solid white;
603
+ border-width: 0 2px 2px 0;
604
+ transform: rotate(45deg);
605
+ }
606
+
607
+ .checkbox-label {
608
+ margin-left: 4px;
609
+ }
610
+
611
+ .clear-button {
612
+ display: flex;
613
+ align-items: center;
614
+ gap: 4px;
615
+ background: none;
616
+ border: none;
617
+ color: var(--spectrum-global-color-gray-700);
618
+ font-size: 12px;
619
+ cursor: pointer;
620
+ padding: 4px 8px;
621
+ border-radius: 4px;
622
+ }
623
+
624
+ .clear-button:hover {
625
+ background-color: var(--spectrum-global-color-gray-200);
626
+ }
627
+ </style>