@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.
- package/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/index.js +30635 -0
- package/dist/index.umd.cjs +12 -0
- package/dist/style.css +1 -0
- package/package.json +117 -0
- package/src/index.js +29 -0
- package/src/index.ts +31 -0
- package/src/lib/Actions/autoresize_textarea.js +14 -0
- package/src/lib/Actions/click_outside.js +80 -0
- package/src/lib/Actions/index.js +4 -0
- package/src/lib/Actions/position_dropdown.js +129 -0
- package/src/lib/SuperButton/SuperButton.svelte +341 -0
- package/src/lib/SuperFieldLabel/SuperFieldLabel.svelte +91 -0
- package/src/lib/SuperFieldsCommon.css +54 -0
- package/src/lib/SuperList/SuperList.svelte +308 -0
- package/src/lib/SuperList/drag-handle.svelte +31 -0
- package/src/lib/SuperPopover/SuperPopover.svelte +134 -0
- package/src/lib/SuperTable/SuperTable.css +410 -0
- package/src/lib/SuperTable/SuperTable.svelte +1332 -0
- package/src/lib/SuperTable/constants.js +85 -0
- package/src/lib/SuperTable/controls/ColumnsSection.svelte +34 -0
- package/src/lib/SuperTable/controls/ControlSection.svelte +3 -0
- package/src/lib/SuperTable/controls/RowButtonsColumn.svelte +169 -0
- package/src/lib/SuperTable/controls/SelectionColumn.svelte +174 -0
- package/src/lib/SuperTable/controls/SuperTableWelcome.svelte +58 -0
- package/src/lib/SuperTable/overlays/AddNewRowOverlay.svelte +52 -0
- package/src/lib/SuperTable/overlays/EmptyResultSetOverlay.svelte +13 -0
- package/src/lib/SuperTable/overlays/LoadingOverlay.svelte +3 -0
- package/src/lib/SuperTable/overlays/RowContextMenu copy.svelte +57 -0
- package/src/lib/SuperTable/overlays/RowContextMenu.svelte +58 -0
- package/src/lib/SuperTable/overlays/ScrollbarsOverlay.svelte +184 -0
- package/src/lib/SuperTable/overlays/SelectedActionsOverlay.svelte +64 -0
- package/src/lib/SuperTable/state/API.js +0 -0
- package/src/lib/SuperTable/state/SuperTableStateMachine.js +0 -0
- package/src/lib/SuperTable/types.js +0 -0
- package/src/lib/SuperTableCells/CellAttachment.svelte +288 -0
- package/src/lib/SuperTableCells/CellBoolean.svelte +158 -0
- package/src/lib/SuperTableCells/CellColor.svelte +460 -0
- package/src/lib/SuperTableCells/CellCommon.css +319 -0
- package/src/lib/SuperTableCells/CellDatetime.svelte +180 -0
- package/src/lib/SuperTableCells/CellIcon.svelte +627 -0
- package/src/lib/SuperTableCells/CellJSON.svelte +297 -0
- package/src/lib/SuperTableCells/CellLink.svelte +274 -0
- package/src/lib/SuperTableCells/CellLinkAdvanced.svelte +298 -0
- package/src/lib/SuperTableCells/CellLinkPickerSelect.svelte +355 -0
- package/src/lib/SuperTableCells/CellLinkPickerTable.svelte +91 -0
- package/src/lib/SuperTableCells/CellLinkPickerTree.svelte +226 -0
- package/src/lib/SuperTableCells/CellNumber.svelte +179 -0
- package/src/lib/SuperTableCells/CellNumberSimple.svelte +56 -0
- package/src/lib/SuperTableCells/CellOptions.svelte +631 -0
- package/src/lib/SuperTableCells/CellOptionsAdvanced.svelte +684 -0
- package/src/lib/SuperTableCells/CellSkeleton.svelte +59 -0
- package/src/lib/SuperTableCells/CellString.svelte +178 -0
- package/src/lib/SuperTableCells/CellStringSimple.svelte +55 -0
- package/src/lib/SuperTableCells/index.js +21 -0
- package/src/lib/SuperTableCells/remixIcons.js +6772 -0
- package/src/lib/SuperTableColumn/SuperTableColumn.svelte +392 -0
- package/src/lib/SuperTableColumn/index.js +9 -0
- package/src/lib/SuperTableColumn/parts/SuperColumnBody.svelte +57 -0
- package/src/lib/SuperTableColumn/parts/SuperColumnFooter.svelte +14 -0
- package/src/lib/SuperTableColumn/parts/SuperColumnHeader.svelte +228 -0
- package/src/lib/SuperTableColumn/parts/SuperColumnRow.svelte +142 -0
- package/src/lib/SuperTableColumn/parts/SuperColumnRowNew.svelte +34 -0
- package/src/lib/SuperTree/SuperTree.svelte +117 -0
- 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>
|