@valcis/brand 2.0.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.mjs ADDED
@@ -0,0 +1,419 @@
1
+ // src/logo/paths.ts
2
+ var BRACKET_LEFT_PATH = "M17.8 37.1L5.0 31.5L5.0 28.5L17.8 22.8L17.8 25.2L6.8 30.1L6.8 29.8L17.8 34.7Z";
3
+ var BRACKET_RIGHT_PATH = "M47.0 37.1L47.0 34.7L58.0 29.8L58.0 30.1L47.0 25.2L47.0 22.8L59.8 28.5L59.8 31.5Z";
4
+ var V_CALLIGRAPHIC_PATH = "M28 44.3Q27.3 44.3 26.1 43.9Q25 43.6 24 42.7Q23 41.8 22.8 40Q22.7 38.6 23.1 36.4Q23.4 34.4 24.1 31.8Q24.7 29.3 25.3 26.3Q25.8 23.3 26.1 20.1Q26.4 16.9 26.1 13.6Q25.9 11.9 25.4 10.7Q25 9.3 24.4 8.6Q23.6 8 22.4 8Q21.1 8 20.2 8.6Q19.4 9.3 19 10.6Q18.6 11.7 18.3 12.9Q18.2 14.1 18.3 15.3Q18.4 16 18.7 16.8Q18.9 17.5 19.4 18.3Q17 18.3 15.7 17.2Q14.5 16.2 14.4 14.5Q14.2 13.1 14.8 11.6Q15.4 10 16.6 8.8Q17.8 7.5 19.5 6.7Q21.1 6 23.2 6Q26.6 6 28.6 8.3Q30.6 10.7 31 14.7Q31.3 17.4 30.9 20.2Q30.6 23 30 25.9Q29.5 28.8 28.8 31.5Q28.1 34.2 27.8 36.5Q27.4 38.8 27.6 40.5Q27.7 41.2 27.9 41.7Q28.1 42.1 29 42.1Q30.4 42.1 32 40.8Q33.8 39.6 35.4 37.3Q37.2 35.2 38.8 32.4Q40.3 29.6 41.5 26.5Q42.7 23.4 43.2 20.5Q43.8 17.5 43.6 14.9Q43.3 12.5 42.1 11.1Q41 9.8 39.6 9.3Q40.1 7.9 41.1 7.3Q42 6.6 42.8 6.6Q44.2 6.6 45.6 8.2Q46.9 9.9 47.2 12.8Q47.5 15.4 46.8 18.6Q46.2 22 44.7 25.4Q43.3 29 41.4 32.4Q39.5 35.8 37.2 38.4Q35 41 32.7 42.7Q30.3 44.3 28 44.3Z";
5
+ var CHEVRON_RIGHT_FULL_PATH = "M72 33V119L466 295V283L72 459V545L528 342V236Z";
6
+ var A_PATH = "M230 -12Q180 -12 140.0 6.0Q100 24 77.0 56.5Q54 89 54 132Q54 200 94.5 237.5Q135 275 222 292L400 328Q400 396 369.5 429.0Q339 462 282 462Q227 462 196.0 437.5Q165 413 153 367L64 374Q79 449 135.5 495.5Q192 542 282 542Q378 542 431.0 484.5Q484 427 484 326V106Q484 88 492.0 81.0Q500 74 516 74H550V0Q544 -1 531.0 -1.5Q518 -2 506 -2Q472 -2 448.5 9.0Q425 20 413.0 44.5Q401 69 400 108H416Q409 74 382.5 46.5Q356 19 316.0 3.5Q276 -12 230 -12ZM238 62Q292 62 328.0 80.5Q364 99 382.0 132.5Q400 166 400 210V256L238 224Q184 214 163.0 193.5Q142 173 142 140Q142 103 167.5 82.5Q193 62 238 62Z";
7
+ var L_PATH = "M273 0V568Q273 600 255.0 618.0Q237 636 205 636H80V710H209Q282 710 319.5 672.5Q357 635 357 562V0ZM60 0V74H540V0Z";
8
+ var C_PATH = "M314 -12Q240 -12 185.0 22.0Q130 56 100.0 118.5Q70 181 70 265Q70 349 100.0 411.0Q130 473 185.0 507.5Q240 542 314 542Q373 542 419.0 520.5Q465 499 495.0 458.0Q525 417 536 358L448 352Q436 405 400.5 433.5Q365 462 314 462Q241 462 199.5 409.5Q158 357 158 265Q158 173 199.5 120.5Q241 68 314 68Q365 68 402.5 98.0Q440 128 452 188L540 182Q529 123 498.0 79.5Q467 36 420.0 12.0Q373 -12 314 -12Z";
9
+ var I_PATH = "M293 0V530H377V0ZM80 0V74H560V0ZM90 456V530H377V456ZM285 613V711H373V613Z";
10
+ var S_PATH = "M310 -12Q241 -12 191.0 12.0Q141 36 112.5 76.5Q84 117 80 167L168 173Q176 124 211.5 96.0Q247 68 310 68Q369 68 401.5 85.0Q434 102 434 138Q434 161 423.0 176.0Q412 191 382.0 201.5Q352 212 294 222Q217 236 173.5 256.5Q130 277 112.0 308.0Q94 339 94 382Q94 428 117.0 464.0Q140 500 185.0 521.0Q230 542 295 542Q361 542 405.5 518.5Q450 495 476.0 456.5Q502 418 510 372L422 366Q416 394 399.5 415.5Q383 437 356.5 449.5Q330 462 294 462Q236 462 208.0 439.0Q180 416 180 382Q180 355 193.0 339.0Q206 323 235.0 313.5Q264 304 312 296Q394 283 439.0 262.5Q484 242 502.0 212.0Q520 182 520 138Q520 91 492.5 57.5Q465 24 417.5 6.0Q370 -12 310 -12Z";
11
+ var CURSOR_PATH = "M260 -110V750H340V-110Z";
12
+ var V_CALLIGRAPHIC_FULL_TRANSFORM = "translate(47, 0) scale(15.2, -13.84) translate(-14.2, -44.3)";
13
+ var FULL_GLYPH_OFFSETS = [0, 600, 1200, 1800, 2400, 3e3, 3600, 4200];
14
+ var VIEWBOXES = {
15
+ icon: "3 5 58 41",
16
+ full: "0 -130 4545 920"
17
+ };
18
+ var ASPECT_RATIOS = {
19
+ icon: 58 / 41,
20
+ full: 4545 / 920
21
+ };
22
+
23
+ // src/logo/Logo.tsx
24
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
25
+ var SIZE_MAP = {
26
+ sm: 16,
27
+ md: 24,
28
+ lg: 32,
29
+ xl: 48
30
+ };
31
+ function resolveSize(size) {
32
+ return typeof size === "number" ? size : SIZE_MAP[size] ?? 24;
33
+ }
34
+ var Logo = ({
35
+ variant = "icon",
36
+ size = 24,
37
+ animated = false,
38
+ accentColor,
39
+ textColor,
40
+ className,
41
+ style,
42
+ ariaLabel
43
+ }) => {
44
+ const px = resolveSize(size);
45
+ const viewBox = VIEWBOXES[variant] ?? VIEWBOXES.icon;
46
+ const ratio = ASPECT_RATIOS[variant] ?? ASPECT_RATIOS.icon;
47
+ const width = px * (variant === "full" ? ratio : 1);
48
+ const height = px * (variant === "full" ? 1 : 1 / ratio);
49
+ const accent = accentColor ?? "var(--valcis-logo-accent, var(--primary, currentColor))";
50
+ const text = textColor ?? "var(--valcis-logo-text, currentColor)";
51
+ const isDecorative = !ariaLabel;
52
+ const cursorAnimation = animated && variant === "full" ? `
53
+ @keyframes valcis-cursor-blink {
54
+ 0%, 100% { opacity: 1; }
55
+ 50% { opacity: 0; }
56
+ }
57
+ @media (prefers-reduced-motion: no-preference) {
58
+ .valcis-cursor-blink { animation: valcis-cursor-blink 1s step-end infinite; }
59
+ }
60
+ ` : void 0;
61
+ const pulseAnimation = animated && variant === "icon" ? `
62
+ @keyframes valcis-logo-pulse {
63
+ 0%, 100% { opacity: 1; }
64
+ 50% { opacity: 0.6; }
65
+ }
66
+ @media (prefers-reduced-motion: no-preference) {
67
+ .valcis-logo-animated { animation: valcis-logo-pulse 2s ease-in-out infinite; }
68
+ }
69
+ ` : void 0;
70
+ const animationStyle = cursorAnimation ?? pulseAnimation;
71
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
72
+ animationStyle && /* @__PURE__ */ jsx("style", { children: animationStyle }),
73
+ /* @__PURE__ */ jsxs(
74
+ "svg",
75
+ {
76
+ xmlns: "http://www.w3.org/2000/svg",
77
+ viewBox,
78
+ fill: "none",
79
+ width,
80
+ height,
81
+ className: [animated && variant === "icon" ? "valcis-logo-animated" : "", className].filter(Boolean).join(" ") || void 0,
82
+ style,
83
+ role: "img",
84
+ "aria-hidden": isDecorative ? true : void 0,
85
+ "aria-label": ariaLabel ?? void 0,
86
+ children: [
87
+ variant === "icon" && /* @__PURE__ */ jsxs(Fragment, { children: [
88
+ /* @__PURE__ */ jsx("path", { d: BRACKET_LEFT_PATH, fill: accent }),
89
+ /* @__PURE__ */ jsx("path", { d: BRACKET_RIGHT_PATH, fill: accent }),
90
+ /* @__PURE__ */ jsx("path", { d: V_CALLIGRAPHIC_PATH, fill: text })
91
+ ] }),
92
+ variant === "full" && /* @__PURE__ */ jsxs("g", { transform: "scale(1,-1) translate(0,-640)", children: [
93
+ /* @__PURE__ */ jsx("g", { transform: "translate(0,0)", children: /* @__PURE__ */ jsx("path", { d: CHEVRON_RIGHT_FULL_PATH, fill: accent }) }),
94
+ /* @__PURE__ */ jsx("g", { transform: "translate(600,0)", children: /* @__PURE__ */ jsx("g", { transform: V_CALLIGRAPHIC_FULL_TRANSFORM, children: /* @__PURE__ */ jsx("path", { d: V_CALLIGRAPHIC_PATH, fill: text }) }) }),
95
+ /* @__PURE__ */ jsx("g", { transform: "translate(1200,0)", children: /* @__PURE__ */ jsx("path", { d: A_PATH, fill: text }) }),
96
+ /* @__PURE__ */ jsx("g", { transform: "translate(1800,0)", children: /* @__PURE__ */ jsx("path", { d: L_PATH, fill: text }) }),
97
+ /* @__PURE__ */ jsx("g", { transform: "translate(2400,0)", children: /* @__PURE__ */ jsx("path", { d: C_PATH, fill: text }) }),
98
+ /* @__PURE__ */ jsx("g", { transform: "translate(3000,0)", children: /* @__PURE__ */ jsx("path", { d: I_PATH, fill: text }) }),
99
+ /* @__PURE__ */ jsx("g", { transform: "translate(3600,0)", children: /* @__PURE__ */ jsx("path", { d: S_PATH, fill: text }) }),
100
+ /* @__PURE__ */ jsx("g", { transform: "translate(4200,0)", children: /* @__PURE__ */ jsx(
101
+ "path",
102
+ {
103
+ d: CURSOR_PATH,
104
+ fill: accent,
105
+ className: animated ? "valcis-cursor-blink" : void 0
106
+ }
107
+ ) })
108
+ ] })
109
+ ]
110
+ }
111
+ )
112
+ ] });
113
+ };
114
+
115
+ // src/footer/Footer.tsx
116
+ import React from "react";
117
+
118
+ // src/shared/hooks/useDevInfo.ts
119
+ import { useState, useEffect } from "react";
120
+
121
+ // src/footer/constants.ts
122
+ var DEFAULT_DEV_INFO = {
123
+ version: 1,
124
+ brand: "valcis",
125
+ contact: "contacto@valcis.es",
126
+ website: "https://valcis.es",
127
+ year: (/* @__PURE__ */ new Date()).getFullYear()
128
+ };
129
+ var DEV_INFO_URL = "https://valcis.es/api/dev-info.json";
130
+ var FETCH_TIMEOUT = 2e3;
131
+ var CACHE_DURATION = 1e3 * 60 * 60;
132
+ var CACHE_KEY = "valcis-brand-dev-info";
133
+
134
+ // src/shared/hooks/useDevInfo.ts
135
+ function useDevInfo(initialData, customUrl) {
136
+ const [devInfo, setDevInfo] = useState(initialData ?? DEFAULT_DEV_INFO);
137
+ useEffect(() => {
138
+ if (initialData) return;
139
+ const fetchDevInfo = async () => {
140
+ try {
141
+ const cached = localStorage.getItem(CACHE_KEY);
142
+ if (cached) {
143
+ const { data, timestamp } = JSON.parse(cached);
144
+ const isValid = Date.now() - timestamp < CACHE_DURATION;
145
+ if (isValid) {
146
+ setDevInfo(data);
147
+ return;
148
+ }
149
+ }
150
+ } catch {
151
+ }
152
+ const controller = new AbortController();
153
+ const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
154
+ try {
155
+ const url = customUrl || DEV_INFO_URL;
156
+ const response = await fetch(url, {
157
+ signal: controller.signal,
158
+ cache: "no-store",
159
+ headers: { "Accept": "application/json" }
160
+ });
161
+ if (!response.ok) throw new Error("Fetch failed");
162
+ const data = await response.json();
163
+ setDevInfo(data);
164
+ try {
165
+ const cacheData = { data, timestamp: Date.now() };
166
+ localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
167
+ } catch {
168
+ }
169
+ } catch (error) {
170
+ if (error instanceof Error && error.name !== "AbortError") {
171
+ console.warn("[valcis-brand] Client fetch failed, using fallback");
172
+ }
173
+ } finally {
174
+ clearTimeout(timeoutId);
175
+ }
176
+ };
177
+ fetchDevInfo();
178
+ }, [initialData, customUrl]);
179
+ return devInfo;
180
+ }
181
+
182
+ // src/footer/Footer.tsx
183
+ import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
184
+ var PADDING_MAP = {
185
+ compact: { x: "1rem", y: "0.5rem" },
186
+ normal: { x: "1rem", y: "1rem" },
187
+ spacious: { x: "1.5rem", y: "2rem" }
188
+ };
189
+ var LOGO_COLORS = {
190
+ light: { accent: "#2563EB", text: "#1E293B" },
191
+ dark: { accent: "#60A5FA", text: "#F1F5F9" }
192
+ };
193
+ function getCopyPrefix(mode, year, showYear) {
194
+ switch (mode) {
195
+ case "owner":
196
+ return showYear ? `\xA9 ${year}` : "\xA9";
197
+ case "designer":
198
+ return showYear ? `\xA9 ${year} \xB7 Dise\xF1ado por` : "Dise\xF1ado por";
199
+ case "partner":
200
+ return "Powered by";
201
+ }
202
+ }
203
+ var Footer = ({
204
+ initialDevInfo,
205
+ devInfoUrl,
206
+ theme = "light",
207
+ accentColor,
208
+ backgroundColor,
209
+ textColor,
210
+ border = "top",
211
+ padding = "normal",
212
+ align = "center",
213
+ position = "sticky",
214
+ mode = "designer",
215
+ showYear = true,
216
+ showContact = true,
217
+ animatedLogo = true,
218
+ variant = "inline",
219
+ className = "",
220
+ as: Tag = "div"
221
+ }) => {
222
+ const devInfo = useDevInfo(initialDevInfo, devInfoUrl);
223
+ const currentYear = devInfo.year ?? (/* @__PURE__ */ new Date()).getFullYear();
224
+ const styleHash = React.useId().replace(/:/g, "");
225
+ const linkClass = `__vf-link-${styleHash}`;
226
+ const palette = {
227
+ light: {
228
+ bg: "transparent",
229
+ text: "#6b7280",
230
+ link: "#1e293b",
231
+ linkHover: "rgba(0,0,0,0.05)",
232
+ focusRing: "#3b82f6",
233
+ border: "#e5e7eb"
234
+ },
235
+ dark: {
236
+ bg: "transparent",
237
+ text: "#9ca3af",
238
+ link: "#f1f5f9",
239
+ linkHover: "rgba(255,255,255,0.1)",
240
+ focusRing: "#60a5fa",
241
+ border: "#374151"
242
+ }
243
+ };
244
+ const c = palette[theme];
245
+ const finalBg = backgroundColor ?? c.bg;
246
+ const finalText = textColor ?? c.text;
247
+ const finalAccent = accentColor ?? c.link;
248
+ const logoColors = LOGO_COLORS[theme];
249
+ const pad = typeof padding === "string" ? PADDING_MAP[padding] : { x: padding.x ?? "1rem", y: padding.y ?? "1rem" };
250
+ const borderColor = c.border;
251
+ const borderTop = border === true || border === "top" || border === "both" ? `1px solid ${borderColor}` : "none";
252
+ const borderBottom = border === "bottom" || border === "both" ? `1px solid ${borderColor}` : "none";
253
+ const positionStyles = {};
254
+ if (position === "sticky") {
255
+ positionStyles.position = "sticky";
256
+ positionStyles.bottom = 0;
257
+ positionStyles.zIndex = 10;
258
+ } else if (position === "fixed") {
259
+ positionStyles.position = "fixed";
260
+ positionStyles.bottom = 0;
261
+ positionStyles.left = 0;
262
+ positionStyles.right = 0;
263
+ positionStyles.zIndex = 50;
264
+ }
265
+ const baseStyles = {
266
+ ...positionStyles,
267
+ padding: `${pad.y} ${pad.x}`,
268
+ textAlign: align,
269
+ fontSize: "0.75rem",
270
+ lineHeight: 1.5,
271
+ borderTop,
272
+ borderBottom,
273
+ backgroundColor: finalBg,
274
+ color: finalText
275
+ };
276
+ const linkStyles = {
277
+ color: finalAccent,
278
+ textDecoration: "none",
279
+ padding: "0.35rem 0.5rem",
280
+ minHeight: "44px",
281
+ minWidth: "44px",
282
+ display: "inline-flex",
283
+ alignItems: "center",
284
+ justifyContent: "center",
285
+ borderRadius: "4px",
286
+ transition: "background-color 0.2s, outline 0.2s"
287
+ };
288
+ const dynamicStyles = `
289
+ .${linkClass}:hover {
290
+ background-color: ${c.linkHover};
291
+ }
292
+ .${linkClass}:focus {
293
+ outline: none;
294
+ }
295
+ .${linkClass}:focus-visible {
296
+ outline: 2px solid ${accentColor ?? c.focusRing};
297
+ outline-offset: 2px;
298
+ }
299
+ `;
300
+ const isStacked = variant === "stacked";
301
+ const contentStyles = {
302
+ margin: 0,
303
+ display: "flex",
304
+ flexDirection: isStacked ? "column" : "row",
305
+ flexWrap: "wrap",
306
+ justifyContent: align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center",
307
+ alignItems: "center",
308
+ gap: isStacked ? "0.25rem" : "0.35rem"
309
+ };
310
+ const prefix = getCopyPrefix(mode, currentYear, showYear);
311
+ const logoElement = /* @__PURE__ */ jsx2(
312
+ Logo,
313
+ {
314
+ variant: "full",
315
+ size: 14,
316
+ animated: animatedLogo,
317
+ accentColor: logoColors.accent,
318
+ textColor: logoColors.text
319
+ }
320
+ );
321
+ const brandContent = devInfo.website ? /* @__PURE__ */ jsx2(
322
+ "a",
323
+ {
324
+ href: devInfo.website,
325
+ className: linkClass,
326
+ style: { ...linkStyles, gap: "0.35rem", fontWeight: 500 },
327
+ target: "_blank",
328
+ rel: "noopener noreferrer",
329
+ "aria-label": `Visitar sitio web de ${devInfo.brand} (abre en nueva pesta\xF1a)`,
330
+ children: logoElement
331
+ }
332
+ ) : /* @__PURE__ */ jsx2("span", { style: {
333
+ display: "inline-flex",
334
+ alignItems: "center",
335
+ padding: "0.35rem 0.5rem"
336
+ }, children: logoElement });
337
+ return /* @__PURE__ */ jsxs2(Fragment2, { children: [
338
+ /* @__PURE__ */ jsx2("style", { children: dynamicStyles }),
339
+ /* @__PURE__ */ jsx2(
340
+ Tag,
341
+ {
342
+ style: baseStyles,
343
+ className,
344
+ ...Tag === "footer" ? { role: "contentinfo" } : {},
345
+ children: /* @__PURE__ */ jsx2("nav", { "aria-label": "Informaci\xF3n del desarrollador", children: /* @__PURE__ */ jsxs2("p", { style: contentStyles, children: [
346
+ prefix && /* @__PURE__ */ jsx2("span", { style: { color: finalAccent }, children: prefix }),
347
+ brandContent,
348
+ showContact && devInfo.contact && /* @__PURE__ */ jsxs2(Fragment2, { children: [
349
+ !isStacked && /* @__PURE__ */ jsx2("span", { style: { color: finalAccent, margin: "0 0.25rem" }, "aria-hidden": "true", children: "\xB7" }),
350
+ /* @__PURE__ */ jsx2(
351
+ "a",
352
+ {
353
+ href: `mailto:${devInfo.contact}`,
354
+ className: linkClass,
355
+ style: linkStyles,
356
+ "aria-label": `Contactar al desarrollador: ${devInfo.contact}`,
357
+ children: devInfo.contact
358
+ }
359
+ )
360
+ ] })
361
+ ] }) })
362
+ }
363
+ )
364
+ ] });
365
+ };
366
+
367
+ // src/shared/utils/getDevInfo.ts
368
+ async function getDevInfo(customUrl) {
369
+ const controller = new AbortController();
370
+ const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
371
+ try {
372
+ const url = customUrl || DEV_INFO_URL;
373
+ const response = await fetch(url, {
374
+ signal: controller.signal,
375
+ headers: { "Accept": "application/json" }
376
+ });
377
+ if (!response.ok) {
378
+ throw new Error(`HTTP ${response.status}`);
379
+ }
380
+ const data = await response.json();
381
+ return {
382
+ version: data.version ?? 1,
383
+ brand: data.brand ?? DEFAULT_DEV_INFO.brand,
384
+ contact: data.contact ?? DEFAULT_DEV_INFO.contact,
385
+ website: data.website,
386
+ year: data.year ?? (/* @__PURE__ */ new Date()).getFullYear()
387
+ };
388
+ } catch (error) {
389
+ console.warn("[valcis-brand] SSR fetch failed, using fallback:", error);
390
+ return DEFAULT_DEV_INFO;
391
+ } finally {
392
+ clearTimeout(timeoutId);
393
+ }
394
+ }
395
+ export {
396
+ ASPECT_RATIOS,
397
+ A_PATH,
398
+ BRACKET_LEFT_PATH,
399
+ BRACKET_RIGHT_PATH,
400
+ CACHE_DURATION,
401
+ CACHE_KEY,
402
+ CHEVRON_RIGHT_FULL_PATH,
403
+ CURSOR_PATH,
404
+ C_PATH,
405
+ DEFAULT_DEV_INFO,
406
+ DEV_INFO_URL,
407
+ FETCH_TIMEOUT,
408
+ FULL_GLYPH_OFFSETS,
409
+ Footer,
410
+ I_PATH,
411
+ L_PATH,
412
+ Logo,
413
+ S_PATH,
414
+ VIEWBOXES,
415
+ V_CALLIGRAPHIC_FULL_TRANSFORM,
416
+ V_CALLIGRAPHIC_PATH,
417
+ getDevInfo,
418
+ useDevInfo
419
+ };
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@valcis/brand",
3
+ "version": "2.0.0",
4
+ "description": "Componentes de marca valcis: Logo SVG y Footer React con soporte SSR",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "sideEffects": false,
9
+ "files": [
10
+ "dist",
11
+ "assets"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsup src/index.ts --format cjs,esm --dts --clean",
15
+ "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
16
+ "prepublishOnly": "npm run build",
17
+ "test": "echo \"No tests yet\" && exit 0"
18
+ },
19
+ "peerDependencies": {
20
+ "react": ">=18.0.0",
21
+ "react-dom": ">=18.0.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/react": "^18.2.0",
25
+ "react": "^18.2.0",
26
+ "tsup": "^8.0.0",
27
+ "typescript": "^5.0.0"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/valcis/branding_valcis.git"
32
+ },
33
+ "publishConfig": {
34
+ "registry": "https://registry.npmjs.org",
35
+ "access": "public"
36
+ },
37
+ "keywords": [
38
+ "brand",
39
+ "logo",
40
+ "footer",
41
+ "react",
42
+ "component",
43
+ "ssr",
44
+ "nextjs",
45
+ "accessible"
46
+ ],
47
+ "author": "valcis",
48
+ "license": "MIT"
49
+ }