@agent-native/toolkit 0.20.8 → 0.21.0-nightly-20260925012751
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/agent-native.eject.json +30 -0
- package/dist/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/composer/TiptapComposer.js +101 -59
- package/dist/composer/TiptapComposer.js.map +1 -1
- package/dist/composer/TiptapComposer.spec.js +102 -10
- package/dist/composer/TiptapComposer.spec.js.map +1 -1
- package/dist/icons/ResourceIcon.d.ts +14 -0
- package/dist/icons/ResourceIcon.d.ts.map +1 -0
- package/dist/icons/ResourceIcon.js +43 -0
- package/dist/icons/ResourceIcon.js.map +1 -0
- package/dist/icons/ResourceIcon.spec.d.ts +2 -0
- package/dist/icons/ResourceIcon.spec.d.ts.map +1 -0
- package/dist/icons/ResourceIcon.spec.js +23 -0
- package/dist/icons/ResourceIcon.spec.js.map +1 -0
- package/dist/icons/ResourceIconPicker.d.ts +52 -0
- package/dist/icons/ResourceIconPicker.d.ts.map +1 -0
- package/dist/icons/ResourceIconPicker.js +344 -0
- package/dist/icons/ResourceIconPicker.js.map +1 -0
- package/dist/icons/catalog.d.ts +17 -0
- package/dist/icons/catalog.d.ts.map +1 -0
- package/dist/icons/catalog.js +114 -0
- package/dist/icons/catalog.js.map +1 -0
- package/dist/icons/catalog.spec.d.ts +2 -0
- package/dist/icons/catalog.spec.d.ts.map +1 -0
- package/dist/icons/catalog.spec.js +29 -0
- package/dist/icons/catalog.spec.js.map +1 -0
- package/dist/icons/emoji-catalog.d.ts +12 -0
- package/dist/icons/emoji-catalog.d.ts.map +1 -0
- package/dist/icons/emoji-catalog.js +59 -0
- package/dist/icons/emoji-catalog.js.map +1 -0
- package/dist/icons/emoji-catalog.spec.d.ts +2 -0
- package/dist/icons/emoji-catalog.spec.d.ts.map +1 -0
- package/dist/icons/emoji-catalog.spec.js +29 -0
- package/dist/icons/emoji-catalog.spec.js.map +1 -0
- package/dist/icons/icon-colors.d.ts +3 -0
- package/dist/icons/icon-colors.d.ts.map +1 -0
- package/dist/icons/icon-colors.js +12 -0
- package/dist/icons/icon-colors.js.map +1 -0
- package/dist/icons/icon-persistence.spec.d.ts +2 -0
- package/dist/icons/icon-persistence.spec.d.ts.map +1 -0
- package/dist/icons/icon-persistence.spec.js +38 -0
- package/dist/icons/icon-persistence.spec.js.map +1 -0
- package/dist/icons/index.d.ts +5 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +5 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/icons/recents.d.ts +6 -0
- package/dist/icons/recents.d.ts.map +1 -0
- package/dist/icons/recents.js +23 -0
- package/dist/icons/recents.js.map +1 -0
- package/dist/icons/recents.spec.d.ts +2 -0
- package/dist/icons/recents.spec.d.ts.map +1 -0
- package/dist/icons/recents.spec.js +29 -0
- package/dist/icons/recents.spec.js.map +1 -0
- package/dist/icons/server.d.ts +7 -0
- package/dist/icons/server.d.ts.map +1 -0
- package/dist/icons/server.js +25 -0
- package/dist/icons/server.js.map +1 -0
- package/dist/icons/tabler-catalog-data.d.ts +31 -0
- package/dist/icons/tabler-catalog-data.d.ts.map +1 -0
- package/dist/icons/tabler-catalog-data.js +30121 -0
- package/dist/icons/tabler-catalog-data.js.map +1 -0
- package/dist/icons/tabler-chunk-loaders.d.ts +30 -0
- package/dist/icons/tabler-chunk-loaders.d.ts.map +1 -0
- package/dist/icons/tabler-chunk-loaders.js +30 -0
- package/dist/icons/tabler-chunk-loaders.js.map +1 -0
- package/dist/icons/tabler-chunks/a.d.ts +450 -0
- package/dist/icons/tabler-chunks/a.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/a.js +451 -0
- package/dist/icons/tabler-chunks/a.js.map +1 -0
- package/dist/icons/tabler-chunks/b.d.ts +849 -0
- package/dist/icons/tabler-chunks/b.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/b.js +850 -0
- package/dist/icons/tabler-chunks/b.js.map +1 -0
- package/dist/icons/tabler-chunks/c.d.ts +922 -0
- package/dist/icons/tabler-chunks/c.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/c.js +923 -0
- package/dist/icons/tabler-chunks/c.js.map +1 -0
- package/dist/icons/tabler-chunks/d.d.ts +380 -0
- package/dist/icons/tabler-chunks/d.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/d.js +381 -0
- package/dist/icons/tabler-chunks/d.js.map +1 -0
- package/dist/icons/tabler-chunks/e.d.ts +112 -0
- package/dist/icons/tabler-chunks/e.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/e.js +113 -0
- package/dist/icons/tabler-chunks/e.js.map +1 -0
- package/dist/icons/tabler-chunks/f.d.ts +341 -0
- package/dist/icons/tabler-chunks/f.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/f.js +342 -0
- package/dist/icons/tabler-chunks/f.js.map +1 -0
- package/dist/icons/tabler-chunks/g.d.ts +101 -0
- package/dist/icons/tabler-chunks/g.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/g.js +102 -0
- package/dist/icons/tabler-chunks/g.js.map +1 -0
- package/dist/icons/tabler-chunks/h.d.ts +276 -0
- package/dist/icons/tabler-chunks/h.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/h.js +277 -0
- package/dist/icons/tabler-chunks/h.js.map +1 -0
- package/dist/icons/tabler-chunks/i.d.ts +79 -0
- package/dist/icons/tabler-chunks/i.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/i.js +80 -0
- package/dist/icons/tabler-chunks/i.js.map +1 -0
- package/dist/icons/tabler-chunks/j.d.ts +17 -0
- package/dist/icons/tabler-chunks/j.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/j.js +18 -0
- package/dist/icons/tabler-chunks/j.js.map +1 -0
- package/dist/icons/tabler-chunks/k.d.ts +25 -0
- package/dist/icons/tabler-chunks/k.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/k.js +26 -0
- package/dist/icons/tabler-chunks/k.js.map +1 -0
- package/dist/icons/tabler-chunks/l.d.ts +298 -0
- package/dist/icons/tabler-chunks/l.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/l.js +299 -0
- package/dist/icons/tabler-chunks/l.js.map +1 -0
- package/dist/icons/tabler-chunks/m.d.ts +413 -0
- package/dist/icons/tabler-chunks/m.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/m.js +414 -0
- package/dist/icons/tabler-chunks/m.js.map +1 -0
- package/dist/icons/tabler-chunks/n.d.ts +174 -0
- package/dist/icons/tabler-chunks/n.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/n.js +175 -0
- package/dist/icons/tabler-chunks/n.js.map +1 -0
- package/dist/icons/tabler-chunks/o.d.ts +31 -0
- package/dist/icons/tabler-chunks/o.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/o.js +32 -0
- package/dist/icons/tabler-chunks/o.js.map +1 -0
- package/dist/icons/tabler-chunks/p.d.ts +374 -0
- package/dist/icons/tabler-chunks/p.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/p.js +375 -0
- package/dist/icons/tabler-chunks/p.js.map +1 -0
- package/dist/icons/tabler-chunks/q.d.ts +14 -0
- package/dist/icons/tabler-chunks/q.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/q.js +15 -0
- package/dist/icons/tabler-chunks/q.js.map +1 -0
- package/dist/icons/tabler-chunks/r.d.ts +183 -0
- package/dist/icons/tabler-chunks/r.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/r.js +184 -0
- package/dist/icons/tabler-chunks/r.js.map +1 -0
- package/dist/icons/tabler-chunks/s.d.ts +656 -0
- package/dist/icons/tabler-chunks/s.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/s.js +657 -0
- package/dist/icons/tabler-chunks/s.js.map +1 -0
- package/dist/icons/tabler-chunks/t.d.ts +242 -0
- package/dist/icons/tabler-chunks/t.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/t.js +243 -0
- package/dist/icons/tabler-chunks/t.js.map +1 -0
- package/dist/icons/tabler-chunks/u.d.ts +62 -0
- package/dist/icons/tabler-chunks/u.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/u.js +63 -0
- package/dist/icons/tabler-chunks/u.js.map +1 -0
- package/dist/icons/tabler-chunks/v.d.ts +60 -0
- package/dist/icons/tabler-chunks/v.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/v.js +61 -0
- package/dist/icons/tabler-chunks/v.js.map +1 -0
- package/dist/icons/tabler-chunks/w.d.ts +115 -0
- package/dist/icons/tabler-chunks/w.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/w.js +116 -0
- package/dist/icons/tabler-chunks/w.js.map +1 -0
- package/dist/icons/tabler-chunks/x.d.ts +18 -0
- package/dist/icons/tabler-chunks/x.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/x.js +19 -0
- package/dist/icons/tabler-chunks/x.js.map +1 -0
- package/dist/icons/tabler-chunks/y.d.ts +7 -0
- package/dist/icons/tabler-chunks/y.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/y.js +4 -0
- package/dist/icons/tabler-chunks/y.js.map +1 -0
- package/dist/icons/tabler-chunks/z.d.ts +51 -0
- package/dist/icons/tabler-chunks/z.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/z.js +52 -0
- package/dist/icons/tabler-chunks/z.js.map +1 -0
- package/dist/icons/tabler-groups.d.ts +30 -0
- package/dist/icons/tabler-groups.d.ts.map +1 -0
- package/dist/icons/tabler-groups.js +65 -0
- package/dist/icons/tabler-groups.js.map +1 -0
- package/dist/icons/types.d.ts +25 -0
- package/dist/icons/types.d.ts.map +1 -0
- package/dist/icons/types.js +2 -0
- package/dist/icons/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +2 -0
- package/dist/theme/resource-icons.css +24 -0
- package/package.json +11 -2
- package/src/composer/TiptapComposer.spec.ts +142 -15
- package/src/composer/TiptapComposer.tsx +109 -58
- package/src/icons/ResourceIcon.spec.tsx +38 -0
- package/src/icons/ResourceIcon.tsx +91 -0
- package/src/icons/ResourceIconPicker.tsx +812 -0
- package/src/icons/catalog.spec.ts +50 -0
- package/src/icons/catalog.ts +153 -0
- package/src/icons/emoji-catalog.spec.ts +46 -0
- package/src/icons/emoji-catalog.ts +86 -0
- package/src/icons/icon-colors.ts +13 -0
- package/src/icons/icon-persistence.spec.ts +45 -0
- package/src/icons/index.ts +4 -0
- package/src/icons/recents.spec.ts +37 -0
- package/src/icons/recents.ts +37 -0
- package/src/icons/server.tsx +53 -0
- package/src/icons/tabler-catalog-data.ts +30122 -0
- package/src/icons/tabler-chunk-loaders.ts +29 -0
- package/src/icons/tabler-chunks/a.ts +897 -0
- package/src/icons/tabler-chunks/b.ts +1695 -0
- package/src/icons/tabler-chunks/c.ts +1841 -0
- package/src/icons/tabler-chunks/d.ts +757 -0
- package/src/icons/tabler-chunks/e.ts +221 -0
- package/src/icons/tabler-chunks/f.ts +679 -0
- package/src/icons/tabler-chunks/g.ts +199 -0
- package/src/icons/tabler-chunks/h.ts +549 -0
- package/src/icons/tabler-chunks/i.ts +155 -0
- package/src/icons/tabler-chunks/j.ts +31 -0
- package/src/icons/tabler-chunks/k.ts +47 -0
- package/src/icons/tabler-chunks/l.ts +593 -0
- package/src/icons/tabler-chunks/m.ts +823 -0
- package/src/icons/tabler-chunks/n.ts +345 -0
- package/src/icons/tabler-chunks/o.ts +59 -0
- package/src/icons/tabler-chunks/p.ts +745 -0
- package/src/icons/tabler-chunks/q.ts +25 -0
- package/src/icons/tabler-chunks/r.ts +363 -0
- package/src/icons/tabler-chunks/s.ts +1309 -0
- package/src/icons/tabler-chunks/t.ts +481 -0
- package/src/icons/tabler-chunks/u.ts +121 -0
- package/src/icons/tabler-chunks/v.ts +117 -0
- package/src/icons/tabler-chunks/w.ts +227 -0
- package/src/icons/tabler-chunks/x.ts +33 -0
- package/src/icons/tabler-chunks/y.ts +3 -0
- package/src/icons/tabler-chunks/z.ts +99 -0
- package/src/icons/tabler-groups.ts +70 -0
- package/src/icons/types.ts +35 -0
- package/src/index.ts +1 -0
- package/src/styles.css +2 -0
- package/src/theme/resource-icons.css +24 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { IconCheck, IconChevronRight, IconPhotoPlus, IconSearch, } from "@tabler/icons-react";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Button } from "../ui/button.js";
|
|
5
|
+
import { Input } from "../ui/input.js";
|
|
6
|
+
import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger, } from "../ui/popover.js";
|
|
7
|
+
import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "../ui/select.js";
|
|
8
|
+
import { Tabs, TabsList, TabsTrigger } from "../ui/tabs.js";
|
|
9
|
+
import { cn } from "../utils.js";
|
|
10
|
+
import { loadTablerCatalog } from "./catalog.js";
|
|
11
|
+
import { loadEmojiCatalog, EMOJI_CATEGORIES } from "./emoji-catalog.js";
|
|
12
|
+
import { resourceIconColorClasses } from "./icon-colors.js";
|
|
13
|
+
import { useResourceIconRecents } from "./recents.js";
|
|
14
|
+
import { ResourceIcon } from "./ResourceIcon.js";
|
|
15
|
+
import { TABLER_ICON_GROUPS } from "./tabler-groups.js";
|
|
16
|
+
const colors = [
|
|
17
|
+
undefined,
|
|
18
|
+
"gray",
|
|
19
|
+
"brown",
|
|
20
|
+
"orange",
|
|
21
|
+
"yellow",
|
|
22
|
+
"green",
|
|
23
|
+
"blue",
|
|
24
|
+
"purple",
|
|
25
|
+
"pink",
|
|
26
|
+
"red",
|
|
27
|
+
];
|
|
28
|
+
const columns = 7;
|
|
29
|
+
const rowHeight = 36;
|
|
30
|
+
const MAX_ICON_UPLOAD_BYTES = 5 * 1024 * 1024;
|
|
31
|
+
export function persistedIconValue(value) {
|
|
32
|
+
if (value.kind !== "image")
|
|
33
|
+
return value;
|
|
34
|
+
return {
|
|
35
|
+
version: 1,
|
|
36
|
+
kind: "image",
|
|
37
|
+
assetId: value.assetId,
|
|
38
|
+
authority: value.authority,
|
|
39
|
+
...(value.alt === undefined ? {} : { alt: value.alt }),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function choiceLabel(value) {
|
|
43
|
+
return value.kind === "emoji"
|
|
44
|
+
? value.emoji
|
|
45
|
+
: value.kind === "library"
|
|
46
|
+
? value.name.replaceAll("-", " ")
|
|
47
|
+
: (value.alt ?? value.assetId);
|
|
48
|
+
}
|
|
49
|
+
function IconGrid({ items, sections, labels, recents, query, selectedKey, resolveImageUrl, onSelect, }) {
|
|
50
|
+
const viewport = React.useRef(null);
|
|
51
|
+
const [scrollTop, setScrollTop] = React.useState(0);
|
|
52
|
+
const [collapsed, setCollapsed] = React.useState(() => new Set(sections.flatMap((section) => [
|
|
53
|
+
...(section.initiallyCollapsed ? [section.id] : []),
|
|
54
|
+
...(section.children ?? [])
|
|
55
|
+
.filter((child) => child.initiallyCollapsed)
|
|
56
|
+
.map((child) => child.id),
|
|
57
|
+
])));
|
|
58
|
+
const normalized = query.trim().toLowerCase();
|
|
59
|
+
const rows = React.useMemo(() => {
|
|
60
|
+
const result = [];
|
|
61
|
+
const addRows = (entries) => {
|
|
62
|
+
if (!entries.length)
|
|
63
|
+
return;
|
|
64
|
+
for (let i = 0; i < entries.length; i += columns)
|
|
65
|
+
result.push({ items: entries.slice(i, i + columns) });
|
|
66
|
+
};
|
|
67
|
+
const addSection = (section, depth = 0) => {
|
|
68
|
+
const entries = items.filter((item) => section.categories.includes(item.category));
|
|
69
|
+
if (!entries.length)
|
|
70
|
+
return;
|
|
71
|
+
result.push({
|
|
72
|
+
id: section.id,
|
|
73
|
+
label: section.label,
|
|
74
|
+
collapsed: collapsed.has(section.id),
|
|
75
|
+
depth,
|
|
76
|
+
});
|
|
77
|
+
if (collapsed.has(section.id))
|
|
78
|
+
return;
|
|
79
|
+
if (section.children) {
|
|
80
|
+
for (const child of section.children)
|
|
81
|
+
addSection(child, depth + 1);
|
|
82
|
+
}
|
|
83
|
+
else
|
|
84
|
+
addRows(entries);
|
|
85
|
+
};
|
|
86
|
+
if (normalized)
|
|
87
|
+
addRows(items.filter((item) => (item.value.kind === "emoji" &&
|
|
88
|
+
item.value.emoji === query.trim()) ||
|
|
89
|
+
normalized
|
|
90
|
+
.split(/\s+/u)
|
|
91
|
+
.every((part) => item.search.includes(part))));
|
|
92
|
+
else {
|
|
93
|
+
if (recents.length) {
|
|
94
|
+
result.push({
|
|
95
|
+
id: "recent",
|
|
96
|
+
label: labels.recents,
|
|
97
|
+
collapsed: collapsed.has("recent"),
|
|
98
|
+
depth: 0,
|
|
99
|
+
});
|
|
100
|
+
if (!collapsed.has("recent"))
|
|
101
|
+
addRows(recents.slice(0, columns).map((value) => ({
|
|
102
|
+
value,
|
|
103
|
+
label: choiceLabel(value),
|
|
104
|
+
category: "recent",
|
|
105
|
+
search: "",
|
|
106
|
+
})));
|
|
107
|
+
}
|
|
108
|
+
for (const section of sections)
|
|
109
|
+
addSection(section);
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}, [items, sections, labels, recents, query, normalized, collapsed]);
|
|
113
|
+
React.useEffect(() => {
|
|
114
|
+
viewport.current?.scrollTo({ top: 0 });
|
|
115
|
+
setScrollTop(0);
|
|
116
|
+
}, [normalized]);
|
|
117
|
+
const maxScrollTop = Math.max(0, rows.length * rowHeight - 256);
|
|
118
|
+
const first = Math.max(0, Math.floor(Math.min(scrollTop, maxScrollTop) / rowHeight) - 2);
|
|
119
|
+
const last = Math.min(rows.length, first + 13);
|
|
120
|
+
return (_jsx("div", { ref: viewport, className: "h-64 overflow-y-auto overscroll-contain px-2", onScroll: (event) => setScrollTop(event.currentTarget.scrollTop), children: rows.length === 0 ? (_jsx("p", { className: "py-10 text-center text-sm text-muted-foreground", role: "status", children: labels.noResults })) : (_jsx("div", { className: "relative", style: { height: rows.length * rowHeight }, children: rows.slice(first, last).map((row, index) => (_jsx("div", { className: "absolute inset-x-0", style: { top: (first + index) * rowHeight, height: rowHeight }, children: "label" in row ? (_jsxs("button", { type: "button", "aria-expanded": !row.collapsed, onClick: () => setCollapsed((current) => {
|
|
121
|
+
const next = new Set(current);
|
|
122
|
+
if (next.has(row.id))
|
|
123
|
+
next.delete(row.id);
|
|
124
|
+
else
|
|
125
|
+
next.add(row.id);
|
|
126
|
+
return next;
|
|
127
|
+
}), className: cn("flex h-full w-full items-end gap-1 rounded px-1 pb-1 text-start text-xs font-medium text-muted-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring", row.depth > 0 && "ps-4"), children: [_jsx(IconChevronRight, { "aria-hidden": true, className: cn("size-3.5 shrink-0 transition-transform", !row.collapsed && "rotate-90") }), row.label] })) : (_jsx("div", { className: "grid h-full grid-cols-7 gap-1", children: row.items.map((item) => (_jsx("button", { type: "button", title: item.label, "aria-label": item.label, "aria-pressed": selectedKey === JSON.stringify(item.value), onClick: () => onSelect(item.value), className: cn("flex h-9 min-w-0 items-center justify-center rounded-md hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring", selectedKey === JSON.stringify(item.value) &&
|
|
128
|
+
"bg-accent ring-1 ring-inset ring-ring"), children: _jsx(ResourceIcon, { value: item.value, size: 20, resolveImageUrl: resolveImageUrl }) }, JSON.stringify(item.value)))) })) }, first + index))) })) }));
|
|
129
|
+
}
|
|
130
|
+
export function ResourceIconPicker({ value, onValueChange, labels, recentValues, onRecentsChange, uploadedImages = [], onUpload, onUploadError, resolveImageUrl, disabled, className, contentClassName, portalled, container, open: controlledOpen, onOpenChange, anchored, anchorElement, children, }) {
|
|
131
|
+
const [localRecents, setLocalRecents] = React.useState([]);
|
|
132
|
+
const [internalOpen, setInternalOpen] = React.useState(false);
|
|
133
|
+
const open = controlledOpen ?? internalOpen;
|
|
134
|
+
const changeOpen = (next) => {
|
|
135
|
+
if (controlledOpen === undefined)
|
|
136
|
+
setInternalOpen(next);
|
|
137
|
+
onOpenChange?.(next);
|
|
138
|
+
};
|
|
139
|
+
const [tab, setTab] = React.useState("icons");
|
|
140
|
+
const [query, setQuery] = React.useState("");
|
|
141
|
+
const [category, setCategory] = React.useState("all");
|
|
142
|
+
const [catalog, setCatalog] = React.useState([]);
|
|
143
|
+
const [emoji, setEmoji] = React.useState([]);
|
|
144
|
+
const [loading, setLoading] = React.useState(false);
|
|
145
|
+
const [loadFailed, setLoadFailed] = React.useState(false);
|
|
146
|
+
const [retry, setRetry] = React.useState(0);
|
|
147
|
+
const [uploading, setUploading] = React.useState(false);
|
|
148
|
+
const [saveFailed, setSaveFailed] = React.useState(false);
|
|
149
|
+
const [uploadError, setUploadError] = React.useState();
|
|
150
|
+
const [color, setColor] = React.useState(value?.kind === "library" ? value.color : undefined);
|
|
151
|
+
const fileInput = React.useRef(null);
|
|
152
|
+
const saveQueue = React.useRef(Promise.resolve());
|
|
153
|
+
const effectiveRecents = recentValues ?? localRecents;
|
|
154
|
+
React.useEffect(() => {
|
|
155
|
+
if (!open)
|
|
156
|
+
return;
|
|
157
|
+
setColor(value?.kind === "library" ? value.color : undefined);
|
|
158
|
+
try {
|
|
159
|
+
const parsed = JSON.parse(window.localStorage.getItem("agent-native.resource-icon-recents") ??
|
|
160
|
+
"[]");
|
|
161
|
+
if (Array.isArray(parsed))
|
|
162
|
+
setLocalRecents(parsed
|
|
163
|
+
.filter((entry) => entry &&
|
|
164
|
+
entry.version === 1 &&
|
|
165
|
+
["emoji", "library", "image"].includes(entry.kind))
|
|
166
|
+
.slice(0, 24)
|
|
167
|
+
.map(persistedIconValue));
|
|
168
|
+
// coercion-ok: recents are optional browser convenience; selection does not depend on storage.
|
|
169
|
+
}
|
|
170
|
+
catch { }
|
|
171
|
+
}, [open]);
|
|
172
|
+
const remember = useResourceIconRecents(effectiveRecents, (next) => {
|
|
173
|
+
if (recentValues === undefined) {
|
|
174
|
+
setLocalRecents(next);
|
|
175
|
+
try {
|
|
176
|
+
window.localStorage.setItem("agent-native.resource-icon-recents", JSON.stringify(next));
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// coercion-ok: recents are optional browser convenience; selection does not depend on storage.
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
onRecentsChange?.(next);
|
|
183
|
+
});
|
|
184
|
+
React.useEffect(() => {
|
|
185
|
+
if (!open || tab === "upload")
|
|
186
|
+
return;
|
|
187
|
+
let active = true;
|
|
188
|
+
setLoading(true);
|
|
189
|
+
setLoadFailed(false);
|
|
190
|
+
const request = tab === "icons"
|
|
191
|
+
? loadTablerCatalog().then((entries) => entries.map((entry) => ({
|
|
192
|
+
category: entry.category,
|
|
193
|
+
search: entry.search,
|
|
194
|
+
label: entry.name.replaceAll("-", " "),
|
|
195
|
+
value: {
|
|
196
|
+
version: 1,
|
|
197
|
+
kind: "library",
|
|
198
|
+
library: "tabler",
|
|
199
|
+
name: entry.name.endsWith("-filled")
|
|
200
|
+
? entry.name.slice(0, -7)
|
|
201
|
+
: entry.name,
|
|
202
|
+
...(entry.name.endsWith("-filled")
|
|
203
|
+
? { variant: "filled" }
|
|
204
|
+
: {}),
|
|
205
|
+
},
|
|
206
|
+
})))
|
|
207
|
+
: loadEmojiCatalog().then((entries) => entries.map((entry) => ({
|
|
208
|
+
category: entry.category,
|
|
209
|
+
search: entry.search,
|
|
210
|
+
label: entry.label,
|
|
211
|
+
value: { version: 1, kind: "emoji", emoji: entry.emoji },
|
|
212
|
+
})));
|
|
213
|
+
void request
|
|
214
|
+
.then((entries) => {
|
|
215
|
+
if (active)
|
|
216
|
+
tab === "icons" ? setCatalog(entries) : setEmoji(entries);
|
|
217
|
+
})
|
|
218
|
+
.catch((error) => {
|
|
219
|
+
console.error("Icon catalog could not load", error);
|
|
220
|
+
if (active)
|
|
221
|
+
setLoadFailed(true);
|
|
222
|
+
})
|
|
223
|
+
.finally(() => {
|
|
224
|
+
if (active)
|
|
225
|
+
setLoading(false);
|
|
226
|
+
});
|
|
227
|
+
return () => {
|
|
228
|
+
active = false;
|
|
229
|
+
};
|
|
230
|
+
}, [open, tab, retry]);
|
|
231
|
+
const select = async (next, close = true) => {
|
|
232
|
+
setSaveFailed(false);
|
|
233
|
+
setUploadError(undefined);
|
|
234
|
+
const persisted = next ? persistedIconValue(next) : null;
|
|
235
|
+
try {
|
|
236
|
+
const save = saveQueue.current.then(() => onValueChange(persisted));
|
|
237
|
+
saveQueue.current = save.catch(() => { });
|
|
238
|
+
await save;
|
|
239
|
+
if (persisted)
|
|
240
|
+
remember(persisted);
|
|
241
|
+
if (close)
|
|
242
|
+
changeOpen(false);
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
console.error("Icon could not be saved", error);
|
|
246
|
+
setSaveFailed(true);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
const upload = async (file) => {
|
|
250
|
+
if (!onUpload)
|
|
251
|
+
return;
|
|
252
|
+
if (file.size > MAX_ICON_UPLOAD_BYTES) {
|
|
253
|
+
setSaveFailed(false);
|
|
254
|
+
setUploadError(labels.uploadTooLarge ?? labels.saveError);
|
|
255
|
+
if (fileInput.current)
|
|
256
|
+
fileInput.current.value = "";
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
setUploading(true);
|
|
260
|
+
setSaveFailed(false);
|
|
261
|
+
setUploadError(undefined);
|
|
262
|
+
try {
|
|
263
|
+
await select(await onUpload(file));
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
setSaveFailed(true);
|
|
267
|
+
onUploadError?.(error);
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
setUploading(false);
|
|
271
|
+
if (fileInput.current)
|
|
272
|
+
fileInput.current.value = "";
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
const coloredCatalog = React.useMemo(() => catalog.map((item) => ({
|
|
276
|
+
...item,
|
|
277
|
+
value: item.value.kind === "library" ? { ...item.value, color } : item.value,
|
|
278
|
+
})), [catalog, color]);
|
|
279
|
+
const sections = tab === "icons"
|
|
280
|
+
? TABLER_ICON_GROUPS.map((group) => ({
|
|
281
|
+
id: group.id,
|
|
282
|
+
label: labels.groupNames?.[group.id] ?? group.label,
|
|
283
|
+
categories: group.categories,
|
|
284
|
+
initiallyCollapsed: category === "all",
|
|
285
|
+
...(group.id === "more"
|
|
286
|
+
? {
|
|
287
|
+
children: group.categories.map((sourceCategory) => ({
|
|
288
|
+
id: sourceCategory,
|
|
289
|
+
label: labels.categoryNames?.[sourceCategory] ?? sourceCategory,
|
|
290
|
+
categories: [sourceCategory],
|
|
291
|
+
initiallyCollapsed: true,
|
|
292
|
+
})),
|
|
293
|
+
}
|
|
294
|
+
: {}),
|
|
295
|
+
}))
|
|
296
|
+
: EMOJI_CATEGORIES.map((sourceCategory) => ({
|
|
297
|
+
id: sourceCategory,
|
|
298
|
+
label: labels.categoryNames?.[sourceCategory] ?? sourceCategory,
|
|
299
|
+
categories: [sourceCategory],
|
|
300
|
+
}));
|
|
301
|
+
const uploadChoices = [
|
|
302
|
+
...uploadedImages,
|
|
303
|
+
...effectiveRecents.filter((entry) => entry.kind === "image"),
|
|
304
|
+
].filter((entry, index, all) => all.findIndex((other) => other.assetId === entry.assetId &&
|
|
305
|
+
other.authority === entry.authority) === index);
|
|
306
|
+
return (_jsxs(Popover, { open: open, onOpenChange: (next) => {
|
|
307
|
+
changeOpen(next);
|
|
308
|
+
if (next) {
|
|
309
|
+
setQuery("");
|
|
310
|
+
setSaveFailed(false);
|
|
311
|
+
setUploadError(undefined);
|
|
312
|
+
}
|
|
313
|
+
}, children: [anchored ? (anchorElement ? (_jsx(PopoverAnchor, { virtualRef: { current: anchorElement } })) : null) : (_jsx(PopoverTrigger, { asChild: true, disabled: disabled, children: children ?? (_jsx(Button, { type: "button", variant: "ghost", size: "icon", "aria-label": labels.trigger, children: _jsx(ResourceIcon, { value: value, fallback: _jsx(IconPhotoPlus, {}), resolveImageUrl: resolveImageUrl }) })) })), _jsxs(PopoverContent, { align: "start", collisionPadding: 8, portalled: portalled, container: container, className: cn("max-h-[var(--radix-popover-content-available-height)] w-80 max-w-[calc(100vw-1rem)] overflow-y-auto p-0", className, contentClassName), children: [_jsxs(Tabs, { value: tab, onValueChange: (next) => {
|
|
314
|
+
setTab(next);
|
|
315
|
+
setQuery("");
|
|
316
|
+
setCategory("all");
|
|
317
|
+
setSaveFailed(false);
|
|
318
|
+
setUploadError(undefined);
|
|
319
|
+
}, children: [_jsx("div", { className: "p-2", children: _jsxs(TabsList, { className: "grid w-full grid-cols-3", children: [_jsx(TabsTrigger, { value: "icons", children: labels.iconsTab }), _jsx(TabsTrigger, { value: "emoji", children: labels.emojiTab }), _jsx(TabsTrigger, { value: "upload", children: labels.uploadTab })] }) }), tab !== "upload" && (_jsxs("div", { className: "relative mx-3 mb-2", children: [_jsx(IconSearch, { "aria-hidden": true, className: "pointer-events-none absolute start-2 top-2 size-4 text-muted-foreground" }), _jsx(Input, { value: query, onChange: (event) => setQuery(event.target.value), "aria-label": labels.search, placeholder: labels.search, className: "h-8 ps-8 focus-visible:ring-1" })] })), tab === "icons" && (_jsx("div", { className: "flex items-center justify-between px-3 pb-2", "aria-label": labels.colors, children: colors.map((nextColor) => (_jsx("button", { type: "button", title: nextColor
|
|
320
|
+
? (labels.colorNames?.[nextColor] ?? nextColor)
|
|
321
|
+
: labels.defaultColor, "aria-label": nextColor
|
|
322
|
+
? (labels.colorNames?.[nextColor] ?? nextColor)
|
|
323
|
+
: labels.defaultColor, "aria-pressed": color === nextColor, onClick: () => {
|
|
324
|
+
setColor(nextColor);
|
|
325
|
+
if (value?.kind === "library")
|
|
326
|
+
void select({ ...value, color: nextColor }, false);
|
|
327
|
+
}, className: cn("flex size-7 shrink-0 items-center justify-center rounded-md border border-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring", color === nextColor && "border-border bg-accent"), children: _jsx("span", { className: cn("flex size-4 items-center justify-center rounded-full bg-current", nextColor
|
|
328
|
+
? resourceIconColorClasses[nextColor]
|
|
329
|
+
: "text-foreground"), children: color === nextColor && (_jsx(IconCheck, { className: "size-3 text-background", stroke: 3 })) }) }, nextColor ?? "default"))) })), tab !== "upload" && !query && (_jsx("div", { className: "px-3 pb-2", children: _jsxs(Select, { value: category, onValueChange: setCategory, children: [_jsx(SelectTrigger, { className: "h-7 border-0 px-1 text-xs text-muted-foreground shadow-none", "aria-label": labels.allCategories, children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { className: "z-[320]", container: container, children: _jsxs(SelectGroup, { children: [_jsx(SelectItem, { value: "all", children: labels.allCategories }), sections.map((section) => (_jsx(SelectItem, { value: section.id, children: section.label }, section.id)))] }) })] }) })), tab === "upload" ? (_jsxs("div", { className: "grid gap-3 p-3 pt-1", children: [onUpload && (_jsxs("button", { type: "button", disabled: uploading, className: "flex min-h-28 flex-col items-center justify-center gap-2 rounded-md border border-dashed px-4 py-5 text-sm hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50", onClick: () => fileInput.current?.click(), onDragOver: (event) => event.preventDefault(), onDrop: (event) => {
|
|
330
|
+
event.preventDefault();
|
|
331
|
+
const file = event.dataTransfer.files[0];
|
|
332
|
+
if (file && !uploading)
|
|
333
|
+
void upload(file);
|
|
334
|
+
}, children: [_jsx(IconPhotoPlus, { className: "size-6 text-muted-foreground" }), _jsx("span", { children: uploading ? labels.uploading : labels.upload }), labels.uploadHint && (_jsx("span", { className: "text-xs text-muted-foreground", children: labels.uploadHint }))] })), _jsx("input", { ref: fileInput, type: "file", accept: "image/png,image/jpeg,image/webp,image/svg+xml", className: "hidden", disabled: uploading, onChange: (event) => {
|
|
335
|
+
const file = event.target.files?.[0];
|
|
336
|
+
if (file)
|
|
337
|
+
void upload(file);
|
|
338
|
+
} }), uploadChoices.length > 0 && (_jsx("div", { className: "grid grid-cols-7 gap-1", children: uploadChoices.map((entry) => (_jsx("button", { type: "button", title: entry.alt, "aria-label": entry.alt ?? labels.upload, className: "flex size-9 items-center justify-center rounded-md hover:bg-accent", onClick: () => void select(entry), children: _jsx(ResourceIcon, { value: entry, size: 24, resolveImageUrl: resolveImageUrl }) }, `${entry.authority}:${entry.assetId}`))) }))] })) : loadFailed ? (_jsxs("div", { role: "alert", className: "grid h-64 content-center justify-items-center gap-3 px-4 text-sm", children: [_jsx("p", { children: labels.loadError }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => setRetry((current) => current + 1), children: labels.retry })] })) : loading ? (_jsx("div", { "aria-busy": "true", className: "grid h-64 grid-cols-7 content-start gap-2 p-3", children: Array.from({ length: 28 }, (_, index) => (_jsx("div", { className: "size-7 animate-pulse rounded-md bg-muted" }, index))) })) : (_jsx(IconGrid, { items: tab === "icons" ? coloredCatalog : emoji, sections: category === "all" || query
|
|
339
|
+
? sections
|
|
340
|
+
: sections.filter((section) => section.id === category), labels: labels, recents: category === "all"
|
|
341
|
+
? effectiveRecents.filter((entry) => entry.kind === (tab === "icons" ? "library" : "emoji"))
|
|
342
|
+
: [], query: query, selectedKey: value ? JSON.stringify(value) : "", resolveImageUrl: resolveImageUrl, onSelect: (next) => void select(next) }, `${tab}:${category}`))] }), (saveFailed || uploadError) && (_jsx("p", { role: "alert", className: "px-3 py-2 text-sm text-destructive", children: uploadError ?? labels.saveError })), value && (_jsx("div", { className: "border-t p-1", children: _jsx(Button, { type: "button", variant: "ghost", className: "h-8 w-full text-xs text-muted-foreground", onClick: () => void select(null), children: labels.remove }) }))] })] }));
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=ResourceIconPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceIconPicker.js","sourceRoot":"","sources":["../../src/icons/ResourceIconPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ComponentType, SVGProps } from "react";
|
|
2
|
+
export type TablerIconComponent = ComponentType<Omit<SVGProps<SVGSVGElement>, "stroke"> & {
|
|
3
|
+
size?: number | string;
|
|
4
|
+
stroke?: number;
|
|
5
|
+
}>;
|
|
6
|
+
export declare const TABLER_ICON_CATEGORIES: readonly ["system", "communication", "document", "media", "design", "development", "devices", "computers", "database", "charts", "arrows", "shapes", "symbols", "text", "letters", "numbers", "math", "logic", "version-control", "extensions", "e-commerce", "currencies", "buildings", "map", "vehicles", "nature", "animals", "weather", "food", "health", "sport", "games", "photography", "mood", "gestures", "gender", "badges", "electrical", "laundry", "zodiac", "brand"];
|
|
7
|
+
export type TablerIconCategory = (typeof TABLER_ICON_CATEGORIES)[number];
|
|
8
|
+
export interface TablerCatalogEntry {
|
|
9
|
+
name: string;
|
|
10
|
+
category: TablerIconCategory;
|
|
11
|
+
search: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function tablerExportName(name: string): string;
|
|
14
|
+
export declare function loadTablerIcon(name: string): Promise<TablerIconComponent | null>;
|
|
15
|
+
export declare function searchTablerIcons(query: string, limit?: number): Promise<string[]>;
|
|
16
|
+
export declare function loadTablerCatalog(): Promise<TablerCatalogEntry[]>;
|
|
17
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/icons/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErD,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAC7C,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,GAAG;IACxC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CACF,CAAC;AAKF,eAAO,MAAM,sBAAsB,YACjC,QAAQ,EACR,eAAe,EACf,UAAU,EACV,OAAO,EACP,QAAQ,EACR,aAAa,EACb,SAAS,EACT,WAAW,EACX,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,MAAM,EACN,SAAS,EACT,SAAS,EACT,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,KAAK,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,EACN,QAAQ,EACR,OAAO,EACP,OAAO,EACP,aAAa,EACb,MAAM,EACN,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,OAAO,CACC,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAkBrC;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnB;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA4CjE"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export const TABLER_ICON_CATEGORIES = [
|
|
2
|
+
"system",
|
|
3
|
+
"communication",
|
|
4
|
+
"document",
|
|
5
|
+
"media",
|
|
6
|
+
"design",
|
|
7
|
+
"development",
|
|
8
|
+
"devices",
|
|
9
|
+
"computers",
|
|
10
|
+
"database",
|
|
11
|
+
"charts",
|
|
12
|
+
"arrows",
|
|
13
|
+
"shapes",
|
|
14
|
+
"symbols",
|
|
15
|
+
"text",
|
|
16
|
+
"letters",
|
|
17
|
+
"numbers",
|
|
18
|
+
"math",
|
|
19
|
+
"logic",
|
|
20
|
+
"version-control",
|
|
21
|
+
"extensions",
|
|
22
|
+
"e-commerce",
|
|
23
|
+
"currencies",
|
|
24
|
+
"buildings",
|
|
25
|
+
"map",
|
|
26
|
+
"vehicles",
|
|
27
|
+
"nature",
|
|
28
|
+
"animals",
|
|
29
|
+
"weather",
|
|
30
|
+
"food",
|
|
31
|
+
"health",
|
|
32
|
+
"sport",
|
|
33
|
+
"games",
|
|
34
|
+
"photography",
|
|
35
|
+
"mood",
|
|
36
|
+
"gestures",
|
|
37
|
+
"gender",
|
|
38
|
+
"badges",
|
|
39
|
+
"electrical",
|
|
40
|
+
"laundry",
|
|
41
|
+
"zodiac",
|
|
42
|
+
"brand",
|
|
43
|
+
];
|
|
44
|
+
let metadataPromise;
|
|
45
|
+
export function tablerExportName(name) {
|
|
46
|
+
return `Icon${name
|
|
47
|
+
.split("-")
|
|
48
|
+
.filter(Boolean)
|
|
49
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
50
|
+
.join("")}`;
|
|
51
|
+
}
|
|
52
|
+
export async function loadTablerIcon(name) {
|
|
53
|
+
if (import.meta.env.SSR &&
|
|
54
|
+
import.meta.env.MODE !== "test") {
|
|
55
|
+
throw new Error("Tabler icons are available only in the browser");
|
|
56
|
+
}
|
|
57
|
+
const initial = name.charAt(0).toLowerCase();
|
|
58
|
+
const { default: loaders } = await import("./tabler-chunk-loaders.js");
|
|
59
|
+
const loadChunk = loaders[initial];
|
|
60
|
+
if (!loadChunk)
|
|
61
|
+
return null;
|
|
62
|
+
const { default: catalog } = await loadChunk();
|
|
63
|
+
const candidate = catalog[tablerExportName(name)];
|
|
64
|
+
return typeof candidate === "object" || typeof candidate === "function"
|
|
65
|
+
? candidate
|
|
66
|
+
: null;
|
|
67
|
+
}
|
|
68
|
+
export async function searchTablerIcons(query, limit) {
|
|
69
|
+
const catalog = await loadTablerCatalog();
|
|
70
|
+
const normalized = query.trim().toLowerCase();
|
|
71
|
+
return catalog
|
|
72
|
+
.filter((entry) => entry.search.includes(normalized))
|
|
73
|
+
.map((entry) => entry.name)
|
|
74
|
+
.slice(0, limit);
|
|
75
|
+
}
|
|
76
|
+
export function loadTablerCatalog() {
|
|
77
|
+
if (import.meta.env.SSR &&
|
|
78
|
+
import.meta.env.MODE !== "test") {
|
|
79
|
+
throw new Error("Tabler catalog is available only in the browser");
|
|
80
|
+
}
|
|
81
|
+
metadataPromise ??= import("./tabler-catalog-data.js")
|
|
82
|
+
.then(({ default: metadata }) => {
|
|
83
|
+
return metadata
|
|
84
|
+
.flatMap(([baseName, category, tags, styles]) => {
|
|
85
|
+
if (!TABLER_ICON_CATEGORIES.includes(category)) {
|
|
86
|
+
throw new Error(`Unknown Tabler icon category: ${category}`);
|
|
87
|
+
}
|
|
88
|
+
return styles.split(" ").map((style) => {
|
|
89
|
+
const name = `${baseName}${style === "filled" ? "-filled" : ""}`;
|
|
90
|
+
return {
|
|
91
|
+
name,
|
|
92
|
+
category: category,
|
|
93
|
+
search: [
|
|
94
|
+
name,
|
|
95
|
+
name.replaceAll("-", " "),
|
|
96
|
+
category.replaceAll("-", " "),
|
|
97
|
+
tags,
|
|
98
|
+
]
|
|
99
|
+
.join(" ")
|
|
100
|
+
.toLowerCase(),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
})
|
|
104
|
+
.sort((left, right) => TABLER_ICON_CATEGORIES.indexOf(left.category) -
|
|
105
|
+
TABLER_ICON_CATEGORIES.indexOf(right.category) ||
|
|
106
|
+
left.name.localeCompare(right.name));
|
|
107
|
+
})
|
|
108
|
+
.catch((error) => {
|
|
109
|
+
metadataPromise = undefined;
|
|
110
|
+
throw error;
|
|
111
|
+
});
|
|
112
|
+
return metadataPromise;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/icons/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.spec.d.ts","sourceRoot":"","sources":["../../src/icons/catalog.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { icons } from "@tabler/icons-react";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { loadTablerCatalog, loadTablerIcon, searchTablerIcons, TABLER_ICON_CATEGORIES, tablerExportName, } from "./catalog.js";
|
|
4
|
+
import { TABLER_ICON_GROUPS } from "./tabler-groups.js";
|
|
5
|
+
describe("Tabler catalog", () => {
|
|
6
|
+
it("includes every canonical outline and filled icon once, with a renderable component", async () => {
|
|
7
|
+
const catalog = await loadTablerCatalog();
|
|
8
|
+
expect(catalog.map((entry) => tablerExportName(entry.name)).sort()).toEqual(Object.keys(icons).sort());
|
|
9
|
+
expect(new Set(catalog.map((entry) => entry.name)).size).toBe(catalog.length);
|
|
10
|
+
expect(catalog.length).toBeGreaterThan(6_000);
|
|
11
|
+
const components = await Promise.all(catalog.map((entry) => loadTablerIcon(entry.name)));
|
|
12
|
+
expect(components.every((component) => component !== null)).toBe(true);
|
|
13
|
+
expect(new Set(catalog.map((entry) => entry.category))).toEqual(new Set(TABLER_ICON_CATEGORIES));
|
|
14
|
+
});
|
|
15
|
+
it("does not truncate browsing or broad searches, and searches tags", async () => {
|
|
16
|
+
expect(await searchTablerIcons("")).toHaveLength((await loadTablerCatalog()).length);
|
|
17
|
+
expect((await searchTablerIcons("arrow")).length).toBeGreaterThan(120);
|
|
18
|
+
expect(await searchTablerIcons("arrow", 12)).toHaveLength(12);
|
|
19
|
+
expect(await searchTablerIcons("programming")).toContain("a-b");
|
|
20
|
+
expect(await loadTablerIcon("not-a-real-icon")).toBeNull();
|
|
21
|
+
});
|
|
22
|
+
it("places every source category in exactly one reader-facing group", () => {
|
|
23
|
+
const assigned = TABLER_ICON_GROUPS.flatMap((group) => group.categories);
|
|
24
|
+
expect(assigned).toHaveLength(TABLER_ICON_CATEGORIES.length);
|
|
25
|
+
expect(new Set(assigned)).toEqual(new Set(TABLER_ICON_CATEGORIES));
|
|
26
|
+
expect(new Set(TABLER_ICON_GROUPS.map((group) => group.id)).size).toBe(TABLER_ICON_GROUPS.length);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=catalog.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.spec.js","sourceRoot":"","sources":["../../src/icons/catalog.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const EMOJI_CATEGORIES: readonly ["smileys-emotion", "people-body", "animals-nature", "food-drink", "travel-places", "activities", "objects", "symbols", "flags"];
|
|
2
|
+
export type EmojiCategory = (typeof EMOJI_CATEGORIES)[number];
|
|
3
|
+
export interface EmojiCatalogEntry {
|
|
4
|
+
emoji: string;
|
|
5
|
+
label: string;
|
|
6
|
+
search: string;
|
|
7
|
+
category: EmojiCategory;
|
|
8
|
+
order: number;
|
|
9
|
+
skinTone?: number | number[];
|
|
10
|
+
}
|
|
11
|
+
export declare function loadEmojiCatalog(): Promise<EmojiCatalogEntry[]>;
|
|
12
|
+
//# sourceMappingURL=emoji-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-catalog.d.ts","sourceRoot":"","sources":["../../src/icons/emoji-catalog.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,YAC3B,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,SAAS,EACT,SAAS,EACT,OAAO,CACC,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC9B;AAgBD,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAgD/D"}
|