@r1z4x/tezgah 1.9.2 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +83 -1
- package/MANIFEST +382 -144
- package/README.de.md +1 -1
- package/README.es.md +1 -1
- package/README.fr.md +1 -1
- package/README.md +1 -1
- package/README.tr.md +1 -1
- package/bin/codegen +5 -2
- package/bin/tezgah-design +288 -1
- package/bin/tezgah-docs +1 -1
- package/bin/tezgah-doctor +39 -2
- package/bin/tezgah-import-ai-research +26 -12
- package/bin/tezgah-ocr-review +296 -0
- package/bin/tezgah-research +216 -40
- package/bin/tezgah-review-quote +185 -0
- package/bin/tezgah-setup +136 -33
- package/bin/tezgah-skill +1 -1
- package/bin/tezgah-status +201 -3
- package/bin/tezgah-task +203 -3
- package/commands/adhd.md +2 -2
- package/commands/ponytail.md +4 -4
- package/docs/architecture.md +2 -2
- package/docs/citations-baseline.json +2 -2
- package/docs/clarity-baseline.json +2 -2
- package/docs/contract.md +87 -42
- package/docs/environment.md +2 -0
- package/docs/evidence.md +28 -9
- package/docs/feature-audit.md +2 -2
- package/docs/gate.md +54 -31
- package/docs/glossary.md +5 -2
- package/docs/hosts.md +17 -3
- package/docs/index.json +34 -8
- package/docs/judge.md +4 -2
- package/docs/layers.md +3 -3
- package/docs/models.md +31 -9
- package/docs/operations.md +126 -1
- package/docs/research.md +786 -5
- package/docs/skills.md +137 -13
- package/docs/status-line.md +115 -1
- package/hooks/hooks.json +1 -1
- package/hooks/lang/en.json +10 -0
- package/hooks/lang/tr.json +11 -1
- package/hooks/tezgah_agents.py +38 -22
- package/hooks/tezgah_apps.py +18 -0
- package/hooks/tezgah_components.py +4 -0
- package/hooks/tezgah_context.py +189 -50
- package/hooks/tezgah_extension.py +337 -0
- package/hooks/tezgah_gate.py +188 -56
- package/hooks/tezgah_integrity.py +652 -105
- package/hooks/tezgah_judge.py +6 -4
- package/hooks/tezgah_models.py +59 -19
- package/hooks/tezgah_orca.py +1 -1
- package/hooks/tezgah_paths.py +102 -6
- package/hooks/tezgah_policy.py +94 -45
- package/hooks/tezgah_rank.py +9 -6
- package/hooks/tezgah_replay.py +4 -4
- package/hooks/tezgah_research.py +1260 -65
- package/hooks/tezgah_research_capture.py +1544 -0
- package/hooks/tezgah_research_evidence.py +842 -0
- package/hooks/tezgah_research_stats.py +258 -0
- package/hooks/tezgah_skill_pick.py +408 -106
- package/hooks/tezgah_stopspec.py +8 -1
- package/hooks/tezgah_task.py +12 -4
- package/hooks/tezgah_taste_ledger.py +1 -1
- package/hosts/cursor/hook.py +29 -2
- package/hosts/opencode/plugins/tezgah.js +307 -46
- package/hosts/opencode/tui/cli/tui.tsx +100 -0
- package/hosts/opencode/tui/tezgah-tui.tsx +2 -1
- package/output-styles/tezgah.md +10 -10
- package/package.json +1 -1
- package/skills/ai-research/SKILL.md +21 -14
- package/skills/ai-research/SOURCE +7 -5
- package/skills/ai-research/index/1-frame.md +6 -6
- package/skills/ai-research/index/2-data.md +9 -9
- package/skills/ai-research/index/3-train.md +36 -36
- package/skills/ai-research/index/4-measure.md +13 -13
- package/skills/ai-research/index/5-run.md +11 -11
- package/skills/ai-research/index/6-write.md +23 -23
- package/skills/ai-research/library.json +104 -104
- package/skills/analyze-app/SKILL.md +17 -12
- package/skills/design-contract/SKILL.md +42 -7
- package/skills/design-contract/data-views.md +2 -2
- package/skills/design-library/EVALS.md +1 -1
- package/skills/design-library/INDEX.md +39 -39
- package/skills/design-library/SKILL.md +19 -13
- package/skills/design-library/SOURCE +45 -43
- package/skills/feature-audit/SKILL.md +20 -14
- package/skills/hallmark/LICENSE +21 -0
- package/skills/hallmark/SKILL.md +154 -0
- package/skills/hallmark/SOURCE +207 -0
- package/skills/hallmark/agents/openai.yaml +13 -0
- package/skills/hallmark/references/anatomy.md +71 -0
- package/skills/hallmark/references/brand-truth.md +40 -0
- package/skills/hallmark/references/comp.md +104 -0
- package/skills/hallmark/references/craft.md +116 -0
- package/skills/hallmark/references/dark-mode.md +49 -0
- package/skills/hallmark/references/data-viz.md +48 -0
- package/skills/hallmark/references/design-md.md +53 -0
- package/skills/hallmark/references/direction.md +52 -0
- package/skills/hallmark/references/export-formats.md +80 -0
- package/skills/hallmark/references/flow.md +131 -0
- package/skills/hallmark/references/fonts.md +58 -0
- package/skills/hallmark/references/gates.md +243 -0
- package/skills/hallmark/references/genres/atmospheric.md +24 -0
- package/skills/hallmark/references/genres/editorial.md +24 -0
- package/skills/hallmark/references/genres/modern-minimal.md +24 -0
- package/skills/hallmark/references/genres/playful.md +24 -0
- package/skills/hallmark/references/imagery.md +99 -0
- package/skills/hallmark/references/interaction-and-states.md +89 -0
- package/skills/hallmark/references/layout.md +104 -0
- package/skills/hallmark/references/macrostructures/01-bento-grid.md +21 -0
- package/skills/hallmark/references/macrostructures/02-long-document.md +35 -0
- package/skills/hallmark/references/macrostructures/03-marquee-hero.md +21 -0
- package/skills/hallmark/references/macrostructures/04-stat-led.md +21 -0
- package/skills/hallmark/references/macrostructures/05-workbench.md +21 -0
- package/skills/hallmark/references/macrostructures/06-conversational-faq.md +28 -0
- package/skills/hallmark/references/macrostructures/07-manifesto.md +28 -0
- package/skills/hallmark/references/macrostructures/08-photographic.md +21 -0
- package/skills/hallmark/references/macrostructures/09-quote-led.md +21 -0
- package/skills/hallmark/references/macrostructures/10-specimen.md +21 -0
- package/skills/hallmark/references/macrostructures/11-catalogue.md +21 -0
- package/skills/hallmark/references/macrostructures/12-letter.md +21 -0
- package/skills/hallmark/references/macrostructures/13-index-first.md +21 -0
- package/skills/hallmark/references/macrostructures/14-narrative-workflow.md +21 -0
- package/skills/hallmark/references/macrostructures/15-split-studio.md +21 -0
- package/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
- package/skills/hallmark/references/macrostructures/17-type-specimen.md +19 -0
- package/skills/hallmark/references/macrostructures/18-portfolio-grid.md +21 -0
- package/skills/hallmark/references/macrostructures/19-map-diagram.md +21 -0
- package/skills/hallmark/references/macrostructures/20-ecosystem-index.md +19 -0
- package/skills/hallmark/references/macrostructures/21-component-playground.md +21 -0
- package/skills/hallmark/references/macrostructures.md +119 -0
- package/skills/hallmark/references/microinteractions.md +80 -0
- package/skills/hallmark/references/patterns.md +202 -0
- package/skills/hallmark/references/redesign.md +88 -0
- package/skills/hallmark/references/responsive.md +46 -0
- package/skills/hallmark/references/review-finish.md +19 -0
- package/skills/hallmark/references/review-hero.md +20 -0
- package/skills/hallmark/references/scroll-choreography.md +110 -0
- package/skills/hallmark/references/texture.md +90 -0
- package/skills/hallmark/references/themes/README.md +58 -0
- package/skills/hallmark/references/themes/almanac.jpg +0 -0
- package/skills/hallmark/references/themes/almanac.md +103 -0
- package/skills/hallmark/references/themes/arcade.jpg +0 -0
- package/skills/hallmark/references/themes/arcade.md +102 -0
- package/skills/hallmark/references/themes/atelier.jpg +0 -0
- package/skills/hallmark/references/themes/atelier.md +98 -0
- package/skills/hallmark/references/themes/bloom.jpg +0 -0
- package/skills/hallmark/references/themes/bloom.md +102 -0
- package/skills/hallmark/references/themes/blueprint.jpg +0 -0
- package/skills/hallmark/references/themes/blueprint.md +103 -0
- package/skills/hallmark/references/themes/broadside.jpg +0 -0
- package/skills/hallmark/references/themes/broadside.md +108 -0
- package/skills/hallmark/references/themes/brutal.jpg +0 -0
- package/skills/hallmark/references/themes/brutal.md +95 -0
- package/skills/hallmark/references/themes/carnival.jpg +0 -0
- package/skills/hallmark/references/themes/carnival.md +104 -0
- package/skills/hallmark/references/themes/cobalt.jpg +0 -0
- package/skills/hallmark/references/themes/cobalt.md +101 -0
- package/skills/hallmark/references/themes/console.jpg +0 -0
- package/skills/hallmark/references/themes/console.md +99 -0
- package/skills/hallmark/references/themes/coral.jpg +0 -0
- package/skills/hallmark/references/themes/coral.md +102 -0
- package/skills/hallmark/references/themes/darkroom.jpg +0 -0
- package/skills/hallmark/references/themes/darkroom.md +99 -0
- package/skills/hallmark/references/themes/dose.jpg +0 -0
- package/skills/hallmark/references/themes/dose.md +98 -0
- package/skills/hallmark/references/themes/dusk.jpg +0 -0
- package/skills/hallmark/references/themes/dusk.md +105 -0
- package/skills/hallmark/references/themes/editorial.jpg +0 -0
- package/skills/hallmark/references/themes/editorial.md +97 -0
- package/skills/hallmark/references/themes/formwork.jpg +0 -0
- package/skills/hallmark/references/themes/formwork.md +107 -0
- package/skills/hallmark/references/themes/furrow.jpg +0 -0
- package/skills/hallmark/references/themes/furrow.md +98 -0
- package/skills/hallmark/references/themes/garden.jpg +0 -0
- package/skills/hallmark/references/themes/garden.md +97 -0
- package/skills/hallmark/references/themes/grid.jpg +0 -0
- package/skills/hallmark/references/themes/grid.md +101 -0
- package/skills/hallmark/references/themes/halftone.jpg +0 -0
- package/skills/hallmark/references/themes/halftone.md +106 -0
- package/skills/hallmark/references/themes/hedgerow.jpg +0 -0
- package/skills/hallmark/references/themes/hedgerow.md +104 -0
- package/skills/hallmark/references/themes/hum.jpg +0 -0
- package/skills/hallmark/references/themes/hum.md +99 -0
- package/skills/hallmark/references/themes/index.json +2191 -0
- package/skills/hallmark/references/themes/ink.jpg +0 -0
- package/skills/hallmark/references/themes/ink.md +106 -0
- package/skills/hallmark/references/themes/kiln.jpg +0 -0
- package/skills/hallmark/references/themes/kiln.md +108 -0
- package/skills/hallmark/references/themes/loom.jpg +0 -0
- package/skills/hallmark/references/themes/loom.md +106 -0
- package/skills/hallmark/references/themes/lumen.jpg +0 -0
- package/skills/hallmark/references/themes/lumen.md +103 -0
- package/skills/hallmark/references/themes/manifesto.jpg +0 -0
- package/skills/hallmark/references/themes/manifesto.md +101 -0
- package/skills/hallmark/references/themes/midnight.jpg +0 -0
- package/skills/hallmark/references/themes/midnight.md +97 -0
- package/skills/hallmark/references/themes/newsprint.jpg +0 -0
- package/skills/hallmark/references/themes/newsprint.md +102 -0
- package/skills/hallmark/references/themes/overprint.jpg +0 -0
- package/skills/hallmark/references/themes/overprint.md +101 -0
- package/skills/hallmark/references/themes/pasteup.jpg +0 -0
- package/skills/hallmark/references/themes/pasteup.md +100 -0
- package/skills/hallmark/references/themes/piste.jpg +0 -0
- package/skills/hallmark/references/themes/piste.md +99 -0
- package/skills/hallmark/references/themes/ribbon.jpg +0 -0
- package/skills/hallmark/references/themes/ribbon.md +106 -0
- package/skills/hallmark/references/themes/rim.jpg +0 -0
- package/skills/hallmark/references/themes/rim.md +96 -0
- package/skills/hallmark/references/themes/riso.jpg +0 -0
- package/skills/hallmark/references/themes/riso.md +98 -0
- package/skills/hallmark/references/themes/solstice.jpg +0 -0
- package/skills/hallmark/references/themes/solstice.md +104 -0
- package/skills/hallmark/references/themes/specimen.jpg +0 -0
- package/skills/hallmark/references/themes/specimen.md +100 -0
- package/skills/hallmark/references/themes/spore.jpg +0 -0
- package/skills/hallmark/references/themes/spore.md +104 -0
- package/skills/hallmark/references/themes/sport.jpg +0 -0
- package/skills/hallmark/references/themes/sport.md +101 -0
- package/skills/hallmark/references/themes/squeeze.jpg +0 -0
- package/skills/hallmark/references/themes/squeeze.md +99 -0
- package/skills/hallmark/references/themes/sticker.jpg +0 -0
- package/skills/hallmark/references/themes/sticker.md +106 -0
- package/skills/hallmark/references/themes/studio.jpg +0 -0
- package/skills/hallmark/references/themes/studio.md +99 -0
- package/skills/hallmark/references/themes/terminal.jpg +0 -0
- package/skills/hallmark/references/themes/terminal.md +96 -0
- package/skills/hallmark/references/themes/terrazzo.jpg +0 -0
- package/skills/hallmark/references/themes/terrazzo.md +106 -0
- package/skills/hallmark/references/themes/ultraviolet.jpg +0 -0
- package/skills/hallmark/references/themes/ultraviolet.md +106 -0
- package/skills/hallmark/references/themes/vellum.jpg +0 -0
- package/skills/hallmark/references/themes/vellum.md +105 -0
- package/skills/hallmark/references/themes/wayfind.jpg +0 -0
- package/skills/hallmark/references/themes/wayfind.md +105 -0
- package/skills/hallmark/references/themes/werkstatt.jpg +0 -0
- package/skills/hallmark/references/themes/werkstatt.md +105 -0
- package/skills/hallmark/scripts/capture.mjs +125 -0
- package/skills/hallmark/scripts/fixtures/exemplars/atmospheric.html +324 -0
- package/skills/hallmark/scripts/fixtures/exemplars/editorial.html +363 -0
- package/skills/hallmark/scripts/fixtures/exemplars/modern-minimal.html +527 -0
- package/skills/hallmark/scripts/fixtures/exemplars/playful.html +353 -0
- package/skills/hallmark/scripts/fixtures/eyebrow-fail/index.html +118 -0
- package/skills/hallmark/scripts/fixtures/eyebrow-pass/index.html +137 -0
- package/skills/hallmark/scripts/fixtures/kept/after.html +27 -0
- package/skills/hallmark/scripts/fixtures/kept/before.html +26 -0
- package/skills/hallmark/scripts/fixtures/slopped.html +145 -0
- package/skills/hallmark/scripts/fixtures/tailwind-fail/Feature.vue +14 -0
- package/skills/hallmark/scripts/fixtures/tailwind-fail/Hero.tsx +33 -0
- package/skills/hallmark/scripts/fixtures/tailwind-fail/index.html +74 -0
- package/skills/hallmark/scripts/fixtures/tailwind-fail/style.css +6 -0
- package/skills/hallmark/scripts/fixtures/tailwind-pass/Hero.tsx +33 -0
- package/skills/hallmark/scripts/fixtures/tailwind-pass/index.html +57 -0
- package/skills/hallmark/scripts/fixtures/tailwind-pass/style.css +15 -0
- package/skills/hallmark/scripts/fixtures/waiver/index.html +54 -0
- package/skills/hallmark/scripts/imagegen.mjs +85 -0
- package/skills/hallmark/scripts/install-hook.mjs +70 -0
- package/skills/hallmark/scripts/install.mjs +141 -0
- package/skills/hallmark/scripts/lint-hook.mjs +49 -0
- package/skills/hallmark/scripts/photos.json +1 -0
- package/skills/hallmark/scripts/picture.mjs +71 -0
- package/skills/hallmark/scripts/refcheck.mjs +352 -0
- package/skills/hallmark/scripts/sloplint-render.mjs +1252 -0
- package/skills/hallmark/scripts/sloplint.mjs +4422 -0
- package/skills/hallmark/scripts/theme.mjs +650 -0
- package/skills/harness/SKILL.md +15 -8
- package/skills/i-have-adhd/SKILL.md +22 -11
- package/skills/no-ai-slop/SKILL.md +15 -1
- package/skills/plan-add/SKILL.md +33 -26
- package/skills/plan-status/SKILL.md +13 -7
- package/skills/plan-sync/SKILL.md +18 -12
- package/skills/pm-frameworks/SKILL.md +19 -10
- package/skills/pm-frameworks/SOURCE +7 -5
- package/skills/ponytail/SKILL.md +19 -14
- package/skills/product-analysis/SKILL.md +22 -18
- package/skills/product-flow/SKILL.md +14 -9
- package/skills/research/SKILL.md +75 -39
- package/skills/rl-env/SKILL.md +25 -13
- package/skills/rl-env/SOURCE +8 -6
- package/skills/tezgah-contract/SKILL.md +47 -42
- package/bin/tezgah-skill.py +0 -59
- /package/skills/ai-research/0-autoresearch-skill/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/litgpt/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/mamba/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/nanogpt/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/rwkv/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/torchtitan/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/02-tokenization/huggingface-tokenizers/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/02-tokenization/sentencepiece/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/03-fine-tuning/axolotl/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/03-fine-tuning/llama-factory/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/03-fine-tuning/peft/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/03-fine-tuning/unsloth/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/04-mechanistic-interpretability/nnsight/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/04-mechanistic-interpretability/pyvene/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/04-mechanistic-interpretability/saelens/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/05-data-processing/nemo-curator/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/05-data-processing/ray-data/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/grpo-rl-training/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/miles/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/openrlhf/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/simpo/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/slime/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/torchforge/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/trl-fine-tuning/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/verl/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/07-safety-alignment/constitutional-ai/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/07-safety-alignment/llamaguard/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/07-safety-alignment/nemo-guardrails/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/07-safety-alignment/prompt-guard/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/accelerate/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/deepspeed/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/megatron-core/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/pytorch-fsdp2/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/pytorch-lightning/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/ray-train/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/09-infrastructure/lambda-labs/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/09-infrastructure/modal/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/09-infrastructure/skypilot/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/awq/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/bitsandbytes/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/flash-attention/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/gguf/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/gptq/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/hqq/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/ml-training-recipes/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/11-evaluation/lm-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/11-evaluation/nemo-evaluator/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/12-inference-serving/llama-cpp/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/12-inference-serving/sglang/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/12-inference-serving/tensorrt-llm/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/12-inference-serving/vllm/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/13-mlops/mlflow/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/13-mlops/swanlab/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/13-mlops/tensorboard/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/13-mlops/weights-and-biases/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/a-evolve/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/autogpt/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/crewai/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/langchain/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/llamaindex/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/chroma/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/faiss/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/pinecone/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/qdrant/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/sentence-transformers/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/16-prompt-engineering/dspy/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/16-prompt-engineering/guidance/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/16-prompt-engineering/instructor/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/16-prompt-engineering/outlines/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/17-observability/langsmith/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/17-observability/phoenix/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/audiocraft/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/blip-2/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/clip/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/cosmos-policy/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/llava/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/openpi/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/openvla-oft/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/segment-anything/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/stable-diffusion/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/whisper/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/knowledge-distillation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/long-context/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/model-merging/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/model-pruning/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/moe-training/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/speculative-decoding/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/20-ml-paper-writing/academic-plotting/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/21-research-ideation/creative-thinking-for-research/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/22-agent-native-research-artifact/compiler/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/22-agent-native-research-artifact/research-manager/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/colour-independence/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/flexible-typography/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/information-density/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/preference-audit/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/responsive-review/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/simplified-views/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/specify/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/assess-load/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/plain-language-design/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/review/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/simplify/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/design-research/skills/behavioural-analytics/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/design-research/skills/qual-quant-triangulation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/audit/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/design-flow/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/feedback-and-status/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/keyboard-review/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/multi-modal-input/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/touch-target-design/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/voice-interaction/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-affordance/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-brand-consistency/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-color/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-composition/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-information-density/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-typography/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/pm-frameworks/intended-vs-implemented/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/pm-frameworks/opportunity-solution-tree/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/generate-nemo-gym-env/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/generate-openenv-env/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/generate-ors-env/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/generate-verifiers-env/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/rl-env-from-description/{SKILL.md → ENTRY.md} +0 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en-GB">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Fenwick and Daughters, coffee roasted in York since 1921</title>
|
|
7
|
+
<meta name="description" content="Fenwick and Daughters roasts six coffees a week in York, sold in 250 g bags or by subscription.">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
|
+
<link href="https://fonts.googleapis.com/css2?family=Grenze+Gotisch:wght@600&family=Hanken+Grotesk:wght@400;500;600&family=IBM+Plex+Mono:wght@400&display=swap" rel="stylesheet">
|
|
11
|
+
<style>
|
|
12
|
+
/* Hallmark · job: buy · shape: Trade Ledger (custom: the roast as a Poster, the house's day book set as its own ledger, the cup as a pair, the order on the pigment) · genre: editorial · theme: Vellum (by request)
|
|
13
|
+
* hero: Poster · nav: masthead, the blackletter wordmark centred over a double rule, one link at each end · footer: letter close · imagery: photographs, library 3, warm con=6 · signature: the roast itself, beans swept round the cooling tray full-bleed under a parchment plate · vellum: parchment
|
|
14
|
+
* axes: light/blackletter/cool · posture: committed · contrast: pass · fold: pass · v2.0.0 */
|
|
15
|
+
/* Hallmark · pre-emit critique: P4 H5 E4 S5 R4 V4 · weakest: E, the plate must not bury the hand and the falling beans; it rests on the tray's far side and the plain wall, so the stream and the lever stay clear */
|
|
16
|
+
/* Hallmark · hero-review: in-thread · fix · 1 finding · 1 resolved (the head breaks after York) */
|
|
17
|
+
/* Hallmark · finish-review: in-thread (the subagent limit was reached) · fix · 3 findings · 1 resolved (the order head failed the swap test, then its blackletter I read as J: now 250 g bags, or a subscription) · 2 answered (the pair's captions are card facts, imagery.md 5; the pair are the closest honest frames the library holds) · gap: none */
|
|
18
|
+
/* Hallmark · answered F4 · the order field inverts the primary to parchment on pigment, as the theme's own hint sets it for its one field */
|
|
19
|
+
:root {
|
|
20
|
+
color-scheme: light;
|
|
21
|
+
--space-3xs: 2px; --space-2xs: 4px; --space-xs: 8px; --space-sm: 12px; --space-md: 16px; --space-lg: 24px; --space-xl: 40px; --space-2xl: 64px; --space-3xl: 96px; --space-4xl: 144px;
|
|
22
|
+
--text-xs: 0.8125rem; --text-sm: 0.875rem; --text-md: 1rem; --text-lg: 1.25rem; --text-xl: 1.5625rem; --text-2xl: 1.953rem; --text-3xl: 2.441rem;
|
|
23
|
+
--text-display-s: clamp(2.25rem, 4vw + 0.5rem, 3.75rem); --text-display: clamp(2.75rem, 5vw + 1rem, 5.25rem);
|
|
24
|
+
--text-section: clamp(2rem, 2.5vw + 1rem, 3.5rem); --text-title: clamp(1.25rem, 0.75vw + 0.875rem, 1.625rem); --text-lead: clamp(1.125rem, 0.35vw + 1rem, 1.375rem);
|
|
25
|
+
--ease-out: cubic-bezier(0.16, 1, 0.3, 1); --ease-in: cubic-bezier(0.7, 0, 0.84, 0); --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
|
|
26
|
+
--dur-micro: 120ms; --dur-short: 220ms; --dur-long: 420ms;
|
|
27
|
+
--color-error: oklch(52% 0.19 27); --color-success: oklch(50% 0.12 150);
|
|
28
|
+
--container: 1440px; --gutter: 64px; --gap-columns: 32px; --section-gap-s: 120px; --section-gap: 144px; --section-gap-l: 176px;
|
|
29
|
+
--z-base: 1; --z-raised: 10; --z-dropdown: 100; --z-sticky: 200; --z-sticky-nav: 300; --z-modal: 400; --z-toast: 500; --z-tooltip: 600;
|
|
30
|
+
--color-paper: oklch(93% 0.025 80); --color-paper-2: oklch(89% 0.03 78); --color-paper-3: oklch(85% 0.032 76);
|
|
31
|
+
--color-ink: oklch(22% 0.02 60); --color-ink-2: oklch(30% 0.02 60); --color-muted: oklch(46% 0.02 65);
|
|
32
|
+
--color-rule: oklch(74% 0.03 75);
|
|
33
|
+
--color-accent: oklch(42% 0.16 275); --color-accent-deep: oklch(34% 0.15 275); --color-accent-ink: oklch(94% 0.02 80);
|
|
34
|
+
--color-focus: oklch(50% 0.17 275); --color-field: var(--color-accent);
|
|
35
|
+
--font-display: "Grenze Gotisch", ui-serif, Georgia, serif; --font-body: "Hanken Grotesk", ui-sans-serif, sans-serif;
|
|
36
|
+
--font-outlier: "IBM Plex Mono", ui-monospace, monospace;
|
|
37
|
+
--radius-card: 2px; --radius-pill: 2px; --rule-hair: 1px; --shadow-card: none;
|
|
38
|
+
--tracking-display: -0.01em; --fibre: 0.5;
|
|
39
|
+
}
|
|
40
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
41
|
+
html, body { overflow-x: clip; }
|
|
42
|
+
html { scrollbar-color: var(--color-muted) var(--color-paper); scroll-padding-top: var(--space-3xl); }
|
|
43
|
+
body { margin: 0; background: var(--color-paper); color: var(--color-ink); font-family: var(--font-body); font-size: var(--text-md); line-height: 1.55; -webkit-font-smoothing: antialiased; caret-color: var(--color-accent); }
|
|
44
|
+
::selection { background: color-mix(in oklab, var(--color-accent) 22%, transparent); color: var(--color-ink); }
|
|
45
|
+
:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; }
|
|
46
|
+
a { color: inherit; text-decoration-thickness: 1px; text-underline-offset: 0.16em; }
|
|
47
|
+
h1, h2, h3 { margin: 0; font-family: var(--font-display); font-weight: var(--display-weight, 700); font-synthesis: none; letter-spacing: var(--tracking-display); line-height: 1.05; overflow-wrap: break-word; min-width: 0; text-wrap: balance; }
|
|
48
|
+
h1 { max-width: 20ch; font-size: var(--text-display); } h2 { max-width: 30ch; font-size: var(--text-section); } h3 { max-width: 40ch; font-size: var(--text-title); line-height: 1.2; }
|
|
49
|
+
.lead { font-size: var(--text-lead); line-height: 1.45; max-width: 52ch; }
|
|
50
|
+
p { margin: 0; text-wrap: pretty; }
|
|
51
|
+
p:not([class]) { max-width: 65ch; }
|
|
52
|
+
img, video { max-width: 100%; height: auto; display: block; }
|
|
53
|
+
svg { display: block; }
|
|
54
|
+
[hidden] { display: none !important; }
|
|
55
|
+
button, input, select, textarea { font: inherit; }
|
|
56
|
+
.container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--gutter); box-sizing: border-box; }
|
|
57
|
+
.num, .figure, td.num { font-variant-numeric: tabular-nums; }
|
|
58
|
+
.visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
|
|
59
|
+
[data-slot] { position: relative; overflow: hidden; background: linear-gradient(160deg, var(--color-paper-2, var(--color-paper)), var(--color-paper-3, var(--color-paper))); }
|
|
60
|
+
[data-slot] > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 1; }
|
|
61
|
+
[data-slot]:has(> img) > :not(img):not([data-keep]) { display: none !important; }
|
|
62
|
+
@media (max-width: 60rem) { :root { --gutter: 24px; --section-gap-s: 80px; --section-gap: 96px; --section-gap-l: 120px; } }
|
|
63
|
+
@media (max-width: 40rem) { :root { --gutter: 16px; --section-gap-s: 56px; --section-gap: 72px; --section-gap-l: 96px; --gap-columns: 16px; } }
|
|
64
|
+
@media (prefers-reduced-motion: reduce) { *:not(.keep-motion), *:not(.keep-motion)::before, *:not(.keep-motion)::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } }
|
|
65
|
+
/* photographs: warm con=6 */
|
|
66
|
+
[data-slot] > img { filter: sepia(0.28) saturate(0.94) contrast(1.06); }
|
|
67
|
+
:root {
|
|
68
|
+
--mast-h: 80px;
|
|
69
|
+
--plate-w: 37rem;
|
|
70
|
+
--color-field: var(--color-accent);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* The fibre wash: long tan fibres, stitched so they never tile (texture.md, the low-frequency wash) */
|
|
74
|
+
.fibre { position: relative; isolation: isolate; }
|
|
75
|
+
.fibre::before { content: ""; position: absolute; inset: 0; z-index: -1; opacity: var(--fibre); mix-blend-mode: multiply; pointer-events: none;
|
|
76
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='400'%3E%3Cfilter id='p' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.004 0.02' numOctaves='4' seed='4' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.62 0 0 0 0 0.52 0 0 0 0 0.36 0 0 0 0.3 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23p)'/%3E%3C/svg%3E"); }
|
|
77
|
+
|
|
78
|
+
/* Type */
|
|
79
|
+
h1, h2 { font-weight: 600; line-height: 0.92; color: var(--color-ink); }
|
|
80
|
+
h3 { font-family: var(--font-body); font-weight: 600; }
|
|
81
|
+
.lead { color: var(--color-ink-2); }
|
|
82
|
+
|
|
83
|
+
/* Controls */
|
|
84
|
+
.btn { display: inline-flex; align-items: center; justify-content: center; min-height: 48px; padding: 0 var(--space-lg); border: var(--rule-hair) solid var(--color-ink); border-radius: var(--radius-card); background: transparent; color: var(--color-ink); font: 500 var(--text-md)/1 var(--font-body); text-decoration: none; white-space: nowrap; cursor: pointer;
|
|
85
|
+
transition: background-color var(--dur-micro) var(--ease-out), border-color var(--dur-micro) var(--ease-out), color var(--dur-micro) var(--ease-out); }
|
|
86
|
+
.btn:hover { background: var(--color-paper-2); }
|
|
87
|
+
.btn:active { transform: translateY(1px); }
|
|
88
|
+
.btn:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; }
|
|
89
|
+
.btn:disabled, .btn[aria-disabled="true"] { opacity: 0.55; cursor: not-allowed; transform: none; }
|
|
90
|
+
.btn--primary { background: var(--color-accent); border-color: var(--color-accent); color: var(--color-accent-ink); }
|
|
91
|
+
.btn--primary:hover { background: var(--color-accent-deep); border-color: var(--color-accent-deep); }
|
|
92
|
+
|
|
93
|
+
.skip { position: absolute; left: var(--space-md); top: calc(-1 * var(--space-3xl)); z-index: var(--z-toast); padding: var(--space-xs) var(--space-md); background: var(--color-ink); color: var(--color-paper); }
|
|
94
|
+
.skip:focus-visible { top: var(--space-md); }
|
|
95
|
+
|
|
96
|
+
/* Masthead */
|
|
97
|
+
.mast__bar { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; min-height: calc(var(--mast-h) - 4px); border-bottom: 4px double var(--color-ink); }
|
|
98
|
+
.wordmark { font: 600 2rem/1 var(--font-display); letter-spacing: var(--tracking-display); color: var(--color-ink); text-decoration: none; white-space: nowrap; padding-block: var(--space-sm); }
|
|
99
|
+
.mast__link { justify-self: start; font: 600 var(--text-sm)/1 var(--font-body); color: var(--color-ink); padding-block: var(--space-sm); text-decoration: underline 1px; text-decoration-color: transparent; text-underline-offset: 0.3em;
|
|
100
|
+
transition: text-decoration-color var(--dur-short) var(--ease-out), color var(--dur-micro) var(--ease-out); }
|
|
101
|
+
.mast__link--end { justify-self: end; }
|
|
102
|
+
.mast__link:hover { text-decoration-color: var(--color-accent); color: var(--color-accent); }
|
|
103
|
+
.wordmark:focus-visible, .mast__link:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 4px; }
|
|
104
|
+
|
|
105
|
+
/* Hero: the roast, full-bleed, under a parchment plate */
|
|
106
|
+
.hero { position: relative; height: calc(100dvh - var(--mast-h)); min-height: 36rem; overflow: hidden; background: var(--color-ink); color: var(--color-paper); }
|
|
107
|
+
.hero__photo { position: absolute; inset: 0; margin: 0; }
|
|
108
|
+
.hero__photo > img { object-position: 50% 62%; }
|
|
109
|
+
.hero__inner { position: relative; z-index: var(--z-raised); height: 100%; display: flex; align-items: flex-end; justify-content: flex-end; padding-bottom: var(--space-2xl); box-sizing: border-box; }
|
|
110
|
+
.plate { width: min(100%, var(--plate-w)); box-sizing: border-box; padding: var(--space-xl); background: var(--color-paper); color: var(--color-ink); border-top: 4px double var(--color-ink); border-radius: var(--radius-card); }
|
|
111
|
+
.plate h1 { font-size: var(--text-display); max-width: 16ch; }
|
|
112
|
+
.plate .lead { margin-top: var(--space-lg); max-width: 30ch; }
|
|
113
|
+
.actions { display: flex; flex-wrap: wrap; gap: var(--space-sm); margin-top: var(--space-xl); }
|
|
114
|
+
|
|
115
|
+
@media (max-width: 60rem) {
|
|
116
|
+
.hero { height: auto; min-height: 0; background: none; color: var(--color-ink); overflow: visible; }
|
|
117
|
+
.hero__photo { position: relative; aspect-ratio: 4 / 3; }
|
|
118
|
+
.hero__inner { height: auto; padding-bottom: 0; }
|
|
119
|
+
.plate { width: 100%; padding: var(--space-xl) 0 0; background: none; border-top: 0; }
|
|
120
|
+
.plate.fibre::before { display: none; }
|
|
121
|
+
.wordmark { font-size: 1.875rem; }
|
|
122
|
+
}
|
|
123
|
+
@media (max-width: 40rem) {
|
|
124
|
+
.mast__bar { grid-template-columns: auto; justify-items: center; row-gap: var(--space-2xs); padding-block: var(--space-xs); }
|
|
125
|
+
.mast__link { display: none; }
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Shared section grid: one container, twelve columns, one column gap */
|
|
129
|
+
.split { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--gap-columns); }
|
|
130
|
+
.band { background: var(--color-paper-2); padding-block: var(--section-gap-s); }
|
|
131
|
+
.photo { margin: 0; border-radius: var(--radius-card); }
|
|
132
|
+
.photo > img { outline: var(--rule-hair) solid var(--color-rule); outline-offset: -1px; }
|
|
133
|
+
figcaption { margin-top: var(--space-sm); font: 500 var(--text-sm)/1.4 var(--font-body); color: var(--color-muted); }
|
|
134
|
+
|
|
135
|
+
/* The day book: the house's ledger on the fibre band, the entries kept in the hand of the wordmark */
|
|
136
|
+
.ledger__grid { align-items: start; }
|
|
137
|
+
.ledger__text { grid-column: 1 / span 4; position: sticky; top: var(--space-2xl); }
|
|
138
|
+
.ledger__text h2 { font-size: var(--text-display); max-width: 9ch; }
|
|
139
|
+
.ledger .lead { margin-top: var(--space-lg); max-width: 22ch; }
|
|
140
|
+
.ledger__book { grid-column: 6 / span 7; }
|
|
141
|
+
.book { width: 100%; border-collapse: collapse; font-size: var(--text-lg); line-height: 1.35; }
|
|
142
|
+
.book thead th { padding: 0 0 var(--space-sm); border-bottom: 4px double var(--color-ink); font: 500 var(--text-sm)/1.3 var(--font-body); color: var(--color-muted); text-align: left; }
|
|
143
|
+
.book td, .book tbody th { padding: var(--space-lg) 0; border-top: var(--rule-hair) solid var(--color-rule); vertical-align: baseline; }
|
|
144
|
+
.book tbody tr:first-child > * { border-top: 0; }
|
|
145
|
+
.book tbody tr:last-child > * { border-bottom: var(--rule-hair) solid var(--color-ink); }
|
|
146
|
+
.book tbody th { font-weight: 500; text-align: left; color: var(--color-ink); }
|
|
147
|
+
.book .idx { width: 3.5rem; font-weight: 600; color: var(--color-accent); }
|
|
148
|
+
.book .r, .book thead th.r { text-align: right; }
|
|
149
|
+
.book td.r { font: 600 var(--text-2xl)/1 var(--font-display); letter-spacing: var(--tracking-display); color: var(--color-ink); }
|
|
150
|
+
.book td.r .unit { font: 500 var(--text-md)/1 var(--font-body); color: var(--color-ink-2); }
|
|
151
|
+
.book .num { font-variant-numeric: lining-nums tabular-nums; }
|
|
152
|
+
|
|
153
|
+
/* The cup: one wide frame, then a pair, each with its fact */
|
|
154
|
+
.cup { padding-top: var(--section-gap-l); }
|
|
155
|
+
.cup__head { align-items: end; }
|
|
156
|
+
.cup__head h2 { grid-column: 1 / span 6; }
|
|
157
|
+
.cup__head .lead { grid-column: 8 / span 5; }
|
|
158
|
+
.cup__pair { margin-top: var(--space-2xl); }
|
|
159
|
+
.cup__pair > figure { margin: 0; }
|
|
160
|
+
.cup__note { grid-column: 1 / span 7; }
|
|
161
|
+
.cup__cup { grid-column: 8 / span 5; }
|
|
162
|
+
.cup__pair .photo { height: 34rem; }
|
|
163
|
+
|
|
164
|
+
/* The order, on the one pigment field */
|
|
165
|
+
.order-band { margin-top: var(--section-gap-s); padding-block: var(--section-gap-s); background: var(--color-field); color: var(--color-accent-ink); }
|
|
166
|
+
.order-band h2 { color: var(--color-accent-ink); }
|
|
167
|
+
.order-band .lead { margin-top: var(--space-md); color: var(--color-accent-ink); }
|
|
168
|
+
.order-band :focus-visible { outline-color: var(--color-accent-ink); }
|
|
169
|
+
.order { align-items: center; }
|
|
170
|
+
.order__text { grid-column: 1 / span 6; }
|
|
171
|
+
.order__fields { grid-column: 8 / span 5; display: grid; gap: var(--space-lg); }
|
|
172
|
+
.seg { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-xs); margin: var(--space-xl) 0 0; padding: 0; border: 0; }
|
|
173
|
+
.field label { font: 500 var(--text-sm)/1.3 var(--font-body); color: var(--color-accent-ink); }
|
|
174
|
+
.seg input { position: absolute; width: 1px; height: 1px; opacity: 0; }
|
|
175
|
+
.seg label { display: flex; align-items: center; justify-content: center; min-height: 52px; padding: 0 var(--space-md); border: var(--rule-hair) solid var(--color-accent-ink); border-radius: var(--radius-card); font-weight: 500; cursor: pointer;
|
|
176
|
+
transition: background-color var(--dur-micro) var(--ease-out), color var(--dur-micro) var(--ease-out); }
|
|
177
|
+
.seg label:hover { background: var(--color-accent-deep); }
|
|
178
|
+
.seg input:checked + label { background: var(--color-accent-ink); color: var(--color-accent); }
|
|
179
|
+
.seg input:focus-visible + label { outline: 2px solid var(--color-accent-ink); outline-offset: 2px; }
|
|
180
|
+
.field { display: grid; gap: var(--space-xs); }
|
|
181
|
+
.field input { min-height: 48px; padding: 0 var(--space-md); border: var(--rule-hair) solid var(--color-accent-ink); border-radius: var(--radius-card); background: var(--color-paper); color: var(--color-ink); outline: 2px solid transparent; outline-offset: 2px; }
|
|
182
|
+
.field input:focus-visible { outline-color: var(--color-accent-ink); }
|
|
183
|
+
.field input[aria-invalid] { border-color: var(--color-error); box-shadow: inset 0 0 0 1px var(--color-error); }
|
|
184
|
+
.field input:disabled { opacity: 0.55; cursor: not-allowed; }
|
|
185
|
+
.btn--on-field { width: 100%; background: var(--color-accent-ink); border-color: var(--color-accent-ink); color: var(--color-accent); }
|
|
186
|
+
.btn--on-field:hover { background: var(--color-paper-2); border-color: var(--color-paper-2); }
|
|
187
|
+
.help { min-height: 1lh; font-size: var(--text-sm); color: var(--color-accent-ink); }
|
|
188
|
+
|
|
189
|
+
/* The letter close */
|
|
190
|
+
.letter { padding-block: var(--space-3xl) var(--space-2xl); }
|
|
191
|
+
.letter__inner { padding-top: var(--space-2xl); border-top: var(--rule-hair) solid var(--color-ink); }
|
|
192
|
+
.letter__sign { font-size: var(--text-lead); color: var(--color-ink-2); }
|
|
193
|
+
.letter__name { margin-top: var(--space-xs); font: 600 var(--text-display-s)/0.92 var(--font-display); letter-spacing: var(--tracking-display); color: var(--color-ink); }
|
|
194
|
+
.letter__foot { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; gap: var(--space-md) var(--space-xl); margin-top: var(--space-2xl); }
|
|
195
|
+
.letter__nav { display: flex; flex-wrap: wrap; gap: var(--space-lg); }
|
|
196
|
+
.letter__nav a { font-size: var(--text-sm); color: var(--color-ink); text-decoration-color: var(--color-rule); text-underline-offset: 0.25em; transition: text-decoration-color var(--dur-short) var(--ease-out); }
|
|
197
|
+
.letter__nav a:hover { text-decoration-color: var(--color-accent); }
|
|
198
|
+
.letter__nav a:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; }
|
|
199
|
+
.legal { font-size: var(--text-sm); color: var(--color-muted); }
|
|
200
|
+
.letter__credit { flex: 1 0 100%; max-width: 88ch; font-size: var(--text-sm); line-height: 1.6; color: var(--color-muted); }
|
|
201
|
+
.letter__credit a { color: inherit; text-decoration-color: var(--color-rule); text-underline-offset: 0.25em; }
|
|
202
|
+
.letter__credit a:hover { color: var(--color-ink); text-decoration-color: var(--color-accent); }
|
|
203
|
+
|
|
204
|
+
@media (max-width: 60rem) {
|
|
205
|
+
.ledger__text, .ledger__book, .cup__head h2, .cup__head .lead, .cup__note, .cup__cup, .order__text, .order__fields { grid-column: 1 / -1; }
|
|
206
|
+
.ledger__text { position: static; }
|
|
207
|
+
.ledger__book { margin-top: var(--space-2xl); }
|
|
208
|
+
.book td.r { font-size: var(--text-xl); }
|
|
209
|
+
.cup__head .lead { margin-top: var(--space-md); }
|
|
210
|
+
.cup__pair { row-gap: var(--space-xl); }
|
|
211
|
+
.cup__pair .photo { height: auto; aspect-ratio: 4 / 3; }
|
|
212
|
+
.order__fields { margin-top: var(--space-xl); }
|
|
213
|
+
}
|
|
214
|
+
@media (max-width: 40rem) {
|
|
215
|
+
.book { font-size: var(--text-md); }
|
|
216
|
+
.book .idx { width: 2rem; }
|
|
217
|
+
}
|
|
218
|
+
</style>
|
|
219
|
+
<script>document.documentElement.classList.add('js');</script>
|
|
220
|
+
</head>
|
|
221
|
+
<body id="top">
|
|
222
|
+
<a class="skip" href="#main">Skip to content</a>
|
|
223
|
+
|
|
224
|
+
<header class="mast">
|
|
225
|
+
<div class="container mast__bar">
|
|
226
|
+
<a class="mast__link" href="#daybook">The day book</a>
|
|
227
|
+
<a class="wordmark" href="#top" aria-label="Fenwick and Daughters, back to the top">Fenwick and Daughters</a>
|
|
228
|
+
<a class="mast__link mast__link--end" href="#order">Order</a>
|
|
229
|
+
</div>
|
|
230
|
+
</header>
|
|
231
|
+
|
|
232
|
+
<main id="main">
|
|
233
|
+
<section class="hero" aria-labelledby="hero-h">
|
|
234
|
+
<figure class="hero__photo" data-slot="roaster" data-alt="The York roaster at work, a fresh roast tipping into the cooling tray">
|
|
235
|
+
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Cooling_time_for_coffee.jpg/1280px-Cooling_time_for_coffee.jpg" width="1920" height="1348" fetchpriority="high"
|
|
236
|
+
alt="A fresh roast swept round the cooling tray by its paddle arm" style="object-position: 50% 55%">
|
|
237
|
+
</figure>
|
|
238
|
+
<div class="container hero__inner">
|
|
239
|
+
<div class="plate fibre">
|
|
240
|
+
<h1 id="hero-h">Roasted in York<br> since 1921</h1>
|
|
241
|
+
<p class="lead">Six coffees a week, sold by the bag or by subscription.</p>
|
|
242
|
+
<div class="actions">
|
|
243
|
+
<a class="btn btn--primary" href="#order" data-kind="subscription">Start a subscription</a>
|
|
244
|
+
<a class="btn" href="#order" data-kind="bag">Buy a bag</a>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
</section>
|
|
249
|
+
|
|
250
|
+
<section class="ledger band fibre" id="daybook" aria-labelledby="ledger-h">
|
|
251
|
+
<div class="container split ledger__grid">
|
|
252
|
+
<div class="ledger__text">
|
|
253
|
+
<h2 id="ledger-h">Written in the day book</h2>
|
|
254
|
+
<p class="lead">Five lines the roastery keeps to.</p>
|
|
255
|
+
</div>
|
|
256
|
+
<div class="ledger__book">
|
|
257
|
+
<table class="book">
|
|
258
|
+
<thead>
|
|
259
|
+
<tr><th scope="col">No.</th><th scope="col">Entry</th><th scope="col" class="r">Kept</th></tr>
|
|
260
|
+
</thead>
|
|
261
|
+
<tbody>
|
|
262
|
+
<tr><td class="idx">1</td><th scope="row">Coffees roasted each week</th><td class="r"><span class="num">6</span></td></tr>
|
|
263
|
+
<tr><td class="idx">2</td><th scope="row">Weight of each bag</th><td class="r"><span class="num">250</span> <span class="unit">g</span></td></tr>
|
|
264
|
+
<tr><td class="idx">3</td><th scope="row">Ways to buy</th><td class="r">By the bag, or by subscription</td></tr>
|
|
265
|
+
<tr><td class="idx">4</td><th scope="row">Roastery</th><td class="r">York</td></tr>
|
|
266
|
+
<tr><td class="idx">5</td><th scope="row">Roasting since</th><td class="r"><span class="num">1921</span></td></tr>
|
|
267
|
+
</tbody>
|
|
268
|
+
</table>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
</section>
|
|
272
|
+
|
|
273
|
+
<section class="cup" id="cup" aria-labelledby="cup-h">
|
|
274
|
+
<div class="container">
|
|
275
|
+
<div class="split cup__head">
|
|
276
|
+
<h2 id="cup-h">From a York drum to your kettle</h2>
|
|
277
|
+
<p class="lead">Fenwick and Daughters roasts the coffee. The cup is yours to make.</p>
|
|
278
|
+
</div>
|
|
279
|
+
<div class="split cup__pair">
|
|
280
|
+
<figure class="cup__note">
|
|
281
|
+
<div class="photo" data-slot="desk" data-alt="The York roaster between roasts, the drum over its cooling tray">
|
|
282
|
+
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Coffee_roasting_machine%2C_The_Roastery%2C_Coaltown_Coffee%2C_Ammanford%2C_Wales.jpg/1280px-Coffee_roasting_machine%2C_The_Roastery%2C_Coaltown_Coffee%2C_Ammanford%2C_Wales.jpg" width="1920" height="2560" loading="lazy"
|
|
283
|
+
alt="A drum coffee roaster above its copper cooling tray in a roastery" style="object-position: 50% 69%">
|
|
284
|
+
</div>
|
|
285
|
+
<figcaption>Six coffees a week</figcaption>
|
|
286
|
+
</figure>
|
|
287
|
+
<figure class="cup__cup">
|
|
288
|
+
<div class="photo" data-slot="cup" data-alt="A cup of Fenwick and Daughters coffee on the shop counter">
|
|
289
|
+
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Espresso_coffee_pouring_from_retro_espresso_machine.jpg/1280px-Espresso_coffee_pouring_from_retro_espresso_machine.jpg" width="1920" height="2876" loading="lazy"
|
|
290
|
+
alt="Espresso streaming from a chrome machine into two glass cups" style="object-position: 50% 62%">
|
|
291
|
+
</div>
|
|
292
|
+
<figcaption>Sold in 250 g bags</figcaption>
|
|
293
|
+
</figure>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
</section>
|
|
297
|
+
|
|
298
|
+
<section class="order-band" id="order" aria-labelledby="order-h">
|
|
299
|
+
<div class="container">
|
|
300
|
+
<form class="split order" data-endpoint="" novalidate>
|
|
301
|
+
<div class="order__text">
|
|
302
|
+
<h2 id="order-h">250 g bags, or a subscription</h2>
|
|
303
|
+
<p class="lead">Tell the roastery which you would like, and where to reach you.</p>
|
|
304
|
+
<fieldset class="seg">
|
|
305
|
+
<legend class="visually-hidden">How would you like it?</legend>
|
|
306
|
+
<input type="radio" name="kind" id="kind-bag" value="bag" checked><label for="kind-bag">One 250 g bag</label>
|
|
307
|
+
<input type="radio" name="kind" id="kind-sub" value="subscription"><label for="kind-sub">A subscription</label>
|
|
308
|
+
</fieldset>
|
|
309
|
+
</div>
|
|
310
|
+
<div class="order__fields">
|
|
311
|
+
<div class="field">
|
|
312
|
+
<label for="order-name">Full name</label>
|
|
313
|
+
<input id="order-name" name="name" type="text" autocomplete="name" required>
|
|
314
|
+
</div>
|
|
315
|
+
<div class="field">
|
|
316
|
+
<label for="order-email">Email address</label>
|
|
317
|
+
<input id="order-email" name="email" type="email" autocomplete="email" inputmode="email" required>
|
|
318
|
+
</div>
|
|
319
|
+
<button class="btn btn--on-field" type="submit">Send the order</button>
|
|
320
|
+
<p class="help" id="order-help" aria-live="polite"></p>
|
|
321
|
+
</div>
|
|
322
|
+
</form>
|
|
323
|
+
</div>
|
|
324
|
+
</section>
|
|
325
|
+
</main>
|
|
326
|
+
|
|
327
|
+
<footer class="letter">
|
|
328
|
+
<div class="container letter__inner">
|
|
329
|
+
<p class="letter__sign">With thanks from the roastery,</p>
|
|
330
|
+
<p class="letter__name">Fenwick and Daughters</p>
|
|
331
|
+
<div class="letter__foot">
|
|
332
|
+
<nav class="letter__nav" aria-label="Footer">
|
|
333
|
+
<a href="#daybook">The day book</a>
|
|
334
|
+
<a href="#cup">The cup</a>
|
|
335
|
+
<a href="#order">Order</a>
|
|
336
|
+
</nav>
|
|
337
|
+
<p class="legal">© 2026 Fenwick and Daughters</p>
|
|
338
|
+
<p class="letter__credit" data-credits>Photographs: <a href="https://commons.wikimedia.org/wiki/File:Cooling_time_for_coffee.jpg">Jameswasswa</a> (CC BY-SA 4.0), <a href="https://commons.wikimedia.org/wiki/File:Coffee_roasting_machine,_The_Roastery,_Coaltown_Coffee,_Ammanford,_Wales.jpg">Vouliagmeni</a> (CC BY-SA 4.0), <a href="https://commons.wikimedia.org/wiki/File:Espresso_coffee_pouring_from_retro_espresso_machine.jpg">Shixart1985</a> (CC BY 2.0), all on Wikimedia Commons.</p>
|
|
339
|
+
</div>
|
|
340
|
+
</div>
|
|
341
|
+
</footer>
|
|
342
|
+
|
|
343
|
+
<script>
|
|
344
|
+
window.hallmarkSlots = (m) => { for (const [k, v] of Object.entries(m)) { const s = document.querySelector(`[data-slot="${k}"]`); if (!s) continue; const im = new Image(); im.src = typeof v === 'string' ? v : v.src; im.alt = (typeof v === 'object' && v.alt) || s.dataset.alt || ''; s.querySelectorAll(':scope > img').forEach((o) => o.remove()); s.prepend(im); } };
|
|
345
|
+
document.querySelectorAll('[data-slot] > img').forEach((i) => { if (i.complete && !i.naturalWidth) i.remove(); else i.addEventListener('error', () => i.remove(), { once: true }); });
|
|
346
|
+
document.querySelectorAll('[data-kind]').forEach((a) => a.addEventListener('click', () => { const r = document.getElementById(a.dataset.kind === 'subscription' ? 'kind-sub' : 'kind-bag'); if (r) r.checked = true; }));
|
|
347
|
+
document.querySelectorAll('form[data-endpoint]').forEach((form) => {
|
|
348
|
+
const help = form.querySelector('[aria-live]');
|
|
349
|
+
const fields = [...form.querySelectorAll('input[required]')];
|
|
350
|
+
form.addEventListener('submit', (e) => {
|
|
351
|
+
e.preventDefault();
|
|
352
|
+
const bad = fields.filter((i) => !i.checkValidity());
|
|
353
|
+
fields.forEach((i) => { i.toggleAttribute('aria-invalid', bad.includes(i)); if (bad.includes(i)) i.setAttribute('aria-describedby', help.id); else i.removeAttribute('aria-describedby'); });
|
|
354
|
+
if (bad.length) { help.textContent = bad[0].type === 'email' ? 'That email address looks incomplete. Write it as name@example.com.' : 'Add your name, so the roastery knows who the coffee is for.'; bad[0].focus(); return; }
|
|
355
|
+
if (!form.dataset.endpoint) { help.textContent = 'Nothing was sent: this form is not connected yet.'; return; }
|
|
356
|
+
fetch(form.dataset.endpoint, { method: 'POST', body: new FormData(form) })
|
|
357
|
+
.then((r) => { help.textContent = r.ok ? 'The roastery has your order and will write to ' + form.elements.email.value.trim() + '.' : 'That did not go through. Try again in a minute.'; })
|
|
358
|
+
.catch(() => { help.textContent = 'That did not go through. Try again in a minute.'; });
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
</script>
|
|
362
|
+
</body>
|
|
363
|
+
</html>
|