@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 +24 -0
- package/README.md +59 -2
- package/TRADEMARK.md +24 -0
- package/dist/index.cjs +188 -0
- package/dist/index.d.cts +70 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.js +143 -0
- package/package.json +63 -4
- package/svg/vulpfest-logo-black.svg +1 -0
- package/svg/vulpfest-logo-day.svg +1 -0
- package/svg/vulpfest-logo-night.svg +1 -0
- package/svg/vulpfest-logo-white.svg +1 -0
- package/svg/vulpfest-mark-black.svg +1 -0
- package/svg/vulpfest-mark-day.svg +1 -0
- package/svg/vulpfest-mark-night.svg +1 -0
- package/svg/vulpfest-mark-white.svg +1 -0
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
|
-
#
|
|
1
|
+
# @vulpfest/icons
|
|
2
2
|
|
|
3
|
-
|
|
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
|
+
});
|
package/dist/index.d.cts
ADDED
|
@@ -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.d.ts
ADDED
|
@@ -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.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
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>
|