@vulpfest/icons 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,24 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vulpfest
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.
22
+
23
+ The Vulpfest name and logo are trademarks of Vulpfest and are not licensed
24
+ under this license. See TRADEMARK.md.
package/README.md CHANGED
@@ -1,3 +1,60 @@
1
- # Temporary Holding Version
1
+ # @vulpfest/icons
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The official [Vulpfest](https://www.vulpfest.com) logo as React components and SVG files.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @vulpfest/icons
9
+ ```
10
+
11
+ ## React
12
+
13
+ ```tsx
14
+ import { VulpfestIcon, VulpfestLogo } from "@vulpfest/icons"
15
+
16
+ <VulpfestIcon size={16} /> // follows the text color, like lucide icons
17
+ <VulpfestIcon size={24} variant="night" /> // official colors, for dark backgrounds
18
+ <VulpfestIcon size={24} variant="day" /> // official colors, for light backgrounds
19
+ <VulpfestIcon className="text-zinc-400" title="Vulpfest" />
20
+ <VulpfestLogo height={28} /> // mark + VULPFEST wordmark
21
+ ```
22
+
23
+ ### `VulpfestIcon` props
24
+
25
+ | Prop | Default | Description |
26
+ | --- | --- | --- |
27
+ | `size` | `24` | Width and height |
28
+ | `color` | `currentColor` | Fill for the `mono` variant |
29
+ | `variant` | `mono` | `mono`, `night` or `day` |
30
+ | `title` | none | Accessible label; without it the icon is decorative |
31
+
32
+ `VulpfestLogo` takes `height` (default `32`) instead of `size`, plus `color`, `variant` and `title` (default `Vulpfest`). Any other SVG attribute (`className`, `style`, `onClick` and so on) is passed through.
33
+
34
+ ## Without React
35
+
36
+ ```ts
37
+ import { markSvg, logoSvg } from "@vulpfest/icons"
38
+
39
+ markSvg("mono", 24) // SVG string
40
+ logoSvg("night", 32)
41
+ ```
42
+
43
+ Ready-made SVG files are included in the package and on the CDN:
44
+
45
+ ```
46
+ https://cdn.jsdelivr.net/npm/@vulpfest/icons/svg/vulpfest-mark-black.svg
47
+ https://cdn.jsdelivr.net/npm/@vulpfest/icons/svg/vulpfest-logo-night.svg
48
+ ```
49
+
50
+ Files: `vulpfest-mark-{black,white,night,day}.svg` and `vulpfest-logo-{black,white,night,day}.svg`.
51
+
52
+ ## Using the Vulpfest logo
53
+
54
+ You may use the logo to refer to Vulpfest, to link to Vulpfest or to show that a product is part of Vulpfest, as long as it is not modified. Using it to suggest a partnership, sponsorship or endorsement, on merchandise, or in a modified form requires written permission from hello@vulpfest.com.
55
+
56
+ Read the full rules in [TRADEMARK.md](./TRADEMARK.md) and the brand page at [vulpfest.com/brand](https://www.vulpfest.com/brand).
57
+
58
+ ## License
59
+
60
+ The code is released under the [MIT License](./LICENSE). The Vulpfest name and logo are trademarks of Vulpfest and are not covered by the MIT License; see [TRADEMARK.md](./TRADEMARK.md).
package/TRADEMARK.md ADDED
@@ -0,0 +1,24 @@
1
+ # Vulpfest trademark and logo guidelines
2
+
3
+ The Vulpfest name, the Vulpfest mark (the fox ears, V and star) and the VULPFEST wordmark are trademarks of Vulpfest. This package makes them easy to use correctly; it does not grant any trademark rights.
4
+
5
+ ## Allowed without asking
6
+
7
+ - Referring to Vulpfest or linking to vulpfest.com, for example in articles, talks, directories, client lists or integration pages.
8
+ - Showing that a product or website is part of Vulpfest, for example "A Vulpfest company".
9
+ - Using the files exactly as provided, in the `mono`, `night` or `day` variants, with enough clear space around them.
10
+
11
+ ## Requires written permission
12
+
13
+ - Suggesting a partnership, sponsorship, certification or endorsement by Vulpfest.
14
+ - Using the name or logo on merchandise, packaging or in advertising.
15
+ - Using the name or logo as part of your own product, company or domain name.
16
+ - Any modified version: changed shapes, proportions, colors (other than the provided variants), effects, rotation or combination with other marks.
17
+
18
+ ## How to ask
19
+
20
+ Email hello@vulpfest.com with a short description of how and where you would like to use the name or logo. We usually reply within a few working days.
21
+
22
+ ## Questions
23
+
24
+ If you are unsure whether your use is allowed, please ask first: hello@vulpfest.com
package/dist/index.cjs ADDED
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.tsx
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ LOGO: () => LOGO,
34
+ MARK: () => MARK,
35
+ MARK_VIEWBOX: () => MARK_VIEWBOX,
36
+ PALETTES: () => PALETTES,
37
+ VulpfestIcon: () => VulpfestIcon,
38
+ VulpfestLogo: () => VulpfestLogo,
39
+ WORDMARK: () => WORDMARK,
40
+ logoSvg: () => logoSvg,
41
+ markSvg: () => markSvg
42
+ });
43
+ module.exports = __toCommonJS(index_exports);
44
+
45
+ // src/VulpfestIcon.tsx
46
+ var React = __toESM(require("react"), 1);
47
+
48
+ // src/paths.ts
49
+ var MARK_VIEWBOX = "-10 0 340 290";
50
+ var MARK = {
51
+ earL: "M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z",
52
+ earR: "M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z",
53
+ vee: "M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z",
54
+ star: "M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"
55
+ };
56
+ var WORDMARK = [
57
+ "M-155.45 0L-171.76 37.8L-162.31 37.8L-150.81 10.8L-139.14 37.8L-130.45 37.8L-146.81 0Z",
58
+ "M-102.71 -0.65Q-110.76 -0.65 -115.29 3.83Q-119.83 8.32 -119.83 16.63L-119.83 37.8L-111.08 37.8L-111.08 16.96Q-111.08 11.56 -108.87 9.18Q-106.65 6.8 -102.66 6.8Q-98.66 6.8 -96.45 9.18Q-94.23 11.56 -94.23 16.96L-94.23 37.8L-85.59 37.8L-85.59 16.63Q-85.59 8.32 -90.13 3.83Q-94.67 -0.65 -102.71 -0.65Z",
59
+ "M-69.95 0L-69.95 37.8L-61.21 37.8L-61.21 7.13L-42.25 7.13L-42.25 0Z",
60
+ "M-30.34 0L-30.34 37.8L-13.98 37.8Q-8.9 37.8 -5.23 36.15Q-1.56 34.51 0.44 31.43Q2.44 28.35 2.44 24.08Q2.44 19.87 0.44 16.79Q-1.56 13.72 -5.23 12.07Q-8.9 10.42 -13.98 10.42L-21.59 10.42L-21.59 0ZM-21.59 17.55L-14.46 17.55Q-10.41 17.55 -8.41 19.28Q-6.42 21.01 -6.42 24.08Q-6.42 27.22 -8.41 28.94Q-10.41 30.67 -14.46 30.67L-21.59 30.67Z",
61
+ "M16.19 0L16.19 37.8L44.76 37.8L44.76 30.78L24.94 30.78L24.94 20.79L42.43 20.79L42.43 13.77L24.94 13.77L24.94 0Z",
62
+ "M57.7 0L57.7 37.8L86.26 37.8L86.26 30.78L66.39 30.78L66.39 22.57L83.94 22.57L83.94 15.77L66.39 15.77L66.39 7.02L86.96 7.02L86.96 0Z",
63
+ "M113.35 -0.65Q108.81 -0.65 104.66 0.57Q100.5 1.78 97.96 3.73L100.93 10.31Q103.36 8.59 106.68 7.48Q110 6.37 113.4 6.37Q116 6.37 117.59 6.89Q119.18 7.4 119.94 8.32Q120.69 9.23 120.69 10.42Q120.69 11.93 119.51 12.83Q118.32 13.72 116.37 14.28Q114.43 14.85 112.08 15.36Q109.73 15.88 107.38 16.63Q105.03 17.39 103.09 18.58Q101.15 19.76 99.93 21.71Q98.72 23.65 98.72 26.68Q98.72 29.92 100.47 32.59Q102.23 35.26 105.76 36.86Q109.3 38.45 114.65 38.45Q118.21 38.45 121.67 37.61Q125.12 36.77 127.77 35.1L125.07 28.46Q122.42 29.97 119.78 30.7Q117.13 31.43 114.59 31.43Q112.05 31.43 110.43 30.83Q108.81 30.24 108.11 29.3Q107.41 28.35 107.41 27.11Q107.41 25.65 108.6 24.76Q109.79 23.87 111.73 23.33Q113.67 22.79 116.02 22.25Q118.37 21.71 120.72 21.01Q123.07 20.3 125.01 19.12Q126.96 17.93 128.17 15.98Q129.39 14.04 129.39 11.07Q129.39 7.88 127.61 5.24Q125.82 2.59 122.29 0.97Q118.75 -0.65 113.35 -0.65Z",
64
+ "M150.21 0L150.21 30.67L138.12 30.67L138.12 37.8L171.06 37.8L171.06 30.67L158.96 30.67L158.96 0Z"
65
+ ];
66
+ var PALETTES = {
67
+ night: { c1: "#F3DFBC", mid: "#EEC2AA", c2: "#E8A598", text: "#F3DFBC" },
68
+ day: { c1: "#B8864A", mid: "#C47853", c2: "#CF6A5C", text: "#2E211B" }
69
+ };
70
+ var LOGO = {
71
+ width: 284,
72
+ height: 48,
73
+ markTransform: "translate(1.672 0) scale(0.16725)",
74
+ wordTransform: "translate(177.5 35.9) scale(0.62 -0.62)"
75
+ };
76
+
77
+ // src/MarkShapes.tsx
78
+ var import_jsx_runtime = require("react/jsx-runtime");
79
+ function MarkShapes({ variant, color, uid }) {
80
+ if (variant === "mono") {
81
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: color, d: MARK.earL }),
83
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: color, d: MARK.earR }),
84
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: color, d: MARK.vee }),
85
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: color, d: MARK.star })
86
+ ] });
87
+ }
88
+ const p = PALETTES[variant];
89
+ const ear = `vf-ear-${uid}`;
90
+ const vee = `vf-vee-${uid}`;
91
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
92
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("defs", { children: [
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("linearGradient", { id: ear, gradientUnits: "userSpaceOnUse", x1: "0", y1: "0", x2: "320", y2: "0", children: [
94
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "0", stopColor: p.c1 }),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "0.5", stopColor: p.mid }),
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "1", stopColor: p.c2 })
97
+ ] }),
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("linearGradient", { id: vee, gradientUnits: "userSpaceOnUse", x1: "80", y1: "0", x2: "240", y2: "0", children: [
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "0", stopColor: p.c1 }),
100
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "0.55", stopColor: p.mid }),
101
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("stop", { offset: "1", stopColor: p.c2 })
102
+ ] })
103
+ ] }),
104
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: `url(#${ear})`, d: MARK.earL }),
105
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: `url(#${ear})`, d: MARK.earR }),
106
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: `url(#${vee})`, d: MARK.vee }),
107
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: p.mid, d: MARK.star })
108
+ ] });
109
+ }
110
+
111
+ // src/VulpfestIcon.tsx
112
+ var import_jsx_runtime2 = require("react/jsx-runtime");
113
+ var VulpfestIcon = React.forwardRef(function VulpfestIcon2({ size = 24, color = "currentColor", variant = "mono", title, ...rest }, ref) {
114
+ const uid = React.useId().replace(/[^a-zA-Z0-9_-]/g, "");
115
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
116
+ "svg",
117
+ {
118
+ ref,
119
+ xmlns: "http://www.w3.org/2000/svg",
120
+ viewBox: MARK_VIEWBOX,
121
+ width: size,
122
+ height: size,
123
+ role: title ? "img" : void 0,
124
+ "aria-hidden": title ? void 0 : true,
125
+ "aria-label": title,
126
+ focusable: "false",
127
+ ...rest,
128
+ children: [
129
+ title ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("title", { children: title }) : null,
130
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MarkShapes, { variant, color, uid })
131
+ ]
132
+ }
133
+ );
134
+ });
135
+
136
+ // src/VulpfestLogo.tsx
137
+ var React2 = __toESM(require("react"), 1);
138
+ var import_jsx_runtime3 = require("react/jsx-runtime");
139
+ var VulpfestLogo = React2.forwardRef(function VulpfestLogo2({ height = 32, color = "currentColor", variant = "mono", title = "Vulpfest", ...rest }, ref) {
140
+ const uid = React2.useId().replace(/[^a-zA-Z0-9_-]/g, "");
141
+ const text = variant === "mono" ? color : PALETTES[variant].text;
142
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
143
+ "svg",
144
+ {
145
+ ref,
146
+ xmlns: "http://www.w3.org/2000/svg",
147
+ viewBox: `0 0 ${LOGO.width} ${LOGO.height}`,
148
+ height,
149
+ role: "img",
150
+ "aria-label": title,
151
+ focusable: "false",
152
+ ...rest,
153
+ children: [
154
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("title", { children: title }),
155
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("g", { transform: LOGO.markTransform, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(MarkShapes, { variant, color, uid }) }),
156
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("g", { transform: LOGO.wordTransform, fill: text, fillRule: "evenodd", children: WORDMARK.map((d, i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d }, i)) })
157
+ ]
158
+ }
159
+ );
160
+ });
161
+
162
+ // src/svg.ts
163
+ function shapes(variant, color, id) {
164
+ if (variant === "mono") return [MARK.earL, MARK.earR, MARK.vee, MARK.star].map((d) => `<path fill="${color}" d="${d}"/>`).join("");
165
+ const p = PALETTES[variant];
166
+ return `<defs><linearGradient id="${id}-ear" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="320" y2="0"><stop offset="0" stop-color="${p.c1}"/><stop offset="0.5" stop-color="${p.mid}"/><stop offset="1" stop-color="${p.c2}"/></linearGradient><linearGradient id="${id}-vee" gradientUnits="userSpaceOnUse" x1="80" y1="0" x2="240" y2="0"><stop offset="0" stop-color="${p.c1}"/><stop offset="0.55" stop-color="${p.mid}"/><stop offset="1" stop-color="${p.c2}"/></linearGradient></defs><path fill="url(#${id}-ear)" d="${MARK.earL}"/><path fill="url(#${id}-ear)" d="${MARK.earR}"/><path fill="url(#${id}-vee)" d="${MARK.vee}"/><path fill="${p.mid}" d="${MARK.star}"/>`;
167
+ }
168
+ var sizeAttrs = (w, h) => `${w !== void 0 ? ` width="${w}"` : ""}${h !== void 0 ? ` height="${h}"` : ""}`;
169
+ function markSvg(variant = "mono", size, color = "currentColor") {
170
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${MARK_VIEWBOX}"${sizeAttrs(size, size)} role="img" aria-label="Vulpfest"><title>Vulpfest</title>${shapes(variant, color, "vf")}</svg>`;
171
+ }
172
+ function logoSvg(variant = "mono", height, color = "currentColor") {
173
+ const text = variant === "mono" ? color : PALETTES[variant].text;
174
+ const width = height !== void 0 ? Math.round(height * LOGO.width / LOGO.height) : void 0;
175
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${LOGO.width} ${LOGO.height}"${sizeAttrs(width, height)} role="img" aria-label="Vulpfest"><title>Vulpfest</title><g transform="${LOGO.markTransform}">${shapes(variant, color, "vf")}</g><g transform="${LOGO.wordTransform}" fill="${text}" fill-rule="evenodd">${WORDMARK.map((d) => `<path d="${d}"/>`).join("")}</g></svg>`;
176
+ }
177
+ // Annotate the CommonJS export names for ESM import in node:
178
+ 0 && (module.exports = {
179
+ LOGO,
180
+ MARK,
181
+ MARK_VIEWBOX,
182
+ PALETTES,
183
+ VulpfestIcon,
184
+ VulpfestLogo,
185
+ WORDMARK,
186
+ logoSvg,
187
+ markSvg
188
+ });
@@ -0,0 +1,70 @@
1
+ import * as React from 'react';
2
+
3
+ /** Variants: mono follows the surrounding text color; night and day use the official Vulpfest colors. */
4
+ type VulpfestVariant = "mono" | "night" | "day";
5
+ /** The Vulpfest mark (fox ears, V and star) on its native 320 x 287 grid. */
6
+ declare const MARK_VIEWBOX = "-10 0 340 290";
7
+ declare const MARK: {
8
+ readonly earL: "M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z";
9
+ readonly earR: "M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z";
10
+ readonly vee: "M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z";
11
+ readonly star: "M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z";
12
+ };
13
+ /** The VULPFEST wordmark (y axis points up, baseline 0). */
14
+ declare const WORDMARK: readonly ["M-155.45 0L-171.76 37.8L-162.31 37.8L-150.81 10.8L-139.14 37.8L-130.45 37.8L-146.81 0Z", "M-102.71 -0.65Q-110.76 -0.65 -115.29 3.83Q-119.83 8.32 -119.83 16.63L-119.83 37.8L-111.08 37.8L-111.08 16.96Q-111.08 11.56 -108.87 9.18Q-106.65 6.8 -102.66 6.8Q-98.66 6.8 -96.45 9.18Q-94.23 11.56 -94.23 16.96L-94.23 37.8L-85.59 37.8L-85.59 16.63Q-85.59 8.32 -90.13 3.83Q-94.67 -0.65 -102.71 -0.65Z", "M-69.95 0L-69.95 37.8L-61.21 37.8L-61.21 7.13L-42.25 7.13L-42.25 0Z", "M-30.34 0L-30.34 37.8L-13.98 37.8Q-8.9 37.8 -5.23 36.15Q-1.56 34.51 0.44 31.43Q2.44 28.35 2.44 24.08Q2.44 19.87 0.44 16.79Q-1.56 13.72 -5.23 12.07Q-8.9 10.42 -13.98 10.42L-21.59 10.42L-21.59 0ZM-21.59 17.55L-14.46 17.55Q-10.41 17.55 -8.41 19.28Q-6.42 21.01 -6.42 24.08Q-6.42 27.22 -8.41 28.94Q-10.41 30.67 -14.46 30.67L-21.59 30.67Z", "M16.19 0L16.19 37.8L44.76 37.8L44.76 30.78L24.94 30.78L24.94 20.79L42.43 20.79L42.43 13.77L24.94 13.77L24.94 0Z", "M57.7 0L57.7 37.8L86.26 37.8L86.26 30.78L66.39 30.78L66.39 22.57L83.94 22.57L83.94 15.77L66.39 15.77L66.39 7.02L86.96 7.02L86.96 0Z", "M113.35 -0.65Q108.81 -0.65 104.66 0.57Q100.5 1.78 97.96 3.73L100.93 10.31Q103.36 8.59 106.68 7.48Q110 6.37 113.4 6.37Q116 6.37 117.59 6.89Q119.18 7.4 119.94 8.32Q120.69 9.23 120.69 10.42Q120.69 11.93 119.51 12.83Q118.32 13.72 116.37 14.28Q114.43 14.85 112.08 15.36Q109.73 15.88 107.38 16.63Q105.03 17.39 103.09 18.58Q101.15 19.76 99.93 21.71Q98.72 23.65 98.72 26.68Q98.72 29.92 100.47 32.59Q102.23 35.26 105.76 36.86Q109.3 38.45 114.65 38.45Q118.21 38.45 121.67 37.61Q125.12 36.77 127.77 35.1L125.07 28.46Q122.42 29.97 119.78 30.7Q117.13 31.43 114.59 31.43Q112.05 31.43 110.43 30.83Q108.81 30.24 108.11 29.3Q107.41 28.35 107.41 27.11Q107.41 25.65 108.6 24.76Q109.79 23.87 111.73 23.33Q113.67 22.79 116.02 22.25Q118.37 21.71 120.72 21.01Q123.07 20.3 125.01 19.12Q126.96 17.93 128.17 15.98Q129.39 14.04 129.39 11.07Q129.39 7.88 127.61 5.24Q125.82 2.59 122.29 0.97Q118.75 -0.65 113.35 -0.65Z", "M150.21 0L150.21 30.67L138.12 30.67L138.12 37.8L171.06 37.8L171.06 30.67L158.96 30.67L158.96 0Z"];
15
+ /** Official Vulpfest palettes. */
16
+ declare const PALETTES: {
17
+ readonly night: {
18
+ readonly c1: "#F3DFBC";
19
+ readonly mid: "#EEC2AA";
20
+ readonly c2: "#E8A598";
21
+ readonly text: "#F3DFBC";
22
+ };
23
+ readonly day: {
24
+ readonly c1: "#B8864A";
25
+ readonly mid: "#C47853";
26
+ readonly c2: "#CF6A5C";
27
+ readonly text: "#2E211B";
28
+ };
29
+ };
30
+ /** Horizontal logo layout: mark (48 px tall) + wordmark, on a 284 x 48 canvas. */
31
+ declare const LOGO: {
32
+ readonly width: 284;
33
+ readonly height: 48;
34
+ readonly markTransform: "translate(1.672 0) scale(0.16725)";
35
+ readonly wordTransform: "translate(177.5 35.9) scale(0.62 -0.62)";
36
+ };
37
+
38
+ interface VulpfestIconProps extends Omit<React.SVGProps<SVGSVGElement>, "ref" | "color"> {
39
+ /** Width and height (like lucide). Default 24. */
40
+ size?: number | string;
41
+ /** Fill color for the mono variant. Default currentColor (follows the text color). */
42
+ color?: string;
43
+ /** mono (default), night (official colors for dark backgrounds) or day (official colors for light backgrounds). */
44
+ variant?: VulpfestVariant;
45
+ /** Accessible label. Without it the icon is decorative (aria-hidden). */
46
+ title?: string;
47
+ }
48
+ /** The Vulpfest mark as an icon, with a lucide-style API. */
49
+ declare const VulpfestIcon: React.ForwardRefExoticComponent<VulpfestIconProps & React.RefAttributes<SVGSVGElement>>;
50
+
51
+ interface VulpfestLogoProps extends Omit<React.SVGProps<SVGSVGElement>, "ref" | "color"> {
52
+ /** Height; width follows the logo proportions. Default 32. */
53
+ height?: number | string;
54
+ /** Color for the mono variant. Default currentColor. */
55
+ color?: string;
56
+ /** mono (default), night or day. */
57
+ variant?: VulpfestVariant;
58
+ /** Accessible label. Default "Vulpfest". */
59
+ title?: string;
60
+ }
61
+ /** The horizontal Vulpfest logo: mark + VULPFEST wordmark. */
62
+ declare const VulpfestLogo: React.ForwardRefExoticComponent<VulpfestLogoProps & React.RefAttributes<SVGSVGElement>>;
63
+
64
+ /** The Vulpfest mark as an SVG string (for non-React use). */
65
+ declare function markSvg(variant?: VulpfestVariant, size?: number, color?: string): string;
66
+ /** The horizontal Vulpfest logo as an SVG string (for non-React use). */
67
+ declare function logoSvg(variant?: VulpfestVariant, height?: number, color?: string): string;
68
+
69
+ export { LOGO, MARK, MARK_VIEWBOX, PALETTES, VulpfestIcon, VulpfestLogo, WORDMARK, logoSvg, markSvg };
70
+ export type { VulpfestIconProps, VulpfestLogoProps, VulpfestVariant };
@@ -0,0 +1,70 @@
1
+ import * as React from 'react';
2
+
3
+ /** Variants: mono follows the surrounding text color; night and day use the official Vulpfest colors. */
4
+ type VulpfestVariant = "mono" | "night" | "day";
5
+ /** The Vulpfest mark (fox ears, V and star) on its native 320 x 287 grid. */
6
+ declare const MARK_VIEWBOX = "-10 0 340 290";
7
+ declare const MARK: {
8
+ readonly earL: "M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z";
9
+ readonly earR: "M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z";
10
+ readonly vee: "M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z";
11
+ readonly star: "M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z";
12
+ };
13
+ /** The VULPFEST wordmark (y axis points up, baseline 0). */
14
+ declare const WORDMARK: readonly ["M-155.45 0L-171.76 37.8L-162.31 37.8L-150.81 10.8L-139.14 37.8L-130.45 37.8L-146.81 0Z", "M-102.71 -0.65Q-110.76 -0.65 -115.29 3.83Q-119.83 8.32 -119.83 16.63L-119.83 37.8L-111.08 37.8L-111.08 16.96Q-111.08 11.56 -108.87 9.18Q-106.65 6.8 -102.66 6.8Q-98.66 6.8 -96.45 9.18Q-94.23 11.56 -94.23 16.96L-94.23 37.8L-85.59 37.8L-85.59 16.63Q-85.59 8.32 -90.13 3.83Q-94.67 -0.65 -102.71 -0.65Z", "M-69.95 0L-69.95 37.8L-61.21 37.8L-61.21 7.13L-42.25 7.13L-42.25 0Z", "M-30.34 0L-30.34 37.8L-13.98 37.8Q-8.9 37.8 -5.23 36.15Q-1.56 34.51 0.44 31.43Q2.44 28.35 2.44 24.08Q2.44 19.87 0.44 16.79Q-1.56 13.72 -5.23 12.07Q-8.9 10.42 -13.98 10.42L-21.59 10.42L-21.59 0ZM-21.59 17.55L-14.46 17.55Q-10.41 17.55 -8.41 19.28Q-6.42 21.01 -6.42 24.08Q-6.42 27.22 -8.41 28.94Q-10.41 30.67 -14.46 30.67L-21.59 30.67Z", "M16.19 0L16.19 37.8L44.76 37.8L44.76 30.78L24.94 30.78L24.94 20.79L42.43 20.79L42.43 13.77L24.94 13.77L24.94 0Z", "M57.7 0L57.7 37.8L86.26 37.8L86.26 30.78L66.39 30.78L66.39 22.57L83.94 22.57L83.94 15.77L66.39 15.77L66.39 7.02L86.96 7.02L86.96 0Z", "M113.35 -0.65Q108.81 -0.65 104.66 0.57Q100.5 1.78 97.96 3.73L100.93 10.31Q103.36 8.59 106.68 7.48Q110 6.37 113.4 6.37Q116 6.37 117.59 6.89Q119.18 7.4 119.94 8.32Q120.69 9.23 120.69 10.42Q120.69 11.93 119.51 12.83Q118.32 13.72 116.37 14.28Q114.43 14.85 112.08 15.36Q109.73 15.88 107.38 16.63Q105.03 17.39 103.09 18.58Q101.15 19.76 99.93 21.71Q98.72 23.65 98.72 26.68Q98.72 29.92 100.47 32.59Q102.23 35.26 105.76 36.86Q109.3 38.45 114.65 38.45Q118.21 38.45 121.67 37.61Q125.12 36.77 127.77 35.1L125.07 28.46Q122.42 29.97 119.78 30.7Q117.13 31.43 114.59 31.43Q112.05 31.43 110.43 30.83Q108.81 30.24 108.11 29.3Q107.41 28.35 107.41 27.11Q107.41 25.65 108.6 24.76Q109.79 23.87 111.73 23.33Q113.67 22.79 116.02 22.25Q118.37 21.71 120.72 21.01Q123.07 20.3 125.01 19.12Q126.96 17.93 128.17 15.98Q129.39 14.04 129.39 11.07Q129.39 7.88 127.61 5.24Q125.82 2.59 122.29 0.97Q118.75 -0.65 113.35 -0.65Z", "M150.21 0L150.21 30.67L138.12 30.67L138.12 37.8L171.06 37.8L171.06 30.67L158.96 30.67L158.96 0Z"];
15
+ /** Official Vulpfest palettes. */
16
+ declare const PALETTES: {
17
+ readonly night: {
18
+ readonly c1: "#F3DFBC";
19
+ readonly mid: "#EEC2AA";
20
+ readonly c2: "#E8A598";
21
+ readonly text: "#F3DFBC";
22
+ };
23
+ readonly day: {
24
+ readonly c1: "#B8864A";
25
+ readonly mid: "#C47853";
26
+ readonly c2: "#CF6A5C";
27
+ readonly text: "#2E211B";
28
+ };
29
+ };
30
+ /** Horizontal logo layout: mark (48 px tall) + wordmark, on a 284 x 48 canvas. */
31
+ declare const LOGO: {
32
+ readonly width: 284;
33
+ readonly height: 48;
34
+ readonly markTransform: "translate(1.672 0) scale(0.16725)";
35
+ readonly wordTransform: "translate(177.5 35.9) scale(0.62 -0.62)";
36
+ };
37
+
38
+ interface VulpfestIconProps extends Omit<React.SVGProps<SVGSVGElement>, "ref" | "color"> {
39
+ /** Width and height (like lucide). Default 24. */
40
+ size?: number | string;
41
+ /** Fill color for the mono variant. Default currentColor (follows the text color). */
42
+ color?: string;
43
+ /** mono (default), night (official colors for dark backgrounds) or day (official colors for light backgrounds). */
44
+ variant?: VulpfestVariant;
45
+ /** Accessible label. Without it the icon is decorative (aria-hidden). */
46
+ title?: string;
47
+ }
48
+ /** The Vulpfest mark as an icon, with a lucide-style API. */
49
+ declare const VulpfestIcon: React.ForwardRefExoticComponent<VulpfestIconProps & React.RefAttributes<SVGSVGElement>>;
50
+
51
+ interface VulpfestLogoProps extends Omit<React.SVGProps<SVGSVGElement>, "ref" | "color"> {
52
+ /** Height; width follows the logo proportions. Default 32. */
53
+ height?: number | string;
54
+ /** Color for the mono variant. Default currentColor. */
55
+ color?: string;
56
+ /** mono (default), night or day. */
57
+ variant?: VulpfestVariant;
58
+ /** Accessible label. Default "Vulpfest". */
59
+ title?: string;
60
+ }
61
+ /** The horizontal Vulpfest logo: mark + VULPFEST wordmark. */
62
+ declare const VulpfestLogo: React.ForwardRefExoticComponent<VulpfestLogoProps & React.RefAttributes<SVGSVGElement>>;
63
+
64
+ /** The Vulpfest mark as an SVG string (for non-React use). */
65
+ declare function markSvg(variant?: VulpfestVariant, size?: number, color?: string): string;
66
+ /** The horizontal Vulpfest logo as an SVG string (for non-React use). */
67
+ declare function logoSvg(variant?: VulpfestVariant, height?: number, color?: string): string;
68
+
69
+ export { LOGO, MARK, MARK_VIEWBOX, PALETTES, VulpfestIcon, VulpfestLogo, WORDMARK, logoSvg, markSvg };
70
+ export type { VulpfestIconProps, VulpfestLogoProps, VulpfestVariant };
package/dist/index.js ADDED
@@ -0,0 +1,143 @@
1
+ // src/VulpfestIcon.tsx
2
+ import * as React from "react";
3
+
4
+ // src/paths.ts
5
+ var MARK_VIEWBOX = "-10 0 340 290";
6
+ var MARK = {
7
+ earL: "M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z",
8
+ earR: "M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z",
9
+ vee: "M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z",
10
+ star: "M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"
11
+ };
12
+ var WORDMARK = [
13
+ "M-155.45 0L-171.76 37.8L-162.31 37.8L-150.81 10.8L-139.14 37.8L-130.45 37.8L-146.81 0Z",
14
+ "M-102.71 -0.65Q-110.76 -0.65 -115.29 3.83Q-119.83 8.32 -119.83 16.63L-119.83 37.8L-111.08 37.8L-111.08 16.96Q-111.08 11.56 -108.87 9.18Q-106.65 6.8 -102.66 6.8Q-98.66 6.8 -96.45 9.18Q-94.23 11.56 -94.23 16.96L-94.23 37.8L-85.59 37.8L-85.59 16.63Q-85.59 8.32 -90.13 3.83Q-94.67 -0.65 -102.71 -0.65Z",
15
+ "M-69.95 0L-69.95 37.8L-61.21 37.8L-61.21 7.13L-42.25 7.13L-42.25 0Z",
16
+ "M-30.34 0L-30.34 37.8L-13.98 37.8Q-8.9 37.8 -5.23 36.15Q-1.56 34.51 0.44 31.43Q2.44 28.35 2.44 24.08Q2.44 19.87 0.44 16.79Q-1.56 13.72 -5.23 12.07Q-8.9 10.42 -13.98 10.42L-21.59 10.42L-21.59 0ZM-21.59 17.55L-14.46 17.55Q-10.41 17.55 -8.41 19.28Q-6.42 21.01 -6.42 24.08Q-6.42 27.22 -8.41 28.94Q-10.41 30.67 -14.46 30.67L-21.59 30.67Z",
17
+ "M16.19 0L16.19 37.8L44.76 37.8L44.76 30.78L24.94 30.78L24.94 20.79L42.43 20.79L42.43 13.77L24.94 13.77L24.94 0Z",
18
+ "M57.7 0L57.7 37.8L86.26 37.8L86.26 30.78L66.39 30.78L66.39 22.57L83.94 22.57L83.94 15.77L66.39 15.77L66.39 7.02L86.96 7.02L86.96 0Z",
19
+ "M113.35 -0.65Q108.81 -0.65 104.66 0.57Q100.5 1.78 97.96 3.73L100.93 10.31Q103.36 8.59 106.68 7.48Q110 6.37 113.4 6.37Q116 6.37 117.59 6.89Q119.18 7.4 119.94 8.32Q120.69 9.23 120.69 10.42Q120.69 11.93 119.51 12.83Q118.32 13.72 116.37 14.28Q114.43 14.85 112.08 15.36Q109.73 15.88 107.38 16.63Q105.03 17.39 103.09 18.58Q101.15 19.76 99.93 21.71Q98.72 23.65 98.72 26.68Q98.72 29.92 100.47 32.59Q102.23 35.26 105.76 36.86Q109.3 38.45 114.65 38.45Q118.21 38.45 121.67 37.61Q125.12 36.77 127.77 35.1L125.07 28.46Q122.42 29.97 119.78 30.7Q117.13 31.43 114.59 31.43Q112.05 31.43 110.43 30.83Q108.81 30.24 108.11 29.3Q107.41 28.35 107.41 27.11Q107.41 25.65 108.6 24.76Q109.79 23.87 111.73 23.33Q113.67 22.79 116.02 22.25Q118.37 21.71 120.72 21.01Q123.07 20.3 125.01 19.12Q126.96 17.93 128.17 15.98Q129.39 14.04 129.39 11.07Q129.39 7.88 127.61 5.24Q125.82 2.59 122.29 0.97Q118.75 -0.65 113.35 -0.65Z",
20
+ "M150.21 0L150.21 30.67L138.12 30.67L138.12 37.8L171.06 37.8L171.06 30.67L158.96 30.67L158.96 0Z"
21
+ ];
22
+ var PALETTES = {
23
+ night: { c1: "#F3DFBC", mid: "#EEC2AA", c2: "#E8A598", text: "#F3DFBC" },
24
+ day: { c1: "#B8864A", mid: "#C47853", c2: "#CF6A5C", text: "#2E211B" }
25
+ };
26
+ var LOGO = {
27
+ width: 284,
28
+ height: 48,
29
+ markTransform: "translate(1.672 0) scale(0.16725)",
30
+ wordTransform: "translate(177.5 35.9) scale(0.62 -0.62)"
31
+ };
32
+
33
+ // src/MarkShapes.tsx
34
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
35
+ function MarkShapes({ variant, color, uid }) {
36
+ if (variant === "mono") {
37
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
38
+ /* @__PURE__ */ jsx("path", { fill: color, d: MARK.earL }),
39
+ /* @__PURE__ */ jsx("path", { fill: color, d: MARK.earR }),
40
+ /* @__PURE__ */ jsx("path", { fill: color, d: MARK.vee }),
41
+ /* @__PURE__ */ jsx("path", { fill: color, d: MARK.star })
42
+ ] });
43
+ }
44
+ const p = PALETTES[variant];
45
+ const ear = `vf-ear-${uid}`;
46
+ const vee = `vf-vee-${uid}`;
47
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
48
+ /* @__PURE__ */ jsxs("defs", { children: [
49
+ /* @__PURE__ */ jsxs("linearGradient", { id: ear, gradientUnits: "userSpaceOnUse", x1: "0", y1: "0", x2: "320", y2: "0", children: [
50
+ /* @__PURE__ */ jsx("stop", { offset: "0", stopColor: p.c1 }),
51
+ /* @__PURE__ */ jsx("stop", { offset: "0.5", stopColor: p.mid }),
52
+ /* @__PURE__ */ jsx("stop", { offset: "1", stopColor: p.c2 })
53
+ ] }),
54
+ /* @__PURE__ */ jsxs("linearGradient", { id: vee, gradientUnits: "userSpaceOnUse", x1: "80", y1: "0", x2: "240", y2: "0", children: [
55
+ /* @__PURE__ */ jsx("stop", { offset: "0", stopColor: p.c1 }),
56
+ /* @__PURE__ */ jsx("stop", { offset: "0.55", stopColor: p.mid }),
57
+ /* @__PURE__ */ jsx("stop", { offset: "1", stopColor: p.c2 })
58
+ ] })
59
+ ] }),
60
+ /* @__PURE__ */ jsx("path", { fill: `url(#${ear})`, d: MARK.earL }),
61
+ /* @__PURE__ */ jsx("path", { fill: `url(#${ear})`, d: MARK.earR }),
62
+ /* @__PURE__ */ jsx("path", { fill: `url(#${vee})`, d: MARK.vee }),
63
+ /* @__PURE__ */ jsx("path", { fill: p.mid, d: MARK.star })
64
+ ] });
65
+ }
66
+
67
+ // src/VulpfestIcon.tsx
68
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
69
+ var VulpfestIcon = React.forwardRef(function VulpfestIcon2({ size = 24, color = "currentColor", variant = "mono", title, ...rest }, ref) {
70
+ const uid = React.useId().replace(/[^a-zA-Z0-9_-]/g, "");
71
+ return /* @__PURE__ */ jsxs2(
72
+ "svg",
73
+ {
74
+ ref,
75
+ xmlns: "http://www.w3.org/2000/svg",
76
+ viewBox: MARK_VIEWBOX,
77
+ width: size,
78
+ height: size,
79
+ role: title ? "img" : void 0,
80
+ "aria-hidden": title ? void 0 : true,
81
+ "aria-label": title,
82
+ focusable: "false",
83
+ ...rest,
84
+ children: [
85
+ title ? /* @__PURE__ */ jsx2("title", { children: title }) : null,
86
+ /* @__PURE__ */ jsx2(MarkShapes, { variant, color, uid })
87
+ ]
88
+ }
89
+ );
90
+ });
91
+
92
+ // src/VulpfestLogo.tsx
93
+ import * as React2 from "react";
94
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
95
+ var VulpfestLogo = React2.forwardRef(function VulpfestLogo2({ height = 32, color = "currentColor", variant = "mono", title = "Vulpfest", ...rest }, ref) {
96
+ const uid = React2.useId().replace(/[^a-zA-Z0-9_-]/g, "");
97
+ const text = variant === "mono" ? color : PALETTES[variant].text;
98
+ return /* @__PURE__ */ jsxs3(
99
+ "svg",
100
+ {
101
+ ref,
102
+ xmlns: "http://www.w3.org/2000/svg",
103
+ viewBox: `0 0 ${LOGO.width} ${LOGO.height}`,
104
+ height,
105
+ role: "img",
106
+ "aria-label": title,
107
+ focusable: "false",
108
+ ...rest,
109
+ children: [
110
+ /* @__PURE__ */ jsx3("title", { children: title }),
111
+ /* @__PURE__ */ jsx3("g", { transform: LOGO.markTransform, children: /* @__PURE__ */ jsx3(MarkShapes, { variant, color, uid }) }),
112
+ /* @__PURE__ */ jsx3("g", { transform: LOGO.wordTransform, fill: text, fillRule: "evenodd", children: WORDMARK.map((d, i) => /* @__PURE__ */ jsx3("path", { d }, i)) })
113
+ ]
114
+ }
115
+ );
116
+ });
117
+
118
+ // src/svg.ts
119
+ function shapes(variant, color, id) {
120
+ if (variant === "mono") return [MARK.earL, MARK.earR, MARK.vee, MARK.star].map((d) => `<path fill="${color}" d="${d}"/>`).join("");
121
+ const p = PALETTES[variant];
122
+ return `<defs><linearGradient id="${id}-ear" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="320" y2="0"><stop offset="0" stop-color="${p.c1}"/><stop offset="0.5" stop-color="${p.mid}"/><stop offset="1" stop-color="${p.c2}"/></linearGradient><linearGradient id="${id}-vee" gradientUnits="userSpaceOnUse" x1="80" y1="0" x2="240" y2="0"><stop offset="0" stop-color="${p.c1}"/><stop offset="0.55" stop-color="${p.mid}"/><stop offset="1" stop-color="${p.c2}"/></linearGradient></defs><path fill="url(#${id}-ear)" d="${MARK.earL}"/><path fill="url(#${id}-ear)" d="${MARK.earR}"/><path fill="url(#${id}-vee)" d="${MARK.vee}"/><path fill="${p.mid}" d="${MARK.star}"/>`;
123
+ }
124
+ var sizeAttrs = (w, h) => `${w !== void 0 ? ` width="${w}"` : ""}${h !== void 0 ? ` height="${h}"` : ""}`;
125
+ function markSvg(variant = "mono", size, color = "currentColor") {
126
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${MARK_VIEWBOX}"${sizeAttrs(size, size)} role="img" aria-label="Vulpfest"><title>Vulpfest</title>${shapes(variant, color, "vf")}</svg>`;
127
+ }
128
+ function logoSvg(variant = "mono", height, color = "currentColor") {
129
+ const text = variant === "mono" ? color : PALETTES[variant].text;
130
+ const width = height !== void 0 ? Math.round(height * LOGO.width / LOGO.height) : void 0;
131
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${LOGO.width} ${LOGO.height}"${sizeAttrs(width, height)} role="img" aria-label="Vulpfest"><title>Vulpfest</title><g transform="${LOGO.markTransform}">${shapes(variant, color, "vf")}</g><g transform="${LOGO.wordTransform}" fill="${text}" fill-rule="evenodd">${WORDMARK.map((d) => `<path d="${d}"/>`).join("")}</g></svg>`;
132
+ }
133
+ export {
134
+ LOGO,
135
+ MARK,
136
+ MARK_VIEWBOX,
137
+ PALETTES,
138
+ VulpfestIcon,
139
+ VulpfestLogo,
140
+ WORDMARK,
141
+ logoSvg,
142
+ markSvg
143
+ };
package/package.json CHANGED
@@ -1,6 +1,65 @@
1
1
  {
2
2
  "name": "@vulpfest/icons",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "The official Vulpfest logo as React components and SVG files.",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "./svg/*": "./svg/*",
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "svg",
26
+ "README.md",
27
+ "LICENSE",
28
+ "TRADEMARK.md"
29
+ ],
30
+ "sideEffects": false,
31
+ "scripts": {
32
+ "build": "tsup src/index.tsx --format esm,cjs --dts --clean && node scripts/build-svg.mjs",
33
+ "prepublishOnly": "npm run build"
34
+ },
35
+ "peerDependencies": {
36
+ "react": ">=18"
37
+ },
38
+ "keywords": [
39
+ "vulpfest",
40
+ "logo",
41
+ "brand",
42
+ "icon",
43
+ "react",
44
+ "svg"
45
+ ],
46
+ "homepage": "https://www.vulpfest.com/brand",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/vulpfest/icons.git"
50
+ },
51
+ "bugs": {
52
+ "url": "https://github.com/vulpfest/icons/issues"
53
+ },
54
+ "author": "Vulpfest <hello@vulpfest.com>",
55
+ "license": "MIT",
56
+ "publishConfig": {
57
+ "access": "public"
58
+ },
59
+ "devDependencies": {
60
+ "@types/react": "^19.3.0",
61
+ "react": "^19.3.1",
62
+ "tsup": "^9.0.0",
63
+ "typescript": "^6.0.3"
64
+ }
65
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 284 48" role="img" aria-label="Vulpfest"><title>Vulpfest</title><g transform="translate(1.672 0) scale(0.16725)"><path fill="#000000" d="M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z"/><path fill="#000000" d="M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z"/><path fill="#000000" d="M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z"/><path fill="#000000" d="M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"/></g><g transform="translate(177.5 35.9) scale(0.62 -0.62)" fill="#000000" fill-rule="evenodd"><path d="M-155.45 0L-171.76 37.8L-162.31 37.8L-150.81 10.8L-139.14 37.8L-130.45 37.8L-146.81 0Z"/><path d="M-102.71 -0.65Q-110.76 -0.65 -115.29 3.83Q-119.83 8.32 -119.83 16.63L-119.83 37.8L-111.08 37.8L-111.08 16.96Q-111.08 11.56 -108.87 9.18Q-106.65 6.8 -102.66 6.8Q-98.66 6.8 -96.45 9.18Q-94.23 11.56 -94.23 16.96L-94.23 37.8L-85.59 37.8L-85.59 16.63Q-85.59 8.32 -90.13 3.83Q-94.67 -0.65 -102.71 -0.65Z"/><path d="M-69.95 0L-69.95 37.8L-61.21 37.8L-61.21 7.13L-42.25 7.13L-42.25 0Z"/><path d="M-30.34 0L-30.34 37.8L-13.98 37.8Q-8.9 37.8 -5.23 36.15Q-1.56 34.51 0.44 31.43Q2.44 28.35 2.44 24.08Q2.44 19.87 0.44 16.79Q-1.56 13.72 -5.23 12.07Q-8.9 10.42 -13.98 10.42L-21.59 10.42L-21.59 0ZM-21.59 17.55L-14.46 17.55Q-10.41 17.55 -8.41 19.28Q-6.42 21.01 -6.42 24.08Q-6.42 27.22 -8.41 28.94Q-10.41 30.67 -14.46 30.67L-21.59 30.67Z"/><path d="M16.19 0L16.19 37.8L44.76 37.8L44.76 30.78L24.94 30.78L24.94 20.79L42.43 20.79L42.43 13.77L24.94 13.77L24.94 0Z"/><path d="M57.7 0L57.7 37.8L86.26 37.8L86.26 30.78L66.39 30.78L66.39 22.57L83.94 22.57L83.94 15.77L66.39 15.77L66.39 7.02L86.96 7.02L86.96 0Z"/><path d="M113.35 -0.65Q108.81 -0.65 104.66 0.57Q100.5 1.78 97.96 3.73L100.93 10.31Q103.36 8.59 106.68 7.48Q110 6.37 113.4 6.37Q116 6.37 117.59 6.89Q119.18 7.4 119.94 8.32Q120.69 9.23 120.69 10.42Q120.69 11.93 119.51 12.83Q118.32 13.72 116.37 14.28Q114.43 14.85 112.08 15.36Q109.73 15.88 107.38 16.63Q105.03 17.39 103.09 18.58Q101.15 19.76 99.93 21.71Q98.72 23.65 98.72 26.68Q98.72 29.92 100.47 32.59Q102.23 35.26 105.76 36.86Q109.3 38.45 114.65 38.45Q118.21 38.45 121.67 37.61Q125.12 36.77 127.77 35.1L125.07 28.46Q122.42 29.97 119.78 30.7Q117.13 31.43 114.59 31.43Q112.05 31.43 110.43 30.83Q108.81 30.24 108.11 29.3Q107.41 28.35 107.41 27.11Q107.41 25.65 108.6 24.76Q109.79 23.87 111.73 23.33Q113.67 22.79 116.02 22.25Q118.37 21.71 120.72 21.01Q123.07 20.3 125.01 19.12Q126.96 17.93 128.17 15.98Q129.39 14.04 129.39 11.07Q129.39 7.88 127.61 5.24Q125.82 2.59 122.29 0.97Q118.75 -0.65 113.35 -0.65Z"/><path d="M150.21 0L150.21 30.67L138.12 30.67L138.12 37.8L171.06 37.8L171.06 30.67L158.96 30.67L158.96 0Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 284 48" role="img" aria-label="Vulpfest"><title>Vulpfest</title><g transform="translate(1.672 0) scale(0.16725)"><defs><linearGradient id="vf-ear" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="320" y2="0"><stop offset="0" stop-color="#B8864A"/><stop offset="0.5" stop-color="#C47853"/><stop offset="1" stop-color="#CF6A5C"/></linearGradient><linearGradient id="vf-vee" gradientUnits="userSpaceOnUse" x1="80" y1="0" x2="240" y2="0"><stop offset="0" stop-color="#B8864A"/><stop offset="0.55" stop-color="#C47853"/><stop offset="1" stop-color="#CF6A5C"/></linearGradient></defs><path fill="url(#vf-ear)" d="M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z"/><path fill="url(#vf-ear)" d="M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z"/><path fill="url(#vf-vee)" d="M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z"/><path fill="#C47853" d="M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"/></g><g transform="translate(177.5 35.9) scale(0.62 -0.62)" fill="#2E211B" fill-rule="evenodd"><path d="M-155.45 0L-171.76 37.8L-162.31 37.8L-150.81 10.8L-139.14 37.8L-130.45 37.8L-146.81 0Z"/><path d="M-102.71 -0.65Q-110.76 -0.65 -115.29 3.83Q-119.83 8.32 -119.83 16.63L-119.83 37.8L-111.08 37.8L-111.08 16.96Q-111.08 11.56 -108.87 9.18Q-106.65 6.8 -102.66 6.8Q-98.66 6.8 -96.45 9.18Q-94.23 11.56 -94.23 16.96L-94.23 37.8L-85.59 37.8L-85.59 16.63Q-85.59 8.32 -90.13 3.83Q-94.67 -0.65 -102.71 -0.65Z"/><path d="M-69.95 0L-69.95 37.8L-61.21 37.8L-61.21 7.13L-42.25 7.13L-42.25 0Z"/><path d="M-30.34 0L-30.34 37.8L-13.98 37.8Q-8.9 37.8 -5.23 36.15Q-1.56 34.51 0.44 31.43Q2.44 28.35 2.44 24.08Q2.44 19.87 0.44 16.79Q-1.56 13.72 -5.23 12.07Q-8.9 10.42 -13.98 10.42L-21.59 10.42L-21.59 0ZM-21.59 17.55L-14.46 17.55Q-10.41 17.55 -8.41 19.28Q-6.42 21.01 -6.42 24.08Q-6.42 27.22 -8.41 28.94Q-10.41 30.67 -14.46 30.67L-21.59 30.67Z"/><path d="M16.19 0L16.19 37.8L44.76 37.8L44.76 30.78L24.94 30.78L24.94 20.79L42.43 20.79L42.43 13.77L24.94 13.77L24.94 0Z"/><path d="M57.7 0L57.7 37.8L86.26 37.8L86.26 30.78L66.39 30.78L66.39 22.57L83.94 22.57L83.94 15.77L66.39 15.77L66.39 7.02L86.96 7.02L86.96 0Z"/><path d="M113.35 -0.65Q108.81 -0.65 104.66 0.57Q100.5 1.78 97.96 3.73L100.93 10.31Q103.36 8.59 106.68 7.48Q110 6.37 113.4 6.37Q116 6.37 117.59 6.89Q119.18 7.4 119.94 8.32Q120.69 9.23 120.69 10.42Q120.69 11.93 119.51 12.83Q118.32 13.72 116.37 14.28Q114.43 14.85 112.08 15.36Q109.73 15.88 107.38 16.63Q105.03 17.39 103.09 18.58Q101.15 19.76 99.93 21.71Q98.72 23.65 98.72 26.68Q98.72 29.92 100.47 32.59Q102.23 35.26 105.76 36.86Q109.3 38.45 114.65 38.45Q118.21 38.45 121.67 37.61Q125.12 36.77 127.77 35.1L125.07 28.46Q122.42 29.97 119.78 30.7Q117.13 31.43 114.59 31.43Q112.05 31.43 110.43 30.83Q108.81 30.24 108.11 29.3Q107.41 28.35 107.41 27.11Q107.41 25.65 108.6 24.76Q109.79 23.87 111.73 23.33Q113.67 22.79 116.02 22.25Q118.37 21.71 120.72 21.01Q123.07 20.3 125.01 19.12Q126.96 17.93 128.17 15.98Q129.39 14.04 129.39 11.07Q129.39 7.88 127.61 5.24Q125.82 2.59 122.29 0.97Q118.75 -0.65 113.35 -0.65Z"/><path d="M150.21 0L150.21 30.67L138.12 30.67L138.12 37.8L171.06 37.8L171.06 30.67L158.96 30.67L158.96 0Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 284 48" role="img" aria-label="Vulpfest"><title>Vulpfest</title><g transform="translate(1.672 0) scale(0.16725)"><defs><linearGradient id="vf-ear" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="320" y2="0"><stop offset="0" stop-color="#F3DFBC"/><stop offset="0.5" stop-color="#EEC2AA"/><stop offset="1" stop-color="#E8A598"/></linearGradient><linearGradient id="vf-vee" gradientUnits="userSpaceOnUse" x1="80" y1="0" x2="240" y2="0"><stop offset="0" stop-color="#F3DFBC"/><stop offset="0.55" stop-color="#EEC2AA"/><stop offset="1" stop-color="#E8A598"/></linearGradient></defs><path fill="url(#vf-ear)" d="M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z"/><path fill="url(#vf-ear)" d="M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z"/><path fill="url(#vf-vee)" d="M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z"/><path fill="#EEC2AA" d="M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"/></g><g transform="translate(177.5 35.9) scale(0.62 -0.62)" fill="#F3DFBC" fill-rule="evenodd"><path d="M-155.45 0L-171.76 37.8L-162.31 37.8L-150.81 10.8L-139.14 37.8L-130.45 37.8L-146.81 0Z"/><path d="M-102.71 -0.65Q-110.76 -0.65 -115.29 3.83Q-119.83 8.32 -119.83 16.63L-119.83 37.8L-111.08 37.8L-111.08 16.96Q-111.08 11.56 -108.87 9.18Q-106.65 6.8 -102.66 6.8Q-98.66 6.8 -96.45 9.18Q-94.23 11.56 -94.23 16.96L-94.23 37.8L-85.59 37.8L-85.59 16.63Q-85.59 8.32 -90.13 3.83Q-94.67 -0.65 -102.71 -0.65Z"/><path d="M-69.95 0L-69.95 37.8L-61.21 37.8L-61.21 7.13L-42.25 7.13L-42.25 0Z"/><path d="M-30.34 0L-30.34 37.8L-13.98 37.8Q-8.9 37.8 -5.23 36.15Q-1.56 34.51 0.44 31.43Q2.44 28.35 2.44 24.08Q2.44 19.87 0.44 16.79Q-1.56 13.72 -5.23 12.07Q-8.9 10.42 -13.98 10.42L-21.59 10.42L-21.59 0ZM-21.59 17.55L-14.46 17.55Q-10.41 17.55 -8.41 19.28Q-6.42 21.01 -6.42 24.08Q-6.42 27.22 -8.41 28.94Q-10.41 30.67 -14.46 30.67L-21.59 30.67Z"/><path d="M16.19 0L16.19 37.8L44.76 37.8L44.76 30.78L24.94 30.78L24.94 20.79L42.43 20.79L42.43 13.77L24.94 13.77L24.94 0Z"/><path d="M57.7 0L57.7 37.8L86.26 37.8L86.26 30.78L66.39 30.78L66.39 22.57L83.94 22.57L83.94 15.77L66.39 15.77L66.39 7.02L86.96 7.02L86.96 0Z"/><path d="M113.35 -0.65Q108.81 -0.65 104.66 0.57Q100.5 1.78 97.96 3.73L100.93 10.31Q103.36 8.59 106.68 7.48Q110 6.37 113.4 6.37Q116 6.37 117.59 6.89Q119.18 7.4 119.94 8.32Q120.69 9.23 120.69 10.42Q120.69 11.93 119.51 12.83Q118.32 13.72 116.37 14.28Q114.43 14.85 112.08 15.36Q109.73 15.88 107.38 16.63Q105.03 17.39 103.09 18.58Q101.15 19.76 99.93 21.71Q98.72 23.65 98.72 26.68Q98.72 29.92 100.47 32.59Q102.23 35.26 105.76 36.86Q109.3 38.45 114.65 38.45Q118.21 38.45 121.67 37.61Q125.12 36.77 127.77 35.1L125.07 28.46Q122.42 29.97 119.78 30.7Q117.13 31.43 114.59 31.43Q112.05 31.43 110.43 30.83Q108.81 30.24 108.11 29.3Q107.41 28.35 107.41 27.11Q107.41 25.65 108.6 24.76Q109.79 23.87 111.73 23.33Q113.67 22.79 116.02 22.25Q118.37 21.71 120.72 21.01Q123.07 20.3 125.01 19.12Q126.96 17.93 128.17 15.98Q129.39 14.04 129.39 11.07Q129.39 7.88 127.61 5.24Q125.82 2.59 122.29 0.97Q118.75 -0.65 113.35 -0.65Z"/><path d="M150.21 0L150.21 30.67L138.12 30.67L138.12 37.8L171.06 37.8L171.06 30.67L158.96 30.67L158.96 0Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 284 48" role="img" aria-label="Vulpfest"><title>Vulpfest</title><g transform="translate(1.672 0) scale(0.16725)"><path fill="#FFFFFF" d="M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z"/><path fill="#FFFFFF" d="M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z"/><path fill="#FFFFFF" d="M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z"/><path fill="#FFFFFF" d="M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"/></g><g transform="translate(177.5 35.9) scale(0.62 -0.62)" fill="#FFFFFF" fill-rule="evenodd"><path d="M-155.45 0L-171.76 37.8L-162.31 37.8L-150.81 10.8L-139.14 37.8L-130.45 37.8L-146.81 0Z"/><path d="M-102.71 -0.65Q-110.76 -0.65 -115.29 3.83Q-119.83 8.32 -119.83 16.63L-119.83 37.8L-111.08 37.8L-111.08 16.96Q-111.08 11.56 -108.87 9.18Q-106.65 6.8 -102.66 6.8Q-98.66 6.8 -96.45 9.18Q-94.23 11.56 -94.23 16.96L-94.23 37.8L-85.59 37.8L-85.59 16.63Q-85.59 8.32 -90.13 3.83Q-94.67 -0.65 -102.71 -0.65Z"/><path d="M-69.95 0L-69.95 37.8L-61.21 37.8L-61.21 7.13L-42.25 7.13L-42.25 0Z"/><path d="M-30.34 0L-30.34 37.8L-13.98 37.8Q-8.9 37.8 -5.23 36.15Q-1.56 34.51 0.44 31.43Q2.44 28.35 2.44 24.08Q2.44 19.87 0.44 16.79Q-1.56 13.72 -5.23 12.07Q-8.9 10.42 -13.98 10.42L-21.59 10.42L-21.59 0ZM-21.59 17.55L-14.46 17.55Q-10.41 17.55 -8.41 19.28Q-6.42 21.01 -6.42 24.08Q-6.42 27.22 -8.41 28.94Q-10.41 30.67 -14.46 30.67L-21.59 30.67Z"/><path d="M16.19 0L16.19 37.8L44.76 37.8L44.76 30.78L24.94 30.78L24.94 20.79L42.43 20.79L42.43 13.77L24.94 13.77L24.94 0Z"/><path d="M57.7 0L57.7 37.8L86.26 37.8L86.26 30.78L66.39 30.78L66.39 22.57L83.94 22.57L83.94 15.77L66.39 15.77L66.39 7.02L86.96 7.02L86.96 0Z"/><path d="M113.35 -0.65Q108.81 -0.65 104.66 0.57Q100.5 1.78 97.96 3.73L100.93 10.31Q103.36 8.59 106.68 7.48Q110 6.37 113.4 6.37Q116 6.37 117.59 6.89Q119.18 7.4 119.94 8.32Q120.69 9.23 120.69 10.42Q120.69 11.93 119.51 12.83Q118.32 13.72 116.37 14.28Q114.43 14.85 112.08 15.36Q109.73 15.88 107.38 16.63Q105.03 17.39 103.09 18.58Q101.15 19.76 99.93 21.71Q98.72 23.65 98.72 26.68Q98.72 29.92 100.47 32.59Q102.23 35.26 105.76 36.86Q109.3 38.45 114.65 38.45Q118.21 38.45 121.67 37.61Q125.12 36.77 127.77 35.1L125.07 28.46Q122.42 29.97 119.78 30.7Q117.13 31.43 114.59 31.43Q112.05 31.43 110.43 30.83Q108.81 30.24 108.11 29.3Q107.41 28.35 107.41 27.11Q107.41 25.65 108.6 24.76Q109.79 23.87 111.73 23.33Q113.67 22.79 116.02 22.25Q118.37 21.71 120.72 21.01Q123.07 20.3 125.01 19.12Q126.96 17.93 128.17 15.98Q129.39 14.04 129.39 11.07Q129.39 7.88 127.61 5.24Q125.82 2.59 122.29 0.97Q118.75 -0.65 113.35 -0.65Z"/><path d="M150.21 0L150.21 30.67L138.12 30.67L138.12 37.8L171.06 37.8L171.06 30.67L158.96 30.67L158.96 0Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 0 340 290" role="img" aria-label="Vulpfest"><title>Vulpfest</title><path fill="#000000" d="M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z"/><path fill="#000000" d="M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z"/><path fill="#000000" d="M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z"/><path fill="#000000" d="M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 0 340 290" role="img" aria-label="Vulpfest"><title>Vulpfest</title><defs><linearGradient id="vf-ear" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="320" y2="0"><stop offset="0" stop-color="#B8864A"/><stop offset="0.5" stop-color="#C47853"/><stop offset="1" stop-color="#CF6A5C"/></linearGradient><linearGradient id="vf-vee" gradientUnits="userSpaceOnUse" x1="80" y1="0" x2="240" y2="0"><stop offset="0" stop-color="#B8864A"/><stop offset="0.55" stop-color="#C47853"/><stop offset="1" stop-color="#CF6A5C"/></linearGradient></defs><path fill="url(#vf-ear)" d="M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z"/><path fill="url(#vf-ear)" d="M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z"/><path fill="url(#vf-vee)" d="M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z"/><path fill="#C47853" d="M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 0 340 290" role="img" aria-label="Vulpfest"><title>Vulpfest</title><defs><linearGradient id="vf-ear" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="320" y2="0"><stop offset="0" stop-color="#F3DFBC"/><stop offset="0.5" stop-color="#EEC2AA"/><stop offset="1" stop-color="#E8A598"/></linearGradient><linearGradient id="vf-vee" gradientUnits="userSpaceOnUse" x1="80" y1="0" x2="240" y2="0"><stop offset="0" stop-color="#F3DFBC"/><stop offset="0.55" stop-color="#EEC2AA"/><stop offset="1" stop-color="#E8A598"/></linearGradient></defs><path fill="url(#vf-ear)" d="M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z"/><path fill="url(#vf-ear)" d="M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z"/><path fill="url(#vf-vee)" d="M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z"/><path fill="#EEC2AA" d="M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 0 340 290" role="img" aria-label="Vulpfest"><title>Vulpfest</title><path fill="#FFFFFF" d="M5 3 L158 112 L158 138 L32 38 C25 85 46 132 84 176 L90 198 C10 142 -8 70 5 3 Z"/><path fill="#FFFFFF" d="M315 3 L162 112 L162 138 L288 38 C295 85 274 132 236 176 L230 198 C310 142 328 70 315 3 Z"/><path fill="#FFFFFF" d="M80 164 L160 284 L240 164 L216 158 L160 240 L104 158 Z"/><path fill="#FFFFFF" d="M160 70 Q163 84 176 88 Q163 92 160 106 Q157 92 144 88 Q157 84 160 70 Z"/></svg>