@pixelated-tech/components 3.11.5 → 3.11.8

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 (65) hide show
  1. package/dist/components/general/global-error.js +2 -2
  2. package/dist/components/general/hero.css +20 -0
  3. package/dist/components/general/hero.js +13 -0
  4. package/dist/components/general/humanstxt.js +81 -0
  5. package/dist/components/general/styleguide.js +35 -0
  6. package/dist/components/integrations/loremipsum.js +125 -0
  7. package/dist/components/sitebuilder/form/formcomponents.js +0 -4
  8. package/dist/components/sitebuilder/form/formengine.js +17 -2
  9. package/dist/config/pixelated.config.json.enc +1 -1
  10. package/dist/index.js +6 -3
  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/scripts/release.sh +134 -94
  15. package/dist/scripts/zip-pixelated-theme.js +123 -0
  16. package/dist/types/components/general/global-error.d.ts +3 -3
  17. package/dist/types/components/general/global-error.d.ts.map +1 -1
  18. package/dist/types/components/general/hero.d.ts +13 -0
  19. package/dist/types/components/general/hero.d.ts.map +1 -0
  20. package/dist/types/components/general/humanstxt.d.ts +37 -0
  21. package/dist/types/components/general/humanstxt.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/components/integrations/loremipsum.d.ts +14 -0
  25. package/dist/types/components/integrations/loremipsum.d.ts.map +1 -0
  26. package/dist/types/components/sitebuilder/form/formcomponents.d.ts +1 -3
  27. package/dist/types/components/sitebuilder/form/formcomponents.d.ts.map +1 -1
  28. package/dist/types/components/sitebuilder/form/formengine.d.ts +2 -0
  29. package/dist/types/components/sitebuilder/form/formengine.d.ts.map +1 -1
  30. package/dist/types/components/sitebuilder/form/formtypes.d.ts +0 -28
  31. package/dist/types/components/sitebuilder/form/formtypes.d.ts.map +1 -1
  32. package/dist/types/components/sitebuilder/page/lib/componentGeneration.d.ts +2 -1
  33. package/dist/types/components/sitebuilder/page/lib/componentGeneration.d.ts.map +1 -1
  34. package/dist/types/components/sitebuilder/page/lib/propTypeIntrospection.d.ts +3 -2
  35. package/dist/types/components/sitebuilder/page/lib/propTypeIntrospection.d.ts.map +1 -1
  36. package/dist/types/components/sitebuilder/page/lib/types.d.ts +0 -7
  37. package/dist/types/components/sitebuilder/page/lib/types.d.ts.map +1 -1
  38. package/dist/types/index.d.ts +6 -3
  39. package/dist/types/index.server.d.ts +2 -0
  40. package/dist/types/scripts/zip-pixelated-theme.d.ts +10 -0
  41. package/dist/types/scripts/zip-pixelated-theme.d.ts.map +1 -0
  42. package/dist/types/stories/general/global-error.stories.d.ts +2 -2
  43. package/dist/types/stories/general/global-error.stories.d.ts.map +1 -1
  44. package/dist/types/stories/general/hero.stories.d.ts +43 -0
  45. package/dist/types/stories/general/hero.stories.d.ts.map +1 -0
  46. package/dist/types/stories/general/styleguide.stories.d.ts +8 -0
  47. package/dist/types/stories/general/styleguide.stories.d.ts.map +1 -0
  48. package/dist/types/stories/integrations/loremipsum.stories.d.ts +46 -0
  49. package/dist/types/stories/integrations/loremipsum.stories.d.ts.map +1 -0
  50. package/dist/types/tests/formcomponents.exports.test.d.ts +2 -0
  51. package/dist/types/tests/formcomponents.exports.test.d.ts.map +1 -0
  52. package/dist/types/tests/hero.test.d.ts +2 -0
  53. package/dist/types/tests/hero.test.d.ts.map +1 -0
  54. package/dist/types/tests/humanstxt.test.d.ts +2 -0
  55. package/dist/types/tests/humanstxt.test.d.ts.map +1 -0
  56. package/dist/types/tests/loremipsum.test.d.ts +2 -0
  57. package/dist/types/tests/loremipsum.test.d.ts.map +1 -0
  58. package/dist/types/tests/sitemap.test.d.ts.map +1 -1
  59. package/dist/types/tests/styleguide.test.d.ts +2 -0
  60. package/dist/types/tests/styleguide.test.d.ts.map +1 -0
  61. package/dist/types/tests/zip-pixelated-theme.test.d.ts +2 -0
  62. package/dist/types/tests/zip-pixelated-theme.test.d.ts.map +1 -0
  63. package/package.json +9 -8
  64. package/dist/types/tests/components/general/sitemap.test.d.ts +0 -2
  65. package/dist/types/tests/components/general/sitemap.test.d.ts.map +0 -1
