@wizard_loopLAYOUT STUDY
A window into the process.
This is a posts layout preview. Original channel posts and their media will appear here after the integration is approved.
Read the real posts on Telegramdiff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..de91110 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[*.py] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..6271a7a --- /dev/null +++ b/.env.example @@ -0,0 +1,8 @@ +# Public configuration only. Never prefix secrets with PUBLIC_. +# Leave blank until the separate feedback Worker is configured and approved. +PUBLIC_FEEDBACK_API_URL= +PUBLIC_TURNSTILE_SITE_KEY= +# Local development automatically uses a clearly labeled loopback mock. +# Set true only for a non-indexable build used for review. +PUBLIC_PREVIEW=false +# Telegram/Cloudflare credentials belong to their separate services, never here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..40b9dc4 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +## What changes for visitors + +Describe the visible behavior and the reason for it. Link representative desktop/mobile screenshots when the interface changes. + +## Validation + +List commands actually run, measured results, and remaining limitations. Distinguish fixtures from authenticated service tests. + +## Deployment and privacy + +State whether credentials, content synchronization, third-party requests, public URLs or hosting settings are affected. Keep secrets and personal feedback out of this description. Merging or deploying requires the owner's explicit approval. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5a5bf8c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,40 @@ +name: Quality checks +on: + push: + branches-ignore: + - main + pull_request: + workflow_dispatch: +permissions: + contents: read +env: + ASTRO_TELEMETRY_DISABLED: 1 +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + - run: npm ci + - run: npm run check + - run: npx playwright install --with-deps chromium firefox webkit + - run: npm run test:browsers + - uses: actions/upload-artifact@v4 + if: always() + with: + name: browser-quality-results + path: artifacts/final/ + retention-days: 7 + profile-sync-tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.13' + - run: python -m pip install -r services/profile-sync/requirements.txt + - run: python -m unittest discover -s services/profile-sync -p "test_*.py" -v + - run: python -m unittest discover -s services/posts-sync -p "test_*.py" -v diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..f8612e8 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,46 @@ +name: Approved Pages deployment +on: + workflow_dispatch: + inputs: + approval: + description: 'Type DEPLOY_WIZARDLOOP only after explicit owner approval' + required: true + type: string +permissions: + contents: read +concurrency: + group: pages-production + cancel-in-progress: false +env: + ASTRO_TELEMETRY_DISABLED: 1 +jobs: + build: + if: github.ref == 'refs/heads/main' && inputs.approval == 'DEPLOY_WIZARDLOOP' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + - run: npm ci + - run: npm run check + env: + PUBLIC_FEEDBACK_API_URL: ${{ vars.PUBLIC_FEEDBACK_API_URL }} + PUBLIC_TURNSTILE_SITE_KEY: ${{ vars.PUBLIC_TURNSTILE_SITE_KEY }} + - uses: actions/upload-pages-artifact@v3 + with: + path: dist + deploy: + needs: build + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy approved static artifact + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..caca028 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +node_modules/ +.env +.env.* +!.env.example +*.session +*.session-journal +artifacts/ +.preview.log +.preview.err +dist/ +.astro/ +test-results/ +playwright-report/ +.wrangler/ +.dev.vars +__pycache__/ +.venv/ +*.pyc +*.log diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..5a044a0 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,12 @@ +{ + "singleQuote": true, + "plugins": ["prettier-plugin-astro"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro" + } + } + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5ff31f8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,32 @@ +# Changelog + +This file records repository changes. A heading does not mean a Git tag, GitHub Release or production deployment exists. + +## 1.0.0-rc.1 - Unreleased + +### Website + +- Rebuild the personal portfolio with Astro static output and the selected Spectrum Circuit direction, developed with comic framing and the owner's wizard illustrations. +- Add Home, About, Selected Work, Projects, Posts, Community, Feedback, Privacy, Cookies, Security, Accessibility and a custom 404 page. +- Add responsive navigation, light and dark themes, persistent preferences, keyboard controls, motion pause and reduced-motion behavior. +- Return the hero to a still preview when a native decoder stops unexpectedly, while preserving intentional user and visibility pauses. +- Detect a frozen native-video clock even when the decoder still reports playback, and avoid false failures after delayed timer callbacks. +- Include 30 original wizard animations and six flag samples, unchanged source TGS files, transparent posters and provenance manifests. +- Add page-specific metadata, structured data, static social artwork, favicons, sitemap output and domain-preserving builds. + +### Services and tooling + +- Add an isolated profile synchronization service with active-photo identity matching, video/still selection, cache, fallback and offline fixtures. +- Add consent-gated Telegram posts and a separately configured supported-update ingestion path. Original Telegram links remain available when embedded media is incomplete. +- Add a feedback Worker and local mock, server validation, Turnstile verification, private-chat setup and provider-mocked tests. +- Add source/build checks, browser coverage, accessibility checks, quality CI and an approval-gated manual Pages workflow. +- Correct the canvas media fixture, measure native loop capability independently from application code, and record actual encoded AVC metadata. +- Document setup, content editing, service limitations, asset rights, contribution, security reporting and release/rollback procedures. + +### Review status + +This is an unreleased review candidate. Measured browser, accessibility, performance and offline-service results are documented in [the quality review](docs/QA.md). Authenticated Telegram/profile media tests, live feedback delivery, native Safari and human screen-reader review, production validation, merge approval and release approval remain separate steps. Complete legal/accessibility conformance is not asserted. + +## Earlier baseline + +The original four-file website remains in Git history at `658ed667c173f861cd16e6048126de12ec3648b9` from 2025-07-20. The initial audit found no Git tags or GitHub Releases. Do not assign a historical semantic version retrospectively. Phase 1 tooling used `0.1.0-preview.1` while three local concepts were evaluated; it was not a production release. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..6c7ddd2 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,13 @@ +# Code of Conduct + +This is a personal open-source project. Everyone participating in its issues, pull requests and discussions should be able to contribute without harassment. + +Be respectful and specific. Discuss the work and its effects, explain disagreements, welcome questions and credit contributions. Respect privacy, accessibility needs and different backgrounds or levels of experience. + +Harassment, discriminatory abuse, threats, sexualized comments, impersonation, deliberate disruption and publishing another person's private information are not acceptable. Do not use project spaces for spam, unwanted solicitation or attempts to obtain credentials. + +Report a concern privately to WizardLoop through [Telegram](https://t.me/wizardloop) or the published email, [wizard@wizardloop.com](mailto:wizard@wizardloop.com). Share only what is needed to understand the incident. Do not publish private evidence in an issue or circulate it unnecessarily. + +The maintainer may request changes, remove inappropriate material or restrict participation to protect the project. The response should consider the conduct, its impact and whether it continued after a request to stop. No fixed response time or confidential reporting platform is promised by this document. + +These expectations apply to this repository and project spaces managed by its maintainer, and when someone explicitly represents the project elsewhere. This document does not claim authority over unrelated communities. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..886060d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,36 @@ +# Contributing to WizardLoop + +This repository is the source of one creator's personal website. Contributions should improve that website while preserving the owner's identity, verified content and control over publication. + +For a small correction, open a focused pull request. Discuss substantial visual changes, new services or dependencies in an issue first. Never disclose credentials, personal submissions or a vulnerability in a public issue or pull request; use [SECURITY.md](SECURITY.md). + +## Working locally + +1. Read the [README](README.md), relevant service guide and [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). +2. Use a dedicated branch or fork. Do not work directly on `main` or alter another repository as part of this project. +3. Install locked dependencies with `npm ci` using Node 22.23.4 or newer. +4. Run `npm run dev`. The frontend and optional `npm run dev:feedback` mock require no live credentials. +5. Make the smallest coherent change. Keep content, styles, browser interactions and private integrations in their existing locations. + +Do not change `wizardloop.com`, either CNAME file, production settings or deployment behavior as incidental cleanup. Such changes need a specific proposal and owner approval. + +## Content, design and accessibility + +- Use English by default and preserve correct direction handling for Hebrew content. +- Verify project links and factual claims. Do not invent clients, achievements, personal details or social profiles. +- Use a regular hyphen instead of the em dash character U+2014 in controlled content, metadata and documentation. +- Keep keyboard access, visible focus, semantic headings, readable contrast and small-screen layouts. Honor reduced motion and the global motion control. +- Keep useful static content when JavaScript or a third party fails. Avoid heavy dependencies for effects that local CSS or existing components can provide. +- Preserve media attribution. MIT code contributions do not relicense the owner's artwork or third-party assets. Record the source and license of any new font, icon, media or dependency. + +## Validation and pull requests + +Run `npm run check`. For layout or interaction changes, build the site and run relevant Playwright checks, including `npm run test:browsers` when browser behavior changes. Follow service-specific tests for profile, posts or feedback changes. Do not write redundant tests for a simple text correction; existing content/build checks still apply. + +A useful pull request describes the concrete problem, resulting behavior, validation and remaining limits. Include desktop/mobile screenshots for visual changes and both themes where relevant. Identify mocks and fixtures explicitly. Do not report an external integration as verified unless it was exercised with authorized credentials. + +Keep lockfile changes with dependency changes. Do not commit `node_modules`, build output, test artifacts, `.env`, `.dev.vars`, sessions, private chat IDs, submitted messages or tokens. Check the diff for accidentally included local files before submitting. + +Owner review governs design and content acceptance. A pull request does not authorize merging, deploying, enabling services, creating releases or changing DNS. Follow [DEPLOYMENT.md](docs/DEPLOYMENT.md) for those separate operations. + +By submitting new source code, you offer it under the repository's MIT license. Only submit material you have the right to contribute, and identify any different asset license. Participation is subject to the [Code of Conduct](CODE_OF_CONDUCT.md). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..afe447e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 WizardLoop + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 5a7864f..4eaa444 100644 --- a/README.md +++ b/README.md @@ -1 +1,149 @@ -https://wizardloop.com +# WizardLoop + +The source of [wizardloop.com](https://wizardloop.com), the personal website of WizardLoop: independent design, illustration, animation, software, Telegram bots and open source. + +The rebuild develops the selected Spectrum Circuit concept into a comic-inspired portfolio, with original wizard illustrations, expressive vector loops and a light paper palette alongside a complete dark theme. Astro generates the static site; small browser scripts handle interaction, and separate optional services handle private integrations. + +**Status: `1.0.0-rc.1`, unreleased.** This branch is for implementation and review. Fixtures and mocked tests do not establish that production integrations work. Authenticated Telegram profile/video retrieval, live feedback delivery and production deployment need separate configuration, verification and owner approval. No release or deployment is implied by the package version. + +## Run locally + +Use Node.js **22.23.4 or newer**, with npm. Repository workflows use Node 24. Python 3.11 or newer is needed only for the optional synchronization services and their tests. + +```sh +git clone --branch design/three-local-concepts https://github.com/WizardLoop/wizardloop.github.io.git +cd wizardloop.github.io +npm ci +npm run dev +``` + +Open [http://127.0.0.1:4322](http://127.0.0.1:4322). No credentials are needed to view the website. This unreleased review lives on `design/three-local-concepts`; the default branch still contains the earlier site. For an existing checkout of the review branch, skip cloning. Work on a dedicated development branch rather than `main`. + +To exercise feedback locally, run this in a second terminal: + +```sh +npm run dev:feedback +``` + +The loopback mock listens on port 8787. The development form identifies it as a local test and sends nothing to Telegram. See [feedback setup](docs/FEEDBACK-SETUP.md) for its validation rules and limitations. + +Build and inspect the static result: + +```sh +npm run build +npm run preview -- --host 127.0.0.1 --port 4322 +``` + +Stop the development server before starting the preview on the same port. `dist/` contains the publishable HTML, browser assets, domain file and social metadata. Neither command deploys anything. + +## Configuration and content + +`.env.example` contains public frontend options only. Copy it to a local `.env` if configuration is needed. Keep the feedback endpoint and Turnstile sitekey empty until the separate service is approved and verified. A `PUBLIC_` prefix means the value can be included in browser files; it must never contain a secret. + +| Edit | Location | +| --- | --- | +| Name, verified social URLs, email and navigation | `src/config/site.ts` | +| Page copy and route-specific metadata | `src/pages/*.astro` | +| Verified software projects | `src/content/projects.json` | +| Wizard artwork titles, descriptions and provenance | `src/content/artworks.json` | +| Curated flag animations and attribution | `src/content/flags.json` | +| Public channel post index | `src/content/posts.json` | +| Public profile snapshot and media | `public/media/profile/` | +| Colors, typography and responsive layouts | `src/styles/global.css` | +| Common header, footer and metadata | `src/layouts/Base.astro` | +| Reusable icons, art and content components | `src/components/` | +| Browser preferences, embeds and motion | `src/scripts/` | + +Keep claims factual. Link to verified projects and describe the actual role. The wizard scenes are portfolio artwork, not software screenshots or evidence of client relationships. Record provenance and rights for new assets, write meaningful alternative text and preserve image dimensions. + +Controlled content must not contain the em dash character U+2014. Use a regular hyphen instead; source checks enforce this rule. Do not introduce unverified X, LinkedIn or organization identities into metadata. + +## Architecture + +- Astro generates complete HTML for Home, About, Work, Projects, Posts, Community, Feedback, Privacy, Cookies, Security, Accessibility and a custom 404. Directory output supports direct requests and refreshes on GitHub Pages. +- Local CSS and fonts provide the visual system. No application framework, CMS, database or general-purpose backend is required for the portfolio. +- The Home hero uses a native 768 x 768 H.264 MP4 loop derived from the supplied `portal-alchemy` artwork, with separate light and dark versions and the original 2.4-second duration. Other original TGS artwork loads through one shared light Canvas Lottie player. At most three visible Canvas scenes play, drawn at up to 24 frames per second while elapsed-time sampling preserves each original animation's duration. Motion controls, reduced-motion preferences and viewport/document visibility limit both playback paths. +- Static WebP delivery copies in `public/media/previews/` provide the initial and no-animation view. The build creates these quality-94 copies from unchanged lossless masters in `public/media/posters/`, preserving dimensions and the alpha channel. Original TGS sources also remain unchanged. +- Official Telegram embeds load only after visitor consent. Original post links remain available without embedding. Telegram controls embedded media support; custom emoji, stickers and animation fidelity are not guaranteed by the website. +- Profile data is read at build time from a public snapshot. Private MTProto work happens in the separate sync service, never in the browser or Pages output. +- Feedback uses an optional Cloudflare Worker with server-side validation and Turnstile verification. GitHub Pages serves only the frontend. + +The build copies `public/CNAME` to `dist/CNAME`, preserving `wizardloop.com`. The original root `CNAME`, `index.html` and PaperMod-attributed stylesheet remain as historical source. Astro builds from `src/`; the legacy HTML is not its homepage input. No repository-name base path is added to this custom-domain site. + +## Integration status and setup + +| Integration | Current review boundary | Instructions | +| --- | --- | --- | +| Telegram profile | Public snapshot and local fallbacks available; authenticated active-primary/video access unverified | [Profile sync](docs/PROFILE-SYNC.md) | +| Telegram posts | Verified post index and consent-gated embeds; supported-update ingestion requires separate configuration, with no live schedule enabled | [Posts sync](docs/POSTS-SYNC.md) | +| Feedback | Local mock and provider-mocked tests; no public Worker or real private-message delivery claimed | [Feedback setup](docs/FEEDBACK-SETUP.md) | +| Brand derivatives | Local profile and original artwork generate static icons and a 1200 x 630 composition | `scripts/generate-brand.mjs` | + +Run `node scripts/generate-brand.mjs` after an approved profile change; `npm run build` also runs it. The script updates the avatar badge and favicons while preserving illustration sources. Its native social-card typography uses installed Arial or a sans fallback, can vary by operating system, and does not redistribute system font files. The build also runs `scripts/generate-previews.mjs` to regenerate static delivery copies from the retained poster masters. + +Read each service's status fields and setup guide. A usable cached output is not proof of a successful Telegram connection. No credentials, private chat IDs or sessions belong in the public snapshot. Research and external limitations are documented in [integration feasibility](docs/INTEGRATION-FEASIBILITY.md). + +## Quality checks + +Read the [measured website quality review](docs/QA.md) and [integration verification](docs/QA-INTEGRATIONS.md) for observed results, preview images and outstanding acceptance limits. + +```sh +npm run check +npx playwright install chromium firefox webkit +npm run test:browsers +``` + +On Linux CI, install system dependencies with `npx playwright install --with-deps chromium firefox webkit`. Stop any development server on port 4322 before acceptance testing so Playwright starts the built preview. Browser tests require a successful build; `npm run check` includes one. + +| Command | Scope | +| --- | --- | +| `npm run format` | Format the final site's Astro, CSS and TypeScript source plus its preference/config scripts | +| `npm run format:check` | Check that the same scoped source follows the pinned Prettier configuration | +| `npm run lint` | Formatting, source punctuation, basic secret patterns, JavaScript syntax and project invariants | +| `npm run typecheck` | Astro and TypeScript diagnostics | +| `npm run test:unit` | Feedback service and local mock tests | +| `npm run build` | Static preview and brand derivatives, static generation, HTML/metadata/assets/link checks | +| `npm run check` | Lint, typecheck, feedback unit tests and build | +| `npm test` | Chromium browser suite | +| `npm run test:browsers` | Chromium suite plus selected Firefox and WebKit smoke/interaction coverage | +| `npm run audit:performance` | Lighthouse on Home, Work, Posts and Feedback at the running built preview on port 4322 | + +Browser coverage includes 320, 360, 390, 768, 1024 and 1440px layouts, both themes, navigation, motion, profile fallback, consent and feedback. Reports, screenshots and traces are written under ignored `artifacts/final/`. Test coverage is not a claim that every browser, assistive technology or legal accessibility requirement has been verified. + +The profile service uses pinned Python dependencies in an isolated environment. After following [PROFILE-SYNC.md](docs/PROFILE-SYNC.md), run: + +```sh +python -m unittest discover -s services/profile-sync -p 'test_*.py' -v +``` + +The posts updater uses Python's standard library and needs no package installation: + +```sh +python -m unittest discover -s services/posts-sync -p 'test_*.py' +``` + +Its offline fixture and live configuration are documented in [POSTS-SYNC.md](docs/POSTS-SYNC.md). Identify mocks and fixtures in reports. For performance auditing, keep the built preview running on port 4322, then run `npm run audit:performance` in another terminal. Reports are written to `artifacts/lighthouse/`; set `CHROME_PATH` when Chrome cannot be discovered. Review measured results and outstanding issues before approval. This README does not assert a passing final score or complete QA. + +## Local design studies + +The three original concepts remain available for comparison: + +```sh +npm run dev:concepts +``` + +Open `http://127.0.0.1:4321/concept-a/`, `/concept-b/` or `/concept-c/`. These non-indexable local studies are separate from the Astro build. `npm run test:concepts` and `npm run test:concept-interactions` exercise that earlier review material. + +## Review, deployment and releases + +Read [DEPLOYMENT.md](docs/DEPLOYMENT.md) before any operational change. Quality CI cannot deploy. The separate Pages workflow is manually triggered, restricted to `main`, and requires a confirmation input. These controls do not replace owner approval. + +Do not merge, alter Pages settings, change DNS, deploy, create a tag or publish a release until the owner approves the corresponding action. A release follows approved deployment and live verification. Repository commands do not automatically activate sync schedules, provision a Worker or configure secrets. + +## License and contact + +New website source code and tooling are [MIT licensed](LICENSE). WizardLoop's name, branding, illustrations, avatar, animation media and personal content are outside that grant. Fonts and third-party assets retain their own licenses. See [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) and the [asset inventory](docs/DESIGN-ASSET-INVENTORY.md). + +Contributions follow [CONTRIBUTING.md](CONTRIBUTING.md) and the [Code of Conduct](CODE_OF_CONDUCT.md). Report vulnerabilities privately using [SECURITY.md](SECURITY.md). + +[Telegram](https://t.me/wizardloop) · [Channel](https://t.me/wizard_loop) · [Community](https://t.me/wizardloopchat) · [GitHub](https://github.com/WizardLoop) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..506031c --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,29 @@ +# Security + +Report suspected vulnerabilities privately to [wizard@wizardloop.com](mailto:wizard@wizardloop.com) or [WizardLoop on Telegram](https://t.me/wizardloop). These are the contact details published by the owner. Do not create a public issue containing exploit details, credentials, personal feedback or private account identifiers. + +Include the affected page/component, commit/version if known, concise reproduction, expected impact and a safe way to contact you. Redact tokens, cookies, sessions, chat IDs and personal messages. Do not send real credentials as proof. + +## Scope and safe reporting + +Relevant code includes the static site, build pipeline and optional profile, posts and feedback services. Bugs in Telegram, Cloudflare, GitHub or a dependency should also be reported through that provider's process where appropriate. + +Use a local checkout, fixtures and the mock to investigate. This document does not authorize production testing, unsolicited messages, account access, accessing another person's data, sustained traffic or denial-of-service testing. Stop if a test exposes private information and report the minimum necessary evidence privately. + +There is no bug bounty or guaranteed response time. The rebuild is an unreleased candidate, and no support promise is made for a historical version. Fixes should be reviewed on the current development line; deployed-version handling depends on the actual production state. + +## Credential and data boundaries + +- Pages output is public. Never put tokens, API hashes, private chat IDs, sessions or secret keys in `public/`, content, `dist/`, issue attachments or `PUBLIC_` environment variables. +- Keep service credentials in the deployment host's secret store. Personal Telegram sessions are not supported by the profile service. +- Run real service tests only with owner approval. Local feedback uses an explicit mock and sends no Telegram message. +- Keep provider responses and visitor submissions out of CI logs and public artifacts. Use non-sensitive fixtures and generic failure messages. +- Review dependency upgrades and lockfile changes. Pattern checks are guardrails, not a complete secret scan or security certification. + +If a credential is published accidentally, notify the owner privately. The owner should revoke or rotate it at the provider, assess use and remove it from accessible artifacts as appropriate. Deleting a file or commit alone does not invalidate a leaked credential. Production credential or service changes still follow the owner's operational authorization. + +## Hosting limitations + +The site includes a document-level CSP where applicable. GitHub Pages does not provide a general repository-defined response-header configuration. Do not claim that Permissions-Policy, HSTS or header-only CSP directives are set by this source alone. Audit real responses after approved deployment. A separate CDN/proxy requires an approved infrastructure decision. + +See [integration feasibility](docs/INTEGRATION-FEASIBILITY.md), [feedback setup](docs/FEEDBACK-SETUP.md), [profile sync](docs/PROFILE-SYNC.md) and [deployment](docs/DEPLOYMENT.md) for implementation boundaries and remaining live checks. diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md new file mode 100644 index 0000000..1958a0c --- /dev/null +++ b/THIRD_PARTY_NOTICES.md @@ -0,0 +1,43 @@ +# Licenses and media provenance + +The root MIT license applies to newly authored website source code and tooling. It does not grant rights to WizardLoop's name, branding, profile artwork, personal content or third-party assets. Those retain their respective rights. No permission to reuse the profile artwork is implied. + +## Existing code + +The original `assets/css/style.css` remains unchanged and includes its PaperMod attribution: PaperMod v8+, MIT, Copyright (c) 2020 nanxiaobei and adityatelange; Copyright (c) 2021-2025 adityatelange. Its license reference is https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE. The concepts do not import or copy this stylesheet. Existing copyright notices must be preserved if that code is reused later. + +## Self-hosted fonts + +The legacy stylesheet is also copied unchanged to `public/assets/css/style.css` to preserve its existing public asset URL after the static migration. The current upstream full MIT permission notice is retained in `public/media/licenses/PAPERMOD-LICENSE.txt`; the older copyright dates in the original stylesheet header remain untouched. The new portfolio does not import the legacy stylesheet. + +Font files are unmodified Latin subsets from these pinned Fontsource variable packages, all under SIL Open Font License 1.1. They are hosted locally and make no font-provider requests in the browser. Original license/copyright notices are included alongside them. + +| Font | Package version | Local license | +| --- | --- | --- | +| Manrope | `@fontsource-variable/manrope@5.3.0` | `concepts/assets/fonts/MANROPE-LICENSE.txt` | +| Cormorant | `@fontsource-variable/cormorant@5.3.0` | `concepts/assets/fonts/CORMORANT-LICENSE.txt` | +| Space Grotesk | `@fontsource-variable/space-grotesk@5.3.0` | `concepts/assets/fonts/SPACE-GROTESK-LICENSE.txt` | + +## Profile and artwork + +`concepts/assets/profile-telegram.jpg` is the public still exposed by https://t.me/wizardloop, downloaded on 2026-10-27 for the owner's requested website. It is 320 x 320 pixels. It is not an authenticated original-resolution primary profile download and is not a claimed video. Provenance and checksum are documented in `docs/INTEGRATION-FEASIBILITY.md`. Keep this image outside the source-code MIT grant. + +The orbital diagrams, journal drawings, circuit sculpture, icons, fallback monogram and project illustrations were authored for these concepts. Project illustrations are clearly labeled concept artwork, not real product screenshots or invented client work. SVG/CSS implementation code is MIT; any resulting WizardLoop brand identity and commissioned visual assets retain the owner's brand/media rights. + +The owner supplied the local design collection for use in this website. The 30 original TGS animations from `WizardLoop_Infinity_Atelier_30_TGS.zip` are copied unchanged into `public/media/animations/`. Their titles, original archive members, byte sizes and SHA-256 hashes are recorded in `src/content/artworks.json`. Corresponding transparent WebP posters in `public/media/posters/` are lossless raster renders of those vector assets at 35% of the animation duration. These WizardLoop illustrations and derived posters are reserved media, outside the website source-code MIT license. No additional license grant was found inside the source archive. + +Six flag animations from `WizardLoop_Country_Flags_001_050.zip` are included: Israel, United States, United Kingdom, France, Japan and Brazil. `src/content/flags.json` records their exact source members and checksums. The supplied flag-source notice is preserved in full in `public/media/licenses/FLAGS-NOTICES.txt`; it lists the larger original collection as well as the six used here. The source collection identifies the underlying flag designs as public domain, with country-flags/Wikimedia attribution. The animation treatment and posters are not covered by the code MIT grant. National-symbol usage restrictions can apply independently of copyright. No third-party app logos or Belize flag artwork are included in this selection. + +The Home hero uses two native 768 x 768 H.264 MP4 derivatives of `portal-alchemy`, one for each theme, retaining the original 2.4-second loop duration. Other original TGS media use the locally bundled light Canvas build of `lottie-web`, version 5.13.0, under MIT, Copyright (c) 2015 Bodymovin. At most three visible Canvas scenes play, with drawing capped at 24 frames per second while preserving the source loop duration. The player's original license is preserved at `public/media/licenses/LOTTIE-LICENSE.txt` and remains applicable to bundled player code. These animations contain no expression scripts or references to external images. + +WebP assets are static previews. The quality-94 delivery copies in `public/media/previews/` retain the masters' dimensions and alpha channel; the lossless masters in `public/media/posters/` and original TGS sources are unchanged. The MP4 and WebP derivatives inherit the underlying WizardLoop media rights and are outside the source-code MIT grant. Full provenance, rendering checks and source-license links are documented in `docs/DESIGN-ASSET-INVENTORY.md`. + +## Interface icons and service dependencies + +The local interface icon set adapts familiar Feather geometry for GitHub, mail and common controls, with custom WizardLoop symbols and Telegram/community treatments. Feather is MIT licensed, Copyright (c) 2013-2023 Cole Bemis. Its full notice is preserved in `public/media/licenses/FEATHER-LICENSE.txt`; source: https://github.com/feathericons/feather/blob/main/LICENSE. No icon CDN is loaded. Social marks identify their respective services and do not imply endorsement. + +The final site's self-hosted font notices are also present in `public/fonts/`. The separate profile synchronizer uses Telethon and pyaes (MIT), Pillow (MIT-CMU), rsa (Apache-2.0) and pyasn1 (BSD-2-Clause). Their pinned distributions include their original license files. These Python dependencies run separately and are not distributed in the static website build. + +## Development tooling + +Playwright, axe-core, Lighthouse, Prettier and the Prettier Astro plugin are development-only dependencies. Their upstream licenses remain in the installed packages. They are not served to website visitors or included as production scripts. `package-lock.json` records exact dependency versions. Lottie is a runtime dependency because its Canvas player is bundled into the site's lazy-loaded animation module. diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..ce0ffa4 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,14 @@ +import { defineConfig } from 'astro/config'; +import sitemap from '@astrojs/sitemap'; + +export default defineConfig({ + site: 'https://wizardloop.com', + output: 'static', + trailingSlash: 'always', + integrations: [ + sitemap({ filter: (page) => !/\/404(?:\.html|\/)?$/.test(page) }), + ], + server: { host: '127.0.0.1', port: 4322 }, + build: { format: 'directory' }, + vite: { build: { sourcemap: false } }, +}); diff --git a/concepts/assets/base.css b/concepts/assets/base.css new file mode 100644 index 0000000..34d4d6e --- /dev/null +++ b/concepts/assets/base.css @@ -0,0 +1,7 @@ +@font-face{font-family:Studio;src:url('/assets/fonts/manrope-latin.woff2') format('woff2');font-weight:200 800;font-style:normal;font-display:swap} +@font-face{font-family:Journal;src:url('/assets/fonts/cormorant-latin.woff2') format('woff2');font-weight:300 700;font-style:normal;font-display:swap} +@font-face{font-family:Journal;src:url('/assets/fonts/cormorant-italic-latin.woff2') format('woff2');font-weight:300 700;font-style:italic;font-display:swap} +@font-face{font-family:Circuit;src:url('/assets/fonts/spacegrotesk-latin.woff2') format('woff2');font-weight:300 700;font-style:normal;font-display:swap} +*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:110px}body{margin:0;font-family:Studio,Arial,sans-serif;line-height:1.6;-webkit-font-smoothing:antialiased}button,input,textarea,select{font:inherit}button,a{-webkit-tap-highlight-color:transparent}button{cursor:pointer}a{color:inherit}img,svg{max-width:100%}img{display:block}button,a{touch-action:manipulation}button:disabled{cursor:default}a:focus-visible,button:focus-visible,input:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:3px solid var(--focus,var(--accent,#7c66d7));outline-offset:5px}::selection{background:#afa0e8;color:#171428}[hidden]{display:none!important}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.skip-link{position:fixed;z-index:2000;left:20px;top:-100px;padding:12px 22px;background:#fff;color:#19152c;border:2px solid currentColor}.skip-link:focus{top:16px}.menu-toggle{display:none}#mobile-nav{position:fixed;z-index:1000;inset:12px;background:var(--bg,#13101f);color:var(--ink,var(--text,#f4f0fb));padding:28px;overflow:auto;border:1px solid var(--line,var(--border,#645e77));border-radius:10px;box-shadow:0 0 0 25px #1118}#mobile-nav a{display:block;font-size:clamp(24px,7vw,38px);padding:8px 0;text-decoration:none}#mobile-nav button[data-menu-close]{min-width:48px;min-height:48px;float:right;color:inherit;border:1px solid currentColor;background:none;padding:8px 12px}#mobile-nav .menu-caption{clear:both;padding-top:32px;font-size:12px;text-transform:uppercase;letter-spacing:.15em}html[data-motion=paused] *,html[data-motion=paused] *::before,html[data-motion=paused] *::after{animation-play-state:paused!important;scroll-behavior:auto!important}html[data-motion=paused] .pointer-art{transform:none!important}.profile-source{font-size:11px;line-height:1.5}footer{padding-bottom:max(28px,env(safe-area-inset-bottom))}.preview-crosslinks{display:flex;flex-wrap:wrap;gap:20px}.preview-crosslinks a{font-size:12px;min-height:44px;display:inline-flex;align-items:center}.mobile-socials{display:flex;gap:16px;flex-wrap:wrap}#mobile-nav .mobile-socials a{font-size:15px}section{scroll-margin-top:110px} +@media(max-width:800px){.desktop-nav{display:none!important}.menu-toggle{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px}.site-header{max-width:calc(100% - 24px)}} +@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}.pointer-art{transform:none!important}} diff --git a/concepts/assets/common.js b/concepts/assets/common.js new file mode 100644 index 0000000..a5d4888 --- /dev/null +++ b/concepts/assets/common.js @@ -0,0 +1,80 @@ +(() => { + const root = document.documentElement; + const key = `wizardloop-concept-${root.dataset.concept || 'index'}`; + const media = matchMedia('(prefers-reduced-motion: reduce)'); + const storage = { get(k) { try { return localStorage.getItem(k); } catch { return null; } }, set(k, v) { try { localStorage.setItem(k, v); } catch { /* Preferences remain usable without storage. */ } } }; + const saved = storage.get(`${key}-theme`); + const requested = new URLSearchParams(location.search).get('theme'); + root.dataset.theme = ['dark', 'light'].includes(requested) ? requested : ['dark', 'light'].includes(saved) ? saved : root.dataset.theme || 'dark'; + root.dataset.motion = media.matches || storage.get('wizardloop-motion') === 'paused' ? 'paused' : 'running'; + const theme = document.querySelector('[data-theme-toggle]'); + const motion = document.querySelector('[data-motion-toggle]'); + function sync() { + const nextTheme = root.dataset.theme === 'dark' ? 'light' : 'dark'; + const paused = root.dataset.motion === 'paused'; + theme?.setAttribute('aria-label', `Switch to ${nextTheme} mode`); + theme?.setAttribute('title', `Switch to ${nextTheme} mode`); + theme?.querySelector('[data-theme-label]')?.replaceChildren(nextTheme === 'light' ? 'Light mode' : 'Dark mode'); + motion?.setAttribute('aria-label', paused ? 'Resume motion' : 'Pause motion'); + motion?.setAttribute('aria-pressed', String(paused)); + motion?.querySelector('[data-motion-label]')?.replaceChildren(paused ? 'Resume motion' : 'Pause motion'); + document.querySelectorAll('video').forEach(video => { if (paused) video.pause(); else video.play().catch(() => {}); }); + } + theme?.addEventListener('click', () => { root.dataset.theme = root.dataset.theme === 'dark' ? 'light' : 'dark'; storage.set(`${key}-theme`, root.dataset.theme); sync(); }); + motion?.addEventListener('click', () => { root.dataset.motion = root.dataset.motion === 'paused' ? 'running' : 'paused'; storage.set('wizardloop-motion', root.dataset.motion); sync(); }); + media.addEventListener('change', () => { if (media.matches) { root.dataset.motion = 'paused'; sync(); } }); + sync(); + + const trigger = document.querySelector('[data-menu-toggle]'); + const menu = document.getElementById('mobile-nav'); + let priorFocus, priorOverflow; + const inerted = []; + function close() { + if (!menu || menu.hidden) return; + menu.hidden = true; + trigger?.setAttribute('aria-expanded', 'false'); + document.body.style.overflow = priorOverflow || ''; + inerted.splice(0).forEach(el => { el.inert = false; }); + priorFocus?.focus(); + } + function open() { + if (!menu) return; + priorFocus = trigger || document.activeElement; + priorOverflow = document.body.style.overflow; + menu.hidden = false; + menu.setAttribute('role', 'dialog'); menu.setAttribute('aria-modal', 'true'); + if (!menu.hasAttribute('aria-label')) menu.setAttribute('aria-label', 'Site navigation'); + trigger?.setAttribute('aria-expanded', 'true'); + document.body.style.overflow = 'hidden'; + document.querySelectorAll('main,footer').forEach(el => { if (!el.contains(menu) && !el.inert) { el.inert = true; inerted.push(el); } }); + menu.querySelector('button,a')?.focus(); + } + trigger?.addEventListener('click', () => menu?.hidden ? open() : close()); + menu?.querySelectorAll('a,[data-menu-close]').forEach(el => el.addEventListener('click', close)); + document.addEventListener('keydown', event => { + if (!menu || menu.hidden) return; + if (event.key === 'Escape') { event.preventDefault(); close(); } + if (event.key === 'Tab') { + const items = [...menu.querySelectorAll('a,button,input,[tabindex="0"]')].filter(el => !el.disabled && el.getClientRects().length); + event.preventDefault(); + const index = items.indexOf(document.activeElement); + const next = event.shiftKey ? (index <= 0 ? items.length - 1 : index - 1) : (index + 1) % items.length; + items[next]?.focus(); + } + }); + matchMedia('(min-width:801px)').addEventListener('change', event => { if (event.matches) close(); }); + document.querySelectorAll('img[data-profile]').forEach(img => { + const fallback = () => { if (!img.src.endsWith('profile-fallback.svg')) { img.src = '/assets/profile-fallback.svg'; const label = document.querySelector('[data-profile-source]'); if (label) label.textContent = 'Local WizardLoop fallback'; } }; + img.addEventListener('error', fallback); + if (img.complete && img.naturalWidth === 0) fallback(); + }); + document.querySelectorAll('[data-pointer]').forEach(zone => { + zone.addEventListener('pointermove', event => { + if (root.dataset.motion === 'paused' || media.matches || event.pointerType === 'touch') return; + const rect = zone.getBoundingClientRect(); + zone.style.setProperty('--px', `${((event.clientX - rect.left) / rect.width - .5) * 14}px`); + zone.style.setProperty('--py', `${((event.clientY - rect.top) / rect.height - .5) * 12}px`); + }); + zone.addEventListener('pointerleave', () => { zone.style.setProperty('--px', '0px'); zone.style.setProperty('--py', '0px'); }); + }); +})(); diff --git a/concepts/assets/concept-a.css b/concepts/assets/concept-a.css new file mode 100644 index 0000000..7d10222 --- /dev/null +++ b/concepts/assets/concept-a.css @@ -0,0 +1,6 @@ +:root{--bg:#0e0c18;--surface:#151220;--text:#eeeaf5;--muted:#a49db6;--accent:#b9a4f3;--mint:#a4d8cc;--line:#302a41;--focus:#c9b7ff;--hero-glow:#42256355;--art-bg:#221a35;--header-bg:#15121ee8;--ink:var(--text)}html[data-theme=light]{--bg:#f4f1f8;--surface:#ebe5f2;--text:#242033;--muted:#62596f;--accent:#675099;--mint:#386f69;--line:#d5ccdf;--focus:#654a9d;--hero-glow:#c8b6e84d;--art-bg:#e5dbf0;--header-bg:#f4f1f8ed}body{background:var(--bg);color:var(--text)}a{text-decoration:none}.site-header{position:fixed;z-index:100;top:24px;left:50%;transform:translateX(-50%);width:1240px;max-width:calc(100% - 80px);height:70px;border:1px solid var(--line);border-radius:100px;display:flex;align-items:center;justify-content:space-between;padding:0 18px 0 28px;background:var(--header-bg);backdrop-filter:blur(16px);gap:24px}.brand{display:inline-flex;align-items:center;gap:10px;font-weight:700;font-size:21px;letter-spacing:-.8px;white-space:nowrap}.brand svg{stroke:var(--accent);stroke-width:1.25}.brand-dot{color:var(--accent)}.desktop-nav{display:flex;gap:27px;font-size:12px;color:var(--muted)}.desktop-nav a{padding:14px 0;position:relative}.desktop-nav a::after{content:'';position:absolute;bottom:6px;left:0;width:0;height:1px;background:var(--accent);transition:width .25s}.desktop-nav a:hover::after{width:100%}.header-controls{display:flex;align-items:center;gap:12px}.icon-button{width:44px;height:44px;display:inline-flex;align-items:center;justify-content:center;background:none;border:0;border-radius:50%;color:var(--text)}.icon-button svg{stroke:currentColor;stroke-width:1.4}.icon-button:hover{background:var(--line)}.header-contact{font-size:12px;padding:12px 19px;border:1px solid var(--line);border-radius:30px;white-space:nowrap}.header-contact span{margin-left:18px;color:var(--accent)}.menu-toggle{display:none}.orbit-hero{position:relative;overflow:hidden;text-align:center;padding:165px 40px 0;min-height:930px;background:radial-gradient(ellipse at 50% 60%,var(--hero-glow),transparent 55%)}.hero-stardust{position:absolute;inset:0;pointer-events:none;opacity:.5;background-image:radial-gradient(circle at 14% 26%,var(--accent) 0 1px,transparent 1.8px),radial-gradient(circle at 83% 42%,var(--accent) 0 1px,transparent 1.8px),radial-gradient(circle at 29% 66%,var(--accent) 0 1px,transparent 1.8px),radial-gradient(circle at 92% 75%,var(--accent) 0 1px,transparent 1.8px),radial-gradient(circle at 8% 69%,var(--accent) 0 1px,transparent 1.8px)}.hero-kicker{font-size:10px;letter-spacing:2.7px;color:var(--muted);display:flex;gap:12px;justify-content:center;align-items:center}.status-star{font-size:17px;color:var(--mint)}h1{font-size:clamp(58px,7.65vw,110px);font-weight:400;line-height:1.05;letter-spacing:-7px;margin:24px 0 24px}h1 span{font-family:Journal,Georgia,serif;font-style:italic;font-size:1.15em;color:var(--accent);letter-spacing:-5px}.hero-description{font-size:13px;line-height:1.85;color:var(--muted);margin:0}.orbit-system{position:relative;width:900px;max-width:100%;height:390px;margin:-2px auto 0;transform:translate(var(--px,0px),var(--py,0px));transition:transform .6s ease}.orbital-field{width:100%;height:100%;position:absolute;inset:0;color:var(--accent)}.profile-orb{position:absolute;left:50%;top:50%;width:216px;height:216px;transform:translate(-50%,-50%);border-radius:50%;padding:8px;border:1px solid #aa90d86b;box-shadow:0 0 0 12px #8f6ab008,0 0 80px #8e62d029}.profile-orb img{width:100%;height:100%;border-radius:50%;object-fit:cover}.orb-aura{position:absolute;inset:-19px;border-radius:50%;border:1px dashed #9073b868;animation:orbit 60s linear infinite}.orb-dot{position:absolute;top:24px;left:1px;width:7px;height:7px;border-radius:50%;background:var(--mint);box-shadow:0 0 15px #a4d8cc}.orbit-satellite{animation:pulse 4s ease-in-out infinite}.orbit-label{position:absolute;font-size:9px;letter-spacing:1.4px;color:var(--muted);background:var(--bg);padding:4px 9px}.label-design{top:43%;left:4%}.label-code{top:55%;right:1%}.orb-coordinate{position:absolute;bottom:0;left:0;right:0;color:var(--muted);font-size:8px;letter-spacing:2px}.hero-bottom{max-width:1240px;margin:35px auto 0;display:flex;justify-content:space-between;align-items:center;color:var(--muted);font-size:10px;min-height:60px}.explore-link{display:flex;align-items:center;gap:22px}.explore-link span{font-size:18px;color:var(--accent)}.motion-control{color:var(--muted);border:0;background:none;font-size:10px;min-height:44px;padding:8px 0}.pause-symbol{border:1px solid var(--line);padding:5px 9px;border-radius:50%;margin-right:8px}.practice-strip{border-block:1px solid var(--line);display:flex;justify-content:center;gap:50px;align-items:center;padding:28px 24px;font-size:12px;color:var(--muted)}.practice-strip i{color:var(--accent);font-style:normal;font-size:11px}.section-shell{max-width:1240px;width:calc(100% - 120px);margin-inline:auto}.section-eyebrow{font-size:9px;letter-spacing:1.7px;color:var(--muted);display:flex;justify-content:space-between;gap:25px;margin:0 0 48px}.about-section{padding-block:115px}.about-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:90px}h2{font-size:clamp(36px,4.3vw,60px);line-height:1.15;letter-spacing:-2.5px;font-weight:400;margin:0}h2 span{color:var(--accent)}.about-copy{font-size:13px;color:var(--muted);max-width:440px;padding-top:3px}.about-copy p{margin:0 0 24px}.about-copy .lead{font-size:19px;color:var(--text);line-height:1.55}.text-link{display:inline-flex;gap:23px;align-items:center;font-size:12px;min-height:44px;color:var(--text);border-bottom:1px solid var(--line)}.text-link span{color:var(--accent);transition:transform .2s}.text-link:hover span{transform:translate(3px,-3px)}.secondary-link{margin-left:18px}.work-section{padding-block:45px 90px}.section-title-row{display:flex;justify-content:space-between;align-items:end;margin-bottom:40px}.work-grid{display:grid;grid-template-columns:1fr 1fr;gap:28px}.work-art{height:330px;overflow:hidden;position:relative;border:1px solid var(--line);border-radius:3px;background:var(--art-bg)}.lottie-art{display:flex;align-items:center;justify-content:center;background:radial-gradient(ellipse at 50% 45%,#7953ba38,transparent 60%),var(--art-bg)}.ribbon-loop{width:150px;height:150px;border-radius:45% 55% 50% 50%;border:22px solid #b498ea;box-shadow:inset 4px 8px 10px #e1cfff80,8px 10px 25px #0a071c66;transform:rotate(-30deg);animation:ribbon 12s ease-in-out infinite}.loop-one{margin-right:-42px;z-index:1}.loop-two{transform:rotate(30deg);border-color:#7b6aaf;animation-delay:-6s}.art-caption{position:absolute;bottom:22px;left:25px;font:8px monospace;letter-spacing:2px;color:var(--accent)}.art-number{position:absolute;right:24px;top:18px;font:11px monospace;color:var(--accent)}.shabbat-art{background:radial-gradient(ellipse at center,#40655b30,transparent 65%),var(--surface);color:var(--mint)}.shabbat-art svg{width:100%;height:100%;stroke:currentColor;stroke-width:1}.work-description{display:flex;justify-content:space-between;align-items:center;padding-top:24px}.work-category{font-size:8px;letter-spacing:1.7px;color:var(--muted)}.work-card h3{font-size:24px;font-weight:400;margin:8px 0;letter-spacing:-.5px}.work-arrow{border:1px solid var(--line);border-radius:50%;width:40px;height:40px;display:grid;place-items:center;transition:background .2s}.work-card:hover .work-arrow{background:var(--accent);color:var(--bg)}.work-card p{font-size:12px;color:var(--muted);margin-top:4px}.asset-note{font-size:10px;color:var(--muted);margin-top:25px}.posts-section{padding-block:55px 110px;border-top:1px solid var(--line)}.posts-grid{display:grid;grid-template-columns:1fr 1fr;gap:90px;align-items:center}.posts-grid h2{margin-bottom:32px}.post-preview{padding:30px;border:1px solid var(--line);border-radius:8px;background:var(--surface)}.post-top{display:flex;align-items:center;gap:10px;font-size:11px;line-height:1.6}.mini-avatar img{border-radius:50%}.post-top small{color:var(--muted);font-size:9px}.sample-tag{margin-left:auto;font-size:8px;letter-spacing:1px;color:var(--muted)}.post-visual{background:var(--bg);border-radius:3px;margin-top:25px;color:var(--accent)}.post-visual svg{display:block;width:100%;height:160px;stroke:currentColor;stroke-width:1}.post-visual g{transform-origin:center;animation:orbit 50s linear infinite}.post-preview h3{font-size:18px;font-weight:400;letter-spacing:-.3px;margin:24px 0 8px}.post-preview p{font-size:12px;color:var(--muted);margin:0 0 15px}.post-preview .text-link{font-size:10px}.community-section{padding-block:100px 115px;text-align:center;border-top:1px solid var(--line)}.community-star{display:block;color:var(--mint);font-size:36px;margin-bottom:20px}.community-section .section-eyebrow{justify-content:center;margin-bottom:28px}.community-section h2{font-size:clamp(42px,5.5vw,76px)}.community-section h2 em{font-family:Journal,Georgia,serif;color:var(--accent);font-weight:400}.community-section p:not(.section-eyebrow){font-size:12px;color:var(--muted);margin:30px 0}.community-actions{display:flex;gap:30px;justify-content:center;align-items:center}.primary-link{display:inline-flex;gap:50px;padding:14px 24px;border-radius:30px;font-size:12px;background:var(--accent);color:var(--bg)}.site-footer{border-top:1px solid var(--line);padding-top:45px;color:var(--muted)}.footer-main{display:flex;justify-content:space-between;gap:30px;align-items:start}.footer-main .brand{color:var(--text)}.footer-main p{font-size:11px}.footer-main nav{display:flex;gap:24px;font-size:11px;flex-wrap:wrap}.footer-main nav a{min-height:44px;display:flex;align-items:center}.footer-bottom{display:flex;justify-content:space-between;gap:20px;border-top:1px solid var(--line);padding-top:24px;margin-top:35px;font-size:9px}.rights-note{font-size:9px;margin-top:18px}.preview-crosslinks{margin-top:20px}.preview-crosslinks a{font-size:10px}@keyframes orbit{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.25}}@keyframes ribbon{50%{border-radius:55% 45% 58% 42%;transform:rotate(20deg) translateY(-8px)}} +@media(min-width:1700px){.orbit-hero{padding-top:190px;min-height:1000px}.orbit-system{margin-top:20px}} +@media(max-width:1050px){.desktop-nav{gap:18px}.site-header{max-width:calc(100% - 40px);padding-left:20px;gap:14px}.brand{font-size:18px}.header-contact{padding-inline:15px}.orbit-hero{min-height:900px}.section-shell{width:calc(100% - 70px)}.about-grid,.posts-grid{gap:45px}.practice-strip{gap:30px}.work-art{height:280px}} +@media(max-width:800px){.site-header{top:14px;max-width:calc(100% - 28px);height:62px;padding-inline:18px 8px}.menu-toggle{display:inline-flex}.header-contact{display:none}.header-controls{gap:0}.brand{font-size:18px}.brand svg{width:29px}.orbit-hero{padding:140px 20px 0;min-height:800px}.hero-kicker{font-size:8px;letter-spacing:1.8px}h1{font-size:76px;letter-spacing:-4px}h1 span{letter-spacing:-3px}.hero-description{font-size:12px}.orbit-system{height:320px;width:740px;max-width:calc(100% + 70px);left:-35px;margin-top:15px}.profile-orb{width:178px;height:178px}.orbit-label{font-size:7px;letter-spacing:.7px}.label-design{left:0;top:25%}.label-code{right:0;top:75%}.orb-coordinate{bottom:-5px;font-size:7px}.hero-bottom{margin-top:27px;gap:12px}.profile-source{font-size:9px}.practice-strip{gap:22px;font-size:10px;padding-block:25px}.section-shell{width:calc(100% - 44px)}.section-eyebrow{font-size:8px;line-height:1.8;margin-bottom:30px}.section-eyebrow span:last-child:not(:first-child){max-width:40%;text-align:right}.about-section{padding-block:75px}.about-grid{grid-template-columns:1fr;gap:32px}.about-copy{max-width:100%}.about-copy .lead{font-size:18px}h2{font-size:46px}.work-section{padding-block:20px 70px}.work-art{height:220px}.work-grid{gap:20px}.ribbon-loop{width:110px;height:110px;border-width:18px}.work-category{font-size:7px;letter-spacing:.7px}.work-card h3{font-size:21px}.work-card p{font-size:11px}.art-caption{font-size:6px;left:14px}.posts-grid{gap:36px}.posts-section{padding-block:50px 75px}.post-preview{padding:20px}.post-top{font-size:10px}.sample-tag{font-size:7px}.community-section{padding-block:70px 80px}.community-section h2{font-size:58px}.footer-main{flex-direction:column}.footer-main nav{gap:22px}} +@media(max-width:540px){.hero-kicker{font-size:7px;letter-spacing:1.4px}.orbit-hero{padding-top:130px;min-height:785px}h1{font-size:60px;line-height:1.07;margin-top:24px;letter-spacing:-3px}h1 span{letter-spacing:-2px}.hero-description{font-size:10px;line-height:1.9}.orbit-system{height:330px;margin-top:4px}.orbital-field{width:620px;max-width:none;left:50%;transform:translateX(-50%)}.profile-orb{width:180px;height:180px}.orbit-label{font-size:6px;letter-spacing:1px;top:15%}.label-design{left:calc(50% - 135px)}.label-code{right:calc(50% - 142px);top:80%}.orb-coordinate{font-size:6px;letter-spacing:1.4px;bottom:6px}.hero-bottom{margin-top:17px;flex-wrap:wrap;gap:4px 20px}.hero-bottom .profile-source{order:3;width:100%;font-size:8px;margin-top:0}.motion-control{font-size:9px}.explore-link{font-size:9px}.practice-strip{justify-content:space-around;gap:8px;font-size:8px;padding:20px 16px}.practice-strip i{font-size:7px}.section-title-row{gap:20px;align-items:end}.section-title-row .text-link{font-size:10px;gap:10px}.section-title-row h2{font-size:39px}.work-grid{grid-template-columns:1fr;gap:32px}.work-art{height:280px}.ribbon-loop{width:145px;height:145px;border-width:22px}.work-category{font-size:8px;letter-spacing:1.3px}.art-caption{font-size:7px;left:20px}.about-copy{font-size:12px}.text-link{font-size:11px}.secondary-link{margin-left:14px}.posts-grid{grid-template-columns:1fr;gap:30px}.posts-grid h2{font-size:47px}.post-preview{padding:25px}.post-top{font-size:12px}.sample-tag{font-size:8px}.community-section h2{font-size:45px;letter-spacing:-1.7px}.community-actions{gap:17px;flex-wrap:wrap}.community-actions .text-link{font-size:10px}.primary-link{gap:28px}.footer-bottom{flex-direction:column;gap:10px}.footer-main nav{font-size:10px;gap:20px}.preview-crosslinks{gap:4px 15px}.preview-crosslinks a{font-size:9px}h2{font-size:43px}} +@media(max-width:359px){h1{font-size:52px}.hero-kicker{font-size:6px}.brand{font-size:16px}.hero-description{font-size:9px}.site-header{padding-left:14px}.section-shell{width:calc(100% - 36px)}.practice-strip{font-size:7px}.section-title-row h2{font-size:34px}.about-copy .lead{font-size:16px}.secondary-link{margin-left:0;display:flex;max-width:max-content}.community-section h2{font-size:39px}.section-eyebrow{letter-spacing:1px}.post-preview{padding:18px}.post-preview .text-link{font-size:9px}} diff --git a/concepts/assets/concept-b.css b/concepts/assets/concept-b.css new file mode 100644 index 0000000..64c3683 --- /dev/null +++ b/concepts/assets/concept-b.css @@ -0,0 +1,35 @@ +@font-face{font-family:Journal;src:url('/assets/fonts/cormorant-latin.woff2') format('woff2');font-style:normal;font-weight:300 700;font-display:swap} +:root{--paper:#f3efe5;--paper-alt:#e9e2d4;--ink:#292822;--muted:#655f53;--line:#c7c0af;--accent:#a13d25;--violet:#4e405a;--nav-bg:rgba(243,239,229,.94);--display:Journal,Georgia,serif;--body:Studio,Arial,sans-serif} +html{background:var(--paper);color:var(--ink);scroll-padding-top:112px;scroll-behavior:smooth} +html[data-theme=dark]{--paper:#211e29;--paper-alt:#2c2637;--ink:#f0e8d9;--muted:#c5b8c8;--line:#625469;--accent:#f2b58e;--violet:#d6b7df;--nav-bg:rgba(33,30,41,.95);color-scheme:dark} +body{margin:0;font-family:var(--body);background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.76' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' opacity='.035' filter='url(%23n)'/%3E%3C/svg%3E");line-height:1.6;transition:color .3s,background-color .3s;background-color:var(--paper)} +html[data-theme=dark] body{background-image:radial-gradient(ellipse at 78% 22%,#51405936,transparent 45%),radial-gradient(#c2a3ce18 .7px,transparent .7px);background-size:auto,27px 27px} +*,*::before,*::after{box-sizing:border-box}a{color:inherit;text-decoration:none}button{font:inherit}button,a{-webkit-tap-highlight-color:transparent}button{color:inherit}button:not(:disabled),a{touch-action:manipulation}button{cursor:pointer}button:focus-visible,a:focus-visible{outline:2px solid var(--accent);outline-offset:6px}svg{display:block}button{border:0}h1,h2,h3,p{margin:0}em{font-weight:400}.skip-link{position:fixed;top:-100px;left:20px;z-index:100;background:var(--ink);color:var(--paper);padding:12px 20px}.skip-link:focus{top:12px} +.site-header{position:fixed;z-index:40;inset:20px 4.45% auto;max-width:1440px;margin:0 auto;height:75px;display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--ink);border-bottom:1px solid var(--line);padding:0 20px;background:var(--nav-bg);backdrop-filter:blur(12px)} +.brand{font-family:var(--display);font-size:29px;letter-spacing:-1px;display:inline-flex;align-items:center;font-weight:600;line-height:1.1}.brand svg{width:31px;height:31px;fill:none;stroke:var(--ink);stroke-width:1.3;margin-right:10px}.brand-dot{color:var(--accent)}.desktop-nav{display:flex;gap:28px;font-size:12px;font-weight:600}.desktop-nav a{position:relative;padding:12px 0}.desktop-nav a::after{content:'';position:absolute;left:0;right:0;bottom:6px;height:1px;background:var(--accent);transform:scaleX(0);transform-origin:left;transition:transform .22s}.desktop-nav a:hover::after{transform:scaleX(1)}.header-controls{display:flex;gap:14px;align-items:center}.theme-button{background:none;display:flex;align-items:center;gap:8px;font-size:10px;text-transform:uppercase;letter-spacing:1px;min-height:44px}.theme-button svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.4}.menu-toggle{display:none;width:44px;height:44px;background:none;padding:11px}.menu-toggle span{display:block;height:1px;background:var(--ink);margin:7px 0}.site-header #mobile-nav{position:absolute;top:calc(100% + 1px);left:0;right:0;bottom:auto;background:var(--paper);padding:22px;border-radius:0;max-height:calc(100dvh - 115px);overflow:auto;border-bottom:1px solid var(--ink)}#mobile-nav[hidden]{display:none}#mobile-nav a{display:block;padding:11px 0;font-family:var(--display);font-size:27px;border-bottom:1px solid var(--line)} +main,.site-footer{max-width:1568px;margin:auto}.hero{padding:139px 6% 0}.edition{display:flex;justify-content:space-between;align-items:center;font-size:9px;letter-spacing:1.7px}.edition-label{font-weight:700}.edition-right{color:var(--muted);letter-spacing:1px}.edition-right span{margin-left:14px;color:var(--accent);font-size:17px}.hero-composition{display:grid;grid-template-columns:1.46fr 1fr;gap:10px;margin-top:53px;position:relative}.hero-copy{padding-top:32px;position:relative;z-index:1}.eyebrow{font-size:10px;letter-spacing:1.8px;display:flex;align-items:center;gap:12px;font-weight:600}.tiny-star{color:var(--accent);font-size:23px;line-height:1}.hero h1{font-family:var(--display);font-weight:400;font-size:clamp(70px,8.8vw,142px);line-height:.91;letter-spacing:-6px;margin:27px -70px 31px 0;white-space:nowrap}.hero h1 em{color:var(--accent)}.hero-summary{display:grid;grid-template-columns:37px 1fr;max-width:422px;margin-top:39px}.margin-mark{font-family:var(--display);font-size:35px;line-height:1.2;color:var(--accent)}.hero-summary p{font-size:13px;line-height:1.9;max-width:355px}.text-link{display:inline-flex;align-items:center;gap:36px;font-size:11px;font-weight:700;border-bottom:1px solid var(--ink);min-height:44px;padding:7px 0;transition:gap .25s,color .25s}.text-link:hover{gap:46px;color:var(--accent)}.text-link span{font-size:20px;font-weight:400}.hero-summary .text-link{margin-top:19px}.hero-art{position:relative;align-self:start;padding-top:12px;min-width:0}.art-note{position:absolute;left:18%;top:4px;font-size:8px;letter-spacing:1px;color:var(--muted);text-transform:uppercase}.ink-drawing{position:relative;margin:13px -10px -15px;width:calc(100% + 20px);color:var(--violet)}.alchemist-emblem{width:100%;height:auto;overflow:visible;stroke:currentColor;stroke-width:1.3}.ink-guides{stroke-width:.65;opacity:.62}.ink-guides>path:first-child{stroke-dasharray:2 6}.turning-ink{stroke-width:.8;opacity:.7;transform-origin:250px 254px;animation:ink-turn 55s linear infinite}.ink-flower{stroke-width:1.4;animation:ink-breathe 8s ease-in-out infinite;transform-origin:250px 254px}.ink-core{stroke-width:1}.orbit-dots{stroke-width:1}.ink-stars{stroke:var(--accent);stroke-width:1}.hand-loop{stroke-width:1.3;stroke:var(--accent)}.profile-stamp{position:absolute;right:1%;top:9%;transform:rotate(9deg);width:90px;height:90px;border-radius:50%;padding:5px;background:var(--paper);border:1px solid var(--ink);box-shadow:0 0 0 5px var(--paper),0 0 0 6px var(--line)}.profile-stamp img{width:100%;height:100%;object-fit:cover;border-radius:50%;filter:saturate(.65)}.stamp-star{position:absolute;right:-13px;bottom:0;color:var(--accent);font-size:33px}.art-bottom{display:flex;align-items:start;justify-content:space-between;padding:0 5% 0 16%}.redraw-button{background:none;border-bottom:1px solid var(--line);font-size:9px;letter-spacing:1px;min-height:44px;padding:5px 0;display:flex;align-items:center;gap:8px}.redraw-button span{font-size:19px}.redraw-button:hover{color:var(--accent)}.handwritten{font-family:var(--display);font-style:italic;font-size:22px;line-height:1;transform:rotate(-7deg);color:var(--accent)}.profile-caption{text-align:center;font-size:8px;color:var(--muted);margin:27px 0 25px;letter-spacing:.5px}.disciplines{display:flex;justify-content:space-between;align-items:center;gap:22px;margin-top:42px;border-top:1px solid var(--ink);border-bottom:1px solid var(--ink);padding:19px 2%;font-family:var(--display);font-size:27px;letter-spacing:-.6px}.disciplines>span:nth-child(even){color:var(--accent);font-size:16px}.hero-footnote{font-size:8px;letter-spacing:1.4px;margin-top:13px;display:flex;justify-content:space-between;color:var(--muted)}.hero-footnote a{font-weight:600;min-height:30px}.hero-footnote a:hover{color:var(--accent)} +.section-shell{margin:115px 6% 0;display:grid;grid-template-columns:23% 1fr;gap:28px}.section-margin{padding-top:12px}.chapter{font-size:9px;font-weight:600;letter-spacing:1.4px}.margin-flower{stroke:var(--accent);stroke-width:1.2;width:78px;height:120px;margin:35px 0 0 17px;transform:rotate(-12deg)}.margin-scribble{display:block;font-family:var(--display);font-style:italic;color:var(--accent);font-size:22px;line-height:1;transform:rotate(-8deg);margin-left:12px}.about-body h2,.work-body h2,.posts-body h2{font-family:var(--display);font-size:clamp(36px,4.4vw,65px);font-weight:400;letter-spacing:-1.6px;line-height:1.03}.about-body h2 em,.work-body h2 em,.posts-body h2 em{color:var(--accent)}.about-columns{display:grid;grid-template-columns:1fr 1fr;gap:42px;margin:30px 0 18px;max-width:755px;font-size:12px;line-height:1.9;color:var(--muted)}.margin-description{font-family:var(--display);font-size:24px;line-height:1.1;font-style:italic;margin-top:30px;color:var(--muted)}.work-section{padding-top:60px;border-top:1px solid var(--line)}.section-title-row{display:flex;justify-content:space-between;align-items:end;margin-bottom:40px;gap:18px}.work-note{font-size:8px;line-height:1.7;text-align:right;letter-spacing:.8px;color:var(--muted);padding-bottom:5px}.project-row{display:grid;grid-template-columns:37px 124px 1fr 36px;align-items:center;gap:25px;min-height:147px;border-top:1px solid var(--line);transition:padding .25s,background .25s;padding:16px 0}.project-row:last-of-type{border-bottom:1px solid var(--line)}.project-row:hover{padding-left:8px;background:color-mix(in srgb,var(--paper-alt),transparent 55%)}.project-number{font-family:var(--display);font-size:20px;color:var(--muted)}.project-art{width:124px;height:98px;display:grid;place-items:center;background:var(--paper-alt);color:var(--violet)}.project-art svg{width:124px;fill:none;stroke:currentColor;stroke-width:1.3}.art-shabbat{background:color-mix(in srgb,var(--accent) 8%,var(--paper));color:var(--accent)}.art-date{background:color-mix(in srgb,var(--violet) 9%,var(--paper))}.project-title h3{font-family:var(--display);font-size:37px;font-weight:400;letter-spacing:-.7px;line-height:1.1}.project-title p{font-size:9px;text-transform:uppercase;letter-spacing:1px;color:var(--muted);margin-top:10px}.project-arrow{font-size:29px;transition:transform .25s}.project-row:hover .project-arrow{transform:translate(4px,-4px);color:var(--accent)}.work-footnote{display:flex;justify-content:space-between;align-items:center;margin-top:13px;gap:20px}.work-footnote>span{font-size:8px;color:var(--muted);max-width:235px}.work-footnote .text-link{font-size:9px;gap:18px}.posts-section{padding-top:60px;border-top:1px solid var(--line)}.posts-body h2{margin-bottom:35px}.journal-preview{display:grid;grid-template-columns:.85fr 1.2fr;gap:35px;background:var(--violet);color:#fff5e7;padding:42px 36px 40px}.journal-illustration{align-self:center;position:relative}.journal-illustration svg{width:100%;stroke:currentColor;stroke-width:1.15}.journal-illustration .handwritten{display:block;text-align:center;color:#efd5bf;font-size:24px}.journal-preview-copy h3{font-family:var(--display);font-size:45px;font-weight:400;letter-spacing:-.7px;line-height:1.04;margin:15px 0 18px}.preview-badge{font-size:8px;letter-spacing:1.5px;border:1px solid #ffffff60;padding:5px 8px}.journal-preview-copy p{font-size:11px;line-height:1.8}.journal-preview-copy .preview-disclosure{font-size:9px;margin:15px 0 7px;color:#e1d3e5}.journal-preview-copy .text-link{border-color:#fff5e7;gap:20px;font-size:10px}.journal-preview-copy .text-link:hover{color:#fff5e7;gap:28px}html[data-theme=dark] .journal-preview{background:#b997c4;color:#251d2b}html[data-theme=dark] .journal-illustration .handwritten,html[data-theme=dark] .journal-preview-copy .preview-disclosure{color:#3e2d47}html[data-theme=dark] .journal-preview-copy .text-link{border-color:#251d2b}html[data-theme=dark] .journal-preview-copy .text-link:hover{color:#251d2b}html[data-theme=dark] .preview-badge{border-color:#251d2b60} +.community-section{margin:115px 6% 0;padding:40px 0 0;border-top:1px solid var(--ink)}.community-top{display:flex;justify-content:space-between;align-items:center}.community-star{font-size:55px;line-height:1;color:var(--accent);animation:ink-turn 40s linear infinite}.community-main{display:grid;grid-template-columns:1.45fr 1fr;gap:90px;margin:25px 0 48px;align-items:end}.community-main h2{font-family:var(--display);font-size:clamp(50px,6.5vw,95px);line-height:.95;font-weight:400;letter-spacing:-3px}.community-main h2 em{color:var(--accent)}.community-copy p{font-size:12px;line-height:1.9;max-width:280px}.contact-link{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--ink);padding:15px 0;font-size:12px;font-weight:700;max-width:300px;margin-top:20px}.contact-link span{font-size:26px}.contact-link:hover{color:var(--accent)}.social-links{display:grid;grid-template-columns:1fr 1fr 1fr;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}.social-links a{display:flex;align-items:center;gap:15px;min-height:76px;font-size:11px;font-weight:600;padding:12px 25px;border-right:1px solid var(--line)}.social-links a:first-child{padding-left:0}.social-links a:last-child{border:0}.social-links a span:first-child{font-family:var(--display);font-size:17px;color:var(--muted)}.social-links a span:last-child{font-size:22px;margin-left:auto;transition:transform .25s}.social-links a:hover{color:var(--accent)}.social-links a:hover span:last-child{transform:translate(3px,-3px)} +.site-footer{padding:50px 6% 25px}.footer-top{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-bottom:35px}.footer-top .brand{font-size:30px}.footer-top>span{font-family:var(--display);font-style:italic;font-size:22px;color:var(--muted)}.back-top{font-size:9px;display:flex;align-items:center;gap:18px;min-height:44px}.back-top span{font-size:21px}.footer-bottom{display:flex;gap:28px;align-items:center;font-size:8px;color:var(--muted);border-top:1px solid var(--line);padding-top:17px}.footer-bottom>span{margin-right:auto}.footer-bottom button{font-size:8px;color:var(--muted);background:none;min-height:44px;padding:0 8px;text-decoration:underline;text-underline-offset:4px}.license-note{font-size:8px;color:var(--muted);margin:4px 0 24px}.concept-nav{display:flex;gap:23px;font-size:8px;letter-spacing:.2px;border-top:1px dashed var(--line);padding-top:16px;align-items:center;flex-wrap:wrap}.concept-nav a{min-height:32px;display:flex;align-items:center}.concept-nav [aria-current]{color:var(--accent);font-weight:600}.concept-nav a:hover{text-decoration:underline} +.is-drawing .ink-flower path,.is-drawing .turning-ink ellipse,.is-drawing .hand-loop{stroke-dasharray:1000;stroke-dashoffset:1000;animation:draw-ink 2.5s cubic-bezier(.3,.2,.2,1) forwards}.is-drawing .ink-flower{animation:none}.is-drawing .turning-ink{animation:none}.is-drawing .hand-loop{animation-delay:.2s}@keyframes draw-ink{to{stroke-dashoffset:0}}@keyframes ink-turn{to{transform:rotate(360deg)}}@keyframes ink-breathe{50%{transform:scale(.96) rotate(4deg)}}html[data-motion=paused] *,html[data-motion=paused] *::before,html[data-motion=paused] *::after{animation-play-state:paused!important}html[data-motion=paused] .is-drawing path,html[data-motion=paused] .is-drawing ellipse{stroke-dasharray:none!important;stroke-dashoffset:0!important} +@media(min-width:1600px){.hero h1{font-size:142px}.community-main h2{font-size:95px}} +@media(max-width:1100px){.desktop-nav{gap:18px;font-size:10px}.hero{padding-left:5%;padding-right:5%}.hero h1{letter-spacing:-4px}.hero-summary p{font-size:12px}.hero-composition{grid-template-columns:1.38fr 1fr}.hero-copy{padding-top:23px}.ink-drawing{margin-top:30px}.eyebrow{font-size:8px;letter-spacing:1.2px}.art-note{top:17px;font-size:7px}.hero-summary{margin-top:28px;max-width:345px}.profile-stamp{width:73px;height:73px}.profile-caption{font-size:7px}.handwritten{font-size:20px}.disciplines{font-size:24px;margin-top:40px}.section-shell{grid-template-columns:20% 1fr;gap:25px;margin-left:5%;margin-right:5%}.work-note{font-size:7px}.project-row{grid-template-columns:25px 105px 1fr 30px;gap:17px}.project-art{width:105px;height:89px}.project-art svg{width:105px}.journal-preview{padding:30px 25px;gap:22px}.journal-preview-copy h3{font-size:37px}.community-section{margin-left:5%;margin-right:5%}.community-main{gap:55px}.site-footer{padding-left:5%;padding-right:5%}.social-links a{font-size:10px;padding-right:16px;padding-left:16px}.social-links a span:first-child{font-size:14px}} +@media(max-width:800px){.site-header{height:67px;inset:14px 5% auto;padding:0 10px}.brand{font-size:26px}.brand svg{width:26px;height:26px;margin-right:7px}.desktop-nav{display:none}.menu-toggle{display:block}.theme-button{font-size:8px}.hero{padding-top:112px}.edition{font-size:8px}.edition-right{font-size:7px;max-width:180px;text-align:right;line-height:1.5}.edition-right span{display:none}.hero-composition{grid-template-columns:1.35fr 1fr;margin-top:25px}.hero h1{font-size:9.2vw;letter-spacing:-3px;margin-top:23px}.hero-summary{grid-template-columns:27px 1fr;margin-top:24px;max-width:305px}.hero-summary p{font-size:10px}.hero-summary .text-link{font-size:10px;margin-top:12px}.margin-mark{font-size:27px}.hero-art{padding-top:22px}.art-note{font-size:6px;left:11%;top:15px}.ink-drawing{margin-top:20px}.profile-stamp{width:61px;height:61px}.art-bottom{padding-left:5%;padding-right:0;gap:10px}.redraw-button{font-size:7px;letter-spacing:0}.handwritten{font-size:17px}.profile-caption{font-size:6px;margin-top:17px}.disciplines{font-size:20px;gap:13px;padding:16px 0}.disciplines>span:nth-child(even){font-size:11px}.section-shell{margin-top:80px;grid-template-columns:17% 1fr;gap:25px}.chapter{font-size:7px;letter-spacing:.8px}.about-body h2,.work-body h2,.posts-body h2{font-size:39px}.margin-description{font-size:20px}.about-columns{font-size:10px;gap:24px}.margin-flower{width:55px;height:100px;margin-left:5px}.margin-scribble{font-size:19px}.project-row{min-height:123px;grid-template-columns:22px 85px 1fr 26px;gap:13px}.project-art,.project-art svg{width:85px}.project-art{height:77px}.project-title h3{font-size:28px}.project-title p{font-size:7px}.project-number{font-size:17px}.work-footnote>span{max-width:165px;font-size:7px}.work-footnote .text-link{font-size:8px;gap:9px}.journal-preview{gap:15px;padding:25px 20px}.journal-preview-copy h3{font-size:32px}.journal-preview-copy p{font-size:10px}.journal-preview-copy .preview-disclosure{font-size:8px}.journal-preview-copy .text-link{font-size:8px;gap:12px}.journal-illustration .handwritten{font-size:19px}.community-section{margin-top:80px}.community-main{gap:35px}.community-main h2{font-size:60px;letter-spacing:-2px}.community-copy p{font-size:10px}.contact-link{font-size:10px}.social-links a{font-size:8px;gap:10px;padding-left:13px;padding-right:13px}.footer-top>span{font-size:18px}.back-top{font-size:8px;gap:10px}.footer-bottom{gap:17px;font-size:7px}.footer-bottom button,.license-note{font-size:7px}} +@media(max-width:600px){html{scroll-padding-top:103px}.site-header{inset:12px 5% auto;height:62px}.brand{font-size:25px}.header-controls{gap:8px}.theme-word{display:none}.theme-button{width:40px;justify-content:center}.theme-button svg{width:19px;height:19px}.hero{padding-top:103px}.edition{font-size:7px;letter-spacing:1.25px}.edition-right{max-width:112px;font-size:6px;letter-spacing:.5px}.hero-composition{display:flex;flex-direction:column;margin-top:28px;gap:0}.hero-copy{padding-top:0}.eyebrow{font-size:7px;letter-spacing:1.25px;gap:9px}.tiny-star{font-size:20px}.hero h1{font-size:clamp(55px,14.4vw,85px);letter-spacing:-3px;margin:23px -10px 26px 0;line-height:.94}.hero-summary{margin-top:0;max-width:350px;grid-template-columns:29px 1fr}.hero-summary p{font-size:11px;line-height:1.85;max-width:285px}.hero-summary .text-link{margin-top:12px;font-size:10px}.hero-art{width:86%;max-width:350px;margin:30px auto 0;padding-top:16px;align-self:center}.art-note{font-size:7px;top:5px;left:16%}.ink-drawing{margin-top:7px;margin-bottom:-20px}.profile-stamp{width:70px;height:70px;right:0;top:8%}.stamp-star{font-size:28px}.art-bottom{padding-left:12%;padding-right:1%}.redraw-button{font-size:8px}.handwritten{font-size:21px}.profile-caption{font-size:7px;margin-top:20px;margin-bottom:10px}.disciplines{margin-top:27px;flex-wrap:wrap;justify-content:center;gap:8px 19px;font-size:22px;padding:16px 0;line-height:1.2}.disciplines>span:nth-child(6){display:none}.disciplines>span:nth-child(5)::after{content:'';display:block}.hero-footnote{font-size:6px;letter-spacing:.8px;gap:15px}.hero-footnote>span{max-width:220px;line-height:1.7}.hero-footnote a{white-space:nowrap}.section-shell{display:block;margin-top:63px}.section-margin{padding-top:0;margin-bottom:23px}.chapter{font-size:8px;letter-spacing:1.1px}.margin-flower,.margin-scribble,.margin-description{display:none}.about-body h2,.work-body h2,.posts-body h2{font-size:clamp(35px,8.9vw,51px);letter-spacing:-1px}.about-columns{font-size:11px;gap:18px;margin-top:24px;grid-template-columns:1fr}.about-columns p{max-width:390px}.about-body .text-link{font-size:10px;margin-top:2px}.work-section,.posts-section{padding-top:33px}.section-title-row{margin-bottom:27px}.work-note{max-width:81px;font-size:6px;line-height:1.9}.project-row{grid-template-columns:18px 75px 1fr 23px;gap:12px;min-height:115px;padding:14px 0}.project-art,.project-art svg{width:75px}.project-art{height:75px}.project-number{font-size:16px}.project-title h3{font-size:29px;letter-spacing:-.6px}.project-title p{font-size:6px;letter-spacing:.6px;line-height:1.5;max-width:120px;margin-top:8px}.project-arrow{font-size:25px}.work-footnote{display:block;margin-top:15px}.work-footnote>span{display:block;font-size:7px;max-width:none;margin-bottom:8px}.work-footnote .text-link{font-size:9px;gap:23px}.posts-body h2{margin-bottom:26px}.journal-preview{padding:28px 23px;grid-template-columns:1fr;gap:15px}.journal-illustration{display:flex;align-items:center;justify-content:center;gap:15px;margin:-9px -5px 3px}.journal-illustration svg{width:123px;flex:0 0 123px}.journal-illustration .handwritten{font-size:24px;text-align:left}.journal-preview-copy{padding-top:11px;border-top:1px solid #ffffff40}.journal-preview-copy h3{font-size:44px;margin-top:17px}.journal-preview-copy p{font-size:11px}.journal-preview-copy .preview-disclosure{font-size:9px}.journal-preview-copy .text-link{font-size:10px;margin-top:4px;gap:30px}.community-section{margin-top:64px;padding-top:30px}.community-top .chapter{font-size:7px}.community-star{font-size:37px}.community-main{display:block;margin:19px 0 28px}.community-main h2{font-size:clamp(48px,12.4vw,70px);letter-spacing:-2px}.community-copy{margin-top:27px;max-width:330px}.community-copy p{font-size:11px;max-width:300px}.contact-link{font-size:11px;margin-top:12px;max-width:100%}.social-links{display:block}.social-links a,.social-links a:first-child{border-right:0;border-bottom:1px solid var(--line);padding:11px 0;font-size:11px;min-height:61px;gap:20px}.social-links a span:first-child{font-size:18px}.social-links a span:last-child{font-size:24px}.site-footer{padding-top:36px}.footer-top{flex-wrap:wrap;justify-content:start;column-gap:20px;row-gap:5px;margin-bottom:20px}.footer-top .brand{font-size:28px}.footer-top>span{font-size:18px}.back-top{width:100%;justify-content:space-between;border-bottom:1px solid var(--line);padding:10px 0;font-size:9px;margin-top:10px;min-height:48px}.footer-bottom{flex-wrap:wrap;padding-top:0;border-top:0;gap:5px 19px;font-size:7px}.footer-bottom>span{width:100%;margin-bottom:5px}.footer-bottom button{font-size:8px;margin-left:auto}.license-note{font-size:7px;max-width:290px;margin-top:8px;line-height:1.8}.concept-nav{gap:6px 17px;font-size:7px}.concept-nav a:first-child{width:100%}.concept-nav [aria-current]{padding:8px 0}} +@media(max-width:359px){.hero h1{font-size:52px;letter-spacing:-2.8px}.hero-summary p{font-size:10px}.hero-art{width:90%}.disciplines{gap:8px 14px;font-size:20px}.project-row{grid-template-columns:14px 61px 1fr 19px;gap:9px}.project-art,.project-art svg{width:61px}.project-art{height:65px}.project-title h3{font-size:26px}.journal-illustration svg{width:100px;flex-basis:100px}.journal-illustration .handwritten{font-size:21px}.journal-preview{padding:25px 19px}.footer-top>span{font-size:17px}} +@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation:none!important;transition:none!important}.is-drawing path,.is-drawing ellipse{stroke-dasharray:none!important;stroke-dashoffset:0!important}} + +/* Keep the reading copy comfortable even when the editorial labels are small. */ +.hero-summary p{font-size:14px} +.about-columns{font-size:13px} +.journal-preview-copy p{font-size:13px} +.journal-preview-copy .preview-disclosure{font-size:11px} +.community-copy p{font-size:13px} +.footer-bottom,.footer-bottom button,.license-note,.concept-nav{font-size:10px} +.work-footnote>span{font-size:10px} +@media(max-width:800px){.hero-summary p,.about-columns,.community-copy p{font-size:12px}.journal-preview-copy p{font-size:12px}.journal-preview-copy .preview-disclosure{font-size:10px}.work-footnote>span{font-size:9px}.footer-bottom,.footer-bottom button,.license-note,.concept-nav{font-size:9px}} +@media(max-width:600px){.hero-summary p,.about-columns,.community-copy p,.journal-preview-copy p{font-size:13px}.hero-summary{max-width:360px}.hero-summary p{max-width:310px}.project-title p{font-size:8px}.journal-preview-copy .preview-disclosure{font-size:11px}.license-note{max-width:330px}.work-footnote>span{font-size:9px}.footer-bottom,.footer-bottom button,.license-note,.concept-nav{font-size:9px}.hero-summary .text-link,.about-body .text-link,.work-footnote .text-link,.journal-preview-copy .text-link{font-size:11px}} + +/* Motion control stays beside the first animated illustration. */ +.hero-footnote{align-items:center;gap:18px}.hero-footnote-controls{display:flex;align-items:center;gap:28px;flex-shrink:0}.hero-footnote-controls a{display:flex;align-items:center;min-height:44px}.hero-footnote [data-motion-toggle]{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:7px 0;background:none;color:var(--ink);font-size:11px;letter-spacing:.2px;text-decoration:underline;text-underline-offset:4px}.hero-footnote [data-motion-toggle]:hover{color:var(--accent)} +@media(max-width:600px){.hero-footnote{align-items:flex-start;flex-wrap:wrap;gap:0 15px}.hero-footnote>span{padding-top:7px;max-width:none;width:100%}.hero-footnote-controls{width:100%;justify-content:space-between;gap:20px}.hero-footnote-controls a{font-size:9px}.hero-footnote [data-motion-toggle]{font-size:11px}} diff --git a/concepts/assets/concept-c.css b/concepts/assets/concept-c.css new file mode 100644 index 0000000..b457927 --- /dev/null +++ b/concepts/assets/concept-c.css @@ -0,0 +1,352 @@ +:root { + --paper: #f4f4ee; + --ink: #191b19; + --muted: #5b6059; + --line: #bfc3b8; + --lime: #cef948; + --blue: #4131da; + --pink: #d893c5; + --panel: #e9e9df; + --posts: #e7e5f5; + --display: Circuit, "Arial Black", sans-serif; + --body: Studio, Arial, sans-serif; + --mono: "Courier New", monospace; + color-scheme: light; +} +:root[data-theme="dark"] { + --paper: #171a18; + --ink: #f1f2e9; + --muted: #b3baac; + --line: #444c41; + --blue: #cfef69; + --panel: #242c22; + --posts: #222524; + color-scheme: dark; +} +* { box-sizing: border-box; } +html { scroll-behavior: smooth; scroll-padding-top: 110px; } +body { margin: 0; background: var(--paper); color: var(--ink); font-family: var(--body); font-size: 16px; line-height: 1.65; } +button, input, a { -webkit-tap-highlight-color: transparent; } +button, input { font: inherit; } +button, a { touch-action: manipulation; } +a { color: inherit; text-decoration: none; } +button { color: inherit; } +svg { display: block; } +button { cursor: pointer; } +h1, h2, h3, p { margin: 0; } +button:focus-visible, input:focus-visible, a:focus-visible { outline: 3px solid var(--blue); outline-offset: 6px; } +::selection { color: #191b19; background: var(--lime); } +.section-shell { padding-left: max(5vw, calc((100vw - 1370px)/2)); padding-right: max(5vw, calc((100vw - 1370px)/2)); } +.skip-link { position: fixed; top: 10px; left: 12px; z-index: 200; background: var(--lime); color: #191b19; padding: 12px 20px; transform: translateY(-180%); } +.skip-link:focus { transform: translateY(0); } +.site-header { position: fixed; z-index: 100; top: 0; left: 0; width: 100%; height: 86px; display: flex; align-items: center; justify-content: space-between; padding: 0 5vw; background: var(--paper); border-bottom: 1px solid var(--line); } +.wordmark { display: inline-flex; align-items: center; gap: 11px; font-family: var(--display); font-size: 25px; font-weight: 700; letter-spacing: -1.1px; line-height: 1; } +.brand-mark { width: 31px; height: 34px; } +.wordmark-dot { font-family: Arial, sans-serif; font-size: 11px; font-weight: 400; margin-left: 3px; vertical-align: top; letter-spacing: 0; } +.desktop-nav { display: flex; align-items: center; gap: 30px; } +.desktop-nav a { position: relative; font-size: 13px; font-weight: 600; padding: 13px 0; } +.desktop-nav a::after { content: ""; position: absolute; bottom: 6px; left: 0; width: 0; height: 2px; background: currentColor; transition: width 180ms; } +.desktop-nav a:hover::after { width: 100%; } +.header-controls { display: flex; align-items: center; gap: 20px; } +.header-contact { font-size: 13px; font-weight: 700; display: flex; gap: 24px; align-items: center; } +.header-contact span { font-size: 24px; font-weight: 400; } +.control-button { width: 44px; height: 44px; border: 1px solid var(--line); background: transparent; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: background 160ms, transform 160ms; } +.control-button:hover { background: var(--lime); color: #191b19; transform: rotate(12deg); } +.control-button svg { width: 22px; height: 22px; } +.menu-toggle { display: none; } +.mobile-nav[hidden] { display: none !important; } +#mobile-nav { background: var(--paper); color: var(--ink); } +.hero { padding-top: 125px; } +.hero-topline { display: flex; justify-content: space-between; align-items: center; gap: 18px; margin-bottom: 30px; } +.system-label, .preview-link, .section-label { font-family: var(--mono); text-transform: uppercase; font-size: 10px; line-height: 1.5; letter-spacing: .08em; } +.system-label { display: flex; align-items: center; gap: 10px; } +.status-dot { width: 7px; height: 7px; background: var(--blue); border-radius: 50%; } +.preview-link { text-align: right; text-decoration: underline; text-underline-offset: 4px; } +.hero-grid { display: grid; grid-template-columns: 49% 51%; align-items: start; } +.hero-copy { position: relative; padding-top: 20px; z-index: 2; } +h1 { font-family: var(--display); font-weight: 700; letter-spacing: -.082em; font-size: clamp(90px, 10.9vw, 162px); line-height: .82; } +.move-word { color: var(--blue); } +.tiny-spark { display: inline-block; color: var(--pink); font-weight: 400; font-size: .78em; vertical-align: .04em; padding-left: 14px; animation: spark-turn 16s linear infinite; transform-origin: 56% 55%; } +.hero-description { margin-top: 34px; font-size: clamp(13px, 1.12vw, 17px); line-height: 1.75; max-width: 430px; } +.solid-link { display: inline-flex; align-items: center; justify-content: space-between; gap: 36px; min-height: 52px; margin-top: 27px; background: var(--ink); color: var(--paper); padding: 12px 20px; font-size: 12px; font-weight: 600; transition: gap 180ms, background 180ms; } +.solid-link svg { width: 24px; height: 24px; } +.solid-link:hover { gap: 48px; } +.art-station { position: relative; margin-top: 15px; min-width: 0; } +.art-caption { display: flex; align-items: center; justify-content: space-between; font-family: var(--mono); font-size: 9px; letter-spacing: .08em; padding: 0 8px 16px; border-bottom: 1px solid var(--line); } +.vector-stage { position: relative; margin-top: 10px; height: clamp(350px, 34vw, 520px); isolation: isolate; } +.stage-grid { position: absolute; inset: 12px 7px 22px; background-image: linear-gradient(var(--line) 1px, transparent 1px), linear-gradient(90deg, var(--line) 1px, transparent 1px); background-size: 35px 35px; opacity: .25; mask-image: radial-gradient(ellipse at center, #000 22%, transparent 69%); } +.loop-sculpture { position: absolute; top: 50%; left: 50%; width: 112%; max-width: none; height: auto; transform: translate(-50%, -50%); overflow: visible; pointer-events: none; } +.loop-body { transform-origin: 300px 290px; transition: transform 120ms ease-out; } +.sculpture-orbit { transform-origin: 300px 290px; animation: float-loop 10s ease-in-out infinite; } +.orbit-guide { opacity: .55; } +.orbit-satellite { transform-origin: 300px 290px; animation: satellite 30s linear infinite; } +.axis { position: absolute; font-family: var(--mono); font-size: 8px; color: var(--muted); } +.axis-top { top: 6px; left: 50%; } +.axis-bottom { right: 3px; top: 49%; } +.svg-label { font-family: var(--mono); font-size: 7.4px; letter-spacing: .1em; fill: currentColor; } +.art-side-label { position: absolute; bottom: 26px; right: 20px; writing-mode: vertical-rl; font-family: var(--mono); font-size: 8px; letter-spacing: .1em; } +.art-controls { position: relative; z-index: 2; display: flex; align-items: center; justify-content: space-between; gap: 20px; border-top: 1px solid var(--line); padding: 17px 6px; } +.phase-control { display: flex; flex-wrap: wrap; align-items: center; column-gap: 12px; width: 66%; font-family: var(--mono); font-size: 9px; line-height: 1.6; } +.phase-control label { width: 100%; display: flex; justify-content: space-between; padding-right: 38px; font-size: 8px; letter-spacing: .08em; margin-bottom: 4px; } +.phase-control input { accent-color: var(--ink); height: 27px; cursor: ew-resize; width: calc(100% - 44px); min-width: 50px; margin: 0; } +.phase-control output { min-width: 28px; font-variant-numeric: tabular-nums; text-align: right; } +.motion-control { border: 0; background: none; display: flex; align-items: center; gap: 7px; min-height: 44px; font-family: var(--mono); font-size: 9px; padding: 4px 0; } +.pause-glyph { width: 12px; height: 14px; } +.play-symbol { display: none; } +html[data-motion="paused"] .pause-symbol { display: none; } +html[data-motion="paused"] .play-symbol { display: block; } +.discipline-strip { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 32px 0; margin-top: 48px; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); font-family: var(--display); font-size: clamp(13px, 1.6vw, 24px); font-weight: 500; letter-spacing: -.03em; white-space: nowrap; } +.strip-star { font-size: 25px; color: var(--blue); } +.strip-arrow { font-size: 34px; line-height: 1; } +.about-section { padding-top: 90px; padding-bottom: 100px; } +.section-label { display: flex; justify-content: space-between; gap: 15px; padding-bottom: 22px; border-bottom: 1px solid var(--line); } +.about-grid { display: grid; grid-template-columns: 250px 1fr 135px; gap: 55px; align-items: start; margin-top: 53px; } +.profile-composition { padding: 7px 7px 0 0; } +.profile-wrap { position: relative; background: var(--lime); box-shadow: 8px -8px 0 var(--lime); } +.profile-wrap img { display: block; width: 100%; height: auto; aspect-ratio: 1; object-fit: cover; } +.profile-corner { position: absolute; bottom: 0; right: 0; background: var(--lime); color: #191b19; padding: 9px 11px; font-family: var(--display); font-size: 18px; font-weight: 700; } +.asset-caption { font-family: var(--mono); font-size: 8px; line-height: 1.5; margin-top: 16px; color: var(--muted); } +.about-copy h2, .work-heading h2, .posts-intro h2 { font-family: var(--display); font-weight: 500; font-size: clamp(37px, 4.2vw, 61px); line-height: 1.08; letter-spacing: -.06em; } +.about-copy p { margin-top: 25px; max-width: 530px; font-size: 14px; line-height: 1.8; } +.about-copy p + p { color: var(--muted); margin-top: 17px; } +.about-links { display: flex; gap: 30px; flex-wrap: wrap; margin-top: 30px; } +.underlined-link { display: inline-flex; align-items: center; justify-content: space-between; gap: 14px; min-height: 44px; border-bottom: 1px solid currentColor; font-size: 11px; font-weight: 600; } +.underlined-link span { font-size: 20px; } +.about-tag { padding-top: 10px; } +.about-tag > span { display: block; font-size: 93px; line-height: 1; color: var(--blue); } +.about-tag p { font-family: var(--mono); font-size: 9px; line-height: 1.7; margin-top: 20px; } +.work-section { background: var(--panel); padding-top: 64px; padding-bottom: 64px; } +.work-heading { display: flex; align-items: flex-end; justify-content: space-between; gap: 25px; margin-top: 43px; margin-bottom: 43px; } +.work-heading > p { font-size: 13px; color: var(--muted); line-height: 1.8; padding-bottom: 4px; } +.project-list { border-top: 1px solid var(--ink); } +.project-row { display: grid; grid-template-columns: 55px 162px 1fr 160px 35px; gap: 24px; align-items: center; padding: 24px 0; border-bottom: 1px solid var(--line); transition: padding 200ms; } +.project-row:hover { padding-left: 12px; } +.project-number { align-self: start; font-family: var(--mono); font-size: 9px; padding-top: 5px; } +.project-visual { height: 106px; width: 162px; display: flex; justify-content: center; align-items: center; color: #191b19; overflow: hidden; } +.project-visual svg { width: 140px; height: 100px; transition: transform 300ms ease; } +.project-row:hover .project-visual svg { transform: rotate(10deg) scale(1.1); } +.visual-lottie { background: #cfef69; } +.visual-shabbat { background: #cbc3f1; } +.visual-date { background: #f0b3c5; } +.project-name h3 { font-family: var(--display); font-size: clamp(24px, 2.8vw, 41px); font-weight: 500; line-height: 1.2; letter-spacing: -.05em; } +.project-name p { font-size: 11px; color: var(--muted); margin-top: 8px; } +.project-kind { font-family: var(--mono); font-size: 9px; line-height: 1.8; color: var(--muted); } +.project-arrow { font-size: 36px; font-family: Arial, sans-serif; line-height: 1; } +.work-footnote { display: flex; gap: 20px; align-items: center; justify-content: space-between; margin-top: 23px; } +.work-footnote p { font-family: var(--mono); font-size: 8px; color: var(--muted); } +.posts-section { padding-top: 80px; padding-bottom: 90px; background: var(--posts); } +.posts-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 9%; margin-top: 49px; } +.posts-intro { padding-top: 30px; } +.posts-intro p { font-size: 14px; color: var(--muted); max-width: 290px; margin-top: 24px; line-height: 1.8; } +.post-prototype { border: 1px solid var(--line); padding: 16px; background: var(--paper); } +.post-topline { display: flex; align-items: center; justify-content: space-between; font-size: 22px; margin-bottom: 13px; } +.sample-pill { font-family: var(--mono); font-size: 8px; letter-spacing: .08em; } +.post-graphic { position: relative; min-height: 295px; background: #4230d4; overflow: hidden; display: flex; align-items: center; padding: 25px; isolation: isolate; } +.post-graphic span { position: relative; z-index: 1; font-family: var(--display); font-size: 77px; line-height: .85; font-weight: 700; letter-spacing: -.07em; color: #f1f1e9; } +.post-graphic i { position: absolute; display: block; width: 210px; height: 210px; border: 1px solid #cef948; border-radius: 50%; transform: rotate(-35deg) scaleX(.45); right: 5px; top: 50px; } +.post-graphic i:nth-child(2) { right: 17px; } +.post-graphic i:nth-child(3) { right: 29px; } +.post-graphic i:nth-child(4) { right: 41px; } +.post-graphic i:nth-child(5) { right: 53px; } +.post-graphic i:nth-child(6) { right: 65px; } +.post-caption { padding: 18px 0 3px; } +.post-caption h3 { font-family: var(--display); font-size: 19px; line-height: 1.3; letter-spacing: -.03em; font-weight: 500; } +.post-caption p { font-size: 10px; color: var(--muted); line-height: 1.8; margin-top: 11px; max-width: 430px; } +.community-section { background: #4131da; color: #f4f4ee; padding-top: 48px; padding-bottom: 45px; --line: #8274ee; } +.community-heading { display: flex; justify-content: space-between; align-items: center; gap: 35px; padding: 55px 0; } +.community-heading h2 { font-family: var(--display); font-size: clamp(54px, 7.5vw, 109px); line-height: .93; letter-spacing: -.075em; font-weight: 700; } +.community-heading h2 > span { color: #cef948; } +.round-contact { width: 165px; height: 165px; flex-shrink: 0; border: 1px solid #ac9cff; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; font-family: var(--mono); font-size: 10px; transition: background 220ms, color 220ms, transform 220ms; } +.round-contact:hover { transform: rotate(8deg); background: #cef948; color: #191b19; } +.big-arrow { font-family: Arial, sans-serif; font-size: 62px; line-height: 1; } +.community-links { display: grid; grid-template-columns: repeat(3, 1fr); gap: 35px; } +.community-links a { display: flex; justify-content: space-between; align-items: center; min-height: 58px; border-top: 1px solid var(--line); font-size: 11px; } +.community-links a span { font-size: 24px; } +.community-section :focus-visible { outline-color: #cef948; } +.site-footer { padding-top: 43px; padding-bottom: 22px; } +.footer-top { display: flex; justify-content: space-between; align-items: center; gap: 24px; padding-bottom: 36px; border-bottom: 1px solid var(--line); } +.footer-top .wordmark { font-size: 23px; } +.footer-top .wordmark span { color: var(--blue); font-size: 27px; } +.footer-top p, .footer-top > a:last-child { font-size: 11px; } +.footer-top > a:last-child { text-decoration: underline; text-underline-offset: 5px; min-height: 44px; display: flex; align-items: center; } +.footer-bottom { display: flex; justify-content: space-between; align-items: center; gap: 25px; padding-top: 24px; font-size: 8px; color: var(--muted); } +.footer-bottom a { color: var(--ink); min-height: 44px; display: flex; align-items: center; } +.local-note { font-family: var(--mono); font-size: 8px; color: var(--muted); letter-spacing: .03em; text-align: center; margin-top: 25px; } +@keyframes float-loop { 0%, 100% { transform: translateY(2px) rotate(-3deg); } 50% { transform: translateY(-13px) rotate(3deg); } } +@keyframes spark-turn { to { transform: rotate(360deg); } } +@keyframes satellite { to { transform: rotate(360deg); } } +html[data-motion="paused"] *, html[data-motion="paused"] *::before, html[data-motion="paused"] *::after { animation-play-state: paused !important; } +@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { animation: none !important; transition: none !important; } } +@media (min-width: 1600px) { .site-header { padding-left: calc((100vw - 1370px)/2); padding-right: calc((100vw - 1370px)/2); } } +@media (max-width: 1100px) { + .desktop-nav { gap: 20px; } + .header-controls { gap: 16px; } + .wordmark { font-size: 22px; } + .about-grid { grid-template-columns: 210px 1fr; gap: 40px; } + .about-tag { display: none; } + .project-row { grid-template-columns: 30px 140px 1fr 110px 30px; gap: 20px; } + .project-visual { width: 140px; } + .hero-topline { margin-bottom: 22px; } + .hero-copy { padding-top: 24px; } + .hero-description { font-size: 12px; } + .hero-grid { grid-template-columns: 48% 52%; } +} +@media (max-width: 800px) { + html { scroll-padding-top: 90px; } + .site-header { height: 72px; padding: 0 6vw; max-width: none; } + .section-shell { padding-left: 6vw; padding-right: 6vw; } + .desktop-nav, .header-contact { display: none; } + .header-controls { gap: 10px; } + .wordmark { font-size: 22px; gap: 7px; } + .brand-mark { width: 25px; height: 29px; } + .menu-toggle { display: flex; flex-direction: column; gap: 5px; border-radius: 0; border: 0; } + .menu-toggle span { display: block; width: 20px; height: 1px; background: currentColor; } + #mobile-nav { position: fixed; inset: 72px 0 0; z-index: 99; padding: 32px 8vw; background: var(--paper); display: flex; flex-direction: column; gap: 3px; overflow-y: auto; border: 0; border-radius: 0; box-shadow: none; } + #mobile-nav a { font-family: var(--display); font-size: clamp(27px, 6vw, 45px); line-height: 1.3; letter-spacing: -.04em; padding: 15px 0; border-bottom: 1px solid var(--line); } + #mobile-nav .menu-close { align-self: flex-end; font-family: var(--mono); font-size: 12px; } + .hero { padding-top: 102px; } + .system-label, .preview-link { font-size: 8px; } + .hero-grid { grid-template-columns: 47% 53%; } + h1 { font-size: clamp(80px, 12vw, 100px); } + .tiny-spark { padding-left: 5px; } + .hero-description { margin-top: 25px; font-size: 11px; } + .hero-description br { display: none; } + .solid-link { min-height: 48px; font-size: 11px; gap: 22px; padding: 10px 14px; } + .vector-stage { height: 300px; } + .art-station { margin-top: 10px; } + .art-caption { font-size: 7px; padding-bottom: 13px; } + .art-controls { gap: 10px; } + .phase-control { width: 63%; column-gap: 8px; } + .phase-control label, .motion-control { font-size: 7px; } + .art-side-label { right: 6px; bottom: 20px; font-size: 6px; } + .discipline-strip { margin-top: 35px; padding: 25px 0; font-size: 13px; gap: 8px; } + .strip-star { font-size: 18px; } + .strip-arrow { display: none; } + .about-section { padding-top: 60px; padding-bottom: 65px; } + .section-label { font-size: 8px; padding-bottom: 18px; } + .about-grid { grid-template-columns: 155px 1fr; gap: 30px; margin-top: 35px; } + .about-copy h2, .work-heading h2, .posts-intro h2 { font-size: 37px; } + .about-copy p { font-size: 12px; margin-top: 18px; } + .about-links { gap: 17px; margin-top: 17px; } + .underlined-link { font-size: 10px; gap: 9px; } + .work-section { padding-top: 45px; padding-bottom: 45px; } + .work-heading { margin-top: 30px; margin-bottom: 30px; } + .work-heading > p { font-size: 11px; } + .project-row { grid-template-columns: 22px 110px 1fr 24px; gap: 15px; padding: 20px 0; } + .project-visual { width: 110px; height: 88px; } + .project-visual svg { width: 110px; height: 88px; } + .project-kind { display: none; } + .project-name h3 { font-size: 28px; } + .project-name p { font-size: 10px; } + .project-arrow { font-size: 29px; } + .posts-section { padding-top: 55px; padding-bottom: 60px; } + .posts-grid { gap: 6%; margin-top: 35px; } + .posts-intro { padding-top: 15px; } + .posts-intro p { font-size: 12px; } + .post-prototype { padding: 12px; } + .post-graphic { min-height: 235px; padding: 18px; } + .post-graphic span { font-size: 61px; } + .post-graphic i { right: -65px; top: 20px; } + .post-graphic i:nth-child(2) { right: -53px; } + .post-graphic i:nth-child(3) { right: -41px; } + .post-graphic i:nth-child(4) { right: -29px; } + .post-graphic i:nth-child(5) { right: -17px; } + .post-graphic i:nth-child(6) { right: -5px; } + .post-caption h3 { font-size: 16px; } + .post-caption p { font-size: 9px; } + .community-heading { padding: 45px 0; } + .community-heading h2 { font-size: 7.5vw; } + .round-contact { width: 115px; height: 115px; font-size: 8px; gap: 6px; } + .big-arrow { font-size: 43px; } + .community-links { gap: 20px; } + .community-links a { font-size: 10px; } + .footer-top p { display: none; } + .footer-bottom { flex-wrap: wrap; gap: 12px 25px; font-size: 8px; } + .footer-bottom span:nth-child(2) { order: 3; width: 100%; } + .footer-bottom a { margin-left: auto; } +} +@media (max-width: 580px) { + .hero-topline { align-items: start; gap: 12px; margin-bottom: 27px; } + .system-label { max-width: 170px; gap: 7px; font-size: 7px; } + .status-dot { width: 5px; height: 5px; flex-shrink: 0; } + .preview-link { font-size: 7px; max-width: 120px; line-height: 1.7; } + .hero-grid { grid-template-columns: 1fr; } + .hero-copy { padding-top: 0; } + h1 { font-size: clamp(91px, 23.8vw, 135px); letter-spacing: -.08em; line-height: .84; } + .hero-description { font-size: 12px; max-width: 280px; line-height: 1.75; margin-top: 26px; } + .hero-description br { display: initial; } + .hero-copy .solid-link { margin-top: 20px; } + .art-station { margin-top: 40px; } + .art-caption { font-size: 8px; } + .vector-stage { height: 350px; margin-top: 6px; } + .loop-sculpture { width: 110%; } + .art-controls { padding-top: 12px; padding-bottom: 10px; gap: 20px; } + .phase-control { width: 65%; } + .phase-control label { font-size: 8px; } + .motion-control { font-size: 8px; } + .art-side-label { font-size: 7px; right: 11px; } + .discipline-strip { gap: 6px; font-size: clamp(8px, 2.65vw, 14px); padding: 21px 0; margin-top: 17px; } + .strip-star { font-size: 14px; } + .about-section { padding-top: 48px; padding-bottom: 55px; } + .section-label { font-size: 7px; line-height: 1.7; } + .section-label > span:last-child { text-align: right; } + .about-grid { grid-template-columns: 1fr; gap: 30px; margin-top: 35px; } + .profile-composition { width: 63%; max-width: 260px; } + .profile-wrap::after { content: "✳"; position: absolute; font-family: var(--display); color: var(--blue); font-size: 74px; line-height: 1; top: 35px; right: -100px; } + .about-copy h2, .work-heading h2, .posts-intro h2 { font-size: 42px; } + .about-copy p { font-size: 13px; line-height: 1.8; } + .about-links { gap: 25px; } + .about-links .underlined-link { font-size: 10px; } + .work-heading { display: block; margin-top: 28px; } + .work-heading > p { font-size: 12px; margin-top: 18px; } + .project-row { grid-template-columns: 83px 1fr 24px; gap: 14px; position: relative; padding: 20px 0; } + .project-number { display: none; } + .project-visual { width: 83px; height: 85px; } + .project-visual svg { width: 110px; max-width: none; height: 85px; } + .project-name h3 { font-size: clamp(19px, 6vw, 29px); } + .project-name p { font-size: 9px; line-height: 1.5; margin-top: 5px; } + .project-arrow { font-size: 27px; } + .project-row:hover { padding-left: 0; } + .work-footnote { flex-direction: column; align-items: flex-start; gap: 8px; } + .work-footnote p { font-size: 7px; } + .posts-grid { grid-template-columns: 1fr; gap: 35px; margin-top: 22px; } + .posts-intro p { max-width: 300px; font-size: 13px; margin-top: 19px; } + .post-graphic { min-height: 275px; padding: 24px; } + .post-graphic span { font-size: 77px; } + .post-graphic i { top: 45px; right: 5px; } + .post-graphic i:nth-child(2) { right: 17px; } + .post-graphic i:nth-child(3) { right: 29px; } + .post-graphic i:nth-child(4) { right: 41px; } + .post-graphic i:nth-child(5) { right: 53px; } + .post-graphic i:nth-child(6) { right: 65px; } + .post-caption h3 { font-size: 18px; } + .post-caption p { font-size: 10px; } + .community-section { padding-top: 35px; padding-bottom: 30px; } + .community-heading { align-items: flex-end; gap: 10px; padding-top: 33px; padding-bottom: 31px; } + .community-heading h2 { font-size: 10vw; } + .round-contact { width: 76px; height: 76px; font-size: 6px; gap: 4px; } + .big-arrow { font-size: 29px; } + .community-links { grid-template-columns: 1fr; gap: 0; } + .community-links a { font-size: 11px; min-height: 54px; } + .site-footer { padding-top: 30px; } + .footer-top { gap: 14px; padding-bottom: 22px; } + .footer-top .wordmark { font-size: 20px; } + .footer-top .wordmark span { font-size: 23px; } + .footer-top > a:last-child { font-size: 9px; } + .footer-bottom { padding-top: 14px; font-size: 7px; gap: 3px 10px; } + .local-note { font-size: 6px; line-height: 1.8; margin-top: 24px; } +} +@media (max-width: 360px) { + .site-header { padding-left: 5vw; padding-right: 5vw; } + .wordmark { font-size: 20px; gap: 6px; } + .brand-mark { width: 23px; height: 26px; } + .header-controls { gap: 4px; } + .hero-description { font-size: 11px; } + .vector-stage { height: 300px; } + .project-row { grid-template-columns: 70px 1fr 20px; gap: 11px; } + .project-visual { width: 70px; height: 76px; } + .project-name p { font-size: 8px; } + .profile-wrap::after { right: -85px; } + .community-heading h2 { font-size: 10.2vw; } + .round-contact { width: 65px; height: 65px; } +} diff --git a/concepts/assets/fonts/CORMORANT-LICENSE.txt b/concepts/assets/fonts/CORMORANT-LICENSE.txt new file mode 100644 index 0000000..8918461 --- /dev/null +++ b/concepts/assets/fonts/CORMORANT-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2015 The Cormorant Project Authors (github.com/CatharsisFonts/Cormorant) Cormorant-Italic[wght].ttf: Copyright 2015 The Cormorant Project Authors (github.com/CatharsisFonts/Cormorant) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/concepts/assets/fonts/MANROPE-LICENSE.txt b/concepts/assets/fonts/MANROPE-LICENSE.txt new file mode 100644 index 0000000..462280f --- /dev/null +++ b/concepts/assets/fonts/MANROPE-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/concepts/assets/fonts/SPACE-GROTESK-LICENSE.txt b/concepts/assets/fonts/SPACE-GROTESK-LICENSE.txt new file mode 100644 index 0000000..d5666d7 --- /dev/null +++ b/concepts/assets/fonts/SPACE-GROTESK-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Space Grotesk Project Authors (https://github.com/floriankarsten/space-grotesk) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/concepts/assets/fonts/cormorant-italic-latin.woff2 b/concepts/assets/fonts/cormorant-italic-latin.woff2 new file mode 100644 index 0000000..7048a05 Binary files /dev/null and b/concepts/assets/fonts/cormorant-italic-latin.woff2 differ diff --git a/concepts/assets/fonts/cormorant-latin.woff2 b/concepts/assets/fonts/cormorant-latin.woff2 new file mode 100644 index 0000000..023d95b Binary files /dev/null and b/concepts/assets/fonts/cormorant-latin.woff2 differ diff --git a/concepts/assets/fonts/manrope-latin.woff2 b/concepts/assets/fonts/manrope-latin.woff2 new file mode 100644 index 0000000..71eb731 Binary files /dev/null and b/concepts/assets/fonts/manrope-latin.woff2 differ diff --git a/concepts/assets/fonts/spacegrotesk-latin.woff2 b/concepts/assets/fonts/spacegrotesk-latin.woff2 new file mode 100644 index 0000000..0f3474e Binary files /dev/null and b/concepts/assets/fonts/spacegrotesk-latin.woff2 differ diff --git a/concepts/assets/profile-fallback.svg b/concepts/assets/profile-fallback.svg new file mode 100644 index 0000000..f4d83bc --- /dev/null +++ b/concepts/assets/profile-fallback.svg @@ -0,0 +1 @@ + diff --git a/concepts/assets/profile-telegram.jpg b/concepts/assets/profile-telegram.jpg new file mode 100644 index 0000000..d0df4dd Binary files /dev/null and b/concepts/assets/profile-telegram.jpg differ diff --git a/concepts/concept-a/index.html b/concepts/concept-a/index.html new file mode 100644 index 0000000..fd9337b --- /dev/null +++ b/concepts/concept-a/index.html @@ -0,0 +1,62 @@ + + +
+ + +A little design. A little code. A different kind of magic.
Exploring the space between imagination and interaction.

