@anvpx/motion-assets 0.0.0-stage → 0.1.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 anvpx
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/assets.json ADDED
@@ -0,0 +1,37 @@
1
+ [
2
+ {
3
+ "path": "luts/cool.cube",
4
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/luts/cool.cube",
5
+ "licence": "CC0-1.0",
6
+ "attribution": "motion-kit (original procedural LUT, CC0-1.0 public domain dedication; see luts/LICENSE-CC0.txt)",
7
+ "sha256": "4a526a94252483fb3c45923c447641ea5641547d100900abb4aefb4de6ef5e53"
8
+ },
9
+ {
10
+ "path": "luts/noir.cube",
11
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/luts/noir.cube",
12
+ "licence": "CC0-1.0",
13
+ "attribution": "motion-kit (original procedural LUT, CC0-1.0 public domain dedication; see luts/LICENSE-CC0.txt)",
14
+ "sha256": "c310820344d9ef2a09a5fb3678088cc2a8a44ea16527e306526161856312fe82"
15
+ },
16
+ {
17
+ "path": "luts/warm.cube",
18
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/luts/warm.cube",
19
+ "licence": "CC0-1.0",
20
+ "attribution": "motion-kit (original procedural LUT, CC0-1.0 public domain dedication; see luts/LICENSE-CC0.txt)",
21
+ "sha256": "2702600f848a77f54f787361f848f4e1d2d432a0db8e82d5e1035008c6e7618c"
22
+ },
23
+ {
24
+ "path": "music/bed.wav",
25
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/music/bed.wav",
26
+ "licence": "CC0-1.0",
27
+ "attribution": "motion-kit (original procedural silence bed, CC0-1.0 public domain dedication; see music/LICENSE-CC0.txt)",
28
+ "sha256": "e5ea01a23fcb85fd8e608c5c672ea5c22dfab6b0e581d782242f478e4b1c5900"
29
+ },
30
+ {
31
+ "path": "music/bed-full.wav",
32
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/music/bed-full.wav",
33
+ "licence": "CC0-1.0",
34
+ "attribution": "motion-kit (original procedural audible bed, CC0-1.0 public domain dedication; see music/LICENSE-CC0.txt)",
35
+ "sha256": "51a5977617fccbaec6c2dcfd6449757aa48a7c92f01dda354d9263321a6cc9b1"
36
+ }
37
+ ]
@@ -0,0 +1,14 @@
1
+ export interface IconLedgerRow {
2
+ readonly path: string;
3
+ readonly sourceUrl: string;
4
+ readonly licence: string;
5
+ readonly attribution: string;
6
+ readonly sha256: string;
7
+ }
8
+ /** ISC text plus the MIT notice for the Feather-derived icons, as vendored with the icons. */
9
+ export declare const LUCIDE_LICENCE_TEXT: string;
10
+ /**
11
+ * Licence rows for the icons a build inlined: distinct, sorted by path, with the attribution
12
+ * pointing at the licence file the build emits. Throws on an unknown icon name.
13
+ */
14
+ export declare const iconLedgerRows: (names: readonly string[]) => IconLedgerRow[];
@@ -0,0 +1,21 @@
1
+ import { readFileSync } from "node:fs";
2
+ import iconRows from "../icons/licences.json" with { type: "json" };
3
+ import { iconNameError } from "./icons.js";
4
+ const ROWS = new Map(iconRows.map((row) => [row.path, row]));
5
+ /** Where a build output carries the Lucide licence text. */
6
+ const OUTPUT_LICENCE = "LICENSE-lucide.txt";
7
+ /** ISC text plus the MIT notice for the Feather-derived icons, as vendored with the icons. */
8
+ export const LUCIDE_LICENCE_TEXT = readFileSync(new URL("../icons/LICENSE-lucide", import.meta.url), "utf8");
9
+ /**
10
+ * Licence rows for the icons a build inlined: distinct, sorted by path, with the attribution
11
+ * pointing at the licence file the build emits. Throws on an unknown icon name.
12
+ */
13
+ export const iconLedgerRows = (names) => [...new Set(names)].sort().map((name) => {
14
+ const problem = iconNameError(name);
15
+ if (problem !== undefined)
16
+ throw new Error(problem);
17
+ const row = ROWS.get(`icons/svg/${name}.svg`);
18
+ if (row === undefined)
19
+ throw new Error(`no licence row for icon "${name}"`);
20
+ return { ...row, attribution: row.attribution.replace("icons/LICENSE-lucide", OUTPUT_LICENCE) };
21
+ });
@@ -0,0 +1,3 @@
1
+ /** Curated Lucide subset (STORE 3.4), grouped by category. Edit here, then run `pnpm icons:sync`. */
2
+ export declare const ICON_GROUPS: Readonly<Record<string, readonly string[]>>;
3
+ export declare const ICON_NAMES: readonly string[];
@@ -0,0 +1,241 @@
1
+ /** Curated Lucide subset (STORE 3.4), grouped by category. Edit here, then run `pnpm icons:sync`. */
2
+ export const ICON_GROUPS = {
3
+ business: [
4
+ "briefcase",
5
+ "building",
6
+ "landmark",
7
+ "store",
8
+ "handshake",
9
+ "target",
10
+ "trophy",
11
+ "award",
12
+ "medal",
13
+ "flag",
14
+ "presentation",
15
+ "clipboard-list",
16
+ "clipboard-check",
17
+ "file-text",
18
+ "files",
19
+ "folder",
20
+ "folder-open",
21
+ "calendar",
22
+ "calendar-days",
23
+ "clock",
24
+ "hourglass",
25
+ "timer",
26
+ "alarm-clock",
27
+ "rocket",
28
+ "lightbulb",
29
+ "puzzle",
30
+ "layers",
31
+ "layout-dashboard",
32
+ "layout-grid",
33
+ ],
34
+ data: [
35
+ "chart-bar",
36
+ "chart-line",
37
+ "chart-pie",
38
+ "chart-area",
39
+ "chart-column",
40
+ "chart-scatter",
41
+ "trending-up",
42
+ "trending-down",
43
+ "activity",
44
+ "gauge",
45
+ "percent",
46
+ "sigma",
47
+ "calculator",
48
+ "table",
49
+ "database",
50
+ "funnel",
51
+ "list",
52
+ "list-checks",
53
+ "sliders-horizontal",
54
+ ],
55
+ tech: [
56
+ "cpu",
57
+ "server",
58
+ "cloud",
59
+ "cloud-upload",
60
+ "cloud-download",
61
+ "code",
62
+ "code-xml",
63
+ "terminal",
64
+ "git-branch",
65
+ "git-merge",
66
+ "git-pull-request",
67
+ "bug",
68
+ "shield",
69
+ "shield-check",
70
+ "lock",
71
+ "lock-open",
72
+ "key",
73
+ "wifi",
74
+ "globe",
75
+ "network",
76
+ "smartphone",
77
+ "laptop",
78
+ "monitor",
79
+ "tablet",
80
+ "settings",
81
+ "wrench",
82
+ "hammer",
83
+ "plug",
84
+ "zap",
85
+ "battery",
86
+ ],
87
+ people: [
88
+ "user",
89
+ "users",
90
+ "user-plus",
91
+ "user-check",
92
+ "user-round",
93
+ "contact",
94
+ "circle-user",
95
+ "message-circle",
96
+ "message-square",
97
+ "mail",
98
+ "phone",
99
+ "heart",
100
+ "thumbs-up",
101
+ "thumbs-down",
102
+ "star",
103
+ "eye",
104
+ "eye-off",
105
+ "graduation-cap",
106
+ "book",
107
+ "book-open",
108
+ "brain",
109
+ ],
110
+ status: [
111
+ "check",
112
+ "circle-check",
113
+ "circle-x",
114
+ "x",
115
+ "triangle-alert",
116
+ "circle-alert",
117
+ "info",
118
+ "circle-question-mark",
119
+ "ban",
120
+ "badge-check",
121
+ "bell",
122
+ "bell-ring",
123
+ "loader",
124
+ "refresh-cw",
125
+ "rotate-ccw",
126
+ "undo",
127
+ "redo",
128
+ "plus",
129
+ "minus",
130
+ "circle-plus",
131
+ "circle-minus",
132
+ ],
133
+ arrows: [
134
+ "arrow-right",
135
+ "arrow-left",
136
+ "arrow-up",
137
+ "arrow-down",
138
+ "arrow-up-right",
139
+ "arrow-down-right",
140
+ "arrow-up-down",
141
+ "arrow-left-right",
142
+ "move-right",
143
+ "chevron-right",
144
+ "chevron-left",
145
+ "chevron-up",
146
+ "chevron-down",
147
+ "chevrons-right",
148
+ "corner-down-right",
149
+ "repeat",
150
+ "shuffle",
151
+ ],
152
+ media: [
153
+ "play",
154
+ "pause",
155
+ "square",
156
+ "circle",
157
+ "triangle",
158
+ "camera",
159
+ "video",
160
+ "film",
161
+ "image",
162
+ "mic",
163
+ "volume-2",
164
+ "headphones",
165
+ "radio",
166
+ ],
167
+ commerce: [
168
+ "shopping-cart",
169
+ "shopping-bag",
170
+ "credit-card",
171
+ "wallet",
172
+ "banknote",
173
+ "coins",
174
+ "dollar-sign",
175
+ "euro",
176
+ "receipt",
177
+ "tag",
178
+ "tags",
179
+ "package",
180
+ "truck",
181
+ "gift",
182
+ "piggy-bank",
183
+ "scale",
184
+ ],
185
+ world: [
186
+ "map",
187
+ "map-pin",
188
+ "navigation",
189
+ "compass",
190
+ "house",
191
+ "car",
192
+ "plane",
193
+ "bike",
194
+ "train-front",
195
+ "leaf",
196
+ "sun",
197
+ "moon",
198
+ "flame",
199
+ "droplet",
200
+ "snowflake",
201
+ "wind",
202
+ "mountain",
203
+ "tree-pine",
204
+ ],
205
+ tools: [
206
+ "search",
207
+ "zoom-in",
208
+ "link",
209
+ "share-2",
210
+ "download",
211
+ "upload",
212
+ "copy",
213
+ "pencil",
214
+ "trash",
215
+ "save",
216
+ "bookmark",
217
+ "paperclip",
218
+ "scissors",
219
+ "eraser",
220
+ "pin",
221
+ "hash",
222
+ "at-sign",
223
+ "quote",
224
+ "megaphone",
225
+ "newspaper",
226
+ "fingerprint-pattern",
227
+ "crown",
228
+ "gem",
229
+ "sparkles",
230
+ "palette",
231
+ "ruler",
232
+ "flask-conical",
233
+ "microscope",
234
+ "atom",
235
+ "dna",
236
+ "stethoscope",
237
+ "pill",
238
+ "syringe",
239
+ ],
240
+ };
241
+ export const ICON_NAMES = [...new Set(Object.values(ICON_GROUPS).flat())].sort();
@@ -0,0 +1,13 @@
1
+ export interface SyncResult {
2
+ readonly icons: number;
3
+ /** Files written or removed this run (0 when already in sync). */
4
+ readonly changed: number;
5
+ }
6
+ /** Icons upstream marks as Feather-derived: dual ISC and MIT (the paragraph naming them in LICENSE). */
7
+ export declare const featherIcons: (licenceText: string) => ReadonlySet<string>;
8
+ /**
9
+ * Copies the curated Lucide subset from `lucideDir` (an installed `lucide-static`) into `outDir`:
10
+ * `svg/<name>.svg`, `icons.json`, `licences.json` (one row per icon: ISC, or ISC AND MIT for the Feather-derived ones), `LICENSE-lucide`.
11
+ * Deterministic and idempotent: a second run changes nothing.
12
+ */
13
+ export declare const syncIcons: (lucideDir: string, outDir: string) => SyncResult;
@@ -0,0 +1,82 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { ICON_NAMES } from "./icon-names.js";
5
+ const sha256 = (text) => createHash("sha256").update(text).digest("hex");
6
+ const escapeAttr = (value) => String(value).replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;");
7
+ const renderNode = ([tag, attrs]) => `<${tag}${Object.entries(attrs)
8
+ .map(([key, value]) => ` ${key}="${escapeAttr(value)}"`)
9
+ .join("")} />`;
10
+ /** Icons upstream marks as Feather-derived: dual ISC and MIT (the paragraph naming them in LICENSE). */
11
+ export const featherIcons = (licenceText) => {
12
+ const marker = "derived from the Feather project:";
13
+ const start = licenceText.indexOf(marker);
14
+ if (start < 0)
15
+ throw new Error("lucide LICENSE no longer lists the Feather-derived icons");
16
+ const block = licenceText.slice(start + marker.length).split(/\r?\n\s*\r?\n/)[1] ?? "";
17
+ return new Set(block
18
+ .split(",")
19
+ .map((name) => name.trim())
20
+ .filter(Boolean));
21
+ };
22
+ const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
23
+ const SVG_OPEN = '<svg 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">';
24
+ const readJson = (path) => JSON.parse(readFileSync(path, "utf8"));
25
+ /** Writes `path` only when bytes differ; returns 1 when it wrote. */
26
+ const writeIfChanged = (path, text) => {
27
+ try {
28
+ if (readFileSync(path, "utf8") === text)
29
+ return 0;
30
+ }
31
+ catch {
32
+ // missing file: fall through to write
33
+ }
34
+ writeFileSync(path, text);
35
+ return 1;
36
+ };
37
+ const prune = (dir, keep) => {
38
+ let removed = 0;
39
+ for (const file of readdirSync(dir)) {
40
+ if (!keep.has(file)) {
41
+ rmSync(join(dir, file));
42
+ removed++;
43
+ }
44
+ }
45
+ return removed;
46
+ };
47
+ /**
48
+ * Copies the curated Lucide subset from `lucideDir` (an installed `lucide-static`) into `outDir`:
49
+ * `svg/<name>.svg`, `icons.json`, `licences.json` (one row per icon: ISC, or ISC AND MIT for the Feather-derived ones), `LICENSE-lucide`.
50
+ * Deterministic and idempotent: a second run changes nothing.
51
+ */
52
+ export const syncIcons = (lucideDir, outDir) => {
53
+ const nodes = readJson(join(lucideDir, "icon-nodes.json"));
54
+ const tags = readJson(join(lucideDir, "tags.json"));
55
+ const { version } = readJson(join(lucideDir, "package.json"));
56
+ const licenceText = readFileSync(join(lucideDir, "LICENSE"), "utf8");
57
+ const feather = featherIcons(licenceText);
58
+ const missing = ICON_NAMES.filter((name) => nodes[name] === undefined);
59
+ if (missing.length > 0)
60
+ throw new Error(`lucide-static ${version} lacks: ${missing.join(", ")}`);
61
+ mkdirSync(join(outDir, "svg"), { recursive: true });
62
+ let changed = prune(join(outDir, "svg"), new Set(ICON_NAMES.map((name) => `${name}.svg`)));
63
+ const entries = [];
64
+ const rows = [];
65
+ for (const name of ICON_NAMES) {
66
+ const body = (nodes[name] ?? []).map(renderNode).join("");
67
+ const svg = `${SVG_OPEN}${body}</svg>\n`;
68
+ changed += writeIfChanged(join(outDir, "svg", `${name}.svg`), svg);
69
+ entries.push({ name, tags: tags[name] ?? [], body });
70
+ rows.push({
71
+ path: `icons/svg/${name}.svg`,
72
+ sourceUrl: `https://github.com/lucide-icons/lucide/blob/main/icons/${name}.svg`,
73
+ licence: feather.has(name) ? "ISC AND MIT" : "ISC",
74
+ attribution: `Lucide Icons and Contributors (lucide-static ${version}); see icons/LICENSE-lucide`,
75
+ sha256: sha256(svg),
76
+ });
77
+ }
78
+ changed += writeIfChanged(join(outDir, "icons.json"), json(entries));
79
+ changed += writeIfChanged(join(outDir, "licences.json"), json(rows));
80
+ changed += writeIfChanged(join(outDir, "LICENSE-lucide"), licenceText);
81
+ return { icons: entries.length, changed };
82
+ };
@@ -0,0 +1,17 @@
1
+ export interface IconEntry {
2
+ readonly name: string;
3
+ readonly tags: readonly string[];
4
+ /** Inner SVG markup (24x24 grid, stroke-based, `currentColor`). */
5
+ readonly body: string;
6
+ }
7
+ export declare const ICONS: readonly IconEntry[];
8
+ export declare const SVG_ATTRS = "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\"";
9
+ /** Up to `limit` nearest icon names (edit distance, substring bonus); ties break alphabetically. */
10
+ export declare const suggestIcons: (query: string, limit?: number) => string[];
11
+ export declare const hasIcon: (name: string) => boolean;
12
+ /** Fixable message for an unknown name, or undefined when valid. */
13
+ export declare const iconNameError: (name: string) => string | undefined;
14
+ /** Pure: a self-contained `currentColor` SVG string for a vendored Lucide icon. Throws on unknown names. */
15
+ export declare const iconSvg: (name: string, size?: number) => string;
16
+ /** Discovery: icons whose name or tags contain every query token (max `limit`). */
17
+ export declare const searchIcons: (query: string, limit?: number) => IconEntry[];
package/dist/icons.js ADDED
@@ -0,0 +1,45 @@
1
+ import iconData from "../icons/icons.json" with { type: "json" };
2
+ export const ICONS = iconData;
3
+ const BY_NAME = new Map(ICONS.map((icon) => [icon.name, icon]));
4
+ export const SVG_ATTRS = '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"';
5
+ const distance = (a, b) => {
6
+ let prev = Array.from({ length: b.length + 1 }, (_, i) => i);
7
+ for (let i = 1; i <= a.length; i++) {
8
+ const row = [i];
9
+ for (let j = 1; j <= b.length; j++) {
10
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
11
+ row.push(Math.min((prev[j] ?? 0) + 1, (row[j - 1] ?? 0) + 1, (prev[j - 1] ?? 0) + cost));
12
+ }
13
+ prev = row;
14
+ }
15
+ return prev[b.length] ?? 0;
16
+ };
17
+ const score = (query, name) => distance(query, name) - (name.includes(query) || query.includes(name) ? 3 : 0);
18
+ /** Up to `limit` nearest icon names (edit distance, substring bonus); ties break alphabetically. */
19
+ export const suggestIcons = (query, limit = 3) => ICONS.map(({ name }) => ({ name, rank: score(query.toLowerCase(), name) }))
20
+ .sort((a, b) => a.rank - b.rank || (a.name < b.name ? -1 : 1))
21
+ .slice(0, limit)
22
+ .map(({ name }) => name);
23
+ export const hasIcon = (name) => BY_NAME.has(name);
24
+ /** Fixable message for an unknown name, or undefined when valid. */
25
+ export const iconNameError = (name) => BY_NAME.has(name)
26
+ ? undefined
27
+ : `unknown icon "${name}"; did you mean ${suggestIcons(name)
28
+ .map((s) => `"${s}"`)
29
+ .join(", ")}?`;
30
+ /** Pure: a self-contained `currentColor` SVG string for a vendored Lucide icon. Throws on unknown names. */
31
+ export const iconSvg = (name, size) => {
32
+ const icon = BY_NAME.get(name);
33
+ if (icon === undefined)
34
+ throw new Error(iconNameError(name));
35
+ const dims = size === undefined ? "" : ` width="${size}" height="${size}"`;
36
+ return `<svg ${SVG_ATTRS}${dims}>${icon.body}</svg>`;
37
+ };
38
+ /** Discovery: icons whose name or tags contain every query token (max `limit`). */
39
+ export const searchIcons = (query, limit = 15) => {
40
+ const tokens = query.toLowerCase().split(/\s+/).filter(Boolean);
41
+ return ICONS.filter((icon) => {
42
+ const hay = [icon.name, ...icon.tags].join(" ").toLowerCase();
43
+ return tokens.every((token) => hay.includes(token));
44
+ }).slice(0, limit);
45
+ };
@@ -0,0 +1,4 @@
1
+ export { type IconLedgerRow, iconLedgerRows, LUCIDE_LICENCE_TEXT } from "./icon-licences.ts";
2
+ export { ICON_GROUPS, ICON_NAMES } from "./icon-names.ts";
3
+ export type { IconEntry } from "./icons.ts";
4
+ export { hasIcon, ICONS, iconNameError, iconSvg, SVG_ATTRS, searchIcons, suggestIcons, } from "./icons.ts";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { iconLedgerRows, LUCIDE_LICENCE_TEXT } from "./icon-licences.js";
2
+ export { ICON_GROUPS, ICON_NAMES } from "./icon-names.js";
3
+ export { hasIcon, ICONS, iconNameError, iconSvg, SVG_ATTRS, searchIcons, suggestIcons, } from "./icons.js";
@@ -0,0 +1,43 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 Lucide Icons and Contributors
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
+
17
+ ---
18
+
19
+ The following Lucide icons are derived from the Feather project:
20
+
21
+ airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
22
+
23
+ The MIT License (MIT) (for the icons listed above)
24
+
25
+ Copyright (c) 2013-present Cole Bemis
26
+
27
+ Permission is hereby granted, free of charge, to any person obtaining a copy
28
+ of this software and associated documentation files (the "Software"), to deal
29
+ in the Software without restriction, including without limitation the rights
30
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31
+ copies of the Software, and to permit persons to whom the Software is
32
+ furnished to do so, subject to the following conditions:
33
+
34
+ The above copyright notice and this permission notice shall be included in all
35
+ copies or substantial portions of the Software.
36
+
37
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
39
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
40
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
41
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
42
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
43
+ SOFTWARE.