diff --git a/.github/workflows/validate-templates.yml b/.github/workflows/validate-templates.yml index c229d1fe..f703e88d 100644 --- a/.github/workflows/validate-templates.yml +++ b/.github/workflows/validate-templates.yml @@ -20,6 +20,9 @@ jobs: - name: Validate templates run: node _scripts/validate-templates.js + - name: Check RBAC codegen outputs + run: node _scripts/rbac-codegen.js --check + build-frontends: name: Build ${{ matrix.template }}/${{ matrix.frontend }} runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 8ac28b20..7c141b2d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,11 @@ .env .DS_Store +.claude/ +.cursor/ node_modules .vscode **/logs/ .backups .pnpm-store +**/*.tsbuildinfo diff --git a/README.md b/README.md index d03d3ae7..44d8f699 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,22 @@ Each template is designed to be: --- +## **Directus Version & Licensing** + +These starters run on **Directus 12**. Directus 12 introduces [licensing tiers](https://directus.io/docs/licensing/overview): the free **core** tier has limits on users, collections, flows, and features like custom permission rules. A `LICENSE_KEY` raises those limits and unlocks licensed capabilities — which starter you pick determines whether core is enough (see table below). + +| Starter | Default tier | Without a license | With a `LICENSE_KEY` | +| ------------ | ------------ | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| **cms** | Core (free) | `template/` — full RBAC skeleton, flat permission rules (3 seed users) | Apply `template-licensed/` for enforceable filters, validation, field lists | +| **cms-i18n** | Team | Requires a `LICENSE_KEY` (schema exceeds core tier limits) | Licensed RBAC + i18n permission deltas | +| **blank** | Core (free) | Works out of the box | Same unlocks as cms | + +RBAC and licensed setup: [`cms/directus/README.md`](cms/directus/README.md). + +Directus 12 uses `version=published` for live content (formerly `main`); every versioned item also has a `draft` version. Frontends here handle both keys. + +--- + ## **Available Templates** ### CMS @@ -44,7 +60,7 @@ language switcher. ## **Required Environment Variables** Each framework requires your Directus URL, a server-side token, and a site URL. The token (`DIRECTUS_SERVER_TOKEN`) -comes from your **Webmaster** account and is used server-side for content access, preview, and form submissions. See the +comes from your **admin account** (the one you create during Directus first-launch onboarding) and is used server-side for content access, preview, and form submissions. See the individual template README for full setup details. ### CMS — Next.js @@ -121,9 +137,10 @@ NUXT_PUBLIC_ENABLE_VISUAL_EDITING=true - Log in to your project using the URL provided in your email or from the Directus Cloud Dashboard. -3. **Create accounts and generate tokens**: +3. **Generate a server token**: - - Go to the **Users Directory** and create a **Webmaster** user account. + - Go to the **Users Directory** and open your admin account. + - For local Docker, this is the admin account you created during first-launch onboarding. - Scroll down to the **Token** field, generate a static token, and save it — this is your `DIRECTUS_SERVER_TOKEN`. - For local type generation, you can also generate a token on the **Admin** user — this is your `DIRECTUS_ADMIN_TOKEN` (never exposed at runtime). @@ -145,7 +162,7 @@ Prefer to self-host? You can deploy Directus with the CMS schema pre-loaded dire This sets up a hosted Directus instance with the CMS template already applied. Once deployed: 1. Open your Railway project and grab the public URL for your Directus service — this is your `DIRECTUS_URL`. -2. Log in to Directus, go to the **Users Directory**, and create a **Webmaster** user. +2. Log in to Directus, go to the **Users Directory**, and open your admin account. 3. Generate a static token for that user — this is your `DIRECTUS_SERVER_TOKEN`. 4. Choose a frontend starter from the table above and follow the setup instructions in its README. @@ -184,7 +201,7 @@ This sets up a local project with Docker-based Directus + frontend integration. - This will start Directus on [http://localhost:8055](http://localhost:8055) - On first launch, you'll be prompted to complete the admin setup -- After setup, create a **Webmaster** user and generate a static token for `DIRECTUS_SERVER_TOKEN` +- After setup, generate a static token on your admin account for `DIRECTUS_SERVER_TOKEN` - Optionally generate a token on the Admin user for `DIRECTUS_ADMIN_TOKEN` (type generation only) --- @@ -228,4 +245,6 @@ Directories prefixed with `_` or `.` are internal and excluded from the template ### Validation -Run `node _scripts/validate-templates.js` to check all templates have the required structure and metadata. +Run `node _scripts/validate-templates.js` to check template structure. + +**RBAC changes (maintainers):** Edit `_shared/rbac/`, run `pnpm rbac:codegen`, commit outputs. CI enforces with `pnpm rbac:codegen:check`. See [`_shared/rbac/README.md`](_shared/rbac/README.md) for why codegen exists and how it differs from `rbac:sync-licensed` (user upgrade tool). diff --git a/_scripts/rbac-codegen.js b/_scripts/rbac-codegen.js new file mode 100644 index 00000000..afad3d09 --- /dev/null +++ b/_scripts/rbac-codegen.js @@ -0,0 +1,212 @@ +#!/usr/bin/env node + +/** + * Generates RBAC files for cms core + licensed template variants from _shared/rbac/. + * + * Usage: + * node _scripts/rbac-codegen.js + * node _scripts/rbac-codegen.js --check + */ + +import { readFileSync, writeFileSync, existsSync, cpSync, rmSync } from 'node:fs'; +import { join, resolve } from 'node:path'; + +const ROOT = resolve(import.meta.dirname, '..'); +const RBAC = join(ROOT, '_shared/rbac'); +const CMS_TEMPLATE = join(ROOT, 'cms/directus/template'); +const CMS_LICENSED = join(ROOT, 'cms/directus/template-licensed'); +const I18N_TEMPLATE = join(ROOT, 'cms-i18n/directus/template'); +const CHECK = process.argv.includes('--check'); + +const RBAC_FILES = ['roles.json', 'policies.json', 'access.json', 'permissions.json']; + +const LICENSED_MODULES = [ + 'public-api-filters', + 'writer-self-access', + 'content-manage-rules', + 'live-preview-access', + 'form-submission-hardening', + 'studio-team-rules', +]; + +function readJson(path) { + return JSON.parse(readFileSync(path, 'utf8')); +} + +function loadLicensedPermissions() { + const modulesDir = join(RBAC, 'licensed/modules'); + + if (existsSync(modulesDir)) { + return LICENSED_MODULES.flatMap((name) => readJson(join(modulesDir, `${name}.json`))); + } + return readJson(join(RBAC, 'licensed/permissions.json')); +} + +function writeJson(path, data) { + writeFileSync(path, `${JSON.stringify(data, null, 2)}\n`, 'utf8'); +} + +/** Flatten permission rows for core tier (no custom rules). */ +function flattenPermissions(permissions) { + return permissions.map((row) => ({ + ...row, + permissions: {}, + validation: null, + presets: null, + fields: ['*'], + })); +} + +function copyTemplateTree(src, dest) { + if (existsSync(dest)) { + rmSync(dest, { recursive: true }); + } + + cpSync(src, dest, { recursive: true }); +} + +function syncLicensedTemplate() { + const licensedPerms = loadLicensedPermissions(); + const skeleton = (name) => readJson(join(RBAC, 'core-skeleton', name)); + + copyTemplateTree(CMS_TEMPLATE, CMS_LICENSED); + + const licensedSrc = join(CMS_LICENSED, 'src'); + writeJson(join(licensedSrc, 'roles.json'), skeleton('roles.json')); + writeJson(join(licensedSrc, 'policies.json'), skeleton('policies.json')); + writeJson(join(licensedSrc, 'access.json'), skeleton('access.json')); + writeJson(join(licensedSrc, 'permissions.json'), licensedPerms); + + // Update licensed template README + const licensedReadme = join(CMS_LICENSED, 'README.md'); + if (existsSync(licensedReadme)) { + writeFileSync( + licensedReadme, + `Licensed CMS template variant — same schema as \`../template/\`, with enforceable permission rules. Requires an active \`LICENSE_KEY\`. + +Setup and apply instructions: [\`../README.md\`](../README.md#licensing-and-rbac). +`, + 'utf8', + ); + } +} + +function syncCorePermissions() { + const licensedPerms = loadLicensedPermissions(); + const flat = flattenPermissions(licensedPerms); + const corePath = join(CMS_TEMPLATE, 'src/permissions.json'); + const current = readJson(corePath); + + if (!CHECK) { + // Preserve core skeleton files from disk (may include manual tweaks); sync skeleton copies + for (const file of ['roles.json', 'policies.json', 'access.json']) { + const src = join(CMS_TEMPLATE, 'src', file); + writeJson(join(RBAC, 'core-skeleton', file), readJson(src)); + } + } + + if (CHECK) { + if (JSON.stringify(current) !== JSON.stringify(flat)) { + console.error('Core permissions.json drift — run: pnpm rbac:codegen'); + process.exit(1); + } + } else { + writeJson(corePath, flat); + } +} + +/** cms-i18n: licensed permissions + translation collection rows */ +function syncI18nPermissions() { + const licensedPerms = loadLicensedPermissions(); + const i18nDeltaPath = join(RBAC, 'cms-i18n-permissions.delta.json'); + const i18nPermsPath = join(I18N_TEMPLATE, 'src/permissions.json'); + + let merged = [...licensedPerms]; + + if (existsSync(i18nDeltaPath)) { + const delta = readJson(i18nDeltaPath); + const key = (r) => `${r.policy}|${r.collection}|${r.action}`; + const map = new Map(merged.map((r) => [key(r), r])); + + for (const row of delta) { + map.set(key(row), row); + } + merged = [...map.values()]; + } else if (existsSync(i18nPermsPath)) { + // Build delta from current i18n minus licensed collections on first run + const current = readJson(i18nPermsPath); + + const licensedKeys = new Set(licensedPerms.map((r) => `${r.policy}|${r.collection}|${r.action}`)); + const delta = current.filter((r) => !licensedKeys.has(`${r.policy}|${r.collection}|${r.action}`)); + if (!CHECK) { + writeJson(i18nDeltaPath, delta); + } + merged = [...licensedPerms, ...delta]; + } + + // Sync i18n skeleton RBAC (use cms core-skeleton; i18n uses translated policy label for Public only) + const i18nPolicies = readJson(join(I18N_TEMPLATE, 'src/policies.json')); + const publicPolicy = i18nPolicies.find((p) => p.id === 'abf8a154-5b1c-4a46-ac9c-7300570f4f17'); + if (publicPolicy) { + publicPolicy.name = '$t:public_label'; + } + + if (!CHECK) { + for (const file of ['roles.json', 'access.json']) { + writeJson(join(I18N_TEMPLATE, 'src', file), readJson(join(RBAC, 'core-skeleton', file))); + } + } + + if (CHECK) { + const currentPerms = readJson(i18nPermsPath); + if (JSON.stringify(currentPerms) !== JSON.stringify(merged)) { + console.error('cms-i18n permissions.json drift — run: pnpm rbac:codegen'); + process.exit(1); + } + const currentPolicies = readJson(join(I18N_TEMPLATE, 'src/policies.json')); + if (JSON.stringify(currentPolicies) !== JSON.stringify(i18nPolicies)) { + console.error('cms-i18n policies.json drift — run: pnpm rbac:codegen'); + process.exit(1); + } + } else { + writeJson(i18nPermsPath, merged); + writeJson(join(I18N_TEMPLATE, 'src/policies.json'), i18nPolicies); + } +} + +function checkLicensedTemplate(licensedPerms) { + if (!existsSync(CMS_LICENSED)) { + console.error('template-licensed/ missing — run: pnpm rbac:codegen'); + process.exit(1); + } + + for (const file of RBAC_FILES) { + const expected = file === 'permissions.json' ? licensedPerms : readJson(join(RBAC, 'core-skeleton', file)); + const actual = readJson(join(CMS_LICENSED, 'src', file)); + if (JSON.stringify(actual) !== JSON.stringify(expected)) { + console.error(`template-licensed/src/${file} drift — run: pnpm rbac:codegen`); + process.exit(1); + } + } +} + +console.log('RBAC codegen...\n'); + +const licensedPerms = loadLicensedPermissions(); + +syncCorePermissions(); +if (!CHECK) { + writeJson(join(RBAC, 'licensed/permissions.json'), licensedPerms); + syncLicensedTemplate(); +} +syncI18nPermissions(); + +if (CHECK) { + checkLicensedTemplate(licensedPerms); + console.log('RBAC outputs in sync.'); +} else { + console.log('Generated:'); + console.log(' - cms/directus/template/src/permissions.json (core, flat)'); + console.log(' - cms/directus/template-licensed/ (licensed variant)'); + console.log(' - cms-i18n/directus/template/src/permissions.json'); +} diff --git a/_scripts/sync-licensed-permissions.js b/_scripts/sync-licensed-permissions.js new file mode 100644 index 00000000..6279c52f --- /dev/null +++ b/_scripts/sync-licensed-permissions.js @@ -0,0 +1,271 @@ +#!/usr/bin/env node +/** + * Upgrade an existing core instance to licensed RBAC (Path 2). + * + * Run from the repo root (after LICENSE_KEY is active and core template/ is applied): + * pnpm rbac:sync-licensed + * + * 1. PATCHes permission rules from template-licensed (no content re-import) + * 2. Removes circular redirects (url_from === url_to) that break frontends + * 3. Patches the Redirect automation flow so unchanged slugs never create redirects + * + * Reads DIRECTUS URL from cms/directus/.env (PUBLIC_URL) and admin token from a + * frontend .env (DIRECTUS_ADMIN_TOKEN or DIRECTUS_SERVER_TOKEN). + */ + +import { existsSync, readFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = join(__dirname, '..'); +const LICENSED_DIR = join(ROOT, 'cms/directus/template-licensed/src'); +const LICENSED_PERMISSIONS = join(LICENSED_DIR, 'permissions.json'); +const LICENSED_OPERATIONS = join(LICENSED_DIR, 'operations.json'); + +/** Redirect flow ops that must match template-licensed (skip unchanged slugs). */ +const REDIRECT_FLOW_OP_IDS = [ + 'b4e8c1f2-3a6d-4e5f-9b0c-1d2e3f4a5b6c', // URL Changed (condition) — create first + 'd7f64e04-ab43-4d77-b8e8-379b41af2d3a', // Format Payload (exec) +]; + +function loadEnvFile(path) { + if (!existsSync(path)) return; + + for (const line of readFileSync(path, 'utf8').split('\n')) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const eq = trimmed.indexOf('='); + if (eq === -1) continue; + const key = trimmed.slice(0, eq).trim(); + let value = trimmed.slice(eq + 1).trim(); + const comment = value.indexOf(' #'); + if (comment !== -1) value = value.slice(0, comment).trim(); + if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { + value = value.slice(1, -1); + } + if (process.env[key] === undefined) process.env[key] = value; + } +} + +loadEnvFile(join(ROOT, 'cms/directus/.env')); +for (const frontend of ['nextjs', 'nuxt', 'astro', 'sveltekit']) { + loadEnvFile(join(ROOT, 'cms', frontend, '.env')); +} + +const DIRECTUS_URL = ( + process.env.DIRECTUS_URL || + process.env.PUBLIC_URL || + process.env.NEXT_PUBLIC_DIRECTUS_URL || + 'http://localhost:8055' +).replace(/\/$/, ''); + +// DIRECTUS_SERVER_TOKEN does not have permission to PATCH permission rows. Requires an admin token. +const TOKEN = process.env.DIRECTUS_ADMIN_TOKEN; + +if (!TOKEN) { + console.error('Missing admin token.'); + console.error('Add DIRECTUS_ADMIN_TOKEN to a frontend .env (e.g. cms/nextjs/.env), or run:'); + console.error(' DIRECTUS_ADMIN_TOKEN=your-token pnpm rbac:sync-licensed'); + process.exit(1); +} + +if (!existsSync(LICENSED_PERMISSIONS)) { + console.error(`Licensed permissions file not found: ${LICENSED_PERMISSIONS}`); + console.error('Run: pnpm rbac:codegen'); + process.exit(1); +} + +const licensedRows = JSON.parse(readFileSync(LICENSED_PERMISSIONS, 'utf8')); + +function permKey(row) { + return `${row.collection}:${row.action}:${row.policy}`; +} + +function hasCustomRules(row) { + const p = row.permissions; + const v = row.validation; + const presets = row.presets; + const fields = row.fields; + return ( + (p !== null && p !== undefined && JSON.stringify(p) !== '{}') || + (v !== null && v !== undefined && JSON.stringify(v) !== '{}' && JSON.stringify(v) !== 'null') || + presets !== null || + (Array.isArray(fields) && fields.length > 0 && !(fields.length === 1 && fields[0] === '*')) + ); +} + +async function api(path, options = {}) { + const res = await fetch(`${DIRECTUS_URL}${path}`, { + ...options, + headers: { + Authorization: `Bearer ${TOKEN}`, + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + const body = await res.json().catch(() => ({})); + if (!res.ok) { + const msg = body?.errors?.[0]?.message || body?.message || res.statusText; + + throw new Error(`${options.method || 'GET'} ${path} failed (${res.status}): ${msg}`); + } + return body; +} + +async function apiStatus(path, options = {}) { + const res = await fetch(`${DIRECTUS_URL}${path}`, { + ...options, + headers: { + Authorization: `Bearer ${TOKEN}`, + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + const body = await res.json().catch(() => ({})); + return { ok: res.ok, status: res.status, body }; +} + +function isCircularRedirect(urlFrom, urlTo) { + if (!urlFrom || !urlTo) return false; + const normalize = (path) => (path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path); + return normalize(urlFrom) === normalize(urlTo); +} + +async function removeCircularRedirects() { + const res = await api('/items/redirects?limit=-1&fields=id,url_from,url_to'); + const items = res.data ?? []; + const circular = items.filter((row) => isCircularRedirect(row.url_from, row.url_to)); + + if (circular.length === 0) { + console.log('Circular redirects: none found.'); + return 0; + } + + await api('/items/redirects', { + method: 'DELETE', + body: JSON.stringify(circular.map((row) => row.id)), + }); + + console.log(`Circular redirects: removed ${circular.length}.`); + return circular.length; +} + +function operationPayload(template) { + return { + id: template.id, + name: template.name, + key: template.key, + type: template.type, + position_x: template.position_x, + position_y: template.position_y, + options: template.options, + resolve: template.resolve, + reject: template.reject, + flow: template.flow, + }; +} + +async function syncRedirectFlowOperations() { + if (!existsSync(LICENSED_OPERATIONS)) { + console.warn('operations.json not found — skipped redirect flow patch.'); + return; + } + + const templateOps = JSON.parse(readFileSync(LICENSED_OPERATIONS, 'utf8')); + const byId = new Map(templateOps.map((op) => [op.id, op])); + let patched = 0; + let created = 0; + + for (const id of REDIRECT_FLOW_OP_IDS) { + const template = byId.get(id); + if (!template) { + console.warn(`Redirect flow operation ${id} missing from template — skipped.`); + continue; + } + + const { ok } = await apiStatus(`/operations/${id}`); + + if (ok) { + await api(`/operations/${id}`, { + method: 'PATCH', + body: JSON.stringify({ + options: template.options, + resolve: template.resolve, + reject: template.reject, + }), + }); + patched++; + } else { + await api('/operations', { + method: 'POST', + body: JSON.stringify(operationPayload(template)), + }); + created++; + } + } + + console.log(`Redirect automation flow: ${patched} patched, ${created} created.`); +} + +async function main() { + const existing = await api('/permissions?limit=-1&fields=id,collection,action,policy'); + const rows = existing.data ?? existing; + const byKey = new Map(rows.map((row) => [permKey(row), row])); + + let updated = 0; + let missing = 0; + let customAfter = 0; + + for (const licensed of licensedRows) { + const key = permKey(licensed); + const current = byKey.get(key); + if (!current) { + missing++; + console.warn(`No existing permission for ${key} — skipped (apply template first)`); + + continue; + } + + const payload = { + permissions: licensed.permissions, + validation: licensed.validation, + presets: licensed.presets, + fields: licensed.fields, + }; + + await api(`/permissions/${current.id}`, { + method: 'PATCH', + body: JSON.stringify(payload), + }); + + updated++; + if (hasCustomRules(licensed)) customAfter++; + } + + // Verify public pages read filter landed + const pagesPublic = licensedRows.find( + (r) => r.collection === 'pages' && r.action === 'read' && r.policy === 'abf8a154-5b1c-4a46-ac9c-7300570f4f17', + ); + const pagesPublicDb = pagesPublic ? byKey.get(permKey(pagesPublic)) : undefined; + let verify = 'not checked'; + + if (pagesPublicDb) { + const check = await api(`/permissions/${pagesPublicDb.id}?fields=permissions`); + const perms = check.data?.permissions ?? check.permissions; + verify = perms?._and ? 'licensed filters present' : 'still flat — check LICENSE_KEY is active'; + } + + console.log(`Synced ${updated} permission rows (${customAfter} with custom rules).`); + if (missing) console.log(`${missing} licensed rows had no matching DB row.`); + console.log(`Public pages read: ${verify}`); + + await removeCircularRedirects(); + await syncRedirectFlowOperations(); + console.log('Licensed upgrade complete. Restart frontend dev servers so redirects reload.'); +} + +main().catch((err) => { + console.error(err.message); + process.exit(1); +}); diff --git a/_scripts/validate-templates.js b/_scripts/validate-templates.js index a3bbc2b7..584159c2 100644 --- a/_scripts/validate-templates.js +++ b/_scripts/validate-templates.js @@ -67,35 +67,73 @@ function validateMetadata(template) { } } -// Validate Directus template files -function validateDirectusTemplate(template) { - const config = template.pkg['directus:template'] - - // Blank templates (template: null) don't need directus files - if (config.template === null) return - - const templatePath = join(template.path, config.template.replace(/^\.\//, '')) +// Validate a single Directus template directory +function validateTemplateDir(templateName, basePath, templateRelPath, label) { + const templatePath = join(basePath, templateRelPath.replace(/^\.\//, '')) const srcPath = join(templatePath, 'src') - // Check template directory exists if (!existsSync(templatePath)) { - error(template.name, `Template path does not exist: ${config.template}`) + error(templateName, `Template path does not exist: ${label}`) return } - // Check required schema files const requiredFiles = ['collections.json', 'fields.json'] for (const file of requiredFiles) { - const filePath = join(srcPath, file) - if (!existsSync(filePath)) { - error(template.name, `Missing required file: ${config.template}/src/${file}`) + if (!existsSync(join(srcPath, file))) { + error(templateName, `Missing required file: ${label}/src/${file}`) } } - // Check template package.json - const templatePkg = join(templatePath, 'package.json') - if (!existsSync(templatePkg)) { - warn(template.name, 'Missing directus/template/package.json') + if (!existsSync(join(templatePath, 'package.json'))) { + warn(templateName, `Missing package.json in template: ${label}`) + } + + validateSingletonContent(templateName, srcPath) +} + +// Validate Directus template files +function validateDirectusTemplate(template) { + const config = template.pkg['directus:template'] + + // Blank templates (template: null) don't need directus files + if (config.template === null) return + + validateTemplateDir(template.name, template.path, config.template, config.template) + + // Validate variant template paths + if (config.variants) { + for (const [variantKey, variant] of Object.entries(config.variants)) { + if (variant.template) { + validateTemplateDir(template.name, template.path, variant.template, `${variant.template} (variant: ${variantKey})`) + } + } + } +} + +// Singleton collections load after regular collections in directus-template-cli. +// Translation rows for a singleton must be nested in its content file, not a separate *_translations.json. +function validateSingletonContent(templateName, srcPath) { + const contentDir = join(srcPath, 'content') + if (!existsSync(contentDir)) return + + const collections = readJson(join(srcPath, 'collections.json')) + if (!collections) return + + const contentFiles = new Set( + readdirSync(contentDir) + .filter((file) => file.endsWith('.json')) + .map((file) => file.replace(/\.json$/, '')), + ) + + for (const { collection, meta } of collections) { + if (!meta?.singleton) continue + const translationsFile = `${collection}_translations` + if (contentFiles.has(translationsFile)) { + error( + templateName, + `content/${translationsFile}.json must not exist — nest translations inside content/${collection}.json (template-cli loads singletons last)`, + ) + } } } diff --git a/_shared/.env.example b/_shared/.env.example index 541c74fe..70031931 100644 --- a/_shared/.env.example +++ b/_shared/.env.example @@ -7,14 +7,24 @@ DB_DATABASE=directus DIRECTUS_PORT=8055 DIRECTUS_SECRET=6116487b-cda1-52c2-b5b5-c8022c45e263 +# License Configuration (optional) +# Directus 12 runs on the free core tier without a key. Add a license key to +# unlock higher limits (users, collections, flows) and custom permission rules. +# Get a key: https://directus.io/docs/licensing/overview +# Activation requires a valid absolute PUBLIC_URL. After setting the key, +# recreate Directus (docker compose up -d --force-recreate directus). +# You can also add a key in the Studio under Settings -> License. +# LICENSE_KEY= +# +# Licensed local testing: LICENSE_KEY must live in the .env next to docker-compose.yaml +# (e.g. cms/directus/.env), not only here in _shared/. Set NODE_ENV=production and +# apply ./template-licensed via directus-template-cli. +# NODE_ENV=production + # Cache Configuration CACHE_ENABLED=true CACHE_AUTO_PURGE=true -# Admin Configuration -ADMIN_EMAIL=admin@example.com -ADMIN_PASSWORD=d1r3ctu5 - # WebSocket Configuration WEBSOCKETS_ENABLED=true diff --git a/_shared/docker-compose.yaml b/_shared/docker-compose.yaml index a80a0c89..fb86ec25 100644 --- a/_shared/docker-compose.yaml +++ b/_shared/docker-compose.yaml @@ -28,7 +28,7 @@ services: start_period: 30s directus: - image: directus/directus:11.17.4 + image: directus/directus:12.0.0 ports: - ${DIRECTUS_PORT}:8055 volumes: @@ -41,6 +41,8 @@ services: condition: service_healthy environment: SECRET: ${DIRECTUS_SECRET} + LICENSE_KEY: ${LICENSE_KEY:-} + NODE_ENV: ${NODE_ENV:-production} DB_CLIENT: 'pg' DB_HOST: 'database' @@ -54,12 +56,10 @@ services: CACHE_STORE: 'redis' REDIS: 'redis://cache:6379' - ADMIN_EMAIL: ${ADMIN_EMAIL} - ADMIN_PASSWORD: ${ADMIN_PASSWORD} - WEBSOCKETS_ENABLED: ${WEBSOCKETS_ENABLED} PUBLIC_URL: ${PUBLIC_URL} + IP_TRUST_PROXY: 'true' CORS_ENABLED: ${CORS_ENABLED} CORS_ORIGIN: ${CORS_ORIGIN} diff --git a/_shared/rbac/README.md b/_shared/rbac/README.md new file mode 100644 index 00000000..9dc6a84f --- /dev/null +++ b/_shared/rbac/README.md @@ -0,0 +1,56 @@ +# RBAC source (maintainers only) + +> **Not for starter users.** People applying these templates use the pre-built JSON in `cms/directus/template/` and `template-licensed/`. They never run codegen. User docs: [`cms/directus/README.md`](../../cms/directus/README.md). + +This folder is the **single source of truth** for CMS permission rules. When you change RBAC here, regenerate the template files so git and CI stay in sync. + +## Why codegen exists + +Licensed rules live in small module files (`licensed/modules/*.json`) instead of one giant hand-edited `permissions.json`. The codegen script: + +1. Merges modules → `cms/directus/template-licensed/src/permissions.json` +2. Flattens those rules → `cms/directus/template/src/permissions.json` (core tier: empty filters) +3. Copies the licensed template tree and syncs skeleton RBAC files +4. Applies the cms-i18n delta → `cms-i18n/directus/template/src/permissions.json` + +**Do not edit generated permission files in the template folders by hand** — change source here, then run codegen. + +## Codegen vs sync-licensed vs template apply + +| | Audience | Purpose | +|--|----------|---------| +| **Template apply** (`directus-template-cli`) | Starter users | Load schema + permissions from committed JSON on a **new or reset** instance | +| **`pnpm rbac:sync-licensed`** | Starter users upgrading core → licensed | PATCH permission rules on a **live** instance; also removes circular redirects and patches Redirect automation (Path 2 — do not re-apply template) | +| **`pnpm rbac:codegen`** | **This repo's maintainers** | Rebuild committed template JSON **after you edit `_shared/rbac/`** | + +Codegen updates files in git. Sync-licensed calls the Directus API. Template apply imports from git. Three different layers — not interchangeable. + +## When to run codegen + +Run from the **repo root** after any change under `_shared/rbac/`: + +```bash +pnpm rbac:codegen +``` + +Then commit the generated outputs (template permissions, template-licensed tree, cms-i18n permissions). + +CI runs `pnpm rbac:codegen:check` — it fails if generated files drift from source. Fix with `pnpm rbac:codegen` and commit. + +## Layout + +| Path | Edit this? | Purpose | +|------|------------|---------| +| `core-skeleton/` | Yes | Shared `roles.json`, `policies.json`, `access.json` | +| `licensed/modules/*.json` | Yes | Focused rule sets merged into licensed permissions | +| `licensed/permissions.json` | Generated | Merged reference (codegen output) | +| `cms-i18n-permissions.delta.json` | Yes | Extra permission rows for cms-i18n only | + +## Licensed modules + +- **public-api-filters** — Public policy: published status, active nav/forms +- **writer-self-access** — Content - Self: author-scoped posts +- **content-manage-rules** — Content - Manage: globals field list +- **form-submission-hardening** — Forms - Submission: upload folder, size limit +- **live-preview-access** — Content - Live Preview read rules +- **studio-team-rules** — Team - App Access: shares, flows, ai_prompts diff --git a/_shared/rbac/cms-i18n-permissions.delta.json b/_shared/rbac/cms-i18n-permissions.delta.json new file mode 100644 index 00000000..a0196755 --- /dev/null +++ b/_shared/rbac/cms-i18n-permissions.delta.json @@ -0,0 +1,207 @@ +[ + { + "collection": "block_gallery_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_form_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_button_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_hero_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_posts_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_pricing_cards_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_pricing_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_richtext_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "form_fields_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "posts_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "navigation_items_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "languages", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "globals_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "pages_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "forms_translations", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "globals", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "seo", + "url", + "title", + "tagline", + "description", + "social", + "og_image", + "twitter_image", + "social_links", + "contact", + "street_address", + "address_locality", + "address_region", + "postal_code", + "address_country", + "email", + "phone", + "routes", + "logo_on_dark_bg", + "logo_on_light_bg", + "theme", + "logo", + "favicon", + "logo_dark_mode", + "accent_color", + "notice-7-fv9g", + "divider_logo", + "divider_social", + "translations" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + } +] diff --git a/_shared/rbac/core-skeleton/access.json b/_shared/rbac/core-skeleton/access.json new file mode 100644 index 00000000..9a31f05b --- /dev/null +++ b/_shared/rbac/core-skeleton/access.json @@ -0,0 +1,79 @@ +[ + { + "id": "6de77eee-b06c-4665-97a9-2e54467483f9", + "role": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", + "user": null, + "policy": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", + "sort": 1 + }, + { + "id": "7233bfd6-e3f9-4573-81a0-f50bc497ba3f", + "role": null, + "user": null, + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17", + "sort": 1 + }, + { + "id": "17fce6a0-06cb-4bdf-b0c7-cc789f131d17", + "role": "4516009c-8a04-49e4-b4ac-fd4883da6064", + "user": null, + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928", + "sort": 1 + }, + { + "id": "60941652-9d10-45c0-aefa-be5e65ce54a0", + "role": "d70780bd-f3ed-418b-98c2-f5354fd3fa68", + "user": null, + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928", + "sort": 1 + }, + { + "id": "17616f4c-8b7f-4084-a34f-4089d5bcfba2", + "role": "3a4464fb-2189-4710-a164-2503eed88ae7", + "user": null, + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3", + "sort": 1 + }, + { + "id": "9fbb829a-7cbd-4132-b22c-9a3bc89be671", + "role": "3a4464fb-2189-4710-a164-2503eed88ae7", + "user": null, + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17", + "sort": 2 + }, + { + "id": "eadeac2d-6517-4a7b-a270-4a05f1136f82", + "role": "d70780bd-f3ed-418b-98c2-f5354fd3fa68", + "user": null, + "policy": "52598a64-071d-4071-96fa-4b620d6189b5", + "sort": 3 + }, + { + "id": "4de285fa-4a1a-4f65-b424-bdc8f02f7800", + "role": "3a4464fb-2189-4710-a164-2503eed88ae7", + "user": null, + "policy": "52598a64-071d-4071-96fa-4b620d6189b5", + "sort": 3 + }, + { + "id": "0d7b1ae1-d7e3-4479-b716-8ac4aad8288a", + "role": "4516009c-8a04-49e4-b4ac-fd4883da6064", + "user": null, + "policy": "52598a64-071d-4071-96fa-4b620d6189b5", + "sort": 3 + }, + { + "id": "b3a1f380-9421-4b1e-b32f-6d0c4a2e7f10", + "role": null, + "user": "88a6e8cf-f0f8-41db-a3a2-8a9741c086cc", + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329", + "sort": 1 + }, + { + "id": "c8e4a1b2-3d5f-4e6a-9b0c-1d2e3f4a5b6c", + "role": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", + "user": null, + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5", + "sort": 2 + } +] diff --git a/_shared/rbac/core-skeleton/policies.json b/_shared/rbac/core-skeleton/policies.json new file mode 100644 index 00000000..d56cf378 --- /dev/null +++ b/_shared/rbac/core-skeleton/policies.json @@ -0,0 +1,72 @@ +[ + { + "id": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5", + "name": "Content - Live Preview", + "icon": "preview", + "description": "Grants read access to pages and posts for live preview. Assigned to the Administrator role (your onboarding admin). Apply template-licensed for enforceable rules.", + "ip_access": null, + "enforce_tfa": false, + "admin_access": false, + "app_access": false + }, + { + "id": "52598a64-071d-4071-96fa-4b620d6189b5", + "name": "Team - App Access", + "icon": "badge", + "description": "Grants Directus Studio access to team members", + "ip_access": null, + "enforce_tfa": false, + "admin_access": false, + "app_access": true + }, + { + "id": "8ba4ed6f-d330-4675-ae46-119c533a0928", + "name": "Content - Manage", + "icon": "edit", + "description": "Grants ability to read and edit ALL content. Used by Editor and Content Admin roles.", + "ip_access": null, + "enforce_tfa": false, + "admin_access": false, + "app_access": false + }, + { + "id": "a15b697e-29d5-4164-8d24-eb228ba901e3", + "name": "Content - Self", + "icon": "self_improvement", + "description": "Grants ability to edit own content only. Used by the Writer role. Apply template-licensed for author-scoped enforcement.", + "ip_access": null, + "enforce_tfa": false, + "admin_access": false, + "app_access": false + }, + { + "id": "abf8a154-5b1c-4a46-ac9c-7300570f4f17", + "name": "Content - Public", + "icon": "public", + "description": "Grants read access to website content collections. Frontends filter to published content in queries. Apply template-licensed for API-level published filters.", + "ip_access": null, + "enforce_tfa": false, + "admin_access": false, + "app_access": false + }, + { + "id": "ee1055a2-7c03-4b0b-9b65-ca68491b6329", + "name": "Forms - Submission", + "icon": "smart_button", + "description": "Grants ability to create form submissions. Used by the Frontend Bot machine user.", + "ip_access": null, + "enforce_tfa": false, + "admin_access": false, + "app_access": false + }, + { + "id": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", + "name": "Administrator", + "icon": "verified", + "description": "$t:admin_policy_description", + "ip_access": null, + "enforce_tfa": false, + "admin_access": true, + "app_access": true + } +] diff --git a/_shared/rbac/core-skeleton/roles.json b/_shared/rbac/core-skeleton/roles.json new file mode 100644 index 00000000..ab7959ff --- /dev/null +++ b/_shared/rbac/core-skeleton/roles.json @@ -0,0 +1,42 @@ +[ + { + "id": "3a4464fb-2189-4710-a164-2503eed88ae7", + "name": "Writer", + "icon": "docs_add_on", + "description": "Role that can create new posts and edit their own posts.", + "parent": null, + "children": null, + "policies": null, + "users": null + }, + { + "id": "4516009c-8a04-49e4-b4ac-fd4883da6064", + "name": "Editor", + "icon": "nest_wake_on_approach", + "description": "Role that has the ability to edit and publish all content.", + "parent": null, + "children": null, + "policies": null, + "users": null + }, + { + "id": "d70780bd-f3ed-418b-98c2-f5354fd3fa68", + "name": "Content Admin", + "icon": "admin_panel_settings", + "description": "Role with full rights to edit all content. Useful for simple sites or those without publishing approval workflows.", + "parent": null, + "children": null, + "policies": null, + "users": null + }, + { + "id": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", + "name": "Administrator", + "icon": "verified", + "description": "$t:admin_description", + "parent": null, + "children": null, + "policies": null, + "users": null + } +] diff --git a/_shared/rbac/licensed/modules/content-manage-rules.json b/_shared/rbac/licensed/modules/content-manage-rules.json new file mode 100644 index 00000000..c1694a38 --- /dev/null +++ b/_shared/rbac/licensed/modules/content-manage-rules.json @@ -0,0 +1,1006 @@ +[ + { + "collection": "block_button", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "blog_settings", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "blog_settings", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "blog_settings", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "blog_settings", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "forms", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "forms", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "forms", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "forms", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "globals", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "title", + "url", + "divider_logo", + "logo", + "favicon", + "tagline", + "description", + "divider_social", + "social_links", + "logo_dark_mode", + "accent_color", + "notice-7-fv9g" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "globals", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "title", + "url", + "divider_logo", + "logo", + "favicon", + "tagline", + "description", + "divider_social", + "social_links", + "logo_dark_mode", + "accent_color", + "notice-7-fv9g" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "globals", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "title", + "url", + "divider_logo", + "logo", + "favicon", + "tagline", + "description", + "divider_social", + "social_links", + "logo_dark_mode", + "notice-7-fv9g", + "accent_color" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation_items", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation_items", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation_items", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation_items", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "pages", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "pages", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "pages", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "pages", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "posts", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "posts", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "posts", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "posts", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "projects_settings", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_fields", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_fields", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_fields", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_fields", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_submission_values", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_submission_values", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_submissions", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_submissions", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_posts", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_posts", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_posts", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_posts", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_form", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_form", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_form", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_form", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery_items", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery_items", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery_items", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery_items", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing_cards", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing_cards", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing_cards", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing_cards", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_folders", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_folders", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_folders", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_folders", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_files", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_files", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_files", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + } +] diff --git a/_shared/rbac/licensed/modules/form-submission-hardening.json b/_shared/rbac/licensed/modules/form-submission-hardening.json new file mode 100644 index 00000000..c3754025 --- /dev/null +++ b/_shared/rbac/licensed/modules/form-submission-hardening.json @@ -0,0 +1,86 @@ +[ + { + "collection": "directus_files", + "action": "create", + "permissions": null, + "validation": { + "_and": [ + { + "filesize": { + "_lte": "5000000" + } + } + ] + }, + "presets": { + "folder": "e6308546-92fb-4b10-b586-eefaf1d97f7f" + }, + "fields": [ + "*" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "form_submission_values", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "form_submissions", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "form_submission_values", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "id" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "form_submissions", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "id" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": { + "_and": [ + { + "folder": { + "_eq": "e6308546-92fb-4b10-b586-eefaf1d97f7f" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "id" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + } +] diff --git a/_shared/rbac/licensed/modules/live-preview-access.json b/_shared/rbac/licensed/modules/live-preview-access.json new file mode 100644 index 00000000..5df05507 --- /dev/null +++ b/_shared/rbac/licensed/modules/live-preview-access.json @@ -0,0 +1,35 @@ +[ + { + "collection": "page_blocks", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + }, + { + "collection": "pages", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + }, + { + "collection": "posts", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + } +] diff --git a/_shared/rbac/licensed/modules/public-api-filters.json b/_shared/rbac/licensed/modules/public-api-filters.json new file mode 100644 index 00000000..f0f5ba44 --- /dev/null +++ b/_shared/rbac/licensed/modules/public-api-filters.json @@ -0,0 +1,413 @@ +[ + { + "collection": "pages", + "action": "read", + "permissions": { + "_and": [ + { + "status": { + "_eq": "published" + } + }, + { + "published_at": { + "_lte": "$NOW" + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "posts", + "action": "read", + "permissions": { + "_and": [ + { + "status": { + "_eq": "published" + } + }, + { + "published_at": { + "_lte": "$NOW" + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_hero", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_richtext", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "globals", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "seo", + "url", + "title", + "tagline", + "description", + "social", + "og_image", + "twitter_image", + "social_links", + "contact", + "street_address", + "address_locality", + "address_region", + "postal_code", + "address_country", + "email", + "phone", + "routes", + "logo_on_dark_bg", + "logo_on_light_bg", + "theme", + "logo", + "favicon", + "logo_dark_mode", + "accent_color", + "notice-7-fv9g", + "divider_logo", + "divider_social" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "page_blocks", + "action": "read", + "permissions": { + "_and": [ + { + "page": { + "status": { + "_eq": "published" + } + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "forms", + "action": "read", + "permissions": { + "_and": [ + { + "is_active": { + "_eq": true + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "id", + "sort", + "title", + "is_active", + "meta_tabs", + "meta_fields", + "fields", + "submit_label", + "on_success", + "success_message", + "success_redirect_url" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "navigation", + "action": "read", + "permissions": { + "_and": [ + { + "is_active": { + "_eq": true + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "navigation_items", + "action": "read", + "permissions": { + "_and": [ + { + "_or": [ + { + "navigation": { + "is_active": { + "_eq": true + } + } + }, + { + "parent": { + "navigation": { + "is_active": { + "_eq": true + } + } + } + } + ] + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_gallery", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "blog_settings", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "chat_config", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_button_group", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_button", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": { + "_and": [ + { + "_or": [ + { + "folder": { + "name": { + "_contains": "Public" + } + } + }, + { + "folder": { + "parent": { + "name": { + "_contains": "Public" + } + } + } + } + ] + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_form", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_posts", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "form_fields", + "action": "read", + "permissions": { + "_and": [ + { + "form": { + "is_active": { + "_eq": true + } + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_gallery_items", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_pricing", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_pricing_cards", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "directus_users", + "action": "read", + "permissions": { + "_and": [ + { + "posts": { + "_nnull": true + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "first_name", + "last_name", + "avatar", + "title", + "id" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "redirects", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + } +] diff --git a/_shared/rbac/licensed/modules/studio-team-rules.json b/_shared/rbac/licensed/modules/studio-team-rules.json new file mode 100644 index 00000000..e4823c1d --- /dev/null +++ b/_shared/rbac/licensed/modules/studio-team-rules.json @@ -0,0 +1,326 @@ +[ + { + "collection": "directus_dashboards", + "action": "create", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_dashboards", + "action": "read", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_dashboards", + "action": "update", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_dashboards", + "action": "delete", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_panels", + "action": "create", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_panels", + "action": "read", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_panels", + "action": "update", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_panels", + "action": "delete", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_users", + "action": "read", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_users", + "action": "update", + "permissions": { + "id": { + "_eq": "$CURRENT_USER" + } + }, + "validation": null, + "presets": null, + "fields": [ + "first_name", + "last_name", + "email", + "password", + "location", + "title", + "description", + "avatar", + "language", + "appearance", + "theme_light", + "theme_dark", + "theme_light_overrides", + "theme_dark_overrides", + "tfa_secret" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_roles", + "action": "read", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_shares", + "action": "read", + "permissions": { + "_or": [ + { + "role": { + "_eq": "$CURRENT_ROLE" + } + }, + { + "role": { + "_null": true + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_shares", + "action": "create", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_shares", + "action": "update", + "permissions": { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_shares", + "action": "delete", + "permissions": { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_flows", + "action": "read", + "permissions": { + "trigger": { + "_eq": "manual" + } + }, + "validation": null, + "presets": null, + "fields": [ + "id", + "status", + "name", + "icon", + "color", + "options", + "trigger" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_folders", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "ai_prompts", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "ai_prompts", + "action": "read", + "permissions": { + "_and": [ + { + "_or": [ + { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, + { + "status": { + "_eq": "published" + } + } + ] + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "ai_prompts", + "action": "update", + "permissions": { + "_and": [ + { + "user_created": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "ai_prompts", + "action": "delete", + "permissions": { + "_and": [ + { + "user_created": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + } +] diff --git a/_shared/rbac/licensed/modules/writer-self-access.json b/_shared/rbac/licensed/modules/writer-self-access.json new file mode 100644 index 00000000..d3a3457a --- /dev/null +++ b/_shared/rbac/licensed/modules/writer-self-access.json @@ -0,0 +1,129 @@ +[ + { + "collection": "posts", + "action": "create", + "permissions": null, + "validation": { + "_and": [ + { + "status": { + "_neq": "published" + } + } + ] + }, + "presets": { + "author": "$CURRENT_USER" + }, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "posts", + "action": "read", + "permissions": { + "_and": [ + { + "author": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "posts", + "action": "update", + "permissions": { + "_and": [ + { + "author": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": { + "_and": [ + { + "status": { + "_neq": "published" + } + } + ] + }, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "directus_files", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "directus_files", + "action": "update", + "permissions": { + "_and": [ + { + "uploaded_by": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "directus_files", + "action": "delete", + "permissions": { + "_and": [ + { + "uploaded_by": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + } +] diff --git a/_shared/rbac/licensed/permissions.json b/_shared/rbac/licensed/permissions.json new file mode 100644 index 00000000..62f2a83f --- /dev/null +++ b/_shared/rbac/licensed/permissions.json @@ -0,0 +1,1985 @@ +[ + { + "collection": "pages", + "action": "read", + "permissions": { + "_and": [ + { + "status": { + "_eq": "published" + } + }, + { + "published_at": { + "_lte": "$NOW" + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "posts", + "action": "read", + "permissions": { + "_and": [ + { + "status": { + "_eq": "published" + } + }, + { + "published_at": { + "_lte": "$NOW" + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_hero", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_richtext", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "globals", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "seo", + "url", + "title", + "tagline", + "description", + "social", + "og_image", + "twitter_image", + "social_links", + "contact", + "street_address", + "address_locality", + "address_region", + "postal_code", + "address_country", + "email", + "phone", + "routes", + "logo_on_dark_bg", + "logo_on_light_bg", + "theme", + "logo", + "favicon", + "logo_dark_mode", + "accent_color", + "notice-7-fv9g", + "divider_logo", + "divider_social" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "page_blocks", + "action": "read", + "permissions": { + "_and": [ + { + "page": { + "status": { + "_eq": "published" + } + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "forms", + "action": "read", + "permissions": { + "_and": [ + { + "is_active": { + "_eq": true + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "id", + "sort", + "title", + "is_active", + "meta_tabs", + "meta_fields", + "fields", + "submit_label", + "on_success", + "success_message", + "success_redirect_url" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "navigation", + "action": "read", + "permissions": { + "_and": [ + { + "is_active": { + "_eq": true + } + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "navigation_items", + "action": "read", + "permissions": { + "_and": [ + { + "_or": [ + { + "navigation": { + "is_active": { + "_eq": true + } + } + }, + { + "parent": { + "navigation": { + "is_active": { + "_eq": true + } + } + } + } + ] + } + ] + }, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_gallery", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "blog_settings", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "chat_config", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_button_group", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_button", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": { + "_and": [ + { + "_or": [ + { + "folder": { + "name": { + "_contains": "Public" + } + } + }, + { + "folder": { + "parent": { + "name": { + "_contains": "Public" + } + } + } + } + ] + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_form", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_posts", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "form_fields", + "action": "read", + "permissions": { + "_and": [ + { + "form": { + "is_active": { + "_eq": true + } + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_gallery_items", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_pricing", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "block_pricing_cards", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "directus_users", + "action": "read", + "permissions": { + "_and": [ + { + "posts": { + "_nnull": true + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "first_name", + "last_name", + "avatar", + "title", + "id" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "redirects", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "posts", + "action": "create", + "permissions": null, + "validation": { + "_and": [ + { + "status": { + "_neq": "published" + } + } + ] + }, + "presets": { + "author": "$CURRENT_USER" + }, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "posts", + "action": "read", + "permissions": { + "_and": [ + { + "author": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "posts", + "action": "update", + "permissions": { + "_and": [ + { + "author": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": { + "_and": [ + { + "status": { + "_neq": "published" + } + } + ] + }, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "directus_files", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "directus_files", + "action": "update", + "permissions": { + "_and": [ + { + "uploaded_by": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "directus_files", + "action": "delete", + "permissions": { + "_and": [ + { + "uploaded_by": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + }, + { + "collection": "block_button", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "blog_settings", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "blog_settings", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "blog_settings", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "blog_settings", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "forms", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "forms", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "forms", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "forms", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "globals", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "title", + "url", + "divider_logo", + "logo", + "favicon", + "tagline", + "description", + "divider_social", + "social_links", + "logo_dark_mode", + "accent_color", + "notice-7-fv9g" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "globals", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "title", + "url", + "divider_logo", + "logo", + "favicon", + "tagline", + "description", + "divider_social", + "social_links", + "logo_dark_mode", + "accent_color", + "notice-7-fv9g" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "globals", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "id", + "title", + "url", + "divider_logo", + "logo", + "favicon", + "tagline", + "description", + "divider_social", + "social_links", + "logo_dark_mode", + "notice-7-fv9g", + "accent_color" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation_items", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation_items", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation_items", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "navigation_items", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "pages", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "pages", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "pages", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "pages", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "posts", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "posts", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "posts", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "posts", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "projects_settings", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_fields", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_fields", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_fields", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_fields", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_submission_values", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_submission_values", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_submissions", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "form_submissions", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_posts", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_posts", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_posts", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_posts", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_form", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_form", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_form", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_form", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery_items", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery_items", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery_items", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery_items", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing_cards", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing_cards", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing_cards", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_pricing_cards", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_folders", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_folders", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_folders", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_folders", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_files", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_files", + "action": "update", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "directus_files", + "action": "delete", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "page_blocks", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + }, + { + "collection": "pages", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + }, + { + "collection": "posts", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + }, + { + "collection": "directus_files", + "action": "create", + "permissions": null, + "validation": { + "_and": [ + { + "filesize": { + "_lte": "5000000" + } + } + ] + }, + "presets": { + "folder": "e6308546-92fb-4b10-b586-eefaf1d97f7f" + }, + "fields": [ + "*" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "form_submission_values", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "form_submissions", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "form_submission_values", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "id" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "form_submissions", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "id" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": { + "_and": [ + { + "folder": { + "_eq": "e6308546-92fb-4b10-b586-eefaf1d97f7f" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "id" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "directus_dashboards", + "action": "create", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_dashboards", + "action": "read", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_dashboards", + "action": "update", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_dashboards", + "action": "delete", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_panels", + "action": "create", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_panels", + "action": "read", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_panels", + "action": "update", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_panels", + "action": "delete", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_users", + "action": "read", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_users", + "action": "update", + "permissions": { + "id": { + "_eq": "$CURRENT_USER" + } + }, + "validation": null, + "presets": null, + "fields": [ + "first_name", + "last_name", + "email", + "password", + "location", + "title", + "description", + "avatar", + "language", + "appearance", + "theme_light", + "theme_dark", + "theme_light_overrides", + "theme_dark_overrides", + "tfa_secret" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_roles", + "action": "read", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_shares", + "action": "read", + "permissions": { + "_or": [ + { + "role": { + "_eq": "$CURRENT_ROLE" + } + }, + { + "role": { + "_null": true + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_shares", + "action": "create", + "permissions": {}, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_shares", + "action": "update", + "permissions": { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_shares", + "action": "delete", + "permissions": { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_flows", + "action": "read", + "permissions": { + "trigger": { + "_eq": "manual" + } + }, + "validation": null, + "presets": null, + "fields": [ + "id", + "status", + "name", + "icon", + "color", + "options", + "trigger" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_folders", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "directus_files", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "ai_prompts", + "action": "create", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "ai_prompts", + "action": "read", + "permissions": { + "_and": [ + { + "_or": [ + { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, + { + "status": { + "_eq": "published" + } + } + ] + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "ai_prompts", + "action": "update", + "permissions": { + "_and": [ + { + "user_created": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + }, + { + "collection": "ai_prompts", + "action": "delete", + "permissions": { + "_and": [ + { + "user_created": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + } +] diff --git a/blank/directus/.env.example b/blank/directus/.env.example index 4bbe16e0..84cc0683 100644 --- a/blank/directus/.env.example +++ b/blank/directus/.env.example @@ -7,13 +7,20 @@ DB_DATABASE=directus DIRECTUS_PORT=8055 DIRECTUS_SECRET=6116487b-cda1-52c2-b5b5-c8022c45e263 +# License Configuration (optional) +# Directus 12 runs on the free core tier without a key. Add a license key to +# unlock higher limits (users, collections, flows) and licensed features. +# Get a key: https://directus.io/docs/licensing/overview +# Activation requires a valid absolute PUBLIC_URL. After setting the key, +# restart Directus (docker compose restart directus). You can also add a key +# in the Studio under Settings -> License. +# LICENSE_KEY= + # Cache Configuration CACHE_ENABLED=true CACHE_AUTO_PURGE=true -# Admin Configuration - Commented out to use onboarding in blank template -# ADMIN_EMAIL=admin@example.com -# ADMIN_PASSWORD=d1r3ctu5 +# Admin setup: on first launch, Directus prompts you to create your admin account via the onboarding screen. # WebSocket Configuration WEBSOCKETS_ENABLED=true diff --git a/blank/directus/docker-compose.yaml b/blank/directus/docker-compose.yaml index e24b12ae..04e79b76 100644 --- a/blank/directus/docker-compose.yaml +++ b/blank/directus/docker-compose.yaml @@ -1,7 +1,7 @@ name: directus-cms-template services: database: - image: postgis/postgis:13-master + image: postgis/postgis:16-master platform: linux/amd64 volumes: - ./data/database:/var/lib/postgresql/data @@ -28,7 +28,7 @@ services: start_period: 30s directus: - image: directus/directus:11.17.4 + image: directus/directus:12.0.0 ports: - ${DIRECTUS_PORT}:8055 volumes: @@ -41,6 +41,8 @@ services: condition: service_healthy environment: SECRET: ${DIRECTUS_SECRET} + LICENSE_KEY: ${LICENSE_KEY:-} + NODE_ENV: ${NODE_ENV:-production} DB_CLIENT: 'pg' DB_HOST: 'database' @@ -57,6 +59,7 @@ services: WEBSOCKETS_ENABLED: ${WEBSOCKETS_ENABLED} PUBLIC_URL: ${PUBLIC_URL} + IP_TRUST_PROXY: 'true' CORS_ENABLED: ${CORS_ENABLED} CORS_ORIGIN: ${CORS_ORIGIN} diff --git a/cms-i18n/README.md b/cms-i18n/README.md index c8c3fab6..66e77962 100644 --- a/cms-i18n/README.md +++ b/cms-i18n/README.md @@ -4,6 +4,9 @@ Welcome to the **CMS Starter Templates with Internationalization (i18n) Support* CMS starters with built-in multilingual support. Each subfolder is a framework-specific implementation with locale-based routing, Directus translation integration, and a language switcher. +> [!IMPORTANT] +> **This starter requires a Directus license** (Team tier or [Open Innovation Grant](https://directus.io/docs/licensing/overview)). Add your `LICENSE_KEY` before applying the template — see [Directus setup](#directus-setup). + ## **Templates** | Framework | Description | Links | @@ -36,20 +39,43 @@ These templates also include all CMS starter features: - Draft content support - SEO metadata management -## **Directus Setup** +## **Directus setup** + +From `cms-i18n/directus/`: + +1. `cp .env.example .env` — set `LICENSE_KEY`, then start Directus: + + ```bash + docker compose up -d + ``` + + Or add your key during admin onboarding or in **Settings → License**. If you change `LICENSE_KEY` in `.env` later, run `docker compose up -d --force-recreate directus`. + +2. Open `http://localhost:8055`, complete onboarding, and create your admin account. + +3. Generate a static token on that admin user (Users Directory → Token → **Save**). Use it for template apply and `DIRECTUS_SERVER_TOKEN` in your frontend `.env`. + +4. Apply the template: + + ```bash + npx directus-template-cli@latest apply + ``` -The i18n schema (languages collection, translation tables, etc.) is included in the Directus template located in -`directus/template/`. Apply it to your Directus instance using the -[Directus Template CLI](https://github.com/directus/template-cli): + - **Template Source:** Local directory + - **Template Location:** `./template` + - **Directus URL:** `http://localhost:8055` + - **Token:** your admin static token -```bash -npx directus-template-cli@latest apply -``` + Programmatic apply: -## **Local Setup (with CLI)** + ```bash + npx directus-template-cli@latest apply -p \ + --directusUrl="http://localhost:8055" \ + --directusToken="YOUR_ADMIN_TOKEN" \ + --templateLocation="./template" \ + --templateType="local" + ``` -Run this in your terminal: +5. Connect a frontend ([Next.js](./nextjs) or [Nuxt](./nuxt)): copy its `.env.example`, set the Directus URL, `DIRECTUS_SERVER_TOKEN`, and site URL. -```bash -npx directus-template-cli@latest init -``` +After apply you should see **3 users**: your admin, Frontend Bot, and Content Writer (`writer@example.com`). diff --git a/cms-i18n/directus/.env.example b/cms-i18n/directus/.env.example index 541c74fe..2b51c48d 100644 --- a/cms-i18n/directus/.env.example +++ b/cms-i18n/directus/.env.example @@ -7,14 +7,15 @@ DB_DATABASE=directus DIRECTUS_PORT=8055 DIRECTUS_SECRET=6116487b-cda1-52c2-b5b5-c8022c45e263 +# License (required for this starter) +# Set before apply, or add in Studio under Settings -> License. +# https://directus.io/docs/licensing/overview +# LICENSE_KEY= + # Cache Configuration CACHE_ENABLED=true CACHE_AUTO_PURGE=true -# Admin Configuration -ADMIN_EMAIL=admin@example.com -ADMIN_PASSWORD=d1r3ctu5 - # WebSocket Configuration WEBSOCKETS_ENABLED=true diff --git a/cms-i18n/directus/docker-compose.yaml b/cms-i18n/directus/docker-compose.yaml index 2375d6ca..6bfe98f6 100644 --- a/cms-i18n/directus/docker-compose.yaml +++ b/cms-i18n/directus/docker-compose.yaml @@ -28,7 +28,7 @@ services: start_period: 30s directus: - image: directus/directus:11.17.4 + image: directus/directus:12.0.0 ports: - ${DIRECTUS_PORT}:8055 volumes: @@ -41,6 +41,8 @@ services: condition: service_healthy environment: SECRET: ${DIRECTUS_SECRET} + LICENSE_KEY: ${LICENSE_KEY:-} + NODE_ENV: ${NODE_ENV:-production} DB_CLIENT: 'pg' DB_HOST: 'database' @@ -54,12 +56,10 @@ services: CACHE_STORE: 'redis' REDIS: 'redis://cache:6379' - ADMIN_EMAIL: ${ADMIN_EMAIL} - ADMIN_PASSWORD: ${ADMIN_PASSWORD} - WEBSOCKETS_ENABLED: ${WEBSOCKETS_ENABLED} PUBLIC_URL: ${PUBLIC_URL} + IP_TRUST_PROXY: 'true' CORS_ENABLED: ${CORS_ENABLED} CORS_ORIGIN: ${CORS_ORIGIN} diff --git a/cms-i18n/directus/template/README.md b/cms-i18n/directus/template/README.md index 1bbe6f94..f6ce289b 100644 --- a/cms-i18n/directus/template/README.md +++ b/cms-i18n/directus/template/README.md @@ -1,10 +1,3 @@ -# CMS - i18n Template - -This is a template for [Directus](https://directus.io/) - an open-source headless CMS and API. Use the template-cli to load / apply this template to a blank instance. - -## Why - -## What - -## License +# CMS i18n template +Requires a Directus license. Setup: [`../../README.md`](../../README.md#directus-setup). diff --git a/cms-i18n/directus/template/src/access.json b/cms-i18n/directus/template/src/access.json index ac567426..9a31f05b 100644 --- a/cms-i18n/directus/template/src/access.json +++ b/cms-i18n/directus/template/src/access.json @@ -1,16 +1,16 @@ [ { - "id": "6c8f2d4a-1af9-412d-a405-73e27664ca8a", - "role": null, + "id": "6de77eee-b06c-4665-97a9-2e54467483f9", + "role": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", "user": null, - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17", + "policy": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", "sort": 1 }, { - "id": "6de77eee-b06c-4665-97a9-2e54467483f9", - "role": "e97bfc75-d358-4cb5-bdf8-bc505c466ac8", + "id": "7233bfd6-e3f9-4573-81a0-f50bc497ba3f", + "role": null, "user": null, - "policy": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17", "sort": 1 }, { @@ -42,31 +42,38 @@ "sort": 2 }, { - "id": "0d7b1ae1-d7e3-4479-b716-8ac4aad8288a", - "role": "4516009c-8a04-49e4-b4ac-fd4883da6064", + "id": "eadeac2d-6517-4a7b-a270-4a05f1136f82", + "role": "d70780bd-f3ed-418b-98c2-f5354fd3fa68", "user": null, "policy": "52598a64-071d-4071-96fa-4b620d6189b5", "sort": 3 }, { - "id": "eadeac2d-6517-4a7b-a270-4a05f1136f82", - "role": "d70780bd-f3ed-418b-98c2-f5354fd3fa68", + "id": "4de285fa-4a1a-4f65-b424-bdc8f02f7800", + "role": "3a4464fb-2189-4710-a164-2503eed88ae7", "user": null, "policy": "52598a64-071d-4071-96fa-4b620d6189b5", "sort": 3 }, { - "id": "4de285fa-4a1a-4f65-b424-bdc8f02f7800", - "role": "3a4464fb-2189-4710-a164-2503eed88ae7", + "id": "0d7b1ae1-d7e3-4479-b716-8ac4aad8288a", + "role": "4516009c-8a04-49e4-b4ac-fd4883da6064", "user": null, "policy": "52598a64-071d-4071-96fa-4b620d6189b5", "sort": 3 }, { - "id": "48f41f10-bdc6-405b-abc8-4da15df42043", - "role": "e97bfc75-d358-4cb5-bdf8-bc505c466ac8", + "id": "b3a1f380-9421-4b1e-b32f-6d0c4a2e7f10", + "role": null, + "user": "88a6e8cf-f0f8-41db-a3a2-8a9741c086cc", + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329", + "sort": 1 + }, + { + "id": "c8e4a1b2-3d5f-4e6a-9b0c-1d2e3f4a5b6c", + "role": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", "user": null, - "policy": "ea6ff38d-214f-44df-aca6-138c91cd31c6", - "sort": null + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5", + "sort": 2 } ] diff --git a/cms-i18n/directus/template/src/content/ai_prompts.json b/cms-i18n/directus/template/src/content/ai_prompts.json index 63c5f939..2d116a48 100644 --- a/cms-i18n/directus/template/src/content/ai_prompts.json +++ b/cms-i18n/directus/template/src/content/ai_prompts.json @@ -8,9 +8,9 @@ "messages": null, "system_prompt": "You are an award-winning article humanizer and expert {{ audience }}. You work for {{company}}.\nYour writing style is world renowned for its rawness, simplicity, impact, and practicality.\nWrite in markdown only.", "date_created": "2025-05-07T00:30:52.830Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.236Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "19c62e5d-b566-42c8-a0ab-a145c0e67c9e", @@ -26,9 +26,9 @@ ], "system_prompt": "You're a world-class content writer.", "date_created": "2025-05-07T00:30:52.830Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.238Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "3b5d8ca2-3418-406f-8f14-46010521a65d", @@ -44,8 +44,8 @@ ], "system_prompt": "You're an e-commerce expert. You write product descriptions that sell a ton of product.", "date_created": "2025-05-07T00:30:52.830Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.242Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null } ] \ No newline at end of file diff --git a/cms-i18n/directus/template/src/content/block_button.json b/cms-i18n/directus/template/src/content/block_button.json index ff144a00..c1f27766 100644 --- a/cms-i18n/directus/template/src/content/block_button.json +++ b/cms-i18n/directus/template/src/content/block_button.json @@ -10,9 +10,9 @@ "button_group": null, "url": null, "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.333Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "fb03b293-a0ba-4d1f-9137-11acff42ac91" ] @@ -28,9 +28,9 @@ "button_group": null, "url": null, "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.347Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "1945607d-61aa-4760-84b3-f4b252fbaa78" ] @@ -46,9 +46,9 @@ "button_group": null, "url": null, "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.358Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "e1834900-4d22-4725-8638-ccad2e049753" ] @@ -64,9 +64,9 @@ "button_group": null, "url": null, "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.373Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "5a80adf1-5be1-4f0a-a8bc-b507a543f0b4" ] @@ -82,9 +82,9 @@ "button_group": null, "url": null, "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.377Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "d31ff02a-cf54-4cc1-a27c-09d898c198e3" ] @@ -100,9 +100,9 @@ "button_group": "00024c32-7123-4342-8350-44d09ca6827a", "url": null, "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.387Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "bde679c3-76a8-44d4-88c0-7c1ceab5a0b7", "6ffdc637-d93e-4bc5-a36d-7705be2a8421" @@ -119,9 +119,9 @@ "button_group": null, "url": null, "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.396Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "f4c5570c-a4eb-4b07-a75a-c7dcfec42c3a" ] @@ -137,9 +137,9 @@ "button_group": null, "url": "/your-stripe-checkout-link", "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.399Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "4f227736-7f33-4975-8cf4-ac4a4f532758" ] @@ -155,9 +155,9 @@ "button_group": null, "url": "/get-a-demo", "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.401Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "1b4e2469-edfb-457d-9c5f-ca47858053d4" ] @@ -173,9 +173,9 @@ "button_group": null, "url": "/get-a-demo", "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.404Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "058749aa-4d05-4cec-9122-04fbc7054dc5" ] @@ -191,9 +191,9 @@ "button_group": null, "url": "/your-stripe-checkout-link", "date_created": "2025-05-07T01:25:11.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.406Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "7c327767-3a3a-4ce7-b212-c836145a068a" ] @@ -209,7 +209,7 @@ "button_group": null, "url": "/your-stripe-checkout-link", "date_created": "2025-12-22T22:40:54.716Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": null, "user_updated": null, "translations": [ @@ -227,7 +227,7 @@ "button_group": null, "url": "/get-a-demo", "date_created": "2025-12-22T22:40:54.721Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": null, "user_updated": null, "translations": [ diff --git a/cms-i18n/directus/template/src/content/block_button_group.json b/cms-i18n/directus/template/src/content/block_button_group.json index 53fcf265..244369fb 100644 --- a/cms-i18n/directus/template/src/content/block_button_group.json +++ b/cms-i18n/directus/template/src/content/block_button_group.json @@ -3,9 +3,9 @@ "id": "00024c32-7123-4342-8350-44d09ca6827a", "sort": null, "date_created": "2025-05-07T01:25:10.722Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.436Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "buttons": [ "91bf487e-7fb8-4b80-ab35-d46c73d21464" ] diff --git a/cms-i18n/directus/template/src/content/block_form.json b/cms-i18n/directus/template/src/content/block_form.json index d923f6bc..3f523bc6 100644 --- a/cms-i18n/directus/template/src/content/block_form.json +++ b/cms-i18n/directus/template/src/content/block_form.json @@ -5,9 +5,9 @@ "headline": "Get all the goodness, right in your inbox", "tagline": "Newsletter", "date_created": "2025-05-07T01:22:45.902Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.524Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "70c4322c-7a54-49ef-8edf-ca27ccbea41a", "6fc1d59f-715a-4323-8f03-7bd375920f30", @@ -25,9 +25,9 @@ "headline": "Let's talk about your project", "tagline": "Contact", "date_created": "2025-05-07T01:22:45.902Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.529Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "7a740f19-8a3a-44a6-917d-92bf697281a7", "1e405fac-8841-4074-a2f5-26b27e357ce3", @@ -45,9 +45,9 @@ "headline": "Get all the goodness, right in your inbox", "tagline": "Newsletter", "date_created": "2025-05-07T01:22:45.902Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.532Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "e836b2b0-997b-4403-92fd-03a8f9a470ee" ] @@ -58,9 +58,9 @@ "headline": "Subscribe to get updates", "tagline": "Newsletter", "date_created": "2025-05-07T01:22:45.902Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.536Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "d67a7520-081d-4882-a8cc-310f49837f52" ] diff --git a/cms-i18n/directus/template/src/content/block_gallery.json b/cms-i18n/directus/template/src/content/block_gallery.json index a6090ddd..9b20507c 100644 --- a/cms-i18n/directus/template/src/content/block_gallery.json +++ b/cms-i18n/directus/template/src/content/block_gallery.json @@ -4,9 +4,9 @@ "id": "34fdcf0e-cc5d-4c40-b61f-4f0a5e167306", "tagline": "Template Gallery", "date_created": "2025-05-07T01:25:08.962Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.622Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "items": [ "1dbac868-e2cc-4930-9f21-5e0dd1b40e52", "2a0369dc-1b43-4d5a-9832-d180a0aa0295", diff --git a/cms-i18n/directus/template/src/content/block_gallery_items.json b/cms-i18n/directus/template/src/content/block_gallery_items.json index 8b0cdd9a..44d6ec12 100644 --- a/cms-i18n/directus/template/src/content/block_gallery_items.json +++ b/cms-i18n/directus/template/src/content/block_gallery_items.json @@ -5,9 +5,9 @@ "directus_file": "a051ea01-07a5-45cb-bcc6-411af9560be5", "sort": 10, "date_created": "2025-05-07T01:25:09.436Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.739Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "1dbac868-e2cc-4930-9f21-5e0dd1b40e52", @@ -15,9 +15,9 @@ "directus_file": "03a7d1c7-81e2-432f-9561-9df2691189c8", "sort": 7, "date_created": "2025-05-07T01:25:09.436Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.741Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "1f520e55-4054-47f9-896a-baf2787ec007", @@ -25,9 +25,9 @@ "directus_file": "dc258f02-d1a3-47f4-9f3e-2a71a0010c56", "sort": 12, "date_created": "2025-05-07T01:25:09.436Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.743Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "2a0369dc-1b43-4d5a-9832-d180a0aa0295", @@ -35,9 +35,9 @@ "directus_file": "c2a301bd-74ed-4a50-9b85-3cb1f40f8dee", "sort": 8, "date_created": "2025-05-07T01:25:09.436Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.744Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "46f226f4-6d13-4783-878f-3ae0eafcfd5d", @@ -45,9 +45,9 @@ "directus_file": "6964d750-1c00-4b9c-81e4-0c81cfa82bbb", "sort": 9, "date_created": "2025-05-07T01:25:09.436Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.746Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "d3481aae-7dc4-446f-8b68-50e77aab58da", @@ -55,8 +55,8 @@ "directus_file": "50570a31-a990-453c-bdfc-0ad7175dd8bf", "sort": 11, "date_created": "2025-05-07T01:25:09.436Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:23.748Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null } ] \ No newline at end of file diff --git a/cms-i18n/directus/template/src/content/block_hero.json b/cms-i18n/directus/template/src/content/block_hero.json index 44f93346..4c953106 100644 --- a/cms-i18n/directus/template/src/content/block_hero.json +++ b/cms-i18n/directus/template/src/content/block_hero.json @@ -8,9 +8,9 @@ "tagline": "CMS", "layout": "image_right", "date_created": "2025-05-07T01:22:17.909Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T22:43:19.758Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "ae25ee67-039e-4bf6-99e3-afd4d4102f60", "ebec46f1-a212-40fa-9510-3a9cbb58a5df", diff --git a/cms-i18n/directus/template/src/content/block_posts.json b/cms-i18n/directus/template/src/content/block_posts.json index a1622e27..85bbd5b1 100644 --- a/cms-i18n/directus/template/src/content/block_posts.json +++ b/cms-i18n/directus/template/src/content/block_posts.json @@ -6,9 +6,9 @@ "tagline": "Blog", "limit": 6, "date_created": "2025-05-07T01:22:46.276Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:38.929Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "5968140b-1025-41a8-bf39-7d1cdb338577", "4fcd9b71-2f32-4998-b18f-4b1b0ee5d613", diff --git a/cms-i18n/directus/template/src/content/block_pricing.json b/cms-i18n/directus/template/src/content/block_pricing.json index 95fed660..3e8332aa 100644 --- a/cms-i18n/directus/template/src/content/block_pricing.json +++ b/cms-i18n/directus/template/src/content/block_pricing.json @@ -4,9 +4,9 @@ "headline": "Plans to fit every budget", "tagline": "Pricing", "date_created": "2025-12-22T19:48:15.722Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T22:37:53.955Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "pricing_cards": [ "388404db-1703-4b10-b12b-e5d4385f1530", "83972d2a-742e-4a6c-8698-563d01dde54d" @@ -26,7 +26,7 @@ "headline": null, "tagline": null, "date_created": "2025-12-22T19:48:15.727Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": null, "user_updated": null, "pricing_cards": [], diff --git a/cms-i18n/directus/template/src/content/block_pricing_cards.json b/cms-i18n/directus/template/src/content/block_pricing_cards.json index c6aa89e4..57afa976 100644 --- a/cms-i18n/directus/template/src/content/block_pricing_cards.json +++ b/cms-i18n/directus/template/src/content/block_pricing_cards.json @@ -15,9 +15,9 @@ "is_highlighted": false, "sort": 1, "date_created": "2025-12-22T22:40:54.718Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T22:37:53.958Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "b1887cc5-f9ab-4bde-9a50-00a980343fa4", "e95d9eac-12da-4a1e-83a1-fa5621faf089", @@ -44,9 +44,9 @@ "is_highlighted": false, "sort": null, "date_created": "2025-05-07T01:25:10.254Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:24.138Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "3aa14a37-aa88-490a-84f7-83316721c8b1", "737d537b-d913-40a0-a278-d674ba361c01", @@ -72,9 +72,9 @@ "is_highlighted": false, "sort": 2, "date_created": "2025-12-22T22:40:54.722Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T22:37:53.958Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "e2d7aa30-940d-433e-bb13-a939807ba9db", "9ad5691e-db1e-4480-b9e1-e27cf24761ff", @@ -100,9 +100,9 @@ "is_highlighted": true, "sort": null, "date_created": "2025-05-07T01:25:10.254Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:24.141Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "9c10c3a7-ac8b-408f-a319-d225e4368cae", "49e7bfe4-d66c-406b-9d50-792ecade9889", diff --git a/cms-i18n/directus/template/src/content/block_richtext.json b/cms-i18n/directus/template/src/content/block_richtext.json index a7dbdd4f..24fce88e 100644 --- a/cms-i18n/directus/template/src/content/block_richtext.json +++ b/cms-i18n/directus/template/src/content/block_richtext.json @@ -6,9 +6,9 @@ "alignment": "center", "tagline": "About Us", "date_created": "2025-05-07T01:22:45.368Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.224Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "1e19adef-f540-4313-a566-832cfbb1c137", "75d664a8-a1c2-4662-9205-eb84a8a1b910", @@ -28,9 +28,9 @@ "alignment": "center", "tagline": "Why Us?", "date_created": "2025-05-07T01:22:45.368Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.228Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "babab5e2-5100-4d33-b575-3015fb79defc", "e59cf06d-4115-4ece-88d3-988860aede06", @@ -50,9 +50,9 @@ "alignment": "center", "tagline": null, "date_created": "2025-05-07T01:22:45.368Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.231Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "4980d27d-3b6c-4742-8940-6e2576921398", "5c81c6ce-19d6-4d80-a552-eb7bb4fecf7b", @@ -72,9 +72,9 @@ "alignment": "center", "tagline": null, "date_created": "2025-05-07T01:22:45.368Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.233Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "058a5256-e642-497a-83d8-741da2dab29c", "9a3ec00b-a3f8-4beb-b676-5db9b57a36e2", diff --git a/cms-i18n/directus/template/src/content/form_fields.json b/cms-i18n/directus/template/src/content/form_fields.json index 1ff38607..c2a22822 100644 --- a/cms-i18n/directus/template/src/content/form_fields.json +++ b/cms-i18n/directus/template/src/content/form_fields.json @@ -13,9 +13,9 @@ "sort": 1, "required": true, "date_created": "2025-05-07T01:02:23.666Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.324Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "a5dae4bf-1e2c-4aea-81d7-3dea1350da6e", "ab099552-7c59-4e17-8da7-7d3ee8ec2bc3" @@ -35,9 +35,9 @@ "sort": 5, "required": false, "date_created": "2025-05-07T01:02:23.666Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.329Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "ab6f4ab4-e69f-4943-a89e-00ad9c944d65", "9994072a-e134-4fbb-be3d-69e9c26f7bac" @@ -57,9 +57,9 @@ "sort": 3, "required": true, "date_created": "2025-05-07T01:02:23.666Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.336Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "73483946-9975-4f50-9df8-45964ccbfd9a", "fa490558-9bc1-40c9-b07d-727d24dce330" @@ -88,7 +88,7 @@ "sort": 4, "required": false, "date_created": "2025-05-07T01:02:23.666Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T22:58:07.763Z", "user_updated": null, "translations": [ @@ -110,9 +110,9 @@ "sort": 2, "required": true, "date_created": "2025-05-07T01:02:23.666Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.344Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "d00a881b-1427-4b02-ac0b-a662f3d53e00", "71e85e6e-ce5e-4064-a2fb-96d74fc3adc6" @@ -132,9 +132,9 @@ "sort": 2, "required": true, "date_created": "2025-05-07T01:02:23.666Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.347Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "186ccdb9-a689-48ab-87c5-4e8e4d59a879", "daf64642-1017-4c08-8df2-71e881d7f2ac" @@ -154,9 +154,9 @@ "sort": 1, "required": true, "date_created": "2025-05-07T01:02:23.666Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.350Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "54471931-d5d9-4977-875f-f6cf2202a1c8", "3eb364e9-3c75-491d-aa93-f8d816d13c15" diff --git a/cms-i18n/directus/template/src/content/forms.json b/cms-i18n/directus/template/src/content/forms.json index 1d8664d9..eb49667b 100644 --- a/cms-i18n/directus/template/src/content/forms.json +++ b/cms-i18n/directus/template/src/content/forms.json @@ -10,9 +10,9 @@ "is_active": true, "emails": null, "date_created": "2025-05-07T01:00:24.531Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:24.438Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "fields": [ "eef0eb77-ecab-4fba-9903-c46d6ad6d85b", "bbc7b1c6-304e-4ee1-9afa-c5cffda6af27", @@ -50,9 +50,9 @@ } ], "date_created": "2025-05-07T01:00:24.531Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:24.445Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "fields": [ "0f3deba1-9d6b-44a0-aa87-a9b38e834beb", "d37bc00f-bfb5-4496-85c3-70190b21b707" diff --git a/cms-i18n/directus/template/src/content/globals.json b/cms-i18n/directus/template/src/content/globals.json index c781bb92..a29c4dad 100644 --- a/cms-i18n/directus/template/src/content/globals.json +++ b/cms-i18n/directus/template/src/content/globals.json @@ -28,21 +28,104 @@ "url": "https://www.yoururl.com", "favicon": "2b4a0ba0-52c7-4e10-b191-c803d8da6a36", "logo": "43ddd7b8-9b2f-4aa1-b63c-933b4ae81ca2", - "openai_api_key": null, "directus_url": "http://0.0.0.0:8055", "logo_dark_mode": "ae390ba1-fcff-4b99-a445-5f19257095d1", "accent_color": "#6644FF", "date_created": "2025-10-27T19:32:06.531Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:46.184Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ - "60a04efc-a83a-43d4-a8b3-dde34ef90bf1", - "0749467a-ca67-49d0-b1c3-d3fdd8c0d467", - "ee2f0073-d2b5-4560-81f5-9a4bf3b2bf3f", - "855c92ba-7d31-4a54-8d11-8105e3fdc052", - "082f0f46-b624-477c-a61b-7643b6630092", - "3bc5b193-f5d7-4e92-a2b8-4000edf0ad6b", - "e4a688c3-c7ca-4adc-ab47-d352919052ec" + { + "id": "60a04efc-a83a-43d4-a8b3-dde34ef90bf1", + "status": "published", + "sort": null, + "user_created": null, + "date_created": "2025-12-22T21:46:48.606Z", + "user_updated": null, + "date_updated": "2025-12-23T22:43:54.707Z", + "languages_code": "es-ES", + "description": "Te empoderamos para construir el mejor sitio posible", + "tagline": "El mejor sitio de todos", + "title": "Tu Sitio" + }, + { + "id": "0749467a-ca67-49d0-b1c3-d3fdd8c0d467", + "status": "published", + "sort": null, + "user_created": null, + "date_created": "2025-12-23T00:36:37.517Z", + "user_updated": null, + "date_updated": "2025-12-23T22:43:54.726Z", + "languages_code": "de-DE", + "description": "Wir ermöglichen es Ihnen, die beste Website zu erstellen", + "tagline": "Die beste Website überhaupt", + "title": "Ihre Website" + }, + { + "id": "ee2f0073-d2b5-4560-81f5-9a4bf3b2bf3f", + "status": "published", + "sort": null, + "user_created": null, + "date_created": "2025-12-23T22:33:07.532Z", + "user_updated": null, + "date_updated": "2025-12-23T22:43:54.729Z", + "languages_code": "ar-SA", + "description": "نساعدك على بناء أفضل موقع ممكن", + "tagline": "أفضل موقع على الإطلاق", + "title": "موقعك" + }, + { + "id": "855c92ba-7d31-4a54-8d11-8105e3fdc052", + "status": "published", + "sort": null, + "user_created": null, + "date_created": "2025-12-23T22:33:07.535Z", + "user_updated": null, + "date_updated": "2025-12-23T22:43:54.732Z", + "languages_code": "fr-FR", + "description": "Nous vous aidons à créer le meilleur site possible", + "tagline": "Le meilleur site qui soit", + "title": "Votre site" + }, + { + "id": "082f0f46-b624-477c-a61b-7643b6630092", + "status": "published", + "sort": null, + "user_created": null, + "date_created": "2025-12-23T22:33:07.537Z", + "user_updated": null, + "date_updated": "2025-12-23T22:43:54.735Z", + "languages_code": "it-IT", + "description": "Ti aiutiamo a costruire il miglior sito possibile", + "tagline": "Il miglior sito di sempre", + "title": "Il tuo sito" + }, + { + "id": "3bc5b193-f5d7-4e92-a2b8-4000edf0ad6b", + "status": "published", + "sort": null, + "user_created": null, + "date_created": "2025-12-23T22:33:07.539Z", + "user_updated": null, + "date_updated": "2025-12-23T22:43:54.739Z", + "languages_code": "pt-BR", + "description": "Ajudamos você a criar o melhor site possível", + "tagline": "O melhor site de todos", + "title": "Seu site" + }, + { + "id": "e4a688c3-c7ca-4adc-ab47-d352919052ec", + "status": "published", + "sort": null, + "user_created": null, + "date_created": "2025-12-23T22:33:07.540Z", + "user_updated": null, + "date_updated": "2025-12-23T22:43:54.742Z", + "languages_code": "ru-RU", + "description": "Мы помогаем вам создать лучший возможный сайт", + "tagline": "Лучший сайт на свете", + "title": "Ваш сайт" + } ] -} \ No newline at end of file +} diff --git a/cms-i18n/directus/template/src/content/globals_translations.json b/cms-i18n/directus/template/src/content/globals_translations.json deleted file mode 100644 index 011f3c5d..00000000 --- a/cms-i18n/directus/template/src/content/globals_translations.json +++ /dev/null @@ -1,100 +0,0 @@ -[ - { - "id": "60a04efc-a83a-43d4-a8b3-dde34ef90bf1", - "status": "published", - "sort": null, - "user_created": null, - "date_created": "2025-12-22T21:46:48.606Z", - "user_updated": null, - "date_updated": "2025-12-23T22:43:54.707Z", - "globals": "ab89c489-faea-4310-8b59-7ddb3caf279a", - "languages_code": "es-ES", - "description": "Te empoderamos para construir el mejor sitio posible", - "tagline": "El mejor sitio de todos", - "title": "Tu Sitio" - }, - { - "id": "0749467a-ca67-49d0-b1c3-d3fdd8c0d467", - "status": "published", - "sort": null, - "user_created": null, - "date_created": "2025-12-23T00:36:37.517Z", - "user_updated": null, - "date_updated": "2025-12-23T22:43:54.726Z", - "globals": "ab89c489-faea-4310-8b59-7ddb3caf279a", - "languages_code": "de-DE", - "description": "Wir ermöglichen es Ihnen, die beste Website zu erstellen", - "tagline": "Die beste Website überhaupt", - "title": "Ihre Website" - }, - { - "id": "ee2f0073-d2b5-4560-81f5-9a4bf3b2bf3f", - "status": "published", - "sort": null, - "user_created": null, - "date_created": "2025-12-23T22:33:07.532Z", - "user_updated": null, - "date_updated": "2025-12-23T22:43:54.729Z", - "globals": "ab89c489-faea-4310-8b59-7ddb3caf279a", - "languages_code": "ar-SA", - "description": "نساعدك على بناء أفضل موقع ممكن", - "tagline": "أفضل موقع على الإطلاق", - "title": "موقعك" - }, - { - "id": "855c92ba-7d31-4a54-8d11-8105e3fdc052", - "status": "published", - "sort": null, - "user_created": null, - "date_created": "2025-12-23T22:33:07.535Z", - "user_updated": null, - "date_updated": "2025-12-23T22:43:54.732Z", - "globals": "ab89c489-faea-4310-8b59-7ddb3caf279a", - "languages_code": "fr-FR", - "description": "Nous vous aidons à créer le meilleur site possible", - "tagline": "Le meilleur site qui soit", - "title": "Votre site" - }, - { - "id": "082f0f46-b624-477c-a61b-7643b6630092", - "status": "published", - "sort": null, - "user_created": null, - "date_created": "2025-12-23T22:33:07.537Z", - "user_updated": null, - "date_updated": "2025-12-23T22:43:54.735Z", - "globals": "ab89c489-faea-4310-8b59-7ddb3caf279a", - "languages_code": "it-IT", - "description": "Ti aiutiamo a costruire il miglior sito possibile", - "tagline": "Il miglior sito di sempre", - "title": "Il tuo sito" - }, - { - "id": "3bc5b193-f5d7-4e92-a2b8-4000edf0ad6b", - "status": "published", - "sort": null, - "user_created": null, - "date_created": "2025-12-23T22:33:07.539Z", - "user_updated": null, - "date_updated": "2025-12-23T22:43:54.739Z", - "globals": "ab89c489-faea-4310-8b59-7ddb3caf279a", - "languages_code": "pt-BR", - "description": "Ajudamos você a criar o melhor site possível", - "tagline": "O melhor site de todos", - "title": "Seu site" - }, - { - "id": "e4a688c3-c7ca-4adc-ab47-d352919052ec", - "status": "published", - "sort": null, - "user_created": null, - "date_created": "2025-12-23T22:33:07.540Z", - "user_updated": null, - "date_updated": "2025-12-23T22:43:54.742Z", - "globals": "ab89c489-faea-4310-8b59-7ddb3caf279a", - "languages_code": "ru-RU", - "description": "Мы помогаем вам создать лучший возможный сайт", - "tagline": "Лучший сайт на свете", - "title": "Ваш сайт" - } -] \ No newline at end of file diff --git a/cms-i18n/directus/template/src/content/navigation.json b/cms-i18n/directus/template/src/content/navigation.json index dd5c9f82..1ade4fc4 100644 --- a/cms-i18n/directus/template/src/content/navigation.json +++ b/cms-i18n/directus/template/src/content/navigation.json @@ -4,9 +4,9 @@ "title": "Footer Navigation", "is_active": true, "date_created": "2025-05-07T01:05:28.716Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:24.841Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "items": [ "dc0870f8-e316-48b0-b34d-ca5c4394344c", "e096f25c-a549-4fe5-a284-17b0a347037a", @@ -18,9 +18,9 @@ "title": "Main Navigation", "is_active": true, "date_created": "2025-05-07T01:05:28.716Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:24.846Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "items": [ "192a490a-bbb9-4794-b82f-619a01463723", "0ca39155-c212-4b6e-8156-5a4322731c07" diff --git a/cms-i18n/directus/template/src/content/navigation_items.json b/cms-i18n/directus/template/src/content/navigation_items.json index 4980d898..72cdc0cf 100644 --- a/cms-i18n/directus/template/src/content/navigation_items.json +++ b/cms-i18n/directus/template/src/content/navigation_items.json @@ -10,9 +10,9 @@ "url": null, "post": null, "date_created": "2025-05-07T01:12:13.856Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.924Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "children": [ "28fde01b-647b-4151-96e5-6d876d3f3329", "717b30fd-1bf6-46eb-a0cd-81923c17fcf6" @@ -38,9 +38,9 @@ "url": null, "post": null, "date_created": "2025-05-07T01:12:13.856Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.931Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "children": [], "translations": [ "5dd7f7e0-c054-4365-9d20-1c4de8d9a711", @@ -63,9 +63,9 @@ "url": null, "post": null, "date_created": "2025-05-07T01:12:13.856Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.936Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "children": [], "translations": [ "94859212-303e-479a-9a38-b401b3a4c695", @@ -88,9 +88,9 @@ "url": null, "post": null, "date_created": "2025-05-07T01:12:13.856Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.940Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "children": [], "translations": [ "13871f30-7021-41a6-aabf-a397a91d5271", @@ -113,9 +113,9 @@ "url": "/posts", "post": null, "date_created": "2025-05-07T01:12:13.856Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.944Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "children": [], "translations": [ "551413b6-1e72-459c-a269-b0689b53d64a", @@ -138,9 +138,9 @@ "url": null, "post": null, "date_created": "2025-05-07T01:12:13.856Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.948Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "children": [], "translations": [ "2252ee0c-a128-4ea6-9928-a43a30be319c", @@ -163,9 +163,9 @@ "url": null, "post": null, "date_created": "2025-05-07T01:12:13.856Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:39.951Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "children": [], "translations": [ "3b84aeb3-3f4f-43b8-be47-59ba5c08452d", diff --git a/cms-i18n/directus/template/src/content/page_blocks.json b/cms-i18n/directus/template/src/content/page_blocks.json index a99142c8..52073e63 100644 --- a/cms-i18n/directus/template/src/content/page_blocks.json +++ b/cms-i18n/directus/template/src/content/page_blocks.json @@ -8,9 +8,9 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.039Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "1f774f44-3e33-4b0f-93f4-fdd6df898438", @@ -21,9 +21,9 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.042Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "bc826e30-4988-4035-98bd-5ffc4799e5fc", @@ -34,9 +34,9 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.044Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "2b757f25-9c2f-446c-980f-87fb138c6766", @@ -47,9 +47,9 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T22:43:19.780Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "0ff1d6c4-ff77-46c6-ad02-f9ae31484505", @@ -60,9 +60,9 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.049Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "7e1ce212-3f8a-43b4-aff7-131bf4241e30", @@ -73,9 +73,9 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.051Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "2b017efb-ce7c-4b90-9f59-a39236ffe571", @@ -86,9 +86,9 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.047Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "2d9abe8f-a7ad-480d-8fc7-603c712e2f40", @@ -99,9 +99,9 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.052Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "529e6408-7372-4195-b82d-e444c06ac492", @@ -112,9 +112,9 @@ "hide_block": false, "background": "dark", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.055Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null }, { "id": "39d02b18-18d2-4c29-9268-038f72ea05fe", @@ -125,8 +125,8 @@ "hide_block": false, "background": "light", "date_created": "2025-05-07T00:57:32.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T22:37:53.970Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null } ] \ No newline at end of file diff --git a/cms-i18n/directus/template/src/content/pages.json b/cms-i18n/directus/template/src/content/pages.json index 8d6c4d44..46508b75 100644 --- a/cms-i18n/directus/template/src/content/pages.json +++ b/cms-i18n/directus/template/src/content/pages.json @@ -14,9 +14,9 @@ "og_image": "ea743e20-e6e9-4be8-a949-3771cd182810.png" }, "date_created": "2025-05-07T00:49:42.958Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T22:43:19.748Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "blocks": [ "2b757f25-9c2f-446c-980f-87fb138c6766", "7e1ce212-3f8a-43b4-aff7-131bf4241e30", @@ -46,9 +46,9 @@ "meta_description": "All the tips and advice we've learned about working with headless CMS over the years." }, "date_created": "2025-05-07T00:49:42.958Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.158Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "blocks": [ "45227f61-5ff1-431c-8dee-1a50d369325f", "2b017efb-ce7c-4b90-9f59-a39236ffe571" @@ -75,9 +75,9 @@ "title": "Contact Us | Reach out to our team if you need help" }, "date_created": "2025-05-07T00:49:42.958Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.170Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "blocks": [ "1f774f44-3e33-4b0f-93f4-fdd6df898438" ], @@ -103,9 +103,9 @@ "no_index": true }, "date_created": "2025-05-07T00:49:42.958Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.181Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "blocks": [ "0ff1d6c4-ff77-46c6-ad02-f9ae31484505" ], @@ -131,9 +131,9 @@ "meta_description": "Here's all the fine print for our website. You can read it all. There's nothing secret. It's just words to fill up the page. You'll want to change them later." }, "date_created": "2025-05-07T00:49:42.958Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.191Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "blocks": [ "bc826e30-4988-4035-98bd-5ffc4799e5fc" ], diff --git a/cms-i18n/directus/template/src/content/posts.json b/cms-i18n/directus/template/src/content/posts.json index f7289c79..49400bb1 100644 --- a/cms-i18n/directus/template/src/content/posts.json +++ b/cms-i18n/directus/template/src/content/posts.json @@ -8,7 +8,7 @@ "status": "in_review", "title": "Essential Tips for Keeping Your Bunny Looking and Feeling Their Best", "description": "Rabbit grooming, encompassing brushing, nail trimming, ear cleaning, dental care, and spot cleaning, is vital for your bunny's health, appearance, and well-being.", - "author": "d56956bf-6ed0-465e-bb4a-ec9bde65c5f0", + "author": "9a105323-5eec-48d4-8a79-4681fdc94276", "published_at": null, "seo": { "title": "Essential Tips for Keeping Your Bunny Feeling Their Best", @@ -19,9 +19,9 @@ } }, "date_created": "2025-05-07T00:52:54.188Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.225Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "6eed7fda-9e85-430b-bc27-1b70bcbfe894", "12be8887-9781-4b23-9679-519cc51741d5", @@ -38,7 +38,7 @@ "status": "published", "title": "Why Steampunk Rabbits Are The Future of Work", "description": "This post discusses how steampunk rabbits could be the future of work, highlighting their efficiency, multi-talented nature, and ability to bring charm to the workplace.", - "author": "d56956bf-6ed0-465e-bb4a-ec9bde65c5f0", + "author": "9a105323-5eec-48d4-8a79-4681fdc94276", "published_at": "2024-09-01T16:00:00.000Z", "seo": { "title": "Why Steampunk Rabbits Are The Future of Work", @@ -46,9 +46,9 @@ "og_image": "3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg" }, "date_created": "2025-05-07T00:52:54.188Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.235Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "26eed6b1-ff82-4969-bcab-249478347199", "e238aad2-3b4b-42b5-938d-a896621e26b0", @@ -65,7 +65,7 @@ "status": "published", "title": "How To Become A Very Productive Rabbit", "description": "In this blog post, we will look at some simple tips and tricks that you can adopt to become a very productive rabbit.", - "author": "d56956bf-6ed0-465e-bb4a-ec9bde65c5f0", + "author": "9a105323-5eec-48d4-8a79-4681fdc94276", "published_at": "2024-07-01T16:00:00.000Z", "seo": { "title": "How To Become A Very Productive Rabbit", @@ -73,9 +73,9 @@ "og_image": "7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg" }, "date_created": "2025-05-07T00:52:54.188Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.245Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "20300958-630d-4cac-a46d-d79f6e7cf115", "8ad2c28d-6fd7-4f67-99e6-f704c4e02c82", @@ -92,7 +92,7 @@ "status": "published", "title": "Rabbit Facts That Will Blow Your Mind me", "description": "These interesting facts about rabbits make them fascinating creatures that are worth learning more about.", - "author": "d56956bf-6ed0-465e-bb4a-ec9bde65c5f0", + "author": "9a105323-5eec-48d4-8a79-4681fdc94276", "published_at": "2024-06-01T16:00:00.000Z", "seo": { "title": "Eight Rabbit Facts That Will Blow Your Mind", @@ -100,9 +100,9 @@ "og_image": "8f748634-d77b-4985-b27e-7e1f3559881a.jpeg" }, "date_created": "2025-05-07T00:52:54.188Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.254Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "bf77e9ca-2440-4395-a05f-bf1a72bdcaba", "efea00f7-aea3-4b50-9830-ec1d9b799d86", @@ -119,16 +119,16 @@ "status": "draft", "title": "A Pirate's Guide to Productivity: Web Developers' Favorite Tools on Macs", "description": "Ahoy, matey! Discover the top productivity tools web developers be usein' on their trusty Macs. Set sail for smoother workflows and greater bounty!", - "author": "d56956bf-6ed0-465e-bb4a-ec9bde65c5f0", + "author": "9a105323-5eec-48d4-8a79-4681fdc94276", "published_at": null, "seo": { "title": "A Pirate's Guide to Productivity: Developers' Tools on Macs", "meta_description": "Ahoy, matey! Discover the top productivity tools web developers be usein' on their trusty Macs. Set sail for smoother workflows and greater bounty!" }, "date_created": "2025-05-07T00:52:54.188Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.263Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "dd90845a-76a6-45e4-abdc-6f243c66a6d8", "db638c5a-c07e-4e23-bdd6-0f857a3de649", @@ -145,7 +145,7 @@ "status": "draft", "title": "The Perks of Going Headless: Why You Should Consider a Headless CMS", "description": "Discover why a headless CMS might be the right choice for your business.", - "author": "d56956bf-6ed0-465e-bb4a-ec9bde65c5f0", + "author": "9a105323-5eec-48d4-8a79-4681fdc94276", "published_at": null, "seo": { "title": "The Perks of Going Headless: Why You Should Consider a Headless CMS", @@ -153,9 +153,9 @@ "no_index": true }, "date_created": "2025-05-07T00:52:54.188Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-22T19:53:40.269Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_updated": null, "translations": [ "1bf72368-199e-4157-b9ba-da9eb8b89e77", "ad620313-55d1-490e-9946-07c1ed1f43f3", diff --git a/cms-i18n/directus/template/src/content/redirects.json b/cms-i18n/directus/template/src/content/redirects.json index 95537d1a..adc0a98c 100644 --- a/cms-i18n/directus/template/src/content/redirects.json +++ b/cms-i18n/directus/template/src/content/redirects.json @@ -6,8 +6,8 @@ "url_to": "/about-us", "note": null, "date_created": "2025-05-07T01:16:13.531Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "date_updated": "2025-12-23T21:41:25.341Z", - "user_updated": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_updated": null } ] \ No newline at end of file diff --git a/cms-i18n/directus/template/src/dashboards.json b/cms-i18n/directus/template/src/dashboards.json index 7d4f2eaa..b7c06f49 100644 --- a/cms-i18n/directus/template/src/dashboards.json +++ b/cms-i18n/directus/template/src/dashboards.json @@ -5,7 +5,7 @@ "icon": "forms_apps_script", "note": "Quick dashboard to tracking performance of your forms", "date_created": "2025-12-22T19:48:34.090Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "color": null, "panels": null } diff --git a/cms-i18n/directus/template/src/extensions.json b/cms-i18n/directus/template/src/extensions.json index d0fb57e0..380762d9 100644 --- a/cms-i18n/directus/template/src/extensions.json +++ b/cms-i18n/directus/template/src/extensions.json @@ -1,41 +1,4 @@ [ - { - "id": "1c09c3a4-2750-4a01-94fd-c0d91fe35870", - "bundle": null, - "meta": { - "enabled": true, - "id": "1c09c3a4-2750-4a01-94fd-c0d91fe35870", - "folder": "467d87ba-5246-41b7-be33-2bd0aa9c6c5e", - "source": "registry", - "bundle": null - }, - "schema": { - "path": "/directus/extensions/.registry/467d87ba-5246-41b7-be33-2bd0aa9c6c5e", - "name": "@directus-labs/ai-image-generation-operation", - "version": "1.0.1", - "type": "operation", - "entrypoint": { - "app": "dist/app.js", - "api": "dist/api.js" - }, - "host": "^10.10.0", - "sandbox": { - "enabled": true, - "requestedScopes": { - "request": { - "urls": [ - "https://api.openai.com/v1/**" - ], - "methods": [ - "POST" - ] - }, - "log": {} - } - }, - "local": true - } - }, { "id": "2d64a791-0274-441b-88d3-70675fb29335", "bundle": null, @@ -49,7 +12,7 @@ "schema": { "path": "/directus/extensions/.registry/09bdf221-3b49-44ff-a514-6258a67ff587", "name": "@directus-labs/experimental-m2a-interface", - "version": "1.1.0", + "version": "1.3.0", "type": "interface", "entrypoint": "dist/index.js", "host": "^10.10.0", @@ -89,7 +52,7 @@ "schema": { "path": "/directus/extensions/.registry/4cd50f5f-886b-451b-aac7-efb4ea2587a5", "name": "@directus-labs/inline-repeater-interface", - "version": "1.0.0", + "version": "1.0.2", "type": "interface", "entrypoint": "dist/index.js", "host": "^10.0.0 || ^11.0.0", @@ -109,7 +72,7 @@ "schema": { "path": "/directus/extensions/.registry/056a27cf-3806-4bc6-b4bb-f7362851634d", "name": "@directus-labs/seo-plugin", - "version": "1.1.0", + "version": "1.1.1", "type": "bundle", "entrypoint": { "app": "dist/app.js", @@ -129,67 +92,6 @@ "local": true } }, - { - "id": "8a827d6a-f820-4814-8803-9bcf398282d4", - "bundle": null, - "meta": { - "enabled": true, - "id": "8a827d6a-f820-4814-8803-9bcf398282d4", - "folder": "9bde3cf6-c3bd-4bbf-befe-e65294d4b632", - "source": "registry", - "bundle": null - }, - "schema": { - "path": "/directus/extensions/.registry/9bde3cf6-c3bd-4bbf-befe-e65294d4b632", - "name": "directus-extension-wpslug-interface", - "version": "1.1.0", - "type": "interface", - "entrypoint": "dist/index.js", - "host": "^v9.9.0", - "local": true - } - }, - { - "id": "8c20b301-38aa-48a7-99c4-3142338da1b2", - "bundle": null, - "meta": { - "enabled": true, - "id": "8c20b301-38aa-48a7-99c4-3142338da1b2", - "folder": "b9534a05-19a0-4f19-912b-729086969eef", - "source": "registry", - "bundle": null - }, - "schema": { - "path": "/directus/extensions/.registry/b9534a05-19a0-4f19-912b-729086969eef", - "name": "@directus-labs/ai-writer-operation", - "version": "1.3.1", - "type": "operation", - "entrypoint": { - "app": "dist/app.js", - "api": "dist/api.js" - }, - "host": "^10.0.0 || ^11.0.0", - "sandbox": { - "enabled": true, - "requestedScopes": { - "request": { - "urls": [ - "https://api.openai.com/v1/**", - "https://api.anthropic.com/v1/**", - "https://api.replicate.com/v1/**" - ], - "methods": [ - "POST", - "GET" - ] - }, - "log": {}, - "sleep": {} - } - }, - "local": true - } - }, { "id": "a2587ead-a73a-4718-88e2-02de0c78d57a", "bundle": null, @@ -203,7 +105,7 @@ "schema": { "path": "/directus/extensions/.registry/f313973c-0a76-4eec-9bdf-8a37713bd797", "name": "@directus-labs/liquidjs-operation", - "version": "1.1.0", + "version": "1.2.0", "type": "operation", "entrypoint": { "app": "dist/app.js", @@ -285,41 +187,6 @@ "local": true } }, - { - "id": "c53d1496-ab3b-4a23-9b0c-9fb8ce85800f", - "bundle": null, - "meta": { - "enabled": true, - "id": "c53d1496-ab3b-4a23-9b0c-9fb8ce85800f", - "folder": "b5913ec2-e23c-47d7-ba58-d359334d75f4", - "source": "registry", - "bundle": null - }, - "schema": { - "path": "/directus/extensions/.registry/b5913ec2-e23c-47d7-ba58-d359334d75f4", - "name": "@directus-labs/command-palette-module", - "version": "1.1.0", - "type": "module", - "entrypoint": "dist/index.js", - "host": "^11.0.0", - "local": true - } - }, - { - "id": "9549b551-6d6e-4b3f-abd1-8e3bfa61c28b", - "bundle": "af053cdb-242e-4142-a053-e3e23d7658e5", - "meta": { - "enabled": true, - "id": "9549b551-6d6e-4b3f-abd1-8e3bfa61c28b", - "folder": "image-uuid-interface", - "source": "registry", - "bundle": "af053cdb-242e-4142-a053-e3e23d7658e5" - }, - "schema": { - "name": "image-uuid-interface", - "type": "interface" - } - }, { "id": "ac4cf7e0-4e32-4071-a139-d63c0cbad5af", "bundle": "af053cdb-242e-4142-a053-e3e23d7658e5", @@ -364,20 +231,5 @@ "name": "seo-interface", "type": "interface" } - }, - { - "id": "f55da5ed-ba35-4bb9-9912-8f7079fbc867", - "bundle": "af053cdb-242e-4142-a053-e3e23d7658e5", - "meta": { - "enabled": true, - "id": "f55da5ed-ba35-4bb9-9912-8f7079fbc867", - "folder": "checkbox-cards-interface", - "source": "registry", - "bundle": "af053cdb-242e-4142-a053-e3e23d7658e5" - }, - "schema": { - "name": "checkbox-cards-interface", - "type": "interface" - } } -] \ No newline at end of file +] diff --git a/cms-i18n/directus/template/src/fields.json b/cms-i18n/directus/template/src/fields.json index e3bd9530..e72283d8 100644 --- a/cms-i18n/directus/template/src/fields.json +++ b/cms-i18n/directus/template/src/fields.json @@ -10644,54 +10644,6 @@ "searchable": true } }, - { - "collection": "directus_settings", - "field": "command_palette_settings", - "type": "json", - "schema": { - "name": "command_palette_settings", - "table": "directus_settings", - "data_type": "json", - "default_value": {}, - "generation_expression": null, - "max_length": null, - "numeric_precision": null, - "numeric_scale": null, - "is_generated": false, - "is_nullable": true, - "is_unique": false, - "is_indexed": false, - "is_primary_key": false, - "has_auto_increment": false, - "foreign_key_schema": null, - "foreign_key_table": null, - "foreign_key_column": null, - "comment": null - }, - "meta": { - "collection": "directus_settings", - "field": "command_palette_settings", - "special": [ - "cast-json" - ], - "interface": "input-code", - "options": null, - "display": "raw", - "display_options": null, - "readonly": false, - "hidden": true, - "sort": 1, - "width": "full", - "translations": null, - "note": "Settings for the Command Palette Module.", - "conditions": null, - "required": false, - "group": null, - "validation": null, - "validation_message": null, - "searchable": true - } - }, { "collection": "form_fields", "field": "id", @@ -14904,58 +14856,6 @@ "searchable": true } }, - { - "collection": "globals", - "field": "openai_api_key", - "type": "string", - "schema": { - "name": "openai_api_key", - "table": "globals", - "data_type": "character varying", - "default_value": null, - "generation_expression": null, - "max_length": 255, - "numeric_precision": null, - "numeric_scale": null, - "is_generated": false, - "is_nullable": true, - "is_unique": false, - "is_indexed": false, - "is_primary_key": false, - "has_auto_increment": false, - "foreign_key_schema": null, - "foreign_key_table": null, - "foreign_key_column": null, - "comment": null - }, - "meta": { - "collection": "globals", - "field": "openai_api_key", - "special": null, - "interface": "input", - "options": { - "trim": true, - "iconLeft": "vpn_key_alert", - "masked": true - }, - "display": "formatted-value", - "display_options": { - "masked": true - }, - "readonly": false, - "hidden": false, - "sort": 2, - "width": "half", - "translations": null, - "note": "Secret OpenAI API key. Don't share with anyone outside your team.", - "conditions": null, - "required": false, - "group": "meta_credentials", - "validation": null, - "validation_message": null, - "searchable": true - } - }, { "collection": "globals", "field": "directus_url", @@ -19841,10 +19741,10 @@ "collection": "posts", "field": "slug", "special": null, - "interface": "extension-wpslug", + "interface": "input", "options": { "font": "monospace", - "template": "{{title}}", + "slug": true, "placeholder": null }, "display": "formatted-value", @@ -21144,10 +21044,10 @@ "collection": "posts_translations", "field": "slug", "special": null, - "interface": "extension-wpslug", + "interface": "input", "options": { "font": "monospace", - "template": "{{title}}", + "slug": true, "placeholder": null }, "display": "formatted-value", @@ -22338,7 +22238,6 @@ "options": { "title": "{{title}}", "help": "

Understanding Forms

\n

Forms are reusable components that you create once and can place anywhere on your site using Form blocks. Think of the Forms collection as your form template library - you build the forms here, then use Form blocks to display them on your pages.

\n

The Forms & Form Blocks Relationship

\n
    \n
  1. First, create and configure your form in the Forms collection
  2. \n
  3. Then, add a Form block to any page where you want the form to appear
  4. \n
  5. Select your form from the dropdown in the Form block settings
  6. \n
  7. Customize the block's headline and tagline to match your page context
  8. \n
\n

This approach lets you:

\n\n

Creating Forms

\n

Basic Settings

\n

Form Title

\n

Internal name to identify your form in the admin panel. Choose something descriptive like:

\n\n

Submit Button

\n

Customize the text on your submit button. Use action-oriented phrases like:

\n\n

Success Handling

\n

Choose what happens after submission:

\n

Show Message

\n\n

Redirect

\n\n

Email Notifications

\n

Configure automated emails for form submissions:

\n\n

Active Status

\n

Control form availability:

\n\n

Building Your Form

\n

Available Field Types

\n\n

Field Configuration

\n

Label The visible field name shown to users

\n

Placeholder Optional hint text inside empty fields

\n

Help Text Additional instructions below the field

\n

Required Fields Mark essential fields that must be filled out

\n

Width Options Control field layout:

\n\n

Validation: Here's the available rules

\n\n

You can combine rules with pipes: email|max:255

\n

Using Forms with Form Blocks

\n

Adding Forms to Pages

\n
    \n
  1. Add a Form block to your page
  2. \n
  3. Select your form from the dropdown
  4. \n
  5. Add an optional headline and tagline
  6. \n
  7. Preview to check the layout
  8. \n
\n

Form Block Customization

\n\n

Best Practices

\n

Form Design & Experience

\n\n

Data Collection

\n\n

Managing Form Submissions

\n

All submissions are stored in the Form Submissions collection.

\n", - "actions": [], "helpDisplayMode": "modal" }, "display": null, @@ -23845,16 +23744,6 @@ "type": "normal", "actionType": "link", "url": "/admin/visual/http://localhost:3000/blog/{{slug}}?visual-editing=true" - }, - { - "label": "Request Review", - "icon": "approval_delegation", - "type": "normal", - "actionType": "flow", - "flow": { - "key": "3172d021-0b0f-4d4d-bcca-c5c46eb8fadf", - "collection": "directus_flows" - } } ], "helpDisplayMode": "modal" @@ -23963,19 +23852,7 @@ "options": { "title": "Image", "icon": "image", - "help": "

Need inspiration? Use Flows like AI Image Generator to generate on-brand images for your post using AI.

\n

Note: This uses OpenAI so you'll need to add your API key in the Globals collection first.

", - "actions": [ - { - "label": "AI Image Generator", - "icon": "image", - "type": "normal", - "actionType": "flow", - "flow": { - "key": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "collection": "directus_flows" - } - } - ] + "help": "

Need inspiration? Use the built-in AI Assistant to generate on-brand images for your post.

\n

Note: Configure an AI provider under Settings → AI first.

" }, "display": null, "display_options": null, @@ -24009,19 +23886,7 @@ "options": { "title": "Content", "icon": "text_snippet", - "help": "

Need inspiration? Use Flows like AI Ghostwriter to help draft your content.

\n

Note: This uses OpenAI so you'll need to add your API key in the Globals collection first.

", - "actions": [ - { - "label": "AI Ghostwriter", - "icon": "text_increase", - "type": "normal", - "actionType": "flow", - "flow": { - "key": "5915dd55-fff8-4d47-b48c-a0e42e5033c1", - "collection": "directus_flows" - } - } - ] + "help": "

Need inspiration? Use the built-in AI Assistant to help draft your content.

\n

Note: Configure an AI provider under Settings → AI first.

" }, "display": null, "display_options": null, @@ -24244,4 +24109,4 @@ "searchable": true } } -] \ No newline at end of file +] diff --git a/cms-i18n/directus/template/src/files.json b/cms-i18n/directus/template/src/files.json index afe805c3..d9766130 100644 --- a/cms-i18n/directus/template/src/files.json +++ b/cms-i18n/directus/template/src/files.json @@ -7,7 +7,7 @@ "title": "Directus E-Commerce T-Shirt Product Interface", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:08.331Z", "modified_by": null, "modified_on": "2025-12-22T19:48:08.343Z", @@ -35,7 +35,7 @@ "title": "Cottontail Rabbit in Grass", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:08.420Z", "modified_by": null, "modified_on": "2025-12-22T19:48:08.427Z", @@ -63,7 +63,7 @@ "title": "Frontend Developer Avatar", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:08.524Z", "modified_by": null, "modified_on": "2025-12-22T19:48:08.535Z", @@ -91,7 +91,7 @@ "title": "Visual Studio Code Logo", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:08.618Z", "modified_by": null, "modified_on": "2025-12-22T19:48:08.624Z", @@ -119,7 +119,7 @@ "title": "Directus Logo - Purple Background", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:08.726Z", "modified_by": null, "modified_on": "2025-12-22T19:48:08.737Z", @@ -147,7 +147,7 @@ "title": "Directus Logo SVG", "type": "image/svg+xml", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:08.816Z", "modified_by": null, "modified_on": "2025-12-22T19:48:08.822Z", @@ -175,7 +175,7 @@ "title": "Steampunk Rabbit Portrait", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:08.916Z", "modified_by": null, "modified_on": "2025-12-22T19:48:08.922Z", @@ -203,7 +203,7 @@ "title": "Directus Logo Dark", "type": "image/svg+xml", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.013Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.017Z", @@ -231,7 +231,7 @@ "title": "Multicolored Can Wall Art - Dreams Come True", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.124Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.133Z", @@ -259,7 +259,7 @@ "title": "Directus CRM Pipeline Interface", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.222Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.229Z", @@ -287,7 +287,7 @@ "title": "Content Blocks Interface", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.324Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.336Z", @@ -315,7 +315,7 @@ "title": "Content Writer Avatar", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.423Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.435Z", @@ -343,7 +343,7 @@ "title": "Knight Rabbit in Armor", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.521Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.531Z", @@ -371,7 +371,7 @@ "title": "Black Rabbit Figurine", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.621Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.628Z", @@ -399,7 +399,7 @@ "title": "E-Commerce Login Page", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.720Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.728Z", @@ -427,7 +427,7 @@ "title": "Business Rabbit with Laptop", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.815Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.822Z", @@ -455,7 +455,7 @@ "title": "Hero Center Image", "type": "image/jpeg", "folder": "7304d56d-8c53-49cd-9815-d8188cec22db", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:09.920Z", "modified_by": null, "modified_on": "2025-12-22T19:48:09.926Z", @@ -483,7 +483,7 @@ "title": "Scholarly Rabbit Portrait", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.016Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.021Z", @@ -511,7 +511,7 @@ "title": "Generated Technical Illustration", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.116Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.129Z", @@ -539,7 +539,7 @@ "title": "Directus CRM Tags Interface", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.215Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.222Z", @@ -567,7 +567,7 @@ "title": "Tree Silhouette Against Starry Sunset", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.316Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.322Z", @@ -595,7 +595,7 @@ "title": "Directus Logo White", "type": "image/svg+xml", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.423Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.430Z", @@ -623,7 +623,7 @@ "title": "UI/UX Wireframe Sketching", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.522Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.530Z", @@ -651,7 +651,7 @@ "title": "Directus E-Commerce Product Editor", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.627Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.637Z", @@ -679,7 +679,7 @@ "title": "Rabbit in Blue Hoodie", "type": "image/jpeg", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.720Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.733Z", @@ -707,7 +707,7 @@ "title": "Hero Left Image", "type": "image/jpeg", "folder": "7304d56d-8c53-49cd-9815-d8188cec22db", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.821Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.827Z", @@ -735,7 +735,7 @@ "title": "Webmaster Developer Avatar", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:10.924Z", "modified_by": null, "modified_on": "2025-12-22T19:48:10.937Z", @@ -763,7 +763,7 @@ "title": "Directus AI Image Generator Interface", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:11.022Z", "modified_by": null, "modified_on": "2025-12-22T19:48:11.028Z", @@ -791,7 +791,7 @@ "title": "Directus Interface Mockup", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:11.123Z", "modified_by": null, "modified_on": "2025-12-22T19:48:11.130Z", @@ -819,7 +819,7 @@ "title": "Digital Concept Art - Widescreen Format", "type": "image/png", "folder": "ece7bab9-5433-4a63-b9f7-bde8b517d6d9", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:11.217Z", "modified_by": null, "modified_on": "2025-12-22T19:48:11.228Z", @@ -847,7 +847,7 @@ "title": "Hero Right Image", "type": "image/jpeg", "folder": "7304d56d-8c53-49cd-9815-d8188cec22db", - "uploaded_by": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "uploaded_by": null, "created_on": "2025-12-22T19:48:11.319Z", "modified_by": null, "modified_on": "2025-12-22T19:48:11.325Z", diff --git a/cms-i18n/directus/template/src/flows.json b/cms-i18n/directus/template/src/flows.json index 68f051fb..aa9dbfdf 100644 --- a/cms-i18n/directus/template/src/flows.json +++ b/cms-i18n/directus/template/src/flows.json @@ -1,135 +1,4 @@ [ - { - "id": "3172d021-0b0f-4d4d-bcca-c5c46eb8fadf", - "name": "Request Review", - "icon": "approval_delegation", - "color": null, - "description": "Request a content review for publishing.", - "status": "active", - "trigger": "manual", - "accountability": "all", - "options": { - "collections": [ - "posts" - ], - "requireConfirmation": true, - "confirmationDescription": "Request Review", - "fields": [ - { - "field": "editor", - "type": "json", - "name": "Editor", - "meta": { - "interface": "collection-item-dropdown", - "note": "Who should review this for publishing?", - "width": "full", - "options": { - "selectedCollection": "directus_users", - "filter": { - "_and": [ - { - "role": { - "id": { - "_in": [ - "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", - "d70780bd-f3ed-418b-98c2-f5354fd3fa68", - "4516009c-8a04-49e4-b4ac-fd4883da6064" - ] - } - } - } - ] - } - }, - "required": true - } - }, - { - "field": "comments", - "type": "text", - "name": "Comments", - "meta": { - "interface": "input-multiline", - "note": "Do you have any helpful notes or comments for the editor?", - "width": "full" - } - } - ] - }, - "operation": "a16e81d1-4177-443e-a292-786a66faee8a", - "date_created": "2025-12-22T19:48:35.102Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", - "operations": null - }, - { - "id": "5429ccb0-7e97-4ef5-9d65-2bbcf964f9a6", - "name": "Utils -> Render Template", - "icon": "picture_in_picture", - "color": null, - "description": "Utility flow to render a Liquid JS template", - "status": "active", - "trigger": "operation", - "accountability": "all", - "options": { - "return": "$last" - }, - "operation": "c846f644-e7c1-43c9-8bb7-81181de0cd60", - "date_created": "2025-12-22T19:48:35.199Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", - "operations": null - }, - { - "id": "5915dd55-fff8-4d47-b48c-a0e42e5033c1", - "name": "AI Ghostwriter", - "icon": "magic_button", - "color": null, - "description": "Flow to automatically write blog posts and articles for you using AI.", - "status": "active", - "trigger": "manual", - "accountability": "all", - "options": { - "collections": [ - "posts" - ], - "requireConfirmation": true, - "confirmationDescription": "AI Ghostwriter", - "fields": [ - { - "field": "prompt", - "type": "text", - "name": "Prompt", - "meta": { - "interface": "input-multiline", - "note": "Describe the post you'd like AI to write for you.", - "width": "full" - } - }, - { - "field": "voice", - "type": "json", - "name": "Tone Of Voice", - "meta": { - "interface": "tags", - "note": "What tone of voice would you like AI to write with?", - "options": { - "presets": [ - "friendly", - "professional", - "casual", - "pirate" - ] - } - } - } - ], - "location": "item", - "error_on_reject": true - }, - "operation": "5d667ac5-2594-4f16-a863-3847d8917caa", - "date_created": "2025-12-22T19:48:35.299Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", - "operations": null - }, { "id": "61757ab0-b139-4079-b5eb-4e05bb8142ac", "name": "Form Submissions -> Email Notifications", @@ -150,41 +19,7 @@ }, "operation": "599b80e4-7c74-4496-b243-da198c8613d9", "date_created": "2025-12-22T19:48:35.398Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", - "operations": null - }, - { - "id": "69e87d0b-df14-4779-bdc8-abc05f2f1e97", - "name": "Utils -> Get Globals", - "icon": "globe_uk", - "color": null, - "description": "This is a utility flow to use in other flows when you need data from the Globals collection.", - "status": "active", - "trigger": "operation", - "accountability": "activity", - "options": { - "return": "$last" - }, - "operation": "bb1b1e3f-032e-48b7-b260-1cf3af4a116c", - "date_created": "2025-12-22T19:48:35.499Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", - "operations": null - }, - { - "id": "7c8732cd-9d9e-44be-a3f6-89c0d42c7687", - "name": "Utils -> Send Email", - "icon": "send", - "color": null, - "description": "Utility flow to send a single email. Used in other flows.", - "status": "active", - "trigger": "operation", - "accountability": "all", - "options": { - "return": "$last" - }, - "operation": "6efe1572-6cdd-4c80-a063-eb71b7f1e519", - "date_created": "2025-12-22T19:48:35.598Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "operations": null }, { @@ -243,7 +78,7 @@ }, "operation": "1bb8a2e2-c98a-4a52-9224-78b4100ec087", "date_created": "2025-12-22T19:48:35.698Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "operations": null }, { @@ -268,142 +103,7 @@ }, "operation": "282f9a77-5519-460e-bb54-4dc6e30b059a", "date_created": "2025-12-22T19:48:35.802Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", - "operations": null - }, - { - "id": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "name": "AI Image Generator", - "icon": "image_search", - "color": null, - "description": "Generate AI images for your blog posts.", - "status": "active", - "trigger": "manual", - "accountability": "all", - "options": { - "collections": [ - "posts" - ], - "requireConfirmation": true, - "confirmationDescription": "AI Image Generator", - "fields": [ - { - "field": "prompt", - "type": "text", - "name": "Prompt", - "meta": { - "interface": "input-rich-text-md", - "note": "Describe the image you want to generate. The more descriptive - the better the results (usually 😉).", - "options": { - "placeholder": "Create a hand-drawn marker style illustration to be used as a featured image for blog posts targeting developers. The illustration should have a whimsical theme, using bold, uneven marker-style lines to create an engaging and eye-catching design. The background should always be white. ", - "toolbar": [ - "heading", - "bold", - "italic", - "strikethrough", - "blockquote", - "bullist", - "numlist", - "table", - "code", - "empty" - ] - } - } - }, - { - "field": "colors", - "type": "json", - "name": "Colors", - "meta": { - "interface": "list", - "options": { - "fields": [ - { - "field": "color", - "name": "color", - "type": "string", - "meta": { - "field": "color", - "width": "half", - "type": "string", - "interface": "select-color" - } - }, - { - "field": "name", - "name": "name", - "type": "string", - "meta": { - "field": "name", - "width": "half", - "type": "string", - "note": "What is the name of the color? AI seems to do better when supplying color names along with the hex codes.", - "interface": "input" - } - }, - { - "field": "type", - "name": "type", - "type": "string", - "meta": { - "field": "type", - "width": "full", - "type": "string", - "interface": "select-radio", - "options": { - "choices": [ - { - "text": "Primary", - "value": "primary" - }, - { - "text": "Secondary", - "value": "secondary" - }, - { - "text": "Background", - "value": "background" - } - ] - } - } - } - ] - } - } - }, - { - "field": "aspect_ratio", - "type": "string", - "name": "Aspect Ratio", - "meta": { - "interface": "select-radio", - "options": { - "choices": [ - { - "text": "1:1", - "value": "1:1" - }, - { - "text": "16:9", - "value": "16:9" - }, - { - "text": "9:16", - "value": "9:16" - } - ] - } - } - } - ], - "location": "item", - "error_on_reject": true - }, - "operation": "0cf30253-f9ed-413f-ac27-7a0ecffa9ee4", - "date_created": "2025-12-22T19:48:35.897Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", + "user_created": null, "operations": null } -] \ No newline at end of file +] diff --git a/cms-i18n/directus/template/src/operations.json b/cms-i18n/directus/template/src/operations.json index 4820c399..c91263b7 100644 --- a/cms-i18n/directus/template/src/operations.json +++ b/cms-i18n/directus/template/src/operations.json @@ -11,25 +11,9 @@ }, "resolve": null, "reject": null, - "flow": "7c8732cd-9d9e-44be-a3f6-89c0d42c7687", + "flow": "61757ab0-b139-4079-b5eb-4e05bb8142ac", "date_created": "2025-12-22T19:48:35.999Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "0cf30253-f9ed-413f-ac27-7a0ecffa9ee4", - "name": "Globals", - "key": "globals", - "type": "trigger", - "position_x": 19, - "position_y": 1, - "options": { - "flow": "69e87d0b-df14-4779-bdc8-abc05f2f1e97" - }, - "resolve": "f15d1f41-8624-4f85-98c2-a16ceb862b7d", - "reject": null, - "flow": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "date_created": "2025-12-22T19:48:36.005Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "1bb8a2e2-c98a-4a52-9224-78b4100ec087", @@ -55,7 +39,7 @@ "reject": null, "flow": "a23110e1-700b-41b8-9f9e-ca0998b84a76", "date_created": "2025-12-22T19:48:36.009Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "282f9a77-5519-460e-bb54-4dc6e30b059a", @@ -92,28 +76,7 @@ "reject": "78f34568-e64e-457b-b680-59d9a40a1a22", "flow": "c62ceaa5-bd09-4158-8329-98792debc5d5", "date_created": "2025-12-22T19:48:36.013Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "2adf33da-7fd7-42f7-a6fe-48409463d51b", - "name": "Update", - "key": "update", - "type": "item-update", - "position_x": 109, - "position_y": 1, - "options": { - "collection": "posts", - "payload": { - "image": "{{import.data.data.id}}" - }, - "key": "{{$trigger.body.keys}}", - "permissions": "$full" - }, - "resolve": null, - "reject": null, - "flow": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "date_created": "2025-12-22T19:48:36.017Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "2d441500-54d0-4519-a813-b16e0bbf1c08", @@ -139,7 +102,7 @@ "reject": "9039e7fa-8dcb-4a2f-935c-b0d8dec7bd61", "flow": "c62ceaa5-bd09-4158-8329-98792debc5d5", "date_created": "2025-12-22T19:48:36.021Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "396d13ef-af98-49c1-8237-2070549a8cd0", @@ -158,41 +121,7 @@ "reject": null, "flow": "a23110e1-700b-41b8-9f9e-ca0998b84a76", "date_created": "2025-12-22T19:48:36.024Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "3b7d004a-1dba-43c4-b902-a44fd71602ae", - "name": "Format", - "key": "format", - "type": "exec", - "position_x": 73, - "position_y": 1, - "options": { - "code": "module.exports = function(data) {\n const aiResponse = JSON.parse(data.write)\n\tconst payload = {}\n payload.title = aiResponse.title\n payload.description = aiResponse.description\n payload.content = aiResponse.content\n payload.slug = aiResponse.slug\n return payload\n}" - }, - "resolve": "e6c50f84-e229-4f15-8119-c7708256e825", - "reject": null, - "flow": "5915dd55-fff8-4d47-b48c-a0e42e5033c1", - "date_created": "2025-12-22T19:48:36.029Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "4b46b1e9-1ca0-47c3-86a8-68826136664e", - "name": "Get Post", - "key": "get_post", - "type": "item-read", - "position_x": 19, - "position_y": 19, - "options": { - "permissions": "$full", - "collection": "{{$trigger.body.collection}}", - "key": "{{$trigger.body.keys}}" - }, - "resolve": "f6ae03f7-014d-43d1-8d69-cf122da302c0", - "reject": null, - "flow": "3172d021-0b0f-4d4d-bcca-c5c46eb8fadf", - "date_created": "2025-12-22T19:48:36.033Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "599b80e4-7c74-4496-b243-da198c8613d9", @@ -218,61 +147,7 @@ "reject": null, "flow": "61757ab0-b139-4079-b5eb-4e05bb8142ac", "date_created": "2025-12-22T19:48:36.036Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "5d667ac5-2594-4f16-a863-3847d8917caa", - "name": "Globals", - "key": "globals", - "type": "trigger", - "position_x": 19, - "position_y": 1, - "options": { - "flow": "69e87d0b-df14-4779-bdc8-abc05f2f1e97" - }, - "resolve": "d34463f4-419b-4665-94f4-9d6462120d55", - "reject": null, - "flow": "5915dd55-fff8-4d47-b48c-a0e42e5033c1", - "date_created": "2025-12-22T19:48:36.039Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "5df25cf8-b407-4fef-9d3b-c328f89f1561", - "name": "Prompt", - "key": "prompt", - "type": "directus-labs-ai-writer-operation", - "position_x": 55, - "position_y": 1, - "options": { - "apiKey": "{{globals.openai_api_key}}", - "promptKey": "custom", - "system": "You are an expert in writing prompts for generating images through Dall•E 3. \n\n## Rules\nReturn only the prompt text", - "text": "Use the following information and context to write a prompt to generate an image for a blog post.\n\nImage Style:\n{{ $trigger.body.prompt }}\n\nAspect Ratio: \n{{ $trigger.body.aspect_ratio }}\n\nColor Palette:\n{{ $trigger.body.colors }}", - "model": "gpt-4o-mini", - "aiProvider": "openai", - "apiKeyOpenAi": "{{globals.openai_api_key}}" - }, - "resolve": "d6f73e98-19ef-47d6-8d1f-99d77137d36b", - "reject": null, - "flow": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "date_created": "2025-12-22T19:48:36.044Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "687e5faa-4707-4ec4-bbab-e8e2d1674ceb", - "name": "Missing Key", - "key": "missing_key", - "type": "log", - "position_x": 55, - "position_y": 17, - "options": { - "message": "Your OpenAI API key is missing from the `globals` collection." - }, - "resolve": null, - "reject": null, - "flow": "5915dd55-fff8-4d47-b48c-a0e42e5033c1", - "date_created": "2025-12-22T19:48:36.049Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "6efe1572-6cdd-4c80-a063-eb71b7f1e519", @@ -283,18 +158,18 @@ "position_y": 1, "options": { "filter": { - "$trigger": { + "format": { "to": { "_nnull": true } } } }, - "resolve": "8673740a-f7f8-44dd-9abd-5a714e0d6c74", + "resolve": "c846f644-e7c1-43c9-8bb7-81181de0cd60", "reject": "0beeeb1a-2338-4ab4-95f5-0757bf3e43be", - "flow": "7c8732cd-9d9e-44be-a3f6-89c0d42c7687", + "flow": "61757ab0-b139-4079-b5eb-4e05bb8142ac", "date_created": "2025-12-22T19:48:36.053Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "78f34568-e64e-457b-b680-59d9a40a1a22", @@ -310,78 +185,26 @@ "reject": null, "flow": "c62ceaa5-bd09-4158-8329-98792debc5d5", "date_created": "2025-12-22T19:48:36.058Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "823ee957-6d5a-412c-886d-74d18de73864", - "name": "Get Editor", - "key": "get_editor", - "type": "item-read", - "position_x": 38, - "position_y": 1, - "options": { - "permissions": "$full", - "collection": "directus_users", - "key": [ - "{{$trigger.body.editor.key}}" - ], - "query": { - "fields": [ - "id", - "first_name", - "last_name", - "email" - ] - } - }, - "resolve": "dc181cb9-3853-41b9-98bf-6901472bc1af", - "reject": null, - "flow": "3172d021-0b0f-4d4d-bcca-c5c46eb8fadf", - "date_created": "2025-12-22T19:48:36.062Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "8673740a-f7f8-44dd-9abd-5a714e0d6c74", "name": "Send Email", "key": "send_email", "type": "mail", - "position_x": 37, + "position_x": 55, "position_y": 1, "options": { - "to": "{{$trigger.to}}", - "subject": "{{$trigger.subject}}", + "to": "{{format.to}}", + "subject": "{{format.subject}}", "type": "wysiwyg", - "body": "

{{$trigger.body}}

" + "body": "

{{render.template}}

" }, "resolve": null, "reject": null, - "flow": "7c8732cd-9d9e-44be-a3f6-89c0d42c7687", + "flow": "61757ab0-b139-4079-b5eb-4e05bb8142ac", "date_created": "2025-12-22T19:48:36.065Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "89125be2-8205-4ad0-a77f-bd3e984202b3", - "name": "Write", - "key": "write", - "type": "directus-labs-ai-writer-operation", - "position_x": 55, - "position_y": 1, - "options": { - "apiKey": "{{globals.openai_api_key}}", - "model": "gpt-4o-mini", - "promptKey": "custom", - "system": "You are an expert in writing blog posts that are valuable for readers.\n\n## Rules\n- You are a human content writer. Avoid AI words like \"empower\". Avoid using prolix. Sound human.\n- ALWAYS output a JSON object that matches the sample below.\n{\n\"title\": \"Article Title\",\n\"slug\": \"formatted-slug\",\n\"description\": \"Short summary of the article to entice readers\",\n\"content\": \"Article content goes here. This needs to be properly encoded HTML string with proper line breaks, etc.\"\n}", - "json_mode": true, - "text": "Write an article based on this prompt.\n{{$trigger.body.prompt}}\n\n\n## Voice\nMatch this style and tone of voice when writing.\n{{ $trigger.body.voice }}", - "aiProvider": "openai", - "apiKeyOpenAi": "{{globals.openai_api_key}}", - "maxToken": 8192 - }, - "resolve": "3b7d004a-1dba-43c4-b902-a44fd71602ae", - "reject": null, - "flow": "5915dd55-fff8-4d47-b48c-a0e42e5033c1", - "date_created": "2025-12-22T19:48:36.069Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "9039e7fa-8dcb-4a2f-935c-b0d8dec7bd61", @@ -397,23 +220,7 @@ "reject": null, "flow": "c62ceaa5-bd09-4158-8329-98792debc5d5", "date_created": "2025-12-22T19:48:36.072Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "a16e81d1-4177-443e-a292-786a66faee8a", - "name": "Globals", - "key": "globals", - "type": "trigger", - "position_x": 19, - "position_y": 1, - "options": { - "flow": "69e87d0b-df14-4779-bdc8-abc05f2f1e97" - }, - "resolve": "823ee957-6d5a-412c-886d-74d18de73864", - "reject": null, - "flow": "3172d021-0b0f-4d4d-bcca-c5c46eb8fadf", - "date_created": "2025-12-22T19:48:36.077Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "aecbd95c-e882-4ceb-acef-b806eaa25770", @@ -429,48 +236,7 @@ "reject": null, "flow": "a23110e1-700b-41b8-9f9e-ca0998b84a76", "date_created": "2025-12-22T19:48:36.082Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "bb1b1e3f-032e-48b7-b260-1cf3af4a116c", - "name": "Read Globals", - "key": "read_globals", - "type": "item-read", - "position_x": 19, - "position_y": 1, - "options": { - "permissions": "$full", - "collection": "globals" - }, - "resolve": "fd271542-fac2-42d8-aa10-a02520c3753f", - "reject": null, - "flow": "69e87d0b-df14-4779-bdc8-abc05f2f1e97", - "date_created": "2025-12-22T19:48:36.085Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "bc71ca4e-d979-4ef9-a449-af100a7e1b3b", - "name": "Import", - "key": "import", - "type": "request", - "position_x": 91, - "position_y": 1, - "options": { - "method": "POST", - "url": "{{globals.directus_url}}/files/import", - "body": "{\n \"url\": \"{{image}}\"\n}", - "headers": [ - { - "header": "Authorization", - "value": "Bearer fT6_R5in_QUpUSXlLqGIhYtbRlBnopFe" - } - ] - }, - "resolve": "2adf33da-7fd7-42f7-a6fe-48409463d51b", - "reject": null, - "flow": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "date_created": "2025-12-22T19:48:36.089Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "c02bfa07-a395-48df-a0c9-e5acace6da40", @@ -492,68 +258,27 @@ "reject": null, "flow": "a23110e1-700b-41b8-9f9e-ca0998b84a76", "date_created": "2025-12-22T19:48:36.093Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "c846f644-e7c1-43c9-8bb7-81181de0cd60", "name": "Render Template", "key": "render", "type": "liquidjs-operation", - "position_x": 19, + "position_x": 37, "position_y": 1, "options": { "publicUrl": "http://localhost:8001/", "mode": "custom", "operationMode": "single", - "template": "{{ $trigger.template }}", - "data": "{{ $trigger.data }}" + "template": "{{ format.template }}", + "data": "{{ format.data }}" }, - "resolve": "edc5e1ae-a3ed-45af-ae77-10409a66cd03", + "resolve": "8673740a-f7f8-44dd-9abd-5a714e0d6c74", "reject": null, - "flow": "5429ccb0-7e97-4ef5-9d65-2bbcf964f9a6", + "flow": "61757ab0-b139-4079-b5eb-4e05bb8142ac", "date_created": "2025-12-22T19:48:36.097Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "d34463f4-419b-4665-94f4-9d6462120d55", - "name": "Check Key", - "key": "check_key", - "type": "condition", - "position_x": 37, - "position_y": 1, - "options": { - "filter": { - "globals": { - "openai_api_key": { - "_nnull": true - } - } - } - }, - "resolve": "89125be2-8205-4ad0-a77f-bd3e984202b3", - "reject": null, - "flow": "5915dd55-fff8-4d47-b48c-a0e42e5033c1", - "date_created": "2025-12-22T19:48:36.101Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "d6f73e98-19ef-47d6-8d1f-99d77137d36b", - "name": "Image", - "key": "image", - "type": "directus-labs-ai-image-generation", - "position_x": 73, - "position_y": 1, - "options": { - "apiKey": "{{globals.openai_api_key}}", - "quality": "hd", - "size": "landscape", - "prompt": "{{prompt}}" - }, - "resolve": "bc71ca4e-d979-4ef9-a449-af100a7e1b3b", - "reject": null, - "flow": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "date_created": "2025-12-22T19:48:36.105Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "d7f64e04-ab43-4d77-b8e8-379b41af2d3a", @@ -569,35 +294,7 @@ "reject": null, "flow": "c62ceaa5-bd09-4158-8329-98792debc5d5", "date_created": "2025-12-22T19:48:36.110Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "dc181cb9-3853-41b9-98bf-6901472bc1af", - "name": "Get User", - "key": "get_user", - "type": "item-read", - "position_x": 57, - "position_y": 1, - "options": { - "permissions": "$full", - "collection": "directus_users", - "key": [ - "{{$accountability.user}}" - ], - "query": { - "fields": [ - "id", - "first_name", - "last_name", - "email" - ] - } - }, - "resolve": "4b46b1e9-1ca0-47c3-86a8-68826136664e", - "reject": null, - "flow": "3172d021-0b0f-4d4d-bcca-c5c46eb8fadf", - "date_created": "2025-12-22T19:48:36.113Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "dff1a702-bcc0-4528-905e-309feb880111", @@ -607,105 +304,13 @@ "position_x": 19, "position_y": 18, "options": { - "code": "/**\n * Prepares email template data by matching trigger values with form fields\n * @param {Object} trigger - The trigger object containing payload values\n * @param {Object} form - The form object containing fields and email templates\n * @returns {Array} Array of prepared email template objects\n * @throws {Error} If required data is missing or invalid\n */\nfunction prepareEmailTemplateData(trigger, form) {\n // Validate input parameters\n if (!trigger?.payload?.values || !Array.isArray(trigger.payload.values)) {\n throw new Error('Invalid trigger payload values');\n }\n \n if (!form?.fields || !Array.isArray(form.fields)) {\n throw new Error('Invalid form fields');\n }\n \n if (!form?.emails || !Array.isArray(form.emails)) {\n throw new Error('Invalid form emails');\n }\n\n // Create an object to store the field name-value pairs\n const data = {};\n \n // Iterate through the trigger values and match them with form fields\n trigger.payload.values.forEach(item => {\n if (!item || typeof item !== 'object') {\n throw new Error('Invalid trigger value item');\n }\n\n // Ensure required properties exist\n if (!item.field && !item.field_name) {\n throw new Error('Missing field identifier in trigger value');\n }\n \n if (item.value === undefined) {\n throw new Error('Missing value in trigger value');\n }\n\n // Find the corresponding field in the form\n const formField = form.fields.find(field => field.id === item.field);\n \n // If a matching field is found, use its name as the key\n if (formField && formField.name) {\n data[formField.name] = item.value;\n } else {\n // Fallback to using the field_name from the trigger if no match is found\n data[item.field_name || item.field] = item.value;\n }\n });\n\n // Process and validate all email templates\n const emailTemplates = form.emails.map(email => {\n // Validate required email template properties\n if (!email.subject) {\n throw new Error('Missing email subject');\n }\n \n if (!email.message) {\n throw new Error('Missing email message template');\n }\n \n if (!email.to) {\n throw new Error('Missing email recipient');\n }\n\n // Normalize 'to' field to always be an array\n const toField = Array.isArray(email.to) ? email.to : [email.to];\n \n // Validate each email address\n toField.forEach(recipient => {\n if (typeof recipient !== 'string' || !recipient.trim()) {\n throw new Error('Invalid email recipient');\n }\n });\n\n return {\n to: toField,\n subject: email.subject,\n template: email.message,\n data: data\n };\n });\n\n return emailTemplates;\n}\n\nmodule.exports = function(data) {\n if (!data?.$trigger || !data?.form) {\n throw new Error('Missing required data');\n }\n \n return prepareEmailTemplateData(data.$trigger, data.form);\n};" + "code": "/**\n * Prepares email template data by matching trigger values with form fields\n * @param {Object} trigger - The trigger object containing payload values\n * @param {Object} form - The form object containing fields and email templates\n * @returns {Array} Array of prepared email template objects\n * @throws {Error} If required data is missing or invalid\n */\nfunction prepareEmailTemplateData(trigger, form) {\n // Validate input parameters\n if (!trigger?.payload?.values || !Array.isArray(trigger.payload.values)) {\n throw new Error('Invalid trigger payload values');\n }\n \n if (!form?.fields || !Array.isArray(form.fields)) {\n throw new Error('Invalid form fields');\n }\n \n if (!form?.emails || !Array.isArray(form.emails)) {\n throw new Error('Invalid form emails');\n }\n\n // Create an object to store the field name-value pairs\n const data = {};\n \n // Iterate through the trigger values and match them with form fields\n trigger.payload.values.forEach(item => {\n if (!item || typeof item !== 'object') {\n throw new Error('Invalid trigger value item');\n }\n\n // Ensure required properties exist\n if (!item.field && !item.field_name) {\n throw new Error('Missing field identifier in trigger value');\n }\n \n if (item.value === undefined) {\n throw new Error('Missing value in trigger value');\n }\n\n // Find the corresponding field in the form\n const formField = form.fields.find(field => field.id === item.field);\n \n // If a matching field is found, use its name as the key\n if (formField && formField.name) {\n data[formField.name] = item.value;\n } else {\n // Fallback to using the field_name from the trigger if no match is found\n data[item.field_name || item.field] = item.value;\n }\n });\n\n // Process and validate all email templates\n const emailTemplates = form.emails.map(email => {\n // Validate required email template properties\n if (!email.subject) {\n throw new Error('Missing email subject');\n }\n \n if (!email.message) {\n throw new Error('Missing email message template');\n }\n \n if (!email.to) {\n throw new Error('Missing email recipient');\n }\n\n // Normalize 'to' field to always be an array\n const toField = Array.isArray(email.to) ? email.to : [email.to];\n \n // Validate each email address\n toField.forEach(recipient => {\n if (typeof recipient !== 'string' || !recipient.trim()) {\n throw new Error('Invalid email recipient');\n }\n });\n\n return {\n to: toField,\n subject: email.subject,\n template: email.message,\n data: data\n };\n });\n\n return emailTemplates;\n}\n\nmodule.exports = function(data) {\n if (!data?.$trigger || !data?.form) {\n throw new Error('Missing required data');\n }\n \n const templates = prepareEmailTemplateData(data.$trigger, data.form);\n return templates[0];\n};" }, - "resolve": "fbf696ea-c6af-4230-8f62-c663beebd6d9", + "resolve": "6efe1572-6cdd-4c80-a063-eb71b7f1e519", "reject": null, "flow": "61757ab0-b139-4079-b5eb-4e05bb8142ac", "date_created": "2025-12-22T19:48:36.116Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "e12b95db-a408-4e7e-b30b-264f7fa8baa3", - "name": "Send", - "key": "send", - "type": "trigger", - "position_x": 59, - "position_y": 1, - "options": { - "flow": "7c8732cd-9d9e-44be-a3f6-89c0d42c7687", - "payload": "{{ render }}" - }, - "resolve": null, - "reject": null, - "flow": "61757ab0-b139-4079-b5eb-4e05bb8142ac", - "date_created": "2025-12-22T19:48:36.120Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "e6c50f84-e229-4f15-8119-c7708256e825", - "name": "Update", - "key": "update", - "type": "item-update", - "position_x": 91, - "position_y": 1, - "options": { - "collection": "posts", - "permissions": "$full", - "key": [ - "{{$trigger.body.keys}}" - ], - "payload": "{{format}}" - }, - "resolve": null, - "reject": null, - "flow": "5915dd55-fff8-4d47-b48c-a0e42e5033c1", - "date_created": "2025-12-22T19:48:36.125Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "eac15cd9-82a4-4b71-9b1b-92ae7e94a46d", - "name": "Missing Key", - "key": "missing_key", - "type": "log", - "position_x": 55, - "position_y": 18, - "options": { - "message": "Your OpenAI API key is missing from the `globals` collection." - }, - "resolve": null, - "reject": null, - "flow": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "date_created": "2025-12-22T19:48:36.128Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "edc5e1ae-a3ed-45af-ae77-10409a66cd03", - "name": "Format", - "key": "format", - "type": "exec", - "position_x": 37, - "position_y": 1, - "options": { - "code": "module.exports = function(data) {\n\treturn {\n ...data.$trigger,\n body: data.render.template\n }\n}" - }, - "resolve": null, - "reject": null, - "flow": "5429ccb0-7e97-4ef5-9d65-2bbcf964f9a6", - "date_created": "2025-12-22T19:48:36.131Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "f15d1f41-8624-4f85-98c2-a16ceb862b7d", - "name": "Check Key", - "key": "check_key", - "type": "condition", - "position_x": 37, - "position_y": 1, - "options": { - "filter": { - "globals": { - "openai_api_key": { - "_nnull": true - } - } - } - }, - "resolve": "5df25cf8-b407-4fef-9d3b-c328f89f1561", - "reject": null, - "flow": "d4bbac48-a444-49e0-aedb-9af5273b88df", - "date_created": "2025-12-22T19:48:36.134Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "f491233d-f942-4c8a-bc9d-9074fce45844", @@ -724,30 +329,7 @@ "reject": null, "flow": "c62ceaa5-bd09-4158-8329-98792debc5d5", "date_created": "2025-12-22T19:48:36.139Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "f6ae03f7-014d-43d1-8d69-cf122da302c0", - "name": "Send Email", - "key": "send_email", - "type": "mail", - "position_x": 37, - "position_y": 19, - "options": { - "to": [ - "{{get_editor.email}}" - ], - "subject": "🧐 Review Request: {{get_post.title}} from {{get_user.first_name}} {{ get_user.last_name}}", - "body": "Hi {{ get_editor.first_name }},\n\n{{ get_user.first_name }} {{ get_user.last_name}} has requested your review on the following content:\n\n[{{ $trigger.body.collection }} – **{{ get_post.title }}**]({{globals.directus_url}}/admin/content/{{$trigger.body.collection}}/{{$trigger.body.keys[0]}})\n\n**Comments:**\n{{ $trigger.body.comments }}\n\n---\n\nPlease review to schedule for publishing or request changes.", - "replyTo": [ - "{{get_user.email}}" - ] - }, - "resolve": null, - "reject": null, - "flow": "3172d021-0b0f-4d4d-bcca-c5c46eb8fadf", - "date_created": "2025-12-22T19:48:36.143Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "f6b8abc3-20bd-4d05-9bec-b7c759559e13", @@ -766,39 +348,6 @@ "reject": null, "flow": "c62ceaa5-bd09-4158-8329-98792debc5d5", "date_created": "2025-12-22T19:48:36.146Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "fbf696ea-c6af-4230-8f62-c663beebd6d9", - "name": "Render", - "key": "render", - "type": "trigger", - "position_x": 41, - "position_y": 1, - "options": { - "flow": "5429ccb0-7e97-4ef5-9d65-2bbcf964f9a6", - "payload": "{{ format }}" - }, - "resolve": "e12b95db-a408-4e7e-b30b-264f7fa8baa3", - "reject": null, - "flow": "61757ab0-b139-4079-b5eb-4e05bb8142ac", - "date_created": "2025-12-22T19:48:36.150Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" - }, - { - "id": "fd271542-fac2-42d8-aa10-a02520c3753f", - "name": "Format", - "key": "format", - "type": "exec", - "position_x": 37, - "position_y": 1, - "options": { - "code": "module.exports = async function(data) {\n return data.read_globals[0]\n}" - }, - "resolve": null, - "reject": null, - "flow": "69e87d0b-df14-4779-bdc8-abc05f2f1e97", - "date_created": "2025-12-22T19:48:36.155Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null } -] \ No newline at end of file +] diff --git a/cms-i18n/directus/template/src/panels.json b/cms-i18n/directus/template/src/panels.json index d5f3451b..f6af882a 100644 --- a/cms-i18n/directus/template/src/panels.json +++ b/cms-i18n/directus/template/src/panels.json @@ -37,7 +37,7 @@ "valueField": "id" }, "date_created": "2025-12-22T19:48:34.294Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "19b3d901-aa7c-4a04-bc9a-800e43510e69", @@ -60,7 +60,7 @@ "displayTemplate": "{{timestamp}} • {{values}} • {{form}}" }, "date_created": "2025-12-22T19:48:34.398Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "3861ceb1-11ff-4e9d-a985-60d862d90aa3", @@ -85,7 +85,7 @@ } }, "date_created": "2025-12-22T19:48:34.500Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "53575d2f-e3a0-4532-a176-d047cbbc11a7", @@ -117,7 +117,7 @@ } }, "date_created": "2025-12-22T19:48:34.601Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "8cb3b63c-d8e3-4078-9160-096e32b9fcb0", @@ -139,7 +139,7 @@ "sortField": null }, "date_created": "2025-12-22T19:48:34.700Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "b770ea7e-1b49-441f-ba6f-2d4b90e08070", @@ -158,7 +158,7 @@ "text": "Form Dashboard" }, "date_created": "2025-12-22T19:48:34.797Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null }, { "id": "dc01026c-1728-4e71-ab45-7cea9fc4751c", @@ -183,6 +183,6 @@ } }, "date_created": "2025-12-22T19:48:34.900Z", - "user_created": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a" + "user_created": null } ] \ No newline at end of file diff --git a/cms-i18n/directus/template/src/permissions.json b/cms-i18n/directus/template/src/permissions.json index e80c8dac..c1bb50c7 100644 --- a/cms-i18n/directus/template/src/permissions.json +++ b/cms-i18n/directus/template/src/permissions.json @@ -105,8 +105,7 @@ "notice-7-fv9g", "divider_logo", "divider_social", - "translations", - "meta_translations" + "translations" ], "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, @@ -156,8 +155,7 @@ "submit_label", "on_success", "success_message", - "success_redirect_url", - "translations" + "success_redirect_url" ], "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, @@ -270,173 +268,279 @@ "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_button", - "action": "update", - "permissions": {}, - "validation": {}, + "collection": "directus_files", + "action": "read", + "permissions": { + "_and": [ + { + "_or": [ + { + "folder": { + "name": { + "_contains": "Public" + } + } + }, + { + "folder": { + "parent": { + "name": { + "_contains": "Public" + } + } + } + } + ] + } + ] + }, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_button", - "action": "delete", - "permissions": {}, - "validation": {}, + "collection": "block_form", + "action": "read", + "permissions": null, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_button", - "action": "create", - "permissions": {}, - "validation": {}, + "collection": "block_posts", + "action": "read", + "permissions": null, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_button", + "collection": "form_fields", "action": "read", - "permissions": {}, - "validation": {}, + "permissions": { + "_and": [ + { + "form": { + "is_active": { + "_eq": true + } + } + } + ] + }, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_button_group", - "action": "create", - "permissions": {}, - "validation": {}, + "collection": "block_gallery_items", + "action": "read", + "permissions": null, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_button_group", + "collection": "block_pricing", "action": "read", - "permissions": {}, - "validation": {}, + "permissions": null, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_button_group", - "action": "update", - "permissions": {}, - "validation": {}, + "collection": "block_pricing_cards", + "action": "read", + "permissions": null, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_button_group", - "action": "delete", - "permissions": {}, - "validation": {}, + "collection": "directus_users", + "action": "read", + "permissions": { + "_and": [ + { + "posts": { + "_nnull": true + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "first_name", + "last_name", + "avatar", + "title", + "id" + ], + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + }, + { + "collection": "redirects", + "action": "read", + "permissions": null, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" }, { - "collection": "block_gallery", + "collection": "posts", "action": "create", - "permissions": {}, - "validation": {}, - "presets": null, + "permissions": null, + "validation": { + "_and": [ + { + "status": { + "_neq": "published" + } + } + ] + }, + "presets": { + "author": "$CURRENT_USER" + }, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" }, { - "collection": "block_gallery", + "collection": "posts", "action": "read", - "permissions": {}, - "validation": {}, + "permissions": { + "_and": [ + { + "author": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" }, { - "collection": "block_gallery", + "collection": "posts", "action": "update", - "permissions": {}, - "validation": {}, + "permissions": { + "_and": [ + { + "author": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": { + "_and": [ + { + "status": { + "_neq": "published" + } + } + ] + }, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" }, { - "collection": "block_gallery", - "action": "delete", - "permissions": {}, - "validation": {}, + "collection": "directus_files", + "action": "create", + "permissions": null, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" }, { - "collection": "block_hero", - "action": "delete", - "permissions": {}, - "validation": {}, + "collection": "directus_files", + "action": "read", + "permissions": null, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" }, { - "collection": "block_hero", + "collection": "directus_files", "action": "update", - "permissions": {}, - "validation": {}, + "permissions": { + "_and": [ + { + "uploaded_by": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" }, { - "collection": "block_hero", - "action": "read", - "permissions": {}, - "validation": {}, + "collection": "directus_files", + "action": "delete", + "permissions": { + "_and": [ + { + "uploaded_by": { + "_eq": "$CURRENT_USER" + } + } + ] + }, + "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" }, { - "collection": "block_hero", - "action": "create", + "collection": "block_button", + "action": "update", "permissions": {}, "validation": {}, "presets": null, @@ -446,8 +550,173 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_richtext", - "action": "create", + "collection": "block_button", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_button_group", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_gallery", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "delete", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "update", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "read", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_hero", + "action": "create", + "permissions": {}, + "validation": {}, + "presets": null, + "fields": [ + "*" + ], + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + }, + { + "collection": "block_richtext", + "action": "create", "permissions": {}, "validation": {}, "presets": null, @@ -878,266 +1147,194 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_files", + "collection": "form_fields", "action": "read", - "permissions": { - "_and": [ - { - "_or": [ - { - "folder": { - "name": { - "_contains": "Public" - } - } - }, - { - "folder": { - "parent": { - "name": { - "_contains": "Public" - } - } - } - } - ] - } - ] - }, + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_dashboards", + "collection": "form_fields", "action": "create", - "permissions": {}, + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_dashboards", - "action": "read", - "permissions": {}, + "collection": "form_fields", + "action": "update", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_dashboards", - "action": "update", - "permissions": {}, + "collection": "form_fields", + "action": "delete", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_dashboards", - "action": "delete", - "permissions": {}, + "collection": "form_submission_values", + "action": "create", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_panels", - "action": "create", - "permissions": {}, + "collection": "form_submission_values", + "action": "read", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_panels", - "action": "read", - "permissions": {}, + "collection": "form_submissions", + "action": "create", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_panels", - "action": "update", - "permissions": {}, + "collection": "form_submissions", + "action": "read", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_panels", - "action": "delete", - "permissions": {}, + "collection": "block_posts", + "action": "create", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_users", + "collection": "block_posts", "action": "read", - "permissions": {}, + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_users", + "collection": "block_posts", "action": "update", - "permissions": { - "id": { - "_eq": "$CURRENT_USER" - } - }, + "permissions": null, "validation": null, "presets": null, "fields": [ - "first_name", - "last_name", - "email", - "password", - "location", - "title", - "description", - "avatar", - "language", - "appearance", - "theme_light", - "theme_dark", - "theme_light_overrides", - "theme_dark_overrides", - "tfa_secret" + "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_roles", - "action": "read", - "permissions": {}, + "collection": "block_posts", + "action": "delete", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_shares", - "action": "read", - "permissions": { - "_or": [ - { - "role": { - "_eq": "$CURRENT_ROLE" - } - }, - { - "role": { - "_null": true - } - } - ] - }, + "collection": "block_form", + "action": "create", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_shares", - "action": "create", - "permissions": {}, + "collection": "block_form", + "action": "read", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_shares", + "collection": "block_form", "action": "update", - "permissions": { - "user_created": { - "_eq": "$CURRENT_USER" - } - }, + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_shares", + "collection": "block_form", "action": "delete", - "permissions": { - "user_created": { - "_eq": "$CURRENT_USER" - } - }, + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "directus_flows", - "action": "read", - "permissions": { - "trigger": { - "_eq": "manual" - } - }, + "collection": "block_gallery_items", + "action": "create", + "permissions": null, "validation": null, "presets": null, "fields": [ - "id", - "status", - "name", - "icon", - "color", - "options", - "trigger" + "*" ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_form", + "collection": "block_gallery_items", "action": "read", "permissions": null, "validation": null, @@ -1145,43 +1342,33 @@ "fields": [ "*" ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_posts", - "action": "read", + "collection": "block_gallery_items", + "action": "update", "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_fields", - "action": "read", - "permissions": { - "_and": [ - { - "form": { - "is_active": { - "_eq": true - } - } - } - ] - }, + "collection": "block_gallery_items", + "action": "delete", + "permissions": null, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_fields", - "action": "read", + "collection": "block_pricing", + "action": "create", "permissions": null, "validation": null, "presets": null, @@ -1191,8 +1378,8 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_fields", - "action": "create", + "collection": "block_pricing", + "action": "read", "permissions": null, "validation": null, "presets": null, @@ -1202,7 +1389,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_fields", + "collection": "block_pricing", "action": "update", "permissions": null, "validation": null, @@ -1213,7 +1400,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_fields", + "collection": "block_pricing", "action": "delete", "permissions": null, "validation": null, @@ -1224,7 +1411,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_submission_values", + "collection": "block_pricing_cards", "action": "create", "permissions": null, "validation": null, @@ -1235,7 +1422,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_submission_values", + "collection": "block_pricing_cards", "action": "read", "permissions": null, "validation": null, @@ -1246,8 +1433,8 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_submissions", - "action": "create", + "collection": "block_pricing_cards", + "action": "update", "permissions": null, "validation": null, "presets": null, @@ -1257,8 +1444,8 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "form_submissions", - "action": "read", + "collection": "block_pricing_cards", + "action": "delete", "permissions": null, "validation": null, "presets": null, @@ -1268,7 +1455,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_posts", + "collection": "directus_folders", "action": "create", "permissions": null, "validation": null, @@ -1279,7 +1466,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_posts", + "collection": "directus_folders", "action": "read", "permissions": null, "validation": null, @@ -1290,7 +1477,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_posts", + "collection": "directus_folders", "action": "update", "permissions": null, "validation": null, @@ -1301,7 +1488,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_posts", + "collection": "directus_folders", "action": "delete", "permissions": null, "validation": null, @@ -1312,7 +1499,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_form", + "collection": "directus_files", "action": "create", "permissions": null, "validation": null, @@ -1323,7 +1510,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_form", + "collection": "directus_files", "action": "read", "permissions": null, "validation": null, @@ -1334,7 +1521,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_form", + "collection": "directus_files", "action": "update", "permissions": null, "validation": null, @@ -1345,7 +1532,7 @@ "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, { - "collection": "block_form", + "collection": "directus_files", "action": "delete", "permissions": null, "validation": null, @@ -1355,6 +1542,39 @@ ], "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" }, + { + "collection": "page_blocks", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + }, + { + "collection": "pages", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + }, + { + "collection": "posts", + "action": "read", + "permissions": null, + "validation": null, + "presets": null, + "fields": [ + "*" + ], + "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + }, { "collection": "directus_files", "action": "create", @@ -1421,327 +1641,180 @@ "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" }, { - "collection": "block_gallery_items", + "collection": "directus_files", + "action": "read", + "permissions": { + "_and": [ + { + "folder": { + "_eq": "e6308546-92fb-4b10-b586-eefaf1d97f7f" + } + } + ] + }, + "validation": null, + "presets": null, + "fields": [ + "id" + ], + "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" + }, + { + "collection": "directus_dashboards", "action": "create", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "block_gallery_items", + "collection": "directus_dashboards", "action": "read", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "block_gallery_items", + "collection": "directus_dashboards", "action": "update", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "block_gallery_items", + "collection": "directus_dashboards", "action": "delete", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "block_pricing", + "collection": "directus_panels", "action": "create", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "block_pricing", - "action": "read", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "block_pricing", - "action": "update", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "block_pricing", - "action": "delete", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "block_pricing_cards", - "action": "create", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "block_pricing_cards", + "collection": "directus_panels", "action": "read", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "block_pricing_cards", + "collection": "directus_panels", "action": "update", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "block_pricing_cards", + "collection": "directus_panels", "action": "delete", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "block_gallery_items", - "action": "read", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" - }, - { - "collection": "block_pricing", - "action": "read", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "block_pricing_cards", + "collection": "directus_users", "action": "read", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { "collection": "directus_users", - "action": "read", + "action": "update", "permissions": { - "_and": [ - { - "posts": { - "_nnull": true - } - } - ] + "id": { + "_eq": "$CURRENT_USER" + } }, "validation": null, "presets": null, "fields": [ "first_name", "last_name", - "avatar", + "email", + "password", + "location", "title", - "id" - ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" - }, - { - "collection": "directus_files", - "action": "read", - "permissions": { - "_and": [ - { - "folder": { - "_eq": "e6308546-92fb-4b10-b586-eefaf1d97f7f" - } - } - ] - }, - "validation": null, - "presets": null, - "fields": [ - "id" - ], - "policy": "ee1055a2-7c03-4b0b-9b65-ca68491b6329" - }, - { - "collection": "page_blocks", - "action": "read", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" - }, - { - "collection": "pages", - "action": "read", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" + "description", + "avatar", + "language", + "appearance", + "theme_light", + "theme_dark", + "theme_light_overrides", + "theme_dark_overrides", + "tfa_secret" ], - "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "posts", + "collection": "directus_roles", "action": "read", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "3ba01681-3a5f-4fe3-8e95-4706b39f7dc5" - }, - { - "collection": "posts", - "action": "create", - "permissions": null, - "validation": { - "_and": [ - { - "status": { - "_neq": "published" - } - } - ] - }, - "presets": { - "author": "$CURRENT_USER" - }, - "fields": [ - "*" - ], - "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "posts", + "collection": "directus_shares", "action": "read", "permissions": { - "_and": [ - { - "author": { - "_eq": "$CURRENT_USER" - } - } - ] - }, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" - }, - { - "collection": "posts", - "action": "update", - "permissions": { - "_and": [ + "_or": [ { - "author": { - "_eq": "$CURRENT_USER" + "role": { + "_eq": "$CURRENT_ROLE" } - } - ] - }, - "validation": { - "_and": [ + }, { - "status": { - "_neq": "published" + "role": { + "_null": true } } ] }, - "presets": null, - "fields": [ - "*" - ], - "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" - }, - { - "collection": "directus_folders", - "action": "read", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "52598a64-071d-4071-96fa-4b620d6189b5" - }, - { - "collection": "directus_files", - "action": "read", - "permissions": null, "validation": null, "presets": null, "fields": [ @@ -1750,106 +1823,69 @@ "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "directus_folders", + "collection": "directus_shares", "action": "create", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "directus_folders", - "action": "read", - "permissions": null, + "permissions": {}, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "directus_folders", + "collection": "directus_shares", "action": "update", - "permissions": null, + "permissions": { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "directus_folders", + "collection": "directus_shares", "action": "delete", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "directus_files", - "action": "create", - "permissions": null, + "permissions": { + "user_created": { + "_eq": "$CURRENT_USER" + } + }, "validation": null, "presets": null, "fields": [ "*" ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "directus_files", + "collection": "directus_flows", "action": "read", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "directus_files", - "action": "update", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "directus_files", - "action": "delete", - "permissions": null, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "8ba4ed6f-d330-4675-ae46-119c533a0928" - }, - { - "collection": "directus_files", - "action": "create", - "permissions": null, + "permissions": { + "trigger": { + "_eq": "manual" + } + }, "validation": null, "presets": null, "fields": [ - "*" + "id", + "status", + "name", + "icon", + "color", + "options", + "trigger" ], - "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { - "collection": "directus_files", + "collection": "directus_folders", "action": "read", "permissions": null, "validation": null, @@ -1857,48 +1893,10 @@ "fields": [ "*" ], - "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" - }, - { - "collection": "directus_files", - "action": "update", - "permissions": { - "_and": [ - { - "uploaded_by": { - "_eq": "$CURRENT_USER" - } - } - ] - }, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { "collection": "directus_files", - "action": "delete", - "permissions": { - "_and": [ - { - "uploaded_by": { - "_eq": "$CURRENT_USER" - } - } - ] - }, - "validation": null, - "presets": null, - "fields": [ - "*" - ], - "policy": "a15b697e-29d5-4164-8d24-eb228ba901e3" - }, - { - "collection": "redirects", "action": "read", "permissions": null, "validation": null, @@ -1906,7 +1904,7 @@ "fields": [ "*" ], - "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" + "policy": "52598a64-071d-4071-96fa-4b620d6189b5" }, { "collection": "ai_prompts", @@ -2150,4 +2148,4 @@ ], "policy": "abf8a154-5b1c-4a46-ac9c-7300570f4f17" } -] \ No newline at end of file +] diff --git a/cms-i18n/directus/template/src/policies.json b/cms-i18n/directus/template/src/policies.json index 812be702..9ef42650 100644 --- a/cms-i18n/directus/template/src/policies.json +++ b/cms-i18n/directus/template/src/policies.json @@ -9,16 +9,6 @@ "admin_access": false, "app_access": false }, - { - "id": "50c057b7-4d1d-46c7-b441-ca4c65f0b43a", - "name": "Administrator", - "icon": "verified", - "description": "$t:admin_description", - "ip_access": null, - "enforce_tfa": false, - "admin_access": true, - "app_access": true - }, { "id": "52598a64-071d-4071-96fa-4b620d6189b5", "name": "Team - App Access", @@ -59,16 +49,6 @@ "admin_access": false, "app_access": false }, - { - "id": "ea6ff38d-214f-44df-aca6-138c91cd31c6", - "name": "Administrator", - "icon": "verified", - "description": "$t:admin_description", - "ip_access": null, - "enforce_tfa": false, - "admin_access": true, - "app_access": true - }, { "id": "ee1055a2-7c03-4b0b-9b65-ca68491b6329", "name": "Forms - Submission", @@ -89,4 +69,4 @@ "admin_access": true, "app_access": true } -] \ No newline at end of file +] diff --git a/cms-i18n/directus/template/src/presets.json b/cms-i18n/directus/template/src/presets.json index 889a7b65..d5d37ea0 100644 --- a/cms-i18n/directus/template/src/presets.json +++ b/cms-i18n/directus/template/src/presets.json @@ -38,45 +38,6 @@ "icon": "bookmark_border", "color": null }, - { - "bookmark": "1. Workflow", - "user": null, - "role": null, - "collection": "posts", - "search": null, - "layout": "kanban", - "layout_query": { - "tabular": { - "fields": [ - "status", - "image", - "title", - "date_published" - ], - "sort": [ - "-date_published" - ], - "page": 1 - } - }, - "layout_options": { - "kanban": { - "titleField": "title", - "showUngrouped": false, - "dateField": "published_at", - "textField": "description", - "crop": true, - "groupField": "status", - "groupTitle": null, - "userField": "author", - "tagsField": null - } - }, - "refresh_interval": null, - "filter": null, - "icon": "view_kanban", - "color": null - }, { "bookmark": null, "user": null, @@ -998,4 +959,4 @@ "icon": "bookmark", "color": null } -] \ No newline at end of file +] diff --git a/cms-i18n/directus/template/src/roles.json b/cms-i18n/directus/template/src/roles.json index c8316ba6..ab7959ff 100644 --- a/cms-i18n/directus/template/src/roles.json +++ b/cms-i18n/directus/template/src/roles.json @@ -30,7 +30,7 @@ "users": null }, { - "id": "e97bfc75-d358-4cb5-bdf8-bc505c466ac8", + "id": "ef049c8b-546b-4bbc-9cd7-b05d77e58b66", "name": "Administrator", "icon": "verified", "description": "$t:admin_description", @@ -39,4 +39,4 @@ "policies": null, "users": null } -] \ No newline at end of file +] diff --git a/cms-i18n/directus/template/src/schema/snapshot.json b/cms-i18n/directus/template/src/schema/snapshot.json index 776da853..958293e2 100644 --- a/cms-i18n/directus/template/src/schema/snapshot.json +++ b/cms-i18n/directus/template/src/schema/snapshot.json @@ -1,6 +1,6 @@ { "version": 1, - "directus": "11.14.0", + "directus": "12.0.0", "vendor": "postgres", "collections": [ { @@ -10,6 +10,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "ai_prompts", "color": null, @@ -23,6 +24,7 @@ "singleton": false, "sort": 8, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -38,6 +40,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_button", "color": null, @@ -59,6 +62,7 @@ "singleton": false, "sort": 1, "sort_field": "sort", + "status": "active", "translations": [ { "language": "en-US", @@ -81,6 +85,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_button_group", "color": null, @@ -103,6 +108,7 @@ "singleton": false, "sort": 8, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -167,6 +173,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_button_translations", "color": null, @@ -180,6 +187,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -195,6 +203,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "block_form", "color": null, @@ -212,6 +221,7 @@ "singleton": false, "sort": 3, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -276,6 +286,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_form_translations", "color": null, @@ -289,6 +300,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -304,6 +316,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "block_gallery", "color": null, @@ -323,6 +336,7 @@ "singleton": false, "sort": 5, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -387,6 +401,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "block_gallery_items", "color": null, @@ -400,6 +415,7 @@ "singleton": false, "sort": 1, "sort_field": null, + "status": "active", "translations": [ { "language": "en-US", @@ -420,6 +436,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_gallery_translations", "color": null, @@ -433,6 +450,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -448,6 +466,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "block_hero", "color": null, @@ -475,6 +494,7 @@ "singleton": false, "sort": 1, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -539,6 +559,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_hero_translations", "color": null, @@ -552,6 +573,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -567,6 +589,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "block_posts", "color": null, @@ -585,6 +608,7 @@ "singleton": false, "sort": 4, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -649,6 +673,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_posts_translations", "color": null, @@ -662,6 +687,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -677,6 +703,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "block_pricing", "color": null, @@ -707,6 +734,7 @@ "singleton": false, "sort": 7, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -771,6 +799,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "block_pricing_cards", "color": null, @@ -784,6 +813,7 @@ "singleton": false, "sort": 1, "sort_field": null, + "status": "active", "translations": [ { "language": "en-US", @@ -804,6 +834,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_pricing_cards_translations", "color": null, @@ -817,6 +848,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -832,6 +864,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_pricing_translations", "color": null, @@ -845,6 +878,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -860,6 +894,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "block_richtext", "color": null, @@ -878,6 +913,7 @@ "singleton": false, "sort": 2, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -942,6 +978,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "block_richtext_translations", "color": null, @@ -955,6 +992,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -970,6 +1008,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "closed", "collection": "blocks", "color": null, @@ -983,6 +1022,7 @@ "singleton": false, "sort": 2, "sort_field": null, + "status": "active", "translations": null, "unarchive_value": null, "versioning": false @@ -995,6 +1035,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "form_fields", "color": null, @@ -1008,6 +1049,7 @@ "singleton": false, "sort": 1, "sort_field": null, + "status": "active", "translations": null, "unarchive_value": null, "versioning": false @@ -1023,6 +1065,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "form_fields_translations", "color": null, @@ -1036,6 +1079,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -1051,6 +1095,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "form_submission_values", "color": null, @@ -1064,6 +1109,7 @@ "singleton": false, "sort": 1, "sort_field": null, + "status": "active", "translations": [ { "language": "en-US", @@ -1084,6 +1130,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "form_submissions", "color": null, @@ -1097,6 +1144,7 @@ "singleton": false, "sort": 4, "sort_field": null, + "status": "active", "translations": null, "unarchive_value": null, "versioning": false @@ -1112,6 +1160,7 @@ "archive_app_filter": true, "archive_field": "is_active", "archive_value": "false", + "autosave_revision_interval": null, "collapse": "open", "collection": "forms", "color": null, @@ -1134,6 +1183,7 @@ "singleton": false, "sort": 3, "sort_field": "sort", + "status": "active", "translations": [ { "language": "ar-SA", @@ -1198,6 +1248,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "forms_translations", "color": null, @@ -1211,6 +1262,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -1226,6 +1278,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "globals", "color": null, @@ -1239,6 +1292,7 @@ "singleton": true, "sort": 6, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -1303,6 +1357,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "globals_translations", "color": null, @@ -1316,6 +1371,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -1331,6 +1387,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "languages", "color": null, @@ -1344,6 +1401,7 @@ "singleton": false, "sort": null, "sort_field": null, + "status": "active", "translations": null, "unarchive_value": null, "versioning": false @@ -1359,6 +1417,7 @@ "archive_app_filter": true, "archive_field": "is_active", "archive_value": "false", + "autosave_revision_interval": null, "collapse": "open", "collection": "navigation", "color": null, @@ -1382,6 +1441,7 @@ "singleton": false, "sort": 5, "sort_field": null, + "status": "active", "translations": [ { "language": "ar-SA", @@ -1446,6 +1506,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "navigation_items", "color": null, @@ -1472,6 +1533,7 @@ "singleton": false, "sort": 1, "sort_field": null, + "status": "active", "translations": null, "unarchive_value": null, "versioning": false @@ -1487,6 +1549,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "navigation_items_translations", "color": null, @@ -1500,6 +1563,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -1515,6 +1579,7 @@ "archive_app_filter": false, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "page_blocks", "color": null, @@ -1575,6 +1640,7 @@ "singleton": false, "sort": 3, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": null, "versioning": false @@ -1590,6 +1656,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "pages", "color": null, @@ -1660,6 +1727,7 @@ "singleton": false, "sort": 1, "sort_field": "sort", + "status": "active", "translations": [ { "language": "ar-SA", @@ -1724,6 +1792,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "pages_translations", "color": null, @@ -1737,6 +1806,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -1752,6 +1822,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "posts", "color": null, @@ -1774,6 +1845,7 @@ "singleton": false, "sort": 2, "sort_field": "sort", + "status": "active", "translations": [ { "language": "ar-SA", @@ -1838,6 +1910,7 @@ "archive_app_filter": true, "archive_field": "status", "archive_value": "archived", + "autosave_revision_interval": null, "collapse": "open", "collection": "posts_translations", "color": null, @@ -1851,6 +1924,7 @@ "singleton": false, "sort": null, "sort_field": "sort", + "status": "active", "translations": null, "unarchive_value": "draft", "versioning": false @@ -1866,6 +1940,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "redirects", "color": null, @@ -1879,6 +1954,7 @@ "singleton": false, "sort": 7, "sort_field": null, + "status": "active", "translations": null, "unarchive_value": null, "versioning": false @@ -1894,6 +1970,7 @@ "archive_app_filter": true, "archive_field": null, "archive_value": null, + "autosave_revision_interval": null, "collapse": "open", "collection": "website", "color": null, @@ -1907,6 +1984,7 @@ "singleton": false, "sort": 1, "sort_field": null, + "status": "active", "translations": null, "unarchive_value": null, "versioning": false @@ -12783,52 +12861,6 @@ "foreign_key_column": null } }, - { - "collection": "directus_settings", - "field": "command_palette_settings", - "type": "json", - "meta": { - "collection": "directus_settings", - "conditions": null, - "display": "raw", - "display_options": null, - "field": "command_palette_settings", - "group": null, - "hidden": true, - "interface": "input-code", - "note": "Settings for the Command Palette Module.", - "options": null, - "readonly": false, - "required": false, - "searchable": true, - "sort": 1, - "special": [ - "cast-json" - ], - "translations": null, - "validation": null, - "validation_message": null, - "width": "full" - }, - "schema": { - "name": "command_palette_settings", - "table": "directus_settings", - "data_type": "json", - "default_value": {}, - "max_length": null, - "numeric_precision": null, - "numeric_scale": null, - "is_nullable": true, - "is_unique": false, - "is_indexed": false, - "is_primary_key": false, - "is_generated": false, - "generation_expression": null, - "has_auto_increment": false, - "foreign_key_table": null, - "foreign_key_column": null - } - }, { "collection": "directus_users", "field": "posts", @@ -15580,7 +15612,6 @@ "interface": "super-header", "note": null, "options": { - "actions": [], "help": "

Understanding Forms

\n

Forms are reusable components that you create once and can place anywhere on your site using Form blocks. Think of the Forms collection as your form template library - you build the forms here, then use Form blocks to display them on your pages.

\n

The Forms & Form Blocks Relationship

\n
    \n
  1. First, create and configure your form in the Forms collection
  2. \n
  3. Then, add a Form block to any page where you want the form to appear
  4. \n
  5. Select your form from the dropdown in the Form block settings
  6. \n
  7. Customize the block's headline and tagline to match your page context
  8. \n
\n

This approach lets you:

\n\n

Creating Forms

\n

Basic Settings

\n

Form Title

\n

Internal name to identify your form in the admin panel. Choose something descriptive like:

\n\n

Submit Button

\n

Customize the text on your submit button. Use action-oriented phrases like:

\n\n

Success Handling

\n

Choose what happens after submission:

\n

Show Message

\n\n

Redirect

\n\n

Email Notifications

\n

Configure automated emails for form submissions:

\n\n

Active Status

\n

Control form availability:

\n\n

Building Your Form

\n

Available Field Types

\n\n

Field Configuration

\n

Label The visible field name shown to users

\n

Placeholder Optional hint text inside empty fields

\n

Help Text Additional instructions below the field

\n

Required Fields Mark essential fields that must be filled out

\n

Width Options Control field layout:

\n\n

Validation: Here's the available rules

\n\n

You can combine rules with pipes: email|max:255

\n

Using Forms with Form Blocks

\n

Adding Forms to Pages

\n
    \n
  1. Add a Form block to your page
  2. \n
  3. Select your form from the dropdown
  4. \n
  5. Add an optional headline and tagline
  6. \n
  7. Preview to check the layout
  8. \n
\n

Form Block Customization

\n\n

Best Practices

\n

Form Design & Experience

\n\n

Data Collection

\n\n

Managing Form Submissions

\n

All submissions are stored in the Form Submissions collection.

\n", "helpDisplayMode": "modal", "title": "{{title}}" @@ -15599,6 +15630,40 @@ "width": "full" } }, + { + "collection": "forms", + "field": "translations", + "type": "alias", + "meta": { + "collection": "forms", + "conditions": null, + "display": "translations", + "display_options": { + "languageField": "name", + "template": "{{title}}" + }, + "field": "translations", + "group": null, + "hidden": false, + "interface": "translations", + "note": null, + "options": { + "defaultOpenSplitView": true, + "userLanguage": true + }, + "readonly": false, + "required": false, + "searchable": true, + "sort": 13, + "special": [ + "translations" + ], + "translations": null, + "validation": null, + "validation_message": null, + "width": "full" + } + }, { "collection": "forms", "field": "on_success", @@ -16262,40 +16327,6 @@ "width": "full" } }, - { - "collection": "forms", - "field": "translations", - "type": "alias", - "meta": { - "collection": "forms", - "conditions": null, - "display": "translations", - "display_options": { - "languageField": "name", - "template": "{{title}}" - }, - "field": "translations", - "group": null, - "hidden": false, - "interface": "translations", - "note": null, - "options": { - "defaultOpenSplitView": true, - "userLanguage": true - }, - "readonly": false, - "required": false, - "searchable": true, - "sort": 13, - "special": [ - "translations" - ], - "translations": null, - "validation": null, - "validation_message": null, - "width": "full" - } - }, { "collection": "forms_translations", "field": "id", @@ -17993,56 +18024,6 @@ "width": "full" } }, - { - "collection": "globals", - "field": "openai_api_key", - "type": "string", - "meta": { - "collection": "globals", - "conditions": null, - "display": "formatted-value", - "display_options": { - "masked": true - }, - "field": "openai_api_key", - "group": "meta_credentials", - "hidden": false, - "interface": "input", - "note": "Secret OpenAI API key. Don't share with anyone outside your team.", - "options": { - "iconLeft": "vpn_key_alert", - "masked": true, - "trim": true - }, - "readonly": false, - "required": false, - "searchable": true, - "sort": 2, - "special": null, - "translations": null, - "validation": null, - "validation_message": null, - "width": "half" - }, - "schema": { - "name": "openai_api_key", - "table": "globals", - "data_type": "character varying", - "default_value": null, - "max_length": 255, - "numeric_precision": null, - "numeric_scale": null, - "is_nullable": true, - "is_unique": false, - "is_indexed": false, - "is_primary_key": false, - "is_generated": false, - "generation_expression": null, - "has_auto_increment": false, - "foreign_key_table": null, - "foreign_key_column": null - } - }, { "collection": "globals", "field": "directus_url", @@ -18597,7 +18578,7 @@ "max_length": 255, "numeric_precision": null, "numeric_scale": null, - "is_nullable": false, + "is_nullable": true, "is_unique": false, "is_indexed": false, "is_primary_key": false, @@ -23199,16 +23180,6 @@ "label": "Open in Visual Editor", "type": "normal", "url": "/admin/visual/http://localhost:3000/blog/{{slug}}?visual-editing=true" - }, - { - "actionType": "flow", - "flow": { - "collection": "directus_flows", - "key": "3172d021-0b0f-4d4d-bcca-c5c46eb8fadf" - }, - "icon": "approval_delegation", - "label": "Request Review", - "type": "normal" } ], "help": "

Managing Blog Posts

\n

Blog posts are a powerful way to share your content, news, and updates with your audience. Each post can include rich text content, images, and metadata to help with organization and discovery.

\n

Post Settings

\n

Title

\n

The main headline of your blog post. This appears at the top of the post and in preview cards across your site. Make it:

\n\n

Description

\n

A brief preview of your post that appears in blog listings and search results. Write 1-2 compelling sentences that:

\n\n

Featured Image

\n

The main visual for your post that appears:

\n\n

URL Slug

\n

The unique portion of the URL for this post. For example, in \"yoursite.com/posts/my-first-post\", \"my-first-post\" is the slug.

\n\n

Content

\n

The main body of your post, supporting rich text formatting including:

\n\n

Author

\n

Select the team member who wrote the post. This helps:

\n\n

Publishing Options

\n\n

Best Practices for Blog Posts

\n

Writing Tips

\n\n

SEO Considerations

\n\n

Image Guidelines

\n", @@ -23432,12 +23403,12 @@ "field": "slug", "group": "meta_content", "hidden": false, - "interface": "extension-wpslug", + "interface": "input", "note": "Unique URL for this post (e.g., `yoursite.com/posts/{{your-slug}}`)", "options": { "font": "monospace", "placeholder": null, - "template": "{{title}}" + "slug": true }, "readonly": false, "required": false, @@ -23911,19 +23882,7 @@ "interface": "super-header", "note": null, "options": { - "actions": [ - { - "actionType": "flow", - "flow": { - "collection": "directus_flows", - "key": "d4bbac48-a444-49e0-aedb-9af5273b88df" - }, - "icon": "image", - "label": "AI Image Generator", - "type": "normal" - } - ], - "help": "

Need inspiration? Use Flows like AI Image Generator to generate on-brand images for your post using AI.

\n

Note: This uses OpenAI so you'll need to add your API key in the Globals collection first.

", + "help": "

Need inspiration? Use the built-in AI Assistant to generate on-brand images for your post.

\n

Note: Configure an AI provider under Settings → AI first.

", "icon": "image", "title": "Image" }, @@ -23956,19 +23915,7 @@ "interface": "super-header", "note": null, "options": { - "actions": [ - { - "actionType": "flow", - "flow": { - "collection": "directus_flows", - "key": "5915dd55-fff8-4d47-b48c-a0e42e5033c1" - }, - "icon": "text_increase", - "label": "AI Ghostwriter", - "type": "normal" - } - ], - "help": "

Need inspiration? Use Flows like AI Ghostwriter to help draft your content.

\n

Note: This uses OpenAI so you'll need to add your API key in the Globals collection first.

", + "help": "

Need inspiration? Use the built-in AI Assistant to help draft your content.

\n

Note: Configure an AI provider under Settings → AI first.

", "icon": "text_snippet", "title": "Content" }, @@ -24679,12 +24626,12 @@ "field": "slug", "group": null, "hidden": false, - "interface": "extension-wpslug", + "interface": "input", "note": "Unique URL for this post (e.g., `yoursite.com/posts/{{your-slug}}`)", "options": { "font": "monospace", "placeholder": null, - "template": "{{title}}" + "slug": true }, "readonly": false, "required": false, @@ -25322,12 +25269,82 @@ "is_indexed": true } }, + { + "collection": "directus_oauth_clients", + "field": "date_created", + "schema": { + "is_indexed": true + } + }, + { + "collection": "directus_oauth_codes", + "field": "expires_at", + "schema": { + "is_indexed": true + } + }, + { + "collection": "directus_oauth_codes", + "field": "used_at", + "schema": { + "is_indexed": true + } + }, + { + "collection": "directus_oauth_consents", + "field": "client", + "schema": { + "is_indexed": true + } + }, + { + "collection": "directus_oauth_tokens", + "field": "code_hash", + "schema": { + "is_indexed": true + } + }, + { + "collection": "directus_oauth_tokens", + "field": "expires_at", + "schema": { + "is_indexed": true + } + }, + { + "collection": "directus_oauth_tokens", + "field": "previous_session", + "schema": { + "is_indexed": true + } + }, + { + "collection": "directus_oauth_tokens", + "field": "session", + "schema": { + "is_indexed": true + } + }, + { + "collection": "directus_revisions", + "field": "activity", + "schema": { + "is_indexed": true + } + }, { "collection": "directus_revisions", "field": "parent", "schema": { "is_indexed": true } + }, + { + "collection": "directus_sessions", + "field": "oauth_client", + "schema": { + "is_indexed": true + } } ], "relations": [ @@ -27533,50 +27550,50 @@ }, { "collection": "globals_translations", - "field": "languages_code", - "related_collection": "languages", + "field": "globals", + "related_collection": "globals", "meta": { - "junction_field": "globals", + "junction_field": "languages_code", "many_collection": "globals_translations", - "many_field": "languages_code", + "many_field": "globals", "one_allowed_collections": null, - "one_collection": "languages", + "one_collection": "globals", "one_collection_field": null, "one_deselect_action": "nullify", - "one_field": null, + "one_field": "translations", "sort_field": "sort" }, "schema": { "table": "globals_translations", - "column": "languages_code", - "foreign_key_table": "languages", - "foreign_key_column": "code", - "constraint_name": "globals_translations_languages_code_foreign", + "column": "globals", + "foreign_key_table": "globals", + "foreign_key_column": "id", + "constraint_name": "globals_translations_globals_foreign", "on_update": "NO ACTION", "on_delete": "SET NULL" } }, { "collection": "globals_translations", - "field": "globals", - "related_collection": "globals", + "field": "languages_code", + "related_collection": "languages", "meta": { - "junction_field": "languages_code", + "junction_field": "globals", "many_collection": "globals_translations", - "many_field": "globals", + "many_field": "languages_code", "one_allowed_collections": null, - "one_collection": "globals", + "one_collection": "languages", "one_collection_field": null, "one_deselect_action": "nullify", - "one_field": "translations", + "one_field": null, "sort_field": "sort" }, "schema": { "table": "globals_translations", - "column": "globals", - "foreign_key_table": "globals", - "foreign_key_column": "id", - "constraint_name": "globals_translations_globals_foreign", + "column": "languages_code", + "foreign_key_table": "languages", + "foreign_key_column": "code", + "constraint_name": "globals_translations_languages_code_foreign", "on_update": "NO ACTION", "on_delete": "SET NULL" } @@ -28380,4 +28397,4 @@ } } ] -} \ No newline at end of file +} diff --git a/cms-i18n/directus/template/src/settings.json b/cms-i18n/directus/template/src/settings.json index c42e90f2..cf98f49e 100644 --- a/cms-i18n/directus/template/src/settings.json +++ b/cms-i18n/directus/template/src/settings.json @@ -1,6 +1,6 @@ { "id": 1, - "project_name": "Directus", + "project_name": "CMS", "project_url": null, "project_color": "#6644FF", "project_logo": null, @@ -226,18 +226,6 @@ "public_registration_role": null, "public_registration_email_filter": null, "visual_editor_urls": [ - { - "url": "http://localhost:3000?visual-editing=true" - }, - { - "url": "http://localhost:3000/blog?visual-editing=true" - }, - { - "url": "http://localhost:3000?visual-editing=true" - }, - { - "url": "http://localhost:3000/blog?visual-editing=true" - }, { "url": "http://localhost:3000?visual-editing=true" }, @@ -245,124 +233,10 @@ "url": "http://localhost:3000/blog?visual-editing=true" } ], - "project_id": "019b4795-b081-729b-868b-19431e8ccbcf", + "accepted_terms": true, "mcp_enabled": true, "mcp_allow_deletes": false, "mcp_prompts_collection": "ai_prompts", "mcp_system_prompt_enabled": true, - "mcp_system_prompt": null, - "command_palette_settings": { - "searchMode": "as_you_type", - "collections": [ - { - "collection": "pages", - "displayTemplate": "{{title}}", - "descriptionField": "permalink", - "fields": [ - "title", - "permalink" - ], - "limit": 10, - "availableGlobally": false - }, - { - "collection": "posts", - "displayTemplate": "{{title}}", - "descriptionField": "description", - "fields": [ - "title", - "description" - ], - "limit": 10, - "availableGlobally": true - }, - { - "collection": "forms", - "displayTemplate": "{{title}}", - "descriptionField": null, - "fields": [ - "values.field_name", - "title" - ], - "limit": 10, - "availableGlobally": false - }, - { - "collection": "pages", - "displayTemplate": "{{title}}", - "descriptionField": "permalink", - "fields": [ - "title", - "permalink" - ], - "limit": 10, - "availableGlobally": false - }, - { - "collection": "posts", - "displayTemplate": "{{title}}", - "descriptionField": "description", - "fields": [ - "title", - "description" - ], - "limit": 10, - "availableGlobally": true - }, - { - "collection": "forms", - "displayTemplate": "{{title}}", - "descriptionField": null, - "fields": [ - "values.field_name", - "title" - ], - "limit": 10, - "availableGlobally": false - }, - { - "collection": "pages", - "displayTemplate": "{{title}}", - "descriptionField": "permalink", - "fields": [ - "title", - "permalink" - ], - "limit": 10, - "availableGlobally": false - }, - { - "collection": "posts", - "displayTemplate": "{{title}}", - "descriptionField": "description", - "fields": [ - "title", - "description" - ], - "limit": 10, - "availableGlobally": true - }, - { - "collection": "forms", - "displayTemplate": "{{title}}", - "descriptionField": null, - "fields": [ - "values.field_name", - "title" - ], - "limit": 10, - "availableGlobally": false - } - ], - "triggerRate": 250, - "commandPaletteEnabled": true - }, - "project_owner": null, - "project_usage": null, - "org_name": null, - "product_updates": null, - "project_status": null, - "ai_openai_api_key": "**********", - "ai_anthropic_api_key": null, - "ai_system_prompt": null -} \ No newline at end of file + "mcp_system_prompt": null +} diff --git a/cms-i18n/directus/template/src/users.json b/cms-i18n/directus/template/src/users.json index f5665dd9..5ead2206 100644 --- a/cms-i18n/directus/template/src/users.json +++ b/cms-i18n/directus/template/src/users.json @@ -1,35 +1,4 @@ [ - { - "id": "7f18b5cd-67a9-4ffb-8ffc-4e922dd2906a", - "first_name": "Admin", - "last_name": "User", - "email": "admin@example.com", - "password": "**********", - "location": null, - "title": null, - "description": null, - "tags": null, - "avatar": null, - "language": null, - "tfa_secret": null, - "status": "active", - "role": "e97bfc75-d358-4cb5-bdf8-bc505c466ac8", - "token": "**********", - "last_access": "2026-01-07T21:22:02.727Z", - "last_page": "/users", - "provider": "default", - "external_identifier": null, - "auth_data": null, - "email_notifications": true, - "appearance": null, - "theme_dark": null, - "theme_light": null, - "theme_light_overrides": null, - "theme_dark_overrides": null, - "text_direction": "auto", - "posts": null, - "policies": null - }, { "id": "88a6e8cf-f0f8-41db-a3a2-8a9741c086cc", "first_name": "Frontend", @@ -47,7 +16,7 @@ "tfa_secret": null, "status": "active", "role": null, - "token": null, + "token": "**********", "last_access": null, "last_page": null, "provider": "default", @@ -93,67 +62,5 @@ "text_direction": "auto", "posts": null, "policies": null - }, - { - "id": "d56956bf-6ed0-465e-bb4a-ec9bde65c5f0", - "first_name": "Webmaster", - "last_name": null, - "email": "cms@example.com", - "password": null, - "location": null, - "title": null, - "description": null, - "tags": null, - "avatar": "d627d585-2c14-4bbf-89ca-34581083cc1d", - "language": null, - "tfa_secret": null, - "status": "active", - "role": "e97bfc75-d358-4cb5-bdf8-bc505c466ac8", - "token": null, - "last_access": "2025-05-07T19:37:40.249Z", - "last_page": null, - "provider": "default", - "external_identifier": null, - "auth_data": null, - "email_notifications": true, - "appearance": null, - "theme_dark": null, - "theme_light": null, - "theme_light_overrides": null, - "theme_dark_overrides": null, - "text_direction": "auto", - "posts": null, - "policies": null - }, - { - "id": "f87c7b92-63fe-4ca2-b6f1-f26ed7232ca8", - "first_name": "Admin", - "last_name": "User", - "email": null, - "password": null, - "location": null, - "title": null, - "description": null, - "tags": null, - "avatar": null, - "language": null, - "tfa_secret": null, - "status": "active", - "role": "e97bfc75-d358-4cb5-bdf8-bc505c466ac8", - "token": null, - "last_access": "2025-10-27T20:17:36.636Z", - "last_page": null, - "provider": "default", - "external_identifier": null, - "auth_data": null, - "email_notifications": true, - "appearance": null, - "theme_dark": null, - "theme_light": null, - "theme_light_overrides": null, - "theme_dark_overrides": null, - "text_direction": "auto", - "posts": null, - "policies": null } -] \ No newline at end of file +] diff --git a/cms-i18n/nextjs/.env.example b/cms-i18n/nextjs/.env.example index 65b8b193..c2a77ebf 100644 --- a/cms-i18n/nextjs/.env.example +++ b/cms-i18n/nextjs/.env.example @@ -1,5 +1,5 @@ NEXT_PUBLIC_DIRECTUS_URL=http://localhost:8055 # Or your cloud instance URL -DIRECTUS_SERVER_TOKEN=token_from_Webmaster_account # Token for server-side content, preview, and form submissions +DIRECTUS_SERVER_TOKEN=your_admin_static_token # Token for server-side content, preview, and form submissions DIRECTUS_ADMIN_TOKEN=token_from_Admin_account # Only for local type generation, never used at runtime NEXT_PUBLIC_SITE_URL=http://localhost:3000 # Application URL # Set to false to disable (enabled by default) diff --git a/cms-i18n/nextjs/README.md b/cms-i18n/nextjs/README.md index 605518f5..d1137035 100644 --- a/cms-i18n/nextjs/README.md +++ b/cms-i18n/nextjs/README.md @@ -13,6 +13,8 @@ applications. > **Note**: This is the i18n-enabled version of the Next.js CMS template. For a single-language version, see the > [standard Next.js CMS template](../../cms/nextjs/README.md). +> **License required**: See the [cms-i18n README](../README.md) for Directus setup. + ## **Features** - **Next.js App Router**: Uses the latest Next.js routing architecture for layouts and dynamic routes. @@ -39,6 +41,13 @@ applications. Directus allows you to work on unpublished content using **Draft Mode**. This Next.js template is configured to support Directus Draft Mode out of the box, enabling live previews of unpublished or draft content as you make changes. +### **Content Versioning in Directus 12** + +In Directus 12, the published content version is called `published` (formerly `main`), and every versioned item +automatically gets a `draft` version. Published items are locked in the Studio — edits happen on the draft version and +are promoted to publish. This template handles both: preview URLs with `version=published` load the live content (no extra API call needed), +while `version=draft` (or any custom version key) fetches that version from the API. + ### **Live Preview Setup** [Directus Live Preview](https://docs.directus.io/guides/headless-cms/live-preview/nextjs.html) @@ -70,7 +79,7 @@ npx directus-template-cli@latest apply To set up this template, ensure you have the following: -- **Node.js** (16.x or newer) +- **Node.js** (22.x or newer) - **npm** or **pnpm** - Access to a **Directus** instance ([cloud or self-hosted](../../README.md)) @@ -103,11 +112,15 @@ To get started, you need to configure environment variables. Follow these steps: - **`NEXT_PUBLIC_DIRECTUS_URL`**: URL of your Directus instance. - **`DIRECTUS_SERVER_TOKEN`**: Server-side token for accessing content, preview, and form submissions. Use the token - from the **Webmaster** account. + from your Directus **admin account** (created during first-launch onboarding). With a licensed instance, you can + instead use a token from a user assigned only the **Content - Live Preview** and **Forms - Submission** policies. - **`DIRECTUS_ADMIN_TOKEN`**: Admin token for local type generation only. Never used at runtime. - **`NEXT_PUBLIC_SITE_URL`**: The public URL of your site. This is used for SEO metadata and blog post routing. - **`NEXT_PUBLIC_ENABLE_VISUAL_EDITING`**: Visual editing is enabled by default. Set to `false` to disable. +The form API limits multipart request size and field count. Add rate limiting or bot protection at your hosting edge before +launching a public form. + ## **Running the Application** ### Local Development diff --git a/cms-i18n/nextjs/bun.lock b/cms-i18n/nextjs/bun.lock deleted file mode 100644 index 4ef61563..00000000 --- a/cms-i18n/nextjs/bun.lock +++ /dev/null @@ -1,1367 +0,0 @@ -{ - "lockfileVersion": 1, - "workspaces": { - "": { - "name": "nextjs-15-starter-shadcn", - "dependencies": { - "@directus/sdk": "^18.0.3", - "@hookform/resolvers": "^3.10.0", - "@radix-ui/react-checkbox": "^1.1.3", - "@radix-ui/react-collapsible": "^1.1.2", - "@radix-ui/react-dialog": "^1.1.4", - "@radix-ui/react-dropdown-menu": "^2.1.4", - "@radix-ui/react-label": "^2.1.1", - "@radix-ui/react-navigation-menu": "^1.2.3", - "@radix-ui/react-radio-group": "^1.2.2", - "@radix-ui/react-select": "^2.1.4", - "@radix-ui/react-separator": "^1.1.1", - "@radix-ui/react-slot": "^1.1.1", - "@radix-ui/react-tooltip": "^1.1.6", - "@tailwindcss/typography": "^0.5.16", - "@types/react": "^19.0.7", - "@types/react-dom": "^19.0.3", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "1.0.4", - "dotenv": "^16.4.7", - "lucide-react": "^0.471.1", - "next": "15.1.4", - "next-themes": "^0.4.4", - "p-queue": "^8.0.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-hook-form": "^7.54.2", - "shadcn": "^2.1.8", - "tailwind-merge": "^2.6.0", - "zod": "^3.24.1", - }, - "devDependencies": { - "@eslint/js": "^9.18.0", - "@next/bundle-analyzer": "15.1.4", - "@next/eslint-plugin-next": "15.1.4", - "@trivago/prettier-plugin-sort-imports": "^5.2.1", - "@types/node": "^22.10.6", - "directus-sdk-typegen": "^0.1.9", - "eslint": "^9.18.0", - "eslint-config-next": "15.1.4", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-promise": "^7.2.1", - "eslint-plugin-react": "^7.37.4", - "eslint-plugin-tailwindcss": "^3.17.5", - "globals": "^15.14.0", - "postcss": "^8.5.1", - "prettier": "^3.4.2", - "prettier-plugin-tailwindcss": "^0.6.9", - "tailwindcss": "^3.4.17", - "tailwindcss-animate": "^1.0.7", - "tsx": "^4.19.2", - "typescript": "^5.7.3", - "typescript-eslint": "^8.20.0", - }, - }, - }, - "packages": { - "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - - "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], - - "@antfu/ni": ["@antfu/ni@0.21.12", "", { "bin": { "na": "bin/na.mjs", "ni": "bin/ni.mjs", "nr": "bin/nr.mjs", "nu": "bin/nu.mjs", "nci": "bin/nci.mjs", "nlx": "bin/nlx.mjs", "nun": "bin/nun.mjs" } }, "sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ=="], - - "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], - - "@babel/compat-data": ["@babel/compat-data@7.26.5", "", {}, "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg=="], - - "@babel/core": ["@babel/core@7.26.7", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.7", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/traverse": "^7.26.7", "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA=="], - - "@babel/generator": ["@babel/generator@7.26.5", "", { "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw=="], - - "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="], - - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="], - - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.25.9", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/helper-replace-supers": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ=="], - - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ=="], - - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], - - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], - - "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ=="], - - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], - - "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.26.5", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/traverse": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg=="], - - "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA=="], - - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], - - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], - - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], - - "@babel/helpers": ["@babel/helpers@7.26.7", "", { "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.7" } }, "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A=="], - - "@babel/parser": ["@babel/parser@7.26.7", "", { "dependencies": { "@babel/types": "^7.26.7" }, "bin": "./bin/babel-parser.js" }, "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w=="], - - "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ=="], - - "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.26.7", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg=="], - - "@babel/template": ["@babel/template@7.25.9", "", { "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg=="], - - "@babel/traverse": ["@babel/traverse@7.26.7", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA=="], - - "@babel/types": ["@babel/types@7.26.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg=="], - - "@directus/sdk": ["@directus/sdk@18.0.3", "", {}, "sha512-PnEDRDqr2x/DG3HZ3qxU7nFp2nW6zqJqswjii57NhriXgTz4TBUI8NmSdzQvnyHuTL9J0nedYfQGfW4v8odS1A=="], - - "@discoveryjs/json-ext": ["@discoveryjs/json-ext@0.5.7", "", {}, "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw=="], - - "@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="], - - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - - "@eslint/config-array": ["@eslint/config-array@0.19.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.5", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA=="], - - "@eslint/core": ["@eslint/core@0.10.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw=="], - - "@eslint/eslintrc": ["@eslint/eslintrc@3.2.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w=="], - - "@eslint/js": ["@eslint/js@9.19.0", "", {}, "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.5", "", {}, "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.5", "", { "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" } }, "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A=="], - - "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], - - "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], - - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="], - - "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], - - "@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="], - - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], - - "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="], - - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], - - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], - - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], - - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], - - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], - - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], - - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], - - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], - - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], - - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], - - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], - - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], - - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], - - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], - - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], - - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], - - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], - - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], - - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - - "@next/bundle-analyzer": ["@next/bundle-analyzer@15.1.4", "", { "dependencies": { "webpack-bundle-analyzer": "4.10.1" } }, "sha512-W8X96jOW0U5VjLVAkFr1P37kH2f/Ma9zzwgX2o3Omft92pI0XHpFG8Xa9YUT3NlhRJCe4ZKznr1VxhSrFNA+BA=="], - - "@next/env": ["@next/env@15.1.4", "", {}, "sha512-2fZ5YZjedi5AGaeoaC0B20zGntEHRhi2SdWcu61i48BllODcAmmtj8n7YarSPt4DaTsJaBFdxQAVEVzgmx2Zpw=="], - - "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.1.4", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-HwlEXwCK3sr6zmVGEvWBjW9tBFs1Oe6hTmTLoFQtpm4As5HCdu8jfSE0XJOp7uhfEGLniIx8yrGxEWwNnY0fmQ=="], - - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.1.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wBEMBs+np+R5ozN1F8Y8d/Dycns2COhRnkxRc+rvnbXke5uZBHkUGFgWxfTXn5rx7OLijuUhyfB+gC/ap58dDw=="], - - "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.1.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-7sgf5rM7Z81V9w48F02Zz6DgEJulavC0jadab4ZsJ+K2sxMNK0/BtF8J8J3CxnsJN3DGcIdC260wEKssKTukUw=="], - - "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.1.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-JaZlIMNaJenfd55kjaLWMfok+vWBlcRxqnRoZrhFQrhM1uAehP3R0+Aoe+bZOogqlZvAz53nY/k3ZyuKDtT2zQ=="], - - "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.1.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7EBBjNoyTO2ipMDgCiORpwwOf5tIueFntKjcN3NK+GAQD7OzFJe84p7a2eQUeWdpzZvhVXuAtIen8QcH71ZCOQ=="], - - "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.1.4", "", { "os": "linux", "cpu": "x64" }, "sha512-9TGEgOycqZFuADyFqwmK/9g6S0FYZ3tphR4ebcmCwhL8Y12FW8pIBKJvSwV+UBjMkokstGNH+9F8F031JZKpHw=="], - - "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.1.4", "", { "os": "linux", "cpu": "x64" }, "sha512-0578bLRVDJOh+LdIoKvgNDz77+Bd85c5JrFgnlbI1SM3WmEQvsjxTA8ATu9Z9FCiIS/AliVAW2DV/BDwpXbtiQ=="], - - "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.1.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-JgFCiV4libQavwII+kncMCl30st0JVxpPOtzWcAI2jtum4HjYaclobKhj+JsRu5tFqMtA5CJIa0MvYyuu9xjjQ=="], - - "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.1.4", "", { "os": "win32", "cpu": "x64" }, "sha512-xxsJy9wzq7FR5SqPCUqdgSXiNXrMuidgckBa8nH9HtjjxsilgcN6VgXF6tZ3uEWuVEadotQJI8/9EQ6guTC4Yw=="], - - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - - "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], - - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - - "@polka/url": ["@polka/url@1.0.0-next.28", "", {}, "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw=="], - - "@radix-ui/number": ["@radix-ui/number@1.1.0", "", {}, "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ=="], - - "@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], - - "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w=="], - - "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw=="], - - "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A=="], - - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA=="], - - "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], - - "@radix-ui/react-context": ["@radix-ui/react-context@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q=="], - - "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-portal": "1.1.3", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-slot": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw=="], - - "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg=="], - - "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA=="], - - "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-menu": "2.1.5", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-50ZmEFL1kOuLalPKHrLWvPFMons2fGx9TqQCWlPwDVpbAnaUJ1g4XNcKqFNMQymYU0kKWR4MDDi+9vUQBGFgcQ=="], - - "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg=="], - - "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA=="], - - "@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], - - "@radix-ui/react-label": ["@radix-ui/react-label@2.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw=="], - - "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.1", "@radix-ui/react-portal": "1.1.3", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-roving-focus": "1.1.1", "@radix-ui/react-slot": "1.1.1", "@radix-ui/react-use-callback-ref": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-uH+3w5heoMJtqVCgYOtYVMECk1TOrkUn0OG0p5MqXC0W2ppcuVeESbou8PTHoqAjbdTEK19AGXBWcEtR5WpEQg=="], - - "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wUi01RrTDTOoGtjEPHsxlzPtVzVc3R/AZ5wfh0dyqMAqolhHAHvG5iQjBCTi2AjQqa77FWWbA3kE3RkD+bDMgQ=="], - - "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.1", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-rect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw=="], - - "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw=="], - - "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="], - - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.1", "", { "dependencies": { "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg=="], - - "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.2.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-roving-focus": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E0MLLGfOP0l8P/NxgVzfXJ8w3Ch8cdO6UDzJfDChu4EJDy+/WdO5LqpdY8PYnCErkmZH3gZhDL1K7kQ41fAHuQ=="], - - "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.1", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw=="], - - "@radix-ui/react-select": ["@radix-ui/react-select@2.1.5", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.1", "@radix-ui/react-portal": "1.1.3", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-slot": "1.1.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-eVV7N8jBXAXnyrc+PsOF89O9AfVgGnbLxUtBb0clJ8y8ENMWLARGMI/1/SBRLz7u4HqxLgN71BJ17eono3wcjA=="], - - "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw=="], - - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="], - - "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.1", "@radix-ui/react-portal": "1.1.3", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-slot": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ss0s80BC0+g0+Zc53MvilcnTYSOi4mSuFWBPYPuTOFGjx+pUU+ZrmamMNwS56t8MTFlniA5ocjd4jYm/CdhbOg=="], - - "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="], - - "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="], - - "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="], - - "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], - - "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og=="], - - "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.0", "", { "dependencies": { "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ=="], - - "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw=="], - - "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg=="], - - "@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="], - - "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], - - "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.10.5", "", {}, "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A=="], - - "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], - - "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], - - "@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="], - - "@trivago/prettier-plugin-sort-imports": ["@trivago/prettier-plugin-sort-imports@5.2.1", "", { "dependencies": { "@babel/generator": "^7.26.2", "@babel/parser": "^7.26.2", "@babel/traverse": "^7.25.9", "@babel/types": "^7.26.0", "javascript-natural-sort": "^0.7.1", "lodash": "^4.17.21" }, "peerDependencies": { "@vue/compiler-sfc": "3.x", "prettier": "2.x - 3.x", "prettier-plugin-svelte": "3.x", "svelte": "4.x || 5.x" }, "optionalPeers": ["@vue/compiler-sfc", "prettier-plugin-svelte", "svelte"] }, "sha512-NDZndt0fmVThIx/8cExuJHLZagUVzfGCoVrwH9x6aZvwfBdkrDFTYujecek6X2WpG4uUFsVaPg5+aNQPSyjcmw=="], - - "@ts-morph/common": ["@ts-morph/common@0.19.0", "", { "dependencies": { "fast-glob": "^3.2.12", "minimatch": "^7.4.3", "mkdirp": "^2.1.6", "path-browserify": "^1.0.1" } }, "sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ=="], - - "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], - - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - - "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], - - "@types/node": ["@types/node@22.10.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww=="], - - "@types/react": ["@types/react@19.0.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw=="], - - "@types/react-dom": ["@types/react-dom@19.0.3", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA=="], - - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/type-utils": "8.21.0", "@typescript-eslint/utils": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/types": "8.21.0", "@typescript-eslint/typescript-estree": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0" } }, "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA=="], - - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.21.0", "@typescript-eslint/utils": "8.21.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ=="], - - "@typescript-eslint/types": ["@typescript-eslint/types@8.21.0", "", {}, "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/types": "8.21.0", "@typescript-eslint/typescript-estree": "8.21.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w=="], - - "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], - - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - - "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], - - "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], - - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - - "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], - - "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - - "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], - - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="], - - "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - - "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], - - "array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="], - - "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], - - "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ=="], - - "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], - - "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], - - "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], - - "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], - - "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], - - "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], - - "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], - - "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - - "axe-core": ["axe-core@4.10.2", "", {}, "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w=="], - - "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - - "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - - "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - - "bl": ["bl@5.1.0", "", { "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="], - - "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - - "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], - - "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - - "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], - - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], - - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g=="], - - "call-bound": ["call-bound@1.0.3", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" } }, "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA=="], - - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - - "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], - - "caniuse-lite": ["caniuse-lite@1.0.30001695", "", {}, "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw=="], - - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - - "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], - - "cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], - - "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], - - "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], - - "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], - - "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "cmdk": ["cmdk@1.0.4", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.0", "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg=="], - - "code-block-writer": ["code-block-writer@12.0.0", "", {}, "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w=="], - - "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - - "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], - - "commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], - - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - - "cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], - - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - - "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - - "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], - - "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], - - "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], - - "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], - - "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], - - "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], - - "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], - - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - - "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - - "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], - - "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], - - "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - - "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], - - "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - - "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], - - "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="], - - "directus-sdk-typegen": ["directus-sdk-typegen@0.1.9", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "directus-sdk-typegen": "dist/index.js" } }, "sha512-7VXKNFKFlE8J7wSWGnNxcNAqS77YXqASrebWOvgU8hVCch3iobj3nJqYHsSqZKtrFhCZviJW8L+njcXiDtcDhQ=="], - - "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], - - "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], - - "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], - - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - - "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], - - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.88", "", {}, "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw=="], - - "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - - "enhanced-resolve": ["enhanced-resolve@5.18.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ=="], - - "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], - - "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="], - - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - - "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], - - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], - - "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - - "es-shim-unscopables": ["es-shim-unscopables@1.0.2", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw=="], - - "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], - - "esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="], - - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - - "eslint": ["eslint@9.19.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.19.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA=="], - - "eslint-config-next": ["eslint-config-next@15.1.4", "", { "dependencies": { "@next/eslint-plugin-next": "15.1.4", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-u9+7lFmfhKNgGjhQ9tBeyCFsPJyq0SvGioMJBngPC7HXUpR0U+ckEwQR48s7TrRNHra1REm6evGL2ie38agALg=="], - - "eslint-config-prettier": ["eslint-config-prettier@10.0.1", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "build/bin/cli.js" } }, "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw=="], - - "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], - - "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.7.0", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.3.7", "enhanced-resolve": "^5.15.0", "fast-glob": "^3.3.2", "get-tsconfig": "^4.7.5", "is-bun-module": "^1.0.2", "is-glob": "^4.0.3", "stable-hash": "^0.0.4" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow=="], - - "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="], - - "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="], - - "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], - - "eslint-plugin-promise": ["eslint-plugin-promise@7.2.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA=="], - - "eslint-plugin-react": ["eslint-plugin-react@7.37.4", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ=="], - - "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.1.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw=="], - - "eslint-plugin-tailwindcss": ["eslint-plugin-tailwindcss@3.18.0", "", { "dependencies": { "fast-glob": "^3.2.5", "postcss": "^8.4.4" }, "peerDependencies": { "tailwindcss": "^3.4.0" } }, "sha512-PQDU4ZMzFH0eb2DrfHPpbgo87Zgg2EXSMOj1NSfzdZm+aJzpuwGerfowMIaVehSREEa0idbf/eoNYAOHSJoDAQ=="], - - "eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="], - - "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], - - "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="], - - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], - - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - - "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], - - "execa": ["execa@7.2.0", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" } }, "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA=="], - - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - - "fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], - - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], - - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - - "fastq": ["fastq@1.18.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw=="], - - "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], - - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - - "flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="], - - "for-each": ["for-each@0.3.4", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw=="], - - "foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="], - - "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], - - "fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - - "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], - - "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], - - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], - - "get-intrinsic": ["get-intrinsic@1.2.7", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", "get-proto": "^1.0.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA=="], - - "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], - - "get-own-enumerable-keys": ["get-own-enumerable-keys@1.0.0", "", {}, "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA=="], - - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - - "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - - "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - - "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], - - "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], - - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "globals": ["globals@15.14.0", "", {}, "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig=="], - - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], - - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - - "gzip-size": ["gzip-size@6.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="], - - "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - - "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], - - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - - "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - - "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - - "https-proxy-agent": ["https-proxy-agent@6.2.1", "", { "dependencies": { "agent-base": "^7.0.2", "debug": "4" } }, "sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA=="], - - "human-signals": ["human-signals@4.3.1", "", {}, "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ=="], - - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], - - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - - "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], - - "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], - - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - - "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], - - "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], - - "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - - "is-boolean-object": ["is-boolean-object@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng=="], - - "is-bun-module": ["is-bun-module@1.3.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA=="], - - "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], - - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - - "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], - - "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - - "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], - - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], - - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - - "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], - - "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], - - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - - "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], - - "is-obj": ["is-obj@3.0.0", "", {}, "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ=="], - - "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], - - "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], - - "is-regexp": ["is-regexp@3.1.0", "", {}, "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA=="], - - "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], - - "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], - - "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], - - "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], - - "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], - - "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - - "is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], - - "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], - - "is-weakref": ["is-weakref@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2" } }, "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q=="], - - "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], - - "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], - - "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - - "javascript-natural-sort": ["javascript-natural-sort@0.7.1", "", {}, "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw=="], - - "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], - - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], - - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - - "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - - "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], - - "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], - - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - - "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - - "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], - - "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="], - - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - - "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], - - "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], - - "lodash._reinterpolate": ["lodash._reinterpolate@3.0.0", "", {}, "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA=="], - - "lodash.castarray": ["lodash.castarray@4.4.0", "", {}, "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q=="], - - "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], - - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - - "lodash.template": ["lodash.template@4.5.0", "", { "dependencies": { "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A=="], - - "lodash.templatesettings": ["lodash.templatesettings@4.2.0", "", { "dependencies": { "lodash._reinterpolate": "^3.0.0" } }, "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ=="], - - "log-symbols": ["log-symbols@5.1.0", "", { "dependencies": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" } }, "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA=="], - - "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - - "lucide-react": ["lucide-react@0.471.2", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-A8fDycQxGeaSOTaI7Bm4fg8LBXO7Qr9ORAX47bDRvugCsjLIliugQO0PkKFoeAD57LIQwlWKd3NIQ3J7hYp84g=="], - - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], - - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - - "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], - - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "mkdirp": ["mkdirp@2.1.6", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A=="], - - "mrmime": ["mrmime@2.0.0", "", {}, "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw=="], - - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - - "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], - - "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], - - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - - "next": ["next@15.1.4", "", { "dependencies": { "@next/env": "15.1.4", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.1.4", "@next/swc-darwin-x64": "15.1.4", "@next/swc-linux-arm64-gnu": "15.1.4", "@next/swc-linux-arm64-musl": "15.1.4", "@next/swc-linux-x64-gnu": "15.1.4", "@next/swc-linux-x64-musl": "15.1.4", "@next/swc-win32-arm64-msvc": "15.1.4", "@next/swc-win32-x64-msvc": "15.1.4", "sharp": "^0.33.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-mTaq9dwaSuwwOrcu3ebjDYObekkxRnXpuVL21zotM8qE2W0HBOdVIdg2Li9QjMEZrj73LN96LcWcz62V19FjAg=="], - - "next-themes": ["next-themes@0.4.4", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ=="], - - "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], - - "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], - - "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], - - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - - "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], - - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - - "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], - - "object-inspect": ["object-inspect@1.13.3", "", {}, "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA=="], - - "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], - - "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], - - "object.entries": ["object.entries@1.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ=="], - - "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], - - "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], - - "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - - "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], - - "opener": ["opener@1.5.2", "", { "bin": { "opener": "bin/opener-bin.js" } }, "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A=="], - - "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - - "ora": ["ora@6.3.1", "", { "dependencies": { "chalk": "^5.0.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.1.0", "log-symbols": "^5.1.0", "stdin-discarder": "^0.1.0", "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" } }, "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ=="], - - "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], - - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - - "p-queue": ["p-queue@8.1.0", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw=="], - - "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], - - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], - - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - - "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - - "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], - - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - - "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], - - "pirates": ["pirates@4.0.6", "", {}, "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="], - - "possible-typed-array-names": ["possible-typed-array-names@1.0.0", "", {}, "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q=="], - - "postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], - - "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], - - "postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="], - - "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], - - "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], - - "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - - "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - - "prettier": ["prettier@3.4.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ=="], - - "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.11", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA=="], - - "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], - - "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], - - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - - "react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], - - "react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], - - "react-hook-form": ["react-hook-form@7.54.2", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg=="], - - "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - - "react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="], - - "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], - - "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], - - "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], - - "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - - "recast": ["recast@0.23.9", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q=="], - - "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], - - "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - - "resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], - - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - - "restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], - - "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], - - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - - "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], - - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], - - "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], - - "scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], - - "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - - "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], - - "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], - - "shadcn": ["shadcn@2.1.8", "", { "dependencies": { "@antfu/ni": "^0.21.4", "@babel/core": "^7.22.1", "@babel/parser": "^7.22.6", "@babel/plugin-transform-typescript": "^7.22.5", "commander": "^10.0.0", "cosmiconfig": "^8.1.3", "deepmerge": "^4.3.1", "diff": "^5.1.0", "execa": "^7.0.0", "fast-glob": "^3.3.2", "fs-extra": "^11.1.0", "https-proxy-agent": "^6.2.0", "kleur": "^4.1.5", "lodash.template": "^4.5.0", "node-fetch": "^3.3.0", "ora": "^6.1.2", "postcss": "^8.4.24", "prompts": "^2.4.2", "recast": "^0.23.2", "stringify-object": "^5.0.0", "ts-morph": "^18.0.0", "tsconfig-paths": "^4.2.0", "zod": "^3.20.2" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-UxNK1O/3otO5joqc113+tVZuSFHvVNaDjVakqCjhW89RpRSObRMBaSaaC6jvG70DhR8dJ35l907w1keUrGmWAw=="], - - "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], - - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], - - "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], - - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - - "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - - "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], - - "sirv": ["sirv@2.0.4", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ=="], - - "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], - - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "stable-hash": ["stable-hash@0.0.4", "", {}, "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g=="], - - "stdin-discarder": ["stdin-discarder@0.1.0", "", { "dependencies": { "bl": "^5.0.0" } }, "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ=="], - - "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], - - "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="], - - "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], - - "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], - - "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], - - "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], - - "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], - - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - - "stringify-object": ["stringify-object@5.0.0", "", { "dependencies": { "get-own-enumerable-keys": "^1.0.0", "is-obj": "^3.0.0", "is-regexp": "^3.1.0" } }, "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg=="], - - "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], - - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], - - "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], - - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - - "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], - - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - - "tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="], - - "tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="], - - "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], - - "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], - - "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], - - "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], - - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], - - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - - "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], - - "ts-api-utils": ["ts-api-utils@2.0.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ=="], - - "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], - - "ts-morph": ["ts-morph@18.0.0", "", { "dependencies": { "@ts-morph/common": "~0.19.0", "code-block-writer": "^12.0.0" } }, "sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA=="], - - "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "tsx": ["tsx@4.19.2", "", { "dependencies": { "esbuild": "~0.23.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g=="], - - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - - "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], - - "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], - - "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], - - "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], - - "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], - - "typescript-eslint": ["typescript-eslint@8.21.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.21.0", "@typescript-eslint/parser": "8.21.0", "@typescript-eslint/utils": "8.21.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw=="], - - "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], - - "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], - - "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "update-browserslist-db": ["update-browserslist-db@1.1.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg=="], - - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - - "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], - - "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], - - "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], - - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - - "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], - - "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], - - "webpack-bundle-analyzer": ["webpack-bundle-analyzer@4.10.1", "", { "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", "commander": "^7.2.0", "debounce": "^1.2.1", "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", "html-escaper": "^2.0.2", "is-plain-object": "^5.0.0", "opener": "^1.5.2", "picocolors": "^1.0.0", "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { "webpack-bundle-analyzer": "lib/bin/analyzer.js" } }, "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ=="], - - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], - - "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], - - "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - - "which-typed-array": ["which-typed-array@1.1.18", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA=="], - - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - - "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - - "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - - "yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="], - - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - - "zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], - - "@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - - "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], - - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], - - "@tailwindcss/typography/postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], - - "@ts-morph/common/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "@ts-morph/common/minimatch": ["minimatch@7.4.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw=="], - - "@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - - "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-import-resolver-node/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], - - "eslint-import-resolver-typescript/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-tailwindcss/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - - "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "is-bun-module/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - - "log-symbols/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], - - "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - - "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], - - "ora/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], - - "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - - "postcss-import/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], - - "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], - - "restore-cursor/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - - "shadcn/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], - - "shadcn/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "shadcn/tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], - - "sharp/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - - "simple-swizzle/is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], - - "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], - - "tailwindcss/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "tailwindcss/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], - - "webpack-bundle-analyzer/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], - - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - - "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@ts-morph/common/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "eslint-import-resolver-typescript/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "eslint-plugin-tailwindcss/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - - "shadcn/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "shadcn/tsconfig-paths/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - - "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "tailwindcss/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - } -} diff --git a/cms-i18n/nextjs/package.json b/cms-i18n/nextjs/package.json index dd8e774a..eb5b62fe 100644 --- a/cms-i18n/nextjs/package.json +++ b/cms-i18n/nextjs/package.json @@ -7,14 +7,15 @@ "dev": "next dev --turbopack", "build": "next build", "start": "next start", + "test": "tsx --test src/lib/directus/*.test.ts", "generate:types": "tsx ./src/lib/directus/generateDirectusTypes.ts", "lint": "next lint", "lint:fix": "eslint --fix \"src/**/*.{js,jsx,ts,tsx}\"", "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"" }, "dependencies": { - "@directus/sdk": "^20.0.3", - "@directus/visual-editing": "^1.1.0", + "@directus/sdk": "22.0.0", + "@directus/visual-editing": "2.1.0", "@hookform/resolvers": "^5.0.1", "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-collapsible": "^1.1.3", @@ -51,7 +52,7 @@ "@next/eslint-plugin-next": "15.2.4", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@types/node": "^22.14.0", - "directus-sdk-typegen": "^0.2.0", + "directus-sdk-typegen": "0.2.1", "eslint": "^9.24.0", "eslint-config-next": "15.2.4", "eslint-config-prettier": "^10.1.1", @@ -68,5 +69,8 @@ "tsx": "^4.19.3", "typescript": "^5.8.3", "typescript-eslint": "^8.29.1" + }, + "engines": { + "node": ">=22" } } diff --git a/cms-i18n/nextjs/pnpm-lock.yaml b/cms-i18n/nextjs/pnpm-lock.yaml index f7ada818..03f6420d 100644 --- a/cms-i18n/nextjs/pnpm-lock.yaml +++ b/cms-i18n/nextjs/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: dependencies: '@directus/sdk': - specifier: ^20.0.3 - version: 20.0.3 + specifier: 22.0.0 + version: 22.0.0 '@directus/visual-editing': - specifier: ^1.1.0 - version: 1.1.0 + specifier: 2.1.0 + version: 2.1.0 '@hookform/resolvers': specifier: ^5.0.1 version: 5.0.1(react-hook-form@7.55.0(react@19.1.0)) @@ -118,8 +118,8 @@ importers: specifier: ^22.14.0 version: 22.14.0 directus-sdk-typegen: - specifier: ^0.2.0 - version: 0.2.0 + specifier: 0.2.1 + version: 0.2.1 eslint: specifier: ^9.24.0 version: 9.24.0(jiti@1.21.7) @@ -299,13 +299,12 @@ packages: '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - '@directus/sdk@20.0.3': - resolution: {integrity: sha512-PFTYx8QxYi36L9zjOVldwZ88Iln9pBGtEamEjLGFuYqy1jk5jKJ7qA7827KfeZJkz3EtNNZM6J605I7s/ayD2g==} + '@directus/sdk@22.0.0': + resolution: {integrity: sha512-1D3cgjg2jnA7S1LXwKoYSw7yyJCs/DyKUOUDMLbvLtljafWJ5KOef7O8bVDPuQkVw6Bvoo6GUCbAMYI6Ff8Igg==} engines: {node: '>=22'} - '@directus/visual-editing@1.1.0': - resolution: {integrity: sha512-nEkPnkdB3WXUODlgdd5cyCw9BT2JrL9xHBLYAhz940b/MJ25mZ9NZJ9xdnPAGh0WaRetEMcAcXy7e6t28x/4EQ==} - engines: {node: '>=22'} + '@directus/visual-editing@2.1.0': + resolution: {integrity: sha512-zYjbsoHZFE2WK6WXu/3uFJ8/ZiCNkIBsEIZjju3AOHzw1VU+Vc1jbD8Q73o+r8HNfwBmQ7qlkZ91Bh0jLO323w==} '@discoveryjs/json-ext@0.5.7': resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} @@ -578,67 +577,79 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -743,24 +754,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@15.2.4': resolution: {integrity: sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@15.2.4': resolution: {integrity: sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@15.2.4': resolution: {integrity: sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@15.2.4': resolution: {integrity: sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==} @@ -1355,31 +1370,37 @@ packages: resolution: {integrity: sha512-vtIu34luF1jRktlHtiwm2mjuE8oJCsFiFr8hT5+tFQdqFKjPhbJXn83LswKsOhy0GxAEevpXDI4xxEwkjuXIPA==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.4.1': resolution: {integrity: sha512-H3PaOuGyhFXiyJd+09uPhGl4gocmhyi1BRzvsP8Lv5AQO3p3/ZY7WjV4t2NkBksm9tMjf3YbOVHyPWi2eWsNYw==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.4.1': resolution: {integrity: sha512-4+GmJcaaFntCi1S01YByqp8wLMjV/FyQyHVGm0vedIhL1Vfx7uHkz/sZmKsidRwokBGuxi92GFmSzqT2O8KcNA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-s390x-gnu@1.4.1': resolution: {integrity: sha512-6RDQVCmtFYTlhy89D5ixTqo9bTQqFhvNN0Ey1wJs5r+01Dq15gPHRXv2jF2bQATtMrOfYwv+R2ZR9ew1N1N3YQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.4.1': resolution: {integrity: sha512-XpU9uzIkD86+19NjCXxlVPISMUrVXsXo5htxtuG+uJ59p5JauSRZsIxQxzzfKzkxEjdvANPM/lS1HFoX6A6QeA==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.4.1': resolution: {integrity: sha512-3CDjG/spbTKCSHl66QP2ekHSD+H34i7utuDIM5gzoNBcZ1gTO0Op09Wx5cikXnhORRf9+HyDWzm37vU1PLSM1A==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.4.1': resolution: {integrity: sha512-50tYhvbCTnuzMn7vmP8IV2UKF7ITo1oihygEYq9wW2DUb/Y+QMqBHJUSCABRngATjZ4shOK6f2+s0gQX6ElENQ==} @@ -1759,8 +1780,8 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - directus-sdk-typegen@0.2.0: - resolution: {integrity: sha512-H9A3EaKSPbhL2vLslSrVq3xw5IHWLGM64vmT/wMtsb5DgSNVEYipFb7skuB2nKhP39Md2zYGTNHzjnwqydUI5A==} + directus-sdk-typegen@0.2.1: + resolution: {integrity: sha512-a0tcgCa4p2kAO8AJ+SBC97legirxdC3An6VztsvoZwtttFilI8YmCgCM4TfgDtCR/sh+QrpPPgh/Tae7mDxYfw==} engines: {node: '>=18.0.0'} hasBin: true @@ -3615,9 +3636,9 @@ snapshots: '@types/tough-cookie': 4.0.5 tough-cookie: 4.1.4 - '@directus/sdk@20.0.3': {} + '@directus/sdk@22.0.0': {} - '@directus/visual-editing@1.1.0': + '@directus/visual-editing@2.1.0': dependencies: '@reach/observe-rect': 1.2.0 @@ -4973,7 +4994,7 @@ snapshots: diff@5.2.0: {} - directus-sdk-typegen@0.2.0: + directus-sdk-typegen@0.2.1: dependencies: commander: 8.3.0 diff --git a/cms-i18n/nextjs/src/app/[[...permalink]]/PageClient.tsx b/cms-i18n/nextjs/src/app/[[...permalink]]/PageClient.tsx index 1d72abf6..4dd04423 100644 --- a/cms-i18n/nextjs/src/app/[[...permalink]]/PageClient.tsx +++ b/cms-i18n/nextjs/src/app/[[...permalink]]/PageClient.tsx @@ -7,11 +7,12 @@ import { useVisualEditing } from '@/hooks/useVisualEditing'; import { PageBlock } from '@/types/directus-schema'; import { Button } from '@/components/ui/button'; import { Pencil } from 'lucide-react'; -import { setAttr } from '@directus/visual-editing'; +import { setAttr, setVisualEditingPageContext } from '@/lib/directus/visualEditing'; interface PageClientProps { sections: PageBlock[]; pageId?: string; + contentVersion?: string; } interface VisualEditingOptions { @@ -19,10 +20,12 @@ interface VisualEditingOptions { onSaved?: () => void; } -export default function PageClient({ sections, pageId }: PageClientProps) { +export default function PageClient({ sections, pageId, contentVersion }: PageClientProps) { const { isVisualEditingEnabled, apply } = useVisualEditing(); const router = useRouter(); + setVisualEditingPageContext({ pageId, contentVersion }); + useEffect(() => { if (isVisualEditingEnabled) { apply({ @@ -45,8 +48,8 @@ export default function PageClient({ sections, pageId }: PageClientProps) {
{isVisualEditingEnabled && pageId && ( -
- {/* If you're not using the visual editor it's safe to remove this element. Just a helper to let editors add edit / add new blocks to a page. */} +
+ {/* Opens the page blocks builder — the versioned entry point for M2A content on pages. */}
); diff --git a/cms-i18n/nextjs/src/app/[[...permalink]]/page.tsx b/cms-i18n/nextjs/src/app/[[...permalink]]/page.tsx index 0da77ec1..b72e0fa3 100644 --- a/cms-i18n/nextjs/src/app/[[...permalink]]/page.tsx +++ b/cms-i18n/nextjs/src/app/[[...permalink]]/page.tsx @@ -82,8 +82,9 @@ export default async function Page({ const id = typeof searchParamsResolved.id === 'string' ? searchParamsResolved.id : ''; const version = typeof searchParamsResolved.version === 'string' ? searchParamsResolved.version : ''; const preview = searchParamsResolved.preview === 'true'; - // Live preview adds version = main which is not required when fetching the main version. - const fixedVersion = version != 'main' ? version : undefined; + // version=published is the live key in Directus v12+; version=main was used by older Directus versions. + // Both represent published content and don't require an explicit version parameter. + const fixedVersion = version === 'published' || version === 'main' ? undefined : version; const locale = await getLocaleFromHeaders(); @@ -91,7 +92,7 @@ export default async function Page({ let page: Page; // Version-specific content handling: - // When a version is requested (e.g., "draft", "published"), we need to: + // When a non-published version is requested (e.g., "draft"), we need to: // 1. Look up the page ID by permalink if not provided directly // 2. Fetch the specific version of that page // 3. Fail gracefully if the page doesn't exist for that version @@ -115,7 +116,7 @@ export default async function Page({ const blocks: PageBlock[] = (page.blocks as PageBlock[]) || []; - return ; + return ; } catch (error) { console.error('Error loading page:', error); notFound(); diff --git a/cms-i18n/nextjs/src/app/api/draft/route.ts b/cms-i18n/nextjs/src/app/api/draft/route.ts index ac73e59d..79f32789 100644 --- a/cms-i18n/nextjs/src/app/api/draft/route.ts +++ b/cms-i18n/nextjs/src/app/api/draft/route.ts @@ -4,6 +4,7 @@ export async function GET(request: Request) { const { searchParams } = new URL(request.url); const slug = searchParams.get('slug'); const token = searchParams.get('token'); + const version = searchParams.get('version'); if (!token || token !== process.env.DIRECTUS_SERVER_TOKEN) { return new Response('Invalid token', { status: 401 }); @@ -15,10 +16,13 @@ export async function GET(request: Request) { (await draftMode()).enable(); + // Forward the requested content version (e.g. draft) so the page fetches it. + const location = `/blog/${slug}?preview=true${version ? `&version=${encodeURIComponent(version)}` : ''}`; + return new Response(null, { status: 307, headers: { - Location: `/blog/${slug}?preview=true`, + Location: location, }, }); } diff --git a/cms-i18n/nextjs/src/app/api/forms/submit/route.ts b/cms-i18n/nextjs/src/app/api/forms/submit/route.ts new file mode 100644 index 00000000..715614c9 --- /dev/null +++ b/cms-i18n/nextjs/src/app/api/forms/submit/route.ts @@ -0,0 +1,67 @@ +import { NextResponse } from 'next/server'; +import { submitForm } from '@/lib/directus/forms'; +import { parseFormRequest, validateFormSubmission } from '@/lib/directus/validateFormSubmission'; +import { useDirectus } from '@/lib/directus/directus'; +import type { FormField } from '@/types/directus-schema'; + +export async function POST(request: Request) { + const parsedRequest = await parseFormRequest(request); + if (!parsedRequest.success) { + return NextResponse.json({ error: parsedRequest.error }, { status: parsedRequest.status }); + } + + const formData = parsedRequest.data; + const formId = formData.get('formId'); + + if (typeof formId !== 'string' || !formId.trim()) { + return NextResponse.json({ error: 'Missing or invalid formId' }, { status: 400 }); + } + + const TOKEN = process.env.DIRECTUS_SERVER_TOKEN; + if (!TOKEN) { + return NextResponse.json({ error: 'Server configuration error' }, { status: 500 }); + } + + // Fetch the authoritative form field definitions from Directus server-side. + // This ensures validation rules (required, validation patterns) come from the + // source of truth rather than client-provided data. + const { directus, readItem } = useDirectus(); + let fields: FormField[]; + try { + // Public policy restricts this read to active forms; the server token only needs submission permissions. + const form = await directus.request( + readItem('forms', formId.trim(), { + fields: ['is_active', { fields: ['id', 'name', 'type', 'label', 'required', 'validation', 'choices'] }], + } as any), + ); + + if (!(form as any).is_active || !Array.isArray((form as any).fields)) { + return NextResponse.json({ error: 'Missing or invalid form' }, { status: 400 }); + } + + fields = ((form as any).fields as FormField[]).filter((field): field is FormField => typeof field !== 'string'); + } catch { + return NextResponse.json({ error: 'Missing or invalid form' }, { status: 400 }); + } + + const validation = validateFormSubmission(fields, formData); + if (!validation.success) { + return NextResponse.json({ error: validation.error }, { status: 400 }); + } + + const fieldsForSubmit = fields.map((field) => ({ + id: field.id, + name: field.name || '', + type: field.type || '', + })); + + try { + await submitForm(formId.trim(), fieldsForSubmit, validation.data); + + return NextResponse.json({ success: true }); + } catch (error) { + console.error('Error submitting form:', error); + + return NextResponse.json({ error: 'Failed to submit form' }, { status: 500 }); + } +} diff --git a/cms-i18n/nextjs/src/app/blog/[slug]/page.tsx b/cms-i18n/nextjs/src/app/blog/[slug]/page.tsx index c6147b53..f7afbbb1 100644 --- a/cms-i18n/nextjs/src/app/blog/[slug]/page.tsx +++ b/cms-i18n/nextjs/src/app/blog/[slug]/page.tsx @@ -13,11 +13,12 @@ export default async function BlogPostPage({ }) { const { slug } = await params; const { id, version, preview } = await searchParams; - const isDraft = preview === 'true' || (!!version && version !== 'published'); + // version=published is the live key in Directus v12+; version=main was used by older Directus versions. + // Both represent published content and don't require an explicit version parameter. + const isDraft = preview === 'true' || (!!version && version !== 'published' && version !== 'main'); const locale = await getLocaleFromHeaders(); - // Live preview adds version = main which is not required when fetching the main version. - const fixedVersion = version != 'main' ? version : undefined; + const fixedVersion = version === 'published' || version === 'main' ? undefined : version; try { let postId = id; let post: Post | null; diff --git a/cms-i18n/nextjs/src/components/blocks/Form.tsx b/cms-i18n/nextjs/src/components/blocks/Form.tsx index cffd929c..0b238ab6 100644 --- a/cms-i18n/nextjs/src/components/blocks/Form.tsx +++ b/cms-i18n/nextjs/src/components/blocks/Form.tsx @@ -4,7 +4,7 @@ import { FormField } from '@/types/directus-schema'; import Tagline from '@/components/ui/Tagline'; import FormBuilder from '../forms/FormBuilder'; import Headline from '@/components/ui/Headline'; -import { setAttr } from '@directus/visual-editing'; +import { setBlockAttr } from '@/lib/directus/visualEditing'; interface FormBlockProps { data: { @@ -39,9 +39,9 @@ const FormBlock = ({ data }: FormBlockProps) => { {tagline && ( { {headline && ( { )}
- +
); diff --git a/cms-i18n/nextjs/src/components/blocks/Gallery.tsx b/cms-i18n/nextjs/src/components/blocks/Gallery.tsx index 2f797fd5..13cfa6c5 100644 --- a/cms-i18n/nextjs/src/components/blocks/Gallery.tsx +++ b/cms-i18n/nextjs/src/components/blocks/Gallery.tsx @@ -6,7 +6,7 @@ import Tagline from '../ui/Tagline'; import Headline from '@/components/ui/Headline'; import { Dialog, DialogContent, DialogDescription, DialogTitle, DialogClose } from '@/components/ui/dialog'; import { ArrowLeft, ArrowRight, ZoomIn, X } from 'lucide-react'; -import { setAttr } from '@directus/visual-editing'; +import { setBlockAttr } from '@/lib/directus/visualEditing'; interface GalleryItem { id: string; @@ -80,9 +80,9 @@ const Gallery = ({ data }: GalleryProps) => { {tagline && ( { {headline && ( { {sortedItems.length > 0 && (
0 && (
@@ -100,9 +110,9 @@ export default function Hero({ data }: HeroProps) { 'relative w-full', layout === 'image_center' ? 'md:w-3/4 xl:w-2/3 h-[400px]' : 'md:w-1/2 h-[562px]', )} - data-directus={setAttr({ - collection: 'block_hero', - item: id, + data-directus={setBlockAttr({ + blockCollection: 'block_hero', + blockItemId: id, fields: ['image', 'layout'], mode: 'modal', })} diff --git a/cms-i18n/nextjs/src/components/blocks/Posts.tsx b/cms-i18n/nextjs/src/components/blocks/Posts.tsx index 46e8974c..88348e4d 100644 --- a/cms-i18n/nextjs/src/components/blocks/Posts.tsx +++ b/cms-i18n/nextjs/src/components/blocks/Posts.tsx @@ -18,7 +18,7 @@ import { } from '../ui/pagination'; import { Post } from '@/types/directus-schema'; import { fetchPaginatedPosts, fetchTotalPostCount } from '@/lib/directus/fetchers'; -import { setAttr } from '@directus/visual-editing'; +import { setBlockAttr } from '@/lib/directus/visualEditing'; import { getLocaleFromPath, addLocaleToPath } from '@/lib/i18n/utils'; interface PostsProps { @@ -108,9 +108,9 @@ const Posts = ({ data }: PostsProps) => { {tagline && ( { {headline && ( {
{ {tagline && ( { {headline && ( { )}
{ + const isDraftPreview = getIsDraftPreview(); + + // Published: target the card item. Draft: pageFields gives setBlockAttr the nested M2A path. + const pricingCardField = (field: string) => + setBlockAttr({ + blockCollection: 'block_pricing_cards', + blockItemId: card.id, + pageFields: `blocks.item:block_pricing.pricing_cards.${field}`, + fields: [field], + mode: 'popover', + }); + return (
{ }`} >
-

+

{card.title}

@@ -48,12 +52,7 @@ const PricingCard = ({ card }: PricingCardProps) => { {card.badge} @@ -61,28 +60,12 @@ const PricingCard = ({ card }: PricingCardProps) => {
{card.price && ( -

+

{card.price}

)} {card.description && ( -

+

{card.description}

)} @@ -91,15 +74,7 @@ const PricingCard = ({ card }: PricingCardProps) => {
{card.features && Array.isArray(card.features) && ( -
    +
      {card.features.map((feature, index) => (
    • @@ -115,12 +90,22 @@ const PricingCard = ({ card }: PricingCardProps) => { {card.button && (
      diff --git a/cms-i18n/nextjs/src/components/forms/FormBuilder.tsx b/cms-i18n/nextjs/src/components/forms/FormBuilder.tsx index 9a69c504..b0936203 100644 --- a/cms-i18n/nextjs/src/components/forms/FormBuilder.tsx +++ b/cms-i18n/nextjs/src/components/forms/FormBuilder.tsx @@ -3,13 +3,14 @@ import { useState } from 'react'; import { CheckCircle } from 'lucide-react'; import DynamicForm from './DynamicForm'; -import { submitForm } from '@/lib/directus/forms'; import { FormField } from '@/types/directus-schema'; import { cn } from '@/lib/utils'; interface FormBuilderProps { className?: string; itemId?: string; + /** block_form id — passed to DynamicForm for draft visual editing paths */ + blockFormId?: string; form: { id: string; on_success?: 'redirect' | 'message' | null; @@ -23,22 +24,37 @@ interface FormBuilderProps { }; } -const FormBuilder = ({ form, className }: FormBuilderProps) => { +const FormBuilder = ({ form, className, blockFormId }: FormBuilderProps) => { const [isSubmitted, setIsSubmitted] = useState(false); const [error, setError] = useState(null); if (!form.is_active) return null; - const handleSubmit = async (data: Record) => { + const handleSubmit = async (data: Record) => { setError(null); try { - const fieldsWithNames = form.fields.map((field) => ({ - id: field.id, - name: field.name || '', - type: field.type || '', - })); + const formData = new FormData(); + formData.append('formId', form.id); - await submitForm(form.id, fieldsWithNames, data); + for (const field of form.fields) { + if (!field.name) continue; + const value = data[field.name]; + if (value === undefined || value === null) continue; + + if (value instanceof File) { + formData.append(field.name, value); + } else if (Array.isArray(value)) { + formData.append(field.name, JSON.stringify(value)); + } else { + formData.append(field.name, String(value)); + } + } + + const response = await fetch('/api/forms/submit', { method: 'POST', body: formData }); + if (!response.ok) { + const body = await response.json().catch(() => ({})); + throw new Error(typeof body.error === 'string' ? body.error : 'Form submission failed'); + } if (form.on_success === 'redirect' && form.success_redirect_url) { window.location.href = form.success_redirect_url; @@ -47,7 +63,7 @@ const FormBuilder = ({ form, className }: FormBuilderProps) => { } } catch (err) { console.error('Error submitting form:', err); - setError('Failed to submit the form. Please try again later.'); + setError(err instanceof Error ? err.message : 'Failed to submit the form. Please try again later.'); } }; @@ -75,6 +91,7 @@ const FormBuilder = ({ form, className }: FormBuilderProps) => { onSubmit={handleSubmit} submitLabel={form.submit_label || 'Submit'} id={form.id} + blockFormId={blockFormId} />
); diff --git a/cms-i18n/nextjs/src/hooks/useVisualEditing.ts b/cms-i18n/nextjs/src/hooks/useVisualEditing.ts index 4d40cdb2..548f6f3f 100644 --- a/cms-i18n/nextjs/src/hooks/useVisualEditing.ts +++ b/cms-i18n/nextjs/src/hooks/useVisualEditing.ts @@ -2,7 +2,8 @@ import { useState, useEffect } from 'react'; import { useSearchParams, usePathname } from 'next/navigation'; -import { apply as applyVisualEditing, setAttr } from '@directus/visual-editing'; +import { apply as applyVisualEditing } from '@directus/visual-editing'; +import { setAttr, setVisualEditingAttrsEnabled } from '@/lib/directus/visualEditing'; interface ApplyOptions { elements?: HTMLElement[] | HTMLElement; @@ -19,12 +20,38 @@ export function useVisualEditing() { const enableVisualEditingEnv = process.env.NEXT_PUBLIC_ENABLE_VISUAL_EDITING !== 'false'; const directusUrl = process.env.NEXT_PUBLIC_DIRECTUS_URL || ''; + const readPersistedVisualEditing = () => { + try { + return localStorage.getItem('visual-editing') === 'true'; + } catch { + return false; + } + }; + + const writePersistedVisualEditing = (enabled: boolean) => { + try { + if (enabled) { + localStorage.setItem('visual-editing', 'true'); + } else { + localStorage.removeItem('visual-editing'); + } + } catch { + // Storage can be unavailable in restrictive browser contexts. + } + }; + useEffect(() => { if (typeof window === 'undefined') return; const param = searchParams.get('visual-editing'); + // Enable when Directus sends ?preview=true (live preview tab) even without + // ?visual-editing=true — both indicate an admin-controlled iframe. + const isPreview = searchParams.get('preview') === 'true'; if (!enableVisualEditingEnv) { + setVisualEditingAttrsEnabled(false); + setIsVisualEditingEnabled(false); + if (param === 'true') { console.warn('Visual editing is not enabled in this environment.'); } @@ -33,9 +60,9 @@ export function useVisualEditing() { } if (param === 'true') { - localStorage.setItem('visual-editing', 'true'); + writePersistedVisualEditing(true); } else if (param === 'false') { - localStorage.removeItem('visual-editing'); + writePersistedVisualEditing(false); const newParams = new URLSearchParams(searchParams.toString()); newParams.delete('visual-editing'); @@ -44,10 +71,12 @@ export function useVisualEditing() { window.history.replaceState({}, '', cleanUrl); } - const persisted = localStorage.getItem('visual-editing') === 'true'; - setIsVisualEditingEnabled(persisted); + const persisted = readPersistedVisualEditing(); + const shouldEnable = persisted || isPreview; + setVisualEditingAttrsEnabled(shouldEnable); + setIsVisualEditingEnabled(shouldEnable); - if (persisted && param !== 'true') { + if (shouldEnable && param !== 'true') { const newParams = new URLSearchParams(searchParams.toString()); newParams.set('visual-editing', 'true'); diff --git a/cms-i18n/nextjs/src/lib/directus/directus-utils.ts b/cms-i18n/nextjs/src/lib/directus/directus-utils.ts index 4fbc6721..e265c752 100644 --- a/cms-i18n/nextjs/src/lib/directus/directus-utils.ts +++ b/cms-i18n/nextjs/src/lib/directus/directus-utils.ts @@ -1,6 +1,4 @@ -import { DirectusFile } from '@/types/directus-schema'; - -export function getDirectusAssetURL(fileOrString: string | DirectusFile | null | undefined): string { +export function getDirectusAssetURL(fileOrString: string | { id: string } | null | undefined): string { if (!fileOrString) return ''; if (typeof fileOrString === 'string') { diff --git a/cms-i18n/nextjs/src/lib/directus/forms.ts b/cms-i18n/nextjs/src/lib/directus/forms.ts index 55dd120b..916df012 100644 --- a/cms-i18n/nextjs/src/lib/directus/forms.ts +++ b/cms-i18n/nextjs/src/lib/directus/forms.ts @@ -1,6 +1,7 @@ import { useDirectus } from './directus'; import type { FormSubmission, FormSubmissionValue } from '@/types/directus-schema'; +/** Server-only — call from API routes, not client components. */ export const submitForm = async ( formId: string, fields: { id: string; name: string; type: string }[], diff --git a/cms-i18n/nextjs/src/lib/directus/validateFormSubmission.test.ts b/cms-i18n/nextjs/src/lib/directus/validateFormSubmission.test.ts new file mode 100644 index 00000000..64f71262 --- /dev/null +++ b/cms-i18n/nextjs/src/lib/directus/validateFormSubmission.test.ts @@ -0,0 +1,103 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import type { FormField } from '@/types/directus-schema'; +import { + MAX_FORM_FILE_BYTES, + MAX_FORM_REQUEST_BYTES, + MAX_FORM_REQUEST_ENTRIES, + parseFormRequest, + validateFormSubmission, +} from './validateFormSubmission'; + +const field = (overrides: Partial): FormField => ({ + id: 'field-id', + name: 'field', + type: 'text', + ...overrides, +}); + +test('rejects oversized multipart requests before parsing', async () => { + const request = new Request('https://site.example.test/api/forms/submit', { + method: 'POST', + headers: { 'content-length': String(MAX_FORM_REQUEST_BYTES + 1) }, + body: new FormData(), + }); + + const result = await parseFormRequest(request); + assert.deepEqual(result, { success: false, error: 'Form submission is too large', status: 413 }); +}); + +test('rejects multipart requests with excessive entries', async () => { + const formData = new FormData(); + for (let index = 0; index <= MAX_FORM_REQUEST_ENTRIES; index++) { + formData.set(`field-${index}`, 'value'); + } + const request = new Request('https://site.example.test/api/forms/submit', { method: 'POST', body: formData }); + + const result = await parseFormRequest(request); + assert.equal(result.success, false); + if (!result.success) assert.equal(result.status, 413); +}); + +test('returns parsed data for bounded multipart requests', async () => { + const formData = new FormData(); + formData.set('formId', 'form-id'); + const request = new Request('https://site.example.test/api/forms/submit', { method: 'POST', body: formData }); + + const result = await parseFormRequest(request); + assert.equal(result.success, true); + if (result.success) assert.equal(result.data.get('formId'), 'form-id'); +}); + +test('rejects empty required checkbox controls', () => { + const checkbox = field({ name: 'consent', type: 'checkbox', required: true }); + const group = field({ name: 'topics', type: 'checkbox_group', required: true }); + const formData = new FormData(); + formData.set('consent', 'false'); + formData.set('topics', '[]'); + + assert.equal(validateFormSubmission([checkbox], formData).success, false); + assert.equal(validateFormSubmission([group], formData).success, false); +}); + +test('rejects values outside configured choices', () => { + const choices = [ + { text: 'Basic', value: 'basic' }, + { text: 'Pro', value: 'pro' }, + ]; + const select = field({ name: 'plan', type: 'select', required: true, choices }); + const group = field({ name: 'plans', type: 'checkbox_group', choices }); + const formData = new FormData(); + formData.set('plan', 'enterprise'); + formData.set('plans', JSON.stringify(['basic', 'enterprise'])); + + assert.equal(validateFormSubmission([select], formData).success, false); + assert.equal(validateFormSubmission([group], formData).success, false); +}); + +test('accepts configured choices and checked required controls', () => { + const choices = [{ text: 'Basic', value: 'basic' }]; + const fields = [ + field({ name: 'consent', type: 'checkbox', required: true }), + field({ name: 'plan', type: 'select', required: true, choices }), + field({ name: 'plans', type: 'checkbox_group', required: true, choices }), + ]; + const formData = new FormData(); + formData.set('consent', 'true'); + formData.set('plan', 'basic'); + formData.set('plans', JSON.stringify(['basic'])); + + assert.equal(validateFormSubmission(fields, formData).success, true); +}); + +test('matches the licensed Directus five-megabyte upload limit', () => { + const upload = field({ name: 'upload', type: 'file' }); + const accepted = new FormData(); + accepted.set('upload', new File([new Uint8Array(MAX_FORM_FILE_BYTES)], 'accepted.bin')); + const rejected = new FormData(); + rejected.set('upload', new File([new Uint8Array(MAX_FORM_FILE_BYTES + 1)], 'rejected.bin')); + + assert.equal(MAX_FORM_FILE_BYTES, 5_000_000); + assert.equal(validateFormSubmission([upload], accepted).success, true); + assert.equal(validateFormSubmission([upload], rejected).success, false); +}); diff --git a/cms-i18n/nextjs/src/lib/directus/validateFormSubmission.ts b/cms-i18n/nextjs/src/lib/directus/validateFormSubmission.ts new file mode 100644 index 00000000..64341557 --- /dev/null +++ b/cms-i18n/nextjs/src/lib/directus/validateFormSubmission.ts @@ -0,0 +1,105 @@ +import { buildZodSchema } from '@/lib/zodSchemaBuilder'; +import type { FormField } from '@/types/directus-schema'; + +/** Matches licensed template Forms policy file upload limit (5 MB). */ +export const MAX_FORM_FILE_BYTES = 5_000_000; + +/** Allows up to five maximum-sized files plus multipart field overhead. */ +export const MAX_FORM_REQUEST_BYTES = MAX_FORM_FILE_BYTES * 5 + 1_000_000; +export const MAX_FORM_REQUEST_ENTRIES = 100; + +type ParseFormRequestResult = + | { success: true; data: FormData } + | { success: false; error: string; status: 400 | 413 }; + +export async function parseFormRequest(request: Request): Promise { + const contentLength = Number(request.headers.get('content-length')); + if (Number.isFinite(contentLength) && contentLength > MAX_FORM_REQUEST_BYTES) { + return { success: false, error: 'Form submission is too large', status: 413 }; + } + + let formData: FormData; + try { + formData = await request.formData(); + } catch { + return { success: false, error: 'Invalid form submission', status: 400 }; + } + + let entryCount = 0; + let payloadBytes = 0; + for (const [, value] of formData) { + entryCount++; + payloadBytes += typeof value === 'string' ? new TextEncoder().encode(value).byteLength : value.size; + + if (entryCount > MAX_FORM_REQUEST_ENTRIES || payloadBytes > MAX_FORM_REQUEST_BYTES) { + return { success: false, error: 'Form submission is too large', status: 413 }; + } + } + + return { success: true, data: formData }; +} + +function parseFieldValue(field: FormField, raw: FormDataEntryValue): unknown { + if (field.type === 'file') { + return raw instanceof File ? raw : undefined; + } + if (typeof raw !== 'string') { + return undefined; + } + if (field.type === 'checkbox') { + return raw === 'true'; + } + if (field.type === 'checkbox_group') { + try { + const parsed = JSON.parse(raw); + + return Array.isArray(parsed) ? parsed : []; + } catch { + return []; + } + } + + return raw; +} + +export function validateFormSubmission( + fields: FormField[], + formData: FormData, +): { success: true; data: Record } | { success: false; error: string } { + const data: Record = {}; + + for (const field of fields) { + if (!field.name) continue; + const raw = formData.get(field.name); + if (raw === null) continue; + + if (field.type === 'file' && raw instanceof File) { + if (raw.size > MAX_FORM_FILE_BYTES) { + return { + success: false, + error: `${field.label || field.name} must be 5 MB or smaller`, + }; + } + if (raw.size > 0) { + data[field.name] = raw; + } + continue; + } + + const value = parseFieldValue(field, raw); + if (value !== undefined) { + data[field.name] = value; + } + } + + const schema = buildZodSchema(fields); + const result = schema.safeParse(data); + + if (!result.success) { + const first = result.error.issues[0]; + + return { success: false, error: first?.message || 'Validation failed' }; + } + + return { success: true, data: result.data as Record }; +} diff --git a/cms-i18n/nextjs/src/lib/directus/visualEditing.ts b/cms-i18n/nextjs/src/lib/directus/visualEditing.ts new file mode 100644 index 00000000..e2b62488 --- /dev/null +++ b/cms-i18n/nextjs/src/lib/directus/visualEditing.ts @@ -0,0 +1,96 @@ +'use client'; + +import { setAttr as baseSetAttr } from '@directus/visual-editing'; + +interface ApplyOptions { + collection: string; + item: string | number; + fields?: string | string[]; + mode?: 'modal' | 'popover' | 'drawer'; +} + +export type SetBlockAttrOptions = { + blockCollection: string; + blockItemId: string | number; + fields: string | string[]; + mode?: 'modal' | 'popover' | 'drawer'; + /** + * Draft-only path override on the `pages` item, e.g. `blocks.item:block_pricing.pricing_cards.title`. + * Use when the editable field lives deeper than `blocks.item:{block}.{field}`. + */ + pageFields?: string | string[]; +}; + +type PageVisualEditingContext = { + contentVersion?: string; + pageId?: string; +}; + +let pageContext: PageVisualEditingContext = {}; +let visualEditingAttrsEnabled = false; + +/** Set from PageClient so setBlockAttr() can route through the versioned pages item. */ +export function setVisualEditingPageContext(ctx: PageVisualEditingContext) { + pageContext = ctx; +} + +export function getIsDraftPreview(): boolean { + return !!pageContext.contentVersion; +} + +export function setVisualEditingAttrsEnabled(enabled: boolean) { + visualEditingAttrsEnabled = enabled; +} + +export const setAttr = (options: ApplyOptions) => { + if (visualEditingAttrsEnabled) { + return baseSetAttr({ ...options }); + } +}; + +/** Maps block field names to the M2A path on a versioned `pages` item. */ +function toPageBlockFields( + blockCollection: string, + fields: string | string[], + pageFields?: string | string[], +): string | string[] { + if (pageFields) { + return pageFields; + } + + const list = Array.isArray(fields) ? fields : [fields]; + const paths = list.map((field) => `blocks.item:${blockCollection}.${field}`); + + return paths.length === 1 ? paths[0] : paths; +} + +/** + * Visual editing attrs for page-builder blocks. + * + * Page blocks are M2A items (`page_blocks` → `block_hero`, etc.). On published/live + * preview, target the block collection directly for field-level popovers. + * + * When a content version is active (e.g. `?version=draft`), edits belong to the + * versioned `pages` item — so attrs route through that parent with nested + * `blocks.item:…` paths and open in modal mode. + */ +export const setBlockAttr = (options: SetBlockAttrOptions) => { + const { blockCollection, blockItemId, fields, mode, pageFields } = options; + const { contentVersion, pageId } = pageContext; + + if (contentVersion && pageId) { + return setAttr({ + collection: 'pages', + item: pageId, + fields: toPageBlockFields(blockCollection, fields, pageFields), + mode: 'modal', + }); + } + + return setAttr({ + collection: blockCollection, + item: blockItemId, + fields, + mode, + }); +}; diff --git a/cms-i18n/nextjs/src/lib/redirects.ts b/cms-i18n/nextjs/src/lib/redirects.ts index 10b75d7c..402ed947 100644 --- a/cms-i18n/nextjs/src/lib/redirects.ts +++ b/cms-i18n/nextjs/src/lib/redirects.ts @@ -20,6 +20,7 @@ export async function generateRedirects(): Promise { (redirect): redirect is { url_from: string; url_to: string; response_code: '301' | '302' } => typeof redirect.url_from === 'string' && typeof redirect.url_to === 'string' && + redirect.url_from !== redirect.url_to && (redirect.response_code === '301' || redirect.response_code === '302'), ) .map((redirect) => ({ diff --git a/cms-i18n/nextjs/src/lib/zodSchemaBuilder.ts b/cms-i18n/nextjs/src/lib/zodSchemaBuilder.ts index 1bece613..f76a6a5b 100644 --- a/cms-i18n/nextjs/src/lib/zodSchemaBuilder.ts +++ b/cms-i18n/nextjs/src/lib/zodSchemaBuilder.ts @@ -6,6 +6,8 @@ export const buildZodSchema = (fields: FormField[]) => { fields.forEach((field) => { let fieldSchema: z.ZodTypeAny; + const fieldLabel = field.label || field.name; + const choiceValues = field.choices?.map((choice) => choice.value) || []; switch (field.type) { case 'checkbox': @@ -83,14 +85,32 @@ export const buildZodSchema = (fields: FormField[]) => { } if (field.required) { - if (fieldSchema instanceof z.ZodString) { - fieldSchema = fieldSchema.nonempty(`${field.label || field.name} is required`); + if (field.type === 'checkbox') { + fieldSchema = fieldSchema.refine((value) => value === true, `${fieldLabel} is required`); + } else if (field.type === 'checkbox_group') { + fieldSchema = fieldSchema.refine((value) => value.length > 0, `${fieldLabel} is required`); + } else if (fieldSchema instanceof z.ZodString) { + fieldSchema = fieldSchema.nonempty(`${fieldLabel} is required`); } } else { // Allow empty strings or undefined for optional fields fieldSchema = fieldSchema.or(z.literal('')).or(z.undefined()); } + if (choiceValues.length > 0) { + if (field.type === 'checkbox_group') { + fieldSchema = fieldSchema.refine( + (value) => value === '' || value === undefined || value.every((choice: string) => choiceValues.includes(choice)), + `${fieldLabel} contains an invalid option`, + ); + } else if (field.type === 'radio' || field.type === 'select') { + fieldSchema = fieldSchema.refine( + (value) => value === '' || value === undefined || choiceValues.includes(value), + `${fieldLabel} must be a configured option`, + ); + } + } + if (field.name) { schema[field.name] = fieldSchema; } diff --git a/cms-i18n/nuxt/.env.example b/cms-i18n/nuxt/.env.example index 219ac717..89240bb4 100644 --- a/cms-i18n/nuxt/.env.example +++ b/cms-i18n/nuxt/.env.example @@ -1,5 +1,5 @@ DIRECTUS_URL="http://localhost:8055" -DIRECTUS_SERVER_TOKEN="token_from_Webmaster_account" +DIRECTUS_SERVER_TOKEN="your_admin_static_token" DIRECTUS_ADMIN_TOKEN="token_from_Admin_account" # Only for local type generation, never used at runtime NUXT_PUBLIC_SITE_URL="http://localhost:3000" # Set to false to disable (enabled by default) diff --git a/cms-i18n/nuxt/README.md b/cms-i18n/nuxt/README.md index e9b55a30..9e4d8054 100644 --- a/cms-i18n/nuxt/README.md +++ b/cms-i18n/nuxt/README.md @@ -13,6 +13,8 @@ CMS-powered web applications. > **Note**: This is the i18n-enabled version of the Nuxt CMS template. For a single-language version, see the > [standard Nuxt CMS template](../nuxt/README.md). +> **License required**: See the [cms-i18n README](../README.md) for Directus setup. + ## **Features** - **Nuxt 4 File-Based Routing**: Uses Nuxt's built-in routing system with dynamic page handling. @@ -39,6 +41,14 @@ CMS-powered web applications. Directus allows you to work on unpublished content using **Draft Mode**. This Nuxt 4 template is configured to support Directus Draft Mode out of the box, enabling live previews of unpublished or draft content as you make changes. +### **Content Versioning in Directus 12** + +In Directus 12, the published content version is called `published` (formerly `main`), and every versioned item +automatically gets a `draft` version. Published items are locked in the Studio — edits happen on the draft version and +are promoted to publish. This template handles both keys: preview URLs with `version=published` (or the legacy +`version=main`) load the live content, while `version=draft` (or any custom version key) fetches that version from the +API. + ### **Live Preview Setup** [Directus Live Preview](https://docs.directus.io/guides/headless-cms/live-preview/nuxt-3.html#set-up-live-preview-with-nuxt-3) @@ -116,7 +126,8 @@ To get started, you need to configure environment variables. Follow these steps: - **`DIRECTUS_URL`**: URL of your Directus instance. - **`DIRECTUS_SERVER_TOKEN`**: Server-side token for accessing content, preview, and form submissions. Use the token - from the **Webmaster** account. + from your Directus **admin account** (created during first-launch onboarding). With a licensed instance, you can + instead use a token from a user assigned only the **Content - Live Preview** and **Forms - Submission** policies. - **`DIRECTUS_ADMIN_TOKEN`**: Admin token for local type generation only. Never used at runtime. - **`NUXT_PUBLIC_SITE_URL`**: The public URL of your site. This is used for SEO metadata and blog post routing. - **`NUXT_PUBLIC_ENABLE_VISUAL_EDITING`**: Visual editing is enabled by default. Set to `false` to disable. diff --git a/cms-i18n/nuxt/app/components/block/FormBlock.vue b/cms-i18n/nuxt/app/components/block/FormBlock.vue index 38d484fb..8822a152 100644 --- a/cms-i18n/nuxt/app/components/block/FormBlock.vue +++ b/cms-i18n/nuxt/app/components/block/FormBlock.vue @@ -17,8 +17,8 @@ interface CustomForm { fields: FormField[]; } -const { setAttr } = useVisualEditing(); defineProps<{ data: CustomFormData }>(); +const { setBlockAttr } = useVisualEditingAttrs(); diff --git a/cms-i18n/nuxt/app/components/block/Gallery.vue b/cms-i18n/nuxt/app/components/block/Gallery.vue index 8b4a3467..280756fe 100644 --- a/cms-i18n/nuxt/app/components/block/Gallery.vue +++ b/cms-i18n/nuxt/app/components/block/Gallery.vue @@ -17,6 +17,7 @@ interface GalleryProps { } const props = defineProps(); +const { setBlockAttr } = useVisualEditingAttrs(); const isLightboxOpen = ref(false); const currentIndex = ref(0); @@ -69,8 +70,6 @@ function handleKeyDown(e: KeyboardEvent) { } } -const { setAttr } = useVisualEditing(); - onMounted(() => { window.addEventListener('keydown', handleKeyDown); }); @@ -85,18 +84,18 @@ onUnmounted(() => {
(); + +const { isDraftPreview, setBlockAttr } = useVisualEditingAttrs();