diff --git a/.env b/.env index c41d5e83..24a522ca 100644 --- a/.env +++ b/.env @@ -22,8 +22,8 @@ DIRECTUS_ADMIN_EMAIL=marc@mintel.me DIRECTUS_ADMIN_PASSWORD=Tim300493. DIRECTUS_API_TOKEN=59fb8f4c1a51b18fe28ad947f713914e DIRECTUS_DB_NAME=directus -DIRECTUS_DB_USER=directus -DIRECTUS_DB_PASSWORD=directus +DIRECTUS_DB_USER=klz_db_user +DIRECTUS_DB_PASSWORD=klz_db_pass # Local Development PROJECT_NAME=klz-cables GATEKEEPER_BYPASS_ENABLED=true @@ -33,3 +33,4 @@ GATEKEEPER_PASSWORD=klz2026 COOKIE_DOMAIN=localhost INFRA_DIRECTUS_URL=http://localhost:8059 INFRA_DIRECTUS_TOKEN=59fb8f4c1a51b18fe28ad947f713914e +GATEKEEPER_ORIGIN=http://klz.localhost \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 0efa3e73..c0e72da2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,10 +34,15 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ # Copy source code COPY . . -# Build application -RUN pnpm build +# Stage 2: Development (Hot-Reloading) +FROM builder AS development +ENV NODE_ENV=development +CMD ["pnpm", "dev:local"] -# Stage 2: Runner +# Build application +# RUN pnpm build + +# Stage 3: Runner FROM registry.infra.mintel.me/mintel/runtime:v1.7.10 AS runner WORKDIR /app diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index 52c9e857..0cfef71b 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -3,9 +3,9 @@ import Header from '@/components/Header'; import JsonLd from '@/components/JsonLd'; import AnalyticsProvider from '@/components/analytics/AnalyticsProvider'; import CMSConnectivityNotice from '@/components/CMSConnectivityNotice'; -import { FeedbackOverlay } from '@mintel/next-feedback'; import { RecordModeProvider } from '@/components/record-mode/RecordModeContext'; -import { RecordModeOverlay } from '@/components/record-mode/RecordModeOverlay'; +import { RecordModeVisuals } from '@/components/record-mode/RecordModeVisuals'; +import { ToolCoordinator } from '@/components/record-mode/ToolCoordinator'; import { Metadata, Viewport } from 'next'; import { NextIntlClientProvider } from 'next-intl'; import { getMessages } from 'next-intl/server'; @@ -98,20 +98,49 @@ export default async function LocaleLayout({ return ( + + + + + ); +} diff --git a/components/record-mode/ToolCoordinator.tsx b/components/record-mode/ToolCoordinator.tsx new file mode 100644 index 00000000..b6163d0f --- /dev/null +++ b/components/record-mode/ToolCoordinator.tsx @@ -0,0 +1,63 @@ +'use client'; + +import React, { useState, useEffect } from 'react'; +import { useRecordMode } from './RecordModeContext'; +import { useSearchParams } from 'next/navigation'; +import { FeedbackOverlay } from '@mintel/next-feedback'; +import { RecordModeOverlay } from './RecordModeOverlay'; +import { PickingHelper } from './PickingHelper'; +import { config } from '@/lib/config'; + +export function ToolCoordinator({ isEmbedded: isEmbeddedProp }: { isEmbedded?: boolean }) { + const { isActive, setIsActive, isFeedbackActive, setIsFeedbackActive } = useRecordMode(); + const [isEmbedded, setIsEmbedded] = useState(false); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + const embedded = + isEmbeddedProp || + window.location.search.includes('embedded=true') || + window.name === 'record-mode-iframe' || + (window.self !== window.top); + setIsEmbedded(embedded); + }, [isEmbeddedProp]); + + if (!mounted) return null; + + // ABSOLUTE Priority 1: Inside Iframe - ONLY Rendering PickingHelper + if (isEmbedded) { + return ; + } + + // ABSOLUTE Priority 2: Record Mode Studio Active - NO OTHER TOOLS ALLOWED + if (isActive) { + return ; + } + + // Priority 3: Feedback Tool Active - NO OTHER TOOLS ALLOWED + if (isFeedbackActive) { + return ( + setIsFeedbackActive(active)} + /> + ); + } + + // Baseline: Both toggle buttons (inactive state) + // Only render if neither is active to prevent any overlapping residues + // IMPORTANT: FeedbackOverlay must be rendered with isActive={false} to provide the toggle button, + // but only if Record Mode is not active. + return ( +
+ {config.feedbackEnabled && ( + setIsFeedbackActive(active)} + /> + )} + +
+ ); +} diff --git a/directus/schema/minimal_schema.yaml b/directus/schema/minimal_schema.yaml new file mode 100644 index 00000000..b110382d --- /dev/null +++ b/directus/schema/minimal_schema.yaml @@ -0,0 +1,83 @@ +version: 1 +directus: 11.14.1 +vendor: postgres +collections: + - collection: contact_submissions + meta: + accountability: all + archive_app_filter: true + collapse: open + collection: contact_submissions + color: '#002b49' + display_template: '{{name}} | {{email}}' + hidden: false + icon: contact_mail + singleton: false + schema: + name: contact_submissions +fields: + - collection: contact_submissions + field: id + type: uuid + meta: + collection: contact_submissions + field: id + hidden: true + sort: 1 + schema: + name: id + table: contact_submissions + data_type: uuid + is_nullable: false + is_primary_key: true + - collection: contact_submissions + field: name + type: string + meta: + collection: contact_submissions + field: name + interface: input + sort: 2 + schema: + name: name + table: contact_submissions + data_type: character varying + - collection: contact_submissions + field: email + type: string + meta: + collection: contact_submissions + field: email + interface: input + sort: 3 + schema: + name: email + table: contact_submissions + data_type: character varying + - collection: contact_submissions + field: message + type: text + meta: + collection: contact_submissions + field: message + interface: textarea + sort: 4 + schema: + name: message + table: contact_submissions + data_type: text + - collection: contact_submissions + field: date_created + type: timestamp + meta: + collection: contact_submissions + field: date_created + interface: datetime + readonly: true + sort: 5 + schema: + name: date_created + table: contact_submissions + data_type: timestamp with time zone + default_value: CURRENT_TIMESTAMP +relations: [] diff --git a/directus/schema/snapshot.yaml b/directus/schema/snapshot.yaml index a53e669a..b53501b2 100644 --- a/directus/schema/snapshot.yaml +++ b/directus/schema/snapshot.yaml @@ -6,51 +6,474 @@ collections: meta: accountability: all archive_app_filter: true - archive_field: null - archive_value: null collapse: open collection: contact_submissions color: '#002b49' - display_template: '{{first_name}} {{last_name}} | {{subject}}' - group: null + display_template: '{{name}} | {{email}}' hidden: false icon: contact_mail - item_duplication_fields: null - note: null - preview_url: null singleton: false - sort: null - sort_field: null - translations: null - unarchive_value: null - versioning: false schema: name: contact_submissions - collection: product_requests meta: accountability: all archive_app_filter: true - archive_field: null - archive_value: null collapse: open collection: product_requests color: '#002b49' - display_template: null - group: null + display_template: '{{product_name}} | {{email}}' hidden: false icon: inventory - item_duplication_fields: null - note: null - preview_url: null singleton: false - sort: null - sort_field: null - translations: null - unarchive_value: null - versioning: false schema: name: product_requests -fields: [] + - collection: products + meta: + accountability: all + collection: products + icon: inventory_2 + singleton: false + schema: + name: products + - collection: products_translations + meta: + accountability: all + collection: products_translations + hidden: true + schema: + name: products_translations + - collection: visual_feedback + meta: + accountability: all + archive_app_filter: true + collapse: open + collection: visual_feedback + color: '#002b49' + display_template: '{{user_name}} | {{type}}: {{text}}' + hidden: false + icon: feedback + singleton: false + versioning: false + schema: + name: visual_feedback + - collection: visual_feedback_comments + meta: + accountability: all + archive_app_filter: true + collapse: open + collection: visual_feedback_comments + color: '#002b49' + display_template: '{{user_name}}: {{text}}' + hidden: false + icon: comment + singleton: false + versioning: false + schema: + name: visual_feedback_comments +fields: + # contact_submissions + - collection: contact_submissions + field: id + type: uuid + meta: + collection: contact_submissions + field: id + hidden: true + sort: 1 + schema: + name: id + table: contact_submissions + data_type: uuid + is_nullable: false + is_primary_key: true + - collection: contact_submissions + field: name + type: string + meta: + collection: contact_submissions + field: name + interface: input + sort: 2 + schema: + name: name + table: contact_submissions + data_type: character varying + - collection: contact_submissions + field: email + type: string + meta: + collection: contact_submissions + field: email + interface: input + sort: 3 + schema: + name: email + table: contact_submissions + data_type: character varying + - collection: contact_submissions + field: message + type: text + meta: + collection: contact_submissions + field: message + interface: textarea + sort: 4 + schema: + name: message + table: contact_submissions + data_type: text + - collection: contact_submissions + field: date_created + type: timestamp + meta: + collection: contact_submissions + field: date_created + interface: datetime + readonly: true + sort: 5 + schema: + name: date_created + table: contact_submissions + data_type: timestamp with time zone + default_value: CURRENT_TIMESTAMP + + # product_requests + - collection: product_requests + field: id + type: uuid + meta: + collection: product_requests + field: id + hidden: true + sort: 1 + schema: + name: id + table: product_requests + data_type: uuid + is_nullable: false + is_primary_key: true + - collection: product_requests + field: product_name + type: string + meta: + collection: product_requests + field: product_name + interface: input + sort: 2 + schema: + name: product_name + table: product_requests + data_type: character varying + - collection: product_requests + field: email + type: string + meta: + collection: product_requests + field: email + interface: input + sort: 3 + schema: + name: email + table: product_requests + data_type: character varying + - collection: product_requests + field: message + type: text + meta: + collection: product_requests + field: message + interface: textarea + sort: 4 + schema: + name: message + table: product_requests + data_type: text + - collection: product_requests + field: date_created + type: timestamp + meta: + collection: product_requests + field: date_created + interface: datetime + readonly: true + sort: 5 + schema: + name: date_created + table: product_requests + data_type: timestamp with time zone + default_value: CURRENT_TIMESTAMP + + # products + - collection: products + field: id + type: uuid + meta: + collection: products + field: id + hidden: true + sort: 1 + schema: + name: id + table: products + data_type: uuid + is_nullable: false + is_primary_key: true + + # products_translations + - collection: products_translations + field: id + type: integer + meta: + collection: products_translations + field: id + hidden: true + schema: + name: id + table: products_translations + data_type: integer + is_primary_key: true + has_auto_increment: true + + # visual_feedback (from current snapshot) + - collection: visual_feedback + field: id + type: uuid + meta: + collection: visual_feedback + field: id + hidden: true + sort: 1 + schema: + name: id + table: visual_feedback + data_type: uuid + is_nullable: false + is_primary_key: true + - collection: visual_feedback + field: status + type: string + meta: + collection: visual_feedback + display: labels + interface: select-dropdown + sort: 2 + schema: + name: status + table: visual_feedback + data_type: character varying + default_value: open + is_nullable: true + - collection: visual_feedback + field: type + type: string + meta: + collection: visual_feedback + display: labels + interface: select-dropdown + sort: 3 + schema: + name: type + table: visual_feedback + data_type: character varying + is_nullable: true + - collection: visual_feedback + field: text + type: text + meta: + collection: visual_feedback + interface: input-multiline + sort: 4 + schema: + name: text + table: visual_feedback + data_type: text + is_nullable: true + - collection: visual_feedback + field: url + type: string + meta: + collection: visual_feedback + interface: input + readonly: true + sort: 5 + schema: + name: url + table: visual_feedback + data_type: character varying + is_nullable: true + - collection: visual_feedback + field: user_info_group + type: alias + meta: + collection: visual_feedback + field: user_info_group + interface: group-detail + sort: 6 + special: + - alias + - no-data + - group + - collection: visual_feedback + field: user_name + type: string + meta: + collection: visual_feedback + field: user_name + group: user_info_group + interface: input + sort: 1 + schema: + name: user_name + table: visual_feedback + data_type: character varying + is_nullable: true + - collection: visual_feedback + field: user_identity + type: string + meta: + collection: visual_feedback + field: user_identity + group: user_info_group + interface: input + readonly: true + sort: 2 + schema: + name: user_identity + table: visual_feedback + data_type: character varying + is_nullable: true + - collection: visual_feedback + field: technical_details_group + type: alias + meta: + collection: visual_feedback + field: technical_details_group + interface: group-detail + sort: 7 + special: + - alias + - no-data + - group + - collection: visual_feedback + field: selector + type: string + meta: + collection: visual_feedback + field: selector + group: technical_details_group + interface: input + readonly: true + sort: 1 + schema: + name: selector + table: visual_feedback + data_type: character varying + is_nullable: true + - collection: visual_feedback + field: x + type: float + meta: + collection: visual_feedback + field: x + group: technical_details_group + interface: input + sort: 2 + schema: + name: x + table: visual_feedback + data_type: real + is_nullable: true + - collection: visual_feedback + field: 'y' + type: float + meta: + collection: visual_feedback + field: 'y' + group: technical_details_group + interface: input + sort: 3 + schema: + name: 'y' + table: visual_feedback + data_type: real + is_nullable: true + - collection: visual_feedback + field: date_created + type: timestamp + meta: + collection: visual_feedback + interface: datetime + readonly: true + sort: 8 + schema: + name: date_created + table: visual_feedback + data_type: timestamp with time zone + default_value: CURRENT_TIMESTAMP + is_nullable: true + - collection: visual_feedback_comments + field: id + type: uuid + meta: + collection: visual_feedback_comments + field: id + hidden: true + schema: + name: id + table: visual_feedback_comments + data_type: uuid + is_primary_key: true + - collection: visual_feedback_comments + field: feedback_id + type: uuid + meta: + collection: visual_feedback_comments + field: feedback_id + interface: select-relational + sort: 2 + schema: + name: feedback_id + table: visual_feedback_comments + data_type: uuid + - collection: visual_feedback_comments + field: user_name + type: string + meta: + collection: visual_feedback_comments + field: user_name + interface: input + sort: 3 + schema: + name: user_name + table: visual_feedback_comments + data_type: character varying + - collection: visual_feedback_comments + field: text + type: text + meta: + collection: visual_feedback_comments + field: text + interface: input-multiline + sort: 4 + schema: + name: text + table: visual_feedback_comments + data_type: text + - collection: visual_feedback_comments + field: date_created + type: timestamp + meta: + collection: visual_feedback_comments + interface: datetime + readonly: true + sort: 5 + schema: + name: date_created + table: visual_feedback_comments + data_type: timestamp with time zone + default_value: CURRENT_TIMESTAMP + systemFields: - collection: directus_activity field: timestamp @@ -64,4 +487,18 @@ systemFields: field: parent schema: is_indexed: true -relations: [] + +relations: + - collection: visual_feedback_comments + field: feedback_id + related_collection: visual_feedback + schema: + column: feedback_id + foreign_key_column: id + foreign_key_table: visual_feedback + table: visual_feedback_comments + meta: + many_collection: visual_feedback_comments + many_field: feedback_id + one_collection: visual_feedback + one_field: null diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 00000000..af878b0a --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,43 @@ +services: + klz-app: + build: + context: . + dockerfile: Dockerfile + target: development + volumes: + - .:/app + - /app/node_modules + - /app/.next + environment: + - WATCHPACK_POLLING=true # Useful for Docker volume mounting issues on some systems + restart: "no" + container_name: klz-app-dev + labels: + - "traefik.enable=true" + # Clear any production middlewares/headers redirect + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-web.middlewares=" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-web.rule=Host(`${TRAEFIK_HOST:-klz.localhost}`)" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-web.entrypoints=web" + # Configure main router for local HTTP without auth + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.rule=Host(`${TRAEFIK_HOST:-klz.localhost}`)" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.entrypoints=web" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.middlewares=" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.tls=false" + - "traefik.docker.network=infra" + + directus-cms: + container_name: klz-cms-dev + restart: "no" + labels: + - "traefik.enable=true" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-cms.rule=Host(`${DIRECTUS_HOST:-cms.klz.localhost}`)" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-cms.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-cms.service=${PROJECT_NAME:-klz-cables}-cms" + - "traefik.http.services.${PROJECT_NAME:-klz-cables}-cms.loadbalancer.server.port=8055" + - "traefik.docker.network=infra" + + klz-db: + restart: "no" + + gatekeeper: + restart: "no" diff --git a/docker-compose.yml b/docker-compose.yml index 053d852a..82818995 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,13 @@ services: klz-app: + build: + context: . + dockerfile: Dockerfile + args: + NEXT_PUBLIC_BASE_URL: ${NEXT_PUBLIC_BASE_URL} + DIRECTUS_URL: ${DIRECTUS_URL} image: registry.infra.mintel.me/mintel/klz-cables.com:${IMAGE_TAG:-latest} - restart: always + restart: unless-stopped networks: - default - infra @@ -10,22 +16,22 @@ services: labels: - "traefik.enable=true" # HTTP ⇒ HTTPS redirect - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-web.rule=${TRAEFIK_HOST_RULE:-Host(\"klz-cables.com\")}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-web.rule=${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-klz-cables.com}`)}" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-web.entrypoints=web" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-web.middlewares=redirect-https" # HTTPS router (Standard) - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.rule=${TRAEFIK_HOST_RULE:-Host(\"klz-cables.com\")}" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.entrypoints=websecure" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.tls.certresolver=le" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.tls=true" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.rule=${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-klz-cables.com}`)}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.tls=${TRAEFIK_TLS:-false}" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.service=${PROJECT_NAME:-klz-cables}" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.middlewares=${AUTH_MIDDLEWARE:-${PROJECT_NAME:-klz-cables}-ratelimit,${PROJECT_NAME:-klz-cables}-forward,${PROJECT_NAME:-klz-cables}-compress}" # Public Router (Whitelist for OG Images, Sitemaps, Health) - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.rule=(${TRAEFIK_HOST_RULE:-Host(\"klz-cables.com\")}) && (PathPrefix(\"/health\", \"/sitemap.xml\", \"/robots.txt\", \"/manifest.webmanifest\", \"/api/og\") || PathRegexp(\".*opengraph-image.*\") || PathRegexp(\".*sitemap.*\"))" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.entrypoints=websecure" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.tls.certresolver=le" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.tls=true" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.rule=(${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-klz-cables.com}`)}) && (PathPrefix(`/health`, `/sitemap.xml`, `/robots.txt`, `/manifest.webmanifest`, `/api/og`) || PathRegexp(`.*opengraph-image.*`) || PathRegexp(`.*sitemap.*`))" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.tls=${TRAEFIK_TLS:-false}" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.service=${PROJECT_NAME:-klz-cables}" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.middlewares=${AUTH_MIDDLEWARE_UNPROTECTED:-${PROJECT_NAME:-klz-cables}-ratelimit,${PROJECT_NAME:-klz-cables}-forward,${PROJECT_NAME:-klz-cables}-compress}" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-public.priority=2000" @@ -47,20 +53,20 @@ services: - "traefik.http.middlewares.${PROJECT_NAME:-klz-cables}-auth.forwardauth.authRequestHeaders=X-Forwarded-Host,X-Forwarded-Proto,X-Forwarded-For,Cookie" - "traefik.http.middlewares.${PROJECT_NAME:-klz-cables}-auth.forwardauth.authResponseHeaders=X-Auth-User" - # Middleware Definitions + # Rate Limit Middleware - "traefik.http.middlewares.${PROJECT_NAME:-klz-cables}-ratelimit.ratelimit.average=100" - "traefik.http.middlewares.${PROJECT_NAME:-klz-cables}-ratelimit.ratelimit.burst=50" healthcheck: - test: [ "CMD", "curl", "-f", "http://127.0.0.1:3000/" ] - interval: 10s - timeout: 5s - retries: 5 - start_period: 30s + test: [ "CMD", "curl", "-f", "http://127.0.0.1:3000/health" ] + interval: 15s + timeout: 10s + retries: 3 + start_period: 45s gatekeeper: profiles: [ "gatekeeper" ] image: registry.infra.mintel.me/mintel/gatekeeper:v1.7.12 - restart: always + restart: unless-stopped networks: infra: aliases: @@ -78,22 +84,18 @@ services: labels: - "traefik.enable=true" - "traefik.docker.network=infra" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.rule=(Host(\"${TRAEFIK_HOST:-testing.klz-cables.com}\") && PathPrefix(\"/gatekeeper\"))" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.entrypoints=websecure" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.tls.certresolver=le" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.tls=true" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.rule=(Host(`${TRAEFIK_HOST:-testing.klz-cables.com}`) && PathPrefix(`/gatekeeper`))" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" + - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.tls=${TRAEFIK_TLS:-false}" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-gatekeeper.service=${PROJECT_NAME:-klz-cables}-gatekeeper" - "traefik.http.services.${PROJECT_NAME:-klz-cables}-gatekeeper.loadbalancer.server.port=3000" - "traefik.docker.network=infra" - directus: - image: directus/directus:11 - restart: always - networks: - default: - infra: - aliases: - - ${PROJECT_NAME:-klz-cables}-directus + directus-cms: + image: registry.infra.mintel.me/mintel/directus:latest + restart: unless-stopped + command: [ "node", "cli.js", "start" ] env_file: - ${ENV_FILE:-.env} environment: @@ -102,37 +104,35 @@ services: ADMIN_EMAIL: ${DIRECTUS_ADMIN_EMAIL} ADMIN_PASSWORD: ${DIRECTUS_ADMIN_PASSWORD} DB_CLIENT: 'pg' - DB_HOST: 'directus-db' + DB_HOST: 'klz-db' DB_PORT: '5432' DB_DATABASE: ${DIRECTUS_DB_NAME:-directus} DB_USER: ${DIRECTUS_DB_USER:-directus} DB_PASSWORD: ${DIRECTUS_DB_PASSWORD:-directus} WEBSOCKETS_ENABLED: 'true' PUBLIC_URL: ${DIRECTUS_URL:-https://cms.klz-cables.com} - # Error Tracking - SENTRY_DSN: ${SENTRY_DSN} - SENTRY_ENVIRONMENT: ${TARGET:-development} - LOGGER_LEVEL: ${LOG_LEVEL:-info} + HOST: '0.0.0.0' + networks: + - infra volumes: - ./directus/uploads:/directus/uploads - ./directus/extensions:/directus/extensions - ./directus/schema:/directus/schema - ./directus/migrations:/directus/migrations + healthcheck: + disable: true labels: - "traefik.enable=true" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-directus.rule=Host(\"${DIRECTUS_HOST}\")" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-directus.entrypoints=websecure" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-directus.tls.certresolver=le" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-directus.tls=true" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-directus.middlewares=${PROJECT_NAME:-klz-cables}-forward,compress" - - "traefik.http.services.${PROJECT_NAME:-klz-cables}-directus.loadbalancer.server.port=8055" + - "traefik.http.routers.klz-production-cms.rule=Host(`cms.klz.localhost`)" + - "traefik.http.routers.klz-production-cms.entrypoints=web" + - "traefik.http.routers.klz-production-cms.priority=5000" + - "traefik.http.routers.klz-production-cms.tls=false" + - "traefik.http.routers.klz-production-cms.service=klz-production-cms-svc" + - "traefik.http.services.klz-production-cms-svc.loadbalancer.server.port=8055" - "traefik.docker.network=infra" - - directus-db: + klz-db: image: postgres:15-alpine - restart: always - networks: - - default + restart: unless-stopped env_file: - ${ENV_FILE:-.env} environment: @@ -141,6 +141,8 @@ services: POSTGRES_PASSWORD: ${DIRECTUS_DB_PASSWORD:-directus} volumes: - directus-db-data:/var/lib/postgresql/data + networks: + - infra networks: default: diff --git a/lib/config.ts b/lib/config.ts index 7d5bfd62..59b440d8 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -50,7 +50,7 @@ function createConfig() { }, logging: { - level: env.LOG_LEVEL, + level: env.LOG_LEVEL || 'info', }, mail: { diff --git a/messages/de.json b/messages/de.json index c9a8dd11..cfca5ce8 100644 --- a/messages/de.json +++ b/messages/de.json @@ -207,6 +207,7 @@ "description": "Entdecken Sie unser umfassendes Sortiment an zertifizierten Kabeln: von Niederspannung über Mittel- und Hochspannung bis hin zu spezialisierten Solarkabeln." }, "title": "Unsere Produkte", + "breadcrumb": "Produkte", "subtitle": "Entdecken Sie unser umfassendes Sortiment an hochwertigen Kabeln für jede Anwendung.", "heroSubtitle": "Produktportfolio", "categoryLabel": "Kategorie", @@ -393,4 +394,4 @@ "cta": "Zurück zur Sicherheit" } } -} +} \ No newline at end of file diff --git a/messages/en.json b/messages/en.json index c7b7764e..8076e18f 100644 --- a/messages/en.json +++ b/messages/en.json @@ -207,6 +207,7 @@ "description": "Explore our comprehensive range of certified cables: from low voltage to medium and high voltage, as well as specialized solar cables." }, "title": "Our Products", + "breadcrumb": "Products", "subtitle": "Explore our comprehensive range of high-quality cables designed for every application.", "heroSubtitle": "Product Portfolio", "categoryLabel": "Category", @@ -393,4 +394,4 @@ "cta": "Back to Safety" } } -} +} \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts index 9edff1c7..c4b7818f 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/types/routes.d.ts"; +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/package.json b/package.json index 53a557a2..141c4487 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "dependencies": { "@directus/sdk": "^21.0.0", "@medv/finder": "^4.0.2", - "@mintel/mail": "1.7.12", - "@mintel/next-config": "1.7.12", - "@mintel/next-feedback": "1.7.12", + "@mintel/mail": "1.8.3", + "@mintel/next-config": "1.8.3", + "@mintel/next-feedback": "1.8.10", "@mintel/next-utils": "^1.7.15", "@react-email/components": "^1.0.7", "@react-pdf/renderer": "^4.3.2", @@ -20,7 +20,6 @@ "import-in-the-middle": "^1.11.0", "jsdom": "^27.4.0", "leaflet": "^1.9.4", - "lucide-react": "^0.562.0", "next": "16.1.6", "next-i18next": "^15.4.3", "next-intl": "^4.8.2", @@ -46,8 +45,12 @@ "@commitlint/cli": "^20.4.0", "@commitlint/config-conventional": "^20.4.0", "@lhci/cli": "^0.15.1", - "@mintel/eslint-config": "1.7.12", - "@mintel/tsconfig": "1.7.12", + "@mintel/eslint-config": "1.8.3", + "@mintel/tsconfig": "1.8.3", + "@remotion/cli": "^4.0.421", + "@remotion/google-fonts": "^4.0.421", + "@remotion/player": "^4.0.421", + "@remotion/renderer": "^4.0.421", "@tailwindcss/cli": "^4.1.18", "@tailwindcss/postcss": "^4.1.18", "@types/geojson": "^7946.0.16", @@ -64,8 +67,10 @@ "happy-dom": "^20.6.1", "husky": "^9.1.7", "lint-staged": "^16.2.7", + "lucide-react": "^0.563.0", "postcss": "^8.5.6", "prettier": "^3.8.1", + "remotion": "^4.0.421", "sass": "^1.97.1", "tailwindcss": "^4.1.18", "tsx": "^4.21.0", @@ -73,7 +78,8 @@ "vitest": "^4.0.16" }, "scripts": { - "dev": "docker network create infra 2>/dev/null || true && echo '\\n🚀 Development Environment Starting...\\n\\n📱 App: http://klz.localhost\\n🗄️ CMS: http://cms.klz.localhost/admin\\n🚦 Traefik: http://localhost:8080\\n\\n(Press Ctrl+C to stop)\\n' && docker-compose down --remove-orphans && docker-compose up klz-app directus directus-db gatekeeper", + "dev": "docker network create infra 2>/dev/null || true && echo '\\n🚀 Development Environment Starting...\\n\\n📱 App (Next.js): http://localhost:3000\\n📱 App (Traefik): http://klz.localhost\\n🗄️ CMS: http://cms.klz.localhost/admin\\n🚦 Traefik: http://localhost:8080\\n\\n(Press Ctrl+C to stop)\\n' && docker-compose down --remove-orphans && docker-compose up --build klz-app directus-cms klz-db gatekeeper", + "dev:infra": "docker network create infra 2>/dev/null || true && docker-compose up -d directus-cms klz-db gatekeeper", "dev:local": "next dev", "build": "next build", "start": "next start", @@ -102,6 +108,8 @@ "cms:push:prod:DANGER": "./scripts/sync-directus.sh push production", "pagespeed:test": "tsx ./scripts/pagespeed-sitemap.ts", "pagespeed:urls": "tsx -e \"import sitemap from './app/sitemap'; sitemap().then(urls => console.log(urls.map(u => u.url).join('\\n')))\"", + "remotion:render": "remotion render WebsiteVideo remotion/index.ts out.mp4", + "remotion:preview": "remotion preview remotion/index.ts", "prepare": "husky", "preinstall": "npx only-allow pnpm" }, @@ -110,5 +118,13 @@ "overrides": { "next": "16.1.6" } + }, + "peerDependencies": { + "@remotion/cli": "^4.0.421", + "@remotion/google-fonts": "^4.0.421", + "@remotion/player": "^4.0.421", + "@remotion/renderer": "^4.0.421", + "lucide-react": "^0.563.0", + "remotion": "^4.0.421" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08ef5874..c9e42b06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,14 +18,14 @@ importers: specifier: ^4.0.2 version: 4.0.2 '@mintel/mail': - specifier: 1.7.12 - version: 1.7.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 1.8.3 + version: 1.8.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@mintel/next-config': - specifier: 1.7.12 - version: 1.7.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3)(typescript@5.9.3)(webpack@5.105.0) + specifier: 1.8.3 + version: 1.8.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3)(typescript@5.9.3)(webpack@5.105.0) '@mintel/next-feedback': - specifier: 1.7.12 - version: 1.7.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + specifier: 1.8.10 + version: 1.8.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) '@mintel/next-utils': specifier: ^1.7.15 version: 1.7.15(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@swc/helpers@0.5.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3)(typescript@5.9.3) @@ -62,9 +62,6 @@ importers: leaflet: specifier: ^1.9.4 version: 1.9.4 - lucide-react: - specifier: ^0.562.0 - version: 0.562.0(react@19.2.4) next: specifier: 16.1.6 version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) @@ -136,11 +133,23 @@ importers: specifier: ^0.15.1 version: 0.15.1 '@mintel/eslint-config': - specifier: 1.7.12 - version: 1.7.12(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 1.8.3 + version: 1.8.3(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@mintel/tsconfig': - specifier: 1.7.12 - version: 1.7.12 + specifier: 1.8.3 + version: 1.8.3 + '@remotion/cli': + specifier: ^4.0.421 + version: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/google-fonts': + specifier: ^4.0.421 + version: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/player': + specifier: ^4.0.421 + version: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': + specifier: ^4.0.421 + version: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tailwindcss/cli': specifier: ^4.1.18 version: 4.1.18 @@ -189,12 +198,18 @@ importers: lint-staged: specifier: ^16.2.7 version: 16.2.7 + lucide-react: + specifier: ^0.563.0 + version: 0.563.0(react@19.2.4) postcss: specifier: ^8.5.6 version: 8.5.6 prettier: specifier: ^3.8.1 version: 3.8.1 + remotion: + specifier: ^4.0.421 + version: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) sass: specifier: ^1.97.1 version: 1.97.3 @@ -289,6 +304,11 @@ packages: resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.24.1': + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} @@ -435,6 +455,12 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -447,6 +473,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -459,6 +491,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} @@ -471,6 +509,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -483,6 +527,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -495,6 +545,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -507,6 +563,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -519,6 +581,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -531,6 +599,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -543,6 +617,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -555,6 +635,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -567,6 +653,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} @@ -579,6 +671,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -591,6 +689,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -603,6 +707,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -615,6 +725,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -627,6 +743,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -639,6 +761,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} @@ -651,6 +779,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -663,6 +797,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} @@ -675,6 +815,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -699,6 +845,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -711,6 +863,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -723,6 +881,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -735,6 +899,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -1034,20 +1204,20 @@ packages: '@medv/finder@4.0.2': resolution: {integrity: sha512-RraNY9SCcx4KZV0Dh6BEW6XEW2swkqYca74pkFFRw6hHItSHiy+O/xMnpbofjYbzXj0tSpBGthUF1hHTsr3vIQ==} - '@mintel/eslint-config@1.7.12': - resolution: {integrity: sha512-ofX68JWCW8ztD9tt/1MDb6pSr9MJKq3js3Vny7VoT/bObjpR/iO9tJp0ekiq12Ps8VTEgDh1qwwmf2wrJJBRpQ==} + '@mintel/eslint-config@1.8.3': + resolution: {integrity: sha512-Alr0ofai74qhnrhZy2mpNSR4gcqD4DTQLHcHX3pZPpsqu1QfNjhHofU7dyHDx5/SpXoMXsI4hSaLpytKEMNHLg==} - '@mintel/mail@1.7.12': - resolution: {integrity: sha512-2MqGSDhXQ6jaswUs/s74pz2LwmOhtOTWltGgwb8JF2JdfQt8FE5H4XZsvSV12Q1Fs1n5+V09OZTWU1TyFmh6lw==} + '@mintel/mail@1.8.3': + resolution: {integrity: sha512-y6MD0Rkn66D6gbMH1/6HNpneCJHUkDxtW7mYnq/ftRZf27ZDuhYqJaQVfXTCXS80oaWTzygc33Lpqz4UpdavQw==} peerDependencies: react: ^19.0.0 react-dom: ^19.0.0 - '@mintel/next-config@1.7.12': - resolution: {integrity: sha512-GBFIgF2vRzPl03B2RwaEyBpwjXgDRHUtaal4QQ2n7TW4G1lNIKLTBLdsJtmxMn8VlUbzRVMaFNm7m6joSNiJ0w==} + '@mintel/next-config@1.8.3': + resolution: {integrity: sha512-2t0ql4FCOqzLc4ImE3D39us5YHeKq9ZHjmWyiz9cwtJm89zGSvB/mzCja2ydrYtTEfLwxpiVKzXrVuSKLjFlow==} - '@mintel/next-feedback@1.7.12': - resolution: {integrity: sha512-nlaeV+IRmqwzaAZFTmj8+RvyMsvh+SNs0BopWgbDdAt2x1yoz4fC6cpn+v7KjfnVW0YWPZhMeGD/uEgMhVrXRA==} + '@mintel/next-feedback@1.8.10': + resolution: {integrity: sha512-GgCkcgvAibOXli0bfx2/PLJgzPC0sTM67Wddef2eDCiV2Lgy4hZjX9P+PSKP5dwPGooyk29muOtm0HKJlkAXqg==} peerDependencies: react: ^19.0.0 react-dom: ^19.0.0 @@ -1055,8 +1225,8 @@ packages: '@mintel/next-utils@1.7.15': resolution: {integrity: sha512-CqSe3eHamq9zLs+AJxGOPypTLchw/oZ3JcLkor007PcUDMTv/Lspfv5oCaXK2s0FeIOJaa2QwSGPDI1h5/3ZVw==} - '@mintel/tsconfig@1.7.12': - resolution: {integrity: sha512-WGs/p2E1xQGkzNasLCZKoplKIhxC17NZRhBYH5O43lp98aHOZMC3BKgNeLYUfoEFGiIN1hx2FUJ69DosQc0xmw==} + '@mintel/tsconfig@1.8.3': + resolution: {integrity: sha512-IOtxrTZfPZs4XU4Q068dSUtETFb2drf43mgmaF31j+PtltfPkC7pdJcEjXDg365bZ5EUrgTlt9pYlgGmfrCEVQ==} '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1780,6 +1950,110 @@ packages: '@react-pdf/types@2.9.2': resolution: {integrity: sha512-dufvpKId9OajLLbgn9q7VLUmyo1Jf+iyGk2ZHmCL8nIDtL8N1Ejh9TH7+pXXrR0tdie1nmnEb5Bz9U7g4hI4/g==} + '@remotion/bundler@4.0.421': + resolution: {integrity: sha512-3udLfwmgJeO6r0bZZ+mkSFYJ7qTWp93lQvo5W2H091uXbGl00r7DI4pfnMQQhLAubwPq+XTWd0jgp5JMhLe2cQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/cli@4.0.421': + resolution: {integrity: sha512-h2yA12Bd9NIfZpxxF5eAdhH8o9S/MZION2aXiYI3TwYmaCnjBqeorJMKFe0qWGJkTAvKAg602HEuqY3eQD19pw==} + hasBin: true + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/compositor-darwin-arm64@4.0.421': + resolution: {integrity: sha512-wtvMo81SIHhtE7RdpbAGOAYtJWgrap2jowbKsBVoAvnuLp4uBYLEkPho8nkjoG9XTTlblD02r8kyBhpUnrAwFQ==} + cpu: [arm64] + os: [darwin] + + '@remotion/compositor-darwin-x64@4.0.421': + resolution: {integrity: sha512-hmLglQL7l3CQoX0ZmIzg0ojxRQInQL810pnB/AGXcTUTVRkxeRhUc/NXTj8TEqgZgSD1ObYgGlA27ysBSl9+ig==} + cpu: [x64] + os: [darwin] + + '@remotion/compositor-linux-arm64-gnu@4.0.421': + resolution: {integrity: sha512-7FNViAhIBVn46LXdy0kahi2BVTBqXQ5B5+pKZftDY7u8oRlyVQvAn4AcbmhU5ZZ6/Dp3+Qp6NocK16bzcPGJiA==} + cpu: [arm64] + os: [linux] + + '@remotion/compositor-linux-arm64-musl@4.0.421': + resolution: {integrity: sha512-ofPJDXEiCh1l0jUEI2dBhICxjCrN2rJuiOMuhrYd9IlGc2wA1zu7I3/06uvatV5k3aakT6MHkKh+wVys4fagBQ==} + cpu: [arm64] + os: [linux] + + '@remotion/compositor-linux-x64-gnu@4.0.421': + resolution: {integrity: sha512-TtqtDMPYM3IhnU0/YgOhvEtV5VHT8FZnbrR8ZaoT8QEvaRhGhr+QesmEA7KtTTbBpqUBeYmV5AhAX9Q0rx+43A==} + cpu: [x64] + os: [linux] + + '@remotion/compositor-linux-x64-musl@4.0.421': + resolution: {integrity: sha512-ilOCMkaBAUbRE6HN4iFfsMWcXVHai8IPQocUyMfDseBV5OjIaBhqybriF6AkmzWF4Fx6ylokzl4WXX6fAwdgQg==} + cpu: [x64] + os: [linux] + + '@remotion/compositor-win32-x64-msvc@4.0.421': + resolution: {integrity: sha512-L4yygd3YWXbo2JakG5Gru4fR4IDAC6+5BAvo4tZm7gOwMUEO38fn0h+pgWMqCi1zpC1yEfdv9LpClHowcN4lYw==} + cpu: [x64] + os: [win32] + + '@remotion/google-fonts@4.0.421': + resolution: {integrity: sha512-PRJJKq2nZ6MOXibUWNCnXzEySFovvg5GdCNyxaRZYDnSUX5otT2w53A4/Fu7h7vXWVceew2OhZD8pOv/md+87A==} + + '@remotion/licensing@4.0.421': + resolution: {integrity: sha512-kSbssnwkTXDxtY/PXzu9Q6mFt9jmgNN6wygZxxH6gy01lzua1ucivSZOSrrdRRbtF0kk3BZ4EqOqW5D5ovyHXA==} + + '@remotion/media-parser@4.0.421': + resolution: {integrity: sha512-Pv/63mN4gnG5hP2+7ldWy67u2FoIOmN3lijEzk3w/e4b5dvJp+kWcXGbUszePbDxFF0NnJrP4clj6iLLB0M9bw==} + + '@remotion/media-utils@4.0.421': + resolution: {integrity: sha512-kL0uR8bnSW27Lg3SozKO+LP1kiFLpM40GKeAWftrzvJXbAUc5XZTEvldRbtw0YUXJvD5SsJvYH8FU0HB27N28A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/player@4.0.421': + resolution: {integrity: sha512-vZrvvl3OMmxsmIk+vqUOrcbLpNUL0Q1JIWdqcgNt0d3Jn0mK6fYCDBnAHuhiltuMSqHBguUaQL4eWbceDBsm2g==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/renderer@4.0.421': + resolution: {integrity: sha512-QYfnSq69HOHI9n3Z2lLyNK8liha2d0je6h5UnFO4Wi7WSQi5ZSey0aCkL6Mva6x5ckX/eAm8dptKUpnJWLY5uw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/streaming@4.0.421': + resolution: {integrity: sha512-H5+VyDt1aKdUXkZVaggIEuXgD1kN21H1O5tLSP52Qt4/IOaGcCoVFaNKbeBZuUyM9OWeO2xHAYX/CHz8OlQt3Q==} + + '@remotion/studio-server@4.0.421': + resolution: {integrity: sha512-QiRfrK15dUL8BVDTaglU6ZWUDL4FTpH6cgM5vAji2IBNTmH9OqzyHMpTKq53DX63Z1rL3oIYKk5Sz/qHt9Cofw==} + + '@remotion/studio-shared@4.0.421': + resolution: {integrity: sha512-T2eXFHVG118LSA1QwR/g4LFHrd+VYDmFmoXWWUZKbXJwNYYtVyUBSajfgJfvprDlxVbYnGB95V0ayYVGe5deMg==} + + '@remotion/studio@4.0.421': + resolution: {integrity: sha512-aqt841T1b5PoIPuokoKvRjYCp0uG3PAcQgO8x8JOoI0OgnBU7HpTjq5Np6fIdMNOpnqMA1VrOXGWQqRHFFMkwA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/web-renderer@4.0.421': + resolution: {integrity: sha512-VY+v/9gfz4cQB0Bt/NbtlpkGuCbxoqrN/Y/1BXNyvE+cMUn4TpNy/byWKGn2qytPb2jlweDAwLUb9l9otzFzKg==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@remotion/webcodecs@4.0.421': + resolution: {integrity: sha512-Rto6i4ZRK4PTQcCaU0JeyL58iCVoNuwTgWxTK9vdUaE5sOX5SB6jsEO4LmQkg428oA11lbZG48A/MLvErNb7DQ==} + + '@remotion/zod-types@4.0.421': + resolution: {integrity: sha512-PBU1+OLZjUNF88XFwKKbfi7+uLKIxN9MSpxjpJHokOumOdDUnpqJv2zs/TwSBkIPFKFd40Crk+FFZk4VT0fw3A==} + peerDependencies: + zod: 3.22.3 + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -2303,6 +2577,12 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/dom-mediacapture-transform@0.1.11': + resolution: {integrity: sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==} + + '@types/dom-webcodecs@0.1.13': + resolution: {integrity: sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -2696,6 +2976,11 @@ packages: ajv: optional: true + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: @@ -2810,6 +3095,10 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -2928,6 +3217,9 @@ packages: bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -3259,10 +3551,21 @@ packages: css-line-break@2.1.0: resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + css-loader@5.2.7: + resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.27.0 || ^5.0.0 + css-tree@3.1.0: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + cssstyle@5.3.7: resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} engines: {node: '>=20'} @@ -3427,6 +3730,10 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dotenv@9.0.2: + resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} + engines: {node: '>=10'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -3457,6 +3764,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -3547,6 +3858,11 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -3744,6 +4060,10 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -3918,6 +4238,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-monkey@1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3964,6 +4287,10 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -4133,6 +4460,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -4156,6 +4487,12 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + icu-minify@4.8.2: resolution: {integrity: sha512-LHBQV+skKkjZSPd590pZ7ZAHftUgda3eFjeuNwA8/15L8T8loCNBktKQyTlkodAU86KovFXeg/9WntlAo5wA5A==} @@ -4372,6 +4709,10 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -4666,6 +5007,10 @@ packages: resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} @@ -4695,6 +5040,9 @@ packages: lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -4736,6 +5084,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -4745,8 +5097,8 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc - lucide-react@0.562.0: - resolution: {integrity: sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==} + lucide-react@0.563.0: + resolution: {integrity: sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4824,6 +5176,13 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + mediabunny@1.29.0: + resolution: {integrity: sha512-18B8w/rhO/ph/AFsIXvzZg8RaSQZ+ZYfJ99MZlTjDmlgCT58jV3azrnWQ/OSquYDi8q0xmn64mnfTEHgww3+zw==} + + memfs@3.4.3: + resolution: {integrity: sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==} + engines: {node: '>= 4.0.0'} + meow@12.1.1: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} @@ -4962,6 +5321,10 @@ packages: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -4981,6 +5344,9 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -5143,6 +5509,10 @@ packages: normalize-svg-path@1.1.0: resolution: {integrity: sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + nypm@0.6.2: resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} engines: {node: ^14.16.0 || >=16.10.0} @@ -5202,6 +5572,10 @@ packages: resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} engines: {node: '>=4'} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -5389,6 +5763,34 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -5547,6 +5949,10 @@ packages: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} + react-refresh@0.9.0: + resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} + engines: {node: '>=0.10.0'} + react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -5563,6 +5969,10 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -5597,6 +6007,12 @@ packages: remark-rehype@11.1.2: resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + remotion@4.0.421: + resolution: {integrity: sha512-j64KtcwObNYpxskxBPd7zDXVOwSHxH31RIM6Vs/+rUj/NBry/LXc8cNWDwFC4fYaJweOAeM7zXY16kW/9t3X+w==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5724,6 +6140,10 @@ packages: schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + schema-utils@4.3.3: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} @@ -5746,6 +6166,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -5869,10 +6294,19 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -5996,6 +6430,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -6010,6 +6448,12 @@ packages: stubborn-utils@1.0.2: resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + style-loader@4.0.0: + resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.27.0 + style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -6120,6 +6564,9 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -6175,6 +6622,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -6470,6 +6920,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -6513,6 +6966,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + when-exit@2.1.5: resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} @@ -6591,6 +7047,18 @@ packages: utf-8-validate: optional: true + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -6645,6 +7113,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.8.2: resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} engines: {node: '>= 14.6'} @@ -6689,6 +7160,9 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 + zod@3.22.3: + resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -6804,6 +7278,10 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 + '@babel/parser@7.24.1': + dependencies: + '@babel/types': 7.29.0 + '@babel/parser@7.29.0': dependencies: '@babel/types': 7.29.0 @@ -6992,126 +7470,189 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.25.0': + optional: true + '@esbuild/aix-ppc64@0.25.12': optional: true '@esbuild/aix-ppc64@0.27.3': optional: true + '@esbuild/android-arm64@0.25.0': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true '@esbuild/android-arm64@0.27.3': optional: true + '@esbuild/android-arm@0.25.0': + optional: true + '@esbuild/android-arm@0.25.12': optional: true '@esbuild/android-arm@0.27.3': optional: true + '@esbuild/android-x64@0.25.0': + optional: true + '@esbuild/android-x64@0.25.12': optional: true '@esbuild/android-x64@0.27.3': optional: true + '@esbuild/darwin-arm64@0.25.0': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true '@esbuild/darwin-arm64@0.27.3': optional: true + '@esbuild/darwin-x64@0.25.0': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true '@esbuild/darwin-x64@0.27.3': optional: true + '@esbuild/freebsd-arm64@0.25.0': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true '@esbuild/freebsd-arm64@0.27.3': optional: true + '@esbuild/freebsd-x64@0.25.0': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true '@esbuild/freebsd-x64@0.27.3': optional: true + '@esbuild/linux-arm64@0.25.0': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true '@esbuild/linux-arm64@0.27.3': optional: true + '@esbuild/linux-arm@0.25.0': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true '@esbuild/linux-arm@0.27.3': optional: true + '@esbuild/linux-ia32@0.25.0': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true '@esbuild/linux-ia32@0.27.3': optional: true + '@esbuild/linux-loong64@0.25.0': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true '@esbuild/linux-loong64@0.27.3': optional: true + '@esbuild/linux-mips64el@0.25.0': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-mips64el@0.27.3': optional: true + '@esbuild/linux-ppc64@0.25.0': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true '@esbuild/linux-ppc64@0.27.3': optional: true + '@esbuild/linux-riscv64@0.25.0': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true '@esbuild/linux-riscv64@0.27.3': optional: true + '@esbuild/linux-s390x@0.25.0': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true '@esbuild/linux-s390x@0.27.3': optional: true + '@esbuild/linux-x64@0.25.0': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true '@esbuild/linux-x64@0.27.3': optional: true + '@esbuild/netbsd-arm64@0.25.0': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true '@esbuild/netbsd-arm64@0.27.3': optional: true + '@esbuild/netbsd-x64@0.25.0': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true '@esbuild/netbsd-x64@0.27.3': optional: true + '@esbuild/openbsd-arm64@0.25.0': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true '@esbuild/openbsd-arm64@0.27.3': optional: true + '@esbuild/openbsd-x64@0.25.0': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true @@ -7124,24 +7665,36 @@ snapshots: '@esbuild/openharmony-arm64@0.27.3': optional: true + '@esbuild/sunos-x64@0.25.0': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true '@esbuild/sunos-x64@0.27.3': optional: true + '@esbuild/win32-arm64@0.25.0': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true '@esbuild/win32-arm64@0.27.3': optional: true + '@esbuild/win32-ia32@0.25.0': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true '@esbuild/win32-ia32@0.27.3': optional: true + '@esbuild/win32-x64@0.25.0': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true @@ -7481,7 +8034,7 @@ snapshots: '@medv/finder@4.0.2': {} - '@mintel/eslint-config@1.7.12(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@mintel/eslint-config@1.8.3(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint/eslintrc': 3.3.3 '@eslint/js': 9.39.2 @@ -7498,13 +8051,13 @@ snapshots: - supports-color - typescript - '@mintel/mail@1.7.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@mintel/mail@1.8.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@react-email/components': 0.0.33(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@mintel/next-config@1.7.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3)(typescript@5.9.3)(webpack@5.105.0)': + '@mintel/next-config@1.8.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3)(typescript@5.9.3)(webpack@5.105.0)': dependencies: '@sentry/nextjs': 10.38.0(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.0) next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) @@ -7527,9 +8080,10 @@ snapshots: - typescript - webpack - '@mintel/next-feedback@1.7.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3)': + '@mintel/next-feedback@1.8.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3)': dependencies: '@directus/sdk': 21.1.0 + '@medv/finder': 4.0.2 clsx: 2.1.1 framer-motion: 11.18.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) html2canvas: 1.4.1 @@ -7565,7 +8119,7 @@ snapshots: - sass - typescript - '@mintel/tsconfig@1.7.12': {} + '@mintel/tsconfig@1.8.3': {} '@napi-rs/wasm-runtime@0.2.12': dependencies: @@ -8323,6 +8877,195 @@ snapshots: '@react-pdf/primitives': 4.1.1 '@react-pdf/stylesheet': 6.1.2 + '@remotion/bundler@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/media-parser': 4.0.421 + '@remotion/studio': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + css-loader: 5.2.7(webpack@5.105.0) + esbuild: 0.25.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-refresh: 0.9.0 + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + source-map: 0.7.3 + style-loader: 4.0.0(webpack@5.105.0) + webpack: 5.105.0(esbuild@0.25.0) + transitivePeerDependencies: + - '@swc/core' + - bufferutil + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + + '@remotion/cli@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/bundler': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/media-utils': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/player': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-server': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + dotenv: 9.0.2 + minimist: 1.2.6 + prompts: 2.4.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - '@swc/core' + - bufferutil + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + + '@remotion/compositor-darwin-arm64@4.0.421': + optional: true + + '@remotion/compositor-darwin-x64@4.0.421': + optional: true + + '@remotion/compositor-linux-arm64-gnu@4.0.421': + optional: true + + '@remotion/compositor-linux-arm64-musl@4.0.421': + optional: true + + '@remotion/compositor-linux-x64-gnu@4.0.421': + optional: true + + '@remotion/compositor-linux-x64-musl@4.0.421': + optional: true + + '@remotion/compositor-win32-x64-msvc@4.0.421': + optional: true + + '@remotion/google-fonts@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - react + - react-dom + + '@remotion/licensing@4.0.421': {} + + '@remotion/media-parser@4.0.421': {} + + '@remotion/media-utils@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/media-parser': 4.0.421 + '@remotion/webcodecs': 4.0.421 + mediabunny: 1.29.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + '@remotion/player@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + '@remotion/renderer@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/licensing': 4.0.421 + '@remotion/streaming': 4.0.421 + execa: 5.1.1 + extract-zip: 2.0.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + source-map: 0.8.0-beta.0 + ws: 8.17.1 + optionalDependencies: + '@remotion/compositor-darwin-arm64': 4.0.421 + '@remotion/compositor-darwin-x64': 4.0.421 + '@remotion/compositor-linux-arm64-gnu': 4.0.421 + '@remotion/compositor-linux-arm64-musl': 4.0.421 + '@remotion/compositor-linux-x64-gnu': 4.0.421 + '@remotion/compositor-linux-x64-musl': 4.0.421 + '@remotion/compositor-win32-x64-msvc': 4.0.421 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@remotion/streaming@4.0.421': {} + + '@remotion/studio-server@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/parser': 7.24.1 + '@remotion/bundler': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + memfs: 3.4.3 + open: 8.4.2 + recast: 0.23.11 + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + semver: 7.5.3 + source-map: 0.7.3 + transitivePeerDependencies: + - '@swc/core' + - bufferutil + - react + - react-dom + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + + '@remotion/studio-shared@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - react + - react-dom + + '@remotion/studio@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/media-utils': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/player': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/web-renderer': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/zod-types': 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.22.3) + mediabunny: 1.29.0 + memfs: 3.4.3 + open: 8.4.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + semver: 7.5.3 + source-map: 0.7.3 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@remotion/web-renderer@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@remotion/licensing': 4.0.421 + mediabunny: 1.29.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + '@remotion/webcodecs@4.0.421': + dependencies: + '@remotion/media-parser': 4.0.421 + + '@remotion/zod-types@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.22.3)': + dependencies: + remotion: 4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + zod: 3.22.3 + transitivePeerDependencies: + - react + - react-dom + '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/plugin-commonjs@28.0.1(rollup@4.57.1)': @@ -8656,7 +9399,7 @@ snapshots: '@sentry/bundler-plugin-core': 4.9.0 unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.105.0 + webpack: 5.105.0(esbuild@0.25.0) transitivePeerDependencies: - encoding - supports-color @@ -8852,6 +9595,12 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/dom-mediacapture-transform@0.1.11': + dependencies: + '@types/dom-webcodecs': 0.1.13 + + '@types/dom-webcodecs@0.1.13': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -9283,6 +10032,10 @@ snapshots: optionalDependencies: ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + ajv-keywords@5.1.0(ajv@8.17.1): dependencies: ajv: 8.17.1 @@ -9420,6 +10173,10 @@ snapshots: dependencies: tslib: 2.8.1 + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + astring@1.9.0: {} async-function@1.0.0: {} @@ -9517,6 +10274,8 @@ snapshots: dependencies: require-from-string: 2.0.2 + big.js@5.2.2: {} + binary-extensions@2.3.0: {} body-parser@1.20.4: @@ -9870,11 +10629,27 @@ snapshots: dependencies: utrie: 1.0.2 + css-loader@5.2.7(webpack@5.105.0): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + loader-utils: 2.0.4 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + postcss-value-parser: 4.2.0 + schema-utils: 3.3.0 + semver: 7.7.4 + webpack: 5.105.0(esbuild@0.25.0) + css-tree@3.1.0: dependencies: mdn-data: 2.12.2 source-map-js: 1.2.1 + cssesc@3.0.0: {} + cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.2 @@ -10017,6 +10792,8 @@ snapshots: dotenv@16.6.1: {} + dotenv@9.0.2: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10044,6 +10821,8 @@ snapshots: emoji-regex@9.2.2: {} + emojis-list@3.0.0: {} + encodeurl@2.0.0: {} end-of-stream@1.4.5: @@ -10211,6 +10990,34 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -10544,6 +11351,18 @@ snapshots: events@3.3.0: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + expect-type@1.3.0: {} express@4.22.1: @@ -10744,6 +11563,8 @@ snapshots: fresh@0.5.2: {} + fs-monkey@1.0.3: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -10792,6 +11613,8 @@ snapshots: dependencies: pump: 3.0.3 + get-stream@6.0.1: {} + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -11037,6 +11860,8 @@ snapshots: transitivePeerDependencies: - supports-color + human-signals@2.1.0: {} + husky@9.1.7: {} hyphen@1.14.1: {} @@ -11053,6 +11878,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + icu-minify@4.8.2: dependencies: '@formatjs/icu-messageformat-parser': 3.5.1 @@ -11272,6 +12101,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-stream@2.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -11598,6 +12429,12 @@ snapshots: loader-runner@4.3.1: {} + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + localforage@1.10.0: dependencies: lie: 3.1.1 @@ -11622,6 +12459,8 @@ snapshots: lodash.snakecase@4.1.1: {} + lodash.sortby@4.7.0: {} + lodash.startcase@4.4.0: {} lodash.upperfirst@4.3.1: {} @@ -11662,13 +12501,17 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru-cache@7.18.3: {} lucide-react@0.441.0(react@19.2.4): dependencies: react: 19.2.4 - lucide-react@0.562.0(react@19.2.4): + lucide-react@0.563.0(react@19.2.4): dependencies: react: 19.2.4 @@ -11804,6 +12647,15 @@ snapshots: media-typer@0.3.0: {} + mediabunny@1.29.0: + dependencies: + '@types/dom-mediacapture-transform': 0.1.11 + '@types/dom-webcodecs': 0.1.13 + + memfs@3.4.3: + dependencies: + fs-monkey: 1.0.3 + meow@12.1.1: {} meow@13.2.0: {} @@ -12045,6 +12897,8 @@ snapshots: mimic-fn@1.2.0: {} + mimic-fn@2.1.0: {} + mimic-function@5.0.1: {} minimatch@10.1.2: @@ -12063,6 +12917,8 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimist@1.2.6: {} + minimist@1.2.8: {} minipass@7.1.2: {} @@ -12207,6 +13063,10 @@ snapshots: dependencies: svg-arc-to-cubic-bezier: 3.2.0 + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + nypm@0.6.2: dependencies: citty: 0.1.6 @@ -12275,6 +13135,10 @@ snapshots: dependencies: mimic-fn: 1.2.0 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -12506,6 +13370,32 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.4.31: @@ -12683,6 +13573,8 @@ snapshots: react-refresh@0.18.0: {} + react-refresh@0.9.0: {} + react@19.2.4: {} readdirp@3.6.0: @@ -12693,6 +13585,14 @@ snapshots: real-require@0.2.0: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.8 @@ -12774,6 +13674,11 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 + remotion@4.0.421(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -12922,6 +13827,12 @@ snapshots: schema-dts@1.1.5: {} + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 @@ -12944,6 +13855,10 @@ snapshots: semver@6.3.1: {} + semver@7.5.3: + dependencies: + lru-cache: 6.0.0 + semver@7.7.4: {} send@0.19.2: @@ -13149,8 +14064,14 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.3: {} + source-map@0.7.6: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + space-separated-tokens@2.0.2: {} speedline-core@1.4.3: @@ -13304,6 +14225,8 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} + strip-json-comments@3.1.1: {} strip-json-comments@5.0.3: {} @@ -13314,6 +14237,10 @@ snapshots: stubborn-utils@1.0.2: {} + style-loader@4.0.0(webpack@5.105.0): + dependencies: + webpack: 5.105.0(esbuild@0.25.0) + style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -13382,14 +14309,16 @@ snapshots: - bare-abort-controller - react-native-b4a - terser-webpack-plugin@5.3.16(webpack@5.105.0): + terser-webpack-plugin@5.3.16(esbuild@0.25.0)(webpack@5.105.0): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.0 + webpack: 5.105.0(esbuild@0.25.0) + optionalDependencies: + esbuild: 0.25.0 terser@5.46.0: dependencies: @@ -13420,6 +14349,8 @@ snapshots: tiny-inflate@1.0.3: {} + tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinyexec@1.0.2: {} @@ -13465,6 +14396,10 @@ snapshots: tr46@0.0.3: {} + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -13811,13 +14746,15 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + webidl-conversions@8.0.1: {} webpack-sources@3.3.3: {} webpack-virtual-modules@0.5.0: {} - webpack@5.105.0: + webpack@5.105.0(esbuild@0.25.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -13841,7 +14778,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(esbuild@0.25.0)(webpack@5.105.0) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -13867,6 +14804,12 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + when-exit@2.1.5: {} which-boxed-primitive@1.1.1: @@ -13962,6 +14905,8 @@ snapshots: ws@7.5.10: {} + ws@8.17.1: {} + ws@8.18.3: {} ws@8.19.0: {} @@ -13990,6 +14935,8 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + yaml@2.8.2: {} yargs-parser@13.1.2: @@ -14043,6 +14990,8 @@ snapshots: dependencies: zod: 3.25.76 + zod@3.22.3: {} + zod@3.25.76: {} zwitch@2.0.4: {} diff --git a/remotion/Root.tsx b/remotion/Root.tsx new file mode 100644 index 00000000..4bdec62a --- /dev/null +++ b/remotion/Root.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { Composition } from 'remotion'; +import { WebsiteVideo } from './WebsiteVideo'; +import sessionData from './session.json'; +import { RecordingSession } from '../types/record-mode'; + +const FPS = 60; + +export const RemotionRoot: React.FC = () => { + // Calculate duration based on last event + padding + const durationMs = (sessionData as unknown as RecordingSession).events.reduce((max, e) => { + return Math.max(max, e.timestamp + (e.duration || 1000)); + }, 0); + const durationInFrames = Math.ceil((durationMs + 2000) / 1000 * FPS); + + return ( + <> + + + ); +}; diff --git a/remotion/WebsiteVideo.tsx b/remotion/WebsiteVideo.tsx new file mode 100644 index 00000000..95e9f146 --- /dev/null +++ b/remotion/WebsiteVideo.tsx @@ -0,0 +1,107 @@ +import React, { useMemo } from 'react'; +import { AbsoluteFill, useVideoConfig, useCurrentFrame, interpolate, spring, Easing } from 'remotion'; +import { RecordingSession, RecordEvent } from '../types/record-mode'; + +export const WebsiteVideo: React.FC<{ + session: RecordingSession | null; + siteUrl: string; +}> = ({ session, siteUrl }) => { + const { fps, width, height, durationInFrames } = useVideoConfig(); + const frame = useCurrentFrame(); + + if (!session || !session.events.length) { + return ( + + No session data found. + + ); + } + + const sortedEvents = useMemo(() => { + return [...session.events].sort((a, b) => a.timestamp - b.timestamp); + }, [session]); + + const elapsedTimeMs = (frame / fps) * 1000; + + // --- Interpolation Logic --- + + // 1. Find the current window (between which two events are we?) + const nextEventIndex = sortedEvents.findIndex(e => e.timestamp > elapsedTimeMs); + let currentEventIndex; + + if (nextEventIndex === -1) { + // We are past the last event, stay at the end + currentEventIndex = sortedEvents.length - 1; + } else { + currentEventIndex = Math.max(0, nextEventIndex - 1); + } + + const currentEvent = sortedEvents[currentEventIndex]; + // If there is no next event, we just stay at current (next=current) + const nextEvent = (nextEventIndex !== -1) ? sortedEvents[nextEventIndex] : currentEvent; + + // 2. Calculate Progress between events + const gap = nextEvent.timestamp - currentEvent.timestamp; + const progress = gap > 0 ? (elapsedTimeMs - currentEvent.timestamp) / gap : 1; + const easedProgress = Easing.cubic(Math.min(Math.max(progress, 0), 1)); + + // 3. Calculate Cursor Position from Rects + const getCenter = (event: RecordEvent) => { + if (event.rect) { + return { + x: event.rect.x + event.rect.width / 2, + y: event.rect.y + event.rect.height / 2 + }; + } + return { x: width / 2, y: height / 2 }; + }; + + const p1 = getCenter(currentEvent); + const p2 = getCenter(nextEvent); + + const cursorX = interpolate(easedProgress, [0, 1], [p1.x, p2.x]); + const cursorY = interpolate(easedProgress, [0, 1], [p1.y, p2.y]); + + // 4. Zoom & Blur + const zoom = interpolate(easedProgress, [0, 1], [currentEvent.zoom || 1, nextEvent.zoom || 1]); + const isBlurry = currentEvent.motionBlur || nextEvent.motionBlur; + + return ( + +
+