opencode-skills-collection 3.1.0 → 3.1.1
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/bundled-skills/.antigravity-install-manifest.json +84 -1
- package/bundled-skills/android-ui-journey-testing/SKILL.md +191 -0
- package/bundled-skills/ask-matt/SKILL.md +92 -0
- package/bundled-skills/bugs-are-annoying/SKILL.md +137 -0
- package/bundled-skills/codebase-design/DEEPENING.md +37 -0
- package/bundled-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/bundled-skills/codebase-design/SKILL.md +145 -0
- package/bundled-skills/competitor-analysis/LICENSE.txt +21 -0
- package/bundled-skills/competitor-analysis/SKILL.md +434 -0
- package/bundled-skills/competitor-analysis/references/battle-card-subagent.md +127 -0
- package/bundled-skills/competitor-analysis/references/battle-card.md +91 -0
- package/bundled-skills/competitor-analysis/references/example-research.md +130 -0
- package/bundled-skills/competitor-analysis/references/report-template.html +127 -0
- package/bundled-skills/competitor-analysis/references/research-patterns.md +217 -0
- package/bundled-skills/competitor-analysis/references/workflow.md +434 -0
- package/bundled-skills/competitor-analysis/scripts/capture_screenshots.mjs +142 -0
- package/bundled-skills/competitor-analysis/scripts/compile_report.mjs +929 -0
- package/bundled-skills/competitor-analysis/scripts/extract_vs_names.mjs +140 -0
- package/bundled-skills/competitor-analysis/scripts/gate_candidates.mjs +194 -0
- package/bundled-skills/competitor-analysis/scripts/list_urls.mjs +90 -0
- package/bundled-skills/competitor-analysis/scripts/md_utils.mjs +50 -0
- package/bundled-skills/competitor-analysis/scripts/merge_partials.mjs +291 -0
- package/bundled-skills/competitor-analysis/scripts/package.json +6 -0
- package/bundled-skills/design-it/3d-ui/SKILL.md +259 -0
- package/bundled-skills/design-it/SKILL.md +170 -0
- package/bundled-skills/design-it/ai-native-ui/SKILL.md +295 -0
- package/bundled-skills/design-it/aurora-ui/SKILL.md +307 -0
- package/bundled-skills/design-it/bento-ui/SKILL.md +314 -0
- package/bundled-skills/design-it/brutalism/SKILL.md +270 -0
- package/bundled-skills/design-it/brutalist-typography/SKILL.md +287 -0
- package/bundled-skills/design-it/card-based-design/SKILL.md +262 -0
- package/bundled-skills/design-it/claymorphism/SKILL.md +287 -0
- package/bundled-skills/design-it/color-blocking/SKILL.md +278 -0
- package/bundled-skills/design-it/command-center-ui/SKILL.md +345 -0
- package/bundled-skills/design-it/cyber-y2k/SKILL.md +312 -0
- package/bundled-skills/design-it/cyberpunk-ui/SKILL.md +262 -0
- package/bundled-skills/design-it/dark-mode/SKILL.md +289 -0
- package/bundled-skills/design-it/dashboard-design/SKILL.md +331 -0
- package/bundled-skills/design-it/data-dense-design/SKILL.md +322 -0
- package/bundled-skills/design-it/duotone-design/SKILL.md +248 -0
- package/bundled-skills/design-it/editorial-design/SKILL.md +328 -0
- package/bundled-skills/design-it/flat-design/SKILL.md +221 -0
- package/bundled-skills/design-it/flat-design-2/SKILL.md +240 -0
- package/bundled-skills/design-it/floating-ui/SKILL.md +299 -0
- package/bundled-skills/design-it/frutiger-aero/SKILL.md +274 -0
- package/bundled-skills/design-it/glassmorphism/SKILL.md +272 -0
- package/bundled-skills/design-it/gradient-design/SKILL.md +309 -0
- package/bundled-skills/design-it/high-contrast/SKILL.md +288 -0
- package/bundled-skills/design-it/holographic-ui/SKILL.md +310 -0
- package/bundled-skills/design-it/isometric-design/SKILL.md +228 -0
- package/bundled-skills/design-it/layered-design/SKILL.md +247 -0
- package/bundled-skills/design-it/material-design/SKILL.md +275 -0
- package/bundled-skills/design-it/maximalism/SKILL.md +297 -0
- package/bundled-skills/design-it/minimalism/SKILL.md +267 -0
- package/bundled-skills/design-it/monochromatic-ui/SKILL.md +296 -0
- package/bundled-skills/design-it/neo-brutalism/SKILL.md +270 -0
- package/bundled-skills/design-it/neumorphism/SKILL.md +248 -0
- package/bundled-skills/design-it/retro-design/SKILL.md +283 -0
- package/bundled-skills/design-it/retro-futurism/SKILL.md +259 -0
- package/bundled-skills/design-it/sci-fi-interface/SKILL.md +309 -0
- package/bundled-skills/design-it/skeuomorphism/SKILL.md +280 -0
- package/bundled-skills/design-it/soft-pastel/SKILL.md +307 -0
- package/bundled-skills/design-it/spatial-computing-ui/SKILL.md +300 -0
- package/bundled-skills/design-it/spatial-design/SKILL.md +268 -0
- package/bundled-skills/design-it/swiss-design/SKILL.md +293 -0
- package/bundled-skills/design-it/synthwave/SKILL.md +257 -0
- package/bundled-skills/design-it/tile-design/SKILL.md +297 -0
- package/bundled-skills/design-it/typography-first/SKILL.md +247 -0
- package/bundled-skills/design-it/vaporwave/SKILL.md +331 -0
- package/bundled-skills/design-it/vibrant-maximalism/SKILL.md +291 -0
- package/bundled-skills/design-it/widget-based-design/SKILL.md +274 -0
- package/bundled-skills/design-it/y2k-design/SKILL.md +268 -0
- package/bundled-skills/diagnosing-bugs/SKILL.md +165 -0
- package/bundled-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/bundled-skills/docs/contributors/skill-scoring.md +235 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/bundled-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/bundled-skills/domain-modeling/SKILL.md +105 -0
- package/bundled-skills/grill-me/SKILL.md +36 -0
- package/bundled-skills/grill-with-docs/SKILL.md +36 -0
- package/bundled-skills/grilling/SKILL.md +39 -0
- package/bundled-skills/handoff/SKILL.md +45 -0
- package/bundled-skills/image-generator/.env.example +7 -0
- package/bundled-skills/image-generator/SKILL.md +509 -0
- package/bundled-skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/bundled-skills/improve-codebase-architecture/SKILL.md +97 -0
- package/bundled-skills/learn/SKILL.md +156 -0
- package/bundled-skills/lesson-generator/SKILL.md +90 -0
- package/bundled-skills/llm-council/.env.example +7 -0
- package/bundled-skills/llm-council/SKILL.md +602 -0
- package/bundled-skills/loop-library/SKILL.md +205 -0
- package/bundled-skills/loop-library/agents/openai.yaml +4 -0
- package/bundled-skills/loop-library/references/catalog.md +270 -0
- package/bundled-skills/mailtrap-managing-contacts/SKILL.md +112 -0
- package/bundled-skills/mailtrap-sending-emails/SKILL.md +167 -0
- package/bundled-skills/mailtrap-setting-up-sending-domain/SKILL.md +77 -0
- package/bundled-skills/mailtrap-testing-with-sandbox/SKILL.md +110 -0
- package/bundled-skills/prototype/LOGIC.md +79 -0
- package/bundled-skills/prototype/SKILL.md +62 -0
- package/bundled-skills/prototype/UI.md +112 -0
- package/bundled-skills/setup-matt-pocock-skills/SKILL.md +158 -0
- package/bundled-skills/setup-matt-pocock-skills/domain.md +51 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-github.md +34 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +35 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-local.md +19 -0
- package/bundled-skills/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/bundled-skills/survey-generator/LICENSE +21 -0
- package/bundled-skills/survey-generator/SKILL.md +143 -0
- package/bundled-skills/survey-generator/build_artifact.py +208 -0
- package/bundled-skills/survey-generator/examples/agentic-engineering/research_bundle.json +1196 -0
- package/bundled-skills/survey-generator/examples/agentic-engineering/survey.html +706 -0
- package/bundled-skills/survey-generator/style_spec.json +85 -0
- package/bundled-skills/survey-generator/templates/research_bundle_template.json +69 -0
- package/bundled-skills/tdd/SKILL.md +139 -0
- package/bundled-skills/tdd/mocking.md +59 -0
- package/bundled-skills/tdd/refactoring.md +10 -0
- package/bundled-skills/tdd/tests.md +61 -0
- package/bundled-skills/teach/GLOSSARY-FORMAT.md +35 -0
- package/bundled-skills/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/bundled-skills/teach/MISSION-FORMAT.md +31 -0
- package/bundled-skills/teach/RESOURCES-FORMAT.md +32 -0
- package/bundled-skills/teach/SKILL.md +169 -0
- package/bundled-skills/to-issues/SKILL.md +115 -0
- package/bundled-skills/to-prd/SKILL.md +104 -0
- package/bundled-skills/tools-page-seo-optimizer/SKILL.md +616 -0
- package/bundled-skills/triage/AGENT-BRIEF.md +207 -0
- package/bundled-skills/triage/OUT-OF-SCOPE.md +105 -0
- package/bundled-skills/triage/SKILL.md +143 -0
- package/bundled-skills/vibecode-production-qa-validator/SKILL.md +371 -141
- package/bundled-skills/wiki-builder/SKILL.md +157 -0
- package/bundled-skills/wiki-builder/agents/openai.yaml +5 -0
- package/bundled-skills/wiki-builder/references/wiki-flavors.md +98 -0
- package/bundled-skills/wiki-builder/scripts/init_wiki.sh +105 -0
- package/bundled-skills/wiki-builder/templates/index.md +20 -0
- package/bundled-skills/wiki-builder/templates/maintenance-log.md +7 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-concept-page.md +12 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-index.md +11 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-source-page.md +12 -0
- package/bundled-skills/wiki-builder/templates/prompts/lint-wiki.md +10 -0
- package/bundled-skills/wiki-builder/templates/prompts/query-and-file.md +11 -0
- package/bundled-skills/wiki-builder/templates/sources.md +9 -0
- package/bundled-skills/wiki-builder/templates/wiki.config.md +53 -0
- package/bundled-skills/writing-great-skills/GLOSSARY.md +181 -0
- package/bundled-skills/writing-great-skills/SKILL.md +111 -0
- package/bundled-skills/yao-meta-skill/SKILL.md +86 -0
- package/bundled-skills/yao-meta-skill/agents/interface.yaml +26 -0
- package/bundled-skills/yao-meta-skill/manifest.json +24 -0
- package/bundled-skills/yao-meta-skill/references/artifact-design-doctrine.md +49 -0
- package/bundled-skills/yao-meta-skill/references/authoring-discipline.md +78 -0
- package/bundled-skills/yao-meta-skill/references/autonomous-adaptation.md +65 -0
- package/bundled-skills/yao-meta-skill/references/distribution-registry-method.md +60 -0
- package/bundled-skills/yao-meta-skill/references/eval-playbook.md +69 -0
- package/bundled-skills/yao-meta-skill/references/gate-selection.md +68 -0
- package/bundled-skills/yao-meta-skill/references/governance.md +134 -0
- package/bundled-skills/yao-meta-skill/references/human-review-template.md +54 -0
- package/bundled-skills/yao-meta-skill/references/intent-dialogue.md +138 -0
- package/bundled-skills/yao-meta-skill/references/iteration-philosophy.md +30 -0
- package/bundled-skills/yao-meta-skill/references/non-skill-decision-tree.md +39 -0
- package/bundled-skills/yao-meta-skill/references/operating-modes.md +107 -0
- package/bundled-skills/yao-meta-skill/references/output-eval-method.md +113 -0
- package/bundled-skills/yao-meta-skill/references/output-quality-risk.md +41 -0
- package/bundled-skills/yao-meta-skill/references/output-visual-quality.md +53 -0
- package/bundled-skills/yao-meta-skill/references/packaging-contracts.md +70 -0
- package/bundled-skills/yao-meta-skill/references/pattern-extraction-doctrine.md +76 -0
- package/bundled-skills/yao-meta-skill/references/platform-capability-matrix.md +49 -0
- package/bundled-skills/yao-meta-skill/references/prompt-engineering-doctrine.md +76 -0
- package/bundled-skills/yao-meta-skill/references/qa-ladder.md +57 -0
- package/bundled-skills/yao-meta-skill/references/reference-scan.md +126 -0
- package/bundled-skills/yao-meta-skill/references/regression-cause-taxonomy.md +80 -0
- package/bundled-skills/yao-meta-skill/references/resource-boundaries.md +120 -0
- package/bundled-skills/yao-meta-skill/references/review-studio-method.md +87 -0
- package/bundled-skills/yao-meta-skill/references/review-waiver-method.md +76 -0
- package/bundled-skills/yao-meta-skill/references/runtime-conformance-method.md +21 -0
- package/bundled-skills/yao-meta-skill/references/skill-archetypes.md +86 -0
- package/bundled-skills/yao-meta-skill/references/skill-atlas-method.md +35 -0
- package/bundled-skills/yao-meta-skill/references/skill-engineering-method.md +210 -0
- package/bundled-skills/yao-meta-skill/references/skill-ir-method.md +41 -0
- package/bundled-skills/yao-meta-skill/references/skillops-decision-policy.md +53 -0
- package/bundled-skills/yao-meta-skill/references/systems-thinking-doctrine.md +75 -0
- package/bundled-skills/yao-meta-skill/references/telemetry-drift-method.md +182 -0
- package/bundled-skills/yao-meta-skill/references/trust-security-method.md +79 -0
- package/bundled-skills/yao-meta-skill/references/user-memory-policy.md +35 -0
- package/bundled-skills/youtube-notetaker/SKILL.md +209 -0
- package/bundled-skills/youtube-notetaker/reference/artifact.html +269 -0
- package/bundled-skills/youtube-notetaker/scripts/contact_sheet.py +53 -0
- package/bundled-skills/youtube-notetaker/scripts/detect_slides.sh +19 -0
- package/bundled-skills/youtube-notetaker/scripts/download.sh +24 -0
- package/bundled-skills/youtube-notetaker/scripts/extract_slides.py +43 -0
- package/bundled-skills/youtube-notetaker/scripts/serve.py +173 -0
- package/bundled-skills/youtube-notetaker/scripts/setup.sh +27 -0
- package/bundled-skills/youtube-notetaker/scripts/verify.sh +31 -0
- package/bundled-skills/youtube-notetaker/scripts/vtt_to_transcript.py +59 -0
- package/bundled-skills/youtube-notetaker/scripts/write_library_item.py +69 -0
- package/package.json +1 -1
- package/skills_index.json +1956 -286
- package/bundled-skills/ai-md/SKILL.md +0 -523
- package/bundled-skills/atlas-contract/SKILL.md +0 -650
- package/bundled-skills/busybox-on-windows/SKILL.md +0 -40
- package/bundled-skills/monte-carlo-prevent/SKILL.md +0 -257
- package/bundled-skills/monte-carlo-prevent/references/TROUBLESHOOTING.md +0 -23
- package/bundled-skills/monte-carlo-prevent/references/parameters.md +0 -32
- package/bundled-skills/monte-carlo-prevent/references/workflows.md +0 -478
- package/bundled-skills/monte-carlo-push-ingestion/SKILL.md +0 -372
- package/bundled-skills/monte-carlo-push-ingestion/references/anomaly-detection.md +0 -87
- package/bundled-skills/monte-carlo-push-ingestion/references/custom-lineage.md +0 -203
- package/bundled-skills/monte-carlo-push-ingestion/references/direct-http-api.md +0 -207
- package/bundled-skills/monte-carlo-push-ingestion/references/prerequisites.md +0 -150
- package/bundled-skills/monte-carlo-push-ingestion/references/push-lineage.md +0 -160
- package/bundled-skills/monte-carlo-push-ingestion/references/push-metadata.md +0 -158
- package/bundled-skills/monte-carlo-push-ingestion/references/push-query-logs.md +0 -219
- package/bundled-skills/monte-carlo-push-ingestion/references/validation.md +0 -257
- package/bundled-skills/monte-carlo-push-ingestion/scripts/sample_verify.py +0 -357
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_lineage.py +0 -70
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_metadata.py +0 -65
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_query_logs.py +0 -70
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_lineage.py +0 -214
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_metadata.py +0 -160
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_query_logs.py +0 -164
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_lineage.py +0 -198
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_metadata.py +0 -193
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_query_logs.py +0 -207
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_and_push_metadata.py +0 -71
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_and_push_query_logs.py +0 -64
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_metadata.py +0 -253
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_query_logs.py +0 -149
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/push_metadata.py +0 -190
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/push_query_logs.py +0 -208
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_lineage.py +0 -83
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_metadata.py +0 -77
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_query_logs.py +0 -83
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_lineage.py +0 -240
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_metadata.py +0 -212
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_query_logs.py +0 -204
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_lineage.py +0 -192
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_metadata.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_query_logs.py +0 -200
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_lineage.py +0 -119
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_metadata.py +0 -119
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_query_logs.py +0 -117
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_lineage.py +0 -265
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_metadata.py +0 -313
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_query_logs.py +0 -284
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_lineage.py +0 -309
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_metadata.py +0 -245
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_query_logs.py +0 -255
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_lineage.py +0 -78
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_metadata.py +0 -80
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_query_logs.py +0 -88
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_lineage.py +0 -235
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_metadata.py +0 -219
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_query_logs.py +0 -239
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_lineage.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_metadata.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_query_logs.py +0 -196
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_lineage.py +0 -154
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_metadata.py +0 -137
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_query_logs.py +0 -137
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_lineage.py +0 -349
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_metadata.py +0 -329
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_query_logs.py +0 -254
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_lineage.py +0 -307
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_metadata.py +0 -228
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_query_logs.py +0 -248
- package/bundled-skills/monte-carlo-push-ingestion/scripts/test_template_sdk_usage.py +0 -340
- package/bundled-skills/skill-optimizer/SKILL.md +0 -271
- package/bundled-skills/using-superpowers/SKILL.md +0 -98
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swiss-design
|
|
3
|
+
description: Web and App implementation guide for Swiss Design (International Typographic Style). Trigger when user wants strict grid systems, strong typography, and clean, asymmetrical alignment.
|
|
4
|
+
date_added: "2026-06-17"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Swiss Design (International Typographic Style)
|
|
11
|
+
|
|
12
|
+
> "Form follows function. The grid is absolute. Typography is the primary visual element."
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
Use this sub-style when the user's request matches the aesthetic described above. This is a child reference of the `design-it` skill and is not meant to be triggered directly.
|
|
17
|
+
|
|
18
|
+
## Core Principles
|
|
19
|
+
1. **Mathematical Grids**: Everything aligns to a strict underlying grid. Asymmetry is preferred over centered text.
|
|
20
|
+
2. **Sans-Serif Typography**: Helvetica is the king, but any clean, neutral sans-serif works. Flush left, ragged right text alignment.
|
|
21
|
+
3. **Objective Photography**: If images are used, they should be objective, documentary-style photos, not stylized illustrations.
|
|
22
|
+
|
|
23
|
+
## Visual DNA
|
|
24
|
+
- **Colors**: Very limited. Usually just black, white, and ONE highly saturated accent color (often primary red, blue, or yellow). The **Industrial Chic** palette works perfectly.
|
|
25
|
+
- **Typography**: `Helvetica Neue`, `Inter`, or `Roboto`. Huge contrast in font sizes (e.g., massive 6rem headers paired with 1rem body text).
|
|
26
|
+
- **Layout**: Do NOT center text. Ever.
|
|
27
|
+
|
|
28
|
+
## Web Implementation
|
|
29
|
+
- Use CSS Grid extensively. Let columns dictate the layout.
|
|
30
|
+
- **CSS Example**:
|
|
31
|
+
```css
|
|
32
|
+
body {
|
|
33
|
+
background-color: #f4f4f4;
|
|
34
|
+
color: #111;
|
|
35
|
+
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
|
36
|
+
line-height: 1.4;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.swiss-grid {
|
|
40
|
+
display: grid;
|
|
41
|
+
grid-template-columns: repeat(12, 1fr);
|
|
42
|
+
gap: 20px;
|
|
43
|
+
padding: 40px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.swiss-header {
|
|
47
|
+
grid-column: 1 / 11; /* spans across multiple columns, leaving right side empty */
|
|
48
|
+
font-size: 6vw;
|
|
49
|
+
font-weight: 700;
|
|
50
|
+
text-transform: lowercase; /* Optional, but common in brutalist/swiss */
|
|
51
|
+
margin-bottom: 2rem;
|
|
52
|
+
line-height: 0.9;
|
|
53
|
+
letter-spacing: -0.04em;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.swiss-content {
|
|
57
|
+
grid-column: 4 / 9; /* Indented alignment */
|
|
58
|
+
font-size: 1.25rem;
|
|
59
|
+
text-align: left; /* Flush left, ragged right */
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.swiss-accent {
|
|
63
|
+
color: #E2001A; /* Classic Swiss Red */
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## App Implementation
|
|
68
|
+
|
|
69
|
+
### SwiftUI
|
|
70
|
+
```swift
|
|
71
|
+
struct SwissDesignView: View {
|
|
72
|
+
var body: some View {
|
|
73
|
+
ScrollView {
|
|
74
|
+
VStack(alignment: .leading, spacing: 0) {
|
|
75
|
+
// Header Block
|
|
76
|
+
VStack(alignment: .leading, spacing: 8) {
|
|
77
|
+
Text("the grid")
|
|
78
|
+
.font(.custom("Helvetica Neue", size: 60))
|
|
79
|
+
.fontWeight(.heavy)
|
|
80
|
+
.tracking(-2) // Tight letter spacing
|
|
81
|
+
Text("is absolute.")
|
|
82
|
+
.font(.custom("Helvetica Neue", size: 60))
|
|
83
|
+
.fontWeight(.heavy)
|
|
84
|
+
.tracking(-2)
|
|
85
|
+
.foregroundColor(Color(hex: "E2001A")) // Swiss Red
|
|
86
|
+
}
|
|
87
|
+
.padding(.horizontal, 24)
|
|
88
|
+
.padding(.top, 60)
|
|
89
|
+
.padding(.bottom, 40)
|
|
90
|
+
|
|
91
|
+
Divider().background(Color.black)
|
|
92
|
+
|
|
93
|
+
// Asymmetrical Content Block
|
|
94
|
+
HStack(alignment: .top, spacing: 20) {
|
|
95
|
+
// Empty left column (negative space is structural)
|
|
96
|
+
Spacer().frame(width: 40)
|
|
97
|
+
|
|
98
|
+
VStack(alignment: .leading, spacing: 16) {
|
|
99
|
+
Text("Form follows function.")
|
|
100
|
+
.font(.custom("Helvetica Neue", size: 24))
|
|
101
|
+
.fontWeight(.bold)
|
|
102
|
+
|
|
103
|
+
Text("Typography is the primary visual element. Everything aligns to a strict underlying grid. Asymmetry is preferred over centered text.")
|
|
104
|
+
.font(.custom("Helvetica Neue", size: 16))
|
|
105
|
+
.lineSpacing(6)
|
|
106
|
+
}
|
|
107
|
+
.padding(.vertical, 40)
|
|
108
|
+
.padding(.trailing, 24)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
Divider().background(Color.black)
|
|
112
|
+
}
|
|
113
|
+
.frame(maxWidth: .infinity, alignment: .leading)
|
|
114
|
+
}
|
|
115
|
+
.background(Color(white: 0.96))
|
|
116
|
+
.foregroundColor(.black)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
- Strict `alignment: .leading` everywhere. Never use `.center`.
|
|
121
|
+
- Use `Spacer().frame(width: X)` in `HStack`s to intentionally push content off the left margin, creating the classic Swiss indented asymmetrical grid.
|
|
122
|
+
|
|
123
|
+
### Flutter
|
|
124
|
+
```dart
|
|
125
|
+
class SwissDesignScreen extends StatelessWidget {
|
|
126
|
+
@override
|
|
127
|
+
Widget build(BuildContext context) {
|
|
128
|
+
return Scaffold(
|
|
129
|
+
backgroundColor: const Color(0xFFF4F4F4),
|
|
130
|
+
body: SingleChildScrollView(
|
|
131
|
+
child: Column(
|
|
132
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
133
|
+
children: [
|
|
134
|
+
const SizedBox(height: 80),
|
|
135
|
+
// Header
|
|
136
|
+
Padding(
|
|
137
|
+
padding: const EdgeInsets.symmetric(horizontal: 24.0),
|
|
138
|
+
child: Column(
|
|
139
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
140
|
+
children: const [
|
|
141
|
+
Text('the grid', style: TextStyle(fontFamily: 'Helvetica', fontSize: 60, fontWeight: FontWeight.w900, height: 0.9, letterSpacing: -2)),
|
|
142
|
+
Text('is absolute.', style: TextStyle(fontFamily: 'Helvetica', fontSize: 60, fontWeight: FontWeight.w900, height: 0.9, letterSpacing: -2, color: Color(0xFFE2001A))),
|
|
143
|
+
],
|
|
144
|
+
),
|
|
145
|
+
),
|
|
146
|
+
const SizedBox(height: 40),
|
|
147
|
+
const Divider(color: Colors.black, thickness: 1, height: 1),
|
|
148
|
+
|
|
149
|
+
// Asymmetrical Content
|
|
150
|
+
Row(
|
|
151
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
152
|
+
children: [
|
|
153
|
+
// Structural empty column
|
|
154
|
+
const SizedBox(width: 64),
|
|
155
|
+
// Content column
|
|
156
|
+
Expanded(
|
|
157
|
+
child: Padding(
|
|
158
|
+
padding: const EdgeInsets.only(top: 40.0, bottom: 40.0, right: 24.0),
|
|
159
|
+
child: Column(
|
|
160
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
161
|
+
children: const [
|
|
162
|
+
Text('Form follows function.', style: TextStyle(fontFamily: 'Helvetica', fontSize: 24, fontWeight: FontWeight.bold)),
|
|
163
|
+
SizedBox(height: 16),
|
|
164
|
+
Text('Typography is the primary visual element. Everything aligns to a strict underlying grid.', style: TextStyle(fontFamily: 'Helvetica', fontSize: 16, height: 1.4)),
|
|
165
|
+
],
|
|
166
|
+
),
|
|
167
|
+
),
|
|
168
|
+
),
|
|
169
|
+
],
|
|
170
|
+
),
|
|
171
|
+
const Divider(color: Colors.black, thickness: 1, height: 1),
|
|
172
|
+
],
|
|
173
|
+
),
|
|
174
|
+
),
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
- `CrossAxisAlignment.start` is mandatory on all Columns.
|
|
180
|
+
- Use a `Row` with a fixed `SizedBox` width on the left and an `Expanded` widget on the right to enforce the asymmetrical grid column.
|
|
181
|
+
|
|
182
|
+
### React Native
|
|
183
|
+
```jsx
|
|
184
|
+
const SwissDesignScreen = () => {
|
|
185
|
+
return (
|
|
186
|
+
<ScrollView style={{ flex: 1, backgroundColor: '#F4F4F4' }}>
|
|
187
|
+
|
|
188
|
+
{/* Header */}
|
|
189
|
+
<View style={{ paddingHorizontal: 24, paddingTop: 80, paddingBottom: 40 }}>
|
|
190
|
+
<Text style={{ fontFamily: 'HelveticaNeue-CondensedBlack', fontSize: 60, lineHeight: 60, letterSpacing: -2, color: '#111' }}>
|
|
191
|
+
the grid
|
|
192
|
+
</Text>
|
|
193
|
+
<Text style={{ fontFamily: 'HelveticaNeue-CondensedBlack', fontSize: 60, lineHeight: 60, letterSpacing: -2, color: '#E2001A' }}>
|
|
194
|
+
is absolute.
|
|
195
|
+
</Text>
|
|
196
|
+
</View>
|
|
197
|
+
|
|
198
|
+
<View style={{ height: 1, backgroundColor: '#111' }} />
|
|
199
|
+
|
|
200
|
+
{/* Asymmetrical Layout */}
|
|
201
|
+
<View style={{ flexDirection: 'row', paddingVertical: 40 }}>
|
|
202
|
+
{/* Empty left column */}
|
|
203
|
+
<View style={{ width: 64 }} />
|
|
204
|
+
|
|
205
|
+
{/* Content */}
|
|
206
|
+
<View style={{ flex: 1, paddingRight: 24 }}>
|
|
207
|
+
<Text style={{ fontFamily: 'HelveticaNeue-Bold', fontSize: 24, color: '#111', marginBottom: 16 }}>
|
|
208
|
+
Form follows function.
|
|
209
|
+
</Text>
|
|
210
|
+
<Text style={{ fontFamily: 'HelveticaNeue-Regular', fontSize: 16, lineHeight: 24, color: '#111' }}>
|
|
211
|
+
Typography is the primary visual element. Everything aligns to a strict underlying grid.
|
|
212
|
+
</Text>
|
|
213
|
+
</View>
|
|
214
|
+
</View>
|
|
215
|
+
|
|
216
|
+
<View style={{ height: 1, backgroundColor: '#111' }} />
|
|
217
|
+
|
|
218
|
+
</ScrollView>
|
|
219
|
+
);
|
|
220
|
+
};
|
|
221
|
+
```
|
|
222
|
+
- Link the Helvetica Neue font family. The contrast between `HelveticaNeue-CondensedBlack` for headers and `HelveticaNeue-Regular` for body copy defines this style.
|
|
223
|
+
- Use `flexDirection: 'row'` to build the strict column structure.
|
|
224
|
+
|
|
225
|
+
### Jetpack Compose
|
|
226
|
+
```kotlin
|
|
227
|
+
@Composable
|
|
228
|
+
fun SwissDesignScreen() {
|
|
229
|
+
Column(
|
|
230
|
+
modifier = Modifier.fillMaxSize().background(Color(0xFFF4F4F4)).verticalScroll(rememberScrollState())
|
|
231
|
+
) {
|
|
232
|
+
Spacer(Modifier.height(80.dp))
|
|
233
|
+
|
|
234
|
+
// Header
|
|
235
|
+
Column(modifier = Modifier.padding(horizontal = 24.dp, vertical = 40.dp)) {
|
|
236
|
+
Text(
|
|
237
|
+
text = "the grid",
|
|
238
|
+
fontFamily = FontFamily.SansSerif, // Replace with Helvetica
|
|
239
|
+
fontSize = 60.sp,
|
|
240
|
+
fontWeight = FontWeight.Black,
|
|
241
|
+
letterSpacing = (-2).sp,
|
|
242
|
+
lineHeight = 60.sp,
|
|
243
|
+
color = Color.Black
|
|
244
|
+
)
|
|
245
|
+
Text(
|
|
246
|
+
text = "is absolute.",
|
|
247
|
+
fontFamily = FontFamily.SansSerif,
|
|
248
|
+
fontSize = 60.sp,
|
|
249
|
+
fontWeight = FontWeight.Black,
|
|
250
|
+
letterSpacing = (-2).sp,
|
|
251
|
+
lineHeight = 60.sp,
|
|
252
|
+
color = Color(0xFFE2001A)
|
|
253
|
+
)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
Divider(color = Color.Black, thickness = 1.dp)
|
|
257
|
+
|
|
258
|
+
// Asymmetrical Grid Row
|
|
259
|
+
Row(modifier = Modifier.fillMaxWidth().padding(vertical = 40.dp)) {
|
|
260
|
+
// Empty grid column
|
|
261
|
+
Spacer(modifier = Modifier.width(64.dp))
|
|
262
|
+
|
|
263
|
+
// Content
|
|
264
|
+
Column(modifier = Modifier.weight(1f).padding(right = 24.dp)) {
|
|
265
|
+
Text(
|
|
266
|
+
text = "Form follows function.",
|
|
267
|
+
fontSize = 24.sp,
|
|
268
|
+
fontWeight = FontWeight.Bold,
|
|
269
|
+
color = Color.Black
|
|
270
|
+
)
|
|
271
|
+
Spacer(Modifier.height(16.dp))
|
|
272
|
+
Text(
|
|
273
|
+
text = "Typography is the primary visual element. Everything aligns to a strict underlying grid.",
|
|
274
|
+
fontSize = 16.sp,
|
|
275
|
+
color = Color.Black
|
|
276
|
+
)
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
Divider(color = Color.Black, thickness = 1.dp)
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
- Use `Divider(color = Color.Black, thickness = 1.dp)` to create the harsh horizontal structural rules.
|
|
285
|
+
- Combine `Row`, a fixed `Spacer` width, and a `Column` with `Modifier.weight(1f)` to enforce the asymmetrical design.
|
|
286
|
+
|
|
287
|
+
## Do's and Don'ts
|
|
288
|
+
- **DO**: Use negative space as a structural element. Empty columns are just as important as filled ones.
|
|
289
|
+
- **DON'T**: Center align text. Do not use serif fonts. Do not use drop shadows.
|
|
290
|
+
|
|
291
|
+
## Limitations
|
|
292
|
+
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
|
|
293
|
+
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: synthwave
|
|
3
|
+
description: Web and App implementation guide for Synthwave. Trigger when user wants 80s-inspired neon, dark backgrounds, outrun grids, and Miami Vice aesthetics.
|
|
4
|
+
date_added: "2026-06-17"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Synthwave (Outrun)
|
|
11
|
+
|
|
12
|
+
> "Driving a Ferrari through a neon-lit digital grid at midnight."
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
Use this sub-style when the user's request matches the aesthetic described above. This is a child reference of the `design-it` skill and is not meant to be triggered directly.
|
|
17
|
+
|
|
18
|
+
## Core Principles
|
|
19
|
+
1. **Dark Mode by Default**: Absolute pitch-black or deep purple backgrounds.
|
|
20
|
+
2. **Neon Glowing Vectors**: Bright magenta, cyan, and yellow wireframes, text, and grids. Heavy use of `box-shadow` and `text-shadow` for glow effects.
|
|
21
|
+
3. **The Perspective Grid**: The defining visual is a glowing grid that fades into a vanishing point on the horizon.
|
|
22
|
+
|
|
23
|
+
## Visual DNA
|
|
24
|
+
- **Colors**: Deep space backgrounds (`#0B0C10`, `#110022`). Glowing neon accents: Cyan (`#00FFFF`), Hot Pink (`#FF00FF`), Electric Yellow (`#FFFF00`).
|
|
25
|
+
- **Typography**: 80s chrome text, brush script (like a neon sign), and heavy italicized sans-serifs.
|
|
26
|
+
- **Shadows**: Drop shadows are not black; they are the same color as the element, heavily blurred, to create light emission.
|
|
27
|
+
|
|
28
|
+
## Web Implementation
|
|
29
|
+
- Rely on `text-shadow` for neon signs and 3D transforms for the floor grid.
|
|
30
|
+
- **CSS Example**:
|
|
31
|
+
```css
|
|
32
|
+
body {
|
|
33
|
+
background-color: #090014;
|
|
34
|
+
color: #fff;
|
|
35
|
+
font-family: 'Montserrat', sans-serif;
|
|
36
|
+
overflow-x: hidden;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Neon Text Glow */
|
|
40
|
+
.synth-neon-text {
|
|
41
|
+
font-family: 'Mr Dafoe', cursive; /* A classic 80s script */
|
|
42
|
+
font-size: 4rem;
|
|
43
|
+
color: #fff;
|
|
44
|
+
text-shadow:
|
|
45
|
+
0 0 5px #fff,
|
|
46
|
+
0 0 10px #fff,
|
|
47
|
+
0 0 20px #FF00FF,
|
|
48
|
+
0 0 40px #FF00FF,
|
|
49
|
+
0 0 80px #FF00FF;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* The Perspective Grid Floor */
|
|
53
|
+
.synth-grid {
|
|
54
|
+
position: absolute;
|
|
55
|
+
bottom: 0; left: -50%;
|
|
56
|
+
width: 200%; height: 50vh;
|
|
57
|
+
background-image:
|
|
58
|
+
linear-gradient(rgba(0, 255, 255, 0.8) 2px, transparent 2px),
|
|
59
|
+
linear-gradient(90deg, rgba(0, 255, 255, 0.8) 2px, transparent 2px);
|
|
60
|
+
background-size: 50px 50px;
|
|
61
|
+
|
|
62
|
+
/* Create the 3D horizon effect */
|
|
63
|
+
transform: perspective(500px) rotateX(60deg);
|
|
64
|
+
transform-origin: top center;
|
|
65
|
+
|
|
66
|
+
/* Fade out towards the horizon */
|
|
67
|
+
mask-image: linear-gradient(to bottom, transparent 0%, black 100%);
|
|
68
|
+
-webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 100%);
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## App Implementation
|
|
73
|
+
|
|
74
|
+
### SwiftUI
|
|
75
|
+
```swift
|
|
76
|
+
struct NeonText: View {
|
|
77
|
+
let text: String
|
|
78
|
+
|
|
79
|
+
var body: some View {
|
|
80
|
+
Text(text)
|
|
81
|
+
.font(.custom("Mr Dafoe", size: 64))
|
|
82
|
+
.foregroundColor(.white)
|
|
83
|
+
// Layering shadows to create a glowing bloom
|
|
84
|
+
.shadow(color: .white, radius: 2)
|
|
85
|
+
.shadow(color: .pink, radius: 5)
|
|
86
|
+
.shadow(color: .pink, radius: 10)
|
|
87
|
+
.shadow(color: .pink, radius: 20)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
struct SynthwaveScreen: View {
|
|
92
|
+
var body: some View {
|
|
93
|
+
ZStack {
|
|
94
|
+
Color(red: 0.03, green: 0.0, blue: 0.08).ignoresSafeArea() // #090014
|
|
95
|
+
|
|
96
|
+
VStack {
|
|
97
|
+
NeonText(text: "Outrun")
|
|
98
|
+
Spacer()
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Note: A 3D perspective grid requires SceneKit or a pre-rendered image
|
|
102
|
+
// Native SwiftUI 3D transforms apply to the view, but won't draw an infinite floor grid easily.
|
|
103
|
+
Image("synth_grid")
|
|
104
|
+
.resizable()
|
|
105
|
+
.scaledToFill()
|
|
106
|
+
.frame(height: 300)
|
|
107
|
+
.offset(y: 200)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
- Stack multiple `.shadow(color:radius:)` modifiers directly on the text to create a vibrant neon bloom effect.
|
|
113
|
+
- The 3D wireframe horizon grid is best achieved via a pre-rendered image background.
|
|
114
|
+
|
|
115
|
+
### Flutter
|
|
116
|
+
```dart
|
|
117
|
+
class NeonText extends StatelessWidget {
|
|
118
|
+
final String text;
|
|
119
|
+
const NeonText(this.text);
|
|
120
|
+
|
|
121
|
+
@override
|
|
122
|
+
Widget build(BuildContext context) {
|
|
123
|
+
return Text(
|
|
124
|
+
text,
|
|
125
|
+
style: const TextStyle(
|
|
126
|
+
fontFamily: 'Mr Dafoe', // Or any cursive 80s font
|
|
127
|
+
fontSize: 64,
|
|
128
|
+
color: Colors.white,
|
|
129
|
+
shadows: [
|
|
130
|
+
Shadow(color: Colors.white, blurRadius: 2),
|
|
131
|
+
Shadow(color: Colors.pinkAccent, blurRadius: 5),
|
|
132
|
+
Shadow(color: Colors.pinkAccent, blurRadius: 15),
|
|
133
|
+
Shadow(color: Colors.pinkAccent, blurRadius: 30),
|
|
134
|
+
],
|
|
135
|
+
),
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
class SynthwaveScreen extends StatelessWidget {
|
|
141
|
+
@override
|
|
142
|
+
Widget build(BuildContext context) {
|
|
143
|
+
return Scaffold(
|
|
144
|
+
backgroundColor: const Color(0xFF090014),
|
|
145
|
+
body: Stack(
|
|
146
|
+
children: [
|
|
147
|
+
// Background grid asset
|
|
148
|
+
Positioned(
|
|
149
|
+
bottom: 0,
|
|
150
|
+
left: 0,
|
|
151
|
+
right: 0,
|
|
152
|
+
height: 300,
|
|
153
|
+
child: Image.asset('assets/synth_grid.png', fit: BoxFit.cover),
|
|
154
|
+
),
|
|
155
|
+
// Foreground UI
|
|
156
|
+
const Center(child: NeonText('Outrun')),
|
|
157
|
+
],
|
|
158
|
+
),
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
- `TextStyle` accepts a list of `Shadow` objects. Stack them with exponentially increasing `blurRadius` values (e.g., 2, 5, 15, 30) to simulate light dispersal.
|
|
164
|
+
- Avoid rendering the perspective grid programmatically using `CustomPaint` unless you want to do the 3D math manually. Use an asset.
|
|
165
|
+
|
|
166
|
+
### React Native
|
|
167
|
+
```jsx
|
|
168
|
+
// React Native only supports ONE textShadow per Text element natively.
|
|
169
|
+
// To create a true neon glow, you must stack identical Text components.
|
|
170
|
+
|
|
171
|
+
const NeonText = ({ text }) => {
|
|
172
|
+
const baseStyle = {
|
|
173
|
+
fontFamily: 'MrDafoe',
|
|
174
|
+
fontSize: 64,
|
|
175
|
+
color: '#FFF',
|
|
176
|
+
position: 'absolute',
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
return (
|
|
180
|
+
<View style={{ alignItems: 'center', height: 80 }}>
|
|
181
|
+
{/* Outer Glow */}
|
|
182
|
+
<Text style={[baseStyle, { textShadowColor: '#FF00FF', textShadowRadius: 30 }]}>{text}</Text>
|
|
183
|
+
{/* Mid Glow */}
|
|
184
|
+
<Text style={[baseStyle, { textShadowColor: '#FF00FF', textShadowRadius: 15 }]}>{text}</Text>
|
|
185
|
+
{/* Core Glow */}
|
|
186
|
+
<Text style={[baseStyle, { textShadowColor: '#FFF', textShadowRadius: 5 }]}>{text}</Text>
|
|
187
|
+
{/* Crisp White Core */}
|
|
188
|
+
<Text style={baseStyle}>{text}</Text>
|
|
189
|
+
</View>
|
|
190
|
+
);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const SynthwaveScreen = () => (
|
|
194
|
+
<View style={{ flex: 1, backgroundColor: '#090014', justifyContent: 'center' }}>
|
|
195
|
+
<NeonText text="Outrun" />
|
|
196
|
+
|
|
197
|
+
<Image
|
|
198
|
+
source={require('./synth_grid.png')}
|
|
199
|
+
style={{ position: 'absolute', bottom: 0, width: '100%', height: 300, resizeMode: 'cover' }}
|
|
200
|
+
/>
|
|
201
|
+
</View>
|
|
202
|
+
);
|
|
203
|
+
```
|
|
204
|
+
- **React Native limitation**: You cannot pass an array of shadows to `textShadow`.
|
|
205
|
+
- **Workaround**: Render the exact same `<Text>` component 3-4 times on top of each other using `position: 'absolute'`, each with a different `textShadowRadius` to build the bloom.
|
|
206
|
+
|
|
207
|
+
### Jetpack Compose
|
|
208
|
+
```kotlin
|
|
209
|
+
@Composable
|
|
210
|
+
fun NeonText(text: String) {
|
|
211
|
+
Text(
|
|
212
|
+
text = text,
|
|
213
|
+
fontSize = 64.sp,
|
|
214
|
+
color = Color.White,
|
|
215
|
+
fontFamily = FontFamily.Cursive,
|
|
216
|
+
// Compose only supports a single Shadow natively on TextStyle
|
|
217
|
+
style = TextStyle(
|
|
218
|
+
shadow = Shadow(
|
|
219
|
+
color = Color(0xFFFF00FF),
|
|
220
|
+
offset = Offset.Zero,
|
|
221
|
+
blurRadius = 30f // Single large blur as fallback
|
|
222
|
+
)
|
|
223
|
+
),
|
|
224
|
+
// To get stacked blurs, we use Modifier.drawBehind to draw the text repeatedly
|
|
225
|
+
)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Advanced stacked glow approach
|
|
229
|
+
@Composable
|
|
230
|
+
fun AdvancedNeonText(text: String) {
|
|
231
|
+
Box(contentAlignment = Alignment.Center) {
|
|
232
|
+
// Render layers of text to build the glow
|
|
233
|
+
val blurs = listOf(30f, 15f, 5f)
|
|
234
|
+
blurs.forEach { blur ->
|
|
235
|
+
Text(
|
|
236
|
+
text = text,
|
|
237
|
+
color = Color.Transparent,
|
|
238
|
+
style = TextStyle(
|
|
239
|
+
shadow = Shadow(Color(0xFFFF00FF), Offset.Zero, blur)
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
}
|
|
243
|
+
// Top solid layer
|
|
244
|
+
Text(text = text, color = Color.White)
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
- **Compose Limitation**: Like React Native, `TextStyle` only accepts a single `Shadow`.
|
|
249
|
+
- **Workaround**: Stack multiple transparent `Text` composables inside a `Box`, each casting a shadow of varying size, topped by the solid white core text.
|
|
250
|
+
|
|
251
|
+
## Do's and Don'ts
|
|
252
|
+
- **DO**: Italicize fonts to give a sense of speed and forward momentum.
|
|
253
|
+
- **DON'T**: Use standard, subtle box shadows. If it casts a shadow, it must cast a neon glow instead.
|
|
254
|
+
|
|
255
|
+
## Limitations
|
|
256
|
+
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
|
|
257
|
+
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
|