I'm WizardLoop, an independent designer, illustrator, animator and developer.
I bring playful visuals and useful software into the same orbit. From expressive characters and unexpected loops to Telegram bots and open-source tools, I like making ideas feel alive.
Meet me on Telegram Explore my GitHubA mobile-first editor for Lottie and TGS animations.
+Automatic group quiet hours for Shabbat and Jewish holidays.
+Original concept illustrations, not product screenshots.
+This is a posts layout preview. Original channel posts and their media will appear here after the integration is approved.
Read the real posts on Telegram04 / GOOD THINGS HAPPEN IN LOOPS
Have a thought, a question, or a little spark of an idea?
I'm WizardLoop. I bring together design, motion and code to turn curious ideas into things you can see, feel and use.
Turn the page
Telegram public profile still · local snapshot
+I’m an independent creator, designer and developer. I work with animation, visual design, Telegram bots and software tools, following ideas wherever they lead.
I like the space where a carefully drawn detail meets a clever piece of code. Open source is part of how I build, share and keep learning.
A few things
from the workbench.
Motion, animation & code
An open-source build
A software experiment
Thoughts, process
& the in-between.
The journal will bring posts from my Telegram channel into this space, with a direct path to the original.
This is a design sample. Live posts and Telegram media are not loaded in this local concept.
Read the real channelHave a curious idea, a question, or something you've been making? I'd love to hear about it.
Say hello on TelegramI make things come alive.
Design, motion and code. A little curiosity.
A little magic. Always in the loop.

Telegram public profile still
Local snapshot, not a live sync.
I'm WizardLoop, an independent creator working where visual design, animation and software meet.
I turn ideas into things you can see, feel and use. That might be a moving illustration, a Telegram bot, a small tool or a piece of open-source software.
Code, Design
& a Little Magic.
A few open-source builds.
Explore the code behind the work.
Animation tooling
A software project
A Telegram utility
Original concept illustrations, not project screenshots.
All repositoriesSample post layout. No channel content is reproduced here. Original posts will use verified Telegram embeds after approval.
Three original directions for WizardLoop. Explore the layouts, switch the lights, and set the ideas in motion. This is the beginning of a conversation.
A personal observatory. Expansive typography, delicate celestial mechanics, and a small world at its center.
Enter the orbitAn open notebook. Ink drawings, warm paper, expressive serif type, and ideas that come alive on the page.
Open the journalA creative technology playground. Sculptural vectors, artful type, and a loop you can make your own.
Change the frequencyPreview scope. These are local design studies. The profile still is from the public Telegram profile. Project illustrations are original concept art. Post areas are labeled layout examples. Live synchronization, embedded posts, feedback delivery and production pages await approval.