@snowztech/ui 0.1.0

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/dist/index.js ADDED
@@ -0,0 +1,279 @@
1
+ export { ActivityIcon, ArrowRightIcon, ArrowUpRightIcon, BellIcon, BoltIcon, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ClockIcon, CloudIcon, CodeIcon, CubeIcon, DatabaseIcon, DiscordIcon, EditIcon, ExternalLinkIcon, EyeIcon, FileIcon, FilterIcon, FolderIcon, GitIcon, GithubIcon, GridIcon, HeartIcon, Icon, InboxIcon, InfoIcon, LayersIcon, LockIcon, MailIcon, MenuIcon, MinusIcon, MoonIcon, PlusIcon, PulseIcon, SearchIcon, SettingsIcon, StarIcon, SunIcon, TerminalIcon, TrashIcon, UserIcon, WarningIcon, XIcon, ZapIcon } from './chunk-XYNFF4B5.js';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import * as React from 'react';
4
+
5
+ var SnowMark = ({ size = 48, color = "currentColor", style }) => /* @__PURE__ */ jsxs(
6
+ "svg",
7
+ {
8
+ width: size,
9
+ height: size,
10
+ viewBox: "0 0 32 32",
11
+ fill: color,
12
+ style: { display: "inline-block", verticalAlign: "middle", ...style },
13
+ "aria-hidden": "true",
14
+ children: [
15
+ /* @__PURE__ */ jsx("rect", { x: "9", y: "6", width: "14", height: "2.4" }),
16
+ /* @__PURE__ */ jsx("polygon", { points: "22.4,6 23,8.4 9.6,26 9,23.6" }),
17
+ /* @__PURE__ */ jsx("rect", { x: "9", y: "23.6", width: "14", height: "2.4" }),
18
+ /* @__PURE__ */ jsxs("g", { fill: color, children: [
19
+ /* @__PURE__ */ jsx("polygon", { points: "16,1 18,4 16,7 14,4" }),
20
+ /* @__PURE__ */ jsx("polygon", { points: "16,25 18,28 16,31 14,28" }),
21
+ /* @__PURE__ */ jsx("polygon", { points: "27,8 28.7,11 25.5,11.5 26,8.7" }),
22
+ /* @__PURE__ */ jsx("polygon", { points: "5,8 6,8.7 6.5,11.5 3.3,11" }),
23
+ /* @__PURE__ */ jsx("polygon", { points: "27,24 26,23.3 25.5,20.5 28.7,21" }),
24
+ /* @__PURE__ */ jsx("polygon", { points: "5,24 3.3,21 6.5,20.5 6,23.3" })
25
+ ] })
26
+ ]
27
+ }
28
+ );
29
+ var SnowWordmark = ({
30
+ size = 18,
31
+ color = "currentColor",
32
+ showDot = true,
33
+ accent = "var(--sn-accent)"
34
+ }) => /* @__PURE__ */ jsxs(
35
+ "span",
36
+ {
37
+ style: {
38
+ fontFamily: "var(--sn-font-mono)",
39
+ fontSize: size,
40
+ fontWeight: 700,
41
+ letterSpacing: "-0.01em",
42
+ color,
43
+ lineHeight: 1
44
+ },
45
+ children: [
46
+ "snowztech",
47
+ showDot && /* @__PURE__ */ jsx("span", { style: { color: accent }, children: "." })
48
+ ]
49
+ }
50
+ );
51
+ var SnowMonogram = ({
52
+ size = 64,
53
+ bg = "#0a0a0a",
54
+ fg = "#ffffff",
55
+ radius = 8
56
+ }) => /* @__PURE__ */ jsx(Monogram, { size, bg, fg, radius, mark: SnowMark });
57
+ var Monogram = ({
58
+ size = 64,
59
+ bg = "#0a0a0a",
60
+ fg = "#ffffff",
61
+ radius = 8,
62
+ mark: Mark,
63
+ glyphScale = 0.6
64
+ }) => /* @__PURE__ */ jsx(
65
+ "div",
66
+ {
67
+ style: {
68
+ width: size,
69
+ height: size,
70
+ background: bg,
71
+ borderRadius: radius,
72
+ display: "inline-flex",
73
+ alignItems: "center",
74
+ justifyContent: "center",
75
+ flexShrink: 0
76
+ },
77
+ children: /* @__PURE__ */ jsx(Mark, { size: Math.round(size * glyphScale), color: fg })
78
+ }
79
+ );
80
+ var wrap = (style) => ({
81
+ display: "inline-block",
82
+ verticalAlign: "middle",
83
+ ...style
84
+ });
85
+ var MarkSigil = ({ size = 64, color = "currentColor", style }) => /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 32 32", fill: color, style: wrap(style), "aria-hidden": "true", children: [
86
+ /* @__PURE__ */ jsx("rect", { x: "14.5", y: "3", width: "3", height: "11" }),
87
+ /* @__PURE__ */ jsx("rect", { x: "14.5", y: "18", width: "3", height: "11" }),
88
+ /* @__PURE__ */ jsxs("g", { transform: "rotate(60 16 16)", children: [
89
+ /* @__PURE__ */ jsx("rect", { x: "14.5", y: "3", width: "3", height: "10.5" }),
90
+ /* @__PURE__ */ jsx("rect", { x: "14.5", y: "18.5", width: "3", height: "10.5" })
91
+ ] }),
92
+ /* @__PURE__ */ jsxs("g", { transform: "rotate(-60 16 16)", children: [
93
+ /* @__PURE__ */ jsx("rect", { x: "14.5", y: "3", width: "3", height: "10.5" }),
94
+ /* @__PURE__ */ jsx("rect", { x: "14.5", y: "18.5", width: "3", height: "10.5" })
95
+ ] })
96
+ ] });
97
+ var MarkCrystal = ({ size = 64, color = "currentColor", style }) => /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 32 32", fill: "none", stroke: color, strokeWidth: "2.4", strokeLinejoin: "miter", strokeLinecap: "square", style: wrap(style), "aria-hidden": "true", children: [
98
+ /* @__PURE__ */ jsx("polygon", { points: "16,3 27,9.5 27,22.5 16,29 5,22.5 5,9.5" }),
99
+ /* @__PURE__ */ jsx("polygon", { points: "16,9 22,16 16,23 10,16" }),
100
+ /* @__PURE__ */ jsx("line", { x1: "16", y1: "3", x2: "16", y2: "9" }),
101
+ /* @__PURE__ */ jsx("line", { x1: "16", y1: "23", x2: "16", y2: "29" })
102
+ ] });
103
+ var MarkZFlake = ({ size = 64, color = "currentColor", style }) => /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 32 32", fill: color, style: wrap(style), "aria-hidden": "true", children: [
104
+ /* @__PURE__ */ jsx("polygon", { points: "6,5 26,5 26,9 12,9 26,23 26,27 6,27 6,23 20,23 6,9" }),
105
+ /* @__PURE__ */ jsx("rect", { x: "4", y: "14", width: "3", height: "4" }),
106
+ /* @__PURE__ */ jsx("rect", { x: "25", y: "14", width: "3", height: "4" })
107
+ ] });
108
+ var MarkAsterisk = ({ size = 64, color = "currentColor", style }) => /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 32 32", fill: color, style: wrap(style), "aria-hidden": "true", children: [
109
+ /* @__PURE__ */ jsx("circle", { cx: "16", cy: "16", r: "2.2", fill: "none", stroke: color, strokeWidth: "2" }),
110
+ [0, 60, 120].map((deg, i) => /* @__PURE__ */ jsxs("g", { transform: `rotate(${deg} 16 16)`, children: [
111
+ /* @__PURE__ */ jsx("rect", { x: "14.6", y: "2", width: "2.8", height: "9", rx: "0.5" }),
112
+ /* @__PURE__ */ jsx("rect", { x: "14.6", y: "21", width: "2.8", height: "9", rx: "0.5" })
113
+ ] }, i))
114
+ ] });
115
+ var MarkSlash = ({ size = 64, color = "currentColor", style }) => /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 32 32", fill: "none", stroke: color, strokeWidth: "3.2", strokeLinecap: "square", strokeLinejoin: "miter", style: wrap(style), "aria-hidden": "true", children: [
116
+ /* @__PURE__ */ jsx("line", { x1: "16", y1: "4", x2: "16", y2: "28" }),
117
+ /* @__PURE__ */ jsx("line", { x1: "6", y1: "10", x2: "26", y2: "22" }),
118
+ /* @__PURE__ */ jsx("line", { x1: "26", y1: "10", x2: "6", y2: "22" }),
119
+ /* @__PURE__ */ jsx("line", { x1: "3", y1: "22", x2: "20", y2: "5", stroke: color, strokeWidth: "4" })
120
+ ] });
121
+ var MarkGlyph = ({ size = 64, color = "currentColor", style }) => /* @__PURE__ */ jsx("svg", { width: size, height: size, viewBox: "0 0 32 32", fill: color, style: wrap(style), "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M7 5 H25 V11 H13 V14 H25 V27 H7 V21 H19 V18 H7 Z" }) });
122
+ var MarkHex = ({ size = 64, color = "currentColor", style }) => {
123
+ const id = React.useId();
124
+ return /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 32 32", style: wrap(style), "aria-hidden": "true", children: [
125
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("mask", { id, children: [
126
+ /* @__PURE__ */ jsx("rect", { width: "32", height: "32", fill: "white" }),
127
+ /* @__PURE__ */ jsxs("g", { fill: "black", children: [
128
+ /* @__PURE__ */ jsx("rect", { x: "14.5", y: "6", width: "3", height: "20" }),
129
+ /* @__PURE__ */ jsx("g", { transform: "rotate(60 16 16)", children: /* @__PURE__ */ jsx("rect", { x: "14.5", y: "6", width: "3", height: "20" }) }),
130
+ /* @__PURE__ */ jsx("g", { transform: "rotate(-60 16 16)", children: /* @__PURE__ */ jsx("rect", { x: "14.5", y: "6", width: "3", height: "20" }) })
131
+ ] })
132
+ ] }) }),
133
+ /* @__PURE__ */ jsx("polygon", { points: "16,3 27,9.5 27,22.5 16,29 5,22.5 5,9.5", fill: color, mask: `url(#${id})` })
134
+ ] });
135
+ };
136
+ var MarkDotgrid = ({ size = 64, color = "currentColor", style }) => {
137
+ const dots = [/* @__PURE__ */ jsx("circle", { cx: "16", cy: "16", r: "2", fill: color }, "c")];
138
+ for (let a = 0; a < 6; a++) {
139
+ const ang = a * 60 * Math.PI / 180;
140
+ for (let r = 1; r <= 3; r++) {
141
+ const x = 16 + Math.cos(ang) * r * 4;
142
+ const y = 16 + Math.sin(ang) * r * 4;
143
+ const rad = r === 3 ? 1.6 : r === 2 ? 1.8 : 2;
144
+ dots.push(/* @__PURE__ */ jsx("circle", { cx: x, cy: y, r: rad, fill: color }, `${a}-${r}`));
145
+ }
146
+ }
147
+ return /* @__PURE__ */ jsx("svg", { width: size, height: size, viewBox: "0 0 32 32", style: wrap(style), "aria-hidden": "true", children: dots });
148
+ };
149
+ var markVariants = [
150
+ { id: "crystal", name: "Crystal", sub: "hex frame + diamond cut, canonical", Mark: MarkCrystal, exportName: "MarkCrystal" },
151
+ { id: "sigil", name: "Sigil", sub: "chunky bars", Mark: MarkSigil, exportName: "MarkSigil" },
152
+ { id: "zflake", name: "Z-Flake", sub: "the Z of snowztech", Mark: MarkZFlake, exportName: "MarkZFlake" },
153
+ { id: "asterisk", name: "Asterisk", sub: "mono-native, typographic", Mark: MarkAsterisk, exportName: "MarkAsterisk" },
154
+ { id: "slash", name: "Slash-Star", sub: "stamped, signature slash", Mark: MarkSlash, exportName: "MarkSlash" },
155
+ { id: "hex", name: "Hex-Cut", sub: "negative-space hex tile", Mark: MarkHex, exportName: "MarkHex" },
156
+ { id: "dotgrid", name: "Dot-Grid", sub: "pointillist, friendly", Mark: MarkDotgrid, exportName: "MarkDotgrid" },
157
+ { id: "glyph", name: "Glyph S", sub: "monogram, folded ribbon", Mark: MarkGlyph, exportName: "MarkGlyph" }
158
+ ];
159
+ var initialsFrom = (name) => {
160
+ if (!name) return "";
161
+ const parts = name.trim().split(/\s+/).slice(0, 2);
162
+ return parts.map((p) => p[0]?.toUpperCase() ?? "").join("");
163
+ };
164
+ var Avatar = ({
165
+ src,
166
+ alt,
167
+ name,
168
+ size = 32,
169
+ shape = "circle",
170
+ ring = false,
171
+ style,
172
+ className
173
+ }) => {
174
+ const radius = shape === "circle" ? "50%" : "var(--sn-r-xs)";
175
+ const initials = initialsFrom(name);
176
+ return /* @__PURE__ */ jsx(
177
+ "span",
178
+ {
179
+ className,
180
+ style: {
181
+ display: "inline-flex",
182
+ alignItems: "center",
183
+ justifyContent: "center",
184
+ width: size,
185
+ height: size,
186
+ borderRadius: radius,
187
+ background: "var(--sn-bg-elev-1)",
188
+ color: "var(--sn-fg-muted)",
189
+ fontFamily: "var(--sn-font-mono)",
190
+ fontSize: Math.max(10, Math.round(size * 0.38)),
191
+ fontWeight: 500,
192
+ overflow: "hidden",
193
+ flexShrink: 0,
194
+ boxShadow: ring ? "0 0 0 1px var(--sn-border-strong)" : void 0,
195
+ ...style
196
+ },
197
+ children: src ? (
198
+ // eslint-disable-next-line @next/next/no-img-element
199
+ /* @__PURE__ */ jsx(
200
+ "img",
201
+ {
202
+ src,
203
+ alt: alt ?? name ?? "",
204
+ width: size,
205
+ height: size,
206
+ style: { width: "100%", height: "100%", objectFit: "cover" }
207
+ }
208
+ )
209
+ ) : /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: initials || "\u2022" })
210
+ }
211
+ );
212
+ };
213
+ var AvatarStack = ({ children, overlap = 8 }) => /* @__PURE__ */ jsx("span", { style: { display: "inline-flex" }, children: React.Children.map(children, (child, i) => /* @__PURE__ */ jsx("span", { style: { marginLeft: i === 0 ? 0 : -overlap }, children: child })) });
214
+ var Pulse = ({
215
+ size = 8,
216
+ color = "var(--sn-success)",
217
+ label,
218
+ style,
219
+ className
220
+ }) => /* @__PURE__ */ jsxs(
221
+ "span",
222
+ {
223
+ className,
224
+ style: {
225
+ display: "inline-flex",
226
+ alignItems: "center",
227
+ gap: 8,
228
+ color: "var(--sn-fg-muted)",
229
+ fontSize: "var(--sn-text-sm)",
230
+ ...style
231
+ },
232
+ children: [
233
+ /* @__PURE__ */ jsxs(
234
+ "span",
235
+ {
236
+ "aria-hidden": "true",
237
+ style: {
238
+ position: "relative",
239
+ display: "inline-flex",
240
+ width: size,
241
+ height: size
242
+ },
243
+ children: [
244
+ /* @__PURE__ */ jsx(
245
+ "span",
246
+ {
247
+ style: {
248
+ position: "absolute",
249
+ inset: 0,
250
+ borderRadius: "50%",
251
+ background: color,
252
+ opacity: 0.6,
253
+ animation: "sn-pulse 2s ease-in-out infinite"
254
+ }
255
+ }
256
+ ),
257
+ /* @__PURE__ */ jsx(
258
+ "span",
259
+ {
260
+ style: {
261
+ position: "relative",
262
+ width: "100%",
263
+ height: "100%",
264
+ borderRadius: "50%",
265
+ background: color
266
+ }
267
+ }
268
+ )
269
+ ]
270
+ }
271
+ ),
272
+ label && /* @__PURE__ */ jsx("span", { children: label })
273
+ ]
274
+ }
275
+ );
276
+
277
+ export { Avatar, AvatarStack, MarkAsterisk, MarkCrystal, MarkDotgrid, MarkGlyph, MarkHex, MarkSigil, MarkSlash, MarkZFlake, Monogram, Pulse, SnowMark, SnowMonogram, SnowWordmark, markVariants };
278
+ //# sourceMappingURL=index.js.map
279
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mark.tsx","../src/mark-variants.tsx","../src/avatar.tsx","../src/pulse.tsx"],"names":["jsxs","jsx","React2"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from \"react\";\n\nexport interface SnowMarkProps {\n size?: number;\n color?: string;\n style?: React.CSSProperties;\n}\n\nexport const SnowMark = ({ size = 48, color = \"currentColor\", style }: SnowMarkProps) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill={color}\n style={{ display: \"inline-block\", verticalAlign: \"middle\", ...style }}\n aria-hidden=\"true\"\n >\n <rect x=\"9\" y=\"6\" width=\"14\" height=\"2.4\" />\n <polygon points=\"22.4,6 23,8.4 9.6,26 9,23.6\" />\n <rect x=\"9\" y=\"23.6\" width=\"14\" height=\"2.4\" />\n <g fill={color}>\n <polygon points=\"16,1 18,4 16,7 14,4\" />\n <polygon points=\"16,25 18,28 16,31 14,28\" />\n <polygon points=\"27,8 28.7,11 25.5,11.5 26,8.7\" />\n <polygon points=\"5,8 6,8.7 6.5,11.5 3.3,11\" />\n <polygon points=\"27,24 26,23.3 25.5,20.5 28.7,21\" />\n <polygon points=\"5,24 3.3,21 6.5,20.5 6,23.3\" />\n </g>\n </svg>\n);\n\nexport interface SnowWordmarkProps {\n size?: number;\n color?: string;\n showDot?: boolean;\n accent?: string;\n}\n\nexport const SnowWordmark = ({\n size = 18,\n color = \"currentColor\",\n showDot = true,\n accent = \"var(--sn-accent)\",\n}: SnowWordmarkProps) => (\n <span\n style={{\n fontFamily: \"var(--sn-font-mono)\",\n fontSize: size,\n fontWeight: 700,\n letterSpacing: \"-0.01em\",\n color,\n lineHeight: 1,\n }}\n >\n snowztech{showDot && <span style={{ color: accent }}>.</span>}\n </span>\n);\n\nexport interface SnowMonogramProps {\n size?: number;\n bg?: string;\n fg?: string;\n radius?: number;\n}\n\nexport const SnowMonogram = ({\n size = 64,\n bg = \"#0a0a0a\",\n fg = \"#ffffff\",\n radius = 8,\n}: SnowMonogramProps) => (\n <Monogram size={size} bg={bg} fg={fg} radius={radius} mark={SnowMark} />\n);\n\nexport interface MonogramProps {\n size?: number;\n bg?: string;\n fg?: string;\n radius?: number;\n mark: React.ComponentType<{ size?: number; color?: string }>;\n glyphScale?: number;\n}\n\nexport const Monogram = ({\n size = 64,\n bg = \"#0a0a0a\",\n fg = \"#ffffff\",\n radius = 8,\n mark: Mark,\n glyphScale = 0.6,\n}: MonogramProps) => (\n <div\n style={{\n width: size,\n height: size,\n background: bg,\n borderRadius: radius,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Mark size={Math.round(size * glyphScale)} color={fg} />\n </div>\n);\n","import * as React from \"react\";\n\nexport interface MarkProps {\n size?: number;\n color?: string;\n style?: React.CSSProperties;\n}\n\nconst wrap = (style?: React.CSSProperties): React.CSSProperties => ({\n display: \"inline-block\",\n verticalAlign: \"middle\",\n ...style,\n});\n\nexport const MarkSigil = ({ size = 64, color = \"currentColor\", style }: MarkProps) => (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill={color} style={wrap(style)} aria-hidden=\"true\">\n <rect x=\"14.5\" y=\"3\" width=\"3\" height=\"11\" />\n <rect x=\"14.5\" y=\"18\" width=\"3\" height=\"11\" />\n <g transform=\"rotate(60 16 16)\">\n <rect x=\"14.5\" y=\"3\" width=\"3\" height=\"10.5\" />\n <rect x=\"14.5\" y=\"18.5\" width=\"3\" height=\"10.5\" />\n </g>\n <g transform=\"rotate(-60 16 16)\">\n <rect x=\"14.5\" y=\"3\" width=\"3\" height=\"10.5\" />\n <rect x=\"14.5\" y=\"18.5\" width=\"3\" height=\"10.5\" />\n </g>\n </svg>\n);\n\nexport const MarkCrystal = ({ size = 64, color = \"currentColor\", style }: MarkProps) => (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" stroke={color} strokeWidth=\"2.4\" strokeLinejoin=\"miter\" strokeLinecap=\"square\" style={wrap(style)} aria-hidden=\"true\">\n <polygon points=\"16,3 27,9.5 27,22.5 16,29 5,22.5 5,9.5\" />\n <polygon points=\"16,9 22,16 16,23 10,16\" />\n <line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"9\" />\n <line x1=\"16\" y1=\"23\" x2=\"16\" y2=\"29\" />\n </svg>\n);\n\nexport const MarkZFlake = ({ size = 64, color = \"currentColor\", style }: MarkProps) => (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill={color} style={wrap(style)} aria-hidden=\"true\">\n <polygon points=\"6,5 26,5 26,9 12,9 26,23 26,27 6,27 6,23 20,23 6,9\" />\n <rect x=\"4\" y=\"14\" width=\"3\" height=\"4\" />\n <rect x=\"25\" y=\"14\" width=\"3\" height=\"4\" />\n </svg>\n);\n\nexport const MarkAsterisk = ({ size = 64, color = \"currentColor\", style }: MarkProps) => (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill={color} style={wrap(style)} aria-hidden=\"true\">\n <circle cx=\"16\" cy=\"16\" r=\"2.2\" fill=\"none\" stroke={color} strokeWidth=\"2\" />\n {[0, 60, 120].map((deg, i) => (\n <g key={i} transform={`rotate(${deg} 16 16)`}>\n <rect x=\"14.6\" y=\"2\" width=\"2.8\" height=\"9\" rx=\"0.5\" />\n <rect x=\"14.6\" y=\"21\" width=\"2.8\" height=\"9\" rx=\"0.5\" />\n </g>\n ))}\n </svg>\n);\n\nexport const MarkSlash = ({ size = 64, color = \"currentColor\", style }: MarkProps) => (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" stroke={color} strokeWidth=\"3.2\" strokeLinecap=\"square\" strokeLinejoin=\"miter\" style={wrap(style)} aria-hidden=\"true\">\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"28\" />\n <line x1=\"6\" y1=\"10\" x2=\"26\" y2=\"22\" />\n <line x1=\"26\" y1=\"10\" x2=\"6\" y2=\"22\" />\n <line x1=\"3\" y1=\"22\" x2=\"20\" y2=\"5\" stroke={color} strokeWidth=\"4\" />\n </svg>\n);\n\nexport const MarkGlyph = ({ size = 64, color = \"currentColor\", style }: MarkProps) => (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill={color} style={wrap(style)} aria-hidden=\"true\">\n <path d=\"M7 5 H25 V11 H13 V14 H25 V27 H7 V21 H19 V18 H7 Z\" />\n </svg>\n);\n\nexport const MarkHex = ({ size = 64, color = \"currentColor\", style }: MarkProps) => {\n const id = React.useId();\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" style={wrap(style)} aria-hidden=\"true\">\n <defs>\n <mask id={id}>\n <rect width=\"32\" height=\"32\" fill=\"white\" />\n <g fill=\"black\">\n <rect x=\"14.5\" y=\"6\" width=\"3\" height=\"20\" />\n <g transform=\"rotate(60 16 16)\"><rect x=\"14.5\" y=\"6\" width=\"3\" height=\"20\" /></g>\n <g transform=\"rotate(-60 16 16)\"><rect x=\"14.5\" y=\"6\" width=\"3\" height=\"20\" /></g>\n </g>\n </mask>\n </defs>\n <polygon points=\"16,3 27,9.5 27,22.5 16,29 5,22.5 5,9.5\" fill={color} mask={`url(#${id})`} />\n </svg>\n );\n};\n\nexport const MarkDotgrid = ({ size = 64, color = \"currentColor\", style }: MarkProps) => {\n const dots: React.ReactElement[] = [<circle key=\"c\" cx=\"16\" cy=\"16\" r=\"2\" fill={color} />];\n for (let a = 0; a < 6; a++) {\n const ang = (a * 60 * Math.PI) / 180;\n for (let r = 1; r <= 3; r++) {\n const x = 16 + Math.cos(ang) * r * 4;\n const y = 16 + Math.sin(ang) * r * 4;\n const rad = r === 3 ? 1.6 : r === 2 ? 1.8 : 2;\n dots.push(<circle key={`${a}-${r}`} cx={x} cy={y} r={rad} fill={color} />);\n }\n }\n return <svg width={size} height={size} viewBox=\"0 0 32 32\" style={wrap(style)} aria-hidden=\"true\">{dots}</svg>;\n};\n\nexport interface MarkVariant {\n id: string;\n name: string;\n sub: string;\n Mark: React.ComponentType<MarkProps>;\n exportName: string;\n}\n\nexport const markVariants: MarkVariant[] = [\n { id: \"crystal\", name: \"Crystal\", sub: \"hex frame + diamond cut, canonical\", Mark: MarkCrystal, exportName: \"MarkCrystal\" },\n { id: \"sigil\", name: \"Sigil\", sub: \"chunky bars\", Mark: MarkSigil, exportName: \"MarkSigil\" },\n { id: \"zflake\", name: \"Z-Flake\", sub: \"the Z of snowztech\", Mark: MarkZFlake, exportName: \"MarkZFlake\" },\n { id: \"asterisk\", name: \"Asterisk\", sub: \"mono-native, typographic\", Mark: MarkAsterisk, exportName: \"MarkAsterisk\" },\n { id: \"slash\", name: \"Slash-Star\", sub: \"stamped, signature slash\", Mark: MarkSlash, exportName: \"MarkSlash\" },\n { id: \"hex\", name: \"Hex-Cut\", sub: \"negative-space hex tile\", Mark: MarkHex, exportName: \"MarkHex\" },\n { id: \"dotgrid\", name: \"Dot-Grid\", sub: \"pointillist, friendly\", Mark: MarkDotgrid, exportName: \"MarkDotgrid\" },\n { id: \"glyph\", name: \"Glyph S\", sub: \"monogram, folded ribbon\", Mark: MarkGlyph, exportName: \"MarkGlyph\" },\n];\n","import * as React from \"react\";\n\nexport interface AvatarProps {\n src?: string;\n alt?: string;\n name?: string;\n size?: number;\n shape?: \"circle\" | \"square\";\n ring?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\nconst initialsFrom = (name?: string) => {\n if (!name) return \"\";\n const parts = name.trim().split(/\\s+/).slice(0, 2);\n return parts.map((p) => p[0]?.toUpperCase() ?? \"\").join(\"\");\n};\n\nexport const Avatar = ({\n src,\n alt,\n name,\n size = 32,\n shape = \"circle\",\n ring = false,\n style,\n className,\n}: AvatarProps) => {\n const radius = shape === \"circle\" ? \"50%\" : \"var(--sn-r-xs)\";\n const initials = initialsFrom(name);\n\n return (\n <span\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: size,\n height: size,\n borderRadius: radius,\n background: \"var(--sn-bg-elev-1)\",\n color: \"var(--sn-fg-muted)\",\n fontFamily: \"var(--sn-font-mono)\",\n fontSize: Math.max(10, Math.round(size * 0.38)),\n fontWeight: 500,\n overflow: \"hidden\",\n flexShrink: 0,\n boxShadow: ring ? \"0 0 0 1px var(--sn-border-strong)\" : undefined,\n ...style,\n }}\n >\n {src ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={src}\n alt={alt ?? name ?? \"\"}\n width={size}\n height={size}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n ) : (\n <span aria-hidden=\"true\">{initials || \"•\"}</span>\n )}\n </span>\n );\n};\n\nexport interface AvatarStackProps {\n children: React.ReactNode;\n overlap?: number;\n}\n\nexport const AvatarStack = ({ children, overlap = 8 }: AvatarStackProps) => (\n <span style={{ display: \"inline-flex\" }}>\n {React.Children.map(children, (child, i) => (\n <span style={{ marginLeft: i === 0 ? 0 : -overlap }}>{child}</span>\n ))}\n </span>\n);\n","import * as React from \"react\";\n\nexport interface PulseProps {\n size?: number;\n color?: string;\n label?: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const Pulse = ({\n size = 8,\n color = \"var(--sn-success)\",\n label,\n style,\n className,\n}: PulseProps) => (\n <span\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"var(--sn-fg-muted)\",\n fontSize: \"var(--sn-text-sm)\",\n ...style,\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n width: size,\n height: size,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n background: color,\n opacity: 0.6,\n animation: \"sn-pulse 2s ease-in-out infinite\",\n }}\n />\n <span\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n borderRadius: \"50%\",\n background: color,\n }}\n />\n </span>\n {label && <span>{label}</span>}\n </span>\n);\n"]}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@snowztech/ui",
3
+ "version": "0.1.0",
4
+ "description": "Terminal-minimal React design system. Mark, icons, tokens, and primitives.",
5
+ "license": "MIT",
6
+ "author": {
7
+ "name": "Lucas Neves Pereira",
8
+ "email": "lnevespereira@proton.me",
9
+ "url": "https://github.com/lucasnevespereira"
10
+ },
11
+ "homepage": "https://github.com/snowztech/ui#readme",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/snowztech/ui.git",
15
+ "directory": "packages/ui"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/snowztech/ui/issues"
19
+ },
20
+ "keywords": [
21
+ "design-system",
22
+ "react",
23
+ "components",
24
+ "ui",
25
+ "icons",
26
+ "tokens",
27
+ "css",
28
+ "terminal",
29
+ "minimal",
30
+ "snowztech"
31
+ ],
32
+ "sideEffects": [
33
+ "**/*.css"
34
+ ],
35
+ "type": "module",
36
+ "main": "./dist/index.cjs",
37
+ "module": "./dist/index.js",
38
+ "types": "./dist/index.d.ts",
39
+ "files": [
40
+ "dist",
41
+ "src/tokens.css",
42
+ "README.md",
43
+ "LICENSE"
44
+ ],
45
+ "exports": {
46
+ ".": {
47
+ "types": "./dist/index.d.ts",
48
+ "import": "./dist/index.js",
49
+ "require": "./dist/index.cjs"
50
+ },
51
+ "./client": {
52
+ "types": "./dist/client.d.ts",
53
+ "import": "./dist/client.js",
54
+ "require": "./dist/client.cjs"
55
+ },
56
+ "./tokens.css": "./src/tokens.css",
57
+ "./package.json": "./package.json"
58
+ },
59
+ "peerDependencies": {
60
+ "react": ">=18"
61
+ },
62
+ "devDependencies": {
63
+ "@types/react": "^18.3.12",
64
+ "react": "^18.3.1",
65
+ "tsup": "^8.3.5",
66
+ "typescript": "^5.6.3"
67
+ },
68
+ "engines": {
69
+ "node": ">=18"
70
+ },
71
+ "publishConfig": {
72
+ "access": "public"
73
+ },
74
+ "scripts": {
75
+ "build": "tsup",
76
+ "dev": "tsup --watch",
77
+ "typecheck": "tsc --noEmit"
78
+ }
79
+ }
package/src/tokens.css ADDED
@@ -0,0 +1,252 @@
1
+ /* ============================================
2
+ snowztech / design tokens (terminal minimal)
3
+ ============================================ */
4
+
5
+ :root {
6
+ --sn-font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
7
+ --sn-font-sans: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
8
+
9
+ /* Type scale: mono everywhere, tight */
10
+ --sn-text-2xs: 11px;
11
+ --sn-text-xs: 12px;
12
+ --sn-text-sm: 13px;
13
+ --sn-text-base: 14px;
14
+ --sn-text-md: 15px;
15
+ --sn-text-lg: 17px;
16
+ --sn-text-xl: 20px;
17
+ --sn-text-2xl: 24px;
18
+ --sn-text-3xl: 28px;
19
+ --sn-text-4xl: 36px;
20
+
21
+ --sn-leading-tight: 1.2;
22
+ --sn-leading-normal: 1.55;
23
+ --sn-leading-relaxed: 1.75;
24
+
25
+ /* spacing: 4px base */
26
+ --sn-s-1: 4px; --sn-s-2: 8px; --sn-s-3: 12px;
27
+ --sn-s-4: 16px; --sn-s-5: 20px; --sn-s-6: 24px;
28
+ --sn-s-7: 32px; --sn-s-8: 40px; --sn-s-9: 48px;
29
+ --sn-s-10: 64px; --sn-s-11: 80px; --sn-s-12: 96px;
30
+
31
+ /* radius: minimal, mostly square */
32
+ --sn-r-none: 0;
33
+ --sn-r-xs: 2px;
34
+ --sn-r-sm: 4px;
35
+ --sn-r-md: 6px;
36
+ --sn-r-lg: 8px;
37
+
38
+ --sn-fast: 100ms;
39
+ --sn-base: 160ms;
40
+ --sn-ease: cubic-bezier(0.2, 0, 0, 1);
41
+
42
+ /* ============================================
43
+ COLOR: DARK (default), pure black, one accent
44
+ ============================================ */
45
+ --sn-bg: #0a0a0a;
46
+ --sn-bg-elev-1: #111111;
47
+ --sn-bg-elev-2: #181818;
48
+ --sn-bg-inset: #050505;
49
+
50
+ --sn-border: #1f1f1f;
51
+ --sn-border-strong: #2a2a2a;
52
+ --sn-border-subtle: #161616;
53
+
54
+ --sn-fg: #e8e8e8;
55
+ --sn-fg-muted: #888888;
56
+ --sn-fg-subtle: #666666;
57
+ --sn-fg-faint: #444444;
58
+ --sn-fg-inverse: #0a0a0a;
59
+
60
+ /* Accent: pale frost blue, like the reference link color */
61
+ --sn-accent: #8ab4f8;
62
+ --sn-accent-hover: #a8c7fa;
63
+ --sn-accent-active: #6c9eed;
64
+ --sn-accent-fg: #0a0a0a;
65
+ --sn-accent-soft: rgba(138, 180, 248, 0.10);
66
+ --sn-accent-border: rgba(138, 180, 248, 0.24);
67
+
68
+ --sn-success: #7fc77f;
69
+ --sn-warning: #d4a857;
70
+ --sn-danger: #d77070;
71
+
72
+ --sn-success-soft: rgba(127, 199, 127, 0.10);
73
+ --sn-warning-soft: rgba(212, 168, 87, 0.10);
74
+ --sn-danger-soft: rgba(215, 112, 112, 0.10);
75
+
76
+ --sn-shadow-sm: none;
77
+ --sn-shadow-md: 0 0 0 1px var(--sn-border);
78
+ --sn-shadow-lg: 0 0 0 1px var(--sn-border-strong);
79
+ }
80
+
81
+ [data-theme="light"] {
82
+ --sn-bg: #f7f7f5;
83
+ --sn-bg-elev-1: #ffffff;
84
+ --sn-bg-elev-2: #ffffff;
85
+ --sn-bg-inset: #efefec;
86
+
87
+ --sn-border: #e2e2dd;
88
+ --sn-border-strong: #c8c8c2;
89
+ --sn-border-subtle: #ececea;
90
+
91
+ --sn-fg: #161616;
92
+ --sn-fg-muted: #6a6a6a;
93
+ --sn-fg-subtle: #888888;
94
+ --sn-fg-faint: #b0b0ad;
95
+ --sn-fg-inverse: #ffffff;
96
+
97
+ --sn-accent: #2a64d6;
98
+ --sn-accent-hover: #1f56c2;
99
+ --sn-accent-active: #194ba8;
100
+ --sn-accent-fg: #ffffff;
101
+ --sn-accent-soft: rgba(42, 100, 214, 0.08);
102
+ --sn-accent-border: rgba(42, 100, 214, 0.24);
103
+ }
104
+
105
+ * , *::before, *::after { box-sizing: border-box; }
106
+ html, body { margin: 0; padding: 0; }
107
+ body {
108
+ font-family: var(--sn-font-mono);
109
+ font-size: var(--sn-text-sm);
110
+ line-height: var(--sn-leading-normal);
111
+ color: var(--sn-fg);
112
+ background: var(--sn-bg);
113
+ -webkit-font-smoothing: antialiased;
114
+ }
115
+ ::selection { background: var(--sn-accent-soft); color: var(--sn-fg); }
116
+ a { color: var(--sn-accent); text-decoration: none; }
117
+ a:hover { color: var(--sn-accent-hover); }
118
+
119
+ /* ============================================
120
+ PRIMITIVES: flat, no shadows, no rounded buttons by default
121
+ ============================================ */
122
+ .sn-btn {
123
+ display: inline-flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ gap: 8px;
127
+ font-family: var(--sn-font-mono);
128
+ font-size: var(--sn-text-sm);
129
+ font-weight: 500;
130
+ line-height: 1;
131
+ border-radius: var(--sn-r-xs);
132
+ padding: 0 14px;
133
+ height: 30px;
134
+ border: 1px solid transparent;
135
+ cursor: pointer;
136
+ transition: background var(--sn-fast) var(--sn-ease),
137
+ border-color var(--sn-fast) var(--sn-ease),
138
+ color var(--sn-fast) var(--sn-ease);
139
+ white-space: nowrap;
140
+ user-select: none;
141
+ background: transparent;
142
+ }
143
+ .sn-btn:focus-visible { outline: 1px solid var(--sn-accent); outline-offset: 1px; }
144
+ .sn-btn[disabled] { opacity: 0.4; cursor: not-allowed; }
145
+ .sn-btn--sm { height: 24px; font-size: var(--sn-text-xs); padding: 0 10px; }
146
+ .sn-btn--lg { height: 36px; font-size: var(--sn-text-sm); padding: 0 18px; }
147
+
148
+ .sn-btn--primary {
149
+ background: var(--sn-fg);
150
+ color: var(--sn-fg-inverse);
151
+ border-color: var(--sn-fg);
152
+ }
153
+ .sn-btn--primary:hover { background: var(--sn-fg-muted); border-color: var(--sn-fg-muted); }
154
+
155
+ .sn-btn--secondary {
156
+ background: transparent;
157
+ color: var(--sn-fg);
158
+ border-color: var(--sn-border-strong);
159
+ }
160
+ .sn-btn--secondary:hover { border-color: var(--sn-fg-muted); }
161
+
162
+ .sn-btn--ghost { background: transparent; color: var(--sn-fg-muted); }
163
+ .sn-btn--ghost:hover { color: var(--sn-fg); }
164
+
165
+ .sn-btn--accent {
166
+ background: var(--sn-accent);
167
+ color: var(--sn-accent-fg);
168
+ border-color: var(--sn-accent);
169
+ }
170
+ .sn-btn--accent:hover { background: var(--sn-accent-hover); border-color: var(--sn-accent-hover); }
171
+
172
+ .sn-btn--danger { background: transparent; color: var(--sn-danger); border-color: var(--sn-border-strong); }
173
+ .sn-btn--danger:hover { border-color: var(--sn-danger); }
174
+
175
+ .sn-input {
176
+ font-family: var(--sn-font-mono);
177
+ font-size: var(--sn-text-sm);
178
+ color: var(--sn-fg);
179
+ background: transparent;
180
+ border: 1px solid var(--sn-border-strong);
181
+ border-radius: var(--sn-r-xs);
182
+ padding: 0 10px;
183
+ height: 30px;
184
+ width: 100%;
185
+ transition: border-color var(--sn-fast) var(--sn-ease);
186
+ }
187
+ .sn-input::placeholder { color: var(--sn-fg-faint); }
188
+ .sn-input:hover { border-color: var(--sn-fg-muted); }
189
+ .sn-input:focus { outline: none; border-color: var(--sn-accent); }
190
+
191
+ .sn-card {
192
+ background: transparent;
193
+ border: 1px solid var(--sn-border);
194
+ border-radius: var(--sn-r-xs);
195
+ padding: var(--sn-s-5);
196
+ }
197
+ .sn-card--rounded { border-radius: var(--sn-r-lg); }
198
+ .sn-card--accent {
199
+ border-color: var(--sn-accent-border);
200
+ background: var(--sn-accent-soft);
201
+ }
202
+ .sn-card--inset { background: var(--sn-bg-inset); }
203
+
204
+ .sn-badge {
205
+ display: inline-flex;
206
+ align-items: center;
207
+ gap: 4px;
208
+ font-family: var(--sn-font-mono);
209
+ font-size: var(--sn-text-2xs);
210
+ font-weight: 400;
211
+ padding: 2px 6px;
212
+ border-radius: var(--sn-r-xs);
213
+ border: 1px solid var(--sn-border);
214
+ color: var(--sn-fg-muted);
215
+ height: 18px;
216
+ text-transform: lowercase;
217
+ }
218
+ .sn-badge--accent { color: var(--sn-accent); border-color: var(--sn-accent-border); }
219
+ .sn-badge--success { color: var(--sn-success); border-color: var(--sn-success); border-color: rgba(127,199,127,0.30); }
220
+ .sn-badge--warning { color: var(--sn-warning); border-color: rgba(212,168,87,0.30); }
221
+ .sn-badge--danger { color: var(--sn-danger); border-color: rgba(215,112,112,0.30); }
222
+
223
+ .sn-kbd {
224
+ font-family: var(--sn-font-mono);
225
+ font-size: var(--sn-text-2xs);
226
+ border: 1px solid var(--sn-border-strong);
227
+ border-radius: var(--sn-r-xs);
228
+ padding: 1px 5px;
229
+ color: var(--sn-fg-muted);
230
+ }
231
+
232
+ .sn-divider { height: 1px; background: var(--sn-border); border: 0; margin: 0; }
233
+
234
+ /* meta = tiny mono uppercase, used for section labels */
235
+ .sn-meta {
236
+ font-family: var(--sn-font-mono);
237
+ font-size: var(--sn-text-2xs);
238
+ letter-spacing: 0.04em;
239
+ text-transform: uppercase;
240
+ color: var(--sn-fg-faint);
241
+ }
242
+
243
+ /* terminal prompt */
244
+ .sn-prompt {
245
+ color: var(--sn-fg-faint);
246
+ user-select: none;
247
+ }
248
+ .sn-prompt::before { content: "› "; }
249
+
250
+ @keyframes sn-spin { to { transform: rotate(360deg); } }
251
+ @keyframes sn-pulse { 0%, 100% { opacity: 0.3; } 50% { opacity: 1; } }
252
+ @keyframes sn-blink { 50% { opacity: 0; } }