@pixelated-tech/components 3.9.12 ā 3.9.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/general/callout.js +0 -1
- package/dist/components/general/markdown.js +0 -1
- package/dist/components/general/recipe.js +0 -1
- package/dist/components/integrations/contentful.items.components.js +0 -1
- package/dist/components/integrations/socialcard.js +0 -12
- package/dist/components/shoppingcart/ebay.components.js +0 -1
- package/dist/components/shoppingcart/shoppingcart.components.js +1 -3
- package/dist/config/pixelated.config.json.enc +1 -1
- package/dist/scripts/build.sh +21 -8
- package/dist/scripts/create-pixelated-app-template-mapper.js +80 -0
- package/dist/scripts/create-pixelated-app.js +471 -0
- package/dist/scripts/create-pixelated-app.json +32 -0
- package/dist/scripts/release.sh +23 -3
- package/dist/types/components/general/404.d.ts.map +1 -1
- package/dist/types/components/general/callout.d.ts.map +1 -1
- package/dist/types/components/general/markdown.d.ts.map +1 -1
- package/dist/types/components/general/menu-accordion.d.ts.map +1 -1
- package/dist/types/components/general/recipe.d.ts.map +1 -1
- package/dist/types/components/general/resume.d.ts.map +1 -1
- package/dist/types/components/general/timeline.d.ts.map +1 -1
- package/dist/types/components/integrations/contentful.items.components.d.ts.map +1 -1
- package/dist/types/components/integrations/socialcard.d.ts.map +1 -1
- package/dist/types/components/integrations/wordpress.components.d.ts.map +1 -1
- package/dist/types/components/shoppingcart/ebay.components.d.ts.map +1 -1
- package/dist/types/components/shoppingcart/shoppingcart.components.d.ts.map +1 -1
- package/dist/types/scripts/create-pixelated-app-template-mapper.d.ts +5 -0
- package/dist/types/scripts/create-pixelated-app-template-mapper.d.ts.map +1 -0
- package/dist/types/scripts/create-pixelated-app.d.ts +12 -0
- package/dist/types/scripts/create-pixelated-app.d.ts.map +1 -0
- package/dist/types/tests/config-vault.test.d.ts +2 -0
- package/dist/types/tests/config-vault.test.d.ts.map +1 -0
- package/dist/types/tests/create-pixelated-app-template-mapper.test.d.ts +2 -0
- package/dist/types/tests/create-pixelated-app-template-mapper.test.d.ts.map +1 -0
- package/dist/types/tests/create-pixelated-app.cli.test.d.ts +2 -0
- package/dist/types/tests/create-pixelated-app.cli.test.d.ts.map +1 -0
- package/dist/types/tests/create-pixelated-app.test.d.ts +2 -0
- package/dist/types/tests/create-pixelated-app.test.d.ts.map +1 -0
- package/dist/types/tests/generate-site-images.test.d.ts +2 -0
- package/dist/types/tests/generate-site-images.test.d.ts.map +1 -0
- package/dist/types/tests/pixelated-eslint-plugin.test.d.ts +2 -0
- package/dist/types/tests/pixelated-eslint-plugin.test.d.ts.map +1 -0
- package/dist/types/tests/shell-scripts.test.d.ts +2 -0
- package/dist/types/tests/shell-scripts.test.d.ts.map +1 -0
- package/dist/types/tests/validate-exports.test.d.ts +2 -0
- package/dist/types/tests/validate-exports.test.d.ts.map +1 -0
- package/package.json +8 -7
- package/dist/scripts/validate-exports.cjs +0 -280
- package/dist/types/scripts/validate-exports.d.cts +0 -2
- package/dist/types/scripts/validate-exports.d.cts.map +0 -1
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* create-pixelated-app.js
|
|
4
|
+
*
|
|
5
|
+
* Simple CLI to scaffold a new site from `pixelated-template`.
|
|
6
|
+
* - copies the template to a destination folder
|
|
7
|
+
* - clears out the .git history in the copy
|
|
8
|
+
* - optionally initializes a fresh git repo and adds a remote
|
|
9
|
+
*
|
|
10
|
+
* TODOs (placeholders for later work):
|
|
11
|
+
* - Create/patch pixelated.config.json and optionally run config:encrypt
|
|
12
|
+
* - Run `npm ci` / `npm run lint` / `npm test` and optionally build
|
|
13
|
+
* - Optionally create GitHub repo using API (with token from secure vault)
|
|
14
|
+
*
|
|
15
|
+
*
|
|
16
|
+
1) Recommended approach (short) ā
|
|
17
|
+
Build a small Node-based CLI (easier cross-platform than a Bash script) called e.g. scripts/new-site.js or an npm create script.
|
|
18
|
+
Make it interactive with sensible CLI flags (--name, --domain, --repo, --git, --encrypt, --no-install) and a non-interactive mode for CI.
|
|
19
|
+
|
|
20
|
+
2) High-level workflow the script should perform š
|
|
21
|
+
Validate inputs (target path, site slug, repo name).
|
|
22
|
+
Copy pixelated-template ā ./<new-site-name> (preserve file modes).
|
|
23
|
+
Replace placeholders in files (template tokens like {{SITE_NAME}}, {{PACKAGE_NAME}}, {{DOMAIN}}).
|
|
24
|
+
Patch template-specific files (see list below).
|
|
25
|
+
Remove template git metadata (rm -rf .git) and reset any CI state.
|
|
26
|
+
Create/patch pixelated.config.json with site-specific values (ask for secrets). Optionally run npm run config:encrypt to write .enc.
|
|
27
|
+
Run validation: npm ci (optional), npm run lint, npm test, npm run build.
|
|
28
|
+
Init git, make initial commit, optionally create remote GitHub repo (if token available) and push.
|
|
29
|
+
Print summary and next steps (e.g., configure hosting / DNS / deploy keys).
|
|
30
|
+
|
|
31
|
+
3) Files / fields to update in the template š§
|
|
32
|
+
package.json ā name, description, repository, author, homepage, version, scripts (if you want to change default scripts).
|
|
33
|
+
README.md ā project title and quick-start instructions.
|
|
34
|
+
next.config.ts / amplify.yml ā site-specific env entries and build steps.
|
|
35
|
+
pixelated.config.json ā update global/aws/contentful/google fields for this site (prefer *.enc workflow).
|
|
36
|
+
src/app/(pages)/⦠and any site metadata files (site slug, default pagesDir).
|
|
37
|
+
public/ assets and site-images.json ā update site logos/URLs.
|
|
38
|
+
certificates/ if using TLS ā template may include placeholder paths.
|
|
39
|
+
FEATURE_CHECKLIST.md ā optionally update default checklist for new site.
|
|
40
|
+
.gitignore ā ensure pixelated.config.json is ignored if plaintext during setup.
|
|
41
|
+
|
|
42
|
+
4) Template hardening (recommended changes in pixelated-template) ā ļø
|
|
43
|
+
Add placeholder tokens for the things above (e.g., {{PACKAGE_NAME}}, {{SITE_DOMAIN}}) rather than literal values.
|
|
44
|
+
Add a template.json or template.meta that lists files & placeholders to auto-replace.
|
|
45
|
+
Ensure the template does not include real secrets. Provide pixelated.config.json.example with placeholders and an example .env.local.example.
|
|
46
|
+
Add a scripts/prepare-template.sh or test job that ensures no plaintext sensitive values remain.
|
|
47
|
+
Document the creation process in TEMPLATE_README.md for maintainers.
|
|
48
|
+
|
|
49
|
+
5) Security & operational notes š
|
|
50
|
+
Do not commit plaintext pixelated.config.json. If the CLI accepts secret values, optionally run npm run config:encrypt immediately and only commit the .enc if needed (prefer not to commit it; store in site secrets store).
|
|
51
|
+
Add an option to write the encrypted file directly into dist/config when building a deployment bundle.
|
|
52
|
+
Provide an audit step: scan resulting repo for secret patterns before final commit/push.
|
|
53
|
+
|
|
54
|
+
6) Helpful CLI implementation details (tools & libs) š ļø
|
|
55
|
+
Use Node + these packages: fs-extra (copy), replace-in-file or simple .replace() for template tokens, inquirer (prompt), execa (run commands), simple-git (git ops), node-fetch or @octokit/rest (optional GitHub repo creation).
|
|
56
|
+
Use safe file writes and atomic renames for config operations.
|
|
57
|
+
Provide a --dry-run and --preview mode so users can verify changes before creating repo or pushing.
|
|
58
|
+
|
|
59
|
+
7) Validation & post-creation steps ā
|
|
60
|
+
npm run lint && npm test && npm run build ā fail fast and show errors for the new site.
|
|
61
|
+
Optional: run npm run config:decrypt locally (with provided key) to confirm decryption works in your deploy workflow (BUT DO NOT store the key in the repo).
|
|
62
|
+
|
|
63
|
+
8) Example minimal CLI flow (pseudo)
|
|
64
|
+
Prompt: site name, package name, repo URL (optional), domain, author, contentful tokens, aws keys (optional), encrypt?
|
|
65
|
+
Copy template ā replace tokens ā create pixelated.config.json from pixelated.config.json.example ā encrypt if requested ā init git ā run install/build ā push to remote.
|
|
66
|
+
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
import fs from 'fs/promises';
|
|
70
|
+
import path from 'path';
|
|
71
|
+
import { exec as execCb } from 'child_process';
|
|
72
|
+
import { promisify } from 'util';
|
|
73
|
+
import readline from 'readline/promises';
|
|
74
|
+
import { stdin as input, stdout as output } from 'process';
|
|
75
|
+
import { fileURLToPath } from 'url';
|
|
76
|
+
import { loadManifest, findTemplateForSlug, pruneTemplateDirs, printAvailableTemplates } from './create-pixelated-app-template-mapper.js';
|
|
77
|
+
|
|
78
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
79
|
+
const __dirname = path.dirname(__filename);
|
|
80
|
+
|
|
81
|
+
const exec = promisify(execCb);
|
|
82
|
+
|
|
83
|
+
async function exists(p) {
|
|
84
|
+
try {
|
|
85
|
+
await fs.access(p);
|
|
86
|
+
return true;
|
|
87
|
+
} catch (e) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function countFiles(src) {
|
|
93
|
+
let total = 0;
|
|
94
|
+
async function walk(p) {
|
|
95
|
+
const stat = await fs.lstat(p);
|
|
96
|
+
if (stat.isDirectory()) {
|
|
97
|
+
const items = await fs.readdir(p, { withFileTypes: true });
|
|
98
|
+
for (const item of items) {
|
|
99
|
+
await walk(path.join(p, item.name));
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
total++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
await walk(src);
|
|
106
|
+
return total;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function startSpinner(messageFn) {
|
|
110
|
+
if (!process.stdout.isTTY) return { stop: () => {} };
|
|
111
|
+
const frames = ['-', '\\', '|', '/'];
|
|
112
|
+
let i = 0;
|
|
113
|
+
const interval = setInterval(() => {
|
|
114
|
+
const msg = messageFn ? messageFn() : '';
|
|
115
|
+
process.stdout.write(`\r${frames[i % frames.length]} ${msg}`);
|
|
116
|
+
i++;
|
|
117
|
+
}, 100);
|
|
118
|
+
return {
|
|
119
|
+
stop: () => {
|
|
120
|
+
clearInterval(interval);
|
|
121
|
+
process.stdout.write('\r');
|
|
122
|
+
process.stdout.write('\n');
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function copyRecursive(src, dest, onFileCopied) {
|
|
128
|
+
// Recursive copy that reports per-file progress via onFileCopied.
|
|
129
|
+
await fs.mkdir(dest, { recursive: true });
|
|
130
|
+
const items = await fs.readdir(src, { withFileTypes: true });
|
|
131
|
+
for (const item of items) {
|
|
132
|
+
const s = path.join(src, item.name);
|
|
133
|
+
const d = path.join(dest, item.name);
|
|
134
|
+
const stat = await fs.lstat(s);
|
|
135
|
+
if (stat.isDirectory()) {
|
|
136
|
+
await copyRecursive(s, d, onFileCopied);
|
|
137
|
+
} else if (stat.isSymbolicLink()) {
|
|
138
|
+
try {
|
|
139
|
+
const link = await fs.readlink(s);
|
|
140
|
+
await fs.symlink(link, d);
|
|
141
|
+
if (onFileCopied) onFileCopied(d);
|
|
142
|
+
} catch (e) {
|
|
143
|
+
// ignore symlink failures
|
|
144
|
+
if (onFileCopied) onFileCopied(d);
|
|
145
|
+
}
|
|
146
|
+
} else {
|
|
147
|
+
// Regular file
|
|
148
|
+
await fs.copyFile(s, d);
|
|
149
|
+
if (onFileCopied) onFileCopied(d);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Replace placeholders like {{SITE_NAME}}, {{SITE_URL}}, {{EMAIL_ADDRESS}} across the created site
|
|
155
|
+
// This supports both literal tags and simple regex patterns (for cases where the bundler
|
|
156
|
+
// transformed template tokens into JS expressions like {SITE_NAME}). Each replacement
|
|
157
|
+
// entry may have { tag, value, isRegex } where isRegex indicates `tag` is a regex string.
|
|
158
|
+
async function replacePlaceholders(rootDir, replacements) {
|
|
159
|
+
const ignoreDirs = new Set(['.git', 'node_modules', 'dist', 'coverage']);
|
|
160
|
+
let filesChanged = 0;
|
|
161
|
+
async function walk(p) {
|
|
162
|
+
const items = await fs.readdir(p, { withFileTypes: true });
|
|
163
|
+
for (const item of items) {
|
|
164
|
+
const entry = path.join(p, item.name);
|
|
165
|
+
if (item.isDirectory()) {
|
|
166
|
+
// Allow running against .next when explicitly targeting it, but skip when walking a template
|
|
167
|
+
if (item.name === '.next' && rootDir !== '.next') continue;
|
|
168
|
+
if (ignoreDirs.has(item.name)) continue;
|
|
169
|
+
await walk(entry);
|
|
170
|
+
} else {
|
|
171
|
+
try {
|
|
172
|
+
let content = await fs.readFile(entry, 'utf8');
|
|
173
|
+
let newContent = content;
|
|
174
|
+
for (const { tag, value, isRegex } of replacements) {
|
|
175
|
+
let re;
|
|
176
|
+
if (isRegex) {
|
|
177
|
+
re = new RegExp(tag, 'g');
|
|
178
|
+
} else {
|
|
179
|
+
re = new RegExp(tag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g');
|
|
180
|
+
}
|
|
181
|
+
newContent = newContent.replace(re, value);
|
|
182
|
+
}
|
|
183
|
+
if (newContent !== content) {
|
|
184
|
+
await fs.writeFile(entry, newContent, 'utf8');
|
|
185
|
+
filesChanged++;
|
|
186
|
+
}
|
|
187
|
+
} catch (e) {
|
|
188
|
+
// Could be binary or unreadable - skip
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
await walk(rootDir);
|
|
194
|
+
return filesChanged;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Token map used by the CLI: literal marker (e.g., "__SITE_NAME__") -> replacement value (populate during interactive prompts)
|
|
198
|
+
export const TOKEN_MAP = {
|
|
199
|
+
"__SITE_NAME__": '',
|
|
200
|
+
"__SITE_URL__": '',
|
|
201
|
+
"__EMAIL_ADDRESS__": ''
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
// Helper: add a route entry to the routes.json structure for a newly created page
|
|
205
|
+
export function addRouteEntry(routesJson, pageSlug, displayName, rootDisplayName) {
|
|
206
|
+
if (!routesJson || !Array.isArray(routesJson.routes)) return false;
|
|
207
|
+
const candidatePath = `/${pageSlug}`;
|
|
208
|
+
if (routesJson.routes.some(r => r.path === candidatePath)) return false;
|
|
209
|
+
const name = displayName.split(/\s+/).map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ');
|
|
210
|
+
routesJson.routes.push({
|
|
211
|
+
"name": name,
|
|
212
|
+
"path": candidatePath,
|
|
213
|
+
"title": `${rootDisplayName} - ${displayName}`,
|
|
214
|
+
"description": "",
|
|
215
|
+
"keywords": ""
|
|
216
|
+
});
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Copy a template page into the target directory, resolving to the expected location inside the workspace template.
|
|
221
|
+
// Returns an object { used: 'template'|'fallback', src: <sourcePath> }
|
|
222
|
+
export async function copyTemplateForPage(templatePathArg, templateSrc, templatePagesHome, targetDir) {
|
|
223
|
+
const folderName = path.basename(templateSrc);
|
|
224
|
+
const srcTemplatePath = path.join(templatePathArg, 'src', 'app', '(pages)', folderName);
|
|
225
|
+
if (await exists(srcTemplatePath)) {
|
|
226
|
+
await copyRecursive(srcTemplatePath, targetDir);
|
|
227
|
+
return { used: 'template', src: srcTemplatePath };
|
|
228
|
+
} else {
|
|
229
|
+
await copyRecursive(templatePagesHome, targetDir);
|
|
230
|
+
return { used: 'fallback', src: templatePagesHome };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
async function main() {
|
|
236
|
+
const rl = readline.createInterface({ input, output });
|
|
237
|
+
try {
|
|
238
|
+
console.log('\nš¦ Pixelated site creator ā scaffold a new site from pixelated-template\n');
|
|
239
|
+
|
|
240
|
+
const defaultName = 'my-site';
|
|
241
|
+
const siteName = (await rl.question(`Root directory name (kebab-case) [${defaultName}]: `)) || defaultName;
|
|
242
|
+
|
|
243
|
+
// Display name used in route titles: convert kebab to Title Case
|
|
244
|
+
const rootDisplayName = siteName.split(/[-_]+/).map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ');
|
|
245
|
+
|
|
246
|
+
// Additional site metadata for placeholder substitution
|
|
247
|
+
const siteUrl = (await rl.question('Site URL (e.g. https://example.com) [leave blank to skip]: ')).trim();
|
|
248
|
+
const emailAddress = (await rl.question('Contact email address [leave blank to skip]: ')).trim();
|
|
249
|
+
|
|
250
|
+
const workspaceRoot = path.resolve(__dirname, '..', '..', '..');
|
|
251
|
+
const templatePath = path.resolve(workspaceRoot, 'pixelated-template');
|
|
252
|
+
if (!(await exists(templatePath))) {
|
|
253
|
+
console.error(`\nā Template not found at ${templatePath}. Please ensure this tool is run inside the workspace that contains pixelated-template.`);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Load manifest (if present)
|
|
258
|
+
const manifest = await loadManifest(__dirname);
|
|
259
|
+
// Note: available templates will be printed later just before prompting for pages
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
// Destination is implicitly the top-level Git folder + site name to avoid prompting for it
|
|
263
|
+
const destPath = path.resolve(workspaceRoot, siteName);
|
|
264
|
+
console.log(`\nThe new site will be created at: ${destPath}`);
|
|
265
|
+
const proceed = (await rl.question('Proceed? (Y/n): ')) || 'y';
|
|
266
|
+
if (proceed.toLowerCase() !== 'y' && proceed.toLowerCase() !== 'yes') {
|
|
267
|
+
console.log('Aborting.');
|
|
268
|
+
process.exit(0);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (await exists(destPath)) {
|
|
272
|
+
const shouldOverwrite = (await rl.question(`Destination ${destPath} already exists. Overwrite? (y/N): `)).toLowerCase();
|
|
273
|
+
if (shouldOverwrite !== 'y' && shouldOverwrite !== 'yes') {
|
|
274
|
+
console.log('Aborting. Choose another destination.');
|
|
275
|
+
process.exit(0);
|
|
276
|
+
}
|
|
277
|
+
console.log(`Removing existing directory ${destPath}...`);
|
|
278
|
+
await fs.rm(destPath, { recursive: true, force: true });
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
console.log(`\nCopying template from ${templatePath} -> ${destPath} ...`);
|
|
282
|
+
const totalFiles = await countFiles(templatePath);
|
|
283
|
+
let filesCopied = 0;
|
|
284
|
+
let lastFile = '';
|
|
285
|
+
const spinner = startSpinner(() => `Copying... ${filesCopied}/${totalFiles} ${lastFile ? '- ' + path.basename(lastFile) : ''}`);
|
|
286
|
+
await copyRecursive(templatePath, destPath, (f) => { if (f) { filesCopied++; lastFile = f; } });
|
|
287
|
+
// If fs.cp was used, per-file callbacks won't have been called; ensure we report the full total
|
|
288
|
+
if (filesCopied < totalFiles) filesCopied = totalFiles;
|
|
289
|
+
spinner.stop();
|
|
290
|
+
console.log(`ā
Template files copied (${filesCopied} files).`);
|
|
291
|
+
|
|
292
|
+
// Remove git history
|
|
293
|
+
const gitDir = path.join(destPath, '.git');
|
|
294
|
+
if (await exists(gitDir)) {
|
|
295
|
+
console.log('Removing .git directory from new site...');
|
|
296
|
+
await fs.rm(gitDir, { recursive: true, force: true });
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Pages prompt: show available templates and ask which pages to create (comma-separated)
|
|
300
|
+
if (manifest && Array.isArray(manifest.templates) && manifest.templates.length) {
|
|
301
|
+
printAvailableTemplates(manifest);
|
|
302
|
+
}
|
|
303
|
+
const pagesInput = (await rl.question('Pages to create (comma-separated, e.g. about,contact) [leave blank to skip]: ')).trim();
|
|
304
|
+
let pagesToCreate = [];
|
|
305
|
+
let existingPages = [];
|
|
306
|
+
if (pagesInput) {
|
|
307
|
+
const raw = pagesInput.split(',').map(s => s.trim()).filter(Boolean);
|
|
308
|
+
// sanitize and normalize
|
|
309
|
+
const seen = new Set();
|
|
310
|
+
for (const r of raw) {
|
|
311
|
+
const lower = r.toLowerCase();
|
|
312
|
+
if (lower === 'home' || lower === 'index') {
|
|
313
|
+
existingPages.push('home');
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
let slug = r.trim().toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
|
|
317
|
+
if (!slug) continue;
|
|
318
|
+
if (seen.has(slug)) continue;
|
|
319
|
+
seen.add(slug);
|
|
320
|
+
const matchedTemplate = findTemplateForSlug(manifest, slug);
|
|
321
|
+
pagesToCreate.push({ slug, displayName: r.trim(), template: matchedTemplate });
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
console.log('\nSummary of pages:');
|
|
325
|
+
if (existingPages.length) console.log(` - Existing (skipped): ${existingPages.join(', ')}`);
|
|
326
|
+
if (pagesToCreate.length) {
|
|
327
|
+
console.log(' - To be created:');
|
|
328
|
+
for (const p of pagesToCreate) {
|
|
329
|
+
if (p.template) {
|
|
330
|
+
console.log(` - ${p.slug} (mapped to template: ${p.template.name})`);
|
|
331
|
+
} else {
|
|
332
|
+
console.log(` - ${p.slug} (no template match)`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const proceedPages = (await rl.question('Proceed to create these pages? (Y/n): ')) || 'y';
|
|
337
|
+
if (proceedPages.toLowerCase() === 'y' || proceedPages.toLowerCase() === 'yes') {
|
|
338
|
+
// perform creation
|
|
339
|
+
const templatePagesHome = path.join(templatePath, 'src', 'app', '(pages)', '(home)');
|
|
340
|
+
const siteRoutesFile = path.join(destPath, 'src', 'app', 'data', 'routes.json');
|
|
341
|
+
let routesJson = null;
|
|
342
|
+
try {
|
|
343
|
+
routesJson = JSON.parse(await fs.readFile(siteRoutesFile, 'utf8'));
|
|
344
|
+
// Ensure siteInfo exists and set its name to the root display name
|
|
345
|
+
routesJson.siteInfo = routesJson.siteInfo || {};
|
|
346
|
+
routesJson.siteInfo.name = rootDisplayName;
|
|
347
|
+
} catch (e) {
|
|
348
|
+
console.warn('ā ļø Could not read routes.json, routes will not be updated.');
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
for (const p of pagesToCreate) {
|
|
352
|
+
const targetDir = path.join(destPath, 'src', 'app', '(pages)', p.slug);
|
|
353
|
+
console.log(`Creating page ${p.slug} -> ${targetDir}`);
|
|
354
|
+
let copyResult = null;
|
|
355
|
+
if (p.template && p.template.src) {
|
|
356
|
+
copyResult = await copyTemplateForPage(templatePath, p.template.src, templatePagesHome, targetDir);
|
|
357
|
+
if (copyResult.used === 'template') {
|
|
358
|
+
console.log(` - Copied template ${p.template.name} from ${copyResult.src}`);
|
|
359
|
+
} else {
|
|
360
|
+
console.warn(`ā ļø Template source ${path.join(templatePath, 'src', 'app', '(pages)', path.basename(p.template.src))} not found; using default page template instead.`);
|
|
361
|
+
}
|
|
362
|
+
} else {
|
|
363
|
+
await copyRecursive(templatePagesHome, targetDir);
|
|
364
|
+
}
|
|
365
|
+
// rename component in page.tsx
|
|
366
|
+
const pageFile = path.join(targetDir, 'page.tsx');
|
|
367
|
+
try {
|
|
368
|
+
let content = await fs.readFile(pageFile, 'utf8');
|
|
369
|
+
const compName = p.displayName.replace(/[^a-zA-Z0-9]+/g,' ').split(/\s+/).map(s=>s.charAt(0).toUpperCase()+s.slice(1)).join('') + 'Page';
|
|
370
|
+
content = content.replace(/export default function\s+\w+\s*\(/, `export default function ${compName}(`);
|
|
371
|
+
await fs.writeFile(pageFile, content, 'utf8');
|
|
372
|
+
console.log(` - Updated component name to ${compName} in ${path.relative(destPath, pageFile)}`);
|
|
373
|
+
} catch (e) {
|
|
374
|
+
console.warn(`ā ļø Failed to update component name for ${p.slug}:`, e?.message || e);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// update routes.json
|
|
378
|
+
if (routesJson && Array.isArray(routesJson.routes)) {
|
|
379
|
+
// Skip if route path already exists
|
|
380
|
+
const candidatePath = `/${p.slug}`;
|
|
381
|
+
if (!routesJson.routes.some(r => r.path === candidatePath)) {
|
|
382
|
+
routesJson.routes.push({
|
|
383
|
+
"name": p.displayName.split(/\s+/).map(s=>s.charAt(0).toUpperCase()+s.slice(1)).join(' '),
|
|
384
|
+
"path": candidatePath,
|
|
385
|
+
"title": `${rootDisplayName} - ${p.displayName}`,
|
|
386
|
+
"description": "",
|
|
387
|
+
"keywords": ""
|
|
388
|
+
});
|
|
389
|
+
} else {
|
|
390
|
+
console.log(` - Route ${candidatePath} already exists; skipping route add.`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
if (manifest) {
|
|
396
|
+
const removed = await pruneTemplateDirs(manifest, destPath, pagesToCreate.map(p=>p.slug));
|
|
397
|
+
for (const r of removed) {
|
|
398
|
+
console.log(`Removed unused template page ${r} from new site...`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if (routesJson) {
|
|
403
|
+
try {
|
|
404
|
+
await fs.writeFile(siteRoutesFile, JSON.stringify(routesJson, null, '\t'), 'utf8');
|
|
405
|
+
console.log('ā
routes.json updated.');
|
|
406
|
+
} catch (e) {
|
|
407
|
+
console.warn('ā ļø Failed to write routes.json:', e?.message || e);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
} else {
|
|
411
|
+
console.log('Skipping page creation.');
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// Automatically replace double-underscore template placeholders (e.g., __SITE_NAME__) with provided values
|
|
415
|
+
const replacements = {};
|
|
416
|
+
if (rootDisplayName) replacements.SITE_NAME = rootDisplayName;
|
|
417
|
+
if (siteUrl) replacements.SITE_URL = siteUrl;
|
|
418
|
+
if (emailAddress) replacements.EMAIL_ADDRESS = emailAddress;
|
|
419
|
+
if (Object.keys(replacements).length) {
|
|
420
|
+
const replArray = [];
|
|
421
|
+
for (const [t, valRaw] of Object.entries(replacements)) {
|
|
422
|
+
const val = String(valRaw);
|
|
423
|
+
// populate TOKEN_MAP so other code can inspect token->value mapping (keyed by literal marker)
|
|
424
|
+
const marker = `__${t}__`;
|
|
425
|
+
TOKEN_MAP[marker] = val;
|
|
426
|
+
// First, replace expression occurrences like {__TOKEN__} with a quoted string expression to avoid bare identifiers
|
|
427
|
+
replArray.push({ tag: `\\{${marker}\\}`, value: `{${JSON.stringify(val)}}`, isRegex: true });
|
|
428
|
+
// Then, replace literal marker occurrences (e.g., __TOKEN__) with the plain value
|
|
429
|
+
replArray.push({ tag: marker, value: val });
|
|
430
|
+
}
|
|
431
|
+
try {
|
|
432
|
+
const changed = await replacePlaceholders(destPath, replArray);
|
|
433
|
+
console.log(`ā
Replaced template placeholders in ${changed} files under ${destPath}`);
|
|
434
|
+
} catch (e) {
|
|
435
|
+
console.warn('ā ļø Failed to replace placeholders in site copy:', e?.message || e);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
// Prompt about git initialization
|
|
439
|
+
const initGitAnswer = (await rl.question('Initialize a fresh git repository here? (Y/n): ')) || 'y';
|
|
440
|
+
if (initGitAnswer.toLowerCase() === 'y' || initGitAnswer.toLowerCase() === 'yes') {
|
|
441
|
+
try {
|
|
442
|
+
await exec('git init -b main', { cwd: destPath });
|
|
443
|
+
await exec('git add .', { cwd: destPath });
|
|
444
|
+
await exec('git commit -m "chore: initial commit from pixelated-template"', { cwd: destPath });
|
|
445
|
+
console.log('ā
Git initialized and initial commit created.');
|
|
446
|
+
} catch (e) {
|
|
447
|
+
console.warn('ā ļø Git init or commit failed. You can initialize manually later.', e?.stderr || e?.message || e);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
console.log('\nš Done. Summary:');
|
|
454
|
+
console.log(` - Site copied to: ${destPath}`);
|
|
455
|
+
console.log('\nNote: A git remote was not set by this script. You can add one later with `git remote add origin <url>` if desired.');
|
|
456
|
+
console.log('\nNext recommended steps (manual or to be automated in future):');
|
|
457
|
+
console.log(' - Update pixelated.config.json for this site and encrypt it with your config tool');
|
|
458
|
+
console.log(' - Run `npm run lint`, `npm test`, and `npm run build` inside the new site and fix any issues');
|
|
459
|
+
console.log(' - Create GitHub repo (if not already created), push main branch, and set up CI/deploy secrets');
|
|
460
|
+
} catch (err) {
|
|
461
|
+
console.error('Unexpected error:', err);
|
|
462
|
+
process.exit(1);
|
|
463
|
+
} finally {
|
|
464
|
+
rl.close();
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
if (typeof process !== 'undefined' && new URL(import.meta.url).pathname === process.argv[1]) {
|
|
469
|
+
// CLI entry point: run the interactive main flow
|
|
470
|
+
main();
|
|
471
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"templates": [
|
|
3
|
+
{
|
|
4
|
+
"name": "FAQs",
|
|
5
|
+
"aliases": ["faq", "faqs", "qa", "q-and-a", "frequently-asked-question", "frequently-asked-questions"],
|
|
6
|
+
"src": "../../pixelated-template/src/app/(pages)/faqs",
|
|
7
|
+
"associated_files": ["src/app/data/faqs.json"]
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"name": "Projects",
|
|
11
|
+
"aliases": ["gallery", "project", "projects", "portfolio", "work", "our-work",
|
|
12
|
+
"our-projects", "our-project", "case-studies", "examples", "showcase", "samples"],
|
|
13
|
+
"src": "../../pixelated-template/src/app/(pages)/projects"
|
|
14
|
+
},
|
|
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
|
+
{
|
|
27
|
+
"name": "Services",
|
|
28
|
+
"aliases": ["services", "service", "our-services", "services-page", "offerings", "solutions", "products"],
|
|
29
|
+
"src": "../../pixelated-template/src/app/(pages)/services"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
package/dist/scripts/release.sh
CHANGED
|
@@ -36,7 +36,7 @@ fi
|
|
|
36
36
|
|
|
37
37
|
# Select remote
|
|
38
38
|
echo ""
|
|
39
|
-
echo "š Step $((STEP_COUNT++)):
|
|
39
|
+
echo "š Step $((STEP_COUNT++)): Choose the git Remote to release:"
|
|
40
40
|
echo "================================================="
|
|
41
41
|
# Function to prompt for remote selection
|
|
42
42
|
prompt_remote_selection() {
|
|
@@ -62,6 +62,20 @@ prompt_remote_selection() {
|
|
|
62
62
|
}
|
|
63
63
|
REMOTE_NAME=$(prompt_remote_selection)
|
|
64
64
|
|
|
65
|
+
# Confirm current directory matches the selected remote's repository name
|
|
66
|
+
remote_url=$(git remote get-url "$REMOTE_NAME" 2>/dev/null || true)
|
|
67
|
+
remote_repo=$(basename -s .git "${remote_url##*/}")
|
|
68
|
+
local_repo=$(basename "$(git rev-parse --show-toplevel)")
|
|
69
|
+
if [ -n "$remote_repo" ] && [ "$remote_repo" != "$local_repo" ]; then
|
|
70
|
+
echo "\nā ļø Warning: Selected remote '$REMOTE_NAME' points to repository '$remote_repo' but you are currently in folder '$local_repo'."
|
|
71
|
+
read -p "Proceed anyway? (y/N): " proceed
|
|
72
|
+
proceed=${proceed:-n}
|
|
73
|
+
if [[ ! "$proceed" =~ ^[Yy] ]]; then
|
|
74
|
+
echo "Aborting. Please run this script from the correct repository folder." >&2
|
|
75
|
+
exit 1
|
|
76
|
+
fi
|
|
77
|
+
fi
|
|
78
|
+
|
|
65
79
|
|
|
66
80
|
|
|
67
81
|
|
|
@@ -120,6 +134,12 @@ if [ -n "$UPDATES" ]; then
|
|
|
120
134
|
else
|
|
121
135
|
echo "ā
No dependency updates needed."
|
|
122
136
|
fi
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
echo ""
|
|
141
|
+
echo "š¦ Step $((STEP_COUNT++)): Updating Audit Fixes..."
|
|
142
|
+
echo "================================================="
|
|
123
143
|
npm audit fix --force 2>/dev/null || true
|
|
124
144
|
|
|
125
145
|
|
|
@@ -150,6 +170,8 @@ echo "šØ Step $((STEP_COUNT++)): Building project..."
|
|
|
150
170
|
echo "================================================="
|
|
151
171
|
npm run build
|
|
152
172
|
|
|
173
|
+
|
|
174
|
+
|
|
153
175
|
# Post-build: if a dist folder exists, ensure it does NOT contain plaintext config and that the .enc file is present
|
|
154
176
|
echo ""
|
|
155
177
|
echo "š§ Step $((STEP_COUNT++)): Post-build config check: cleaning dist and verifying .enc..."
|
|
@@ -315,8 +337,6 @@ else
|
|
|
315
337
|
# Diagnostic: show remote and derived repo path (non-secret)
|
|
316
338
|
echo "Remote URL: $REMOTE_URL"
|
|
317
339
|
echo "Derived repo_path: $repo_path"
|
|
318
|
-
echo "Remote URL: $REMOTE_URL"
|
|
319
|
-
echo "Derived repo_path: $repo_path"
|
|
320
340
|
|
|
321
341
|
# Quick access check to see if token and repo path are valid
|
|
322
342
|
access_resp=$(curl -s -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/$repo_path")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"404.d.ts","sourceRoot":"","sources":["../../../../src/components/general/404.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,WAAW,CAAC;AAKnB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAE,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"404.d.ts","sourceRoot":"","sources":["../../../../src/components/general/404.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,WAAW,CAAC;AAKnB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAE,KAAK,EAAE,cAAc,2CA4ChD;yBA5Ce,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callout.d.ts","sourceRoot":"","sources":["../../../../src/components/general/callout.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,gBAAgB,CAAC;AAiBxB,eAAO,MAAM,QAAQ,iFAAkF,CAAC;AACxG,eAAO,MAAM,MAAM,mDAAoD,CAAC;AACxE,eAAO,MAAM,OAAO,qCAAsC,CAAC;AAC3D,eAAO,MAAM,UAAU,4BAA6B,CAAC;AAGrD,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AAChD,MAAM,MAAM,aAAa,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AA2BtD,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;AAC/D,wBAAgB,OAAO,CAAC,EACvB,OAAmB,EACnB,QAAqB,EACrB,MAAqB,EACrB,SAAkB,EAClB,WAAiC,EACjC,GAAG,EAAE,GAAG,EAAE,MAAM,EAChB,QAAmB,EACnB,QAAQ,EACR,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAC9C,SAAS,GAGgB,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"callout.d.ts","sourceRoot":"","sources":["../../../../src/components/general/callout.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,gBAAgB,CAAC;AAiBxB,eAAO,MAAM,QAAQ,iFAAkF,CAAC;AACxG,eAAO,MAAM,MAAM,mDAAoD,CAAC;AACxE,eAAO,MAAM,OAAO,qCAAsC,CAAC;AAC3D,eAAO,MAAM,UAAU,4BAA6B,CAAC;AAGrD,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AAChD,MAAM,MAAM,aAAa,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AA2BtD,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;AAC/D,wBAAgB,OAAO,CAAC,EACvB,OAAmB,EACnB,QAAqB,EACrB,MAAqB,EACrB,SAAkB,EAClB,WAAiC,EACjC,GAAG,EAAE,GAAG,EAAE,MAAM,EAChB,QAAmB,EACnB,QAAQ,EACR,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAC9C,SAAS,GAGgB,EAAE,WAAW,2CAwEtC;yBArFe,OAAO;;;;;;;;;;;;;;;;;;;;;;;AA+FvB,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,EAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAC,EAAE,iBAAiB,2CASrE;yBATe,aAAa;;;;;;;AAmB7B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAG,iBAAiB,2CAgBxE;yBAhBe,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/components/general/markdown.tsx"],"names":[],"mappings":"AAMA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,gBAAgB,CAAC;AAMxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/components/general/markdown.tsx"],"names":[],"mappings":"AAMA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,gBAAgB,CAAC;AAMxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,2CAqC3C;yBArCe,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-accordion.d.ts","sourceRoot":"","sources":["../../../../src/components/general/menu-accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,sBAAsB,CAAC;AAI9B,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,QAAQ,EAAE,MAAM,IAAI,CAAC;KACrB;CACD;AAUD,MAAM,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAqCzD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,2CAyGrD;yBAzGe,aAAa;;;;;;;;;;;;AAuH7B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,2CAO/D;yBAPe,kBAAkB;;;;;;;;;;;;;;;;;;AAkBlC,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,2CAQ7D;yBARe,iBAAiB;;;;;;;AAmBjC,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC;AACvF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"menu-accordion.d.ts","sourceRoot":"","sources":["../../../../src/components/general/menu-accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,sBAAsB,CAAC;AAI9B,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,QAAQ,EAAE,MAAM,IAAI,CAAC;KACrB;CACD;AAUD,MAAM,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAqCzD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,2CAyGrD;yBAzGe,aAAa;;;;;;;;;;;;AAuH7B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,2CAO/D;yBAPe,kBAAkB;;;;;;;;;;;;;;;;;;AAkBlC,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,2CAQ7D;yBARe,iBAAiB;;;;;;;AAmBjC,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC;AACvF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,2CAkBjE;yBAlBe,mBAAmB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../../src/components/general/recipe.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,cAAc,CAAC;AAetB,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,GAAG,GAAG,gBAAgB,CAuD5E;AA8CD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAkF/C;yBAlFe,UAAU;;;;;;;;AA6F1B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAOvD;yBAPe,cAAc;;;;;;;;AAiB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAE,KAAK,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../../src/components/general/recipe.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,cAAc,CAAC;AAetB,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,GAAG,GAAG,gBAAgB,CAuD5E;AA8CD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAkF/C;yBAlFe,UAAU;;;;;;;;AA6F1B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAOvD;yBAPe,cAAc;;;;;;;;AAiB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAE,KAAK,EAAE,kBAAkB,2CA0CxD;yBA1Ce,cAAc;;;;;;;AAmD9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CA8CvD;yBA9Ce,cAAc;;;;;;;AAkD9B,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,4CAwBxB;yBAxBe,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../../src/components/general/resume.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,+BAA+B,CAAC;AACvC,OAAO,cAAc,CAAC;AAkCtB,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7D,wBAAgB,MAAM,CAAE,KAAK,EAAE,UAAU,2CAyDxC;yBAzDe,MAAM;;;;;AA8DtB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAO/C;yBAPe,UAAU;;;;;AAa1B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,2CAgBrD;yBAhBe,aAAa;;;;;;AAwB7B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../../src/components/general/resume.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,+BAA+B,CAAC;AACvC,OAAO,cAAc,CAAC;AAkCtB,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7D,wBAAgB,MAAM,CAAE,KAAK,EAAE,UAAU,2CAyDxC;yBAzDe,MAAM;;;;;AA8DtB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAO/C;yBAPe,UAAU;;;;;AAa1B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,2CAgBrD;yBAhBe,aAAa;;;;;;AAwB7B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAyDnD;yBAzDe,YAAY;;;;;;;;AA+D5B,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CAkBnE;yBAlBe,oBAAoB;;;;;;AAwBpC,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAE,KAAK,EAAE,gBAAgB,2CAiBpD;yBAjBe,YAAY;;;;;;AAuB5B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,KAAK,EAAE,iBAAiB,2CActD;yBAde,aAAa;;;;;;AAqB7B,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACjF,wBAAgB,gBAAgB,CAAE,KAAK,EAAE,oBAAoB,2CA0B5D;yBA1Be,gBAAgB;;;;;;;AA+BhC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAE,KAAK,EAAE,mBAAmB,2CAoB1D;yBApBe,eAAe;;;;;AA2B/B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAgDvD;yBAhDe,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/general/timeline.tsx"],"names":[],"mappings":"AAIA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,gBAAgB,CAAC;AAcxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,2CAiB3C;yBAjBe,QAAQ;;;;;;;;;;AA0BxB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACtG,iBAAwB,YAAY,CAAC,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/general/timeline.tsx"],"names":[],"mappings":"AAIA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,gBAAgB,CAAC;AAcxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,2CAiB3C;yBAjBe,QAAQ;;;;;;;;;;AA0BxB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACtG,iBAAwB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAkB3D;kBAlBuB,YAAY;;;;;;;;eAAZ,YAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentful.items.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/contentful.items.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAWnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAsBhC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAiGzD;yBAjGe,eAAe;;;;;;AA6G/B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"contentful.items.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/contentful.items.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAWnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAsBhC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAiGzD;yBAjGe,eAAe;;;;;;AA6G/B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,2CA6D/D;yBA7De,kBAAkB;;;;;;AA0ElC,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CASnE;yBATe,oBAAoB;;;;;;;AAsBpC,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CAwInE;yBAxIe,oBAAoB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socialcard.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/socialcard.tsx"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,kBAAkB,CAAC;AAiC1B,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AACvE,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"socialcard.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/socialcard.tsx"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,kBAAkB,CAAC;AAiC1B,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AACvE,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,qDAoNjD;yBApNe,WAAW;;;;;AA2N3B,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAoB/C;yBApBe,UAAU;;;;;;;AAwB1B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,4CAMjC;yBANe,kBAAkB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wordpress.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/wordpress.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQnD,OAAO,iBAAiB,CAAC;AAkBzB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAsDnD;yBAtDe,YAAY;;;;;;;;;AAkE5B,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"wordpress.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/wordpress.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQnD,OAAO,iBAAiB,CAAC;AAkBzB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAsDnD;yBAtDe,YAAY;;;;;;;;;AAkE5B,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAgDzD;yBAhDe,eAAe;;;;;;;;;;;;AAuD/B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,kDAyB/D;yBAzBe,kBAAkB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ebay.components.d.ts","sourceRoot":"","sources":["../../../../src/components/shoppingcart/ebay.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AASnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,YAAY,CAAC;AAUpB,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,2CAmF7C;yBAnFe,SAAS;;;;;;AA4FzB,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,kDAqEvD;yBArEe,cAAc;;;;;;AAgF9B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"ebay.components.d.ts","sourceRoot":"","sources":["../../../../src/components/shoppingcart/ebay.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AASnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,YAAY,CAAC;AAUpB,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,2CAmF7C;yBAnFe,SAAS;;;;;;AA4FzB,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,kDAqEvD;yBArEe,cAAc;;;;;;AAgF9B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAwDnD;yBAxDe,YAAY;;;;;;;AAiE5B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CASvD;yBATe,cAAc;;;;;;;AAoB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAuFvD;yBAvFe,cAAc;;;;;;;AAgG9B,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,SAAS,CAAC,CAAC;AACjG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,4BAA4B,2CAgK3E;yBAhKe,wBAAwB"}
|