@pixelated-tech/components 3.11.4 → 3.11.6

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.
Files changed (49) hide show
  1. package/dist/components/general/global-error.css +41 -0
  2. package/dist/components/general/global-error.js +19 -0
  3. package/dist/components/general/humanstxt.js +81 -0
  4. package/dist/components/general/skeleton-loading.css +97 -0
  5. package/dist/components/general/skeleton-loading.js +26 -0
  6. package/dist/components/general/skeleton.css +48 -0
  7. package/dist/components/general/skeleton.js +21 -0
  8. package/dist/components/general/styleguide.js +35 -0
  9. package/dist/config/pixelated.config.json.enc +1 -1
  10. package/dist/index.js +4 -0
  11. package/dist/index.server.js +2 -0
  12. package/dist/scripts/create-pixelated-app.js +1 -1
  13. package/dist/scripts/create-pixelated-app.json +21 -11
  14. package/dist/types/components/general/global-error.d.ts +13 -0
  15. package/dist/types/components/general/global-error.d.ts.map +1 -0
  16. package/dist/types/components/general/humanstxt.d.ts +37 -0
  17. package/dist/types/components/general/humanstxt.d.ts.map +1 -0
  18. package/dist/types/components/general/skeleton-loading.d.ts +18 -0
  19. package/dist/types/components/general/skeleton-loading.d.ts.map +1 -0
  20. package/dist/types/components/general/skeleton.d.ts +14 -0
  21. package/dist/types/components/general/skeleton.d.ts.map +1 -0
  22. package/dist/types/components/general/styleguide.d.ts +9 -0
  23. package/dist/types/components/general/styleguide.d.ts.map +1 -0
  24. package/dist/types/index.d.ts +4 -0
  25. package/dist/types/index.server.d.ts +2 -0
  26. package/dist/types/stories/general/global-error.stories.d.ts +26 -0
  27. package/dist/types/stories/general/global-error.stories.d.ts.map +1 -0
  28. package/dist/types/stories/general/humans.stories.d.ts +8 -0
  29. package/dist/types/stories/general/humans.stories.d.ts.map +1 -0
  30. package/dist/types/stories/general/skeleton-loading.stories.d.ts +14 -0
  31. package/dist/types/stories/general/skeleton-loading.stories.d.ts.map +1 -0
  32. package/dist/types/stories/general/skeleton.stories.d.ts +21 -0
  33. package/dist/types/stories/general/skeleton.stories.d.ts.map +1 -0
  34. package/dist/types/stories/general/styleguide.stories.d.ts +8 -0
  35. package/dist/types/stories/general/styleguide.stories.d.ts.map +1 -0
  36. package/dist/types/tests/global-error.test.d.ts +2 -0
  37. package/dist/types/tests/global-error.test.d.ts.map +1 -0
  38. package/dist/types/tests/humanstxt.test.d.ts +2 -0
  39. package/dist/types/tests/humanstxt.test.d.ts.map +1 -0
  40. package/dist/types/tests/sitemap.test.d.ts.map +1 -1
  41. package/dist/types/tests/skeleton-loading.test.d.ts +2 -0
  42. package/dist/types/tests/skeleton-loading.test.d.ts.map +1 -0
  43. package/dist/types/tests/skeleton.test.d.ts +2 -0
  44. package/dist/types/tests/skeleton.test.d.ts.map +1 -0
  45. package/dist/types/tests/styleguide.test.d.ts +2 -0
  46. package/dist/types/tests/styleguide.test.d.ts.map +1 -0
  47. package/package.json +2 -2
  48. package/dist/types/tests/components/general/sitemap.test.d.ts +0 -2
  49. package/dist/types/tests/components/general/sitemap.test.d.ts.map +0 -1
