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,297 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tile-design
|
|
3
|
+
description: Web and App implementation guide for Tile Design. Trigger when user wants Microsoft Metro style, sharp square information units, and horizontal scrolling grids.
|
|
4
|
+
date_added: "2026-06-17"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Tile Design (Metro UI)
|
|
11
|
+
|
|
12
|
+
> "Authentically digital. Clean, sharp squares relying purely on typography and flat color."
|
|
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. **Sharp Corners**: Absolutely no border-radius. Everything is a perfect square or sharp rectangle.
|
|
20
|
+
2. **Live Data**: Tiles flip, scroll, or fade internally to show live updates without the user interacting.
|
|
21
|
+
3. **Horizontal Panning**: The grid often expands infinitely to the right, encouraging horizontal scrolling.
|
|
22
|
+
|
|
23
|
+
## Visual DNA
|
|
24
|
+
- **Colors**: High saturation, flat colors. A dark background (pure black) with bright cyan, magenta, orange, and green tiles.
|
|
25
|
+
- **Typography**: Extremely clean, light sans-serifs (like `Segoe UI Light`). Text is almost always pure white.
|
|
26
|
+
- **Icons**: Simple, wireframe, monochromatic glyphs placed centrally or in the corner.
|
|
27
|
+
|
|
28
|
+
## Web Implementation
|
|
29
|
+
- **CSS Example**:
|
|
30
|
+
```css
|
|
31
|
+
body {
|
|
32
|
+
background-color: #111;
|
|
33
|
+
color: #fff;
|
|
34
|
+
font-family: 'Segoe UI', sans-serif;
|
|
35
|
+
overflow-x: auto; /* Horizontal scroll */
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.tile-group {
|
|
39
|
+
display: grid;
|
|
40
|
+
grid-template-columns: repeat(4, 150px);
|
|
41
|
+
grid-auto-rows: 150px;
|
|
42
|
+
gap: 8px;
|
|
43
|
+
padding: 40px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.tile {
|
|
47
|
+
background-color: #0078D7; /* Classic Windows Blue */
|
|
48
|
+
padding: 12px;
|
|
49
|
+
display: flex;
|
|
50
|
+
flex-direction: column;
|
|
51
|
+
justify-content: space-between;
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
|
|
54
|
+
/* The "tilt" click effect */
|
|
55
|
+
transition: transform 0.1s;
|
|
56
|
+
transform-origin: center;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.tile:active {
|
|
60
|
+
transform: scale(0.95);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.tile-wide { grid-column: span 2; }
|
|
64
|
+
.tile-large { grid-column: span 2; grid-row: span 2; }
|
|
65
|
+
|
|
66
|
+
/* Live Tile Animation */
|
|
67
|
+
.tile-live-content {
|
|
68
|
+
animation: slideUp 5s infinite;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@keyframes slideUp {
|
|
72
|
+
0%, 45% { transform: translateY(0); }
|
|
73
|
+
50%, 95% { transform: translateY(-100%); } /* Slides up to reveal next item */
|
|
74
|
+
100% { transform: translateY(0); }
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## App Implementation
|
|
79
|
+
|
|
80
|
+
### SwiftUI
|
|
81
|
+
```swift
|
|
82
|
+
struct TileDesignView: View {
|
|
83
|
+
let rows = [GridItem(.fixed(150), spacing: 8), GridItem(.fixed(150), spacing: 8)]
|
|
84
|
+
|
|
85
|
+
var body: some View {
|
|
86
|
+
ScrollView(.horizontal, showsIndicators: false) {
|
|
87
|
+
LazyHGrid(rows: rows, spacing: 8) {
|
|
88
|
+
TileView(title: "Mail", color: Color(hex: "0078D7"), icon: "envelope")
|
|
89
|
+
TileView(title: "Photos", color: Color(hex: "00CC6A"), icon: "photo", isLarge: true)
|
|
90
|
+
TileView(title: "Weather", color: Color(hex: "2D7D9A"), icon: "cloud.sun")
|
|
91
|
+
TileView(title: "Calendar", color: Color(hex: "D13438"), icon: "calendar")
|
|
92
|
+
}
|
|
93
|
+
.padding(40)
|
|
94
|
+
}
|
|
95
|
+
.background(Color(hex: "111111").ignoresSafeArea())
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
struct TileView: View {
|
|
100
|
+
let title: String
|
|
101
|
+
let color: Color
|
|
102
|
+
let icon: String
|
|
103
|
+
var isLarge: Bool = false
|
|
104
|
+
|
|
105
|
+
@State private var isPressed = false
|
|
106
|
+
|
|
107
|
+
var body: some View {
|
|
108
|
+
VStack(alignment: .leading) {
|
|
109
|
+
Image(systemName: icon)
|
|
110
|
+
.font(.system(size: 32, weight: .light))
|
|
111
|
+
.foregroundColor(.white)
|
|
112
|
+
Spacer()
|
|
113
|
+
Text(title)
|
|
114
|
+
.font(.custom("Segoe UI", size: 16))
|
|
115
|
+
.foregroundColor(.white)
|
|
116
|
+
}
|
|
117
|
+
.padding(16)
|
|
118
|
+
// Sharp corners are mandatory
|
|
119
|
+
.frame(width: isLarge ? 308 : 150, height: isLarge ? 308 : 150, alignment: .leading)
|
|
120
|
+
.background(color)
|
|
121
|
+
.scaleEffect(isPressed ? 0.95 : 1.0)
|
|
122
|
+
.animation(.spring(response: 0.2, dampingFraction: 0.5), value: isPressed)
|
|
123
|
+
.onLongPressGesture(minimumDuration: .infinity, maximumDistance: .infinity, pressing: { pressing in
|
|
124
|
+
isPressed = pressing
|
|
125
|
+
}, perform: {})
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
- A `LazyHGrid` inside a horizontal `ScrollView` perfectly replicates the Windows Phone / Windows 8 start screen.
|
|
130
|
+
- Absolutely NO corner radius.
|
|
131
|
+
- The `isPressed` state triggering a `.scaleEffect(0.95)` replicates the physical "tilt" interaction of Metro tiles.
|
|
132
|
+
|
|
133
|
+
### Flutter
|
|
134
|
+
```dart
|
|
135
|
+
class TileDesignScreen extends StatelessWidget {
|
|
136
|
+
@override
|
|
137
|
+
Widget build(BuildContext context) {
|
|
138
|
+
return Scaffold(
|
|
139
|
+
backgroundColor: const Color(0xFF111111),
|
|
140
|
+
body: SingleChildScrollView(
|
|
141
|
+
scrollDirection: Axis.horizontal,
|
|
142
|
+
padding: const EdgeInsets.all(40),
|
|
143
|
+
child: SizedBox(
|
|
144
|
+
height: 308, // Two rows of 150px + 8px spacing
|
|
145
|
+
child: Wrap(
|
|
146
|
+
direction: Axis.vertical,
|
|
147
|
+
spacing: 8,
|
|
148
|
+
runSpacing: 8,
|
|
149
|
+
children: [
|
|
150
|
+
_buildTile('Mail', const Color(0xFF0078D7), Icons.mail_outline),
|
|
151
|
+
_buildTile('Weather', const Color(0xFF2D7D9A), Icons.cloud_outlined),
|
|
152
|
+
_buildTile('Photos', const Color(0xFF00CC6A), Icons.photo_outlined, isLarge: true),
|
|
153
|
+
_buildTile('Calendar', const Color(0xFFD13438), Icons.calendar_today),
|
|
154
|
+
],
|
|
155
|
+
),
|
|
156
|
+
),
|
|
157
|
+
),
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
Widget _buildTile(String title, Color color, IconData icon, {bool isLarge = false}) {
|
|
162
|
+
return StatefulBuilder(
|
|
163
|
+
builder: (context, setState) {
|
|
164
|
+
bool isPressed = false;
|
|
165
|
+
return GestureDetector(
|
|
166
|
+
onTapDown: (_) => setState(() => isPressed = true),
|
|
167
|
+
onTapUp: (_) => setState(() => isPressed = false),
|
|
168
|
+
onTapCancel: () => setState(() => isPressed = false),
|
|
169
|
+
child: AnimatedScale(
|
|
170
|
+
scale: isPressed ? 0.95 : 1.0,
|
|
171
|
+
duration: const Duration(milliseconds: 100),
|
|
172
|
+
child: Container(
|
|
173
|
+
width: isLarge ? 308 : 150,
|
|
174
|
+
height: isLarge ? 308 : 150,
|
|
175
|
+
color: color, // Sharp corners
|
|
176
|
+
padding: const EdgeInsets.all(16),
|
|
177
|
+
child: Column(
|
|
178
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
179
|
+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
180
|
+
children: [
|
|
181
|
+
Icon(icon, color: Colors.white, size: 32),
|
|
182
|
+
Text(title, style: const TextStyle(color: Colors.white, fontFamily: 'Segoe UI', fontSize: 16)),
|
|
183
|
+
],
|
|
184
|
+
),
|
|
185
|
+
),
|
|
186
|
+
),
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
- `Wrap` with `direction: Axis.vertical` inside a horizontally scrolling `SizedBox` is the easiest way to build a Metro grid that flows left-to-right.
|
|
194
|
+
- Wrap tiles in `GestureDetector` and `AnimatedScale` to handle the press animation.
|
|
195
|
+
|
|
196
|
+
### React Native
|
|
197
|
+
```jsx
|
|
198
|
+
const TileDesignScreen = () => {
|
|
199
|
+
return (
|
|
200
|
+
<ScrollView horizontal style={{ flex: 1, backgroundColor: '#111' }} contentContainerStyle={{ padding: 40 }}>
|
|
201
|
+
<View style={{ flexDirection: 'column', flexWrap: 'wrap', height: 308, gap: 8 }}>
|
|
202
|
+
|
|
203
|
+
<Tile title="Mail" color="#0078D7" />
|
|
204
|
+
<Tile title="Weather" color="#2D7D9A" />
|
|
205
|
+
<Tile title="Photos" color="#00CC6A" isLarge />
|
|
206
|
+
<Tile title="Calendar" color="#D13438" />
|
|
207
|
+
|
|
208
|
+
</View>
|
|
209
|
+
</ScrollView>
|
|
210
|
+
);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const Tile = ({ title, color, isLarge }) => {
|
|
214
|
+
const scale = useRef(new Animated.Value(1)).current;
|
|
215
|
+
|
|
216
|
+
const handlePressIn = () => Animated.spring(scale, { toValue: 0.95, useNativeDriver: true }).start();
|
|
217
|
+
const handlePressOut = () => Animated.spring(scale, { toValue: 1, useNativeDriver: true }).start();
|
|
218
|
+
|
|
219
|
+
return (
|
|
220
|
+
<TouchableWithoutFeedback onPressIn={handlePressIn} onPressOut={handlePressOut}>
|
|
221
|
+
<Animated.View style={{
|
|
222
|
+
width: isLarge ? 308 : 150, height: isLarge ? 308 : 150,
|
|
223
|
+
backgroundColor: color, padding: 16, justifyContent: 'space-between',
|
|
224
|
+
transform: [{ scale }] // The Metro tilt effect
|
|
225
|
+
}}>
|
|
226
|
+
<View style={{ width: 32, height: 32, backgroundColor: '#FFF', opacity: 0.5 }} />
|
|
227
|
+
<Text style={{ color: '#FFF', fontFamily: 'Segoe UI', fontSize: 16 }}>{title}</Text>
|
|
228
|
+
</Animated.View>
|
|
229
|
+
</TouchableWithoutFeedback>
|
|
230
|
+
);
|
|
231
|
+
};
|
|
232
|
+
```
|
|
233
|
+
- Use a `<ScrollView horizontal>` combined with a child `<View>` that has a fixed `height` and `flexWrap: 'wrap', flexDirection: 'column'`. This forces children to form columns and flow horizontally.
|
|
234
|
+
- Use `Animated.View` and `TouchableWithoutFeedback` to create the scale animation.
|
|
235
|
+
|
|
236
|
+
### Jetpack Compose
|
|
237
|
+
```kotlin
|
|
238
|
+
@Composable
|
|
239
|
+
fun TileDesignScreen() {
|
|
240
|
+
LazyHorizontalGrid(
|
|
241
|
+
rows = GridCells.Fixed(2),
|
|
242
|
+
modifier = Modifier.fillMaxSize().background(Color(0xFF111111)),
|
|
243
|
+
contentPadding = PaddingValues(40.dp),
|
|
244
|
+
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
|
245
|
+
verticalArrangement = Arrangement.spacedBy(8.dp)
|
|
246
|
+
) {
|
|
247
|
+
item(span = { GridItemSpan(1) }) { Tile("Mail", Color(0xFF0078D7)) }
|
|
248
|
+
// Note: LazyHorizontalGrid doesn't easily support spanning multiple rows (2x2 tiles).
|
|
249
|
+
// For a true Metro layout, you often have to build a custom Layout or use staggered grids.
|
|
250
|
+
item(span = { GridItemSpan(2) }) { Tile("Photos Wide", Color(0xFF00CC6A)) }
|
|
251
|
+
item(span = { GridItemSpan(1) }) { Tile("Weather", Color(0xFF2D7D9A)) }
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
@Composable
|
|
256
|
+
fun Tile(title: String, color: Color) {
|
|
257
|
+
var isPressed by remember { mutableStateOf(false) }
|
|
258
|
+
val scale by animateFloatAsState(if (isPressed) 0.95f else 1.0f)
|
|
259
|
+
|
|
260
|
+
Box(
|
|
261
|
+
modifier = Modifier
|
|
262
|
+
.size(150.dp) // Or wide/large based on params
|
|
263
|
+
.scale(scale)
|
|
264
|
+
.background(color) // Sharp corners! No RoundedCornerShape
|
|
265
|
+
.pointerInput(Unit) {
|
|
266
|
+
detectTapGestures(
|
|
267
|
+
onPress = {
|
|
268
|
+
isPressed = true
|
|
269
|
+
tryAwaitRelease()
|
|
270
|
+
isPressed = false
|
|
271
|
+
}
|
|
272
|
+
)
|
|
273
|
+
}
|
|
274
|
+
.padding(16.dp)
|
|
275
|
+
) {
|
|
276
|
+
// Icon
|
|
277
|
+
Box(modifier = Modifier.size(32.dp).background(Color.White.copy(alpha = 0.5f)).align(Alignment.TopStart))
|
|
278
|
+
// Text
|
|
279
|
+
Text(
|
|
280
|
+
text = title,
|
|
281
|
+
color = Color.White,
|
|
282
|
+
fontFamily = FontFamily.SansSerif,
|
|
283
|
+
modifier = Modifier.align(Alignment.BottomStart)
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
- `LazyHorizontalGrid` is the right tool, though building true 2x2 "Large" tiles requires custom layout math in Compose if mixing with 1x1 tiles.
|
|
289
|
+
- `Modifier.scale()` paired with `pointerInput` `detectTapGestures` handles the Metro interaction.
|
|
290
|
+
|
|
291
|
+
## Do's and Don'ts
|
|
292
|
+
- **DO**: Place the tile label text strictly in the bottom-left corner of the tile.
|
|
293
|
+
- **DON'T**: Add drop shadows or gradients to the tiles.
|
|
294
|
+
|
|
295
|
+
## Limitations
|
|
296
|
+
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
|
|
297
|
+
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typography-first
|
|
3
|
+
description: Web and App implementation guide for Typography First Design. Trigger when user wants text as the absolute main visual element, with minimal UI chroming.
|
|
4
|
+
date_added: "2026-06-17"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Typography First Design
|
|
11
|
+
|
|
12
|
+
> "The words are the interface. No distractions, just beautiful text."
|
|
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. **Hyper-Sized Typography**: The main headline is so large it becomes an abstract graphic element.
|
|
20
|
+
2. **Minimal UI Chroming**: Buttons are just text. Navigation is just text. No boxes, no backgrounds.
|
|
21
|
+
3. **Kinetic Typography**: Text that moves, scrolls, or reacts to the user's cursor.
|
|
22
|
+
|
|
23
|
+
## Visual DNA
|
|
24
|
+
- **Colors**: Extreme high contrast. Pure black and white, or a very dark background with a single neon accent color. **Midnight Luxury** works well.
|
|
25
|
+
- **Typography**: Display fonts with extreme character. Try `Oswald`, `Anton`, or `Bebas Neue` for impact, or a massive serif.
|
|
26
|
+
- **Layout**: Often centers the massive text perfectly in the viewport, cutting off at the edges.
|
|
27
|
+
|
|
28
|
+
## Web Implementation
|
|
29
|
+
- Rely on `vw` and `vh` units for font sizing so the text perfectly fills the screen.
|
|
30
|
+
- **CSS Example**:
|
|
31
|
+
```css
|
|
32
|
+
body {
|
|
33
|
+
background-color: #0A0A0A;
|
|
34
|
+
color: #F5F5F0;
|
|
35
|
+
overflow-x: hidden;
|
|
36
|
+
margin: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.hero-type {
|
|
40
|
+
font-family: 'Anton', sans-serif;
|
|
41
|
+
font-size: 25vw; /* Fills the width of the screen */
|
|
42
|
+
text-transform: uppercase;
|
|
43
|
+
line-height: 0.8;
|
|
44
|
+
white-space: nowrap;
|
|
45
|
+
|
|
46
|
+
/* Outline effect */
|
|
47
|
+
color: transparent;
|
|
48
|
+
-webkit-text-stroke: 2px #F5F5F0;
|
|
49
|
+
transition: color 0.3s;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.hero-type:hover {
|
|
53
|
+
color: var(--cta-highlight);
|
|
54
|
+
-webkit-text-stroke: 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.nav-text-btn {
|
|
58
|
+
background: none;
|
|
59
|
+
border: none;
|
|
60
|
+
color: #F5F5F0;
|
|
61
|
+
font-size: 2rem;
|
|
62
|
+
font-family: 'Helvetica Neue', sans-serif;
|
|
63
|
+
text-decoration: underline;
|
|
64
|
+
text-underline-offset: 8px;
|
|
65
|
+
cursor: pointer;
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## App Implementation
|
|
70
|
+
|
|
71
|
+
### SwiftUI
|
|
72
|
+
```swift
|
|
73
|
+
struct TypographyFirstView: View {
|
|
74
|
+
var body: some View {
|
|
75
|
+
ZStack {
|
|
76
|
+
Color(hex: "0A0A0A").ignoresSafeArea()
|
|
77
|
+
|
|
78
|
+
VStack {
|
|
79
|
+
// Massive Typography Bleeding Off Edge
|
|
80
|
+
Text("THE WORDS ARE THE INTERFACE")
|
|
81
|
+
.font(.custom("Anton", size: 200)) // Absurdly large
|
|
82
|
+
.foregroundColor(Color(hex: "F5F5F0"))
|
|
83
|
+
.lineLimit(1)
|
|
84
|
+
.fixedSize(horizontal: true, vertical: false) // Force no wrapping
|
|
85
|
+
.minimumScaleFactor(1.0) // Prevent auto-shrinking
|
|
86
|
+
|
|
87
|
+
// Outlined variant
|
|
88
|
+
Text("NO CHROMING")
|
|
89
|
+
.font(.custom("Anton", size: 150))
|
|
90
|
+
.foregroundColor(.clear)
|
|
91
|
+
.overlay(
|
|
92
|
+
Text("NO CHROMING")
|
|
93
|
+
.font(.custom("Anton", size: 150))
|
|
94
|
+
.foregroundColor(Color(hex: "0A0A0A"))
|
|
95
|
+
// Hack for text stroke in SwiftUI
|
|
96
|
+
.shadow(color: Color(hex: "F5F5F0"), radius: 1)
|
|
97
|
+
)
|
|
98
|
+
.lineLimit(1)
|
|
99
|
+
.fixedSize()
|
|
100
|
+
}
|
|
101
|
+
.frame(maxWidth: .infinity, alignment: .leading)
|
|
102
|
+
.padding(.leading, -20) // Intentionally cut off
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
- Use `.fixedSize(horizontal: true, vertical: false)` and `.lineLimit(1)` to force massive fonts to bleed off the edge of the screen rather than wrapping into a paragraph.
|
|
108
|
+
- Native text-stroke is difficult in SwiftUI; overlapping a masked text or using thin shadows is the common workaround.
|
|
109
|
+
|
|
110
|
+
### Flutter
|
|
111
|
+
```dart
|
|
112
|
+
class TypographyFirstScreen extends StatelessWidget {
|
|
113
|
+
@override
|
|
114
|
+
Widget build(BuildContext context) {
|
|
115
|
+
return Scaffold(
|
|
116
|
+
backgroundColor: const Color(0xFF0A0A0A),
|
|
117
|
+
body: Center(
|
|
118
|
+
child: Column(
|
|
119
|
+
mainAxisAlignment: MainAxisAlignment.center,
|
|
120
|
+
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
121
|
+
children: [
|
|
122
|
+
// Auto-scaling hero text
|
|
123
|
+
FittedBox(
|
|
124
|
+
fit: BoxFit.cover,
|
|
125
|
+
child: Text(
|
|
126
|
+
'THE WORDS ARE',
|
|
127
|
+
style: TextStyle(fontFamily: 'Anton', color: const Color(0xFFF5F5F0), height: 0.8),
|
|
128
|
+
),
|
|
129
|
+
),
|
|
130
|
+
|
|
131
|
+
// Outlined text
|
|
132
|
+
FittedBox(
|
|
133
|
+
fit: BoxFit.cover,
|
|
134
|
+
child: Stack(
|
|
135
|
+
children: [
|
|
136
|
+
// Outline
|
|
137
|
+
Text(
|
|
138
|
+
'THE INTERFACE',
|
|
139
|
+
style: TextStyle(
|
|
140
|
+
fontFamily: 'Anton', height: 0.8,
|
|
141
|
+
foreground: Paint()..style = PaintingStyle.stroke..strokeWidth = 2..color = const Color(0xFFF5F5F0),
|
|
142
|
+
),
|
|
143
|
+
),
|
|
144
|
+
// Solid fill (transparent)
|
|
145
|
+
const Text('THE INTERFACE', style: TextStyle(fontFamily: 'Anton', height: 0.8, color: Colors.transparent)),
|
|
146
|
+
],
|
|
147
|
+
),
|
|
148
|
+
),
|
|
149
|
+
],
|
|
150
|
+
),
|
|
151
|
+
),
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
- `FittedBox` with `BoxFit.cover` is your best friend here. It ensures the text takes up the maximum possible width/height regardless of the device screen size.
|
|
157
|
+
- Flutter makes text outlines easy by using `foreground: Paint()..style = PaintingStyle.stroke` in the `TextStyle`.
|
|
158
|
+
|
|
159
|
+
### React Native
|
|
160
|
+
```jsx
|
|
161
|
+
const { width } = Dimensions.get('window');
|
|
162
|
+
|
|
163
|
+
const TypographyFirstScreen = () => {
|
|
164
|
+
return (
|
|
165
|
+
<View style={{ flex: 1, backgroundColor: '#0A0A0A', justifyContent: 'center' }}>
|
|
166
|
+
|
|
167
|
+
{/* Massive Text */}
|
|
168
|
+
<Text
|
|
169
|
+
numberOfLines={1}
|
|
170
|
+
style={{ fontFamily: 'Anton-Regular', fontSize: width * 0.4, color: '#F5F5F0', lineHeight: width * 0.35, marginLeft: -20 }}
|
|
171
|
+
>
|
|
172
|
+
WORDS ARE
|
|
173
|
+
</Text>
|
|
174
|
+
|
|
175
|
+
{/* Outlined Text (Not supported natively in standard React Native Text, requires SVG or shadows) */}
|
|
176
|
+
<Text
|
|
177
|
+
numberOfLines={1}
|
|
178
|
+
style={{
|
|
179
|
+
fontFamily: 'Anton-Regular', fontSize: width * 0.35, color: '#0A0A0A', lineHeight: width * 0.3,
|
|
180
|
+
textShadowColor: '#F5F5F0', textShadowOffset: {width: -1, height: 1}, textShadowRadius: 1
|
|
181
|
+
}}
|
|
182
|
+
>
|
|
183
|
+
INTERFACE
|
|
184
|
+
</Text>
|
|
185
|
+
|
|
186
|
+
{/* Typography Button */}
|
|
187
|
+
<TouchableOpacity style={{ marginTop: 40, alignSelf: 'center' }}>
|
|
188
|
+
<Text style={{ color: '#F5F5F0', fontSize: 24, textDecorationLine: 'underline' }}>
|
|
189
|
+
Explore Now
|
|
190
|
+
</Text>
|
|
191
|
+
</TouchableOpacity>
|
|
192
|
+
|
|
193
|
+
</View>
|
|
194
|
+
);
|
|
195
|
+
};
|
|
196
|
+
```
|
|
197
|
+
- Rely on `Dimensions.get('window').width` to calculate extreme font sizes dynamically (e.g., `fontSize: width * 0.4`).
|
|
198
|
+
- Use `numberOfLines={1}` and negative margins to allow the text to act as a graphic element bleeding off the screen.
|
|
199
|
+
|
|
200
|
+
### Jetpack Compose
|
|
201
|
+
```kotlin
|
|
202
|
+
@Composable
|
|
203
|
+
fun TypographyFirstScreen() {
|
|
204
|
+
Column(
|
|
205
|
+
modifier = Modifier.fillMaxSize().background(Color(0xFF0A0A0A)),
|
|
206
|
+
verticalArrangement = Arrangement.Center
|
|
207
|
+
) {
|
|
208
|
+
// Massive Text
|
|
209
|
+
Text(
|
|
210
|
+
text = "THE WORDS ARE",
|
|
211
|
+
color = Color(0xFFF5F5F0),
|
|
212
|
+
fontSize = 120.sp, // Absurd size
|
|
213
|
+
fontFamily = FontFamily.SansSerif, // Replace with Anton
|
|
214
|
+
lineHeight = 100.sp,
|
|
215
|
+
softWrap = false, // Force bleed off edge
|
|
216
|
+
modifier = Modifier.offset(x = (-20).dp)
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
// Outlined Text
|
|
220
|
+
Text(
|
|
221
|
+
text = "THE INTERFACE",
|
|
222
|
+
fontSize = 100.sp,
|
|
223
|
+
fontFamily = FontFamily.SansSerif,
|
|
224
|
+
lineHeight = 90.sp,
|
|
225
|
+
softWrap = false,
|
|
226
|
+
style = TextStyle(
|
|
227
|
+
drawStyle = Stroke(
|
|
228
|
+
miter = 10f,
|
|
229
|
+
width = 2f,
|
|
230
|
+
join = StrokeJoin.Round
|
|
231
|
+
)
|
|
232
|
+
),
|
|
233
|
+
color = Color(0xFFF5F5F0) // The stroke color
|
|
234
|
+
)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
- Set `softWrap = false` on `Text` to prevent it from wrapping and ruining the massive headline aesthetic.
|
|
239
|
+
- Compose fully supports text outlines natively using `style = TextStyle(drawStyle = Stroke(...))`.
|
|
240
|
+
|
|
241
|
+
## Do's and Don'ts
|
|
242
|
+
- **DO**: Mix filled text and outlined text (using `-webkit-text-stroke`) for visual interest.
|
|
243
|
+
- **DON'T**: Wrap the text in cards or containers. Let it bleed into the background.
|
|
244
|
+
|
|
245
|
+
## Limitations
|
|
246
|
+
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
|
|
247
|
+
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
|