@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/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/chunk-XYNFF4B5.js +178 -0
- package/dist/chunk-XYNFF4B5.js.map +1 -0
- package/dist/client.cjs +158 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.cts +22 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.js +112 -0
- package/dist/client.js.map +1 -0
- package/dist/index.cjs +534 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +142 -0
- package/dist/index.d.ts +142 -0
- package/dist/index.js +279 -0
- package/dist/index.js.map +1 -0
- package/package.json +79 -0
- package/src/tokens.css +252 -0
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; } }
|