@@ -0,0 +1,41 @@
1
+ /* Canonical styles for the Global Error boundary — componentized and shipped with the library */
2
+ :root {
3
+ --ge-bg: linear-gradient(180deg,#fff,#f7f7fb);
4
+ --ge-foreground: #111;
5
+ --ge-muted: #889;
6
+ --ge-panel: #0b0b0b;
7
+ --ge-panel-ink: #e6e6e6;
8
+ --ge-radius: 8px;
9
+ --ge-gap: 12px;
10
+ --ge-max: 720px;
11
+ }
12
+
13
+ .global-error {
14
+ min-height: 80vh;
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ padding: 3rem;
19
+ background: var(--ge-bg);
20
+ color: var(--ge-foreground);
21
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial;
22
+ }
23
+
24
+ .ge-inner {
25
+ max-width: var(--ge-max);
26
+ width: 100%;
27
+ text-align: center;
28
+ }
29
+
30
+ .ge-title { margin: 0; font-size: 1.75rem; }
31
+ .ge-lead { color: #334; margin-top: 0.75rem; }
32
+
33
+ .ge-actions { display: flex; gap: var(--ge-gap); justify-content: center; margin-top: 20px; flex-wrap: wrap; }
34
+ .ge-btn { border-radius: var(--ge-radius); padding: 0.6rem 1rem; cursor: pointer; border: none; background: transparent; }
35
+ .ge-btn--primary { background: var(--ge-foreground); color: #fff; }
36
+ .ge-link { color: var(--ge-foreground); text-decoration: underline; align-self: center; }
37
+ .ge-toggle { background: transparent; border: 1px solid #ddd; padding: 0.5rem 0.85rem; border-radius: var(--ge-radius); }
38
+
39
+ .ge-details { text-align: left; margin-top: 20px; padding: 16px; background: var(--ge-panel); color: var(--ge-panel-ink); border-radius: var(--ge-radius); overflow: auto; white-space: pre-wrap; }
40
+ .ge-note { margin-top: 18px; color: var(--ge-muted); }
41
+ .ge-unavailable { color: #666; align-self: center; }
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import './global-error.css';
6
+ GlobalErrorUI.propTypes = {
7
+ error: PropTypes.any,
8
+ reset: PropTypes.func,
9
+ siteInfo: PropTypes.object,
10
+ className: PropTypes.string,
11
+ };
12
+ export function GlobalErrorUI({ error = null, reset, siteInfo, className = '' }) {
13
+ const [showDetails, setShowDetails] = useState(false);
14
+ const si = siteInfo;
15
+ const contactHref = typeof si?.email === 'string'
16
+ ? `mailto:${si.email}`
17
+ : undefined;
18
+ return (_jsx("main", { role: "alert", "aria-live": "polite", className: `global-error ${className}`, children: _jsxs("div", { className: "ge-inner", children: [_jsx("h1", { className: "ge-title", children: "Something went wrong" }), _jsx("p", { className: "ge-lead", children: "We encountered an unexpected error. Please try again or contact the site maintainer." }), _jsxs("div", { className: "ge-actions", children: [_jsx("button", { onClick: () => reset?.(), className: "ge-btn ge-btn--primary", children: "Try again" }), contactHref ? (_jsx("a", { href: contactHref, rel: "noopener noreferrer", className: "ge-link", children: "Contact support" })) : (_jsx("span", { className: "ge-unavailable", children: "Contact info unavailable" })), _jsx("button", { onClick: () => setShowDetails(s => !s), "aria-pressed": showDetails, className: "ge-btn ge-toggle", children: showDetails ? 'Hide details' : 'Show details' })] }), showDetails && (_jsxs("pre", { "data-testid": "error-details", className: "ge-details", children: [String(error?.message ?? 'Unknown error'), '\n', error?.stack ?? ''] })), _jsx("p", { className: "ge-note", children: "If this keeps happening, please file an issue or reach out to the maintainer." })] }) }));
19
+ }
@@ -0,0 +1,81 @@
1
+ import { readFile } from 'fs/promises';
2
+ import crypto from 'crypto';
3
+ import { NextResponse } from 'next/server';
4
+ import { flattenRoutes } from './sitemap';
5
+ /**
6
+ * Read JSON from disk safely — returns null on error.
7
+ * Exported for testing.
8
+ */
9
+ export async function safeJSON(path) {
10
+ try {
11
+ const raw = await readFile(path, 'utf8');
12
+ return JSON.parse(raw);
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ /**
19
+ * Normalize a value into a single-line trimmed string (safe for humans.txt).
20
+ * Exported for testing.
21
+ */
22
+ export function sanitizeString(v) {
23
+ return v == null ? '' : String(v).replace(/\s+/g, ' ').trim();
24
+ }
25
+ /**
26
+ * Generate the humans.txt body + metadata. Pure function when pkg/routesJson are provided —
27
+ * otherwise will attempt to read from disk (runtime apps).
28
+ */
29
+ export async function generateHumansTxt(opts = {}) {
30
+ const cwd = opts.cwd ?? process.cwd();
31
+ const pkg = opts.pkg ?? (await safeJSON(cwd + '/package.json')) ?? {};
32
+ const data = opts.routesJson ?? (await safeJSON(cwd + '/src/app/data/routes.json')) ?? {};
33
+ const site = data.siteInfo ?? {};
34
+ const routes = Array.isArray(data.routes) ? data.routes : [];
35
+ const lines = [
36
+ '/* HUMAN-READABLE SITE INFORMATION - generated at runtime */',
37
+ '',
38
+ ` Site name: ${sanitizeString(site.name ?? '')}`,
39
+ ` Site Package Name: ${sanitizeString(pkg.name ?? '')}`,
40
+ ` Site Package Version: ${sanitizeString(pkg.version ?? '')}`,
41
+ ` Site URL: ${sanitizeString(site.url ?? '')}`,
42
+ ` Author: ${sanitizeString(site.author ?? '')}`,
43
+ ` Address: ${sanitizeString(site.address
44
+ ? [
45
+ site.address.streetAddress,
46
+ site.address.addressLocality,
47
+ site.address.addressRegion,
48
+ site.address.postalCode,
49
+ site.address.addressCountry,
50
+ ]
51
+ .filter(Boolean)
52
+ .join(' ')
53
+ : '')}`,
54
+ ` Email: ${sanitizeString(site.email ?? '')}`,
55
+ ` Telephone: ${sanitizeString(site.telephone ?? '')}`,
56
+ ` Pages: (${routes.length})`,
57
+ ];
58
+ const limit = typeof opts.maxRoutes === 'number' ? opts.maxRoutes : 50;
59
+ for (const r of flattenRoutes(routes).slice(0, limit)) {
60
+ lines.push(` - ${sanitizeString(r.path ?? r.pathname ?? r.url ?? '')} - ${sanitizeString(r.title ?? '')}`);
61
+ }
62
+ const body = lines.join('\n');
63
+ const etag = crypto.createHash('sha1').update(body).digest('hex');
64
+ const headers = {
65
+ 'Content-Type': 'text/plain; charset=utf-8',
66
+ 'Cache-Control': 'public, max-age=60, stale-while-revalidate=3600',
67
+ ETag: etag,
68
+ };
69
+ return { body, etag, headers };
70
+ }
71
+ /**
72
+ * Next.js convenience: return a NextResponse for a humans.txt request.
73
+ * Accepts the same options as `generateHumansTxt` (pass `pkg`/`routesJson` in tests).
74
+ */
75
+ export async function createHumansTxtResponse(req, opts = {}) {
76
+ const { body, etag, headers } = await generateHumansTxt(opts);
77
+ if (req?.headers?.get && req.headers.get('if-none-match') === etag) {
78
+ return new NextResponse(null, { status: 304, headers });
79
+ }
80
+ return new NextResponse(body, { status: 200, headers });
81
+ }
@@ -0,0 +1,97 @@
1
+ /* Page-level loading / skeleton-loading styles
2
+ NOTE: this is the canonical stylesheet for the app-level loading UI and
3
+ should be consumed via the `SkeletonLoading` component in this package. */
4
+
5
+ .loading-page {
6
+ min-height: 100vh;
7
+ display: flex;
8
+ align-items: flex-start;
9
+ justify-content: center;
10
+ padding: clamp(0, 3vw, 3rem);
11
+ background: var(--bg, #fff);
12
+ }
13
+
14
+ .loading-container {
15
+ width: 100%;
16
+ max-width: 72rem;
17
+ display: block;
18
+ gap: 2rem;
19
+ }
20
+
21
+ .visually-hidden {
22
+ position: absolute !important;
23
+ width: 1px;
24
+ height: 1px;
25
+ padding: 0;
26
+ margin: -1px;
27
+ overflow: hidden;
28
+ clip: rect(0, 0, 0, 0);
29
+ white-space: nowrap;
30
+ border: 0;
31
+ }
32
+
33
+ .hero {
34
+ display: block;
35
+ gap: 1.5rem;
36
+ padding: 0;
37
+ }
38
+
39
+ .hero-row {
40
+ display: flex;
41
+ gap: 1rem;
42
+ align-items: center
43
+ }
44
+
45
+ .hero-avatar-wrap {
46
+ width: 6rem
47
+ }
48
+
49
+ .hero-meta {
50
+ display: block;
51
+ gap: .75rem
52
+ }
53
+
54
+ .cards-grid {
55
+ display: grid;
56
+ grid-template-columns: 1fr;
57
+ gap: 1.5rem
58
+ }
59
+
60
+ @media(min-width:640px) {
61
+ .cards-grid {
62
+ grid-template-columns: repeat(2, 1fr)
63
+ }
64
+ }
65
+
66
+ @media(min-width:1024px) {
67
+ .cards-grid {
68
+ grid-template-columns: repeat(3, 1fr)
69
+ }
70
+ }
71
+
72
+ .card-skeleton {
73
+ padding: 1rem;
74
+ border-radius: .5rem;
75
+ border: 1px solid rgba(17, 24, 39, 0.06);
76
+ background: transparent
77
+ }
78
+
79
+ .card-row {
80
+ display: flex;
81
+ gap: 1rem;
82
+ align-items: flex-start
83
+ }
84
+
85
+ .card-body {
86
+ flex: 1 1 0%
87
+ }
88
+
89
+ .card-body-extra {
90
+ margin-top: .75rem
91
+ }
92
+
93
+ /* keep a11y focus rules here */
94
+ :focus {
95
+ outline: 3px solid Highlight;
96
+ outline-offset: 2px
97
+ }
@@ -0,0 +1,26 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import { ToggleLoading } from './loading';
6
+ import { Skeleton } from './skeleton';
7
+ import './skeleton-loading.css';
8
+ SkeletonLoading.propTypes = {
9
+ heroHeight: PropTypes.number,
10
+ cardCount: PropTypes.number,
11
+ className: PropTypes.string,
12
+ };
13
+ export function SkeletonLoading({ heroHeight = 220, cardCount = 6, className = '' }) {
14
+ useEffect(() => {
15
+ // Keep the app-level ToggleLoading behavior for global spinner consumers
16
+ try {
17
+ ToggleLoading({ show: true });
18
+ }
19
+ catch (e) {
20
+ // defensive: ToggleLoading is best-effort
21
+ }
22
+ }, []);
23
+ const count = Math.max(0, Number(cardCount || 0));
24
+ return (_jsx("main", { className: `loading-page ${className}`, children: _jsxs("div", { className: "loading-container", children: [_jsx("div", { className: "visually-hidden", role: "status", "aria-live": "polite", children: "Loading\u2026" }), _jsx("section", { id: "hero-loading", "aria-hidden": true, className: "hero", children: _jsx(Skeleton, { variant: "rect", height: heroHeight }) }), _jsx("section", { id: "cards-loading", className: "cards-grid", "aria-hidden": true, children: Array.from({ length: count }).map((_, i) => (_jsx("article", { className: "card-skeleton", children: _jsxs("div", { className: "card-row", children: [_jsx(Skeleton, { variant: "avatar" }), _jsxs("div", { className: "card-body", children: [_jsx(Skeleton, { lines: 2 }), _jsx("div", { className: "card-body-extra", children: _jsx(Skeleton, { lines: 3, width: "90%" }) })] })] }) }, i))) })] }) }));
25
+ }
26
+ export default SkeletonLoading;
@@ -0,0 +1,48 @@
1
+ /* Token defaults removed — values have been inlined to make this file self-contained */
2
+
3
+ /* Skeleton primitive styles (shared component) */
4
+ .skeleton {
5
+ background-color: #e6e6e6;
6
+ border-radius: .5rem;
7
+ display: block;
8
+ min-height: 0;
9
+ }
10
+
11
+ .skeleton--animated {
12
+ animation: pulse 1.5s ease-in-out infinite;
13
+ }
14
+
15
+ .skeleton--avatar {
16
+ width: 3rem;
17
+ height: 3rem;
18
+ border-radius: 9999px;
19
+ display: inline-block;
20
+ }
21
+
22
+ .skeleton--rect {
23
+ display: block;
24
+ width: 100%;
25
+ height: 160px;
26
+ border-radius: .5rem;
27
+ }
28
+
29
+ .skeleton-text {
30
+ display: block;
31
+ width: 100%;
32
+ }
33
+
34
+ .skeleton-line {
35
+ height: 1rem;
36
+ display: block;
37
+ margin-top: .5rem;
38
+ }
39
+
40
+ @keyframes pulse {
41
+ 0% { opacity: 1 }
42
+ 50% { opacity: .5 }
43
+ 100% { opacity: 1 }
44
+ }
45
+
46
+ @media (prefers-reduced-motion: reduce) {
47
+ .skeleton--animated { animation: none }
48
+ }
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import PropTypes from 'prop-types';
3
+ import './skeleton.css';
4
+ Skeleton.propTypes = {
5
+ variant: PropTypes.oneOf(['text', 'rect', 'avatar']),
6
+ lines: PropTypes.number,
7
+ width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
8
+ height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
9
+ animated: PropTypes.bool,
10
+ };
11
+ export function Skeleton({ variant = 'text', lines = 1, width, height, animated = true, }) {
12
+ const base = `skeleton ${animated ? 'skeleton--animated' : ''}`;
13
+ if (variant === 'avatar') {
14
+ const avatarStyle = width != null || height != null ? { ...(width != null ? { width } : {}), ...(height != null ? { height } : {}) } : undefined;
15
+ return _jsx("div", { "aria-hidden": "true", className: `${base} skeleton--avatar`, style: avatarStyle });
16
+ }
17
+ if (variant === 'rect') {
18
+ return (_jsx("div", { "aria-hidden": "true", className: `${base} skeleton--rect`, style: { width: width ?? '100%', height: height ?? 160 } }));
19
+ }
20
+ return (_jsx("div", { "aria-hidden": "true", className: "skeleton-text", children: Array.from({ length: Math.max(1, Number(lines || 1)) }).map((_, i) => (_jsx("div", { className: base + ' skeleton-line', style: { width: typeof width === 'number' ? `${width}%` : (width ?? (i === (lines || 1) - 1 ? '60%' : '100%')) } }, i))) }));
21
+ }
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import PropTypes from "prop-types";
4
+ import { PageTitleHeader, PageSection } from "@pixelated-tech/components";
5
+ import { flattenRoutes } from "@pixelated-tech/components";
6
+ import routesData from '../../data/routes.json';
7
+ const routes = routesData.routes;
8
+ StyleGuideUI.propTypes = {
9
+ routes: PropTypes.array,
10
+ };
11
+ export function StyleGuideUI(props) {
12
+ const { routes } = props;
13
+ let primaryHeaderFont = "N/A";
14
+ let primaryBodyFont = "N/A";
15
+ if (typeof document != 'undefined') {
16
+ const headerFonts = getComputedStyle(document.documentElement).getPropertyValue("--header-font").trim();
17
+ primaryHeaderFont = headerFonts.split(',')[0].replaceAll('"', '').replaceAll("'", '');
18
+ const bodyFonts = getComputedStyle(document.documentElement).getPropertyValue("--body-font").trim();
19
+ primaryBodyFont = bodyFonts.split(',')[0].replaceAll('"', '').replaceAll("'", '');
20
+ }
21
+ return (_jsxs(_Fragment, { children: [_jsx(PageTitleHeader, { title: "Style Guide" }), _jsxs(PageSection, { columns: 1, maxWidth: "1024px", padding: "20px", id: "colors-section", children: [_jsx("h2", { children: "Color Palette" }), _jsxs("div", { style: { display: 'flex', gap: '10px', flexWrap: 'wrap' }, children: [_jsx("div", { style: { backgroundColor: 'var(--primary-color)', color: '#fff' }, className: "colorSwatch", children: "Primary Color" }), _jsx("div", { style: { backgroundColor: 'var(--secondary-color)' }, className: "colorSwatch", children: "Secondary Color" }), _jsx("div", { style: { backgroundColor: 'var(--accent1-color)' }, className: "colorSwatch", children: "Accent 1 Color" }), _jsx("div", { style: { backgroundColor: 'var(--accent2-color)' }, className: "colorSwatch", children: "Accent 2 Color" }), _jsx("div", { style: { backgroundColor: 'var(--bg-color)' }, className: "colorSwatch", children: "Background Color" }), _jsx("div", { style: { backgroundColor: 'var(--text-color)' }, className: "colorSwatch", children: "Text Color" })] })] }), _jsx("style", { children: `
22
+ .colorSwatch {
23
+ color: #000;
24
+ border: 1px solid #ccc;
25
+ padding: 10px;
26
+ flex: 1 0 150px;
27
+ text-align: center;
28
+ align-items: center;
29
+ justify-content: center;
30
+ display: flex;
31
+ }
32
+ ` }), _jsxs(PageSection, { columns: 1, maxWidth: "1024px", padding: "20px", id: "fonts-section", children: [_jsxs("h1", { children: ["H1 - ", primaryHeaderFont, " font"] }), _jsxs("h2", { children: ["H2 - ", primaryHeaderFont, " font"] }), _jsxs("h3", { children: ["H3 - ", primaryHeaderFont, " font"] }), _jsxs("h4", { children: ["H4 - ", primaryHeaderFont, " font"] }), _jsxs("h5", { children: ["H5 - ", primaryHeaderFont, " font"] }), _jsxs("h6", { children: ["H6 - ", primaryHeaderFont, " font"] }), _jsxs("p", { children: [primaryBodyFont, " font. This is a paragraph of text to demonstrate the body font style. "] }), _jsxs("p", { children: [primaryBodyFont, " font. The quick brown fox jumps over the lazy dog. "] }), _jsxs("p", { children: [primaryBodyFont, " font. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."] })] }), _jsxs(PageSection, { columns: 1, maxWidth: "1024px", padding: "20px", id: "fonts-section", children: [_jsx("h2", { children: "Information Architecture" }), _jsx("ul", { children: flattenRoutes(routes).map((r, index) => {
33
+ return _jsxs("li", { children: [r.name, " - ", r.path] }, index);
34
+ }) })] })] }));
35
+ }
@@ -1 +1 @@
1
- pxl:v1:b15a24756358d6e6b02272a2:9bfd2086414fa1eaa92153908ed0e15d:ab8b7769a766de9be76c08c748e59ffeb147312bb908995fd88456c5cc76366350bf44d28f9b3ed9ebabb70ca106e4fa9196e559e81ce591b6764abce5415bb5013dc07538d6d0d92a377d46c1a6f2f96327c06d269053672fb532a274bc5b8483bf06b8a9f6e16d9733be3c5033a967d91527ffb53f1e5c65dfd66b983e4e3f2ec086e01ddd68a0a4d85a2b3dc3bef21024e50c11b2c8256c8dd1b2f2c8c71aaba175063b61f5253d05c0c2847ecf4ddb6b40f8aa9af5de027598b1f747b72cdd6ba85025fdf30f35d47f9c10de625209bd28ea11bd73decc15f1de580be1b155032b2857ee9ac8212aeb943c42a773fa75a0867413c455cce15bc77406bf2b5ba0f5da75cd14735f53b3d22962b27c04c418bcb7e241850f64a873649c3a52c67a84db2f9a3c4a7605ec5114ad1f74a0eef57d57b1dd98d87b144336d516b2d48324df0143e5687abdbd5ffbb9a0751e5f91577742fe460c390c519d73b3da3da2c1a4d32a738875106a58c91b6b04016eba50f57a026c9d67312bdfb53992ac025e503ee818aed29959337947e1d0d81e6cccd0d1a921cfe31d225ce744cc82340ce4af6aa308677cee985a7e7ae1d1b7d21274ca8264ee6481e5f001d1d4dea91dc0eb787d2cf1b990d9690e9bb83489d0e354d1071bff8a1668550303f04256f7e60736146a5da09e15b65d467af7194ece67feefc45736d009f8043d76c30b9263e04224977d8b9ce64b5e6317e6f3a604c76b1290ffa410e51dd069258321448675382907f32c6b51dfede27fa6db5244952f883c57b8d6cf9572e6cfa7a4d973f86c1ab3b54a7bf765deee12ea7d381eef24e1424f09dcdddd219930826dcc69d924ccd1937538b4edb8e347da359b638aeb475b38b08307d5ec568b959ac9c4dfd1889bf2c963b7bc0b65bdbef0d89a75b026ca4af6e87641ff604ae2da4b3c19a1c6a3a3f32ad870343f342d609946392d3e540044d7df067b00eb7ec16284a9b42439f853bdd6492163382d1e90d6e24e46b5ff1061cb51e8089ddfa3985775d03551f082cef25b0feeda0a9cc416a25f01d71f4797332b654895ee0766735dc02329e48f56d4583eb5fb9ca9e0f9c71b7ac21b3abecb55edca90731d7d69c16dbd31c0f01f3842fc1b4322383932c70e0131e6a723d95f26adbe8777f9d0bfaa75f310b411d9203689a8e13238328f04ae7ebb34e9212b77edd89b54f6924654a31d17c646a24bff9a096305be689c10a1dad1830199679568f5054616fe18572f44aac4846c3649e6b58509b6096efdbbf5a0bbcec5e97a48fb7497ab2d74376e76f269366b1d5dfd426fbcace4ee5bf775e9c9b804eb87363c8f9394a96c703c84cef79d1a9ae846c537ffcbb5daaaf4efdab9c6cf2ba12f6df46b8ea62acefa01f1201432808758b38643e6154bb74d0b7af6f01461357b58e51c726df49dd59585ed034473469de5f9454aff9794c0f08af4e7a976de871a3e67a7769a2b7d69aea8438767a06dd12815471bfe359c274e8b3e9e9b0419712c85d59b1844034bdf2d486cd9cb94b875672acbcd0dcbb3156e5b52c69a4f0f2339c682183b31a7a0f0757b505fa4c33e31e4554f535d001b441daed3122f7a6d6fd9563ad55d71ef0c361bd908370f52d63c96488f3dd7aa1f480e562fb8275119e5b3c866e4536c5a1dbb6f3e89ccca9ccf44cd7f60ba5e2de6f68b8f22c6fec7ff146bb4eb84230712ea1638b515bfb5e00518fe4ab4c7465c4a0b7b422fa9ecfb3dc7f5ff44915dd3aa982e6f9304e3068446e45dfa4e61eb6c7649cd8b4918ac3c369f42a7d71a9ce69afb63b9a4bd421c6e65e1e781b11aee3d22d85a776f8306a80d00956ca44163c7c7517d8fdb916808f42714bde340d39dc85aa606507f4f8942b28aa596ee67b478eab4439f3f8462d07a37555a8405eface5b4e45fe62c779e818c0e0f2ffb1c8885a2873e08a39e6731a421a4edd82fd0f18b16a3ed249e4a8fe3e41ea1c20e2d886a57ca64115b85c494879f9d1f0538c67c87c32d38225c2516b5d57138a0ac1741b88a076952042c75ea75a344e3154ce7729bfe524afc79ba82b5e80f0cac64d15d9af1e0fc4065415613f72942013db82178e9458d598c1e4c933ff7be954ad45e903fc1c0fa97bd1af49aa9cb6bf5ab4a14e801cfb2f9ebc3a1116ee7ec210cc07e9dd5bbd40b286028f2a4f1859473cdcbfdefd782c4eea8484e238d90081b48b5c6010dd16069a95485095fbe0fbdf5b50ba89dea877fa254d6583958bba61bd01f5edd53b6182678cd5df5c26adecb0427ba8b4763f83d281c93a3fa220528b25b6f14cdd8978d86f2bb402b9d576b390edf2738b243dd7a334951199dc63effb2c826e70257d310e56848a85f2e47042f934a0937d4f0d5ffd8dc06822cd5a3cecd12b628842c3f4e994989a655af25e7170dc9d24bbe3dc244606e3f196d062240defafe6d8276e02cf2da35514fbf93e8a3457631af251b1d4d707986c85b88d34ee81e77f3f9ca8507c00319bacdf1458656d9dc4198d81db75333e232ecb1366c5aa51d0fe2053c33cac284f9be16c9a6994de0227f55fc944ddf6277be6f0fad647ab3f35fbf3a75c0432025d41773dea229c021d508f30f2771e04b37bfb6471ac26ff9ad282cb5454464f6b1d26d02fa86ea2c6727ed637a2f0622d84891324368cefdb4ac6b9726372cfb9be4f05f47ea0005f3d892f8ab4aeabb666001f120b87207801cf279625f94cdc3ae93ce019c631e18d0ea88d70c88464d94274a8ab767c4b959c598c5472b6263358c29599351f74d9c73375e921d2d239f1675dd55b02a0450d99f8d0b5d7a83a3559f133f1af11c21c4f639929cecb7dbf3d97d81b5b19260800977ecf63c2cda31c82960e2c8f20eee1cc803d3613d7b324dfd6c54176f39fcdda99cf4f90ad4366dccf12b35a095de628fb63fa40fe39cd7f87dc85e287c9a9b6636e4444bd47650d85d01b58c06174fe725bc7737b9d3fdf7c61da147fcb2ce39cb74514650a1a7266bd91a8eae5f76149bf6ce4332d235ca5509ff7d53e51480f0e89294ea83edb84d91bbd8deaba4dbc850bab27fdd2d8e01a9e8dc51a1cacb27fb9e6c551ea5c9d0994245384f21ca9b0de3594c7a597ad52bdbddb81b706ffd05dc21ba766bb8cd13a1de888af0217ff9905069c19a7ca0cf1ce3b9a5111caffd50f65a0a0d24982ffda39c7343d73b1992ec3a3c5048c6d96ebd1064be6c3cc65ee4bc843fc552f6b25cc960919c35c41910e354e7aa2fa6c00bbd8b605e666338378794e9ed210ac265e92c1958b4e6eaca420c0e546b135b2cf4cf25a206424a3619f6cd3fef71f6f34960ee36a0236711e8b1b2e4ac03f78d94d54975f798bfa8826e409de8790c0feda76c6f85c0275de2dd08302766147a06e105f48e9e5db0f820110d24ab91561bc3cf4eb27c60d21eaf81d38964fc0ece16418ab2b561c9c0acada88dfd577ff0a3762139efa8edc09a23b6c33fd47b0bb5b52fc7afd09e66cce984452133a15d2c4de8d4779511175c946fca6933b016191f96f7c3ba9f8cbac7fc1267c1f01777817424c38bde51842213e3e1e5d84333fb2d805da2860d57009908a80e0e012b9683808a2e1759b48c0b64b043a04a35bf962e082b041853f5c5d7466ea2f714b8f2422fd6162daeb4a236546e493b06f15edfe0d7869aeffbaafc8bf9a138301fc121783832aef1a5e17dd7e548421115135b26b56bdfc0f0322d99653b7a3bad31e3e34e032e1803b31e46a20c2c1232b10cd2020c06106c8f795b7241c6253d9080498cc60e7c7b93549522c0d0c5c33e3c87e6096096cde13c0233dde2c59d32e40b5f21d8b114f84fbe98df27cacb130353ab81aa531b1884d99fef4e115c60d7b110ef05300a90270d8d7e9d5a761465973b37d1f9c4ae569e80b08e900423aeb5bb839f066de9e687d97a8405482ffb14bc942cc909b1507f0a98b98b2e907cb522078da150d977814e3985359a4eaf4325c2f8f271da8bb7927b35862db461a7c10b88f95be8a1ffbb11c15b6615eecf9a48687c3106aba3245934f5900d3049bd704cc6439919fb085a51d19ec883801fa6156031cc17b1b608f2a9c64a505373b62d90fed060ba14390e9d7a1fcc48ed4c9f15879dc8f827095f73fe6a21558311c4dd4cac91d1f1c128e8e378ecf91b04ac87d92cd3d9026e8b4a9439254c98930a7987f3dc8e8dc84d330ed25f65207822b03896ce43c18ad1cf0d9abe6ca5d092f14a19a202600679353b041a6f9bbdc17791e527a9dcd223b034f983add3c57052ec62ae4b61f6c3b8e5099c3ec0aa8ce5d4f0e1f308ff46803c5c72a5f902d02b65d713101dc83a252dfdb0fd4c36cf14030221a34b993fcb4f3261eb9aa884eb7ebc41fcef9b72765e09b63e2fc818a80f7128b153e763883ef632c6f97b77ea84ab070d85d129eb7cf2bd3d44419fa271ca0531339d9a2470a7ff37dc2c6da56c08b7bbff47d47c9d5cec9f106b3a3f23c98b65128e995dd47251d21acff2566614ca911318ad0416f1658eb8d31956d8f5ff0d22ab4390fee5e3cdf251bbc113b68b847203c3d65edeb7feb7a929ea25f2153837acd99486cf3b368b15cbd2ca3fe377bd95ef17b4fb77d8e633b747adc89f2738741a794a6058b5cf94bbb4a8849d6a3de88de7649155ba279f41f36895ed5b2161710c541c1bcbfd64bde555fd35aa0ed950725d9c595447fb73b52d4ab4b1affc5756babe36a42649d24b121244d9205344ffe6668a097c5c4fc83dff002c3af4ca6f357dd184c864b6cda545301ae0e333cc0ebccdbf00cad40fa4b133f8961751746feb4eb45d1b426e2a02effc5d4eb0f39df08c2aff63db26575df75f827ef33e20db0e1775f3c08d3833812b15348fa8cf8aba7643926ba11a87d11c34981690811019e7d1c109e5ec9863b4c49b65a6df5126e26a2c5867432632bf15389c243af3eba40e75ddbba75b315ab387a4d27c2000c56ec136808505087389b4a81466d08a2e32ee7de86efedd17d5390bb14aa1e79dcbe4103eb1bca793ef5f4a0ccfa3fe60d1210ef26dd955fc0b59180eaf04fd258272b173815596bda4575788156e3408c2aaaecb99293e83b1d85b3857e5432c8e158738d92a11cd783cf4af
1
+ pxl:v1:86e04f735168062824d413b1:5883875e524643b505d95e27e0585c0b:4a30ff9a7cbae3d6cd92119a3b521164bb8b4709e3d6695b3763d78c64a78809438af73c24208c4ec78b2dba8764201be7538cb15a29810c27e668768d7a4da4f731503be4fe91a5b20b91d74b042d472819ffdfb18e98c81c07323e867df49eed4c76a332a0750dba738304b225d8f2c37cded9360ea8ac6de7847f6ab2ed45ccab108f895462893c6d32d6fa83e11e865895db16d00b889ca610486f1e9d4e109de0b22f530dec3f2405075d60fe23eb4a842b3672a50d4de3860476c9a372e268ca060e41812f5573c10449e8cec75fbbdb48babe445840d025c8f9af2d8edb9ca3afd8c699e8afeb5dddb6777d9acbf9874c6f3ec49085e9540345ae94790ed3f1a9c2ebee2b3d03a38ae0494c1233603c6e27827a21a49a13f8923c8af4e6b37492560bdbbc4f1ad0a7e792f043ee32b60b9ef142c87481478ebd43f44050be1779b6c2589fb77c35cfb430154452300bb7c4cb7a3777437312d14c3f10a63e70c065a2b7c7040a68656cdebca6174f2db508816585d84038071db0c65ec1deb7a1c7207c6e65212b74dbf90a8ec3b2cf6d09a85e8b7e9966ed1fa1d850df088a964a58daf96c6d0b2a3666ae4fc709c5b9d4e5bfa59d613eb40eaeb7147ffebab606f59c3b7b756b0e1301c021c37f393cb26767f3d026f77f0f7adfc9bb566ee81eeb2362d0246bff02a722a9f266e8f1cb0210ce804b824bec262ec0a24c286f59032aac1f848eee54020a090c075cb167b3e30aabdcc94cb8fb06095be0b51b67c029500259a1f5ed62afa8a46f7d36586b72bdb9b01cbcbfd4818d7ec9418b81ae601217043bc398fc8b297a3b4d6b034ce6bb98854fe69f66c752f6db2b85b9699443b331422be76f12ad7b7fb72f2f02639f515c627afa9edbf1ab564551af5dae519de9d10885218b249436cd754fcc268a1b455f2dc4ea4d1b480abea0cbf696d7835070df8c9a88a586728a70486f180455da58761f175951d2e22a16efe489941348c341c56a790abe8774bd4d5fcedbcde98ed388ce93bc27dec35d0e914d0fd30c214a25a9662f3fe4da265cdaf6c5447317a2985c1be0225ac30c1ecc78cc0193b144ac1a543b11d3689ef57b4dee0b29be6d24712ddabe850c70e20e69eda3776bfcc2d1a176747d1cf8b38e3a5317ffee831acc8d440fd47aa46ec7cda7031c2d07d8883e123c61ee34f37b8bc958ad2ad46fbb83718a7ece98e670a7bb155132c765bbf067062565e7ebdf372a02cb7ddbc8f080fc5ff15163d73fec5152b066a043a27d33579e97734d327ab65996f834de43d6c218fdbf100a4a1e6e4d5fb72e430fb049061da47f43f88faf9fb79ee186b103172b9a39f7e5747a646e45975e326103296d2ce7a6f6313b3d9372641c04c162a075500987460c7d24fd94fec51b049d624d44620215fd737d88632ac9121c6bd017c34d47e7b9ca6494e5592350d0b817d25301d79284133bd4093fd5bd1d1ee92f10acef720c56e0166cb2993d7724c76feb9fa9f72ff1f03fcdb75149f943f0c333377f4599a53ae967390f9f7c13c40762412014a362791debb4fbb297b125cfc206c9420ef08154bab3aa5238115f957ec8047a2d480be647b6a6e07b5a3c16483cf0207a3755bbb82e66d932c2b042d3ec36325a29332fbbcd1342d246bb4cc13053c216e7fb5098eb5b645fd86cc13cd2ada7a35c77e40a2033c742f960e289ddd5ff6c9b53843e7e13abaf198fc5bea355f1c9386b0962a8c1aad7bf93739665e25a9e86aa94c589470dc0d410769a89ca8d0750fbc9b279557a32044ddccf3def258cfb114dea6d5ce74bd0acd56c58dab994e3dfd625f92885136b4d60a7b30a12cd7866b5cd349e7f23d4b125d66e5a0b4f33da610d13733409e68f0e7dcebf2d7f4489b66fffb74004424542c248e92dd5e8f970bfb49362b714c4dc4371337619a78c678fb7baa6deabda32b232adc9e606bad082c3a50ab28dfa021707e037ead5fd94e8da859693d5e539b577b21bb47bdaf0426111a0ac1398a1c00865c92c95c2cdabfbd672e26b788f22aef43cc98f7a3e1077a87d20ee653b6ac33335693c0b017e1c586552175f3f58d327a828f4da3e5fbf06a58a55ec88e7293c6be1c04ce0b09d0f7675065862fe15b08141912ae619cf9bd592332b69b992af229a3e098b7fa383015abf089742541ca90c66a3b313522575899b489fdafc873418de9c825518162a54fd6777a755144f7e4fed278d732980bd3685c40499b203aece3ca222e911b144858c59f70c4d413ec4b965dbbfee16ea1934d9933f5f5e11ce3d4803c41e14479674d46d16815b33b14a3f4f5f4ce95ebcf3259be268e02a39bae72149a47d099f34412a688e03164d6fae85c5844c2e75cc8c99174ce31396e26a24ddaacc09c39943b92f8e989bd13c999387e4592afc0a2338b850f1ce4955bb650d6a92f717e4a13a09b18802418432fd4c14fa166710d3bd16b0cb3c145f069db82fc8d0a95219e930b0a072b33cacde6579a0273987688f7e1f573cf889b79dee69a0d28a9be9f15e610ce3a036ebf7515e12aaf08226dc67a73387d28cb025a6815a58886933951a463d4a67395e4d28d8975732aa795273406f591af4f4acf0c9e1b37c8c9e2d69e2955b1ec951c4b3cf1c241880e715dda9a4d2230a2c0413a54220714c7380d8d76f292b6bdbefa818b1ed19202514cad31893cffb112ad9abf673e9a98ad2805e42ee0449095fe23a26b39643b3cfef51131705195e5105cefc3de50cf8dfe1c6c3590699d629c17269d86c08c5058ad3996d8f0a964de42011876b06b928c4fbb8428167cf3edc11485922378d61b93e0ac552a8eaa0cce772e9d34793c70315ca8897264ca831a6e161dd782badc9121c27db9af4884f1714194355b7913dc5eb433f803391f440526105890ed5fe3ceb5be2b5c9e2aea9b9991b4d2f7acd8bb95da3f62914ca740a63b452b336ea75963b497388ea66a662a3a66656a8086bfca9461a414e6de0c8d282efcc4fadbc0d89195daa2bcd521d58f686d8c84e5144bf582e7cbf30f693ad274d2f0f1cc531f80fb5f6f7665e2a7b92b2edd8659a85d9ee266e70aa5770ac6a0eb346c30ce201bd347c33b86895794e71c4a95ac57c3ec92cd1a0bd5e44f731e8123865292acd4aced3ad1d59739d825d285d4d5142b5eb22be03c91496c7795674105d183970dfac2c8b297c19cf1ed05f4c9715efe78f3f519a8bc1c4f71574b67d7d2714e6f8a7ddded7a5981938424895f24c3f7c0b2b0e245c9e9c2c31122b2466043bcf999f3fe8a229f9da21dee1ddc4046a6d254d310e094c3abd7ec685087ef3b7b9bc0a2535a11906db45f3629f2b350ed5a98992721a23e31b4d0eab62dfa249b10f282d826a666ea42392505451dcea3354e5b31025c43244eb821c32d56b7d2967c0b95e4277a225cd0efcd03bb76f2f1b89c8ac48a05c5ff893a7d5074dcf0eb294edd615a4bed33c640b1cdec104757a1f06301b754bf23b9fd83b098d7b7f9a9e7fb4fc92d31b0151dd2fc04b7e9fa9d06fc0552b3fd00e865c179302972069c61b5db2a07893596a6a924f5fb9bee377e21ee4362a73fbfadd9d8e45c0d4e8352495e386d6175ac4a8440a89d22b09792054f2b21ab8c9a294211d5c2f134ee453110d137b6fcdc5a4ffd362cea86a3df6c79c6c2ffdc56ca32bf2d80133dc8f191a0f1dab2a111ff5a15447daabbf8eedcc078150e5b79bfd256c6de64e9c8e7f30a3a2d6a39fe0bd99ae460a82607102b9d2a95c048be7dfcb59a31281c9f7281b3ca456c51c90a4b4da346311b469b2ce37b07a793dfafb4aa0729d81375a077beb60ddf07c0c199bc872a7bb645e57b87ea3e45bec30bbd10083ed19c74a5267cb304bbdc0f7da47b420a0e73a9208946784f02c766b58a509774409b29c67783a51af2fcf19a91fbc5b8893346f404b31f71d182b8374b773f9f00925585722b991d468a8c03626d85925f363046f49c49b92be7735dcaa1e21e917812068e2d4c76ac53e9eb5ae22fb267bc2c8f870d5810f104c927cd7ffe7b0e5cee47b0c8d7ce420208f1f69dc763d205f52e049480e8efd85d66561ec4f7f2e224632d39a0d314437870d75c6a1856796e21c3ae8fa75484971424bf1057bd5cb8725c1a05dc8b5d5bedac3ad2c1aefca2dd8a4a59ade6161e70614115cdff44796a60e547c734f2fada381ba4449e3cddc44a6cde33256d39398afc8b2b1b2ecfc3760801cc3de1a0fd57c90e8154bb277a3c9596d64fa4dbc5ff3e38ae1b592698e7b61c403b86567bc06dc343c685bf4f985d4a8f8c9d6ca91e51472edaf661bfbf9d29e6b4882e27d59a73a809cb7628d4c899095dec997d1858a1921659ccc5f19e41d30f76355bdf9deed80faafcc586501c64b005fe98ff6ad8d21ae016a29c0c63e8aaeef018015936eebddeaa342107b8c342c217ebd8b6c56c2278434d14d90728816f38b7c05072a2315d9e1c82fa9efbd097170f7879049700e15ab688b66e23c205c44022085e03220d100ef84318cf63b38e63a17f53165212171d34f2de945a24102fc7907d2a883ce47e5ebe5683497ebe2bf64a69010e7a84e1c30da50d02f07df34695e8b536c5d8c817ab25b5dbbb3c1e39766179c657a388370e4f35a283b8b8580ee8ddd183548d132fe32c8ab618c1c02cb337310e5316a3bd780e6f7aa550ce1d4aa4900c2e55915d482fc9c3e6dcb79dec1e17d77f2e6603e478efcb1df4507a8430f508ec798ee39cd0140c6dc1d5e734ca8803e5cb241cd259795f63ac13b2bba29053fe2fdf765f4892b1bc779bff577b5e22d2b3e2a94d2d9ec5860f03479c0be7334277815e8475cdb6801810e0ad35bdead9a04e5f3783921246a996d91ed2a66bfc9191fce6e5af08a689881b732e28ad08878465d791e2d93332e3421c12a6b8dd42e13300e4a78f801f0b1785b408d844a58f7d754f2c183cd1a74de05a29abd7b17a576ec85d63507c8ecb12780f829617adede0f8fa50881f36b5c9f4411013e0ed2d42855092bc40ee97aacd0ad578c4459c389a72f8639f001e37567a4087d3179f01f5b2bbdbb866e2ee2bc5ac7d212c9aeacc16c3755ff2c50505b8a679fba9e35283c0a474f935b96a2172467fff97bff97
package/dist/index.js CHANGED
@@ -15,6 +15,8 @@ export * from './components/general/faq-accordion';
15
15
  export * from './components/general/image';
16
16
  export * from './components/general/intersection-observer';
17
17
  export * from './components/general/loading';
18
+ export * from './components/general/skeleton';
19
+ export * from './components/general/skeleton-loading';
18
20
  export * from './components/general/splitscroll';
19
21
  export * from './components/general/manifest';
20
22
  export * from './components/general/markdown';
@@ -40,6 +42,8 @@ export * from './components/general/semantic';
40
42
  export * from './components/general/sidepanel';
41
43
  export * from './components/general/sitemap';
42
44
  export * from './components/general/smartimage';
45
+ export * from './components/general/styleguide';
46
+ export * from './components/general/global-error';
43
47
  export * from './components/general/tab';
44
48
  export * from './components/general/table';
45
49
  export * from './components/general/tiles';
@@ -21,7 +21,9 @@ export * from './components/general/schema-recipe';
21
21
  export * from './components/general/schema-services';
22
22
  export * from './components/general/schema-website';
23
23
  export * from './components/general/sitemap';
24
+ export * from './components/general/humanstxt';
24
25
  export * from './components/general/utilities';
26
+ export * from './components/general/skeleton';
25
27
  export * from './components/integrations/contentful.delivery';
26
28
  export * from './components/integrations/contentful.management';
27
29
  export * from './components/integrations/flickr';
@@ -558,7 +558,7 @@ async function main() {
558
558
  }
559
559
  const pagesInput = (await rl.question('Pages to create (comma-separated, e.g. about,contact) [leave blank to skip]: ')).trim();
560
560
  let pagesToCreate = [];
561
- let existingPages = [];
561
+ let existingPages = ['humans.txt', 'styleguide'];
562
562
  if (pagesInput) {
563
563
  const raw = pagesInput.split(',').map(s => s.trim()).filter(Boolean);
564
564
  // sanitize and normalize
@@ -1,32 +1,42 @@
1
1
  {
2
2
  "templates": [
3
+ {
4
+ "name": "About",
5
+ "aliases": ["about", "about-us", "company", "our-company", "team", "our-team", "about-us-page"],
6
+ "src": "../../pixelated-template/src/app/(pages)/about"
7
+ },
8
+ {
9
+ "name": "Contact",
10
+ "aliases": ["contact", "contact-us", "contact-us-page", "contactus", "support", "get-in-touch", "reach-out", "get-in-touch"],
11
+ "src": "../../pixelated-template/src/app/(pages)/contact",
12
+ "associated_files": ["src/app/data/contactform.json"]
13
+ },
3
14
  {
4
15
  "name": "FAQs",
5
16
  "aliases": ["faq", "faqs", "qa", "q-and-a", "frequently-asked-question", "frequently-asked-questions"],
6
17
  "src": "../../pixelated-template/src/app/(pages)/faqs",
7
18
  "associated_files": ["src/app/data/faqs.json"]
8
19
  },
20
+ {
21
+ "name": "Humans.txt",
22
+ "aliases": ["humans", "humans-txt", "humans.txt", "humansfile", "humansfile.txt", "humanstext"],
23
+ "src": "../../pixelated-template/src/app/(pages)/humans"
24
+ },
9
25
  {
10
26
  "name": "Projects",
11
27
  "aliases": ["gallery", "project", "projects", "portfolio", "work", "our-work",
12
28
  "our-projects", "our-project", "case-studies", "examples", "showcase", "samples"],
13
29
  "src": "../../pixelated-template/src/app/(pages)/projects"
14
30
  },
15
- {
16
- "name": "About",
17
- "aliases": ["about", "about-us", "company", "our-company", "team", "our-team", "about-us-page"],
18
- "src": "../../pixelated-template/src/app/(pages)/about"
19
- },
20
- {
21
- "name": "Contact",
22
- "aliases": ["contact", "contact-us", "contact-us-page", "contactus", "support", "get-in-touch", "reach-out", "get-in-touch"],
23
- "src": "../../pixelated-template/src/app/(pages)/contact",
24
- "associated_files": ["src/app/data/contactform.json"]
25
- },
26
31
  {
27
32
  "name": "Services",
28
33
  "aliases": ["services", "service", "our-services", "services-page", "offerings", "solutions", "products"],
29
34
  "src": "../../pixelated-template/src/app/(pages)/services"
35
+ },
36
+ {
37
+ "name": "Style Guide",
38
+ "aliases": ["styleguide", "style-guide", "design-system", "ui-kit", "pattern-library"],
39
+ "src": "../../pixelated-template/src/app/(pages)/styleguide"
30
40
  }
31
41
  ]
32
42
  }
@@ -0,0 +1,13 @@
1
+ import PropTypes, { InferProps } from 'prop-types';
2
+ import './global-error.css';
3
+ export type GlobalErrorUIType = InferProps<typeof GlobalErrorUI.propTypes>;
4
+ export declare function GlobalErrorUI({ error, reset, siteInfo, className }: GlobalErrorUIType): import("react/jsx-runtime").JSX.Element;
5
+ export declare namespace GlobalErrorUI {
6
+ var propTypes: {
7
+ error: PropTypes.Requireable<any>;
8
+ reset: PropTypes.Requireable<(...args: any[]) => any>;
9
+ siteInfo: PropTypes.Requireable<object>;
10
+ className: PropTypes.Requireable<string>;
11
+ };
12
+ }
13
+ //# sourceMappingURL=global-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-error.d.ts","sourceRoot":"","sources":["../../../../src/components/general/global-error.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,oBAAoB,CAAC;AAQ5B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,EAAE,KAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAc,EAAE,EAAG,iBAAiB,2CA2ClG;yBA3Ce,aAAa"}
@@ -0,0 +1,37 @@
1
+ import type { NextRequest } from 'next/server';
2
+ import { NextResponse } from 'next/server';
3
+ /**
4
+ * Read JSON from disk safely — returns null on error.
5
+ * Exported for testing.
6
+ */
7
+ export declare function safeJSON(path: string): Promise<any>;
8
+ /**
9
+ * Normalize a value into a single-line trimmed string (safe for humans.txt).
10
+ * Exported for testing.
11
+ */
12
+ export declare function sanitizeString(v: unknown): string;
13
+ export type GenerateHumansOpts = {
14
+ /** base directory to read package.json / routes.json from (defaults to process.cwd()) */
15
+ cwd?: string;
16
+ /** optional package.json object (if provided, fs is not used) */
17
+ pkg?: Record<string, any> | null;
18
+ /** optional routes.json object (if provided, fs is not used) */
19
+ routesJson?: any;
20
+ /** limit how many routes to include (default 50) */
21
+ maxRoutes?: number;
22
+ };
23
+ /**
24
+ * Generate the humans.txt body + metadata. Pure function when pkg/routesJson are provided —
25
+ * otherwise will attempt to read from disk (runtime apps).
26
+ */
27
+ export declare function generateHumansTxt(opts?: GenerateHumansOpts): Promise<{
28
+ body: string;
29
+ etag: string;
30
+ headers: Record<string, string>;
31
+ }>;
32
+ /**
33
+ * Next.js convenience: return a NextResponse for a humans.txt request.
34
+ * Accepts the same options as `generateHumansTxt` (pass `pkg`/`routesJson` in tests).
35
+ */
36
+ export declare function createHumansTxtResponse(req?: NextRequest, opts?: GenerateHumansOpts): Promise<NextResponse<unknown>>;
37
+ //# sourceMappingURL=humanstxt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanstxt.d.ts","sourceRoot":"","sources":["../../../../src/components/general/humanstxt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,gBAO1C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,UAExC;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,yFAAyF;IACzF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IACjC,gEAAgE;IAChE,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,kBAAuB;;;;GA+CpE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,GAAE,kBAAuB,kCAM7F"}
@@ -0,0 +1,18 @@
1
+ import PropTypes, { InferProps } from 'prop-types';
2
+ import './skeleton-loading.css';
3
+ export type SkeletonLoadingProps = {
4
+ heroHeight?: number;
5
+ cardCount?: number;
6
+ className?: string;
7
+ };
8
+ export type SkeletonLoadingType = InferProps<typeof SkeletonLoading.propTypes>;
9
+ export declare function SkeletonLoading({ heroHeight, cardCount, className }: SkeletonLoadingType): import("react/jsx-runtime").JSX.Element;
10
+ export declare namespace SkeletonLoading {
11
+ var propTypes: {
12
+ heroHeight: PropTypes.Requireable<number>;
13
+ cardCount: PropTypes.Requireable<number>;
14
+ className: PropTypes.Requireable<string>;
15
+ };
16
+ }
17
+ export default SkeletonLoading;
18
+ //# sourceMappingURL=skeleton-loading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton-loading.d.ts","sourceRoot":"","sources":["../../../../src/components/general/skeleton-loading.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,wBAAwB,CAAC;AAEhC,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAOF,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,EAAE,UAAgB,EAAE,SAAa,EAAE,SAAc,EAAE,EAAE,mBAAmB,2CAuCvG;yBAvCe,eAAe;;;;;;;AAyC/B,eAAe,eAAe,CAAC"}
@@ -0,0 +1,14 @@
1
+ import PropTypes, { InferProps } from 'prop-types';
2
+ import './skeleton.css';
3
+ export type SkeletonType = InferProps<typeof Skeleton.propTypes>;
4
+ export declare function Skeleton({ variant, lines, width, height, animated, }: SkeletonType): import("react/jsx-runtime").JSX.Element;
5
+ export declare namespace Skeleton {
6
+ var propTypes: {
7
+ variant: PropTypes.Requireable<string>;
8
+ lines: PropTypes.Requireable<number>;
9
+ width: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
10
+ height: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
11
+ animated: PropTypes.Requireable<boolean>;
12
+ };
13
+ }
14
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../../src/components/general/skeleton.tsx"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,gBAAgB,CAAC;AASxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,EACxB,OAAgB,EAChB,KAAS,EACT,KAAK,EACL,MAAM,EACN,QAAe,GACf,EAAE,YAAY,2CA8Bd;yBApCe,QAAQ"}
@@ -0,0 +1,9 @@
1
+ import PropTypes, { InferProps } from "prop-types";
2
+ export type StyleGuideUIType = InferProps<typeof StyleGuideUI.propTypes>;
3
+ export declare function StyleGuideUI(props: StyleGuideUIType): import("react/jsx-runtime").JSX.Element;
4
+ export declare namespace StyleGuideUI {
5
+ var propTypes: {
6
+ routes: PropTypes.Requireable<any[]>;
7
+ };
8
+ }
9
+ //# sourceMappingURL=styleguide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleguide.d.ts","sourceRoot":"","sources":["../../../../src/components/general/styleguide.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AASnD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAiEnD;yBAjEe,YAAY"}
@@ -14,6 +14,8 @@ export * from "./components/general/faq-accordion";
14
14
  export * from "./components/general/image";
15
15
  export * from "./components/general/intersection-observer";
16
16
  export * from "./components/general/loading";
17
+ export * from "./components/general/skeleton";
18
+ export * from "./components/general/skeleton-loading";
17
19
  export * from "./components/general/splitscroll";
18
20
  export * from "./components/general/manifest";
19
21
  export * from "./components/general/markdown";
@@ -39,6 +41,8 @@ export * from "./components/general/semantic";
39
41
  export * from "./components/general/sidepanel";
40
42
  export * from "./components/general/sitemap";
41
43
  export * from "./components/general/smartimage";
44
+ export * from "./components/general/styleguide";
45
+ export * from "./components/general/global-error";
42
46
  export * from "./components/general/tab";
43
47
  export * from "./components/general/table";
44
48
  export * from "./components/general/tiles";
@@ -17,7 +17,9 @@ export * from "./components/general/schema-recipe";
17
17
  export * from "./components/general/schema-services";
18
18
  export * from "./components/general/schema-website";
19
19
  export * from "./components/general/sitemap";
20
+ export * from "./components/general/humanstxt";
20
21
  export * from "./components/general/utilities";
22
+ export * from "./components/general/skeleton";
21
23
  export * from "./components/integrations/contentful.delivery";
22
24
  export * from "./components/integrations/contentful.management";
23
25
  export * from "./components/integrations/flickr";
@@ -0,0 +1,26 @@
1
+ import { GlobalErrorUI } from '@/components/general/global-error';
2
+ declare const _default: {
3
+ title: string;
4
+ component: typeof GlobalErrorUI;
5
+ };
6
+ export default _default;
7
+ export declare const Default: {
8
+ (args: any): import("react/jsx-runtime").JSX.Element;
9
+ args: {
10
+ error: Error;
11
+ siteInfo: {
12
+ email: string;
13
+ };
14
+ };
15
+ };
16
+ export declare const NoContact: () => import("react/jsx-runtime").JSX.Element;
17
+ export declare const DetailsToggle: {
18
+ (args: any): import("react/jsx-runtime").JSX.Element;
19
+ args: {
20
+ error: Error;
21
+ };
22
+ play({ canvasElement }: {
23
+ canvasElement: HTMLElement;
24
+ }): Promise<void>;
25
+ };
26
+ //# sourceMappingURL=global-error.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-error.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/global-error.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;;;;;AAElE,wBAA0E;AAE1E,eAAO,MAAM,OAAO;WAAU,GAAG;;;;;;;CAAgC,CAAC;AAGlE,eAAO,MAAM,SAAS,+CAA0D,CAAC;AAEjF,eAAO,MAAM,aAAa;WAAU,GAAG;;;;4BAEQ;QAAE,aAAa,EAAE,WAAW,CAAA;KAAE;CAFN,CAAC"}
@@ -0,0 +1,8 @@
1
+ declare const meta: {
2
+ readonly title: "General/humans.txt";
3
+ };
4
+ export default meta;
5
+ export declare const Default: {
6
+ render: (args: any) => import("react/jsx-runtime").JSX.Element;
7
+ };
8
+ //# sourceMappingURL=humans.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humans.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/humans.stories.tsx"],"names":[],"mappings":"AAGA,QAAA,MAAM,IAAI;;CAEA,CAAC;AACX,eAAe,IAAI,CAAC;AAuBpB,eAAO,MAAM,OAAO;mBAAoB,GAAG;CAA4B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import SkeletonLoading from '@/components/general/skeleton-loading';
2
+ declare const _default: {
3
+ title: string;
4
+ component: typeof SkeletonLoading;
5
+ };
6
+ export default _default;
7
+ export declare const Default: () => import("react/jsx-runtime").JSX.Element;
8
+ export declare const InfiniteHang: {
9
+ (): import("react/jsx-runtime").JSX.Element;
10
+ play({ canvasElement }: {
11
+ canvasElement: HTMLElement;
12
+ }): Promise<void>;
13
+ };
14
+ //# sourceMappingURL=skeleton-loading.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton-loading.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/skeleton-loading.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,uCAAuC,CAAC;;;;;AAEpE,wBAAgF;AAEhF,eAAO,MAAM,OAAO,+CAA4B,CAAC;AAEjD,eAAO,MAAM,YAAY;;4BAQqB;QAAE,aAAa,EAAE,WAAW,CAAA;KAAE;CAF3E,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Skeleton } from '@/components/general/skeleton';
2
+ declare const _default: {
3
+ title: string;
4
+ component: typeof Skeleton;
5
+ };
6
+ export default _default;
7
+ export declare const Default: {
8
+ (): import("react/jsx-runtime").JSX.Element;
9
+ storyName: string;
10
+ };
11
+ export declare const Variants: {
12
+ (): import("react/jsx-runtime").JSX.Element;
13
+ storyName: string;
14
+ };
15
+ export declare const InfiniteHang: {
16
+ (): import("react/jsx-runtime").JSX.Element;
17
+ play({ canvasElement }: {
18
+ canvasElement: HTMLElement;
19
+ }): Promise<void>;
20
+ };
21
+ //# sourceMappingURL=skeleton.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/skeleton.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;;;;;AAEzD,wBAGE;AAEF,eAAO,MAAM,OAAO;;;CAA+B,CAAC;AAGpD,eAAO,MAAM,QAAQ;;;CAMpB,CAAC;AAOF,eAAO,MAAM,YAAY;;4BAoBqB;QAAE,aAAa,EAAE,WAAW,CAAA;KAAE;CAF3E,CAAC"}
@@ -0,0 +1,8 @@
1
+ declare const meta: {
2
+ readonly title: "General/Style Guide";
3
+ };
4
+ export default meta;
5
+ export declare const Default: {
6
+ render: (args: any) => import("react/jsx-runtime").JSX.Element;
7
+ };
8
+ //# sourceMappingURL=styleguide.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleguide.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/general/styleguide.stories.tsx"],"names":[],"mappings":"AAGA,QAAA,MAAM,IAAI;;CAEA,CAAC;AACX,eAAe,IAAI,CAAC;AAqBpB,eAAO,MAAM,OAAO;mBAAoB,GAAG;CAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=global-error.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-error.test.d.ts","sourceRoot":"","sources":["../../../src/tests/global-error.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=humanstxt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanstxt.test.d.ts","sourceRoot":"","sources":["../../../src/tests/humanstxt.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.test.d.ts","sourceRoot":"","sources":["../../../src/tests/sitemap.test.tsx"],"names":[],"mappings":""}
1
+ {"version":3,"file":"sitemap.test.d.ts","sourceRoot":"","sources":["../../../src/tests/sitemap.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skeleton-loading.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton-loading.test.d.ts","sourceRoot":"","sources":["../../../src/tests/skeleton-loading.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skeleton.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.test.d.ts","sourceRoot":"","sources":["../../../src/tests/skeleton.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=styleguide.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleguide.test.d.ts","sourceRoot":"","sources":["../../../src/tests/styleguide.test.tsx"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelated-tech/components",
3
- "version": "3.11.4",
3
+ "version": "3.11.6",
4
4
  "private": false,
5
5
  "author": {
6
6
  "name": "Pixelated Technologies",
@@ -149,7 +149,7 @@
149
149
  "eslint-plugin-react": "^7.37.4",
150
150
  "eslint-plugin-storybook": "^10.2.0",
151
151
  "file-loader": "^6.2.0",
152
- "happy-dom": "^20.3.7",
152
+ "happy-dom": "^20.3.9",
153
153
  "jsdom": "^27.4.0",
154
154
  "less-loader": "^12.3.0",
155
155
  "mini-css-extract-plugin": "^2.10.0",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=sitemap.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sitemap.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/components/general/sitemap.test.ts"],"names":[],"mappings":""}