diff --git a/.githooks/pre-push b/.githooks/pre-push new file mode 100755 index 0000000..0ef9ed1 --- /dev/null +++ b/.githooks/pre-push @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Pre-push gate (tracked). Enable once per clone: git config core.hooksPath .githooks (or: bun run hooks:install) +# 1. bun run check: xgen check, every group, the rules group included (fast, no build of the hosts) +# 2. packages/tooling/bin/audit.sh: no private/, shots/, .fig, design-kit assets, secrets or server addresses in the pushed commits +# The full gate is bun run check:all; run it before a release. +set -euo pipefail +cd "$(git rev-parse --show-toplevel)" +bun run check +bash packages/tooling/bin/audit.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b938632..75884ff 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,22 +1,39 @@ +# CI: bun run verify (xgen check + typecheck of the generation layer + tests) with every runtime toolchain present +# (Go for templ, PHP 8.4 + composer for Twig and Latte, Python 3.13 for Jinja2). +# UI8KIT_REQUIRE_ALL_RUNTIMES=1 turns a skipped runtime group into a failure, so the template runtimes always run here. name: CI on: push: branches: [main] pull_request: + workflow_dispatch: jobs: verify: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + timeout-minutes: 30 + env: + UI8KIT_REQUIRE_ALL_RUNTIMES: "1" steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.4.2 - uses: actions/setup-go@v5 with: - go-version: "1.25" + go-version-file: packages/templ/ui/go.mod + cache: false - uses: shivammathur/setup-php@v2 with: - php-version: "8.3" - tools: composer + php-version: "8.4" + extensions: mbstring + tools: composer:v2 + coverage: none + - uses: actions/setup-python@v5 + with: + python-version: "3.13" + - name: toolchains + run: bun --version && go version && php --version && composer --version && python3 --version - run: bun install --frozen-lockfile - run: bun run verify diff --git a/.gitignore b/.gitignore index 5f97951..69fd30e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,23 @@ -node_modules/ -examples/node_modules/ +logs *.log +node_modules +dist +dist-ssr +*.local .DS_Store -.dist/ -.manual/ \ No newline at end of file +.idea +.vscode/* +!.vscode/extensions.json + +# never published from this repository +private/ +shots/ +**/public/p/ +*.fig +.env +.env.* +.manual/ + +# ui8px: generated reports and learn-mode data +.ui8px/telemetry/ +.ui8px/reports/ diff --git a/.project/README.md b/.project/README.md deleted file mode 100644 index b2784f7..0000000 --- a/.project/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Project docs - -Planning notes for `@ui8kit/codegen`. Implementation details live under -`docs/`; this folder tracks **near-term** work only. - -| Doc | Role | -|-----|------| -| [roadmap.md](./roadmap.md) | Active focus + nearest backlog | -| [progress.md](./progress.md) | Status + journal | -| [plan/jinja2-runtime.md](./plan/jinja2-runtime.md) | Next runtime: Jinja2 | -| [plan/rails-erb-runtime.md](./plan/rails-erb-runtime.md) | Later: Rails / ERB (ninth emit) | diff --git a/.project/plan/jinja2-runtime.md b/.project/plan/jinja2-runtime.md deleted file mode 100644 index 45dc7da..0000000 --- a/.project/plan/jinja2-runtime.md +++ /dev/null @@ -1,103 +0,0 @@ -# Plan: Jinja2 runtime - -**Status:** nearest backlog -**Goal:** eighth emit target — idiomatic Jinja2 templates from the same brick -defs as Twig/Latte, with DOM parity. - -**Consumers:** Flask (+ uv) SSR apps; BuildY `python-flask-jinja` template -(see BuildY `plan/php-python-runners.md`). - -## Why Jinja2 next - -- Same SSR class as Twig/Latte (Twig was inspired by Jinja). -- Python Flask stack is the light SSR counterpart to Slim/Flight + PHP. -- Domain IR should not need changes; work is mostly a new `Emitter` + Python - runtime helpers + parity harness (same path as [docs/architecture.md](../../docs/architecture.md) - “Adding a new runtime”). - -## Composition model (expected) - -Mirror PHP template engines: - -| Concern | Approach | -|---------|----------| -| Children | Pre-rendered HTML string, printed unescaped (`|safe`) | -| Nesting | `{% set inner %}…{% endset %}` then `include` / `macro` with `children=inner` | -| Attrs | Caller map merged last (Twig-style helper or Jinja filter) | -| Class merge | Python `cn()` equivalent (plain concat like Go/PHP `Rt::cn`) | -| Variants | Embed/load colocated `*.variants.json` or shared recipe helper | - -Likely output: `ui//.html.j2` (or `.jinja2`) — pick one extension -in J0 and stick to it. - -## Coverage - -Start with the **same structural predicate** as Latte/Twig -(`phpSupported()` / docs/php-complex-parts.md): - -- Target **60 / 63** parts initially. -- Skip `breadcrumb/Breadcrumb`, `select/Select`, `icon/Icon` for the same - reasons (forEach / branched root / branched slots). -- Emit Python class helpers for **all** parts with a classes contract - (mirror `Classes.php`). - -Prefer renaming the predicate to something engine-neutral -(`templateSupported` / `ssrTemplateSupported`) when Jinja lands, without -changing skip semantics. - -## Work items - -### J0 — Spike + naming - -- [ ] Confirm output extension, include path layout, and Flask loader roots. -- [ ] Decide Python package layout under `generated/` (e.g. `python/ui8kit/` - with `cn`, expr helpers, optional Jinja extension/filters). -- [ ] Document composition snippet in the plan spike notes (welcome-card nest). - -### J1 — Emitter - -- [ ] `RuntimeName` += `"jinja"`; register in `ALL_RUNTIMES` / CLI `--runtimes`. -- [ ] `src/emitters/jinja.ts` (+ expr printer; reuse analysis patterns from - `php-common` / `twig` where safe). -- [ ] Wire `generate.ts`: copy `runtime/python/*`, emit helpers, no duplicate paths. -- [ ] Prop naming: HTML-native (same as Svelte/Vue/PHP). - -### J2 — Parity + deps - -- [ ] `pyproject.toml` / uv-friendly deps: Jinja2 (pin range). -- [ ] `cmd/parity-jinja/` harness (JSON in → HTML out), skip if Python/uv missing. -- [ ] `tests/parity.jinja.test.ts` (or `.py` driven from Bun like PHP suites). -- [ ] Extend `emitters.test.ts` structural checks. - -### J3 — Example - -- [ ] `examples/jinja/` — Flask (or minimal Jinja-only server) welcome twin of - latte/twig; shared `data/welcome.json` + `web/static` CSS. -- [ ] `bun run dev:jinja` script + docs in `examples/README.md` / `docs/runtimes.md`. - -### J4 — Docs + optional bundle - -- [ ] Update overview, architecture, runtimes, contract, testing, getting-started - (“seven” → “eight” where accurate). -- [ ] Optional: `generate:jinja-bundle` (Jinja-only package, latte-bundle analogue). - -## Explicit non-goals (this plan) - -- Django templates / Mako emitters. -- Full 63/63 PHP-complex parts before Jinja ships. -- BuildY runner images (product repo owns `buildy-runner-python`). -- Changing brick defs solely for Jinja. - -## Exit criteria - -- `bun run generate --runtimes jinja` (or all-eight default) writes templates + - Python helpers. -- Parity suite green when Python is on PATH (skip cleanly when absent). -- Welcome example renders the same layout tokens as other runtimes. -- Docs list Jinja2 as a first-class runtime. - -## References - -- Latte/Twig composition: [docs/runtimes.md](../../docs/runtimes.md) -- PHP skips: [docs/php-complex-parts.md](../../docs/php-complex-parts.md) -- Add-runtime checklist: [docs/architecture.md](../../docs/architecture.md) diff --git a/.project/plan/rails-erb-runtime.md b/.project/plan/rails-erb-runtime.md deleted file mode 100644 index 502403d..0000000 --- a/.project/plan/rails-erb-runtime.md +++ /dev/null @@ -1,135 +0,0 @@ -# Plan: Rails / ERB runtime - -**Status:** later backlog (after Jinja2 J0–J4) -**Goal:** ninth emit target — idiomatic **ERB** templates from the same brick -defs as Twig/Latte/Jinja, with DOM parity. - -**Primary consumer:** full **Rails** apps (sqlite-first SSR). -**Secondary consumers:** light Ruby stacks (**Sinatra or Roda + ERB**) — same -templates, thinner host. - -BuildY owns runners/images; this repo owns the emitter + Ruby helpers + -parity. Product track: BuildY `.project/plan/ruby-runners.md` (R0–R4; ERB -emitter is **R4**, optional, after light template R1). - -## Why Rails / ERB (and when) - -| | | -|--|--| -| **Why ERB** | Default Rails view language; also used by Sinatra/Roda light templates. One emitter serves both levels. | -| **Why not first** | BuildY ships PHP/Python runners (T0–T3) and Jinja codegen (**J0–J4**) first. Ruby is the **last** template-runner track. | -| **Gate** | Start Er0 only after Jinja is first-class *and* BuildY has at least a light Ruby preview path (R1) **or** explicit product demand for ui8kit bricks in ERB (BuildY R4). | - -Mirror Jinja/Twig lessons: HTML-string children, structural skip predicate, -class helpers for unsupported parts. No brick-def changes solely for ERB. - -## Composition model (expected) - -Same SSR class as Twig / Latte / Jinja: - -| Concern | Approach | -|---------|----------| -| Children | Pre-rendered HTML string, printed unescaped (`<%= children.html_safe %>` / `raw`) | -| Nesting | Capture (`<% capture do %>…<% end %>`) or partials with a `children:` local | -| Attrs | Caller hash merged last (Ruby helper, Twig-style) | -| Class merge | Ruby `cn()` (plain concat, same as PHP `Rt::cn` / Python) | -| Variants | Colocated `*.variants.json` or shared recipe helper | - -Likely output: `ui//_part.html.erb` or `ui//part.html.erb` — -pick one partial naming convention in **Er0** and stick to it (Rails partial -prefix `_` vs Sinatra flat views). - -## Coverage - -Start with the **same structural predicate** as Latte/Twig/Jinja -(`phpSupported()` → rename toward `ssrTemplateSupported` when Jinja lands): - -- Target **60 / 63** parts initially. -- Skip `breadcrumb/Breadcrumb`, `select/Select`, `icon/Icon` for the same - reasons (forEach / branched root / branched slots). -- Emit Ruby class helpers for **all** parts with a classes contract - (mirror `Classes.php` / Python helpers). - -## Work items - -### Er0 — Spike + naming - -- [ ] Confirm ERB partial layout, Rails `render` locals, and Sinatra/Roda - include path (one layout, both hosts). -- [ ] Decide Ruby package layout under `generated/` (e.g. `ruby/lib/ui8kit/` - with `cn`, attr helpers; optional Rails engine vs plain gem). -- [ ] Document composition snippet (welcome-card nest) for ERB. -- [ ] Asset story for examples: **importmap / Propshaft** preferred (align - BuildY R2); no mandatory Node pipeline in the reference. - -### Er1 — Emitter - -- [ ] `RuntimeName` += `"erb"` (or `"rails"` only if CLI must be product-named — - prefer **`erb`**: language is the emit target). -- [ ] Register in `ALL_RUNTIMES` / CLI `--runtimes`. -- [ ] `src/emitters/erb.ts` (+ expr printer; reuse `php-common` / Twig / Jinja - analysis where safe). -- [ ] Wire `generate.ts`: copy `runtime/ruby/*`, emit helpers, no duplicate paths. -- [ ] Prop naming: HTML-native (same as Svelte/Vue/PHP/Jinja). - -### Er2 — Parity + deps - -- [ ] Gemspec / Bundler pin for parity harness (MRI 3.3+). -- [ ] `cmd/parity-erb/` (or `parity-rails/`) harness: JSON in → HTML out; - skip cleanly if `ruby` / `bundle` missing. -- [ ] `tests/parity.erb.test.ts` (Bun-driven like PHP suites). -- [ ] Extend `emitters.test.ts` structural checks. - -### Er3 — Examples - -- [ ] `examples/erb-rails/` — minimal **Rails** welcome twin (sqlite optional / - no external DB on default route); shared `data/welcome.json` + static CSS. -- [ ] Optional light twin: `examples/erb-sinatra/` **or** document that the - same `ui/` partials render under Sinatra/Roda (one welcome is enough for - Er3 if partials are host-agnostic). -- [ ] `bun run dev:rails` (or `dev:erb`) + docs in `examples/README.md` / - `docs/runtimes.md`. - -### Er4 — Docs + optional bundle - -- [ ] Update overview, architecture, runtimes, contract, testing, - getting-started (“eight” → “nine” where accurate, after Jinja ships). -- [ ] Optional: `generate:erb-bundle` (ERB/Ruby-only package, latte-bundle - analogue) for Rails engines / gems. - -## Explicit non-goals (this plan) - -- Shipping ERB **before** Jinja2 (J0–J4 remains nearest backlog). -- BuildY runner images / registry (`buildy-runner-ruby`, templates) — product - repo owns those (BuildY `plan/ruby-runners.md`). -- Haml / Slim-ruby emitters (BuildY R4 mentions Slim only as a later option). -- Full 63/63 complex parts before ERB ships. -- Mandatory Postgres / Redis / Node asset pipeline for the welcome example. -- Changing brick defs solely for Rails. - -## Exit criteria - -- `bun run generate --runtimes erb` writes ERB partials + Ruby helpers. -- Parity suite green when Ruby/Bundler is on PATH (skip cleanly when absent). -- Rails welcome example renders the same layout tokens as other runtimes. -- Docs list ERB as a first-class runtime; BuildY can consume partials in - `ruby-rails` and light Sinatra/Roda templates without a second emitter. - -## Mapping to BuildY - -```text -BuildY R0–R1 runner + light Sinatra/Roda+ERB (no codegen required) -BuildY R2 full Rails template (manual/LLM ERB OK) -BuildY R4 optional ui8kit ERB emitter ←→ this plan Er0–Er4 -``` - -Codegen does **not** block BuildY R1/R2. Er* starts when Jinja is done and -R4 demand (or an explicit “emit for Rails bricks” decision) is open. - -## References - -- BuildY Ruby track: `@buildy-ui/.project/plan/ruby-runners.md` -- Jinja plan (prior SSR template runtime): [jinja2-runtime.md](./jinja2-runtime.md) -- Latte/Twig composition: [docs/runtimes.md](../../docs/runtimes.md) -- PHP skips: [docs/php-complex-parts.md](../../docs/php-complex-parts.md) -- Add-runtime checklist: [docs/architecture.md](../../docs/architecture.md) diff --git a/.project/progress.md b/.project/progress.md deleted file mode 100644 index dbbbd52..0000000 --- a/.project/progress.md +++ /dev/null @@ -1,26 +0,0 @@ -# Progress - -Statuses: pending · in progress · done · backlog - -## Near-term - -| Track | Status | Exit | -|-------|--------|------| -| Jinja2 runtime (J0–J4) | backlog | Eighth runtime + parity + Flask welcome example | -| Rails / ERB runtime (Er0–Er4) | backlog (later) | Ninth runtime + parity + Rails welcome; after Jinja | - -## Journal - -### 2026-07-22 — Plan Rails / ERB runtime - -- Later codegen track after Jinja: emit target **`erb`**, primary consumer - full Rails, secondary Sinatra/Roda (same partials). -- Mirrors BuildY `ruby-runners.md`: light Ruby first on product side (R1); - ui8kit ERB emitter is optional **R4** — does not block BuildY R1/R2. -- Plan: [plan/rails-erb-runtime.md](./plan/rails-erb-runtime.md). - -### 2026-07-21 — Plan Jinja2 runtime - -- Accepted as nearest codegen backlog after current seven runtimes. -- Stack pairing: Flask + Jinja2 (+ uv) on the product side; emitter here. -- Plan: [plan/jinja2-runtime.md](./plan/jinja2-runtime.md). diff --git a/.project/roadmap.md b/.project/roadmap.md deleted file mode 100644 index 8847d32..0000000 --- a/.project/roadmap.md +++ /dev/null @@ -1,32 +0,0 @@ -# Roadmap - -## Active - -Keep seven-runtime parity green (templ, react, svelte, vue, solid, latte, twig). -No breaking IR or brick-contract changes without parity coverage. - -## Nearest backlog - -| ID | Item | Plan | -|----|------|------| -| **J0–J4** | **Jinja2 runtime** (eighth emit target) | [plan/jinja2-runtime.md](./plan/jinja2-runtime.md) | - -Primary consumer path: Flask + Jinja2 (BuildY `buildy-runner-python` track). -Reuse Twig/Latte lessons: HTML-string children, structural skip predicate, -class helpers for unsupported parts. - -## Later (not scheduled) - -| ID | Item | Plan | -|----|------|------| -| **Er0–Er4** | **Rails / ERB runtime** (ninth emit target) | [plan/rails-erb-runtime.md](./plan/rails-erb-runtime.md) | - -Primary consumer: full Rails; same partials for Sinatra/Roda light stacks. -Aligns with BuildY `plan/ruby-runners.md` **R4** (optional ERB emitter after -light Ruby R1). Start only after Jinja and product demand / BuildY R4 gate. - -Other later items: - -- Jinja-only bundle profile (mirror `generate:latte-bundle`) -- PHP complex-part loops/branches if Jinja gains them first -- Behavior-driven `components/` (needs `@ui8kit/aria` contract) diff --git a/.ui8px/gate.json b/.ui8px/gate.json new file mode 100644 index 0000000..45d30f5 --- /dev/null +++ b/.ui8px/gate.json @@ -0,0 +1,10 @@ +{ + "max": 0, + "blocking": [ + "UI8PX001", + "UI8PX003", + "UI8PX005", + "GRID" + ], + "why": "hard gate: no blocking ui8px hit over the class sets of xgen/specs (8 px steps, 4 px steps only inside controls). Hairlines (gap-px, p-px) and the colour inset-ring-background/30 are allowed utilities, see plan/UI8KIT-2.0.md (ui8px section)." +} diff --git a/.ui8px/policy/allowed.json b/.ui8px/policy/allowed.json new file mode 100644 index 0000000..cd6c6ca --- /dev/null +++ b/.ui8px/policy/allowed.json @@ -0,0 +1,447 @@ +{ + "spacing": { + "layout": [ + "0", + "2", + "4", + "6", + "8", + "10", + "12", + "14", + "16", + "18", + "20", + "22", + "24", + "26", + "28", + "30", + "32", + "34", + "36", + "38", + "40", + "42", + "44", + "46", + "48", + "50", + "52", + "54", + "56", + "58", + "60", + "62", + "64", + "66", + "68", + "70", + "72", + "74", + "76", + "78", + "80", + "82", + "84", + "86", + "88", + "90", + "92", + "94", + "96", + "98", + "100", + "102", + "104", + "106", + "108", + "110", + "112", + "114", + "116", + "118", + "120", + "122", + "124", + "126", + "128", + "130", + "132", + "134", + "136", + "138", + "140", + "142", + "144", + "146", + "148", + "150", + "152", + "154", + "156", + "158", + "160" + ], + "control": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "18", + "20", + "22", + "24", + "26", + "28", + "30", + "32", + "34", + "36", + "38", + "40", + "42", + "44", + "46", + "48", + "50", + "52", + "54", + "56", + "58", + "60", + "62", + "64", + "66", + "68", + "70", + "72", + "74", + "76", + "78", + "80", + "82", + "84", + "86", + "88", + "90", + "92", + "94", + "96", + "98", + "100", + "102", + "104", + "106", + "108", + "110", + "112", + "114", + "116", + "118", + "120", + "122", + "124", + "126", + "128", + "130", + "132", + "134", + "136", + "138", + "140", + "142", + "144", + "146", + "148", + "150", + "152", + "154", + "156", + "158", + "160" + ] + }, + "utilities": [ + "block", + "inline", + "inline-block", + "inline-flex", + "flex", + "grid", + "hidden", + "relative", + "absolute", + "fixed", + "sticky", + "static", + "sr-only", + "not-sr-only", + "container", + "mx-auto", + "w-full", + "w-auto", + "w-fit", + "w-screen", + "h-full", + "h-auto", + "h-fit", + "h-screen", + "min-w-0", + "max-w-none", + "max-w-sm", + "max-w-md", + "max-w-lg", + "max-w-xl", + "max-w-2xl", + "max-w-3xl", + "max-w-4xl", + "max-w-5xl", + "max-w-6xl", + "max-w-7xl", + "overflow-hidden", + "overflow-clip", + "overflow-auto", + "overflow-visible", + "overflow-scroll", + "object-cover", + "object-contain", + "object-fill", + "object-center", + "object-top", + "object-bottom", + "aspect-auto", + "aspect-square", + "aspect-video", + "truncate", + "whitespace-nowrap", + "rounded", + "rounded-none", + "rounded-sm", + "rounded-md", + "rounded-lg", + "rounded-xl", + "rounded-2xl", + "rounded-3xl", + "rounded-full", + "shadow", + "shadow-none", + "shadow-sm", + "shadow-md", + "shadow-lg", + "shadow-xl", + "border", + "border-0", + "border-2", + "border-4", + "border-border", + "bg-background", + "bg-card", + "bg-muted", + "bg-primary", + "bg-secondary", + "bg-destructive", + "bg-accent", + "bg-transparent", + "text-foreground", + "text-muted-foreground", + "text-primary", + "text-primary-foreground", + "text-secondary", + "text-secondary-foreground", + "text-destructive", + "text-destructive-foreground", + "text-accent-foreground", + "text-card-foreground", + "text-xs", + "text-sm", + "text-base", + "text-lg", + "text-xl", + "text-2xl", + "text-3xl", + "text-4xl", + "text-5xl", + "font-normal", + "font-medium", + "font-semibold", + "font-bold", + "leading-none", + "leading-tight", + "leading-normal", + "leading-relaxed", + "tracking-tight", + "tracking-normal", + "tracking-wide", + "text-left", + "text-center", + "text-right", + "text-justify", + "flex-row", + "flex-col", + "flex-wrap", + "flex-nowrap", + "grow", + "grow-0", + "shrink", + "shrink-0", + "items-start", + "items-center", + "items-end", + "items-stretch", + "justify-start", + "justify-center", + "justify-end", + "justify-between", + "justify-around", + "justify-evenly", + "grid-cols-1", + "grid-cols-2", + "grid-cols-3", + "grid-cols-4", + "grid-cols-5", + "grid-cols-6", + "grid-cols-12", + "inset-ring", + "inset-ring-2", + "inset-ring-border", + "inset-ring-input", + "inset-ring-transparent", + "inset-ring-current", + "inset-ring-primary", + "inset-ring-destructive", + "inset-ring-foreground", + "inset-ring-ring", + "inset-x-0", + "inset-y-0", + "ml-auto", + "mr-auto", + "mt-auto", + "mb-auto", + "my-auto", + "m-auto", + "w-px", + "h-px", + "max-w-xs", + "max-w-full", + "min-w-lg", + "min-h-screen", + "min-h-0", + "z-0", + "z-10", + "z-20", + "z-30", + "z-40", + "z-50", + "w-1/2", + "w-1/3", + "w-2/3", + "w-1/4", + "w-3/4", + "w-5/6", + "top-1/2", + "left-1/2", + "inset-ring-0", + "size-0", + "size-2", + "size-4", + "size-6", + "size-8", + "size-10", + "size-12", + "size-14", + "size-16", + "size-18", + "size-20", + "size-22", + "size-24", + "size-26", + "size-28", + "size-30", + "size-32", + "size-34", + "size-36", + "size-38", + "size-40", + "size-42", + "size-44", + "size-46", + "size-48", + "size-50", + "size-52", + "size-54", + "size-56", + "size-58", + "size-60", + "size-62", + "size-64", + "size-66", + "size-68", + "size-70", + "size-72", + "size-74", + "size-76", + "size-78", + "size-80", + "size-82", + "size-84", + "size-86", + "size-88", + "size-90", + "size-92", + "size-94", + "size-96", + "size-98", + "size-100", + "size-102", + "size-104", + "size-106", + "size-108", + "size-110", + "size-112", + "size-114", + "size-116", + "size-118", + "size-120", + "size-122", + "size-124", + "size-126", + "size-128", + "size-130", + "size-132", + "size-134", + "size-136", + "size-138", + "size-140", + "size-142", + "size-144", + "size-146", + "size-148", + "size-150", + "size-152", + "size-154", + "size-156", + "size-158", + "size-160", + "size-full", + "size-px", + "gap-px", + "p-px", + "inset-ring-background/30", + "inset-x-12", + "h-lh" + ] +} diff --git a/.ui8px/policy/denied.json b/.ui8px/policy/denied.json new file mode 100644 index 0000000..c330feb --- /dev/null +++ b/.ui8px/policy/denied.json @@ -0,0 +1,16 @@ +{ + "utilities": { + "bg-red-500": { + "reason": "Use semantic color tokens instead of raw palette colors.", + "suggest": [ + "bg-destructive" + ] + }, + "text-red-500": { + "reason": "Use semantic color tokens instead of raw palette colors.", + "suggest": [ + "text-destructive" + ] + } + } +} diff --git a/.ui8px/policy/groups.json b/.ui8px/policy/groups.json new file mode 100644 index 0000000..f02c210 --- /dev/null +++ b/.ui8px/policy/groups.json @@ -0,0 +1,57 @@ +{ + "conflictGroups": { + "display": [ + "block", + "inline", + "inline-block", + "inline-flex", + "flex", + "grid", + "hidden" + ], + "flexDirection": [ + "flex-row", + "flex-col", + "flex-row-reverse", + "flex-col-reverse" + ], + "flexWrap": [ + "flex-wrap", + "flex-nowrap" + ], + "items": [ + "items-*" + ], + "justify": [ + "justify-*" + ], + "textSize": [ + "text-xs", + "text-sm", + "text-base", + "text-lg", + "text-xl", + "text-2xl", + "text-3xl", + "text-4xl", + "text-5xl" + ], + "textAlign": [ + "text-left", + "text-center", + "text-right", + "text-justify" + ], + "background": [ + "bg-*" + ], + "radius": [ + "rounded", + "rounded-*" + ], + "shadow": [ + "shadow", + "shadow-*" + ] + } +} diff --git a/.ui8px/policy/patterns.json b/.ui8px/policy/patterns.json new file mode 100644 index 0000000..6ff527e --- /dev/null +++ b/.ui8px/policy/patterns.json @@ -0,0 +1,3 @@ +{ + "patterns": {} +} diff --git a/.ui8px/policy/scopes.json b/.ui8px/policy/scopes.json new file mode 100644 index 0000000..f203216 --- /dev/null +++ b/.ui8px/policy/scopes.json @@ -0,0 +1,58 @@ +{ + "defaultScope": "layout", + "scopes": [ + { + "name": "controls", + "files": [ + ".ui8px/extract/specs/ui/button.*", + ".ui8px/extract/specs/ui/button-plain.*", + ".ui8px/extract/specs/ui/badge.*", + ".ui8px/extract/specs/ui/iconbadge.*", + ".ui8px/extract/specs/ui/checkbox.*", + ".ui8px/extract/specs/ui/radio.*", + ".ui8px/extract/specs/ui/switch.*", + ".ui8px/extract/specs/ui/select.*", + ".ui8px/extract/specs/ui/input.*", + ".ui8px/extract/specs/ui/textarea.*", + ".ui8px/extract/specs/ui/range.*", + ".ui8px/extract/specs/ui/label.*", + ".ui8px/extract/specs/ui/meter.*", + ".ui8px/extract/specs/ui/progress.*", + ".ui8px/extract/specs/ui/summary.*", + ".ui8px/extract/specs/recipes/badge-square.*", + ".ui8px/extract/specs/recipes/icon-tab.*", + ".ui8px/extract/specs/recipes/switcher.*", + ".ui8px/extract/specs/recipes/switcher-item.*", + ".ui8px/extract/specs/recipes/nav-item.*", + ".ui8px/extract/specs/recipes/nav-item-content.*", + ".ui8px/extract/specs/recipes/file-tree-item.*", + ".ui8px/extract/specs/parts/badge-square.*", + ".ui8px/extract/specs/parts/pill.*", + ".ui8px/extract/specs/parts/search-field.*", + ".ui8px/extract/specs/organisms/number-field.*", + ".ui8px/extract/specs/patterns/icon-tab.*", + ".ui8px/extract/specs/patterns/switcher.*", + ".ui8px/extract/specs/patterns/switcher-item.*", + ".ui8px/extract/specs/patterns/dropdown-item.*", + ".ui8px/extract/specs/patterns/editor-tab.*", + ".ui8px/extract/specs/patterns/select-menu.*", + ".ui8px/extract/specs/patterns/nav-item.*", + ".ui8px/extract/specs/patterns/file-tree-item.*", + ".ui8px/extract/specs/ui/icon.*", + ".ui8px/extract/specs/patterns/nav-item-row.*", + ".ui8px/extract/specs/organisms/search-palette.*" + ], + "spacing": "control" + }, + { + "name": "layout", + "files": [ + ".ui8px/extract/**", + "packages/*/ui/src/**", + "xgen/**", + "apps/**" + ], + "spacing": "layout" + } + ] +} diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000..1cfc440 --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,90 @@ +# Migrating from `@ui8kit/codegen` 0.1 to 2.0 + +2.0 replaces the 0.1 engine (TypeScript brick DSL + one emitter per runtime writing `generated/`) with **xgen**, the +generation layer of ui8kit 2.0 (ported from codegen-x/ui8kit). It is a breaking release: sources, outputs, file names, +recipes and the import paths of the engine all change. 0.1 stays available at commit +[`972b492`](https://github.com/ui8kit/codegen/tree/972b492) (the last 0.1 state of `main`); a git pin on that SHA keeps +working. + +## What changed + +| | 0.1 | 2.0 | +|---|---|---| +| Brick source | `bricks//.def.ts` (DSL from `bricks/_dsl.ts`) + `*.variants.json` + `*.data.json` | `xgen/specs/ui/.json` + `.variants.json` (JSON Schema `xgen/schema/schemas/spec.schema.json`); showcase data are `examples` in the spec | +| Above bricks | none | parts, patterns, organisms, blocks, presets, screens (`xgen/specs/*`, written with the builder in `xgen/screens/src/authoring`) | +| Runtimes | templ, react, svelte, vue, solid, latte, twig (7) | svelte, react, vue, solid, templ, twig, latte, **jinja2** (8); every brick and block, PHP parts no longer skipped | +| Output | one tree `generated/ui//` with every runtime side by side | one package per runtime: `packages//ui`, plus `packages/shared/app` and `apps/host-*` | +| File names | `Button.svelte`, `button.tsx`, `button.solid.tsx`, `Button.latte`, `Button.html.twig` | kebab-case per package: `src/primitives/button/button.svelte`, `.tsx`, `.vue`; `ui/button/button.templ`, `.html.twig`, `.latte`, `.html.j2` | +| Go module | `github.com/ui8kit/ui` (flag `--go-module`) | `github.com/ui8kit/codegen/packages/templ/ui`; templ `v0.3.1001` -> `v0.3.1070` | +| CLI | `bun src/infrastructure/cli.ts generate --out generated --runtimes ...` | `bun run build` (`xgen build`), `bun run check` (`xgen check`), `xgen list / e2e / shot / visual` | +| Verify | `bun run verify` = check + tsc + typecheck:generated + vitest/bun parity | `bun run verify` = `xgen check` (drift + 5 real-engine parity groups + style and rule gates) + `codex:validate` + `typecheck` (tsc, svelte-check, vue-tsc) + `bun test xgen` | +| Data | none | Codex v0.4 fixtures validated with `@ui8kit/contract` | +| Static HTML export, Latte bundle, `examples/` welcome screens | `build:html`, `generate:latte-bundle`, `examples/` | removed; the host apps serve every screen (`bun run build:hosts`), previews live in ui8kit/site | + +### Engine API (deep imports) + +0.1 consumers imported internals: `@ui8kit/codegen/bricks/index` (`bricks`), `bricks/_dsl`, `src/domain/validate` +(`validateRegistry`), `src/emitters/*`, `tests/support/{fixtures,normalize,...}`. None of these exist in 2.0. Equivalents: + +| 0.1 | 2.0 | +|---|---| +| `bricks` (array of brick objects) | `loadSpecs(xgenRoot)` from `@ui8kit/xgen-spec` (`xgen/spec/src`): `{ bricks: LoadedBrick[], problems }`, `LoadedBrick.brick` is the typed model | +| `validateRegistry` | `loadSpecs` problems + `bun run check` (schema, props, a11y, coverage ...) | +| per-runtime emitters | `SvelteEmitter`, `ReactEmitter`, `VueEmitter`, `SolidEmitter` (`@ui8kit/xgen-runtime-*`), template runtimes via `@ui8kit/xgen-generator` (`templFiles`, `twigFiles`, ...) | +| `generateFiles(...)` to `generated/` | `planBuild(workspace)` + `write(plan)` from `@ui8kit/xgen-generator` | +| `tests/support/fixtures` `showcaseCases` | `examples` of each spec (`spec.examples`, `children` for the other parts) | +| `tests/support/normalize` | `xgen/check/src` parity helpers (internal; DOM normalisation per runtime group) | +| brick DSL for local bricks | write a JSON spec in `xgen/specs/ui`; to convert existing 0.1 bricks: `CODEGEN_DIR= RECIPES_DIR= bun xgen/spec/tools/import-codegen.ts ` | + +### Recipes and DOM + +The bricks were reworked for ui8kit 2.0 (see the recipes in `xgen/specs/ui/*.variants.json`): + +- **Grid**: no half steps (`gap-1.5` of Button `sm` and CardHeader is gone; `spacing` gate fails on any `x.5` step). + Controls `sm / default / lg` = `h-8 / h-10 / h-12` (0.1: `h-8 / h-9 / h-10`). +- **Corners**: one token, plain `rounded` (`--radius`) instead of `rounded-md` / `rounded-lg`. +- **Shadows**: none on flat surfaces (0.1 `shadow-xs` on buttons and inputs is gone); floating layers only. +- **Button**: `layout` axis (`default`, `icon`) replaces size `icon`; `inset-ring` borders instead of `border`. +- New bricks: `button-plain`, `link-plain`, `lucide-icon` (Lucide registry), `range`, `skeleton`, form parts + (`fieldset`, `legend`, `form-item`, `form-description`, `form-message`), `meter`, `progress`, `summary`, table cells, + and the two bricks upstreamed from saas-design: **`themetoggle`** (`ThemeToggle`) and **`sheet`** + (`Sheet`, `SheetTrigger`, `SheetClose`). + +## Adopting 2.0 in saas-design + +saas-design pins `github:ui8kit/codegen#972b492` in `packages/ui/package.json` and wraps the 0.1 registry in +`packages/ui/scripts/registry.ts` (semantic `ui-*` classes, local bricks, `SNAP` of half steps). Steps: + +1. **Local bricks.** Delete `packages/ui/bricks/{themetoggle,sheet,_lucide.ts,index.ts}`: `ThemeToggle`, `Sheet`, + `SheetTrigger` and `SheetClose` are upstream (`xgen/specs/ui/themetoggle.json`, `sheet.json`) with the same DOM, ARIA + and `data-ui8kit` hooks (`theme-toggle`, `sheet`, `sheet-overlay`, `sheet-trigger`, `sheet-close`; the inline SVGs drop the legacy `focusable="false"`), so + `packages/ui/behaviors/ui8kit.js` keeps working. The classes that lived in `packages/adapter/src/base.css` + (`ui-themetoggle-sun/moon`, `ui-sheet-overlay/panel/icon-*`) are now utilities in the spec (`dark:block`, + `in-aria-expanded:hidden`, ...); the recipes use `rounded` (not `rounded-full`) and the panel `shadow-lg` (not `shadow-xl`). + Keep a recipe override in `packages/ui/recipes` if the pill shape is wanted. +2. **Half steps.** Remove the `SNAP` map in `registry.ts`; upstream has no half step and `xgen check` keeps it so + (backlog `codegen-half-steps.md` can be closed). +3. **Generator.** Two options: + - *Consume the generated packages* (simplest): take `packages/svelte/ui` and `packages/templ/ui` from a pinned commit + of ui8kit/codegen (git submodule, sparse checkout or a copy script), or install items with the ui8kit CLI from a + registry built from this repository (see `docs/registry.md`). Utilities stay Tailwind classes; the adapter becomes + optional. + - *Keep semantic classes*: port `registry.ts` to the JSON model: `loadSpecs(/xgen)` instead of + `bricks/index`, rewrite the same class positions (`recipe` tables, `classes.staticBase`, `classes.state`, static + `class` attributes, `lit` / `mapOr` / `cond` expressions) on the loaded bricks, then emit with `SvelteEmitter` and + the templ emitter of `@ui8kit/xgen-runtime-templ`. Showcase cases come from `spec.examples`. +4. **templ.** Regenerate with `go run github.com/a-h/templ/cmd/templ@v0.3.1070 generate` (the 2.0 runtime pins + v0.3.1070; backlog `templ-version-pin.md`). Go imports move to `github.com/ui8kit/codegen/packages/templ/ui/...` + if the package is consumed as a module, or stay under saas-design's own module path if emitted locally. +5. **Parity tooling.** `@ui8kit/codegen/tests/support/*` is gone; the parity of every brick case across runtimes is part + of `xgen check` upstream, so saas-design's `scripts/parity.ts` only has to cover its own class rewrite. +6. **Svelte Link warning.** Fixed upstream: the Svelte emitter marks the anchor of `Link` / `LinkPlain` with + `svelte-ignore a11y_no_noninteractive_tabindex` (backlog `codegen-svelte-link-a11y-tabindex.md` can be closed). +7. **Still open upstream** (not changed by 2.0): not published to npm and no `classMode: "semantic"` option (backlog + `codegen-not-on-npm-no-recipe-override.md`); Icon still emits `icon-` classes; no portal slot for the Sheet + (backlog `ui-behaviors-sheet-portal.md`). + +## For other 0.1 consumers + +- Pin `972b492` to stay on 0.1, or move to the generated package of your runtime under `packages//ui`. +- Regenerate nothing by hand: change a spec in `xgen/specs`, run `bun run build`, then `bun run check`. diff --git a/README.md b/README.md index 5405ad4..71b871c 100644 --- a/README.md +++ b/README.md @@ -1,217 +1,110 @@ -# UI8Kit Codegen +# UI8Kit Codegen 2.0 (xgen) -**One brick definition → seven identical runtimes.** +**One spec, eight runtimes, the same DOM and ARIA.** -Spec-driven codegen for UI8Kit `ui/` primitives. Define props, variants, and a render tree once; emit idiomatic Templ, React, Svelte, Vue, SolidJS, Latte, and Twig with the same DOM, design tokens, and ARIA contract — verified by parity tests, not by review. +Spec-driven generation for UI8Kit: bricks (primitives), components and blocks are written once as JSON specs and a +TypeScript builder, and `xgen` generates idiomatic source for **Svelte 5, React 19, Vue 3 and SolidJS** and server +templates for **Go templ, Twig, Latte and Jinja2**. Every brick and block case of the template runtimes is rendered with +the real engine and compared with React; identity across runtimes is a gate, not a convention. + +This is the engine behind the public ui8kit 2.0 registry ([ui.buildy.tw](https://ui.buildy.tw), `npx ui8kit add `, +CLI [`ui8kit`](https://github.com/ui8kit/cli) 2.0.x, registry roots `https://registry.buildy.tw/`). | Fact | Value | |------|-------| -| **Inventory** | 33 bricks · 63 parts · 7 runtimes | -| **PHP templates** | 59 / 63 parts (4 skipped by structural predicate) | -| **License** | MIT | +| **Bricks / parts** | 40 / 72 (`xgen/specs/ui`) | +| **Components and blocks** | 23 parts, 36 patterns, 184 organisms; 92 blocks with 474 variants (`xgen/specs/{parts,patterns,organisms,blocks}`) | +| **Screens** | 15 screen specs (themes, gallery, catalog, site, plans, skins), served by 4 host apps | +| **Runtimes** | svelte, react, vue, solid, templ, twig, latte, jinja2 | +| **Data contract** | Codex v0.4 via [`@ui8kit/contract`](https://github.com/ui8kit/contract) (77 fixture collections, 733 entries) | +| **Skins** | default + 15 (CSS variables only, shadcn tokens) | +| **Version** | 2.0.0 (not published to npm) - upgrading from 0.1: [MIGRATION.md](MIGRATION.md) | +| **License** | MIT, (c) UI8Kit | --- ## Runtimes -| Runtime | Output | Composition | -|---------|--------|-------------| -| **Go Templ** | `ui//.templ` + `_gen.go` | SSR, `{ children... }`, `Attrs` | -| **React 19** | `ui//.tsx` | `forwardRef`, `asChild` / `Slot` | -| **Svelte 5** | `ui//.svelte` | runes, snippets, `` | -| **Vue 3** | `ui//.vue` | ` + + diff --git a/apps/host-react/package.json b/apps/host-react/package.json new file mode 100644 index 0000000..e4deb77 --- /dev/null +++ b/apps/host-react/package.json @@ -0,0 +1,44 @@ +{ + "//": "Code generated by xgen. DO NOT EDIT.", + "name": "host-react", + "private": true, + "version": "0.0.0", + "type": "module", + "description": "Generated by xgen from xgen.app.json: the React 19 host of 15 screens (//#/). Generated under xgen/; src/ is the front controller.", + "ui8kit": { + "runtime": "react", + "generated": true, + "kit": [ + "xgen/runtime" + ], + "composition": [ + "xgen/App.tsx", + "xgen/screens" + ], + "blockRoot": [ + "xgen/App.tsx", + "xgen/screens" + ] + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "tsc --noEmit -p tsconfig.json" + }, + "dependencies": { + "@ui8kit/app-shared": "workspace:*", + "@ui8kit/react-ui": "workspace:*", + "react": "^19.2.0", + "react-dom": "^19.2.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.3.3", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^6.1.0", + "tailwindcss": "^4.3.3", + "typescript": "~6.0.2", + "vite": "^8.3.0" + } +} diff --git a/apps/host-react/src/app.css b/apps/host-react/src/app.css new file mode 100644 index 0000000..0793c44 --- /dev/null +++ b/apps/host-react/src/app.css @@ -0,0 +1,4 @@ +/* Code generated by xgen. DO NOT EDIT. */ +/* Source: xgen/runtimes/react/src/app.ts (settings: apps/host-react/xgen.app.json) */ +@import "@ui8kit/react-ui/styles/index.css"; +@import "@ui8kit/app-shared/styles/skins.css"; diff --git a/apps/host-react/src/main.tsx b/apps/host-react/src/main.tsx new file mode 100644 index 0000000..78c5304 --- /dev/null +++ b/apps/host-react/src/main.tsx @@ -0,0 +1,16 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/runtimes/react/src/app.ts (settings: apps/host-react/xgen.app.json) +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./app.css"; +import { bootScreen, screenKeyOf } from "@ui8kit/app-shared/screens"; +import { App } from "../xgen/App"; + +const screen = screenKeyOf(location); +const title = "xgen screens (React)"; +bootScreen(screen, "light", title); +createRoot(document.getElementById("app")!).render( + + + , +); diff --git a/apps/host-react/tsconfig.json b/apps/host-react/tsconfig.json new file mode 100644 index 0000000..fb09cf7 --- /dev/null +++ b/apps/host-react/tsconfig.json @@ -0,0 +1,10 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/runtimes/react/src/app.ts (settings: apps/host-react/xgen.app.json) +{ + "compilerOptions": { + "target": "ES2023", "lib": ["ES2023", "DOM", "DOM.Iterable"], "module": "ESNext", "moduleResolution": "bundler", "jsx": "react-jsx", + "strict": true, "noEmit": true, "skipLibCheck": true, "resolveJsonModule": true, "isolatedModules": true, "verbatimModuleSyntax": true, + "allowImportingTsExtensions": true, "types": ["vite/client"] + }, + "include": ["src", "xgen"] +} diff --git a/apps/host-react/vite.config.ts b/apps/host-react/vite.config.ts new file mode 100644 index 0000000..11479e9 --- /dev/null +++ b/apps/host-react/vite.config.ts @@ -0,0 +1,11 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/runtimes/react/src/app.ts (settings: apps/host-react/xgen.app.json) +import tailwindcss from "@tailwindcss/vite"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [tailwindcss(), react()], + server: { host: "127.0.0.1", port: 5181, strictPort: true, proxy: { "/__inspect": "http://127.0.0.1:5190" } }, + preview: { host: "127.0.0.1", port: 5181, strictPort: true }, +}); diff --git a/apps/host-react/xgen.app.json b/apps/host-react/xgen.app.json new file mode 100644 index 0000000..58dd768 --- /dev/null +++ b/apps/host-react/xgen.app.json @@ -0,0 +1,11 @@ +{ + "$schema": "../../xgen/schema/schemas/app.schema.json", + "specVersion": 1, + "name": "host-react", + "runtime": "react", + "screens": ["*"], + "title": "xgen screens (React)", + "port": 5181, + "locale": "en", + "theme": "light" +} diff --git a/apps/host-react/xgen/.xgen-manifest.json b/apps/host-react/xgen/.xgen-manifest.json new file mode 100644 index 0000000..36e48e7 --- /dev/null +++ b/apps/host-react/xgen/.xgen-manifest.json @@ -0,0 +1,271 @@ +{ + "//": "Code generated by xgen. DO NOT EDIT.", + "target": "apps/host-react", + "files": { + "index.html": "740d8d13e5b06127de39f40398a5bdb1e3c4ef182d2e3cc79cd6fedd33930fd4", + "package.json": "afbfaef4df622e1b1488a29b0565e47d398f767676f8eb5711a0c0c1addfed0f", + "src/app.css": "2fc6677f491351c82a7a4e779eb2c7d9f0e4814c818e5234a86570da51ff52f2", + "src/main.tsx": "08a0bd4d01fa1878eb2cbfa0cff2fb5275de4124e188e0804e85b039d488c8dc", + "tsconfig.json": "2ce2853f72df21d5542b45c2112c4eb918e02f7cc4775ac2e5d981a8928b831c", + "vite.config.ts": "604a6f24405edb795857e460e64386b952b508abe514ab6f53a91e08d0353bc7", + "xgen/App.tsx": "034ea14c09c12d082128fc7daa1d0d56eea4ee26f67ddbcbaa5c9d268a6cc173", + "xgen/runtime/ScreenOutlet.tsx": "a61c246cdc91423bd2c780d8dd2309d1e85b2fa237fcab58a696941b80e021d0", + "xgen/runtime/url.ts": "4ea8698b1f9934b558a02be32a1682b6946eb7a2674134669cf82b56789f9a57", + "xgen/screens/BlocksScreen.tsx": "a1a0f72abd23e4533c371350eff2c4589aa3618af4e1ddf15b58a1ea6f2e703e", + "xgen/screens/BlocksScreen/AboutmePage.tsx": "715d2ad5cf0ff958cd7e8b571b6161de19be9b0d634b3f0d56a409058115136d", + "xgen/screens/BlocksScreen/AboutPage.tsx": "acde2fa63eabe874034e12e0b1d98f024ef713bae360719c1a46da1c14b4da32", + "xgen/screens/BlocksScreen/AccordionPage.tsx": "23a3bf9b680b6d2b799cf96b8bc95ec4b7dbf3069335b227c706b492a854efaa", + "xgen/screens/BlocksScreen/ActivityPage.tsx": "76d569cba8512b2b3b361708d693f13086d1a59a14b8ca17dd05d53f7f236b6f", + "xgen/screens/BlocksScreen/AnnouncementPage.tsx": "cb573e2eceef303f06931ecc7cb26d9ac6a43897a64ceb83f29e2ce456a9352f", + "xgen/screens/BlocksScreen/ArticlePage.tsx": "c67b407e067e5d4c07ef4430ab2ffb1dc0b4692f0c9e0eb70b00822ad66834dc", + "xgen/screens/BlocksScreen/AuthPage.tsx": "64b67514c982305e11fb416c6744544e90a002775e89778ab625947ba0a8a70b", + "xgen/screens/BlocksScreen/AuthpagePage.tsx": "ac823ab303463a0a264fa7159d7fb1f34aae97094c95f4b1b4012e6c5180f6f4", + "xgen/screens/BlocksScreen/BeforeafterPage.tsx": "e54c9467e29135893b8bcfb39b99c079dd2d66862f9a4e941ad98cf24242ca5b", + "xgen/screens/BlocksScreen/BentoPage.tsx": "992dc4d0277a73d254a403c2f0c62a7ef40573ba032b59c54320bbd8d8c94074", + "xgen/screens/BlocksScreen/BottomnavPage.tsx": "ab0b23b65fc061c0a622be0aa6f0affd54f750d86386bb4a73f92c74fbbbec9a", + "xgen/screens/BlocksScreen/CartdrawerPage.tsx": "c071826a65c3e663af6e067d8de70494d4d18fcf0afeb539eebc45f4788291fe", + "xgen/screens/BlocksScreen/CartPage.tsx": "a1b3ee076991cab4af6b42151c52c1b1c65f199ee4fd09c6b1594a3bb71c7a5c", + "xgen/screens/BlocksScreen/CartpagePage.tsx": "32ee8bd784eb9b9718622e9b29f103eed4e4ca36f44b3c3b70767533fda3371a", + "xgen/screens/BlocksScreen/CategoriesPage.tsx": "feded78fd141860c980ea28b6244ffadefdc597b53aa952d814cf48ae0223e14", + "xgen/screens/BlocksScreen/ChannelsPage.tsx": "a5639f8131785e9b5e141da9adce22d722d1c3c1796186732bb93507899c44c6", + "xgen/screens/BlocksScreen/ChartPage.tsx": "394e2dd1a18b3e6bdd57a1250761cf7be395713dedd96ee1f85ed69e75e02d15", + "xgen/screens/BlocksScreen/ChecklistPage.tsx": "597f649148f3ae9d8f40c167ee86cd801b82a45c8096105fed25683c68740dd6", + "xgen/screens/BlocksScreen/CheckoutPage.tsx": "f4274012b31552f85b2c86d527cc5065e8f1661e4487e69c801e8255e6ee0ea8", + "xgen/screens/BlocksScreen/ComparePage.tsx": "0c64b3d1a57fd0cc8190869659cb7ab5f4d8349f58850c0df5a7171c8d58441e", + "xgen/screens/BlocksScreen/ContactPage.tsx": "c5347053f424a6e1153622f0b7dc6a2b881f537b28a113a73f4752749cafc957", + "xgen/screens/BlocksScreen/CookiePage.tsx": "de292fcb9f7466d77651b773c28bb62941443df2dbab03c3c7f253a6edde7ca8", + "xgen/screens/BlocksScreen/CreditsPage.tsx": "9bdb56f51b0bdf0cbbf3225f9f4035889923b2b7c8de39b7512d1d8ed8e7bf17", + "xgen/screens/BlocksScreen/CtaPage.tsx": "a541c57b8541ffab937b2814b66183d0c5c49aec548bfa7bd288eae397596539", + "xgen/screens/BlocksScreen/CtaproofPage.tsx": "6fce00cefb22d696943cd3588eeca35a587b476ad36d12a83ab24c6592b447b5", + "xgen/screens/BlocksScreen/DashshellPage.tsx": "a70c39ae1c9d1a12a538cc7d91e3603e5a58d59e2f49a1ed51937d11a4a80c77", + "xgen/screens/BlocksScreen/DeliveryPage.tsx": "464ae006415f2b90c22debe671b76cbabf7f4ec75618e403a28fb4ed51643b22", + "xgen/screens/BlocksScreen/EmptyPage.tsx": "57975d253fb2022f6b646ca0403cb9aa0af8889b5e1417ae71420f59c7cec9dc", + "xgen/screens/BlocksScreen/ErrorpagePage.tsx": "eb834ddb7c481c4950643f5b6809aba29252690d9b0b6be5742088456d7e03bd", + "xgen/screens/BlocksScreen/FaqPage.tsx": "c3aa09562aa43ca887648dd5981990e9ce9e804f0be84791ae219fa448d81607", + "xgen/screens/BlocksScreen/FaqsplitPage.tsx": "45ef1fb3263d83d3716be708fe815e81c2aa4c33ea6972bc462ced731a8e84e3", + "xgen/screens/BlocksScreen/FeatureshowcasePage.tsx": "42536fe5ad5c49c129aeaf66f55d3466e223d55870efa1a81227dbd768b19824", + "xgen/screens/BlocksScreen/FeaturesPage.tsx": "8a4c9fa0fd658b13b4172b5f1ab9cb44d6498acd1e9599cd35da46be52aa95f5", + "xgen/screens/BlocksScreen/FeaturesplitPage.tsx": "aed5cf815dfa6592bd6721d918ba348ccfdabc817fb1501a13d2491fa9bf6ada", + "xgen/screens/BlocksScreen/FeaturetabsPage.tsx": "515e8dd4e6079e98ad24aa9845de387fce4a16cbcdf47377bae22dbb4a6e6e85", + "xgen/screens/BlocksScreen/FooterPage.tsx": "cb55f25b53587054a093f9f6cbc88fa7dbdf58896b9fdd995004a0d229af329c", + "xgen/screens/BlocksScreen/FootersplitPage.tsx": "6ea42db66f7c1f1da6cee581f14ce6502bca6ff7af2beb2cd683a60bbcbc3a91", + "xgen/screens/BlocksScreen/HeaderPage.tsx": "27a038b20baf640107ac6e073dd981390ab3de9bed4009aad3043ed21a35fd19", + "xgen/screens/BlocksScreen/HeroPage.tsx": "3f4839ac31828a9c6de74c5fd7983f8e7877a4d42a1d06996389c767ac39ebcc", + "xgen/screens/BlocksScreen/HerosplitPage.tsx": "624485c97ed75eaf376251f26602b9e4c8e99b98fcf0dd4e8ab93d15dc3246fe", + "xgen/screens/BlocksScreen/IconwallPage.tsx": "453c8e7a2e3713c9818f07909b2eef6fe0fc50cd13bf48ec193b777f6bbc92f4", + "xgen/screens/BlocksScreen/IndexPage.tsx": "028175dc20e82dac749c66faae72c084b3a75ee10b7438e591956ba1341d9084", + "xgen/screens/BlocksScreen/JobsPage.tsx": "c59ac20fbce2ca0e1cd6bd8f6cf4f23134655110d0ea2cab35bd2856d9e2a3b7", + "xgen/screens/BlocksScreen/KanbanPage.tsx": "3ece3b0c7e67fea5d6fe269dc1e6333ecf97a8eb8f1c0bde771bbbfbd586633d", + "xgen/screens/BlocksScreen/LocationsPage.tsx": "a35ecf09edcd85c232d4d02238bc4b401c00341453a44bbd57877e9fc4e9bf65", + "xgen/screens/BlocksScreen/LogosPage.tsx": "188b9a8127de8c9ba1bc6e61dec2ed340b13ced00ae55b18e64c443d4d3b20df", + "xgen/screens/BlocksScreen/MedialistPage.tsx": "daee6f57cb75c2f561069cddc15795561850d4295b4f850657b1083654e45bc9", + "xgen/screens/BlocksScreen/MegamenuPage.tsx": "b697efba3afa5eb31078e7b75ee06f3be4a868430d1547dcb665df8cfe422542", + "xgen/screens/BlocksScreen/MetricsPage.tsx": "1dee4fc06a0ef1138d074ad02c43b9bba9daeb4dbbacf978d0ed3f65227a3ac9", + "xgen/screens/BlocksScreen/NavbarPage.tsx": "2766d40033901729bc9d53d1b3fcee8ce3b54b32939bc809b1467c3a761a6972", + "xgen/screens/BlocksScreen/NewsletterPage.tsx": "ac7824ca78c6ff89f6d6eafc428c06e058cabe90e12f44e1b9d5d6d73746e5da", + "xgen/screens/BlocksScreen/NotfoundPage.tsx": "f64f47da8cdc1683b1d78b3ff236ba9c7a399c1e527593c6bd38ba3bb493d8a8", + "xgen/screens/BlocksScreen/OrdersPage.tsx": "6efafac1fda7e194510dded7aaf4c872baa71ec24a5147a6fc681eb07e81738e", + "xgen/screens/BlocksScreen/OverviewPage.tsx": "b895e37868b2fe06c041e055cfb11b03578891843053bf368048a15ad97ae874", + "xgen/screens/BlocksScreen/PageheadPage.tsx": "1fda88913aaada250397752830813b6a2fc459c3d1eb4ec53b35f610f3f1089d", + "xgen/screens/BlocksScreen/PagetrailPage.tsx": "67fbbdba44b42abf458838389adc9fbc502891a7b98480fdf8297eda3c5c0ea4", + "xgen/screens/BlocksScreen/PhotosPage.tsx": "69ce5a27b8822723837df4faf4b2b08799148ecd99fc2ba035a639d958deb952", + "xgen/screens/BlocksScreen/PlanPage.tsx": "462a31cad36e3734e0ec9ccbb13ea025342fdb5ec0c4047e43a10b3e4ae12b61", + "xgen/screens/BlocksScreen/PostheaderPage.tsx": "3af842c9aa9c3cece8ffeb4de38cd7c3d543a95aa8206b0a2b72eb41e571fb5f", + "xgen/screens/BlocksScreen/PostshowcasePage.tsx": "64be1a7f4e2d85ec47e0293b94d87375cd23a5072fc83f0e8f4f35d2f7114ec9", + "xgen/screens/BlocksScreen/PostsPage.tsx": "ebe45acf7fcb858cf1e6f0e913b75a1dcb2a0659653259e4694f160735ceac1e", + "xgen/screens/BlocksScreen/PostsplitPage.tsx": "0dc0d40b021223a4ec0f4e1d0891d026beb7aea0a8259a03aaffd52f518bc5b9", + "xgen/screens/BlocksScreen/PricingPage.tsx": "fa959380a05d948fe716f04ca76c8d983e3df5cf153cc297eaa1fe65753fd91d", + "xgen/screens/BlocksScreen/ProductinfoPage.tsx": "cdce75c735a24cb36107dbca02d23cc2fd64de30e9486b7d8141bd8409040acd", + "xgen/screens/BlocksScreen/ProductPage.tsx": "d41bdb4583046c5d56006aff968d5fa0ec9c6a275e7c0be1d3a0206243cdb94c", + "xgen/screens/BlocksScreen/ProductsPage.tsx": "6012925835511250067fbd758079c8a125e7ba76ef79d7975a594423440d5621", + "xgen/screens/BlocksScreen/ProfilePage.tsx": "4bf6550600b8f092faa888703aa30ef04f84d278f14bae917990017a55c374f5", + "xgen/screens/BlocksScreen/ProjectsPage.tsx": "48333c9fee65e54ab047042b1fdd5618839ab47327e416fe10cf2bda6ef70a4a", + "xgen/screens/BlocksScreen/ProofPage.tsx": "8bd4291e8427fe5ba95d556e18c1c71f14c5aace9eda138a52d31ba7199210c5", + "xgen/screens/BlocksScreen/QuotesplitPage.tsx": "e6877441decba1e7a4dfa1f0300cbc1e665318efb6a1fc4e887f965ac07ebfe9", + "xgen/screens/BlocksScreen/ReviewsPage.tsx": "4f2d770535bd0d8ec7c5c670324f57d945cf2d638bd2b9238622aaaa963654fc", + "xgen/screens/BlocksScreen/ScreenHeader.tsx": "67f829ff50decff9f28cc5e59e1d9826b6da0ae80f2fbfdccad16b77514391db", + "xgen/screens/BlocksScreen/ShellPage.tsx": "fab3beb3ccbcf38dc8e497d167a1949f0442be3f77cc80ca61d4174278b2c744", + "xgen/screens/BlocksScreen/SidenavPage.tsx": "e0cd1acf4e341649c70cd03edb77d40aea34217807f79c2a40ea1108affd4acd", + "xgen/screens/BlocksScreen/SitemapPage.tsx": "f1c8a5f191f1ec24ca05466bee9d4238142d6afc603ff6d549bc18c009097c94", + "xgen/screens/BlocksScreen/SkeletonPage.tsx": "025ab7bee200c40b4846c63a9f1f943065c3e350ea0a3351d303ecd90516e3eb", + "xgen/screens/BlocksScreen/SlotsPage.tsx": "4a49d163f853428b79bc5ecda326e97a17520700768adc9301a4b7b1f13c132c", + "xgen/screens/BlocksScreen/StatsPage.tsx": "a65287c10f1678b0feee549dfae9fe7ef7d1d370ef9608f22c5e0788ca5a78ed", + "xgen/screens/BlocksScreen/StepperPage.tsx": "c0dc22a07ba0b14890c05049a5a21a9c8e86d10c4cced82b5d19e9c4830031f3", + "xgen/screens/BlocksScreen/StepsPage.tsx": "e545e5f6190e6392e4ce2e8330f4c76c0a09fdbafb4fe89c45b761eb91c9c91b", + "xgen/screens/BlocksScreen/StickyPage.tsx": "7c3b8098abcdc32875644b31509f32076fa4e9e933f5cfc2127c577c9e47defd", + "xgen/screens/BlocksScreen/StoreheroPage.tsx": "00e26c8f6f63b0a57152cb5ccf8a2a85bd5fa3afbd3ae4af407bdd1a8eaf329d", + "xgen/screens/BlocksScreen/StorytabsPage.tsx": "a0af1d58928e85a1fba4e31b62e816943d32ce9060aa9e0c6d9f297a928efda1", + "xgen/screens/BlocksScreen/SummaryPage.tsx": "1f0e6da50479c41d6e5a31858b0f095b4996593ad97d9bf96e1881a965f8a3f4", + "xgen/screens/BlocksScreen/TeamPage.tsx": "83e694ba0f401575ce49f28fa1428adb928434203b982ea4071cd476cb2664cc", + "xgen/screens/BlocksScreen/TemplatesPage.tsx": "2af62fc6fb22c05249200c26d007ebda632d3fdf7cfcc7ce9adf768e7a57dcc2", + "xgen/screens/BlocksScreen/TestimonialsPage.tsx": "61646dc8356b363dbe5246d2db35e65a1cf56cca3a52a55bda208c3b8b4ce528", + "xgen/screens/BlocksScreen/TimelinePage.tsx": "ee7f2086e7686e2e0b0c2838cb62fb0dd9acdb8ddb021bbec64b174410124af4", + "xgen/screens/BlocksScreen/TourPage.tsx": "089c223b9547a9abb4692b9c1bdc34fc68fca401d6e5df5ecb90bd9cc4f55a9f", + "xgen/screens/BlocksScreen/UsagePage.tsx": "d5426ea0d8038fdf036940a94c9703e06de0715db0130f4d185847395c0f9aed", + "xgen/screens/BlocksScreen/UspPage.tsx": "4d023374951d1fc206ddb3690548a69a7e852ba8fb26be210101ce5ebe18e680", + "xgen/screens/BlocksScreen/VideomodalPage.tsx": "206cddbd3015aba555236024a26a8d7c4bbbd929c2f3c4d31badc8cfc64a3f6b", + "xgen/screens/BlocksScreen/VideosPage.tsx": "32325df27a5e3558521773b9908f69a8731e83d05d1f288f0195da43ce9225f6", + "xgen/screens/BlocksScreen/WizardPage.tsx": "a0ed85e2848d34a6b26e7e453e50d38d4fb7049563d68eeb26292abe93a37e35", + "xgen/screens/BlocksScreen/ZonesPage.tsx": "2950551e5852653ad694ffbca146a138198bab4d5adb1035d9d2089cd35b2b1e", + "xgen/screens/CatalogScreen.tsx": "3a7e625e084e417f08142e28b9b6fcfa05d2fc3e18217b02bda1c472ea055300", + "xgen/screens/CatalogScreen/AppAuthPage.tsx": "a3d3d4de213c46258ff250e12fbc44233d40094eb4a5c66359e848a2202638e0", + "xgen/screens/CatalogScreen/AppAuthPagesPage.tsx": "4395d6b46ac98a80cc9e7127c1a27fe8984f96b83d696cfb871faea7bb456ca6", + "xgen/screens/CatalogScreen/AppBoardsPage.tsx": "82ed0351377c5231ec829235b789b63bb1538d7b66d65c7182b8e3e312c49813", + "xgen/screens/CatalogScreen/AppDashboardShellsPage.tsx": "12a8522123e177836d407d8b8fff5bb7772c10bbc99ca18b219b383ac2a99807", + "xgen/screens/CatalogScreen/AppGuidancePage.tsx": "b0e50ba65efab6ba924c5f0972389ab156b2b71b5afe64391c28fad94d28b094", + "xgen/screens/CatalogScreen/AppOnboardingPage.tsx": "f6c9c678ace1649799e124cd6dffc1ed0b14d6d48cf2e669df14359e0fa69aa8", + "xgen/screens/CatalogScreen/AppSettingsPage.tsx": "80123ae0b59f971f8127325324cffaeb4070684a270a7892794db74d1ad5e683", + "xgen/screens/CatalogScreen/AppShellPage.tsx": "05a55cee61aab5c4d051ea9ccedc9bbf18cc3f6c8f46e36153da62f58ca2d2e4", + "xgen/screens/CatalogScreen/AppStatesPage.tsx": "d4ab42d292c89d9a26b530b4b7c568b07a064d5c6ac2ccef28a36e0833f1716d", + "xgen/screens/CatalogScreen/AppWidgetsPage.tsx": "4b87a9d66d92d98f025d005f36bda19bca03fb01bed837ccbd2828902f1ebad3", + "xgen/screens/CatalogScreen/CommerceCartPage.tsx": "ec65d1be6a729aa1eff538163b48b3f17d65c286ff399f2e7a6069f43d0b2403", + "xgen/screens/CatalogScreen/CommerceCategoriesPage.tsx": "ecdb05e5c5839978dfe7a2f3e75bf303efcc07a1d995002f072d6a1bf92bd40b", + "xgen/screens/CatalogScreen/CommerceCheckoutPage.tsx": "c1e9da5e68a299e625ca4b369fd244bb541628f3f73f8f16d8eb6bc8745ceb22", + "xgen/screens/CatalogScreen/CommerceDeliveryPage.tsx": "cc839def81f615ad02c1a16cce67d8eeca48502fb0a3f792fc3ed0529956d848", + "xgen/screens/CatalogScreen/CommerceOrdersPage.tsx": "f8dd0bfc37d6963bce138bc0c35d4c7264b67faba308bedd3ff04950e0474162", + "xgen/screens/CatalogScreen/CommerceProductPage.tsx": "f2d53a2a84586574d4fa576f8e9d327a8bebc1b1968fa25e0a0f394e1572d654", + "xgen/screens/CatalogScreen/CommerceProductsPage.tsx": "2d5332833741aa393a94dabb3d4bb3d59b878d4425303e6a0e4a021ac89f2569", + "xgen/screens/CatalogScreen/CommerceStorefrontPage.tsx": "00917f09a92c6b6e4341583db5876c5d48f395dfa266c7cda88be0d99676b267", + "xgen/screens/CatalogScreen/ContentArticlePage.tsx": "e713b22f42e0fe77d1dd035b64520f7ba338dfaf410a0945015d940224c4d5a6", + "xgen/screens/CatalogScreen/ContentBlogPage.tsx": "41b62402825f50c7cfae44168c7375dd1d196d7baa966ebcaff0ecf7ee19d0a8", + "xgen/screens/CatalogScreen/ContentPostHeaderPage.tsx": "6dd326e86b8d917c2fb2b0e8a4e2e2ff8a0113510a6a5ae9f9376f643f2c01e8", + "xgen/screens/CatalogScreen/ContentPostHeaderSplitPage.tsx": "38fb2ef7f147bc8319f0ed3621504c7f3f1b80fa7304c91d4fcefe0c9b4c76e5", + "xgen/screens/CatalogScreen/ContentPostShowcasePage.tsx": "d9223fae6462bd6fda8dd478e9527da0280d771f8da34a94c1da3bf0365a9d93", + "xgen/screens/CatalogScreen/ContentStoryTabsPage.tsx": "38ab7d937b60590ca92da103f0e28f89734379232de462ffc6e6ecca560ec7fd", + "xgen/screens/CatalogScreen/ContentTimelinePage.tsx": "37ea2f5616843ae11d6d1d79fa311c3d67d266b52006d37bcb3f88240965a6fd", + "xgen/screens/CatalogScreen/IndexPage.tsx": "731dc261e96745f5d0f39dd5ae9b7ff55c255323d3a9c912ba3a84953a0bd3f9", + "xgen/screens/CatalogScreen/MarketingAboutPage.tsx": "8c5850b32b58b6334b3e968fea48682f75e1dc3a074445ce13c14982d7ec29e9", + "xgen/screens/CatalogScreen/MarketingCareersPage.tsx": "cf6746fb828a7e98dfbc88c4a4fe3121136f262dc0fc2aab22504de162f18618", + "xgen/screens/CatalogScreen/MarketingCtaPage.tsx": "a821a6ba70d628b4d28fbd7290adde2860971ff2cebd38f86f87ea3195655b54", + "xgen/screens/CatalogScreen/MarketingCtaProofPage.tsx": "a863b79701f27650ad69c418003a768d6ff59c1522994789abf502329b8a7974", + "xgen/screens/CatalogScreen/MarketingFaqPage.tsx": "c07d88242e7f93b9876b5d04f55798bdfa9d2150e29e962336327589ef49f7c3", + "xgen/screens/CatalogScreen/MarketingFeatureCardsPage.tsx": "dea03e6591541a1f601994003774e56fda9e1b53a7c6462dab30f262db4e573c", + "xgen/screens/CatalogScreen/MarketingFeaturesPage.tsx": "18f84cec863550531e759a379b359e9f101b6903d6bec946f4ef38acdcbcb236", + "xgen/screens/CatalogScreen/MarketingFeaturesSplitPage.tsx": "c930ae3f428939ad8f2b7c61e70b1dc544e6c787312f1863cfb61a76c1655ab4", + "xgen/screens/CatalogScreen/MarketingFooterPage.tsx": "bb75ab88ff183e2328c9028c1b80d5dbb3cad56a82fb300b42c5d74fa866a1ed", + "xgen/screens/CatalogScreen/MarketingFooterSplitPage.tsx": "c74231167792eb105b0f8fe1df95812992a2df04acf5ad43ab6da02799bb3471", + "xgen/screens/CatalogScreen/MarketingGalleryPage.tsx": "5cdcfdb9520d4c7ef45d5d0e96f51ba2ca3d918f77bd484f65fd4ec02bf3e019", + "xgen/screens/CatalogScreen/MarketingHeroPage.tsx": "7e6ac3584baf194d9c23b967b55b4b268f6e0cef7bc1856388ef7779fb0a75ae", + "xgen/screens/CatalogScreen/MarketingHeroSplitPage.tsx": "3707898cf9ec7f2c4b7f1101be396eae2175f2bc357596b167f31236ecf6c055", + "xgen/screens/CatalogScreen/MarketingHowItWorksPage.tsx": "853876bf6a16131d4ba34aa2ecce65ca19b150ed8e18fae43b5ab454b2adebd9", + "xgen/screens/CatalogScreen/MarketingMediaListPage.tsx": "d265c06d2b20b73e0265e7849c73f4755a43e0f294f2c8b4cc45b0c049c6039f", + "xgen/screens/CatalogScreen/MarketingNavigationPage.tsx": "6f646ffcabee9786460e5d6a687a5959d7a5ac3cfe2a9b53600e3672b6c68054", + "xgen/screens/CatalogScreen/MarketingPageHeadPage.tsx": "37f4d9c42f8003580f9c0ab5e61754a46d3e31a25037163e4456a7d2c46f9e93", + "xgen/screens/CatalogScreen/MarketingPageTrailPage.tsx": "013c3ea2c9bbcd13dbc74af7c43b8050253bf5738cc2e723fba70fb351da9584", + "xgen/screens/CatalogScreen/MarketingPortfolioPage.tsx": "eb059d641e88b9ab81be7704ebfae57c0a01d2a9eedd8aef2f14e99f9daf5c1b", + "xgen/screens/CatalogScreen/MarketingPricingPage.tsx": "6de9a7ba1b5bf07e3b2d925e6dffa803e3a5be861dc679ccb4f6c439a39604c6", + "xgen/screens/CatalogScreen/MarketingPricingToolsPage.tsx": "877867d282b6641ae75b9b9783392da7c243038f60c834a0c6efa23b60237717", + "xgen/screens/CatalogScreen/MarketingProofPage.tsx": "cefaabf58d58b932227b5e072675aa7a9163a5edc4116aa3272dcde4e085cba0", + "xgen/screens/CatalogScreen/MarketingShowcasesPage.tsx": "213d9556cb3f4edacfa2c6ffa0cc1727038229eadbb461247c25fdcf596f774d", + "xgen/screens/CatalogScreen/MarketingStatsPage.tsx": "bc471fc487d4ae744b16f8d956419bbad3a2deddbd724ccb6c4b7c6f1316f2bb", + "xgen/screens/CatalogScreen/MarketingTeamPage.tsx": "9fa4b1663e3d5495f9ce78ff3a998ef40d00e37ad66c26a03d69088221770429", + "xgen/screens/CatalogScreen/MarketingTestimonialsPage.tsx": "5070bb19277cca7849605e018784fe9f5afe51c6467fa636817605793215b537", + "xgen/screens/CatalogScreen/MarketingTestimonialsSplitPage.tsx": "29d350ce7d491e2dc8bc52c53949abc7dbcf43a3cb746988bc373a7cd4c7a303", + "xgen/screens/CatalogScreen/NotfoundPage.tsx": "15328c323c8630f403b915c2073d6b6da8974b90599a81acd652e2f0d2c26334", + "xgen/screens/CatalogScreen/PageCartPage.tsx": "e6b0401b84836bde65957a8180d14dbe46c745c5dd66795a27c3fce05fb90fe9", + "xgen/screens/CatalogScreen/PageCheckoutPage.tsx": "f1d6d013c4a318b908bd024aa0d4e992449d00f3311620493c2ab9abf622e905", + "xgen/screens/CatalogScreen/PageCompanyPage.tsx": "ea0778e8c2728e9f1c31bd2b33533e7c25593d70c06437c26c65ce6a1b588f69", + "xgen/screens/CatalogScreen/PagePortfolioPage.tsx": "1bd1f5617544dae9cc42a4b74180d7198afc4d8eadf35fe46230671cab467563", + "xgen/screens/CatalogScreen/PageProductDetailPage.tsx": "d3e5f6227027a0eb1d702c7b06518b4e78362c97ef0170617d1b98329ee4992f", + "xgen/screens/CatalogScreen/PageSaasLandingPage.tsx": "6c7a382ec21060860cae9850db08d802a40f3cd3194f75b83f5f35a70ce67652", + "xgen/screens/CatalogScreen/PageShellClassicPage.tsx": "801b70987b282c709bdb013960b782b7a676693aa4ddf2ada86c576ca2a0b699", + "xgen/screens/CatalogScreen/PageShellCollapsedEndPage.tsx": "096b29319e2d39d614809c3b1d9a8dcc3e99900b46fc3a2c158b7d5f7554e18b", + "xgen/screens/CatalogScreen/PageShellCollapsedPage.tsx": "a767b4ae8b49effdac5992046136f45adb7953b0855a19f2ed0b176d255b12f6", + "xgen/screens/CatalogScreen/PageShellEndPage.tsx": "c349270bf58f995f89fe04659e7eb479e72d06e21fd375e6a6877e068dec2e6e", + "xgen/screens/CatalogScreen/PageShellInsetPage.tsx": "9a7ae7e3e5434a3b8ca7d658c3e55af6e50517422bc61413a35ee5e3a9efb36c", + "xgen/screens/CatalogScreen/PageShellRailEndPage.tsx": "24e0b20cc3e764727f9b47dd26f8612b8983097479af7c0f2cda0c5e61473644", + "xgen/screens/CatalogScreen/PageShellRailFooterPage.tsx": "208f6ac90f1e3ce4fabd7740c5b9fe60836d1d27fcc4f6ea3670afdc70674cad", + "xgen/screens/CatalogScreen/PageShellRailPage.tsx": "0fd4c0e4eb85cc0a53792c3d1673a2a25f95c6f1fee33ea480352d6cc7c7e693", + "xgen/screens/CatalogScreen/PageShellSideOnlyPage.tsx": "5ad37a6731d1b5ac5aaf99e920cf3e818b02f46bbc7aebc65967c00cd96ef700", + "xgen/screens/CatalogScreen/PageShellTopOnlyPage.tsx": "450d3676e9c512f1b968580fe24eb87065f083bd4da4d9c4664267e7a264f05b", + "xgen/screens/CatalogScreen/PageShellTwoLevelFullPage.tsx": "94ba3774c8981e75169c580778e6e3b9feeed559e65acd79e75810ae40cfc37c", + "xgen/screens/CatalogScreen/PageShellTwoLevelPage.tsx": "4383e53b01daf096b21eb42ce1c786bdc0784ee03cfa78c38b77791000403f6f", + "xgen/screens/CatalogScreen/PagesPage.tsx": "63b1ca421e24c03e3ca66fe9a366a1f9680732288e8e4eab954a40de7bdd2a5c", + "xgen/screens/CatalogScreen/PageStoreCatalogPage.tsx": "cb95560b4be97973173528bd5692993a04386dc5ae037ce0b4ea4f43b39d7e42", + "xgen/screens/CatalogScreen/PageStoreHome2Page.tsx": "5c6d437feea447348535caa42784085e8f5754eb3dacaaf2095d0e4e1c672883", + "xgen/screens/CatalogScreen/PageStoreHomePage.tsx": "0918b4de71fa080d0805a3493b4e952647403c250b8f7ee6d0a5998654919cb3", + "xgen/screens/CatalogScreen/PromoBannersPage.tsx": "46a027321dff2e9dde49fdb2c1e2b2b84a60f81165f40912af5f44f5513d18d4", + "xgen/screens/CatalogScreen/PromoNewsletterPage.tsx": "7eddc9b7de6ae4522914baa1c542c119d7ada9f65c1952cc508ffa0d76ef862c", + "xgen/screens/CatalogScreen/ScreenHeader.tsx": "a5543f72d51b20a8bcfe3843c3e9673756d560216f49c1b4e9c81af02ddae269", + "xgen/screens/CatalogScreen/SupportContactPage.tsx": "1747f99ecaf275c7d4faab4f672b42d4a3c8fea06d31c7c985a32232a9b47605", + "xgen/screens/CatalogScreen/SupportStatesPage.tsx": "eda3bd65d055fbfa2e055f0f046293b77e3797b732d22c6936277470cd71a1ec", + "xgen/screens/PlansScreen.tsx": "d6e2043ffbfed100eec4d974e6ff2924d20f6347aba5870483b3e66263058bf3", + "xgen/screens/SiteScreen.tsx": "6b800522e9cc8c921fc76009f10d5b5e4f7b0e53d9cd4202cacf21afe50fae47", + "xgen/screens/SkinsScreen.tsx": "01584e484aa585eec449191159642f7b73b28ddf5296faf08a3fbe0823b4dfbe", + "xgen/screens/SkinsScreen/IndexPage.tsx": "4e915b59ce42dc13842d618dfee0935aff651e57a0e63731b9c497eef4aff714", + "xgen/screens/SkinsScreen/NotfoundPage.tsx": "fe5cb806a7292865b48dc41da02f8b25a8d4a7745d6f047e19b984d63921e1ea", + "xgen/screens/SkinsScreen/ScreenHeader.tsx": "b8f411bdab96230ed31e874cdd7516c6ea52fabdb7a9d398426a8f768749c2d2", + "xgen/screens/ThemeAccountPortalScreen.tsx": "dc809c07e0ad65b6b199a699874394a21c367aef2ae7534d25f4d2c39bf66427", + "xgen/screens/ThemeAccountPortalScreen/CardsPage.tsx": "950e23146b76881632656c29af8bec0f1b7356dd7a3cdec4ee9aacab286d3d0f", + "xgen/screens/ThemeAccountPortalScreen/HomePage.tsx": "4ff7bb6445ad127e9b70342cd553f4d41a99ababb27e3870f82683ffa3eb574a", + "xgen/screens/ThemeAccountPortalScreen/JoinPage.tsx": "5b3a084a7d9409638cbfa91913ec360c6f4eae4d99925db488e5f78ae154c933", + "xgen/screens/ThemeAccountPortalScreen/MagicPage.tsx": "44ee288ec5701a0a8fce546a6fea1c910b009ea56b07c793aa21335a8c13168a", + "xgen/screens/ThemeAccountPortalScreen/MinimalPage.tsx": "d6c4a67a585f912d52d79667e7d0358b7fb614374fe08bff889f80321f2dfe5f", + "xgen/screens/ThemeAccountPortalScreen/OptionsPage.tsx": "c6931ab898b82075dd88abea1c7417dfe3cab51024f7a76778bacab315f1d9eb", + "xgen/screens/ThemeAccountPortalScreen/ProfilePage.tsx": "21b527f747ad5e8fae122dbad46997f75d29518cad74adf1bf0bfda2acc8ea3e", + "xgen/screens/ThemeAccountPortalScreen/ResetPage.tsx": "e285b6b1e97ab34d391abb3c94e6c831574b7ab837027088ee44544dd3cac395", + "xgen/screens/ThemeAccountPortalScreen/SignupPage.tsx": "66a67dfd00a72d1cbe952787db2a7d04c6a595ef89a218a3ca60ef2250cf9910", + "xgen/screens/ThemeAccountPortalScreen/StartPage.tsx": "a2620ca806c77dbe2ae67fee1eee65beec6046a7b5e3773c066ec861f9f801db", + "xgen/screens/ThemeAccountPortalScreen/WelcomePage.tsx": "c11615ad908aeb4e503d1e090ce7e50ff73572e2d89d66bc62bce46fbfe1547f", + "xgen/screens/ThemeCommerceShopScreen.tsx": "b48abf4539944d1a90485efc44dd1510aae69cd133d8cbcae830c9e851c382c5", + "xgen/screens/ThemeCommerceShopScreen/BrowsePage.tsx": "aaba938de77feb99779481a853fd34e5d45b9cc46d74c697d36400733ad75d3c", + "xgen/screens/ThemeCommerceShopScreen/CartPage.tsx": "2a10a017c03638658c131ea58ca925ac4bf2f09c600f85280064339f2ac90340", + "xgen/screens/ThemeCommerceShopScreen/CatalogPage.tsx": "307d67db8cbd1955dd267aeef448e8165ec5b4f02d8ef5523be7be5c1f3718fe", + "xgen/screens/ThemeCommerceShopScreen/CheckoutPage.tsx": "ad9d99bb0e2dc1392f75ae1fc9f4550b50a01720d25086216c32553f5a1f5d26", + "xgen/screens/ThemeCommerceShopScreen/DeliveryPage.tsx": "6353eab59bbbc9476493bb4a6a6ed7c99adb7cd453e007e5315adddeaa7c46d3", + "xgen/screens/ThemeCommerceShopScreen/HomePage.tsx": "ebb2e28da15305f4a3510a7819e19a9a745f3ba3f998ac55208e1d105fd0195e", + "xgen/screens/ThemeCommerceShopScreen/OffersPage.tsx": "e99ecc3a590a32d96f13d578c9bc123252f29a1b3d7bb3f824bff9ce4d781bfa", + "xgen/screens/ThemeCommerceShopScreen/OrdersPage.tsx": "9cd47d90b466f16ab82f61ac39f87c9dc73a978670570848747096bc94d22afa", + "xgen/screens/ThemeCommerceShopScreen/ProductPage.tsx": "40be027781f199043918c846c6f780dcf751cd8444605ccc357c2e94cf669509", + "xgen/screens/ThemeContentBlogScreen.tsx": "c8b2c183832e3d48a1d38398665805eccc5664ec0eca51782d6369e8660328fd", + "xgen/screens/ThemeContentBlogScreen/ArchivePage.tsx": "214bd5024d9d5c0e805a86f8772465a89b82ba2afbbe79761058b8a0c04f4347", + "xgen/screens/ThemeContentBlogScreen/ArticlesPage.tsx": "a721b5d7efceaa88de23b5a4b21143ea5e04637c1039c76d61aad78f20a2e808", + "xgen/screens/ThemeContentBlogScreen/EssayPage.tsx": "7863508aa6eaaaa94828081c7ceffc8818f96cfa865fa501dd9bee659993d620", + "xgen/screens/ThemeContentBlogScreen/HomePage.tsx": "e1e155be7ed22c1def83219a9da7b9219dfa5b1baa9a8c9f34bf4b5b0d0347e2", + "xgen/screens/ThemeContentBlogScreen/PlainPage.tsx": "4c9268c9ffa9852e9a6d9eaee9de1859d77a8256b9701f5354cf0507ae61fa9b", + "xgen/screens/ThemeContentBlogScreen/PostPage.tsx": "e1f9e3d4a81f8d0ea400109385fef31de0b1dbcdd0837611caa1fef01e9b6593", + "xgen/screens/ThemeContentBlogScreen/StoryPage.tsx": "64378a3699b1ec0403fc0ed56d388ba52c48c5d917cff1f8afb6f73ad457b2e8", + "xgen/screens/ThemeDashboardConsoleScreen.tsx": "f02e3b9c95a9d05cff0ecf516260f462a4dd5164c20ad93b2a42acfe8ba517eb", + "xgen/screens/ThemeDashboardConsoleScreen/BoardPage.tsx": "f92e599682c59f94ad94de0c26feb88c04d4c1767a8de62368c792718cd885ba", + "xgen/screens/ThemeDashboardConsoleScreen/HomePage.tsx": "a4dc07eefa79904d2c552599d4129b5eb8f55fb5881c1df8ce3795b16409967d", + "xgen/screens/ThemeDashboardConsoleScreen/LayoutsPage.tsx": "c85b96dd0bdf3ab0e8105c3907f6342d717e14e75c2ffbcbf99c62cd04794b50", + "xgen/screens/ThemeDashboardConsoleScreen/ShellsPage.tsx": "622e84761466054c05c57908bd544ed013997e5f6d1175822e7b50b5955b8d66", + "xgen/screens/ThemeDashboardConsoleScreen/StatesPage.tsx": "a9c16ee205c968bf9ead8549e13e8b6eacc4398421d7315d178b0fa9428f1808", + "xgen/screens/ThemeDashboardConsoleScreen/WorkspacePage.tsx": "51334723c1c98dd34fd6177c4428df36542f2e889ed6e778f7c274e48f7706e5", + "xgen/screens/ThemeMarketingLandingScreen.tsx": "5f2c121ac075b42f0a5a03d40db5b6efb54b32d1516f05c15d53c6d0fd0dca97", + "xgen/screens/ThemeMarketingLandingScreen/CompanyPage.tsx": "54e6e8a995998236e834086a1f868ca9612d72071cd2dd15082d4deda04d23fa", + "xgen/screens/ThemeMarketingLandingScreen/DevelopersPage.tsx": "3e5bfdd0b5b5c75ecef64f31a77c05fb3eaa5526b84644fd37b43eaf8b75a2c6", + "xgen/screens/ThemeMarketingLandingScreen/EventsPage.tsx": "05b4ea2578f79e1566d8b06cec51e3bcbda99f53469627f9f882d84b3135013f", + "xgen/screens/ThemeMarketingLandingScreen/HomePage.tsx": "a61bc96e966bf5c47d17409841f93e35f25814403cb8eb77104509e948a2ccf0", + "xgen/screens/ThemeMarketingLandingScreen/LaunchPage.tsx": "a91cc2dbe1f7b0e44807b28dde0f08bf926360b67441c23a11d975187ed31bbf", + "xgen/screens/ThemeMarketingLandingScreen/StudioPage.tsx": "3b2e67b217e059e7244eee6d9e757be7daa99052a932140bf40e43e4ebf261c8", + "xgen/screens/ThemeMarketingLandingScreen/TeamsPage.tsx": "99cb1a31b6e9b4bba2a689cab3b67c29ea430d597237d4c8ee620517a893cceb", + "xgen/screens/ThemeMarketingLandingScreen/WorkPage.tsx": "296cafc6873317adc735d1311071edefb41c2471573155dfc566a32b1aa27573", + "xgen/screens/ThemeMarketingPricingScreen.tsx": "ef278c7a97e2936b50718be6b5e3e4071f402f7416bae75b978f39f280c0a5df", + "xgen/screens/ThemeMarketingPricingScreen/ComparePage.tsx": "cde4c28ac384bbda898db76e9323fcfaabc3642377ad40d2e60c3e9d559ce789", + "xgen/screens/ThemeMarketingPricingScreen/HomePage.tsx": "65bdf54f03e8ec1a3ccc6c778635c5b140440714c4a40d5e8d3a9d1dc6b9b28f", + "xgen/screens/ThemeMarketingPricingScreen/PlansPage.tsx": "48871324d706356803bba983fb4f64d99e56b6cebf86b31de47f51454d5901a4", + "xgen/screens/ThemeMarketingPricingScreen/UsagePage.tsx": "4fd0158cbd1c2e83318837b40deb38e3dfb519a4b9bfba88a28ba5ee0cb67e8a", + "xgen/screens/ThemeMarketingProductScreen.tsx": "2292472c7594329df9784ddfda828b07696e2dc30818d5bb8d46086e303dce02", + "xgen/screens/ThemeMarketingProductScreen/CapabilitiesPage.tsx": "70aa3fe5f2e489280a4539d009907b9e3f3591c1fc0cb60377dc2de65c0fef6f", + "xgen/screens/ThemeMarketingProductScreen/HomePage.tsx": "e1e5a65a775b389e9a56d267ca2776515dfb64f7ac1fd661cef732a22c1bad3a", + "xgen/screens/ThemeMarketingProductScreen/NavigationPage.tsx": "0de3358d31b2e470baa2d93c6db0298751c05244e43aa799d92729a4289aee13", + "xgen/screens/ThemeMarketingProductScreen/TourPage.tsx": "f62f48c701a9bf15fb75915c4ad4491575f1636d7e24eee72441cc5755741f17", + "xgen/screens/ThemeOnboardingFlowScreen.tsx": "9cd5de6526c0a3a0ad82235ec5f9405f1e44b69cfee4f722eb6d2bc0472239fc", + "xgen/screens/ThemeOnboardingFlowScreen/HomePage.tsx": "d4144726eefd9163e590f662ef16f4baae9314fd6e69170da50ffb647c50b228", + "xgen/screens/ThemeOnboardingFlowScreen/SetupPage.tsx": "c20311204e7baea2a518ba011d2a200506769c3236bc2b822117aab4bcad9805", + "xgen/screens/ThemeOnboardingFlowScreen/TourPage.tsx": "5af3d1132b12f53d417594e70f8fc3c9490ed8a74900fb92c0932f6439f6fbf7", + "xgen/screens/ThemeOnboardingFlowScreen/WelcomePage.tsx": "a186182d75cdaadc60232f3a71615c990bae799d28ea5c5fac7a40018c00db62", + "xgen/screens/ThemePromoCampaignScreen.tsx": "8124fba7ec942ad1fd386f7415b1d320cec1c55394755604ebc6484cde574331", + "xgen/screens/ThemePromoCampaignScreen/HomePage.tsx": "62088412103dafb1a46a7de4c1cb3be6d401f7964c88fed292762532d90044af", + "xgen/screens/ThemePromoCampaignScreen/LaunchPage.tsx": "615e87d2f790ef161b5f8ac8698fb0afe2b42fd12e40685c1622e2eb00245fc0", + "xgen/screens/ThemePromoCampaignScreen/NoticesPage.tsx": "35fe684f574559e43eb53bbd6220ddd1c5dc9530bf9d7a36feb47b2c6e818a5c", + "xgen/screens/ThemePromoCampaignScreen/OfferPage.tsx": "7e2a486c02fb46b1fff3daa5c5eb0e81b6a15fdaf294b179f0101fe54b47ed7c", + "xgen/screens/ThemeSupportCenterScreen.tsx": "3d50318168c92fe53853330874087985bc0bfb4826ed853f2a97ee08db62d350", + "xgen/screens/ThemeSupportCenterScreen/ContactPage.tsx": "ef168ec6fe5393e08c3bc9f526f352dab4685ccd6d9084cb57521035e0b06a27", + "xgen/screens/ThemeSupportCenterScreen/FaqPage.tsx": "07df473609633a62a93fdcf585e7f905414767280422268337fbf3c15cf03993", + "xgen/screens/ThemeSupportCenterScreen/HomePage.tsx": "5300263d6011e9c89de8b3f8300bc839644e8c28cc36d3abd684a13caa309f91", + "xgen/screens/ThemeSupportCenterScreen/MissingPage.tsx": "96f3d0f73988050f7689763ac4980e83a502f16be2dbbf400c062c6f5d0db56e", + "xgen/screens/ThemeSupportCenterScreen/MovedPage.tsx": "dcc7df8cf8027e7baf1409b8378a2a7212ca9fa9120bd026aa9a998df940b304" + } +} diff --git a/apps/host-react/xgen/App.tsx b/apps/host-react/xgen/App.tsx new file mode 100644 index 0000000..3118bdf --- /dev/null +++ b/apps/host-react/xgen/App.tsx @@ -0,0 +1,39 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/runtimes/react/src/app.ts (settings: apps/host-react/xgen.app.json) +import { Block, Link, List, ListItem, Title } from "@ui8kit/react-ui"; +import { SCREENS } from "@ui8kit/app-shared/screens"; +import { useUrl } from "./runtime/url"; +import { ScreenOutlet, type ScreenModule } from "./runtime/ScreenOutlet"; + +/** one chunk per screen: a landing is a screen spec, not an app */ +const LOADERS: Record Promise> = { + "blocks": () => import("./screens/BlocksScreen").then((m) => ({ default: m.BlocksScreen })), + "catalog": () => import("./screens/CatalogScreen").then((m) => ({ default: m.CatalogScreen })), + "plans": () => import("./screens/PlansScreen").then((m) => ({ default: m.PlansScreen })), + "site": () => import("./screens/SiteScreen").then((m) => ({ default: m.SiteScreen })), + "skins": () => import("./screens/SkinsScreen").then((m) => ({ default: m.SkinsScreen })), + "theme-account-portal": () => import("./screens/ThemeAccountPortalScreen").then((m) => ({ default: m.ThemeAccountPortalScreen })), + "theme-commerce-shop": () => import("./screens/ThemeCommerceShopScreen").then((m) => ({ default: m.ThemeCommerceShopScreen })), + "theme-content-blog": () => import("./screens/ThemeContentBlogScreen").then((m) => ({ default: m.ThemeContentBlogScreen })), + "theme-dashboard-console": () => import("./screens/ThemeDashboardConsoleScreen").then((m) => ({ default: m.ThemeDashboardConsoleScreen })), + "theme-marketing-landing": () => import("./screens/ThemeMarketingLandingScreen").then((m) => ({ default: m.ThemeMarketingLandingScreen })), + "theme-marketing-pricing": () => import("./screens/ThemeMarketingPricingScreen").then((m) => ({ default: m.ThemeMarketingPricingScreen })), + "theme-marketing-product": () => import("./screens/ThemeMarketingProductScreen").then((m) => ({ default: m.ThemeMarketingProductScreen })), + "theme-onboarding-flow": () => import("./screens/ThemeOnboardingFlowScreen").then((m) => ({ default: m.ThemeOnboardingFlowScreen })), + "theme-promo-campaign": () => import("./screens/ThemePromoCampaignScreen").then((m) => ({ default: m.ThemePromoCampaignScreen })), + "theme-support-center": () => import("./screens/ThemeSupportCenterScreen").then((m) => ({ default: m.ThemeSupportCenterScreen })), +}; + +export function App({ screen, title }: { screen: string; title: string }) { + const url = useUrl(); + const load = LOADERS[screen]; + if (load) return ; + return ( + + {title} + + {SCREENS.map((s) => {s.key})} + + + ); +} diff --git a/apps/host-react/xgen/runtime/ScreenOutlet.tsx b/apps/host-react/xgen/runtime/ScreenOutlet.tsx new file mode 100644 index 0000000..e89b70d --- /dev/null +++ b/apps/host-react/xgen/runtime/ScreenOutlet.tsx @@ -0,0 +1,16 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/runtimes/react/src/app.ts (settings: apps/host-react/xgen.app.json) +// The outlet of the host frame: renders the screen chunk behind a loader (one lazy component per loader, cached). +import { lazy, Suspense, type ComponentType, type LazyExoticComponent } from "react"; +import type { UrlPort } from "@ui8kit/app-shared/runtime/core"; + +export type ScreenModule = { default: ComponentType<{ url: UrlPort }> }; +type Loader = () => Promise; + +const cache = new Map>>(); + +export function ScreenOutlet({ load, url }: { load: Loader; url: UrlPort }) { + let Screen = cache.get(load); + if (!Screen) { Screen = lazy(load); cache.set(load, Screen); } + return ; +} diff --git a/apps/host-react/xgen/runtime/url.ts b/apps/host-react/xgen/runtime/url.ts new file mode 100644 index 0000000..fb11eb5 --- /dev/null +++ b/apps/host-react/xgen/runtime/url.ts @@ -0,0 +1,12 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/runtimes/react/assets/url.ts +// The URL as a port for React: the hash store of the app runtime read through useSyncExternalStore. +import { useMemo, useSyncExternalStore } from "react"; +import { createHashStore, type UrlPort } from "@ui8kit/app-shared/runtime/core"; + +const store = createHashStore(); + +export function useUrl(): UrlPort { + const snapshot = useSyncExternalStore(store.subscribe, store.getSnapshot); + return useMemo(() => ({ ...snapshot, go: store.go }), [snapshot]); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen.tsx b/apps/host-react/xgen/screens/BlocksScreen.tsx new file mode 100644 index 0000000..de9c124 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen.tsx @@ -0,0 +1,405 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +/** + * The block gallery: an index of blocks grouped by topic and one page per block with every variant, on the + * fixtures. Built from the block catalog; nothing is written by hand. + */ + +import { Block } from "@ui8kit/react-ui"; +import { IndexPage } from "./BlocksScreen/IndexPage"; +import { AboutPage } from "./BlocksScreen/AboutPage"; +import { AboutmePage } from "./BlocksScreen/AboutmePage"; +import { AccordionPage } from "./BlocksScreen/AccordionPage"; +import { BeforeafterPage } from "./BlocksScreen/BeforeafterPage"; +import { BentoPage } from "./BlocksScreen/BentoPage"; +import { ComparePage } from "./BlocksScreen/ComparePage"; +import { CreditsPage } from "./BlocksScreen/CreditsPage"; +import { CtaPage } from "./BlocksScreen/CtaPage"; +import { CtaproofPage } from "./BlocksScreen/CtaproofPage"; +import { FaqPage } from "./BlocksScreen/FaqPage"; +import { FaqsplitPage } from "./BlocksScreen/FaqsplitPage"; +import { FeaturesPage } from "./BlocksScreen/FeaturesPage"; +import { FeatureshowcasePage } from "./BlocksScreen/FeatureshowcasePage"; +import { FeaturesplitPage } from "./BlocksScreen/FeaturesplitPage"; +import { FeaturetabsPage } from "./BlocksScreen/FeaturetabsPage"; +import { FooterPage } from "./BlocksScreen/FooterPage"; +import { FootersplitPage } from "./BlocksScreen/FootersplitPage"; +import { HeaderPage } from "./BlocksScreen/HeaderPage"; +import { HeroPage } from "./BlocksScreen/HeroPage"; +import { HerosplitPage } from "./BlocksScreen/HerosplitPage"; +import { IconwallPage } from "./BlocksScreen/IconwallPage"; +import { JobsPage } from "./BlocksScreen/JobsPage"; +import { LogosPage } from "./BlocksScreen/LogosPage"; +import { MedialistPage } from "./BlocksScreen/MedialistPage"; +import { MegamenuPage } from "./BlocksScreen/MegamenuPage"; +import { NavbarPage } from "./BlocksScreen/NavbarPage"; +import { PageheadPage } from "./BlocksScreen/PageheadPage"; +import { PagetrailPage } from "./BlocksScreen/PagetrailPage"; +import { PhotosPage } from "./BlocksScreen/PhotosPage"; +import { PlanPage } from "./BlocksScreen/PlanPage"; +import { PricingPage } from "./BlocksScreen/PricingPage"; +import { ProjectsPage } from "./BlocksScreen/ProjectsPage"; +import { ProofPage } from "./BlocksScreen/ProofPage"; +import { QuotesplitPage } from "./BlocksScreen/QuotesplitPage"; +import { SitemapPage } from "./BlocksScreen/SitemapPage"; +import { StatsPage } from "./BlocksScreen/StatsPage"; +import { StepsPage } from "./BlocksScreen/StepsPage"; +import { StickyPage } from "./BlocksScreen/StickyPage"; +import { TeamPage } from "./BlocksScreen/TeamPage"; +import { TemplatesPage } from "./BlocksScreen/TemplatesPage"; +import { TestimonialsPage } from "./BlocksScreen/TestimonialsPage"; +import { UsagePage } from "./BlocksScreen/UsagePage"; +import { VideosPage } from "./BlocksScreen/VideosPage"; +import { CartPage } from "./BlocksScreen/CartPage"; +import { CartdrawerPage } from "./BlocksScreen/CartdrawerPage"; +import { CartpagePage } from "./BlocksScreen/CartpagePage"; +import { CategoriesPage } from "./BlocksScreen/CategoriesPage"; +import { CheckoutPage } from "./BlocksScreen/CheckoutPage"; +import { DeliveryPage } from "./BlocksScreen/DeliveryPage"; +import { LocationsPage } from "./BlocksScreen/LocationsPage"; +import { OrdersPage } from "./BlocksScreen/OrdersPage"; +import { ProductPage } from "./BlocksScreen/ProductPage"; +import { ProductinfoPage } from "./BlocksScreen/ProductinfoPage"; +import { ProductsPage } from "./BlocksScreen/ProductsPage"; +import { ReviewsPage } from "./BlocksScreen/ReviewsPage"; +import { SlotsPage } from "./BlocksScreen/SlotsPage"; +import { StoreheroPage } from "./BlocksScreen/StoreheroPage"; +import { SummaryPage } from "./BlocksScreen/SummaryPage"; +import { UspPage } from "./BlocksScreen/UspPage"; +import { ZonesPage } from "./BlocksScreen/ZonesPage"; +import { AnnouncementPage } from "./BlocksScreen/AnnouncementPage"; +import { CookiePage } from "./BlocksScreen/CookiePage"; +import { NewsletterPage } from "./BlocksScreen/NewsletterPage"; +import { ArticlePage } from "./BlocksScreen/ArticlePage"; +import { PostheaderPage } from "./BlocksScreen/PostheaderPage"; +import { PostsPage } from "./BlocksScreen/PostsPage"; +import { PostshowcasePage } from "./BlocksScreen/PostshowcasePage"; +import { PostsplitPage } from "./BlocksScreen/PostsplitPage"; +import { StorytabsPage } from "./BlocksScreen/StorytabsPage"; +import { TimelinePage } from "./BlocksScreen/TimelinePage"; +import { AuthPage } from "./BlocksScreen/AuthPage"; +import { AuthpagePage } from "./BlocksScreen/AuthpagePage"; +import { ProfilePage } from "./BlocksScreen/ProfilePage"; +import { WizardPage } from "./BlocksScreen/WizardPage"; +import { ActivityPage } from "./BlocksScreen/ActivityPage"; +import { BottomnavPage } from "./BlocksScreen/BottomnavPage"; +import { ChartPage } from "./BlocksScreen/ChartPage"; +import { DashshellPage } from "./BlocksScreen/DashshellPage"; +import { EmptyPage } from "./BlocksScreen/EmptyPage"; +import { KanbanPage } from "./BlocksScreen/KanbanPage"; +import { MetricsPage } from "./BlocksScreen/MetricsPage"; +import { OverviewPage } from "./BlocksScreen/OverviewPage"; +import { ShellPage } from "./BlocksScreen/ShellPage"; +import { SidenavPage } from "./BlocksScreen/SidenavPage"; +import { SkeletonPage } from "./BlocksScreen/SkeletonPage"; +import { ChecklistPage } from "./BlocksScreen/ChecklistPage"; +import { StepperPage } from "./BlocksScreen/StepperPage"; +import { TourPage } from "./BlocksScreen/TourPage"; +import { VideomodalPage } from "./BlocksScreen/VideomodalPage"; +import { ChannelsPage } from "./BlocksScreen/ChannelsPage"; +import { ContactPage } from "./BlocksScreen/ContactPage"; +import { ErrorpagePage } from "./BlocksScreen/ErrorpagePage"; +import { NotfoundPage } from "./BlocksScreen/NotfoundPage"; +import { ScreenHeader } from "./BlocksScreen/ScreenHeader"; +import { fromCodex, matchRoute, type UrlPort } from "@ui8kit/app-shared/runtime/core"; +import { toggleTheme } from "@ui8kit/app-shared/runtime/theme"; +import { ui } from "@ui8kit/app-shared/content"; + +const ROUTES = [ + {"path":"","area":"index"}, + {"path":"about","area":"about"}, + {"path":"aboutme","area":"aboutme"}, + {"path":"accordion","area":"accordion"}, + {"path":"beforeafter","area":"beforeafter"}, + {"path":"bento","area":"bento"}, + {"path":"compare","area":"compare"}, + {"path":"credits","area":"credits"}, + {"path":"cta","area":"cta"}, + {"path":"ctaproof","area":"ctaproof"}, + {"path":"faq","area":"faq"}, + {"path":"faqsplit","area":"faqsplit"}, + {"path":"features","area":"features"}, + {"path":"featureshowcase","area":"featureshowcase"}, + {"path":"featuresplit","area":"featuresplit"}, + {"path":"featuretabs","area":"featuretabs"}, + {"path":"footer","area":"footer"}, + {"path":"footersplit","area":"footersplit"}, + {"path":"header","area":"header"}, + {"path":"hero","area":"hero"}, + {"path":"herosplit","area":"herosplit"}, + {"path":"iconwall","area":"iconwall"}, + {"path":"jobs","area":"jobs"}, + {"path":"logos","area":"logos"}, + {"path":"medialist","area":"medialist"}, + {"path":"megamenu","area":"megamenu"}, + {"path":"navbar","area":"navbar"}, + {"path":"pagehead","area":"pagehead"}, + {"path":"pagetrail","area":"pagetrail"}, + {"path":"photos","area":"photos"}, + {"path":"plan","area":"plan"}, + {"path":"pricing","area":"pricing"}, + {"path":"projects","area":"projects"}, + {"path":"proof","area":"proof"}, + {"path":"quotesplit","area":"quotesplit"}, + {"path":"sitemap","area":"sitemap"}, + {"path":"stats","area":"stats"}, + {"path":"steps","area":"steps"}, + {"path":"sticky","area":"sticky"}, + {"path":"team","area":"team"}, + {"path":"templates","area":"templates"}, + {"path":"testimonials","area":"testimonials"}, + {"path":"usage","area":"usage"}, + {"path":"videos","area":"videos"}, + {"path":"cart","area":"cart"}, + {"path":"cartdrawer","area":"cartdrawer"}, + {"path":"cartpage","area":"cartpage"}, + {"path":"categories","area":"categories"}, + {"path":"checkout","area":"checkout"}, + {"path":"delivery","area":"delivery"}, + {"path":"locations","area":"locations"}, + {"path":"orders","area":"orders"}, + {"path":"product","area":"product"}, + {"path":"productinfo","area":"productinfo"}, + {"path":"products","area":"products"}, + {"path":"reviews","area":"reviews"}, + {"path":"slots","area":"slots"}, + {"path":"storehero","area":"storehero"}, + {"path":"summary","area":"summary"}, + {"path":"usp","area":"usp"}, + {"path":"zones","area":"zones"}, + {"path":"announcement","area":"announcement"}, + {"path":"cookie","area":"cookie"}, + {"path":"newsletter","area":"newsletter"}, + {"path":"article","area":"article"}, + {"path":"postheader","area":"postheader"}, + {"path":"posts","area":"posts"}, + {"path":"postshowcase","area":"postshowcase"}, + {"path":"postsplit","area":"postsplit"}, + {"path":"storytabs","area":"storytabs"}, + {"path":"timeline","area":"timeline"}, + {"path":"auth","area":"auth"}, + {"path":"authpage","area":"authpage"}, + {"path":"profile","area":"profile"}, + {"path":"wizard","area":"wizard"}, + {"path":"activity","area":"activity"}, + {"path":"bottomnav","area":"bottomnav"}, + {"path":"chart","area":"chart"}, + {"path":"dashshell","area":"dashshell"}, + {"path":"empty","area":"empty"}, + {"path":"kanban","area":"kanban"}, + {"path":"metrics","area":"metrics"}, + {"path":"overview","area":"overview"}, + {"path":"shell","area":"shell"}, + {"path":"sidenav","area":"sidenav"}, + {"path":"skeleton","area":"skeleton"}, + {"path":"checklist","area":"checklist"}, + {"path":"stepper","area":"stepper"}, + {"path":"tour","area":"tour"}, + {"path":"videomodal","area":"videomodal"}, + {"path":"channels","area":"channels"}, + {"path":"contact","area":"contact"}, + {"path":"errorpage","area":"errorpage"}, +] as const; + +const HOME = { area: "notfound", params: {} as Record }; +const actions = { toggleTheme }; + +export function BlocksScreen({ url }: { url: UrlPort }) { + const route = matchRoute(ROUTES, url.path) ?? HOME; + return ( + <> + + + {route.area === "index" ? ( + + ) : route.area === "about" ? ( + + ) : route.area === "aboutme" ? ( + + ) : route.area === "accordion" ? ( + + ) : route.area === "beforeafter" ? ( + + ) : route.area === "bento" ? ( + + ) : route.area === "compare" ? ( + + ) : route.area === "credits" ? ( + + ) : route.area === "cta" ? ( + + ) : route.area === "ctaproof" ? ( + + ) : route.area === "faq" ? ( + + ) : route.area === "faqsplit" ? ( + + ) : route.area === "features" ? ( + + ) : route.area === "featureshowcase" ? ( + + ) : route.area === "featuresplit" ? ( + + ) : route.area === "featuretabs" ? ( + + ) : route.area === "footer" ? ( + + ) : route.area === "footersplit" ? ( + + ) : route.area === "header" ? ( + + ) : route.area === "hero" ? ( + + ) : route.area === "herosplit" ? ( + + ) : route.area === "iconwall" ? ( + + ) : route.area === "jobs" ? ( + + ) : route.area === "logos" ? ( + + ) : route.area === "medialist" ? ( + + ) : route.area === "megamenu" ? ( + + ) : route.area === "navbar" ? ( + + ) : route.area === "pagehead" ? ( + + ) : route.area === "pagetrail" ? ( + + ) : route.area === "photos" ? ( + + ) : route.area === "plan" ? ( + + ) : route.area === "pricing" ? ( + + ) : route.area === "projects" ? ( + + ) : route.area === "proof" ? ( + + ) : route.area === "quotesplit" ? ( + + ) : route.area === "sitemap" ? ( + + ) : route.area === "stats" ? ( + + ) : route.area === "steps" ? ( + + ) : route.area === "sticky" ? ( + + ) : route.area === "team" ? ( + + ) : route.area === "templates" ? ( + + ) : route.area === "testimonials" ? ( + + ) : route.area === "usage" ? ( + + ) : route.area === "videos" ? ( + + ) : route.area === "cart" ? ( + + ) : route.area === "cartdrawer" ? ( + + ) : route.area === "cartpage" ? ( + + ) : route.area === "categories" ? ( + + ) : route.area === "checkout" ? ( + + ) : route.area === "delivery" ? ( + + ) : route.area === "locations" ? ( + + ) : route.area === "orders" ? ( + + ) : route.area === "product" ? ( + + ) : route.area === "productinfo" ? ( + + ) : route.area === "products" ? ( + + ) : route.area === "reviews" ? ( + + ) : route.area === "slots" ? ( + + ) : route.area === "storehero" ? ( + + ) : route.area === "summary" ? ( + + ) : route.area === "usp" ? ( + + ) : route.area === "zones" ? ( + + ) : route.area === "announcement" ? ( + + ) : route.area === "cookie" ? ( + + ) : route.area === "newsletter" ? ( + + ) : route.area === "article" ? ( + + ) : route.area === "postheader" ? ( + + ) : route.area === "posts" ? ( + + ) : route.area === "postshowcase" ? ( + + ) : route.area === "postsplit" ? ( + + ) : route.area === "storytabs" ? ( + + ) : route.area === "timeline" ? ( + + ) : route.area === "auth" ? ( + + ) : route.area === "authpage" ? ( + + ) : route.area === "profile" ? ( + + ) : route.area === "wizard" ? ( + + ) : route.area === "activity" ? ( + + ) : route.area === "bottomnav" ? ( + + ) : route.area === "chart" ? ( + + ) : route.area === "dashshell" ? ( + + ) : route.area === "empty" ? ( + + ) : route.area === "kanban" ? ( + + ) : route.area === "metrics" ? ( + + ) : route.area === "overview" ? ( + + ) : route.area === "shell" ? ( + + ) : route.area === "sidenav" ? ( + + ) : route.area === "skeleton" ? ( + + ) : route.area === "checklist" ? ( + + ) : route.area === "stepper" ? ( + + ) : route.area === "tour" ? ( + + ) : route.area === "videomodal" ? ( + + ) : route.area === "channels" ? ( + + ) : route.area === "contact" ? ( + + ) : route.area === "errorpage" ? ( + + ) : ( + + )} + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/AboutPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/AboutPage.tsx new file mode 100644 index 0000000..82a3b04 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/AboutPage.tsx @@ -0,0 +1,146 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The about page of BlocksScreen. + +import { + AboutCompany, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { values as valuesEntries } from "@ui8kit/app-shared/data/values"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const VALUES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const values = fromCodex(valuesEntries, VALUES_FIELDS, CODEX); + +export function AboutPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.about} + + + {ui.blocks.docs.about} + + + + + {ui.blocks.variants.about.split} + + + + + + + + {ui.blocks.variants.about.stacked} + + + + + + + + {ui.blocks.variants.about.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/AboutmePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/AboutmePage.tsx new file mode 100644 index 0000000..91b2c05 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/AboutmePage.tsx @@ -0,0 +1,184 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The aboutme page of BlocksScreen. + +import { + AboutMe, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Skill, + type Spec, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { profilefacts as profilefactsEntries } from "@ui8kit/app-shared/data/profilefacts"; +import { skills as skillsEntries } from "@ui8kit/app-shared/data/skills"; + +const PROFILEFACTS_FIELDS = {"id":"id","label":"title","value":"metadata.value.value"} as const; +const SKILLS_FIELDS = {"id":"id","label":"title","level":"metadata.level.value"} as const; + +const profilefacts = fromCodex(profilefactsEntries, PROFILEFACTS_FIELDS, CODEX); +const skills = fromCodex(skillsEntries, SKILLS_FIELDS, CODEX); + +const ABOUTME_ACTIONS = { mode: "two", cta: ui.company.aboutMe.cta, href: "#/work", secondary: ui.company.aboutMe.more, secondaryHref: "#/contact" } as const; + +export function AboutmePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.aboutme} + + + {ui.blocks.docs.aboutme} + + + + + {ui.blocks.variants.aboutme.facts} + + + + + + + + {ui.blocks.variants.aboutme.factsEnd} + + + + + + + + {ui.blocks.variants.aboutme.skills} + + + + + + + + {ui.blocks.variants.aboutme.skillsMuted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/AccordionPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/AccordionPage.tsx new file mode 100644 index 0000000..5450d67 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/AccordionPage.tsx @@ -0,0 +1,162 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The accordion page of BlocksScreen. + +import { + Block, + Box, + Container, + FeatureAccordion, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; + +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); + +export function AccordionPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.accordion} + + + {ui.blocks.docs.accordion} + + + + + {ui.blocks.variants.accordion.first} + + + + + + + + {ui.blocks.variants.accordion.closed} + + + + + + + + {ui.blocks.variants.accordion.media} + + + + + + + + {ui.blocks.variants.accordion.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ActivityPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ActivityPage.tsx new file mode 100644 index 0000000..6529a80 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ActivityPage.tsx @@ -0,0 +1,168 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The activity page of BlocksScreen. + +import { + ActivityFeed, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Event, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { activity as activityEntries } from "@ui8kit/app-shared/data/activity"; + +const ACTIVITY_FIELDS = { + "id": "id", + "title": "title", + "text": "metadata.text.value", + "time": "metadata.time.value|ago", + "tone": "metadata.tone.value", +} as const; + +const activity = fromCodex(activityEntries, ACTIVITY_FIELDS, CODEX); + +export function ActivityPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.activity} + + + {ui.blocks.docs.activity} + + + + + {ui.blocks.variants.activity.timeline} + + + + + + + + {ui.blocks.variants.activity.list} + + + + + + + + {ui.blocks.variants.activity.compact} + + + + + + + + {ui.blocks.variants.activity.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/AnnouncementPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/AnnouncementPage.tsx new file mode 100644 index 0000000..dd07818 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/AnnouncementPage.tsx @@ -0,0 +1,277 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The announcement page of BlocksScreen. + +import { + AnnouncementBar, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function AnnouncementPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.promo.title} + + + {ui.blocks.names.announcement} + + + {ui.blocks.docs.announcement} + + + + + {ui.blocks.variants.announcement.bar} + + + + + + + + {ui.blocks.variants.announcement.badge} + + + + + + + + {ui.blocks.variants.announcement.bottom} + + + + + + + + {ui.blocks.variants.announcement.muted} + + + + + + + + {ui.blocks.variants.announcement.split} + + + + + + + + {ui.blocks.variants.announcement.dismissible} + + + + + + + + {ui.blocks.variants.announcement.shop} + + + + + + + + {ui.blocks.variants.announcement.agency} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ArticlePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ArticlePage.tsx new file mode 100644 index 0000000..e660d96 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ArticlePage.tsx @@ -0,0 +1,157 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The article page of BlocksScreen. + +import { + ArticleBody, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Section, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { article as articleEntries } from "@ui8kit/app-shared/data/article"; + +const ARTICLE_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","quote":"metadata.quote.value"} as const; + +const article = fromCodex
(articleEntries, ARTICLE_FIELDS, CODEX); + +export function ArticlePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.content.title} + + + {ui.blocks.names.article} + + + {ui.blocks.docs.article} + + + + + {ui.blocks.variants.article.column} + + + + + + + + {ui.blocks.variants.article.toc} + + + + + + + + {ui.blocks.variants.article.plain} + + + + + + + + {ui.blocks.variants.article.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/AuthPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/AuthPage.tsx new file mode 100644 index 0000000..113a206 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/AuthPage.tsx @@ -0,0 +1,301 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The auth page of BlocksScreen. + +import { + AuthCard, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function AuthPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.account.title} + + + {ui.blocks.names.auth} + + + {ui.blocks.docs.auth} + + + + + {ui.blocks.variants.auth.signin} + + + + + + + + + + {ui.blocks.variants.auth.magic} + + + + + + + + + + {ui.blocks.variants.auth.socialFirst} + + + + + + + + + + {ui.blocks.variants.auth.signup} + + + + + + + + + + {ui.blocks.variants.auth.reset} + + + + + + + + + + {ui.blocks.variants.auth.plain} + + + + + + + + + + {ui.blocks.variants.auth.social} + + + + + + + + + + {ui.blocks.variants.auth.signupSocial} + + + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/AuthpagePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/AuthpagePage.tsx new file mode 100644 index 0000000..4fed531 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/AuthpagePage.tsx @@ -0,0 +1,321 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The authpage page of BlocksScreen. + +import { + AuthLayout, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +const AUTHPAGE_SWITCH_TO = { text: ui.auth.signin.switchText, link: ui.auth.signin.switchLink, href: "#/" } as const; + +export function AuthpagePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.account.title} + + + {ui.blocks.names.authpage} + + + {ui.blocks.docs.authpage} + + + + + {ui.blocks.variants.authpage.split} + + + + + + + + {ui.blocks.variants.authpage.splitStart} + + + + + + + + {ui.blocks.variants.authpage.centered} + + + + + + + + {ui.blocks.variants.authpage.minimal} + + + + + + + + {ui.blocks.variants.authpage.signup} + + + + + + + + {ui.blocks.variants.authpage.reset} + + + + + + + + {ui.blocks.variants.authpage.magic} + + + + + + + + {ui.blocks.variants.authpage.social} + + + + + + + + {ui.blocks.variants.authpage.socialFirst} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/BeforeafterPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/BeforeafterPage.tsx new file mode 100644 index 0000000..2fc51ee --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/BeforeafterPage.tsx @@ -0,0 +1,166 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The beforeafter page of BlocksScreen. + +import { + BeforeAfter, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Contrast, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { beforeafter as beforeafterEntries } from "@ui8kit/app-shared/data/beforeafter"; + +const BEFOREAFTER_FIELDS = {"id":"id","title":"title","before":"metadata.before.value","after":"metadata.after.value"} as const; + +const beforeafter = fromCodex(beforeafterEntries, BEFOREAFTER_FIELDS, CODEX); + +export function BeforeafterPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.beforeafter} + + + {ui.blocks.docs.beforeafter} + + + + + {ui.blocks.variants.beforeafter.cards} + + + + + + + + {ui.blocks.variants.beforeafter.rows} + + + + + + + + {ui.blocks.variants.beforeafter.plain} + + + + + + + + {ui.blocks.variants.beforeafter.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/BentoPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/BentoPage.tsx new file mode 100644 index 0000000..9957dbe --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/BentoPage.tsx @@ -0,0 +1,162 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The bento page of BlocksScreen. + +import { + BentoGrid, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Tile, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { bento as bentoEntries } from "@ui8kit/app-shared/data/bento"; + +const BENTO_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value","size":"metadata.size.value"} as const; + +const bento = fromCodex(bentoEntries, BENTO_FIELDS, CODEX); + +export function BentoPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.bento} + + + {ui.blocks.docs.bento} + + + + + {ui.blocks.variants.bento.bento} + + + + + + + + {ui.blocks.variants.bento.even} + + + + + + + + {ui.blocks.variants.bento.images} + + + + + + + + {ui.blocks.variants.bento.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/BottomnavPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/BottomnavPage.tsx new file mode 100644 index 0000000..20c11fe --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/BottomnavPage.tsx @@ -0,0 +1,154 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The bottomnav page of BlocksScreen. + +import { + Block, + BottomNav, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type NavLink, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { tabs as tabsEntries } from "@ui8kit/app-shared/data/tabs"; + +const TABS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value"} as const; + +const tabs = fromCodex(tabsEntries, TABS_FIELDS, CODEX); + +export function BottomnavPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.bottomnav} + + + {ui.blocks.docs.bottomnav} + + + + + {ui.blocks.variants.bottomnav.labels} + + + + + + + + {ui.blocks.variants.bottomnav.icons} + + + + + + + + {ui.blocks.variants.bottomnav.sticky} + + + + + + + + {ui.blocks.variants.bottomnav.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CartPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CartPage.tsx new file mode 100644 index 0000000..672e07e --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CartPage.tsx @@ -0,0 +1,173 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The cart page of BlocksScreen. + +import { + Block, + Box, + CartList, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type CartLine, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { cart as cartEntries } from "@ui8kit/app-shared/data/cart"; + +const CART_FIELDS = { + "id": "id", + "name": "title", + "variant": "metadata.variant.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "qty": "metadata.qty.value", +} as const; + +const cart = fromCodex(cartEntries, CART_FIELDS, CODEX); + +export function CartPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.cart} + + + {ui.blocks.docs.cart} + + + + + {ui.blocks.variants.cart.table} + + + + + + + + {ui.blocks.variants.cart.cards} + + + + + + + + {ui.blocks.variants.cart.tableCompact} + + + + + + + + {ui.blocks.variants.cart.cardsPlain} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CartdrawerPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CartdrawerPage.tsx new file mode 100644 index 0000000..f56856d --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CartdrawerPage.tsx @@ -0,0 +1,150 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The cartdrawer page of BlocksScreen. + +import { + Block, + Box, + CartDrawer, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type CartLine, + type SummaryRow, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { cart as cartEntries } from "@ui8kit/app-shared/data/cart"; +import { summary as summaryEntries } from "@ui8kit/app-shared/data/summary"; + +const CART_FIELDS = { + "id": "id", + "name": "title", + "variant": "metadata.variant.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "qty": "metadata.qty.value", +} as const; +const SUMMARY_FIELDS = { + "id": "id", + "label": "title", + "amount": "metadata.amount.value", + "currency": "metadata.currency.value", + "strong": "metadata.strong.value", +} as const; + +const cart = fromCodex(cartEntries, CART_FIELDS, CODEX); +const summary = fromCodex(summaryEntries, SUMMARY_FIELDS, CODEX); + +export function CartdrawerPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.cartdrawer} + + + {ui.blocks.docs.cartdrawer} + + + + + {ui.blocks.variants.cartdrawer.filled} + + + + + + + + {ui.blocks.variants.cartdrawer.compact} + + + + + + + + {ui.blocks.variants.cartdrawer.empty} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CartpagePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CartpagePage.tsx new file mode 100644 index 0000000..421733e --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CartpagePage.tsx @@ -0,0 +1,169 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The cartpage page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + ShoppingCart, + Stack, + Text, + Title, + tpl, + uniqLabel, + type CartLine, + type Promo, + type SummaryRow, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { cart as cartEntries } from "@ui8kit/app-shared/data/cart"; +import { summary as summaryEntries } from "@ui8kit/app-shared/data/summary"; +import { promos as promosEntries } from "@ui8kit/app-shared/data/promos"; + +const CART_FIELDS = { + "id": "id", + "name": "title", + "variant": "metadata.variant.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "qty": "metadata.qty.value", +} as const; +const SUMMARY_FIELDS = { + "id": "id", + "label": "title", + "amount": "metadata.amount.value", + "currency": "metadata.currency.value", + "strong": "metadata.strong.value", +} as const; +const PROMOS_FIELDS = {"id":"id","code":"title"} as const; + +const cart = fromCodex(cartEntries, CART_FIELDS, CODEX); +const summary = fromCodex(summaryEntries, SUMMARY_FIELDS, CODEX); +const promos = fromCodex(promosEntries, PROMOS_FIELDS, CODEX); + +export function CartpagePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.cartpage} + + + {ui.blocks.docs.cartpage} + + + + + {ui.blocks.variants.cartpage.split} + + + + + + + + {ui.blocks.variants.cartpage.stacked} + + + + + + + + {ui.blocks.variants.cartpage.plain} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CategoriesPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CategoriesPage.tsx new file mode 100644 index 0000000..3ed8025 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CategoriesPage.tsx @@ -0,0 +1,240 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The categories page of BlocksScreen. + +import { + Block, + Box, + CategoryNav, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Category, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { categories as categoriesEntries } from "@ui8kit/app-shared/data/categories"; + +const CATEGORIES_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","count":"metadata.count.value","href":"slug|route"} as const; + +const categories = fromCodex(categoriesEntries, CATEGORIES_FIELDS, CODEX); + +export function CategoriesPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.categories} + + + {ui.blocks.docs.categories} + + + + + {ui.blocks.variants.categories.chips} + + + + + + + + {ui.blocks.variants.categories.bar} + + + + + + + + {ui.blocks.variants.categories.sidebar} + + + + + + + + {ui.blocks.variants.categories.chipsPlain} + + + + + + + + {ui.blocks.variants.categories.barCompact} + + + + + + + + {ui.blocks.variants.categories.tiles} + + + + + + + + {ui.blocks.variants.categories.toolbar} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ChannelsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ChannelsPage.tsx new file mode 100644 index 0000000..20b0705 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ChannelsPage.tsx @@ -0,0 +1,161 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The channels page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + SupportChannels, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { channels as channelsEntries } from "@ui8kit/app-shared/data/channels"; + +const CHANNELS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const channels = fromCodex(channelsEntries, CHANNELS_FIELDS, CODEX); + +export function ChannelsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.support.title} + + + {ui.blocks.names.channels} + + + {ui.blocks.docs.channels} + + + + + {ui.blocks.variants.channels.grid} + + + + + + + + {ui.blocks.variants.channels.twoUp} + + + + + + + + {ui.blocks.variants.channels.list} + + + + + + + + {ui.blocks.variants.channels.plain} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ChartPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ChartPage.tsx new file mode 100644 index 0000000..9ccae9b --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ChartPage.tsx @@ -0,0 +1,170 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The chart page of BlocksScreen. + +import { + Block, + Box, + ChartPanel, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Point, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { series as seriesEntries } from "@ui8kit/app-shared/data/series"; + +const SERIES_FIELDS = {"id":"id","label":"title","value":"metadata.value.value"} as const; + +const series = fromCodex(seriesEntries, SERIES_FIELDS, CODEX); + +export function ChartPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.chart} + + + {ui.blocks.docs.chart} + + + + + {ui.blocks.variants.chart.bars} + + + + + + + + {ui.blocks.variants.chart.short} + + + + + + + + {ui.blocks.variants.chart.meters} + + + + + + + + {ui.blocks.variants.chart.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ChecklistPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ChecklistPage.tsx new file mode 100644 index 0000000..3be3fd1 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ChecklistPage.tsx @@ -0,0 +1,254 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The checklist page of BlocksScreen. + +import { + Block, + Box, + Checklist, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Task, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { checklist as checklistEntries } from "@ui8kit/app-shared/data/checklist"; + +const CHECKLIST_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","done":"metadata.done.value"} as const; + +const checklist = fromCodex(checklistEntries, CHECKLIST_FIELDS, CODEX); + +export function ChecklistPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.onboarding.title} + + + {ui.blocks.names.checklist} + + + {ui.blocks.docs.checklist} + + + + + {ui.blocks.variants.checklist.card} + + + + + + + + {ui.blocks.variants.checklist.expand} + + + + + + + + {ui.blocks.variants.checklist.plain} + + + + + + + + {ui.blocks.variants.checklist.text} + + + + + + + + {ui.blocks.variants.checklist.none} + + + + + + + + {ui.blocks.variants.checklist.numbered} + + + + + + + + {ui.blocks.variants.checklist.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CheckoutPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CheckoutPage.tsx new file mode 100644 index 0000000..39ef41e --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CheckoutPage.tsx @@ -0,0 +1,177 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The checkout page of BlocksScreen. + +import { + Block, + Box, + CheckoutForm, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type CartLine, + type Day, + type Payment, + type Promo, + type SummaryRow, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { cart as cartEntries } from "@ui8kit/app-shared/data/cart"; +import { summary as summaryEntries } from "@ui8kit/app-shared/data/summary"; +import { promos as promosEntries } from "@ui8kit/app-shared/data/promos"; +import { days as daysEntries } from "@ui8kit/app-shared/data/days"; +import { payments as paymentsEntries } from "@ui8kit/app-shared/data/payments"; + +const CART_FIELDS = { + "id": "id", + "name": "title", + "variant": "metadata.variant.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "qty": "metadata.qty.value", +} as const; +const SUMMARY_FIELDS = { + "id": "id", + "label": "title", + "amount": "metadata.amount.value", + "currency": "metadata.currency.value", + "strong": "metadata.strong.value", +} as const; +const PROMOS_FIELDS = {"id":"id","code":"title"} as const; +const DAYS_FIELDS = {"id":"id","title":"title","note":"metadata.note.value","slots":"metadata.slots.value","closed":"metadata.closed.value"} as const; +const PAYMENTS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const cart = fromCodex(cartEntries, CART_FIELDS, CODEX); +const summary = fromCodex(summaryEntries, SUMMARY_FIELDS, CODEX); +const promos = fromCodex(promosEntries, PROMOS_FIELDS, CODEX); +const days = fromCodex(daysEntries, DAYS_FIELDS, CODEX); +const payments = fromCodex(paymentsEntries, PAYMENTS_FIELDS, CODEX); + +export function CheckoutPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.checkout} + + + {ui.blocks.docs.checkout} + + + + + {ui.blocks.variants.checkout.cards} + + + + + + + + {ui.blocks.variants.checkout.numbered} + + + + + + + + {ui.blocks.variants.checkout.noSummary} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ComparePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ComparePage.tsx new file mode 100644 index 0000000..ebe90aa --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ComparePage.tsx @@ -0,0 +1,165 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The compare page of BlocksScreen. + +import { + Block, + Box, + ComparisonTable, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type CompareRow, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { compare as compareEntries } from "@ui8kit/app-shared/data/compare"; +import { rivals as rivalsEntries } from "@ui8kit/app-shared/data/rivals"; + +const COMPARE_FIELDS = {"id":"id","label":"title","a":"metadata.a.value","b":"metadata.b.value","c":"metadata.c.value"} as const; +const RIVALS_FIELDS = {"id":"id","label":"title","a":"metadata.a.value","b":"metadata.b.value","c":"metadata.c.value"} as const; + +const compare = fromCodex(compareEntries, COMPARE_FIELDS, CODEX); +const rivals = fromCodex(rivalsEntries, RIVALS_FIELDS, CODEX); + +export function ComparePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.compare} + + + {ui.blocks.docs.compare} + + + + + {ui.blocks.variants.compare.plans} + + + + + + + + {ui.blocks.variants.compare.highlight} + + + + + + + + {ui.blocks.variants.compare.rivals} + + + + + + + + {ui.blocks.variants.compare.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ContactPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ContactPage.tsx new file mode 100644 index 0000000..43b26b6 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ContactPage.tsx @@ -0,0 +1,227 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The contact page of BlocksScreen. + +import { + Block, + Box, + ContactForm, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { channels as channelsEntries } from "@ui8kit/app-shared/data/channels"; + +const CHANNELS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const channels = fromCodex(channelsEntries, CHANNELS_FIELDS, CODEX); + +export function ContactPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.support.title} + + + {ui.blocks.names.contact} + + + {ui.blocks.docs.contact} + + + + + {ui.blocks.variants.contact.single} + + + + + + + + {ui.blocks.variants.contact.page} + + + + + + + + {ui.blocks.variants.contact.short} + + + + + + + + {ui.blocks.variants.contact.split} + + + + + + + + {ui.blocks.variants.contact.consent} + + + + + + + + {ui.blocks.variants.contact.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CookiePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CookiePage.tsx new file mode 100644 index 0000000..52a2eaa --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CookiePage.tsx @@ -0,0 +1,153 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The cookie page of BlocksScreen. + +import { + Block, + Box, + Container, + CookieBanner, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function CookiePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.promo.title} + + + {ui.blocks.names.cookie} + + + {ui.blocks.docs.cookie} + + + + + {ui.blocks.variants.cookie.bar} + + + + + + + + {ui.blocks.variants.cookie.card} + + + + + + + + {ui.blocks.variants.cookie.settings} + + + + + + + + {ui.blocks.variants.cookie.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CreditsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CreditsPage.tsx new file mode 100644 index 0000000..724d44a --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CreditsPage.tsx @@ -0,0 +1,177 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The credits page of BlocksScreen. + +import { + Block, + Box, + Container, + CreditPacks, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Pack, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { credits as creditsEntries } from "@ui8kit/app-shared/data/credits"; + +const CREDITS_FIELDS = { + "id": "id", + "name": "title", + "credits": "metadata.credits.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "badge": "metadata.badge.value", +} as const; + +const credits = fromCodex(creditsEntries, CREDITS_FIELDS, CODEX); + +export function CreditsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.credits} + + + {ui.blocks.docs.credits} + + + + + {ui.blocks.variants.credits.tiles4} + + + + + + + + {ui.blocks.variants.credits.tiles2} + + + + + + + + {ui.blocks.variants.credits.rows} + + + + + + + + {ui.blocks.variants.credits.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CtaPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CtaPage.tsx new file mode 100644 index 0000000..bd5eb6d --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CtaPage.tsx @@ -0,0 +1,370 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The cta page of BlocksScreen. + +import { + Block, + Box, + Container, + CtaBand, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +const CTA_ACTIONS = { + cta: ui.site.home.ctaButton, + href: "#/pricing", + secondary: ui.site.home.ctaSecondary, + secondaryHref: "#/", + emailLabel: ui.promo.newsletter.label, +} as const; + +export function CtaPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.cta} + + + {ui.blocks.docs.cta} + + + + + {ui.blocks.variants.cta.card} + + + + + + + + {ui.blocks.variants.cta.banner} + + + + + + + + {ui.blocks.variants.cta.row} + + + + + + + + {ui.blocks.variants.cta.form} + + + + + + + + {ui.blocks.variants.cta.quote} + + + + + + + + {ui.blocks.variants.cta.band} + + + + + + + + {ui.blocks.variants.cta.split} + + + + + + + + {ui.blocks.variants.cta.compact} + + + + + + + + {ui.blocks.variants.cta.saas} + + + + + + + + {ui.blocks.variants.cta.shop} + + + + + + + + {ui.blocks.variants.cta.agency} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/CtaproofPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/CtaproofPage.tsx new file mode 100644 index 0000000..da8366c --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/CtaproofPage.tsx @@ -0,0 +1,292 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The ctaproof page of BlocksScreen. + +import { + Block, + Box, + Container, + CtaProof, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, + type Logo, + type Stat, + type Zone, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; +import { logos as logosEntries } from "@ui8kit/app-shared/data/logos"; +import { zones as zonesEntries } from "@ui8kit/app-shared/data/zones"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; +const LOGOS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value"} as const; +const ZONES_FIELDS = { + "id": "id", + "name": "title", + "area": "metadata.area.value", + "price": "metadata.price.value", + "freeFrom": "metadata.freeFrom.value", + "minOrder": "metadata.minOrder.value", + "time": "metadata.time.value", + "express": "metadata.express.value", + "currency": "metadata.currency.value", +} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); +const logos = fromCodex(logosEntries, LOGOS_FIELDS, CODEX); +const zones = fromCodex(zonesEntries, ZONES_FIELDS, CODEX); + +const CTAPROOF_ACTIONS = { + mode: "two", + cta: ui.marketing.ctaProof.cta, + href: "#/pricing", + secondary: ui.marketing.ctaProof.secondary, + secondaryHref: "#/contact", +} as const; +const CTAPROOF_CONTENT = { logos, features, stats, zones } as const; + +export function CtaproofPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.ctaproof} + + + {ui.blocks.docs.ctaproof} + + + + + {ui.blocks.variants.ctaproof.centerLogos} + + + + + + + + {ui.blocks.variants.ctaproof.centerFeatures} + + + + + + + + {ui.blocks.variants.ctaproof.centerStats} + + + + + + + + {ui.blocks.variants.ctaproof.splitStats} + + + + + + + + {ui.blocks.variants.ctaproof.splitStatsStart} + + + + + + + + {ui.blocks.variants.ctaproof.splitRows} + + + + + + + + {ui.blocks.variants.ctaproof.splitZones} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/DashshellPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/DashshellPage.tsx new file mode 100644 index 0000000..47dea19 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/DashshellPage.tsx @@ -0,0 +1,417 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The dashshell page of BlocksScreen. + +import { + Block, + Box, + Container, + DashboardShell, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type NavLink, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { sidenav as sidenavEntries } from "@ui8kit/app-shared/data/sidenav"; +import { subnav as subnavEntries } from "@ui8kit/app-shared/data/subnav"; +import { helplinks as helplinksEntries } from "@ui8kit/app-shared/data/helplinks"; + +const SIDENAV_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; +const SUBNAV_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; +const HELPLINKS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; + +const sidenav = fromCodex(sidenavEntries, SIDENAV_FIELDS, CODEX); +const subnav = fromCodex(subnavEntries, SUBNAV_FIELDS, CODEX); +const helplinks = fromCodex(helplinksEntries, HELPLINKS_FIELDS, CODEX); + +const DASHSHELL_NAV = { + label: ui.dashboard.shells.label, + brand: ui.site.header.brand, + links: sidenav, + current: "item-orders", + subTitle: ui.dashboard.shells.subTitle, + sub: subnav, + subCurrent: "subitem-all", + search: ui.dashboard.shells.search, + shortcut: ui.dashboard.shells.shortcut, + expand: ui.dashboard.shells.expand, + userName: ui.dashboard.shells.userName, + copyright: ui.dashboard.shells.copyright, + footerLabel: ui.dashboard.shells.footerLabel, + footer: helplinks, +} as const; + +export function DashshellPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.dashshell} + + + {ui.blocks.docs.dashshell} + + + + + {ui.blocks.variants.dashshell.classic} + + + + + + + + {ui.blocks.variants.dashshell.inset} + + + + + + + + {ui.blocks.variants.dashshell.rail} + + + + + + + + {ui.blocks.variants.dashshell.railFooter} + + + + + + + + {ui.blocks.variants.dashshell.collapsed} + + + + + + + + {ui.blocks.variants.dashshell.twoLevel} + + + + + + + + {ui.blocks.variants.dashshell.twoLevelFull} + + + + + + + + {ui.blocks.variants.dashshell.end} + + + + + + + + {ui.blocks.variants.dashshell.railEnd} + + + + + + + + {ui.blocks.variants.dashshell.topOnly} + + + + + + + + {ui.blocks.variants.dashshell.sideOnly} + + + + + + + + {ui.blocks.variants.dashshell.collapsedEnd} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/DeliveryPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/DeliveryPage.tsx new file mode 100644 index 0000000..f6dfa4d --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/DeliveryPage.tsx @@ -0,0 +1,153 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The delivery page of BlocksScreen. + +import { + Block, + Box, + Container, + DeliveryInfo, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, + type Zone, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { zones as zonesEntries } from "@ui8kit/app-shared/data/zones"; +import { deliveryfacts as deliveryfactsEntries } from "@ui8kit/app-shared/data/deliveryfacts"; + +const ZONES_FIELDS = { + "id": "id", + "name": "title", + "area": "metadata.area.value", + "price": "metadata.price.value", + "freeFrom": "metadata.freeFrom.value", + "minOrder": "metadata.minOrder.value", + "time": "metadata.time.value", + "express": "metadata.express.value", + "currency": "metadata.currency.value", +} as const; +const DELIVERYFACTS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const zones = fromCodex(zonesEntries, ZONES_FIELDS, CODEX); +const deliveryfacts = fromCodex(deliveryfactsEntries, DELIVERYFACTS_FIELDS, CODEX); + +export function DeliveryPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.delivery} + + + {ui.blocks.docs.delivery} + + + + + {ui.blocks.variants.delivery.full} + + + + + + + + {ui.blocks.variants.delivery.split} + + + + + + + + {ui.blocks.variants.delivery.facts} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/EmptyPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/EmptyPage.tsx new file mode 100644 index 0000000..c99749f --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/EmptyPage.tsx @@ -0,0 +1,217 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The empty page of BlocksScreen. + +import { + Block, + Box, + Container, + EmptyPanel, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function EmptyPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.empty} + + + {ui.blocks.docs.empty} + + + + + {ui.blocks.variants.empty.illustrated} + + + + + + + + {ui.blocks.variants.empty.orders} + + + + + + + + {ui.blocks.variants.empty.results} + + + + + + + + {ui.blocks.variants.empty.inbox} + + + + + + + + {ui.blocks.variants.empty.compact} + + + + + + + + {ui.blocks.variants.empty.plainNoAction} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ErrorpagePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ErrorpagePage.tsx new file mode 100644 index 0000000..92c3d40 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ErrorpagePage.tsx @@ -0,0 +1,182 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The errorpage page of BlocksScreen. + +import { + Block, + Box, + Container, + ErrorPage, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +const ERRORPAGE_ACTIONS = { cta: ui.vibe.error.cta, href: "#/", secondary: ui.vibe.error.secondary, secondaryHref: "#/" } as const; + +export function ErrorpagePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.support.title} + + + {ui.blocks.names.errorpage} + + + {ui.blocks.docs.errorpage} + + + + + {ui.blocks.variants.errorpage.centered} + + + + + + + + {ui.blocks.variants.errorpage.split} + + + + + + + + {ui.blocks.variants.errorpage.noCode} + + + + + + + + {ui.blocks.variants.errorpage.two} + + + + + + + + {ui.blocks.variants.errorpage.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/FaqPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/FaqPage.tsx new file mode 100644 index 0000000..aee3430 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/FaqPage.tsx @@ -0,0 +1,260 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The faq page of BlocksScreen. + +import { + Block, + Box, + Container, + FaqList, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Faq, + type FaqTab, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { faq as faqEntries } from "@ui8kit/app-shared/data/faq"; +import { faqtabs as faqtabsEntries } from "@ui8kit/app-shared/data/faqtabs"; + +const FAQ_FIELDS = {"id":"id","question":"title","answer":"metadata.answer.value","category":"terms|term-slug:faq_category"} as const; +const FAQTABS_FIELDS = {"id":"id","title":"title","value":"metadata.value.value"} as const; + +const faq = fromCodex(faqEntries, FAQ_FIELDS, CODEX); +const faqtabs = fromCodex(faqtabsEntries, FAQTABS_FIELDS, CODEX); + +const FAQ_FILTER = { tabs: faqtabs, label: ui.vibe.faq.tabs, category: "" } as const; + +export function FaqPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.faq} + + + {ui.blocks.docs.faq} + + + + + {ui.blocks.variants.faq.list} + + + + + + + + {ui.blocks.variants.faq.chat} + + + + + + + + {ui.blocks.variants.faq.search} + + + + + + + + {ui.blocks.variants.faq.tabs} + + + + + + + + {ui.blocks.variants.faq.twoColumns} + + + + + + + + {ui.blocks.variants.faq.muted} + + + + + + + + {ui.blocks.variants.faq.roomy} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/FaqsplitPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/FaqsplitPage.tsx new file mode 100644 index 0000000..c260647 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/FaqsplitPage.tsx @@ -0,0 +1,292 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The faqsplit page of BlocksScreen. + +import { + Block, + Box, + Container, + FaqSplit, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type FaqTab, + type Feature, + type Question, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { channels as channelsEntries } from "@ui8kit/app-shared/data/channels"; +import { faqtabs as faqtabsEntries } from "@ui8kit/app-shared/data/faqtabs"; +import { questions as questionsEntries } from "@ui8kit/app-shared/data/questions"; + +const CHANNELS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; +const FAQTABS_FIELDS = {"id":"id","title":"title","value":"metadata.value.value"} as const; +const QUESTIONS_FIELDS = { + "id": "id", + "question": "title", + "answer": "metadata.answer.value", + "category": "terms|term:faq_category", + "icon": "metadata.icon.value", +} as const; + +const channels = fromCodex(channelsEntries, CHANNELS_FIELDS, CODEX); +const faqtabs = fromCodex(faqtabsEntries, FAQTABS_FIELDS, CODEX); +const questions = fromCodex(questionsEntries, QUESTIONS_FIELDS, CODEX); + +const FAQSPLIT_LABELS = { + cta: ui.marketing.faqSplit.cta, + more: ui.marketing.faqSplit.more, + asideTitle: ui.marketing.faqSplit.asideTitle, + asideText: ui.marketing.faqSplit.asideText, + asideCta: ui.marketing.faqSplit.asideCta, + search: ui.marketing.faqSplit.search, + popular: ui.marketing.faqSplit.popular, +} as const; + +export function FaqsplitPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.faqsplit} + + + {ui.blocks.docs.faqsplit} + + + + + {ui.blocks.variants.faqsplit.headSplit} + + + + + + + + {ui.blocks.variants.faqsplit.helpCard} + + + + + + + + {ui.blocks.variants.faqsplit.picture} + + + + + + + + {ui.blocks.variants.faqsplit.finder} + + + + + + + + {ui.blocks.variants.faqsplit.cards3} + + + + + + + + {ui.blocks.variants.faqsplit.cards4} + + + + + + + + {ui.blocks.variants.faqsplit.cardsIcons} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/FeaturesPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/FeaturesPage.tsx new file mode 100644 index 0000000..4f2e6cf --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/FeaturesPage.tsx @@ -0,0 +1,290 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The features page of BlocksScreen. + +import { + Block, + Box, + Container, + FeatureGrid, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; + +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); + +export function FeaturesPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.features} + + + {ui.blocks.docs.features} + + + + + {ui.blocks.variants.features.grid} + + + + + + + + {ui.blocks.variants.features.grid2} + + + + + + + + {ui.blocks.variants.features.tiles4} + + + + + + + + {ui.blocks.variants.features.cells4} + + + + + + + + {ui.blocks.variants.features.rows} + + + + + + + + {ui.blocks.variants.features.rowsStart} + + + + + + + + {ui.blocks.variants.features.rowsAlternate} + + + + + + + + {ui.blocks.variants.features.tilesMuted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/FeatureshowcasePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/FeatureshowcasePage.tsx new file mode 100644 index 0000000..8b85d42 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/FeatureshowcasePage.tsx @@ -0,0 +1,169 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The featureshowcase page of BlocksScreen. + +import { + Block, + Box, + Container, + FeatureShowcase, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { values as valuesEntries } from "@ui8kit/app-shared/data/values"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; + +const VALUES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const values = fromCodex(valuesEntries, VALUES_FIELDS, CODEX); +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); + +export function FeatureshowcasePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.featureshowcase} + + + {ui.blocks.docs.featureshowcase} + + + + + {ui.blocks.variants.featureshowcase.pictureCards3} + + + + + + + + {ui.blocks.variants.featureshowcase.panelCards4} + + + + + + + + {ui.blocks.variants.featureshowcase.pictureCards4} + + + + + + + + {ui.blocks.variants.featureshowcase.panelCards3} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/FeaturesplitPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/FeaturesplitPage.tsx new file mode 100644 index 0000000..4af7bf5 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/FeaturesplitPage.tsx @@ -0,0 +1,221 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The featuresplit page of BlocksScreen. + +import { + Block, + Box, + Container, + FeatureSplit, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); + +const FEATURESPLIT_ACTIONS = { + mode: "two", + cta: ui.marketing.featureSplit.cta, + href: "#/start", + secondary: ui.marketing.featureSplit.secondary, + secondaryHref: "#/work", +} as const; + +export function FeaturesplitPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.featuresplit} + + + {ui.blocks.docs.featuresplit} + + + + + {ui.blocks.variants.featuresplit.gridStart} + + + + + + + + {ui.blocks.variants.featuresplit.statsStart} + + + + + + + + {ui.blocks.variants.featuresplit.gridMuted} + + + + + + + + {ui.blocks.variants.featuresplit.metricCards} + + + + + + + + {ui.blocks.variants.featuresplit.featureCards} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/FeaturetabsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/FeaturetabsPage.tsx new file mode 100644 index 0000000..8bad3c8 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/FeaturetabsPage.tsx @@ -0,0 +1,139 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The featuretabs page of BlocksScreen. + +import { + Block, + Box, + Container, + FeatureTabs, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; + +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); + +export function FeaturetabsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.featuretabs} + + + {ui.blocks.docs.featuretabs} + + + + + {ui.blocks.variants.featuretabs.split} + + + + + + + + {ui.blocks.variants.featuretabs.stack} + + + + + + + + {ui.blocks.variants.featuretabs.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/FooterPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/FooterPage.tsx new file mode 100644 index 0000000..1acd79f --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/FooterPage.tsx @@ -0,0 +1,113 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The footer page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + SiteFooter, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function FooterPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.footer} + + + {ui.blocks.docs.footer} + + + + + {ui.blocks.variants.footer.minimal} + + + + + + + + {ui.blocks.variants.footer.centered} + + + + + + + + {ui.blocks.variants.footer.compact} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/FootersplitPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/FootersplitPage.tsx new file mode 100644 index 0000000..a8f1a5c --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/FootersplitPage.tsx @@ -0,0 +1,254 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The footersplit page of BlocksScreen. + +import { + Block, + Box, + Container, + FooterSplit, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, + type MegaGroup, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; +import { sitemap as sitemapEntries } from "@ui8kit/app-shared/data/sitemap"; +import { contacts as contactsEntries } from "@ui8kit/app-shared/data/contacts"; +import { community as communityEntries } from "@ui8kit/app-shared/data/community"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; +const SITEMAP_FIELDS = {"id":"id","title":"title","icon":"metadata.icon.value","links":"id|menu","href":"slug|route"} as const; +const CONTACTS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; +const COMMUNITY_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); +const sitemap = fromCodex(sitemapEntries, SITEMAP_FIELDS, CODEX); +const contacts = fromCodex(contactsEntries, CONTACTS_FIELDS, CODEX); +const community = fromCodex(communityEntries, COMMUNITY_FIELDS, CODEX); + +const FOOTERSPLIT_EXTRAS = { stats, points: features, contacts, channels: community } as const; + +export function FootersplitPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.footersplit} + + + {ui.blocks.docs.footersplit} + + + + + {ui.blocks.variants.footersplit.statsCards} + + + + + + + + {ui.blocks.variants.footersplit.splitPoints} + + + + + + + + {ui.blocks.variants.footersplit.splitLinks} + + + + + + + + {ui.blocks.variants.footersplit.newsletterStart} + + + + + + + + {ui.blocks.variants.footersplit.splitContacts} + + + + + + + + {ui.blocks.variants.footersplit.channelsStart} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/HeaderPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/HeaderPage.tsx new file mode 100644 index 0000000..fd3dd96 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/HeaderPage.tsx @@ -0,0 +1,153 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The header page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + SiteHeader, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { toggleTheme } from "@ui8kit/app-shared/runtime/theme"; +import { ui } from "@ui8kit/app-shared/content"; + +const actions = { toggleTheme }; + +export function HeaderPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.header} + + + {ui.blocks.docs.header} + + + + + {ui.blocks.variants.header.inline} + + + actions.toggleTheme()} + /> + + + + + {ui.blocks.variants.header.stacked} + + + actions.toggleTheme()} + /> + + + + + {ui.blocks.variants.header.sticky} + + + actions.toggleTheme()} + /> + + + + + {ui.blocks.variants.header.withCta} + + + actions.toggleTheme()} + /> + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/HeroPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/HeroPage.tsx new file mode 100644 index 0000000..19432f4 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/HeroPage.tsx @@ -0,0 +1,518 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The hero page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + HeroClassic, + HeroPrompt, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type CodeLine, + type NavLink, + type Topic, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { terminal as terminalEntries } from "@ui8kit/app-shared/data/terminal"; +import { prompts as promptsEntries } from "@ui8kit/app-shared/data/prompts"; +import { navlinks as navlinksEntries } from "@ui8kit/app-shared/data/navlinks"; + +const TERMINAL_FIELDS = {"id":"id","text":"title","kind":"metadata.line_kind.value"} as const; +const PROMPTS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value"} as const; +const NAVLINKS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; + +const terminal = fromCodex(terminalEntries, TERMINAL_FIELDS, CODEX); +const prompts = fromCodex(promptsEntries, PROMPTS_FIELDS, CODEX); +const navlinks = fromCodex(navlinksEntries, NAVLINKS_FIELDS, CODEX); + +const HERO_ACTIONS = { + cta: ui.site.home.cta, + href: "#/pricing", + secondary: ui.site.home.secondary, + secondaryHref: "#/pricing", + emailLabel: ui.promo.newsletter.label, +} as const; +const HERO_MEDIA = { codeTitle: ui.vibe.code.title, prompt: ui.vibe.code.prompt, lines: terminal } as const; + +export function HeroPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.hero} + + + {ui.blocks.docs.hero} + + + + + {ui.blocks.variants.hero.centered} + + + + + + + + {ui.blocks.variants.hero.screenshot} + + + + + + + + {ui.blocks.variants.hero.backdrop} + + + + + + + + {ui.blocks.variants.hero.code} + + + + + + + + {ui.blocks.variants.hero.cluster} + + + + + + + + {ui.blocks.variants.hero.display} + + + + + + + + {ui.blocks.variants.hero.form} + + + + + + + + {ui.blocks.variants.hero.prompt} + + + + + + + + {ui.blocks.variants.hero.twoActions} + + + + + + + + {ui.blocks.variants.hero.split} + + + + + + + + {ui.blocks.variants.hero.splitStart} + + + + + + + + {ui.blocks.variants.hero.muted} + + + + + + + + {ui.blocks.variants.hero.saas} + + + + + + + + {ui.blocks.variants.hero.shop} + + + + + + + + {ui.blocks.variants.hero.blog} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/HerosplitPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/HerosplitPage.tsx new file mode 100644 index 0000000..df94a57 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/HerosplitPage.tsx @@ -0,0 +1,316 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The herosplit page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + HeroSplit, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, + type Plan, + type Quote, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; +import { testimonials as testimonialsEntries } from "@ui8kit/app-shared/data/testimonials"; +import { tiers as tiersEntries } from "@ui8kit/app-shared/data/tiers"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; +const TESTIMONIALS_FIELDS = { + "id": "id", + "author": "title", + "role": "metadata.role.value", + "company": "metadata.company.value", + "quote": "metadata.quote.value", + "rating": "metadata.rating.value", + "handle": "metadata.handle.value", + "time": "metadata.time.value|ago-short", + "mark": "metadata.mark.value", +} as const; +const TIERS_FIELDS = { + "id": "id", + "name": "title", + "tagline": "metadata.tagline.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "seats": "metadata.seats.value", + "storage": "metadata.storage.value", + "highlighted": "metadata.highlighted.value", + "features": "metadata.features.value", + "yearly": "metadata.yearly.value", +} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); +const testimonials = fromCodex(testimonialsEntries, TESTIMONIALS_FIELDS, CODEX); +const tiers = fromCodex(tiersEntries, TIERS_FIELDS, CODEX); + +const HEROSPLIT_ACTIONS = { + mode: "two", + cta: ui.marketing.heroSplit.cta, + href: "#/pricing", + secondary: ui.marketing.heroSplit.secondary, + secondaryHref: "#/features", +} as const; +const HEROSPLIT_CONTENT = { + stats, + features, + people: testimonials, + plans: tiers, + proof: ui.marketing.heroSplit.proof, + card: { title: ui.marketing.heroSplit.cardTitle, text: ui.marketing.heroSplit.cardText, icon: "zap" }, +} as const; + +export function HerosplitPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.herosplit} + + + {ui.blocks.docs.herosplit} + + + + + {ui.blocks.variants.herosplit.statsCards} + + + + + + + + {ui.blocks.variants.herosplit.avatars} + + + + + + + + {ui.blocks.variants.herosplit.miniCards} + + + + + + + + {ui.blocks.variants.herosplit.quoteStats} + + + + + + + + {ui.blocks.variants.herosplit.planCards} + + + + + + + + {ui.blocks.variants.herosplit.pictureGrid} + + + + + + + + {ui.blocks.variants.herosplit.pictureGridStart} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/IconwallPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/IconwallPage.tsx new file mode 100644 index 0000000..ccfd49b --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/IconwallPage.tsx @@ -0,0 +1,188 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The iconwall page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + IconWall, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; + +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); + +export function IconwallPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.iconwall} + + + {ui.blocks.docs.iconwall} + + + + + {ui.blocks.variants.iconwall.tiles4} + + + + + + + + {ui.blocks.variants.iconwall.tiles3} + + + + + + + + {ui.blocks.variants.iconwall.chips6} + + + + + + + + {ui.blocks.variants.iconwall.chips4} + + + + + + + + {ui.blocks.variants.iconwall.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/IndexPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/IndexPage.tsx new file mode 100644 index 0000000..f2d7bf2 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/IndexPage.tsx @@ -0,0 +1,222 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The index page of BlocksScreen. + +import { Block, Container, Link, List, ListItem, Stack, Text, Title } from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +const TOPICS = [ + { + id: "marketing", + titleId: "theme-marketing-title", + title: ui.blocks.themes.marketing.title, + text: ui.blocks.themes.marketing.text, + blocks: [ + { key: "about", href: "#/about", name: ui.blocks.names.about, docs: ui.blocks.docs.about }, + { key: "aboutme", href: "#/aboutme", name: ui.blocks.names.aboutme, docs: ui.blocks.docs.aboutme }, + { key: "accordion", href: "#/accordion", name: ui.blocks.names.accordion, docs: ui.blocks.docs.accordion }, + { key: "beforeafter", href: "#/beforeafter", name: ui.blocks.names.beforeafter, docs: ui.blocks.docs.beforeafter }, + { key: "bento", href: "#/bento", name: ui.blocks.names.bento, docs: ui.blocks.docs.bento }, + { key: "compare", href: "#/compare", name: ui.blocks.names.compare, docs: ui.blocks.docs.compare }, + { key: "credits", href: "#/credits", name: ui.blocks.names.credits, docs: ui.blocks.docs.credits }, + { key: "cta", href: "#/cta", name: ui.blocks.names.cta, docs: ui.blocks.docs.cta }, + { key: "ctaproof", href: "#/ctaproof", name: ui.blocks.names.ctaproof, docs: ui.blocks.docs.ctaproof }, + { key: "faq", href: "#/faq", name: ui.blocks.names.faq, docs: ui.blocks.docs.faq }, + { key: "faqsplit", href: "#/faqsplit", name: ui.blocks.names.faqsplit, docs: ui.blocks.docs.faqsplit }, + { key: "features", href: "#/features", name: ui.blocks.names.features, docs: ui.blocks.docs.features }, + { key: "featureshowcase", href: "#/featureshowcase", name: ui.blocks.names.featureshowcase, docs: ui.blocks.docs.featureshowcase }, + { key: "featuresplit", href: "#/featuresplit", name: ui.blocks.names.featuresplit, docs: ui.blocks.docs.featuresplit }, + { key: "featuretabs", href: "#/featuretabs", name: ui.blocks.names.featuretabs, docs: ui.blocks.docs.featuretabs }, + { key: "footer", href: "#/footer", name: ui.blocks.names.footer, docs: ui.blocks.docs.footer }, + { key: "footersplit", href: "#/footersplit", name: ui.blocks.names.footersplit, docs: ui.blocks.docs.footersplit }, + { key: "header", href: "#/header", name: ui.blocks.names.header, docs: ui.blocks.docs.header }, + { key: "hero", href: "#/hero", name: ui.blocks.names.hero, docs: ui.blocks.docs.hero }, + { key: "herosplit", href: "#/herosplit", name: ui.blocks.names.herosplit, docs: ui.blocks.docs.herosplit }, + { key: "iconwall", href: "#/iconwall", name: ui.blocks.names.iconwall, docs: ui.blocks.docs.iconwall }, + { key: "jobs", href: "#/jobs", name: ui.blocks.names.jobs, docs: ui.blocks.docs.jobs }, + { key: "logos", href: "#/logos", name: ui.blocks.names.logos, docs: ui.blocks.docs.logos }, + { key: "medialist", href: "#/medialist", name: ui.blocks.names.medialist, docs: ui.blocks.docs.medialist }, + { key: "megamenu", href: "#/megamenu", name: ui.blocks.names.megamenu, docs: ui.blocks.docs.megamenu }, + { key: "navbar", href: "#/navbar", name: ui.blocks.names.navbar, docs: ui.blocks.docs.navbar }, + { key: "pagehead", href: "#/pagehead", name: ui.blocks.names.pagehead, docs: ui.blocks.docs.pagehead }, + { key: "pagetrail", href: "#/pagetrail", name: ui.blocks.names.pagetrail, docs: ui.blocks.docs.pagetrail }, + { key: "photos", href: "#/photos", name: ui.blocks.names.photos, docs: ui.blocks.docs.photos }, + { key: "plan", href: "#/plan", name: ui.blocks.names.plan, docs: ui.blocks.docs.plan }, + { key: "pricing", href: "#/pricing", name: ui.blocks.names.pricing, docs: ui.blocks.docs.pricing }, + { key: "projects", href: "#/projects", name: ui.blocks.names.projects, docs: ui.blocks.docs.projects }, + { key: "proof", href: "#/proof", name: ui.blocks.names.proof, docs: ui.blocks.docs.proof }, + { key: "quotesplit", href: "#/quotesplit", name: ui.blocks.names.quotesplit, docs: ui.blocks.docs.quotesplit }, + { key: "sitemap", href: "#/sitemap", name: ui.blocks.names.sitemap, docs: ui.blocks.docs.sitemap }, + { key: "stats", href: "#/stats", name: ui.blocks.names.stats, docs: ui.blocks.docs.stats }, + { key: "steps", href: "#/steps", name: ui.blocks.names.steps, docs: ui.blocks.docs.steps }, + { key: "sticky", href: "#/sticky", name: ui.blocks.names.sticky, docs: ui.blocks.docs.sticky }, + { key: "team", href: "#/team", name: ui.blocks.names.team, docs: ui.blocks.docs.team }, + { key: "templates", href: "#/templates", name: ui.blocks.names.templates, docs: ui.blocks.docs.templates }, + { key: "testimonials", href: "#/testimonials", name: ui.blocks.names.testimonials, docs: ui.blocks.docs.testimonials }, + { key: "usage", href: "#/usage", name: ui.blocks.names.usage, docs: ui.blocks.docs.usage }, + { key: "videos", href: "#/videos", name: ui.blocks.names.videos, docs: ui.blocks.docs.videos }, + ], + }, + { + id: "commerce", + titleId: "theme-commerce-title", + title: ui.blocks.themes.commerce.title, + text: ui.blocks.themes.commerce.text, + blocks: [ + { key: "cart", href: "#/cart", name: ui.blocks.names.cart, docs: ui.blocks.docs.cart }, + { key: "cartdrawer", href: "#/cartdrawer", name: ui.blocks.names.cartdrawer, docs: ui.blocks.docs.cartdrawer }, + { key: "cartpage", href: "#/cartpage", name: ui.blocks.names.cartpage, docs: ui.blocks.docs.cartpage }, + { key: "categories", href: "#/categories", name: ui.blocks.names.categories, docs: ui.blocks.docs.categories }, + { key: "checkout", href: "#/checkout", name: ui.blocks.names.checkout, docs: ui.blocks.docs.checkout }, + { key: "delivery", href: "#/delivery", name: ui.blocks.names.delivery, docs: ui.blocks.docs.delivery }, + { key: "locations", href: "#/locations", name: ui.blocks.names.locations, docs: ui.blocks.docs.locations }, + { key: "orders", href: "#/orders", name: ui.blocks.names.orders, docs: ui.blocks.docs.orders }, + { key: "product", href: "#/product", name: ui.blocks.names.product, docs: ui.blocks.docs.product }, + { key: "productinfo", href: "#/productinfo", name: ui.blocks.names.productinfo, docs: ui.blocks.docs.productinfo }, + { key: "products", href: "#/products", name: ui.blocks.names.products, docs: ui.blocks.docs.products }, + { key: "reviews", href: "#/reviews", name: ui.blocks.names.reviews, docs: ui.blocks.docs.reviews }, + { key: "slots", href: "#/slots", name: ui.blocks.names.slots, docs: ui.blocks.docs.slots }, + { key: "storehero", href: "#/storehero", name: ui.blocks.names.storehero, docs: ui.blocks.docs.storehero }, + { key: "summary", href: "#/summary", name: ui.blocks.names.summary, docs: ui.blocks.docs.summary }, + { key: "usp", href: "#/usp", name: ui.blocks.names.usp, docs: ui.blocks.docs.usp }, + { key: "zones", href: "#/zones", name: ui.blocks.names.zones, docs: ui.blocks.docs.zones }, + ], + }, + { + id: "promo", + titleId: "theme-promo-title", + title: ui.blocks.themes.promo.title, + text: ui.blocks.themes.promo.text, + blocks: [ + { key: "announcement", href: "#/announcement", name: ui.blocks.names.announcement, docs: ui.blocks.docs.announcement }, + { key: "cookie", href: "#/cookie", name: ui.blocks.names.cookie, docs: ui.blocks.docs.cookie }, + { key: "newsletter", href: "#/newsletter", name: ui.blocks.names.newsletter, docs: ui.blocks.docs.newsletter }, + ], + }, + { + id: "content", + titleId: "theme-content-title", + title: ui.blocks.themes.content.title, + text: ui.blocks.themes.content.text, + blocks: [ + { key: "article", href: "#/article", name: ui.blocks.names.article, docs: ui.blocks.docs.article }, + { key: "postheader", href: "#/postheader", name: ui.blocks.names.postheader, docs: ui.blocks.docs.postheader }, + { key: "posts", href: "#/posts", name: ui.blocks.names.posts, docs: ui.blocks.docs.posts }, + { key: "postshowcase", href: "#/postshowcase", name: ui.blocks.names.postshowcase, docs: ui.blocks.docs.postshowcase }, + { key: "postsplit", href: "#/postsplit", name: ui.blocks.names.postsplit, docs: ui.blocks.docs.postsplit }, + { key: "storytabs", href: "#/storytabs", name: ui.blocks.names.storytabs, docs: ui.blocks.docs.storytabs }, + { key: "timeline", href: "#/timeline", name: ui.blocks.names.timeline, docs: ui.blocks.docs.timeline }, + ], + }, + { + id: "account", + titleId: "theme-account-title", + title: ui.blocks.themes.account.title, + text: ui.blocks.themes.account.text, + blocks: [ + { key: "auth", href: "#/auth", name: ui.blocks.names.auth, docs: ui.blocks.docs.auth }, + { key: "authpage", href: "#/authpage", name: ui.blocks.names.authpage, docs: ui.blocks.docs.authpage }, + { key: "profile", href: "#/profile", name: ui.blocks.names.profile, docs: ui.blocks.docs.profile }, + { key: "wizard", href: "#/wizard", name: ui.blocks.names.wizard, docs: ui.blocks.docs.wizard }, + ], + }, + { + id: "dashboard", + titleId: "theme-dashboard-title", + title: ui.blocks.themes.dashboard.title, + text: ui.blocks.themes.dashboard.text, + blocks: [ + { key: "activity", href: "#/activity", name: ui.blocks.names.activity, docs: ui.blocks.docs.activity }, + { key: "bottomnav", href: "#/bottomnav", name: ui.blocks.names.bottomnav, docs: ui.blocks.docs.bottomnav }, + { key: "chart", href: "#/chart", name: ui.blocks.names.chart, docs: ui.blocks.docs.chart }, + { key: "dashshell", href: "#/dashshell", name: ui.blocks.names.dashshell, docs: ui.blocks.docs.dashshell }, + { key: "empty", href: "#/empty", name: ui.blocks.names.empty, docs: ui.blocks.docs.empty }, + { key: "kanban", href: "#/kanban", name: ui.blocks.names.kanban, docs: ui.blocks.docs.kanban }, + { key: "metrics", href: "#/metrics", name: ui.blocks.names.metrics, docs: ui.blocks.docs.metrics }, + { key: "overview", href: "#/overview", name: ui.blocks.names.overview, docs: ui.blocks.docs.overview }, + { key: "shell", href: "#/shell", name: ui.blocks.names.shell, docs: ui.blocks.docs.shell }, + { key: "sidenav", href: "#/sidenav", name: ui.blocks.names.sidenav, docs: ui.blocks.docs.sidenav }, + { key: "skeleton", href: "#/skeleton", name: ui.blocks.names.skeleton, docs: ui.blocks.docs.skeleton }, + ], + }, + { + id: "onboarding", + titleId: "theme-onboarding-title", + title: ui.blocks.themes.onboarding.title, + text: ui.blocks.themes.onboarding.text, + blocks: [ + { key: "checklist", href: "#/checklist", name: ui.blocks.names.checklist, docs: ui.blocks.docs.checklist }, + { key: "stepper", href: "#/stepper", name: ui.blocks.names.stepper, docs: ui.blocks.docs.stepper }, + { key: "tour", href: "#/tour", name: ui.blocks.names.tour, docs: ui.blocks.docs.tour }, + { key: "videomodal", href: "#/videomodal", name: ui.blocks.names.videomodal, docs: ui.blocks.docs.videomodal }, + ], + }, + { + id: "support", + titleId: "theme-support-title", + title: ui.blocks.themes.support.title, + text: ui.blocks.themes.support.text, + blocks: [ + { key: "channels", href: "#/channels", name: ui.blocks.names.channels, docs: ui.blocks.docs.channels }, + { key: "contact", href: "#/contact", name: ui.blocks.names.contact, docs: ui.blocks.docs.contact }, + { key: "errorpage", href: "#/errorpage", name: ui.blocks.names.errorpage, docs: ui.blocks.docs.errorpage }, + ], + }, +] as const; + +export function IndexPage() { + return ( + + + + + + {ui.blocks.title} + + + {ui.blocks.intro} + + + {(TOPICS ?? []).map((topic) => ( + + + + {topic.title} + + + {topic.text} + + + + {(topic.blocks ?? []).map((block) => ( + + + {block.name} + + + {block.docs} + + + ))} + + + ))} + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/JobsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/JobsPage.tsx new file mode 100644 index 0000000..a54118a --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/JobsPage.tsx @@ -0,0 +1,182 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The jobs page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + JobBoard, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Department, + type Job, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { jobs as jobsEntries } from "@ui8kit/app-shared/data/jobs"; +import { departments as departmentsEntries } from "@ui8kit/app-shared/data/departments"; + +const JOBS_FIELDS = { + "id": "id", + "title": "title", + "dept": "metadata.dept.value", + "location": "metadata.location.value", + "type": "metadata.type.value", + "salary": "metadata.salary.value", + "posted": "metadata.posted.value|ago-days", +} as const; +const DEPARTMENTS_FIELDS = {"id":"id","name":"title"} as const; + +const jobs = fromCodex(jobsEntries, JOBS_FIELDS, CODEX); +const departments = fromCodex(departmentsEntries, DEPARTMENTS_FIELDS, CODEX); + +export function JobsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.jobs} + + + {ui.blocks.docs.jobs} + + + + + {ui.blocks.variants.jobs.grid} + + + + + + + + {ui.blocks.variants.jobs.salary} + + + + + + + + {ui.blocks.variants.jobs.grouped} + + + + + + + + {ui.blocks.variants.jobs.table} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/KanbanPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/KanbanPage.tsx new file mode 100644 index 0000000..ab72aaf --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/KanbanPage.tsx @@ -0,0 +1,174 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The kanban page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + KanbanBoard, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type BoardCard, + type Lane, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { lanes as lanesEntries } from "@ui8kit/app-shared/data/lanes"; +import { cards as cardsEntries } from "@ui8kit/app-shared/data/cards"; + +const LANES_FIELDS = {"id":"id","key":"slug","title":"title"} as const; +const CARDS_FIELDS = {"id":"id","lane":"metadata.lane.value","title":"title","tag":"metadata.tag.value","who":"metadata.who.value"} as const; + +const lanes = fromCodex(lanesEntries, LANES_FIELDS, CODEX); +const cards = fromCodex(cardsEntries, CARDS_FIELDS, CODEX); + +export function KanbanPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.kanban} + + + {ui.blocks.docs.kanban} + + + + + {ui.blocks.variants.kanban.detail} + + + + + + + + {ui.blocks.variants.kanban.simple} + + + + + + + + {ui.blocks.variants.kanban.twoCols} + + + + + + + + {ui.blocks.variants.kanban.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/LocationsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/LocationsPage.tsx new file mode 100644 index 0000000..67487ee --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/LocationsPage.tsx @@ -0,0 +1,148 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The locations page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + StoreLocations, + Text, + Title, + tpl, + uniqLabel, + type Store, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stores as storesEntries } from "@ui8kit/app-shared/data/stores"; + +const STORES_FIELDS = { + "id": "id", + "name": "title", + "kind": "metadata.store_kind.value", + "address": "metadata.address.value", + "hours": "metadata.hours.value", + "phone": "metadata.phone.value", + "note": "metadata.note.value", + "services": "metadata.services.value", +} as const; + +const stores = fromCodex(storesEntries, STORES_FIELDS, CODEX); + +export function LocationsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.locations} + + + {ui.blocks.docs.locations} + + + + + {ui.blocks.variants.locations.cards} + + + + + + + + {ui.blocks.variants.locations.list} + + + + + + + + {ui.blocks.variants.locations.map} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/LogosPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/LogosPage.tsx new file mode 100644 index 0000000..a274fc4 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/LogosPage.tsx @@ -0,0 +1,220 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The logos page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + LogoCloud, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Logo, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { logos as logosEntries } from "@ui8kit/app-shared/data/logos"; + +const LOGOS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value"} as const; + +const logos = fromCodex(logosEntries, LOGOS_FIELDS, CODEX); + +export function LogosPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.logos} + + + {ui.blocks.docs.logos} + + + + + {ui.blocks.variants.logos.grid4} + + + + + + + + {ui.blocks.variants.logos.grid3} + + + + + + + + {ui.blocks.variants.logos.row} + + + + + + + + {ui.blocks.variants.logos.icons} + + + + + + + + {ui.blocks.variants.logos.grid2} + + + + + + + + {ui.blocks.variants.logos.tiles4} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/MedialistPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/MedialistPage.tsx new file mode 100644 index 0000000..93218e2 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/MedialistPage.tsx @@ -0,0 +1,285 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The medialist page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + MediaList, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Category, + type Feature, + type Post, + type Review, + type Stat, + type Step, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { categories as categoriesEntries } from "@ui8kit/app-shared/data/categories"; +import { channels as channelsEntries } from "@ui8kit/app-shared/data/channels"; +import { steps as stepsEntries } from "@ui8kit/app-shared/data/steps"; +import { posts as postsEntries } from "@ui8kit/app-shared/data/posts"; +import { reviews as reviewsEntries } from "@ui8kit/app-shared/data/reviews"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const CATEGORIES_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","count":"metadata.count.value","href":"slug|route"} as const; +const CHANNELS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; +const STEPS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; +const POSTS_FIELDS = { + "id": "id", + "title": "title", + "excerpt": "excerpt", + "category": "terms|term:category", + "author": "author_id|author", + "date": "metadata.date.value|date", + "minutes": "metadata.minutes.value", + "icon": "metadata.icon.value", + "href": "slug|route", + "image": "featured_media_id|media", +} as const; +const REVIEWS_FIELDS = { + "id": "id", + "title": "title", + "author": "author_id|author", + "rating": "metadata.rating.value", + "text": "metadata.text.value", + "date": "metadata.date.value|date", +} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const categories = fromCodex(categoriesEntries, CATEGORIES_FIELDS, CODEX); +const channels = fromCodex(channelsEntries, CHANNELS_FIELDS, CODEX); +const steps = fromCodex(stepsEntries, STEPS_FIELDS, CODEX); +const posts = fromCodex(postsEntries, POSTS_FIELDS, CODEX); +const reviews = fromCodex(reviewsEntries, REVIEWS_FIELDS, CODEX); + +const MEDIALIST_LABELS = { + count: ui.marketing.mediaList.count, + minutes: ui.content.labels.minutes, + featured: ui.marketing.mediaList.featured, + rating: ui.testimonials.rating, + figures: ui.marketing.mediaList.supportFigures, +} as const; +const MEDIALIST_EXTRAS = { stats, steps, posts, topics: categories, channels, reviews } as const; + +export function MedialistPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.medialist} + + + {ui.blocks.docs.medialist} + + + + + {ui.blocks.variants.medialist.figuresStart} + + + + + + + + {ui.blocks.variants.medialist.proofReview} + + + + + + + + {ui.blocks.variants.medialist.stepsRows} + + + + + + + + {ui.blocks.variants.medialist.latestPosts} + + + + + + + + {ui.blocks.variants.medialist.topicRows} + + + + + + + + {ui.blocks.variants.medialist.contactStart} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/MegamenuPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/MegamenuPage.tsx new file mode 100644 index 0000000..fd8de21 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/MegamenuPage.tsx @@ -0,0 +1,174 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The megamenu page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + MegaMenu, + Stack, + Text, + Title, + tpl, + uniqLabel, + type MegaGroup, + type NavLink, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { navlinks as navlinksEntries } from "@ui8kit/app-shared/data/navlinks"; +import { megagroups as megagroupsEntries } from "@ui8kit/app-shared/data/megagroups"; + +const NAVLINKS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; +const MEGAGROUPS_FIELDS = {"id":"id","title":"title","icon":"metadata.icon.value","links":"id|menu","href":"slug|route"} as const; + +const navlinks = fromCodex(navlinksEntries, NAVLINKS_FIELDS, CODEX); +const megagroups = fromCodex(megagroupsEntries, MEGAGROUPS_FIELDS, CODEX); + +export function MegamenuPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.megamenu} + + + {ui.blocks.docs.megamenu} + + + + + {ui.blocks.variants.megamenu.open} + + + + + + + + {ui.blocks.variants.megamenu.closed} + + + + + + + + {ui.blocks.variants.megamenu.twoCols} + + + + + + + + {ui.blocks.variants.megamenu.promo} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/MetricsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/MetricsPage.tsx new file mode 100644 index 0000000..3908871 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/MetricsPage.tsx @@ -0,0 +1,168 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The metrics page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + MetricRow, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { metrics as metricsEntries } from "@ui8kit/app-shared/data/metrics"; + +const METRICS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; + +const metrics = fromCodex(metricsEntries, METRICS_FIELDS, CODEX); + +export function MetricsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.metrics} + + + {ui.blocks.docs.metrics} + + + + + {ui.blocks.variants.metrics.tiles} + + + + + + + + {ui.blocks.variants.metrics.twoUp} + + + + + + + + {ui.blocks.variants.metrics.compact} + + + + + + + + {ui.blocks.variants.metrics.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/NavbarPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/NavbarPage.tsx new file mode 100644 index 0000000..c5288dd --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/NavbarPage.tsx @@ -0,0 +1,230 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The navbar page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + NavBar, + Stack, + Text, + Title, + tpl, + uniqLabel, + type NavLink, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { toggleTheme } from "@ui8kit/app-shared/runtime/theme"; +import { ui } from "@ui8kit/app-shared/content"; +import { navlinks as navlinksEntries } from "@ui8kit/app-shared/data/navlinks"; + +const NAVLINKS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; + +const navlinks = fromCodex(navlinksEntries, NAVLINKS_FIELDS, CODEX); +const actions = { toggleTheme }; + +const NAVBAR_ACTIONS = { cta: ui.site.header.cta, href: "#/", login: ui.site.header.login, loginHref: "#/login" } as const; + +export function NavbarPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.navbar} + + + {ui.blocks.docs.navbar} + + + + + {ui.blocks.variants.navbar.inline} + + + actions.toggleTheme()} + /> + + + + + {ui.blocks.variants.navbar.split} + + + actions.toggleTheme()} + /> + + + + + {ui.blocks.variants.navbar.search} + + + actions.toggleTheme()} + /> + + + + + {ui.blocks.variants.navbar.media} + + + actions.toggleTheme()} + /> + + + + + {ui.blocks.variants.navbar.plain} + + + actions.toggleTheme()} + /> + + + + + {ui.blocks.variants.navbar.inverse} + + + actions.toggleTheme()} + /> + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/NewsletterPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/NewsletterPage.tsx new file mode 100644 index 0000000..9622fef --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/NewsletterPage.tsx @@ -0,0 +1,185 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The newsletter page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + NewsletterForm, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function NewsletterPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.promo.title} + + + {ui.blocks.names.newsletter} + + + {ui.blocks.docs.newsletter} + + + + + {ui.blocks.variants.newsletter.inline} + + + + + + + + {ui.blocks.variants.newsletter.stacked} + + + + + + + + {ui.blocks.variants.newsletter.split} + + + + + + + + {ui.blocks.variants.newsletter.consent} + + + + + + + + {ui.blocks.variants.newsletter.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/NotfoundPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/NotfoundPage.tsx new file mode 100644 index 0000000..ca00a93 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/NotfoundPage.tsx @@ -0,0 +1,25 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The notfound page of BlocksScreen. + +import { Block, Button, Container, Group, Stack, Title } from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function NotfoundPage() { + return ( + + + + + {ui.site.notFound.title} + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/OrdersPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/OrdersPage.tsx new file mode 100644 index 0000000..676845a --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/OrdersPage.tsx @@ -0,0 +1,178 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The orders page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + OrderTable, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Order, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { orders as ordersEntries } from "@ui8kit/app-shared/data/orders"; + +const ORDERS_FIELDS = { + "id": "id", + "number": "title", + "date": "metadata.date.value|date", + "total": "metadata.total.value", + "currency": "metadata.currency.value", + "status": "metadata.order_status.value", + "items": "metadata.items.value", +} as const; + +const orders = fromCodex(ordersEntries, ORDERS_FIELDS, CODEX); + +export function OrdersPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.orders} + + + {ui.blocks.docs.orders} + + + + + {ui.blocks.variants.orders.table} + + + + + + + + {ui.blocks.variants.orders.cards} + + + + + + + + {ui.blocks.variants.orders.noPager} + + + + + + + + {ui.blocks.variants.orders.compactMuted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/OverviewPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/OverviewPage.tsx new file mode 100644 index 0000000..8018a1c --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/OverviewPage.tsx @@ -0,0 +1,189 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The overview page of BlocksScreen. + +import { + Block, + Box, + Container, + DashboardOverview, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Event, + type Point, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { activity as activityEntries } from "@ui8kit/app-shared/data/activity"; +import { series as seriesEntries } from "@ui8kit/app-shared/data/series"; +import { metrics as metricsEntries } from "@ui8kit/app-shared/data/metrics"; + +const ACTIVITY_FIELDS = { + "id": "id", + "title": "title", + "text": "metadata.text.value", + "time": "metadata.time.value|ago", + "tone": "metadata.tone.value", +} as const; +const SERIES_FIELDS = {"id":"id","label":"title","value":"metadata.value.value"} as const; +const METRICS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; + +const activity = fromCodex(activityEntries, ACTIVITY_FIELDS, CODEX); +const series = fromCodex(seriesEntries, SERIES_FIELDS, CODEX); +const metrics = fromCodex(metricsEntries, METRICS_FIELDS, CODEX); + +const OVERVIEW_CHART = { title: ui.dashboard.chart.title, text: ui.dashboard.chart.text, summary: ui.dashboard.chart.summary, series } as const; +const OVERVIEW_ACTIVITY = { title: ui.dashboard.activity.title, text: ui.dashboard.activity.text, events: activity } as const; + +export function OverviewPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.overview} + + + {ui.blocks.docs.overview} + + + + + {ui.blocks.variants.overview.split} + + + + + + + + {ui.blocks.variants.overview.stacked} + + + + + + + + {ui.blocks.variants.overview.twoCols} + + + + + + + + {ui.blocks.variants.overview.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PageheadPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PageheadPage.tsx new file mode 100644 index 0000000..172e971 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PageheadPage.tsx @@ -0,0 +1,131 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The pagehead page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PageIntro, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function PageheadPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.pagehead} + + + {ui.blocks.docs.pagehead} + + + + + {ui.blocks.variants.pagehead.start} + + + + + + + + {ui.blocks.variants.pagehead.center} + + + + + + + + {ui.blocks.variants.pagehead.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PagetrailPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PagetrailPage.tsx new file mode 100644 index 0000000..82e25f7 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PagetrailPage.tsx @@ -0,0 +1,188 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The pagetrail page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PageTrail, + Stack, + Text, + Title, + tpl, + uniqLabel, + type NavLink, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { crumbs as crumbsEntries } from "@ui8kit/app-shared/data/crumbs"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const CRUMBS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const crumbs = fromCodex(crumbsEntries, CRUMBS_FIELDS, CODEX); + +const PAGETRAIL_EXTRAS = { + value: ui.marketing.pageTrail.value, + caption: ui.marketing.pageTrail.caption, + note: ui.marketing.pageTrail.note, + icon: "package", + facts: stats, +} as const; + +export function PagetrailPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.pagetrail} + + + {ui.blocks.docs.pagetrail} + + + + + {ui.blocks.variants.pagetrail.crumbs} + + + + + + + + {ui.blocks.variants.pagetrail.crumbsFigure} + + + + + + + + {ui.blocks.variants.pagetrail.crumbsNote} + + + + + + + + {ui.blocks.variants.pagetrail.keyFacts} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PhotosPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PhotosPage.tsx new file mode 100644 index 0000000..4367c87 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PhotosPage.tsx @@ -0,0 +1,226 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The photos page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PhotoGallery, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Photo, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { photos as photosEntries } from "@ui8kit/app-shared/data/photos"; + +const PHOTOS_FIELDS = {"id":"id","title":"title","tag":"metadata.tag.value","size":"metadata.size.value"} as const; + +const photos = fromCodex(photosEntries, PHOTOS_FIELDS, CODEX); + +export function PhotosPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.photos} + + + {ui.blocks.docs.photos} + + + + + {ui.blocks.variants.photos.grid} + + + + + + + + {ui.blocks.variants.photos.gridPlain} + + + + + + + + {ui.blocks.variants.photos.masonry} + + + + + + + + {ui.blocks.variants.photos.mosaic} + + + + + + + + {ui.blocks.variants.photos.featured} + + + + + + + + {ui.blocks.variants.photos.cards} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PlanPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PlanPage.tsx new file mode 100644 index 0000000..0760187 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PlanPage.tsx @@ -0,0 +1,136 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The plan page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PricingCard, + Stack, + Text, + Title, + type Plan, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { tiers as tiersEntries } from "@ui8kit/app-shared/data/tiers"; + +const TIERS_FIELDS = { + "id": "id", + "name": "title", + "tagline": "metadata.tagline.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "seats": "metadata.seats.value", + "storage": "metadata.storage.value", + "highlighted": "metadata.highlighted.value", + "features": "metadata.features.value", + "yearly": "metadata.yearly.value", +} as const; + +const tiers = fromCodex(tiersEntries, TIERS_FIELDS, CODEX); + +export function PlanPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.plan} + + + {ui.blocks.docs.plan} + + + + + {ui.blocks.variants.plan.standard} + + + + i.id === "tier-team")!} + labels={ui.pricing} + emphasis="auto" + density="default" + /> + + + + + + {ui.blocks.variants.plan.flat} + + + + i.id === "tier-team")!} + labels={ui.pricing} + emphasis="off" + density="default" + /> + + + + + + {ui.blocks.variants.plan.compact} + + + + i.id === "tier-team")!} + labels={ui.pricing} + emphasis="auto" + density="compact" + /> + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PostheaderPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PostheaderPage.tsx new file mode 100644 index 0000000..0215bb3 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PostheaderPage.tsx @@ -0,0 +1,168 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The postheader page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PostHeader, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Post, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { posts as postsEntries } from "@ui8kit/app-shared/data/posts"; + +const POSTS_FIELDS = { + "id": "id", + "title": "title", + "excerpt": "excerpt", + "category": "terms|term:category", + "author": "author_id|author", + "date": "metadata.date.value|date", + "minutes": "metadata.minutes.value", + "icon": "metadata.icon.value", + "href": "slug|route", + "image": "featured_media_id|media", +} as const; + +const posts = fromCodex(postsEntries, POSTS_FIELDS, CODEX); + +export function PostheaderPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.content.title} + + + {ui.blocks.names.postheader} + + + {ui.blocks.docs.postheader} + + + + + {ui.blocks.variants.postheader.start} + + + i.id === "post-static-first")!} + labels={ui.content.labels} + layout="start" + cover="show" + meta="full" + tone="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postheader, ui.blocks.variants.postheader.start))} + /> + + + + + {ui.blocks.variants.postheader.center} + + + i.id === "post-static-first")!} + labels={ui.content.labels} + layout="center" + cover="show" + meta="full" + tone="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postheader, ui.blocks.variants.postheader.center))} + /> + + + + + {ui.blocks.variants.postheader.noCover} + + + i.id === "post-static-first")!} + labels={ui.content.labels} + layout="start" + cover="hide" + meta="full" + tone="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postheader, ui.blocks.variants.postheader.noCover))} + /> + + + + + {ui.blocks.variants.postheader.minimal} + + + i.id === "post-static-first")!} + labels={ui.content.labels} + layout="center" + cover="hide" + meta="short" + tone="muted" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postheader, ui.blocks.variants.postheader.minimal))} + /> + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PostsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PostsPage.tsx new file mode 100644 index 0000000..1266205 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PostsPage.tsx @@ -0,0 +1,340 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The posts page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PostGrid, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Post, + type PostTopic, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { posts as postsEntries } from "@ui8kit/app-shared/data/posts"; +import { topics as topicsEntries } from "@ui8kit/app-shared/data/topics"; + +const POSTS_FIELDS = { + "id": "id", + "title": "title", + "excerpt": "excerpt", + "category": "terms|term:category", + "author": "author_id|author", + "date": "metadata.date.value|date", + "minutes": "metadata.minutes.value", + "icon": "metadata.icon.value", + "href": "slug|route", + "image": "featured_media_id|media", +} as const; +const TOPICS_FIELDS = {"id":"id","title":"title","value":"metadata.value.value"} as const; + +const posts = fromCodex(postsEntries, POSTS_FIELDS, CODEX); +const topics = fromCodex(topicsEntries, TOPICS_FIELDS, CODEX); + +const POSTS_FILTER = { topics, label: ui.vibe.posts.topics, topic: "" } as const; + +export function PostsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.content.title} + + + {ui.blocks.names.posts} + + + {ui.blocks.docs.posts} + + + + + {ui.blocks.variants.posts.grid} + + + + + + + + {ui.blocks.variants.posts.filters} + + + + + + + + {ui.blocks.variants.posts.twoUp} + + + + + + + + {ui.blocks.variants.posts.row4} + + + + + + + + {ui.blocks.variants.posts.news4} + + + + + + + + {ui.blocks.variants.posts.list} + + + + + + + + {ui.blocks.variants.posts.magazine} + + + + + + + + {ui.blocks.variants.posts.textOnly} + + + + + + + + {ui.blocks.variants.posts.digest} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PostshowcasePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PostshowcasePage.tsx new file mode 100644 index 0000000..0b274fd --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PostshowcasePage.tsx @@ -0,0 +1,184 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The postshowcase page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PostShowcase, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Post, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { posts as postsEntries } from "@ui8kit/app-shared/data/posts"; + +const POSTS_FIELDS = { + "id": "id", + "title": "title", + "excerpt": "excerpt", + "category": "terms|term:category", + "author": "author_id|author", + "date": "metadata.date.value|date", + "minutes": "metadata.minutes.value", + "icon": "metadata.icon.value", + "href": "slug|route", + "image": "featured_media_id|media", +} as const; + +const posts = fromCodex(postsEntries, POSTS_FIELDS, CODEX); + +export function PostshowcasePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.content.title} + + + {ui.blocks.names.postshowcase} + + + {ui.blocks.docs.postshowcase} + + + + + {ui.blocks.variants.postshowcase.introCards} + + + + + + + + {ui.blocks.variants.postshowcase.featuredEnd} + + + + + + + + {ui.blocks.variants.postshowcase.overlay3} + + + + + + + + {ui.blocks.variants.postshowcase.overlay2} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PostsplitPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PostsplitPage.tsx new file mode 100644 index 0000000..f3d41a2 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PostsplitPage.tsx @@ -0,0 +1,254 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The postsplit page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PostSplit, + Stack, + Text, + Title, + tpl, + uniqLabel, + type NavLink, + type Post, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { posts as postsEntries } from "@ui8kit/app-shared/data/posts"; +import { posttags as posttagsEntries } from "@ui8kit/app-shared/data/posttags"; +import { outline as outlineEntries } from "@ui8kit/app-shared/data/outline"; + +const POSTS_FIELDS = { + "id": "id", + "title": "title", + "excerpt": "excerpt", + "category": "terms|term:category", + "author": "author_id|author", + "date": "metadata.date.value|date", + "minutes": "metadata.minutes.value", + "icon": "metadata.icon.value", + "href": "slug|route", + "image": "featured_media_id|media", +} as const; +const POSTTAGS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value"} as const; +const OUTLINE_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; + +const posts = fromCodex(postsEntries, POSTS_FIELDS, CODEX); +const posttags = fromCodex(posttagsEntries, POSTTAGS_FIELDS, CODEX); +const outline = fromCodex(outlineEntries, OUTLINE_FIELDS, CODEX); + +const POSTSPLIT_EXTRAS = { + role: ui.content.postSplit.role, + bio: ui.content.postSplit.bio, + views: ui.content.postSplit.views, + likes: ui.content.postSplit.likes, + tags: posttags, + outline, +} as const; + +export function PostsplitPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.content.title} + + + {ui.blocks.names.postsplit} + + + {ui.blocks.docs.postsplit} + + + + + {ui.blocks.variants.postsplit.centerShare} + + + i.id === "post-static-first")!} + labels={ui.content.postSplit.labels} + extras={POSTSPLIT_EXTRAS} + layout="center" + mediaSide="end" + author="line" + cover="wide" + actions="pair" + tone="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postsplit, ui.blocks.variants.postsplit.centerShare))} + /> + + + + + {ui.blocks.variants.postsplit.splitTags} + + + i.id === "post-static-first")!} + labels={ui.content.postSplit.labels} + extras={POSTSPLIT_EXTRAS} + layout="split" + mediaSide="end" + author="line" + cover="wide" + actions="pair" + tone="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postsplit, ui.blocks.variants.postsplit.splitTags))} + /> + + + + + {ui.blocks.variants.postsplit.splitBioStart} + + + i.id === "post-static-first")!} + labels={ui.content.postSplit.labels} + extras={POSTSPLIT_EXTRAS} + layout="split" + mediaSide="start" + author="bio" + cover="wide" + actions="wide" + tone="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postsplit, ui.blocks.variants.postsplit.splitBioStart))} + /> + + + + + {ui.blocks.variants.postsplit.splitSquare} + + + i.id === "post-static-first")!} + labels={ui.content.postSplit.labels} + extras={POSTSPLIT_EXTRAS} + layout="split" + mediaSide="end" + author="line" + cover="square" + actions="icons" + tone="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postsplit, ui.blocks.variants.postsplit.splitSquare))} + /> + + + + + {ui.blocks.variants.postsplit.outlineStart} + + + i.id === "post-static-first")!} + labels={ui.content.postSplit.labels} + extras={POSTSPLIT_EXTRAS} + layout="outline" + mediaSide="start" + author="line" + cover="wide" + actions="pair" + tone="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postsplit, ui.blocks.variants.postsplit.outlineStart))} + /> + + + + + {ui.blocks.variants.postsplit.splitStats} + + + i.id === "post-static-first")!} + labels={ui.content.postSplit.labels} + extras={POSTSPLIT_EXTRAS} + layout="split" + mediaSide="end" + author="card" + cover="wide" + actions="pair" + tone="muted" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.postsplit, ui.blocks.variants.postsplit.splitStats))} + /> + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/PricingPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/PricingPage.tsx new file mode 100644 index 0000000..2051645 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/PricingPage.tsx @@ -0,0 +1,373 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The pricing page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + PricingTiers, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Plan, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { tiers as tiersEntries } from "@ui8kit/app-shared/data/tiers"; +import { duo as duoEntries } from "@ui8kit/app-shared/data/duo"; + +const TIERS_FIELDS = { + "id": "id", + "name": "title", + "tagline": "metadata.tagline.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "seats": "metadata.seats.value", + "storage": "metadata.storage.value", + "highlighted": "metadata.highlighted.value", + "features": "metadata.features.value", + "yearly": "metadata.yearly.value", +} as const; +const DUO_FIELDS = { + "id": "id", + "name": "title", + "tagline": "metadata.tagline.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "seats": "metadata.seats.value", + "storage": "metadata.storage.value", + "highlighted": "metadata.highlighted.value", + "features": "metadata.features.value", + "yearly": "metadata.yearly.value", +} as const; + +const tiers = fromCodex(tiersEntries, TIERS_FIELDS, CODEX); +const duo = fromCodex(duoEntries, DUO_FIELDS, CODEX); + +export function PricingPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.pricing} + + + {ui.blocks.docs.pricing} + + + + + {ui.blocks.variants.pricing.grid} + + + + + + + + {ui.blocks.variants.pricing.monthly} + + + + + + + + {ui.blocks.variants.pricing.annual} + + + + + + + + {ui.blocks.variants.pricing.duo} + + + + + + + + {ui.blocks.variants.pricing.grid2} + + + + + + + + {ui.blocks.variants.pricing.grid4} + + + + + + + + {ui.blocks.variants.pricing.stack} + + + + + + + + {ui.blocks.variants.pricing.flat} + + + + + + + + {ui.blocks.variants.pricing.compactMuted} + + + + + + + + {ui.blocks.variants.pricing.roomy} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ProductPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ProductPage.tsx new file mode 100644 index 0000000..a28c7a2 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ProductPage.tsx @@ -0,0 +1,217 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The product page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + ProductDetail, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Product, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { products as productsEntries } from "@ui8kit/app-shared/data/products"; + +const PRODUCTS_FIELDS = { + "id": "id", + "name": "title", + "summary": "metadata.summary.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "rating": "metadata.rating.value", + "reviews": "metadata.reviews.value", + "badge": "metadata.badge.value", + "category": "terms|term:product_category", + "inStock": "metadata.inStock.value", + "compareAt": "metadata.compare_at.value", + "href": "slug|route", + "image": "featured_media_id|media", +} as const; + +const products = fromCodex(productsEntries, PRODUCTS_FIELDS, CODEX); + +export function ProductPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.product} + + + {ui.blocks.docs.product} + + + + + {ui.blocks.variants.product.split} + + + i.id === "product-lamp")!} + labels={ui.commerce.detail} + badges={ui.commerce.badges} + layout="split" + mediaSide="start" + thumbs="below" + buy="full" + tone="default" + density="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.product, ui.blocks.variants.product.split))} + /> + + + + + {ui.blocks.variants.product.splitEnd} + + + i.id === "product-lamp")!} + labels={ui.commerce.detail} + badges={ui.commerce.badges} + layout="split" + mediaSide="end" + thumbs="below" + buy="full" + tone="default" + density="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.product, ui.blocks.variants.product.splitEnd))} + /> + + + + + {ui.blocks.variants.product.stacked} + + + i.id === "product-lamp")!} + labels={ui.commerce.detail} + badges={ui.commerce.badges} + layout="stacked" + mediaSide="start" + thumbs="none" + buy="full" + tone="default" + density="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.product, ui.blocks.variants.product.stacked))} + /> + + + + + {ui.blocks.variants.product.compact} + + + i.id === "product-lamp")!} + labels={ui.commerce.detail} + badges={ui.commerce.badges} + layout="split" + mediaSide="start" + thumbs="none" + buy="compact" + tone="default" + density="default" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.product, ui.blocks.variants.product.compact))} + /> + + + + + {ui.blocks.variants.product.muted} + + + i.id === "product-lamp")!} + labels={ui.commerce.detail} + badges={ui.commerce.badges} + layout="split" + mediaSide="start" + thumbs="below" + buy="full" + tone="muted" + density="roomy" + level={2} + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.product, ui.blocks.variants.product.muted))} + /> + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ProductinfoPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ProductinfoPage.tsx new file mode 100644 index 0000000..f85726c --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ProductinfoPage.tsx @@ -0,0 +1,140 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The productinfo page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + ProductInfo, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Detail, + type Spec, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { details as detailsEntries } from "@ui8kit/app-shared/data/details"; +import { specs as specsEntries } from "@ui8kit/app-shared/data/specs"; + +const DETAILS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value"} as const; +const SPECS_FIELDS = {"id":"id","label":"title","value":"metadata.value.value"} as const; + +const details = fromCodex(detailsEntries, DETAILS_FIELDS, CODEX); +const specs = fromCodex(specsEntries, SPECS_FIELDS, CODEX); + +export function ProductinfoPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.productinfo} + + + {ui.blocks.docs.productinfo} + + + + + {ui.blocks.variants.productinfo.split} + + + + + + + + {ui.blocks.variants.productinfo.stacked} + + + + + + + + {ui.blocks.variants.productinfo.closed} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ProductsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ProductsPage.tsx new file mode 100644 index 0000000..1c23773 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ProductsPage.tsx @@ -0,0 +1,342 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The products page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + ProductGrid, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Product, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { products as productsEntries } from "@ui8kit/app-shared/data/products"; + +const PRODUCTS_FIELDS = { + "id": "id", + "name": "title", + "summary": "metadata.summary.value", + "price": "metadata.price.value", + "currency": "metadata.currency.value", + "rating": "metadata.rating.value", + "reviews": "metadata.reviews.value", + "badge": "metadata.badge.value", + "category": "terms|term:product_category", + "inStock": "metadata.inStock.value", + "compareAt": "metadata.compare_at.value", + "href": "slug|route", + "image": "featured_media_id|media", +} as const; + +const products = fromCodex(productsEntries, PRODUCTS_FIELDS, CODEX); + +export function ProductsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.products} + + + {ui.blocks.docs.products} + + + + + {ui.blocks.variants.products.grid3} + + + + + + + + {ui.blocks.variants.products.grid4} + + + + + + + + {ui.blocks.variants.products.grid2} + + + + + + + + {ui.blocks.variants.products.list} + + + + + + + + {ui.blocks.variants.products.catalog} + + + + + + + + {ui.blocks.variants.products.browse} + + + + + + + + {ui.blocks.variants.products.showcase} + + + + + + + + {ui.blocks.variants.products.rail} + + + + + + + + {ui.blocks.variants.products.railCompact} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ProfilePage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ProfilePage.tsx new file mode 100644 index 0000000..d1db3e9 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ProfilePage.tsx @@ -0,0 +1,149 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The profile page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + ProfileForm, + Stack, + Text, + Title, + tpl, + uniqLabel, +} from "@ui8kit/react-ui"; +import { ui } from "@ui8kit/app-shared/content"; + +export function ProfilePage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.account.title} + + + {ui.blocks.names.profile} + + + {ui.blocks.docs.profile} + + + + + {ui.blocks.variants.profile.stacked} + + + + + + + + {ui.blocks.variants.profile.split} + + + + + + + + {ui.blocks.variants.profile.minimal} + + + + + + + + {ui.blocks.variants.profile.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ProjectsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ProjectsPage.tsx new file mode 100644 index 0000000..8ccdb44 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ProjectsPage.tsx @@ -0,0 +1,229 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The projects page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + ProjectGrid, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Project, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { projects as projectsEntries } from "@ui8kit/app-shared/data/projects"; + +const PROJECTS_FIELDS = { + "id": "id", + "title": "title", + "category": "terms|term:project_category", + "year": "metadata.year.value", + "summary": "metadata.summary.value", + "tags": "metadata.tags.value", + "featured": "metadata.featured.value", + "client": "metadata.client.value", +} as const; + +const projects = fromCodex(projectsEntries, PROJECTS_FIELDS, CODEX); + +export function ProjectsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.projects} + + + {ui.blocks.docs.projects} + + + + + {ui.blocks.variants.projects.cards} + + + + + + + + {ui.blocks.variants.projects.compact} + + + + + + + + {ui.blocks.variants.projects.overlay} + + + + + + + + {ui.blocks.variants.projects.bento} + + + + + + + + {ui.blocks.variants.projects.list} + + + + + + + + {ui.blocks.variants.projects.cardsMuted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ProofPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ProofPage.tsx new file mode 100644 index 0000000..12d2bbe --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ProofPage.tsx @@ -0,0 +1,176 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The proof page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + ProofBand, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Logo, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { logos as logosEntries } from "@ui8kit/app-shared/data/logos"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const LOGOS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value"} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const logos = fromCodex(logosEntries, LOGOS_FIELDS, CODEX); + +export function ProofPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.proof} + + + {ui.blocks.docs.proof} + + + + + {ui.blocks.variants.proof.above} + + + + + + + + {ui.blocks.variants.proof.beside} + + + + + + + + {ui.blocks.variants.proof.icons} + + + + + + + + {ui.blocks.variants.proof.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/QuotesplitPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/QuotesplitPage.tsx new file mode 100644 index 0000000..4c2fdd1 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/QuotesplitPage.tsx @@ -0,0 +1,272 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The quotesplit page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + QuoteSplit, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Logo, + type Quote, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; +import { logos as logosEntries } from "@ui8kit/app-shared/data/logos"; +import { testimonials as testimonialsEntries } from "@ui8kit/app-shared/data/testimonials"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; +const LOGOS_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value"} as const; +const TESTIMONIALS_FIELDS = { + "id": "id", + "author": "title", + "role": "metadata.role.value", + "company": "metadata.company.value", + "quote": "metadata.quote.value", + "rating": "metadata.rating.value", + "handle": "metadata.handle.value", + "time": "metadata.time.value|ago-short", + "mark": "metadata.mark.value", +} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); +const logos = fromCodex(logosEntries, LOGOS_FIELDS, CODEX); +const testimonials = fromCodex(testimonialsEntries, TESTIMONIALS_FIELDS, CODEX); + +const QUOTESPLIT_LABELS = { rating: ui.testimonials.rating, byLine: ui.testimonials.byLine, handleLine: ui.testimonials.handleLine } as const; +const QUOTESPLIT_EXTRAS = { stats, logos, rating: 5, score: ui.marketing.quoteSplit.score, reviews: ui.marketing.quoteSplit.reviews } as const; +const QUOTESPLIT_ACTIONS = { + mode: "two", + cta: ui.marketing.quoteSplit.cta, + href: "#/customers", + secondary: ui.marketing.quoteSplit.secondary, + secondaryHref: "#/contact", +} as const; + +export function QuotesplitPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.quotesplit} + + + {ui.blocks.docs.quotesplit} + + + + + {ui.blocks.variants.quotesplit.quoteCard} + + + + + + + + {ui.blocks.variants.quotesplit.logoTiles} + + + + + + + + {ui.blocks.variants.quotesplit.ratingPanel} + + + + + + + + {ui.blocks.variants.quotesplit.stackedCards} + + + + + + + + {ui.blocks.variants.quotesplit.compact4} + + + + + + + + {ui.blocks.variants.quotesplit.bentoFigures} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ReviewsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ReviewsPage.tsx new file mode 100644 index 0000000..577356e --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ReviewsPage.tsx @@ -0,0 +1,200 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The reviews page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + ReviewList, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Review, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { reviews as reviewsEntries } from "@ui8kit/app-shared/data/reviews"; + +const REVIEWS_FIELDS = { + "id": "id", + "title": "title", + "author": "author_id|author", + "rating": "metadata.rating.value", + "text": "metadata.text.value", + "date": "metadata.date.value|date", +} as const; + +const reviews = fromCodex(reviewsEntries, REVIEWS_FIELDS, CODEX); + +export function ReviewsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.reviews} + + + {ui.blocks.docs.reviews} + + + + + {ui.blocks.variants.reviews.list} + + + + + + + + {ui.blocks.variants.reviews.grid} + + + + + + + + {ui.blocks.variants.reviews.plain} + + + + + + + + {ui.blocks.variants.reviews.avatars} + + + + + + + + {ui.blocks.variants.reviews.mutedGrid} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ScreenHeader.tsx b/apps/host-react/xgen/screens/BlocksScreen/ScreenHeader.tsx new file mode 100644 index 0000000..ae2f12d --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ScreenHeader.tsx @@ -0,0 +1,43 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The ScreenHeader part of BlocksScreen: its own file, so each file of the screen opens on one Block. + +import { Block, Button, Container, Group, Link, LinkPlain } from "@ui8kit/react-ui"; +import { toggleTheme } from "@ui8kit/app-shared/runtime/theme"; +import { ui } from "@ui8kit/app-shared/content"; + +const actions = { toggleTheme }; + +export function ScreenHeader() { + return ( + + + {ui.site.header.skip} + + + + {ui.blocks.title} + + + + {ui.catalog.title} + + + {ui.skins.title} + + + {ui.discovery.title} + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/ShellPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/ShellPage.tsx new file mode 100644 index 0000000..68a1d42 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/ShellPage.tsx @@ -0,0 +1,198 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The shell page of BlocksScreen. + +import { + AppShell, + Block, + Box, + Container, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Event, + type NavLink, + type Point, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { activity as activityEntries } from "@ui8kit/app-shared/data/activity"; +import { series as seriesEntries } from "@ui8kit/app-shared/data/series"; +import { sidenav as sidenavEntries } from "@ui8kit/app-shared/data/sidenav"; +import { metrics as metricsEntries } from "@ui8kit/app-shared/data/metrics"; + +const ACTIVITY_FIELDS = { + "id": "id", + "title": "title", + "text": "metadata.text.value", + "time": "metadata.time.value|ago", + "tone": "metadata.tone.value", +} as const; +const SERIES_FIELDS = {"id":"id","label":"title","value":"metadata.value.value"} as const; +const SIDENAV_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; +const METRICS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; + +const activity = fromCodex(activityEntries, ACTIVITY_FIELDS, CODEX); +const series = fromCodex(seriesEntries, SERIES_FIELDS, CODEX); +const sidenav = fromCodex(sidenavEntries, SIDENAV_FIELDS, CODEX); +const metrics = fromCodex(metricsEntries, METRICS_FIELDS, CODEX); + +const SHELL_NAV = { label: ui.vibe.sidebar.label, brand: ui.site.header.brand, links: sidenav, current: "item-overview" } as const; +const SHELL_CHART = { title: ui.dashboard.chart.title, text: ui.dashboard.chart.text, summary: ui.dashboard.chart.summary, series } as const; +const SHELL_ACTIVITY = { title: ui.dashboard.activity.title, text: ui.dashboard.activity.text, events: activity } as const; + +export function ShellPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.shell} + + + {ui.blocks.docs.shell} + + + + + {ui.blocks.variants.shell.sidebar} + + + + + + + + {ui.blocks.variants.shell.top} + + + + + + + + {ui.blocks.variants.shell.panes} + + + + + + + + {ui.blocks.variants.shell.dense} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/SidenavPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/SidenavPage.tsx new file mode 100644 index 0000000..09272d2 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/SidenavPage.tsx @@ -0,0 +1,166 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The sidenav page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + SidebarNav, + Stack, + Text, + Title, + tpl, + uniqLabel, + type NavLink, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { sidenav as sidenavEntries } from "@ui8kit/app-shared/data/sidenav"; + +const SIDENAV_FIELDS = {"id":"id","name":"title","icon":"metadata.icon.value","href":"slug|route"} as const; + +const sidenav = fromCodex(sidenavEntries, SIDENAV_FIELDS, CODEX); + +export function SidenavPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.sidenav} + + + {ui.blocks.docs.sidenav} + + + + + {ui.blocks.variants.sidenav.full} + + + + + + + + {ui.blocks.variants.sidenav.compact} + + + + + + + + {ui.blocks.variants.sidenav.noUser} + + + + + + + + {ui.blocks.variants.sidenav.dense} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/SitemapPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/SitemapPage.tsx new file mode 100644 index 0000000..be07f79 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/SitemapPage.tsx @@ -0,0 +1,228 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The sitemap page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + SitemapFooter, + Stack, + Text, + Title, + tpl, + uniqLabel, + type MegaGroup, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { sitemap as sitemapEntries } from "@ui8kit/app-shared/data/sitemap"; + +const SITEMAP_FIELDS = {"id":"id","title":"title","icon":"metadata.icon.value","links":"id|menu","href":"slug|route"} as const; + +const sitemap = fromCodex(sitemapEntries, SITEMAP_FIELDS, CODEX); + +const SITEMAP_SIGNUP = { title: ui.vibe.sitemap.signupTitle, label: ui.vibe.sitemap.signupLabel, submit: ui.vibe.sitemap.signupSubmit } as const; + +export function SitemapPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.sitemap} + + + {ui.blocks.docs.sitemap} + + + + + {ui.blocks.variants.sitemap.columns} + + + + + + + + {ui.blocks.variants.sitemap.card} + + + + + + + + {ui.blocks.variants.sitemap.row} + + + + + + + + {ui.blocks.variants.sitemap.newsletter} + + + + + + + + {ui.blocks.variants.sitemap.status} + + + + + + + + {ui.blocks.variants.sitemap.compact} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/SkeletonPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/SkeletonPage.tsx new file mode 100644 index 0000000..80a00c7 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/SkeletonPage.tsx @@ -0,0 +1,154 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The skeleton page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + SkeletonLayout, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Line, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { placeholders as placeholdersEntries } from "@ui8kit/app-shared/data/placeholders"; + +const PLACEHOLDERS_FIELDS = {"id":"id"} as const; + +const placeholders = fromCodex(placeholdersEntries, PLACEHOLDERS_FIELDS, CODEX); + +export function SkeletonPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.dashboard.title} + + + {ui.blocks.names.skeleton} + + + {ui.blocks.docs.skeleton} + + + + + {ui.blocks.variants.skeleton.cards} + + + + + + + + {ui.blocks.variants.skeleton.list} + + + + + + + + {ui.blocks.variants.skeleton.article} + + + + + + + + {ui.blocks.variants.skeleton.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/SlotsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/SlotsPage.tsx new file mode 100644 index 0000000..5a44885 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/SlotsPage.tsx @@ -0,0 +1,156 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The slots page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + SlotBoard, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Day, + type Zone, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { days as daysEntries } from "@ui8kit/app-shared/data/days"; +import { zones as zonesEntries } from "@ui8kit/app-shared/data/zones"; + +const DAYS_FIELDS = {"id":"id","title":"title","note":"metadata.note.value","slots":"metadata.slots.value","closed":"metadata.closed.value"} as const; +const ZONES_FIELDS = { + "id": "id", + "name": "title", + "area": "metadata.area.value", + "price": "metadata.price.value", + "freeFrom": "metadata.freeFrom.value", + "minOrder": "metadata.minOrder.value", + "time": "metadata.time.value", + "express": "metadata.express.value", + "currency": "metadata.currency.value", +} as const; + +const days = fromCodex(daysEntries, DAYS_FIELDS, CODEX); +const zones = fromCodex(zonesEntries, ZONES_FIELDS, CODEX); + +export function SlotsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.slots} + + + {ui.blocks.docs.slots} + + + + + {ui.blocks.variants.slots.split} + + + i.id === "zone-central")!} + labels={ui.commerce.slots} + layout="split" + item="card" + tone="default" + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.slots, ui.blocks.variants.slots.split))} + /> + + + + + {ui.blocks.variants.slots.plain} + + + i.id === "zone-central")!} + labels={ui.commerce.slots} + layout="split" + item="plain" + tone="default" + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.slots, ui.blocks.variants.slots.plain))} + /> + + + + + {ui.blocks.variants.slots.stacked} + + + i.id === "zone-central")!} + labels={ui.commerce.slots} + layout="stacked" + item="card" + tone="muted" + landmarkLabel={uniqLabel(tpl(ui.blocks.landmark, ui.blocks.names.slots, ui.blocks.variants.slots.stacked))} + /> + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/StatsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/StatsPage.tsx new file mode 100644 index 0000000..9f09998 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/StatsPage.tsx @@ -0,0 +1,296 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The stats page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + StatsBand, + Text, + Title, + tpl, + uniqLabel, + type Stat, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { stats as statsEntries } from "@ui8kit/app-shared/data/stats"; + +const STATS_FIELDS = { + "id": "id", + "label": "title", + "value": "metadata.value.value|number", + "icon": "metadata.icon.value", + "hint": "metadata.hint.value", +} as const; + +const stats = fromCodex(statsEntries, STATS_FIELDS, CODEX); + +export function StatsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.stats} + + + {ui.blocks.docs.stats} + + + + + {ui.blocks.variants.stats.plain4} + + + + + + + + {ui.blocks.variants.stats.panel} + + + + + + + + {ui.blocks.variants.stats.stack} + + + + + + + + {ui.blocks.variants.stats.image} + + + + + + + + {ui.blocks.variants.stats.cards} + + + + + + + + {ui.blocks.variants.stats.icons} + + + + + + + + {ui.blocks.variants.stats.muted2} + + + + + + + + {ui.blocks.variants.stats.cardsCompact} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/StepperPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/StepperPage.tsx new file mode 100644 index 0000000..492658a --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/StepperPage.tsx @@ -0,0 +1,170 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The stepper page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + Stepper, + Text, + Title, + tpl, + uniqLabel, + type Step, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { steps as stepsEntries } from "@ui8kit/app-shared/data/steps"; + +const STEPS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const steps = fromCodex(stepsEntries, STEPS_FIELDS, CODEX); + +export function StepperPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.onboarding.title} + + + {ui.blocks.names.stepper} + + + {ui.blocks.docs.stepper} + + + + + {ui.blocks.variants.stepper.horizontal} + + + + + + + + {ui.blocks.variants.stepper.vertical} + + + + + + + + {ui.blocks.variants.stepper.icons} + + + + + + + + {ui.blocks.variants.stepper.bare} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/StepsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/StepsPage.tsx new file mode 100644 index 0000000..853d252 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/StepsPage.tsx @@ -0,0 +1,220 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The steps page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + StepsList, + Text, + Title, + tpl, + uniqLabel, + type Step, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { steps as stepsEntries } from "@ui8kit/app-shared/data/steps"; + +const STEPS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const steps = fromCodex(stepsEntries, STEPS_FIELDS, CODEX); + +export function StepsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.steps} + + + {ui.blocks.docs.steps} + + + + + {ui.blocks.variants.steps.row} + + + + + + + + {ui.blocks.variants.steps.rowIcons} + + + + + + + + {ui.blocks.variants.steps.column} + + + + + + + + {ui.blocks.variants.steps.centered} + + + + + + + + {ui.blocks.variants.steps.columnIcons} + + + + + + + + {ui.blocks.variants.steps.compact} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/StickyPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/StickyPage.tsx new file mode 100644 index 0000000..78a7625 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/StickyPage.tsx @@ -0,0 +1,166 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The sticky page of BlocksScreen. + +import { + Block, + Box, + Container, + FeatureSticky, + Group, + Link, + Stack, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { features as featuresEntries } from "@ui8kit/app-shared/data/features"; + +const FEATURES_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const features = fromCodex(featuresEntries, FEATURES_FIELDS, CODEX); + +export function StickyPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.sticky} + + + {ui.blocks.docs.sticky} + + + + + {ui.blocks.variants.sticky.end} + + + + + + + + {ui.blocks.variants.sticky.start} + + + + + + + + {ui.blocks.variants.sticky.card} + + + + + + + + {ui.blocks.variants.sticky.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/StoreheroPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/StoreheroPage.tsx new file mode 100644 index 0000000..4e575c1 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/StoreheroPage.tsx @@ -0,0 +1,182 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The storehero page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + StoreHero, + Text, + Title, + tpl, + uniqLabel, + type Feature, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { perks as perksEntries } from "@ui8kit/app-shared/data/perks"; + +const PERKS_FIELDS = {"id":"id","title":"title","text":"metadata.text.value","icon":"metadata.icon.value"} as const; + +const perks = fromCodex(perksEntries, PERKS_FIELDS, CODEX); + +const STOREHERO_ACTIONS = { + mode: "two", + cta: ui.commerce.storeHero.cta, + href: "#/catalog", + secondary: ui.commerce.storeHero.secondary, + secondaryHref: "#/delivery", +} as const; + +export function StoreheroPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.storehero} + + + {ui.blocks.docs.storehero} + + + + + {ui.blocks.variants.storehero.overlay} + + + + + + + + {ui.blocks.variants.storehero.overlayStart} + + + + + + + + {ui.blocks.variants.storehero.backdrop} + + + + + + + + {ui.blocks.variants.storehero.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/StorytabsPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/StorytabsPage.tsx new file mode 100644 index 0000000..1d2919c --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/StorytabsPage.tsx @@ -0,0 +1,137 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The storytabs page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + StoryTabs, + Text, + Title, + tpl, + uniqLabel, + type Milestone, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { milestones as milestonesEntries } from "@ui8kit/app-shared/data/milestones"; + +const MILESTONES_FIELDS = {"id":"id","date":"metadata.date.value","title":"title","text":"metadata.text.value","tag":"metadata.tag.value"} as const; + +const milestones = fromCodex(milestonesEntries, MILESTONES_FIELDS, CODEX); + +export function StorytabsPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.content.title} + + + {ui.blocks.names.storytabs} + + + {ui.blocks.docs.storytabs} + + + + + {ui.blocks.variants.storytabs.yearTabs} + + + + + + + + {ui.blocks.variants.storytabs.carouselSplit} + + + + + + + + {ui.blocks.variants.storytabs.yearTabsMuted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/SummaryPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/SummaryPage.tsx new file mode 100644 index 0000000..cb081b0 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/SummaryPage.tsx @@ -0,0 +1,176 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The summary page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + OrderSummary, + Stack, + Text, + Title, + tpl, + uniqLabel, + type SummaryRow, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { summary as summaryEntries } from "@ui8kit/app-shared/data/summary"; + +const SUMMARY_FIELDS = { + "id": "id", + "label": "title", + "amount": "metadata.amount.value", + "currency": "metadata.currency.value", + "strong": "metadata.strong.value", +} as const; + +const summary = fromCodex(summaryEntries, SUMMARY_FIELDS, CODEX); + +export function SummaryPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.commerce.title} + + + {ui.blocks.names.summary} + + + {ui.blocks.docs.summary} + + + + + {ui.blocks.variants.summary.card} + + + + + + + + {ui.blocks.variants.summary.plain} + + + + + + + + {ui.blocks.variants.summary.noCta} + + + + + + + + {ui.blocks.variants.summary.muted} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/TeamPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/TeamPage.tsx new file mode 100644 index 0000000..bc60a86 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/TeamPage.tsx @@ -0,0 +1,234 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The team page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + TeamGrid, + Text, + Title, + tpl, + uniqLabel, + type Member, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { members as membersEntries } from "@ui8kit/app-shared/data/members"; + +const MEMBERS_FIELDS = { + "id": "id", + "name": "title", + "role": "metadata.role.value", + "dept": "metadata.dept.value", + "location": "metadata.location.value", + "bio": "metadata.bio.value", + "skills": "metadata.skills.value", +} as const; + +const members = fromCodex(membersEntries, MEMBERS_FIELDS, CODEX); + +export function TeamPage() { + return ( + + + + + + {ui.blocks.back} + + + + + {ui.blocks.themes.marketing.title} + + + {ui.blocks.names.team} + + + {ui.blocks.docs.team} + + + + + {ui.blocks.variants.team.cards4} + + + + + + + + {ui.blocks.variants.team.cards3} + + + + + + + + {ui.blocks.variants.team.minimal} + + + + + + + + {ui.blocks.variants.team.detailed} + + + + + + + + {ui.blocks.variants.team.list} + + + + + + + + {ui.blocks.variants.team.directory} + + + + + + + + + ); +} diff --git a/apps/host-react/xgen/screens/BlocksScreen/TemplatesPage.tsx b/apps/host-react/xgen/screens/BlocksScreen/TemplatesPage.tsx new file mode 100644 index 0000000..f21cab0 --- /dev/null +++ b/apps/host-react/xgen/screens/BlocksScreen/TemplatesPage.tsx @@ -0,0 +1,180 @@ +// Code generated by xgen. DO NOT EDIT. +// Source: xgen/specs/screens/blocks.json +// The templates page of BlocksScreen. + +import { + Block, + Box, + Container, + Group, + Link, + Stack, + TemplateGrid, + Text, + Title, + tpl, + uniqLabel, + type Filter, + type Template, +} from "@ui8kit/react-ui"; +import { fromCodex } from "@ui8kit/app-shared/runtime/core"; +import { CODEX } from "@ui8kit/app-shared/runtime/codex"; +import { ui } from "@ui8kit/app-shared/content"; +import { templates as templatesEntries } from "@ui8kit/app-shared/data/templates"; +import { prompts as templateFiltersEntries } from "@ui8kit/app-shared/data/prompts"; + +const TEMPLATES_FIELDS = { + "id": "id", + "title": "title", + "views": "metadata.views.value|compact", + "likes": "metadata.likes.value|compact", + "topic": "metadata.topic.value", +} as const; +const TEMPLATEFILTERS_FIELDS = {"id":"id","title":"title","value":"metadata.value.value","icon":"metadata.icon.value"} as const; + +const templates = fromCodex