@@ -3,13 +3,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import './global-error.css';
6
- GlobalError.propTypes = {
6
+ GlobalErrorUI.propTypes = {
7
7
  error: PropTypes.any,
8
8
  reset: PropTypes.func,
9
9
  siteInfo: PropTypes.object,
10
10
  className: PropTypes.string,
11
11
  };
12
- export function GlobalError({ error = null, reset, siteInfo, className = '' }) {
12
+ export function GlobalErrorUI({ error = null, reset, siteInfo, className = '' }) {
13
13
  const [showDetails, setShowDetails] = useState(false);
14
14
  const si = siteInfo;
15
15
  const contactHref = typeof si?.email === 'string'
@@ -0,0 +1,20 @@
1
+
2
+ .hero {
3
+ width: 100%;
4
+ height: 60vh;
5
+ display: flex;
6
+ flex-direction: column;
7
+ justify-content: center;
8
+ align-items: center;
9
+ margin-bottom: 30px;
10
+ overflow: hidden;
11
+ /* Background image styles */
12
+ background-position: center;
13
+ background-repeat: no-repeat;
14
+ background-size: cover;
15
+ }
16
+
17
+ .hero.anchored {
18
+ /* Create the parallax scrolling effect */
19
+ background-attachment: fixed;
20
+ }
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import PropTypes from 'prop-types';
3
+ import "./hero.css";
4
+ Hero.propTypes = {
5
+ img: PropTypes.string.isRequired,
6
+ // imgAlt: PropTypes.string.isRequired,
7
+ variant: PropTypes.oneOf(['static', 'anchored']),
8
+ height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
9
+ children: PropTypes.node,
10
+ };
11
+ export function Hero({ img, /* imgAlt, */ variant = 'static', height = '60vh', children }) {
12
+ return (_jsx(_Fragment, { children: _jsx("div", { className: "hero" + (variant ? " " + variant : ''), style: { backgroundImage: `url(${img})`, height: height ?? '60vh' }, children: children }) }));
13
+ }
@@ -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,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
+ }
@@ -0,0 +1,125 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect, useState } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import { usePixelatedConfig } from '@/components/config/config.client';
6
+ const debug = false;
7
+ LoremIpsum.propTypes = {
8
+ paragraphs: PropTypes.number,
9
+ seed: PropTypes.string,
10
+ proxyBase: PropTypes.string,
11
+ className: PropTypes.string,
12
+ };
13
+ export function LoremIpsum({ paragraphs = 1, seed = '', proxyBase, className = '' }) {
14
+ const config = usePixelatedConfig();
15
+ // Prefer the global proxy from the app/config provider when present —
16
+ // that ensures Storybook and in-browser environments use the site-wide proxy
17
+ // instead of a per-call `proxyBase` (per user request).
18
+ const resolvedProxy = config?.global?.proxyUrl || proxyBase || undefined;
19
+ const [items, setItems] = useState(null);
20
+ const [error, setError] = useState(null);
21
+ useEffect(() => {
22
+ const controller = new AbortController();
23
+ const apiUrl = new URL('https://lorem-api.com/api/lorem');
24
+ apiUrl.searchParams.set('paragraphs', String(paragraphs));
25
+ if (seed)
26
+ apiUrl.searchParams.set('seed', String(seed));
27
+ const tryFetch = async (url) => {
28
+ const res = await fetch(url, { signal: controller.signal });
29
+ if (!res.ok)
30
+ throw new Error(`fetch failed: ${res.status}`);
31
+ return res;
32
+ };
33
+ (async () => {
34
+ setItems(null);
35
+ setError(null);
36
+ try {
37
+ // First attempt: direct fetch
38
+ let res;
39
+ try {
40
+ res = await tryFetch(apiUrl.toString());
41
+ if (debug)
42
+ console.log('LoremIpsum: fetched directly', res);
43
+ }
44
+ catch (err) {
45
+ // If CORS/network error and we have a proxy, retry via proxy
46
+ if (resolvedProxy) {
47
+ const proxied = `${resolvedProxy}${encodeURIComponent(apiUrl.toString())}`;
48
+ res = await tryFetch(proxied);
49
+ if (debug)
50
+ console.log('LoremIpsum: fetched via proxy', res);
51
+ }
52
+ else {
53
+ throw err;
54
+ }
55
+ }
56
+ // Read response as text to avoid "body stream already read" errors,
57
+ // then attempt to parse JSON; otherwise treat as plaintext.
58
+ const txt = await res.text();
59
+ try {
60
+ const parsed = JSON.parse(txt);
61
+ if (Array.isArray(parsed)) {
62
+ if (debug)
63
+ console.log('LoremIpsum: parsed array', parsed);
64
+ const newItems = parsed.map(String);
65
+ if (debug)
66
+ console.log('LoremIpsum: setting items', newItems);
67
+ setItems(newItems);
68
+ return;
69
+ }
70
+ // JSON string literal containing paragraphs -> split
71
+ if (typeof parsed === 'string') {
72
+ if (debug)
73
+ console.log('LoremIpsum: parsed json string', parsed);
74
+ const newItems = parsed.split(/\n+/).map((s) => s.trim()).filter(Boolean);
75
+ if (debug)
76
+ console.log('LoremIpsum: setting items', newItems);
77
+ setItems(newItems);
78
+ return;
79
+ }
80
+ if (parsed && Array.isArray(parsed.paragraphs)) {
81
+ if (debug)
82
+ console.log('LoremIpsum: parsed object with paragraphs', parsed);
83
+ const newItems = parsed.paragraphs.map(String);
84
+ if (debug)
85
+ console.log('LoremIpsum: setting items', newItems);
86
+ setItems(newItems);
87
+ return;
88
+ }
89
+ // object with `text` property
90
+ if (parsed && typeof parsed.text === 'string') {
91
+ if (debug)
92
+ console.log('LoremIpsum: parsed object with text property', parsed);
93
+ const newItems = parsed.text.split(/\n+/).map((s) => s.trim()).filter(Boolean);
94
+ if (debug)
95
+ console.log('LoremIpsum: setting items', newItems);
96
+ setItems(newItems);
97
+ return;
98
+ }
99
+ // fallback: stringify into single paragraph
100
+ setItems([String(parsed)]);
101
+ }
102
+ catch (_) {
103
+ if (debug)
104
+ console.log('LoremIpsum: parsed plaintext', txt);
105
+ const newItems = txt.split(/\n+/).map((s) => s.trim()).filter(Boolean);
106
+ if (debug)
107
+ console.log('LoremIpsum: setting items', newItems);
108
+ setItems(newItems);
109
+ return;
110
+ }
111
+ }
112
+ catch (err) {
113
+ if (err?.name === 'AbortError')
114
+ return;
115
+ setError(err?.message ?? 'Unable to load placeholder text.');
116
+ }
117
+ })();
118
+ return () => controller.abort();
119
+ }, [paragraphs, seed, resolvedProxy]);
120
+ if (error)
121
+ return _jsx("div", { className: `loremipsum ${className}`, "aria-live": "polite", children: error });
122
+ if (!items)
123
+ return _jsx("div", { className: `loremipsum ${className}`, children: "Loading\u2026" });
124
+ return (_jsx("div", { className: `loremipsum ${className}`, children: items.map((p, i) => (_jsx("p", { children: p }, i))) }));
125
+ }
@@ -5,8 +5,6 @@ import PropTypes from "prop-types";
5
5
  import { validateField } from "./formvalidator";
6
6
  import { useFormValidation } from "./formvalidator";
7
7
  import * as FVF from "./formfieldvalidations";
8
- import { FontSelector } from "../config/FontSelector";
9
- import { CompoundFontSelector } from "../config/CompoundFontSelector";
10
8
  import "./form.css";
11
9
  /*
12
10
  InferProps to generate Types
@@ -494,5 +492,3 @@ export function FormHoneypot({ id = "winnie", name }) {
494
492
  };
495
493
  return (_jsx(FormInput, { ...hpProps }));
496
494
  }
497
- // Re-export FontSelector for use in forms
498
- export { FontSelector, CompoundFontSelector };
@@ -2,9 +2,17 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import React from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import * as FC from './formcomponents';
6
5
  import { generateKey } from './formutils';
7
6
  import { FormValidationProvider, useFormValidation } from './formvalidator';
7
+ import * as FC from './formcomponents';
8
+ import { CompoundFontSelector } from '../config/CompoundFontSelector';
9
+ import { FontSelector } from '../config/FontSelector';
10
+ // Merge a local components map to include config-level components without re-exporting them
11
+ export const COMPONENTS = {
12
+ ...FC,
13
+ CompoundFontSelector,
14
+ FontSelector,
15
+ };
8
16
  const debug = false;
9
17
  /* ===== FORM ENGINE =====
10
18
  Generate all the elements to display a form */
@@ -18,6 +26,13 @@ FormEngine.propTypes = {
18
26
  export function FormEngine(props) {
19
27
  return (_jsx(FormValidationProvider, { children: _jsx(FormEngineInner, { ...props }) }));
20
28
  }
29
+ FormEngineInner.propTypes = {
30
+ name: PropTypes.string,
31
+ id: PropTypes.string,
32
+ method: PropTypes.string,
33
+ onSubmitHandler: PropTypes.func,
34
+ formData: PropTypes.object.isRequired
35
+ };
21
36
  function FormEngineInner(props) {
22
37
  const { validateAllFields } = useFormValidation();
23
38
  function generateFormProps(props) {
@@ -63,7 +78,7 @@ function FormEngineInner(props) {
63
78
  }
64
79
  });
65
80
  const componentName = thisField.component;
66
- const newElementType = FC[componentName];
81
+ const newElementType = COMPONENTS[componentName];
67
82
  const newElement = React.createElement(newElementType, newProps);
68
83
  newFields.push(newElement);
69
84
  }
@@ -1 +1 @@
1
- pxl:v1:d8ee214a9235b0be63c1821f:99ee9079e869f46bcd02f78dfa428019:e1ee34f0c4412ca17d6c39343bea8c728534cc8de7bdfc3881e5b3dfddd093e89ed1ff5de7164220d66cf8dd200451049ce1f2f111d77beb13ce2bdbbe3780579d9399c71f480cd50bfc8ee4c5223c9f86dee4641583d8f7441a58f9fc394dda8249f03f0e26658ddb9aa43ba0512465d73c1457369d2106f6449aa271e4058473083e442b09d62932a1106bfffab15a2e12f181a71ffcd9046eb66e3b63ee2dae496cea8bd867fb41c4030b48d0c5cfb9c9e395ee4c9683d5060e6a559d0721ffa33acf5913ef86d427b1efecfafb5812e97ed98e76599bae1081558969e93ed29ad7f80571016e5cda51f27ff33555d35746fa4906e986ca02f634d64fafb104ea988a3fb300eba00bb1f3924b513f1a4dd251b5959032935bd1f30d43a6f31fdd1c9535f1a5960de7594680a6a244f35dc97514acafa4b3fbb35ed74408a1efa705ce75dcd9c2d308d5fceee6e9aa8fffdd15ae2af99b0a4b2b9434f0e262d6a79dd49f78bacfbaaf977de083beeb1fef29763a191d4727f993425c79d88dfee3cae8d8b147be860dba0724afa66451568a688b2debcf4222164ee5ac7cc2d556a363a821f07ab309b22d9dbeb2116335193be4da5703f34498c743a58a7d8dd80b450123aec0ada689aed8985b9dacf5ac3c6d5f972ea85996fcb3d79d0a2911c30b91ea879b9c1af57c57d52103fa61653f107aeeb97845cdb70314812e6a4cc8b5d2e0042234c31415cb348ee6a0f3fb946029d574eec7ffc857e272dd9f43820f93341330a20bcc71e39e0a936878dcce4131afea923d734f3f6ffefe56574b9ec8829880bd4ebe1859acf0f9a2df770ec6c4ed11d8a0904c5fa5ee6fe3ed10ec3542ea067ecc3a604cd16171564f85403cac6929c9c00f40b298748fdca9de517dbbf3b824e364556a7d7d83dd02370830acd09205730f033ce30bcfd0ff700dcaf821898b61af59a584db14cd6e456ea872acbde4d5e26dee0c841b662b5989f41c32a7efa34ae343049885e8613ff5100191b64c9b55030f512ca33d838495f29df1d9e3c69308ee64b9be0a431c5c4aa3c16bfdbcf965fa156cdc444595d054e6a8b03aa0a1292952853ff0524b8e2b7daac711897d1a34dff463655062642cdea65355f396aebb7017e0df6abc08982400c25941860591b6aef62e50da0e1f8266b8dea211c53ac0cf4ed0fd09a96300468702d3fb4d947558b921dfd84c46470c0a24f321e9a6e42941ee47bf3e99bf5dd2db66d1cfb70b9bac3ab6172671e3ee958a06e0f14ac8f5baa4d3794354e8900970afed3bb31055d0ab37c2f33a5c3f14739c171adc05eaaf7d74d11c63cc7cb3a50bca0ceceb61e2d84e598d610f907cbd381156e88c85031e80922ea10b39342468a6b7988157693fd0368ffd7e7154674b57b421b7f7addc976675dca1c7809a69de056a05ea849b6a360b1baae80c3ec43b173d3b4671874bc89cae36dd836ac4450c5fce613734505e6cb562c8e9db423cd1643bfcefccacdfd6a3a84f1dadab3e29343fcf60d23c29dade0190abd814d0077f9eae50783485a1644355bef3b43fc5fdab3a3d0b1b7aad074cffa3ad7b141e20051167c0b26ea87e98b8502868d702800a02c551af66abbc547faccebef188841e8bb27bf83f641a0c0ba61009caf64fe3bdaa86759d2176af9cab61d73b945a31252bd6438f1ed98fe82161a4fe94f7594d466bab3c55e89ff46d8765ff2b89a8ccc93f16efd6a4de5ddb369454d3d92f0a20ca17c9beda1e09b6f2078c4fa8e736e367fe0b38158fa3f10b441d5b094ca4a2e0cb3a37705dcb13cf8b0ff3afd80dfb077e66233486d85478b47db9b5b5bb2d12d0ad4db37962985ccbf9149326d8189215683342003a191ebb40661666b729a3146ff115a5b2a960d38734eba2d8e2f88e0897728b858ee6eb4f3eba61934d810bb02bf8bbd315a12332259bb0829570a04e902a4cd31a65d5583ddeeef27559ca2788890c612573e243a88cce49ae8cee782c7a3c5999b8cda409003460d8651b5e7d8be0dc94f6762d9b240e7c35cfa8645ccc1b13e16277b6616eed9175ab686ccafd7d84c73fd3e8a57c3ad23bd4b4e1601fd70827c3f74e0a6e8bef4844a21750a2d43b75c1af051bfb127c491578d86e27dcc284b86feab6669178a3500513ebfc0e8e057a9387f4629dfc6f4ff96f0ea22a3b43d851251d5f6d5b6f76052665d3fe698201df361477498307cdab07710e677e1180fe092ca763d397ff872f2d8dca515fd6d32f7d26c967d3d771c880f6a4691207074848450f8608f126d1d58d9f17cc10891098d304d311fd5618663e91e6e90dfe06322f078052a0da01313f929279e05057970bd653408a6418b8672efd3f9fc6d5ff2963738f25645bcade30ea79a96c4290c1e9c700e26587a2e02ad1ae91303e003814db7c38c04111bb5becd16601ef144012d8693f0577191176752de57a7c07e129325605d7249c75a71639b4a62cdc52148a97c0d4e6c1bfc5fa8f2890671f267c9249c91154db401f28b764c4ae3245a4c70e6b5a38167a323a2411786dcf82aa4209dc61aa9f16f10c7fe62a337e96d8c49c8b8244f0a2225bfffd5d9e61b9407815e73be43506787514fcb78d56719485ac6a4033ac0e817de79bb29b36d203a2a30c0e2c82345efc607e199629ca10d8b5a0e6d53c414e2afcf82946848122de0a62d484f2e1e21d1e1f491f2c9d407ac6c359f4d76dad00f75b787841c9db1793aa57cf1d336a882756f2b551dc8c88ce721ec1cdd8174d277736b27ddea9fcbf8fa26e182f2bcc5746621216c2474cba743029ab72faa45cfec71196054dc157d80a306cbe8e23882974cc5e5e473a5a0bb184535d35bbd8bbc765b673642886531b7c51228dac55f4573ccf9c2705ce566959f18a0fdb017556b0a7b33c9b2a1ea58816067f1b1627f872326e0e5da25f2fba26ef1091d86ffb0fbe95dab442d7a605d9bb49f49ad03154ef1e563385051776cb0bc6546a07b5118eced0684a215231df3e65c7818d2ee88e19c7ba5e39ecb7bf1b511214ac1f9394ebf76278014df1044068e33ddffc7db9cb2ed779b399a041e8f21624e55099a556158b12a18e91e8cad8ffab836d28ee19df9d5aabbd8fe18f25f6447eeaab2537122275ba0a049ee25038c61aff6182df6bda1d8b7ee4bb6772cf70cadeed09d94a341851453dd43f4b8e8c368be52be2e7d56c80d67979623ba8d109ca83f617457a11c780884c71ffe250a3160a2f4b4e8dd6cc96127c21839f6a549735f7d0878ebfdc312794120cfcd09e3ec69358e8c0b5e0638e067f45af974ca4526c23578f24f22b624ec7acad116affbf893052960d4a2bc5a7b372a1fdc0336500313bbe067beaa6cb58aa3c962a6b19f02449ea5f5f9f93b16aef64d93ed6a34e387b70167d9bb01dec55d03610ed790b54bc29075b3902348b8f7dff56abbeef88b1c8c74554fe84fbe370640c580306570173b2efaa740c7d39b86977ce890d1e626706ebbdd6bede3c4d347b3ab85c863eb7aa35c802a8267c1c8835e2eadb0d0858fb5740945bf45635b69fed7474db273b470cc0cc8c73137c654ecd1c2057f9c235303097b3731ff37dd6db7d2846d495f2fdb7f7e510cb718799a972b17855ef4cef1497e79f08309280985a99f91d4611984184bf4a9be5b05568d4e88a4aadf3a75be76067d1c52db6128a17dd628d92f45732f9c9b1a0e7aff9840aeba6bbf3c37af8004827056ca28acfb15ac7e32f58e82e9f0b87bc35d138659938f4cb2fc8d359982fc76233a7a27364b0d12ffe7a9f58fa50dc6428c5244d77a8f314c2a568b9dadc031576699ad2e4a633ab4a657f29c99439a7f3af2a08c850d2d60262ceb0f2023b93c352170188260c1d95a34b00ac901b2d34b4f251d569063e4a561539bbfde32c1a2586cb380817a2cf1c9950547c7fa199949de50f0cd80e810345a9383b1df6d9ac63d5ffff8f07e095ef3beddd9a3b175961c1056f247d905b609b7b1de6bf1aec79df4e0b04935b54631ce40f89b4718dff91e969c1307a21242eed79da0d8f7094d66c4c5303ad9022d9f2432439285f1b08fd82e56ba8740c6fcdc26a8179886e0679216e088b89f8baae5c6c738f87282d351a6a86da1c9ca99973ef797c1100fdd8f0dad238a24f107a34b63ed5bd0ecd9f7d0c46f016bc4ea777d189b3b92af311882103fcdd818c58ae2ca5cbcf590b307bbcccf19fb0009e5aba10e8d8db859eddd26a11b1f89faff0fb832092061651a5919cae7586eb8e6ea7b3e8ce8f7e7cab30b425b788e8290cb899d08633077cefa37c65ce4a6b19462d9353548c4fcbb6b9841a22763ae479ebd1028fc34e7cbdf782cd59d6d94404cb32903b262feb084ee942b14e5d4d1a1dd9b36054d7db60553c27c9188d0f5024425462eea0af3fed59cf1ba37105ec31f792fe716562636ca3ef9f5ac98896e3300ff1b130a1c53da4d1fa67f600bd671278adfbca42e0b341e0a195790432d738e1cbdbcd45e8255ea63bc28e4911f55382eceb15673be67f6cdf4bc159c8eba7809c14592d3531c0118a565bd96e8e3822cf77734944d0e245daf83f74aa86e2bc8d9d1ddc35482b131ae8b11e3874f4647457bdfbfc5f2328141917386d187ed75f99a305acddf54a60a687cf9b0600e240412b4ed812759339dd300f5a77ff670c1f3be96dcf0a03183eb9d0bcfce273c913a291802326d0e25de9454543565798537866fb286adf9c37837c17a29a518ce816974156c770707d92d81dfaf7002716051c4372735c775b98bb92bcaef8ae5de7859e82e4593985b991a623d9f54c54458d5ae2339bef432d6a249edf3ad369a378dec7263c9374bcdb9281eaa80d38fb6a663d077e910eec1e471ceb88ce6fce4a022a5db1a3a367baf9c452d207a3c10c2862a98a741ad5038a22a5490e68ad323b5d582e792eb959bf2cee6874ad3c531770ae446727d0d3a4b931a423d971324fbed9d952d2ba9849b940cc3df8189c9795b42dd8f96b956e718ceb2fa99fe6f4a456644108fed7e649f8935f0f4fe273477e91b2ea2b80e5ca1bcc5fcfe54c9ba5653e83ebe11988b54865e41a85f0ecd00de756ae02f6731dc38eedf9f195d07178ea3a133e050207e02ba5662123
1
+ pxl:v1:f137cd9910c1845e60779ee1:40e9d679351a8e443af6934ef5c886a7:6f74f57915504ddf50fa5541cd3170b0e6b3f7d6eba7c867d45c74f999ff14199e4bc43273ffd14afe56bb6e47bd33ac3f02d961e745a3c43206e1e50afd34baf4381bd2fa16d5583db56955b033fd701d89ea55891b3b99420529d6cba88fbee1028effa2670071a9a7251fc3a46ec89f0e620ed7f1579564c9ddf4b4be42de9a5c29ec8c1791d03beae59f1689dbc71b9c772f7777d6595f16bed4c534ac9f71e43db93945473d680fa9f1913fa4975ec6697c4c4ec75122166dfad4312a26a29c5c209c24290f9a231fd55b3a52e97a69d8fc8a3b2a8f3441729c775d7ec637a7b78d493e80de51e40545f698dc357fc84b64fffa40e58ef1b87b873b9d81cab6ddaddde0e8ff1cea3d42c08183197ab296514d10e39675b98a0cb77c000d7f4369b5581e527d3eaac9a30846149d326b7bf796575511d59897ce518742243342e7cdd74030cc53ba2618620cb8459c34775fb8e033e34af13d54f86ccbee41d920d401262a50f8c364bd474a5f6064c19a5ba1cd2f05579e09bede8aafccd5b4667ff5601c750154361cd4888b6976c57b1b70362b42486ba316d3d0012fc339931c5fa675ec2a2dc426d0d061ae72f9a9bd4e51803072fd68c3ce696b2b7e6ee88d0962cc96a7633b332c0216f064c5a41335e8eb06179215c55e50efadefa4b82b88d30eebdbe002ff8bf9cfb7b43c0464d25cd9818fbceffb510830c611c8fc995fc15ab7ccd4a64f315608de512ad5ae7bdafcdac7534f29c3d0c9ca84efda9dd499ff29300164416ce9dbad92843feed5b6542c4cdac31b304fcf4fb1b47ebc176483f06c472d31ad7a5f0a8f685283c003049d4f0d79c116c378ea45c0d6d508634d8c478b67ac3b635753eed230a31e201dfde794bcac94719eda799bef296bf45bdf02df543fc446ba0c21401c5233ef06d3015048f9593d82ffb2efc552d0b5f4bc43e4eb5f5b63d3d246a5c3cbd243c070b709900eb8765dac652f82f247fc08a1bcd3285cec825092823dd7a0808ad98e8e784bbfe661c585d1d9b155c243b835bb2d7537273c0cc5391814d6fb7191ed61361c459938c4e94c67567f35af45549a26d4f66735ab4c33951440019f6255638a0550f315a0646f08455ebab6285b27e6b6f4dc35bcb8593746a835ba974c1e97d22b89a6f3ec381333b8d837bf736044096fffff71d5f46cae0087e62b85d0f5487234e75861aaead50467fb2937adc8e87f80abd14fba348ca1abd781391e42786817d9c8fad10eb3eabccfa8caa66da1a97a867314858bb1888f31729032dbe04ec29f74941420dab94fa9601817274cf448c6f60a29856c0d6bead4a8ee49fb5bfdb7aea2507df5244c7a33c1825b36698b9dce47ef27978824eb8a40ad1810731af5e59694e7f20a3dfab5224e2dbf28946b686d067e57434d6d1929e834083ef9e2c31630c6d16cc7ebdf1528a088b445bf7dda1e99450dcaf2cd3098509f79fe342aeb641616aafa0ec0c76d98f77a05e30eac31c03af1ab03c4d11614d0fcff839c78ddaba90ef57b9fc26c8504e983b89d49947c553200f78761cdf81137bab582604102f461f1b8cbfab046a041b6d7c31c19bbc56d8e700b8d7bd174d0b13dae6d10f5d18d3e9be7830928fd2c9b3b8820b17e13098688af9e0a95a740e1990018fde07666d3afb08e4d0b7a31347160c5c7f6522e928e3faab283f8e09a5202e3b46c659a933e088996b74627947a73c243609e6b83f09dbc7e9240dccc4e1611a90157f7fc57c29eca02346b95abbca18140524810c15648b825e56356a788cad13ec5cd58b711905eaeaf46f6ea4801ca5767688e38b5ae72f1d78846f5e3092f0f20953b78c6aa170910ba11e5c4598d26c72c2162eff8c72c88d21fb3d298b839dcb19a6ab7dc00f72d3063f2d14c6db5b17b947b412a614a48945c26651f450819a5553b8bfa4e05a60f0643f24bd8f6af2276ff525974d8f0a2a5cbdfd9f1a8acfd7e65247b36409a8eae0e4ba692bbbd3741d91ebaf038ac7a83370ab92559636f19a0a30a4a7f5b8400ca7667087fad32f9193a71c4b8e251b7fd0a7236ba15fed5c615f48b05c731cc813bcf5c9084b46f2b98b73403fd216cc7d5ed1e257280928d988ba4f6a7caaa24e85d8a91ce04cfab67074d6f932cfd7516a68487a4b87ec0562bf751c957679f9db7131c5d196dcf45bdab2a703abf36684731cc6b21f5d4fcbc41e87152713fd3ae3b2c05df87b56962a70e6b2a74ce1c6fc5a7494c3e8ba7df8265a6d30208ced926866c0d4817dc73919bd3c593cc465d58db9e2b1e236b2324c5cfe0e5b7715b86f7614866d5d57ff087dc4ab98173ef6e0dc6d63e20e6eb9fa14a9a486c82674801d548f343727f6fbb750cbdd0ddd209b66d57f7e90c095711aec08e2726b1f2b4424eed4b5eae98eae0e699ed3d2241509f9f91be55ba4ba00e749e5dd38182eb14186ccb971468923174307a5c27163309d1485ca41c9efb43be7fea00e79e527de999bcd08fdb3880f7cedabd7ec4eb10cc08545113a5b072e92ed9b117e39c37a6250945ced7fe8b185698c1634fe1926b84476a2681e2313f3854fd386c83cf626d8f1dd4618377c057895faaad7a752a7cc4c9a00134590561318ea3bbe927aac53db4f8b4b16a96ee8cd0d14f020b5507698ec38873079eb3e4183c2fe2f515ff53e12260c53d64fd5baf1539fa8e42086e1e1b2d9c71979cc3a696444c0f9331241bfacf0e2b662b7d304501a8a08dcab08aff5c2bc01eb86fcf33ad3509418bd9b9ee9c0d2090b8564ba2d94939b3ab81b3f970c79f7a96f5d700bc6da1ea1708557571d9dc31264b25007892a60121517be78f67b58b8a5c0f8192e01414e51a58b238eae33f5b89b5c133a2dea6c1d680a7610c413e3957367db85a5a7d462b479bf0ad36f3cf3121cbe4b33980f905971ba4f99e5c9f9b1ee586ed4845766d13099c64c8b4076ec990da4a7698df6f8247c4026036c560d1390c15c81e6c92894d65da4c7a1a1e5d0a97445ceddca9a40d4158a3b3fe19fc83eec97bd4931a24db79716a3545c83221e797581634ec563cfecdcc86e1285c687bf22db55ba18b2336078cc8926bedd2c703f91da4bcec61311c69e9e8ede3e419eab17b71175cdb8c140901c0f08d496c91956bc7ee52efa28a60f46225e883200266a72df1a1ab2b29bac0a80153e16bb6aba7455328c98dfc20852e22632ca72e7463d40ec62cd2a35f4e37c771f8ce8baf2a5ac8a96e835eca8f9f608a5055f5001f5e5ff812b9ca437bcc5d0fbd352ba143787e32b1cf7595c45d309d9ebd3fcb38eaad4b2420be02c84712d7b4795d6a48b59e911ac18004498e0b2c8aaf5797d912b7219f5339b5a452e35206f394bb2856765b4ae87ff5bff84eeff5ae93092d473f7203a1d2d0e302be676afb416721427055f252b32f94f0dfe5cef546c3ee26e64bce651f827f7df4527c73e63803ccbf08dbe0f73b7ea0ec475a7818a8ca508bdd62f44eb3b05301eb2fa7551e8e006caddb934dc0bd21326840e3e393f16c7af48ed4313d2c98e1e40379bee95671d0804567db426ed3274172cc67227da35d6bd3fe8eb51e3bfa4c7658724db2dd0be6f9ffbd6f981c6dcff96fac311f1a6284e4c6aa4f8a6a7d9cc0d8b94b1f8b2c5e8e2d7ce12a0bf19d85409150d341cca7c7c67ab09ae70f6be8613daa2a37fd332aa010c38968fc6d5d0661b991dbd6952894c476c7ff94fe53ac089f42b1cb3a35e2f64eac918e3f64303ce964055ee290efa99cdfbb8d835b157b79b0f0e7c8ac971bd771552c19fde00d972d36658e6c49ee5a8a0c0faab9a00743ccec21fc9ee83e0faa8c8e62d44f924cc308b38324b0a6c4368c5f4f7311fec7b56ad207b057790819eff0b3f257391193a3cf02c3a64e602ecca7c09d3063ef64f36c859ab9cfe067644e6994c2bb0a4256b59868672c8d25d982fcdde837be4342ae5d14e93258121ccc1b9ea09d805e371a8924eac5ec1ba80b920bc5c9955c9f5d4b430496e986269df1add3073883c9ab3cf2a879140d07c1732bfcc69eab559c9b3e322ec9a7831df0e3a98e2415125c9b7ddead5c511508ad7cb7424a542b8090a0bfd375c15ff74cc0c3b67d475c93ab3dae5ea1a95b79a7e193a8b1d5daec5801c03586b6601739c5021e26c6d794923a874d30d95afbda63b53fcabfc0ee84cc561f4f26e005622803588700ba1874c0bb5671b1afff1316c574c7ec18c684dc0d3b19f48487fd228d22ad65e0713064a2c460a7a4aacc527ab7bd9e970bc8cd1081ad790fc832a24ad2be6751df118eb63070be35bb6e90b4e0d77ed8df64df6b8969b7a3d2494188664859288331fe5ab8ed0a57b5f31edf2d36e0b29d378edfb03ee7dd5f34836ebca52fa6475e4a768f601d280e4405a95b36047c949c773230cad57483fe0179d1f043189ccccaf09285125e22bd3469a3cdfe2415e5e85166972a7f0e1af6f186f674ca83881fc056fcedeebdd10c945aec415df868ef5ddde2079bbf7d2dd475ee9acaef2a451e072744106bc77816470a4b0be192dc5838a609865446beccfb199987c9c6075462ee7e0b19c363373d3fd7eb4bd41fcbcd675688638756c5048a728da5d445b6ca3ee8bdd955f907113b49520462e58b0e19f71fecd0268130b66e4fefc06fe91dedbad5e4dbb372df38a64831762db0af416f7387e42c95017e4c81b0ffc6866133004fe246cc2d258fe248eec407d9da50641e7ac2d4a7011d8a0bcd1956dad17d5c1a82dea06d2fb60a758b4667a5406f4ef9d1e09ead1461440ebccae7d018b7ee3645c774410ca1e756f1a58ce92c40725d4728ef86075018e3fbed6498b1aea0523ccfe17fe085ce8e7592801298c5497709944e9e50de07acf1bbea8ca557c0f37871d1486e7854a8aadc24e88da93e39ddd0df6846aef069eefcb5bcfd69d94bb2cd1fc1931672ccd480034813019f84746036c3f1787103ef64f0e9f4742f282fce9da08498b1da936011f2df5a72769a246a67b015d632ce7f074196a61a2d9d621ffa81b8b86e5a5c98f5a7821d7c6c3501bf5b68aa3c9d26975c6aae119d83c46ac636f7fd53edf5a2248d4fdff95fec94613450bc4096b9fc9c8488a60013a18e676fabc6520c8367f6fc40c4
package/dist/index.js CHANGED
@@ -12,12 +12,10 @@ export * from './components/general/carousel';
12
12
  export * from './components/general/carousel.drag';
13
13
  export * from './components/general/css';
14
14
  export * from './components/general/faq-accordion';
15
+ export * from './components/general/hero';
15
16
  export * from './components/general/image';
16
17
  export * from './components/general/intersection-observer';
17
18
  export * from './components/general/loading';
18
- export * from './components/general/skeleton';
19
- export * from './components/general/skeleton-loading';
20
- export * from './components/general/splitscroll';
21
19
  export * from './components/general/manifest';
22
20
  export * from './components/general/markdown';
23
21
  export * from './components/general/menu-accordion';
@@ -41,7 +39,11 @@ export * from './components/general/schema-website';
41
39
  export * from './components/general/semantic';
42
40
  export * from './components/general/sidepanel';
43
41
  export * from './components/general/sitemap';
42
+ export * from './components/general/skeleton';
43
+ export * from './components/general/skeleton-loading';
44
44
  export * from './components/general/smartimage';
45
+ export * from './components/general/splitscroll';
46
+ export * from './components/general/styleguide';
45
47
  export * from './components/general/global-error';
46
48
  export * from './components/general/tab';
47
49
  export * from './components/general/table';
@@ -49,6 +51,7 @@ export * from './components/general/tiles';
49
51
  export * from './components/general/timeline';
50
52
  export * from './components/integrations/calendly';
51
53
  export * from './components/integrations/cloudinary';
54
+ export * from './components/integrations/loremipsum';
52
55
  export * from './components/integrations/contentful.delivery';
53
56
  export * from './components/integrations/contentful.items.components';
54
57
  export * from './components/integrations/contentful.management';
@@ -10,6 +10,7 @@ export * from './components/config/config.utils';
10
10
  export * from './components/config/config.validators';
11
11
  export * from './components/config/crypto';
12
12
  export * from './components/general/manifest';
13
+ export * from './components/general/hero';
13
14
  export * from './components/general/metadata.functions';
14
15
  export * from './components/general/proxy-handler';
15
16
  export * from './components/general/resume';
@@ -21,6 +22,7 @@ export * from './components/general/schema-recipe';
21
22
  export * from './components/general/schema-services';
22
23
  export * from './components/general/schema-website';
23
24
  export * from './components/general/sitemap';
25
+ export * from './components/general/humanstxt';
24
26
  export * from './components/general/utilities';
25
27
  export * from './components/general/skeleton';
26
28
  export * from './components/integrations/contentful.delivery';
@@ -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
  }