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,280 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skeuomorphism
|
|
3
|
+
description: Web and App implementation guide for Skeuomorphism. Trigger when user wants UI to mimic real-world objects, realistic textures, or physical metaphors.
|
|
4
|
+
date_added: "2026-06-17"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Skeuomorphism
|
|
11
|
+
|
|
12
|
+
> "Digital interfaces that look and behave like their physical counterparts."
|
|
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. **Realistic Textures**: Leather, brushed metal, wood grain, paper. The UI should feel like a physical object you can touch.
|
|
20
|
+
2. **Physical Lighting & Depth**: Intense attention to specular highlights, drop shadows, inner shadows, bevels, and ambient occlusion.
|
|
21
|
+
3. **Real-world Metaphors**: Switches that look like hardware toggles, dials with physical notches, notepads with binding rings.
|
|
22
|
+
|
|
23
|
+
## Visual DNA
|
|
24
|
+
- **Colors**: Highly dependent on the material being simulated. For rich, classic skeuomorphism, use the **Industrial Chic** (for metal/hardware) or **Monochromatic Brown** (for wood/leather) palettes.
|
|
25
|
+
- **Typography**: Fonts that match the physical object (e.g., typewriter fonts for paper, LCD fonts for digital screens, embossed sans-serifs for hardware buttons).
|
|
26
|
+
- **Details**: Screws, stitching, glare, and gradients are your primary tools.
|
|
27
|
+
|
|
28
|
+
## Web Implementation
|
|
29
|
+
- Heavy use of layered background images (textures), complex gradients, and multiple box-shadows.
|
|
30
|
+
- **CSS Example**:
|
|
31
|
+
```css
|
|
32
|
+
.skeuo-button {
|
|
33
|
+
/* Brushed metal effect */
|
|
34
|
+
background: linear-gradient(180deg, #e0e0e0 0%, #a0a0a0 100%),
|
|
35
|
+
url('brushed-metal-texture.png');
|
|
36
|
+
background-blend-mode: overlay;
|
|
37
|
+
|
|
38
|
+
border: 1px solid #7a7a7a;
|
|
39
|
+
border-radius: 50%;
|
|
40
|
+
width: 80px;
|
|
41
|
+
height: 80px;
|
|
42
|
+
|
|
43
|
+
/* Bevel, inner highlight, and drop shadow */
|
|
44
|
+
box-shadow:
|
|
45
|
+
inset 0 2px 4px rgba(255,255,255,0.8), /* Top highlight */
|
|
46
|
+
inset 0 -2px 4px rgba(0,0,0,0.4), /* Bottom shading */
|
|
47
|
+
0 4px 6px rgba(0,0,0,0.5), /* Drop shadow */
|
|
48
|
+
0 1px 1px rgba(0,0,0,0.2);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.skeuo-button:active {
|
|
52
|
+
/* Pressing the physical button */
|
|
53
|
+
box-shadow:
|
|
54
|
+
inset 0 4px 8px rgba(0,0,0,0.6),
|
|
55
|
+
inset 0 -1px 2px rgba(255,255,255,0.4),
|
|
56
|
+
0 1px 1px rgba(0,0,0,0.2);
|
|
57
|
+
transform: translateY(2px);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## App Implementation
|
|
62
|
+
|
|
63
|
+
### SwiftUI
|
|
64
|
+
```swift
|
|
65
|
+
struct SkeuoButton: View {
|
|
66
|
+
@State private var isPressed = false
|
|
67
|
+
|
|
68
|
+
var body: some View {
|
|
69
|
+
Button(action: {}) {
|
|
70
|
+
Text("POWER")
|
|
71
|
+
.font(.system(size: 14, weight: .bold))
|
|
72
|
+
.foregroundColor(.white)
|
|
73
|
+
.textCase(.uppercase)
|
|
74
|
+
}
|
|
75
|
+
.frame(width: 80, height: 80)
|
|
76
|
+
.background(
|
|
77
|
+
ZStack {
|
|
78
|
+
// Brushed metal base
|
|
79
|
+
Circle()
|
|
80
|
+
.fill(
|
|
81
|
+
LinearGradient(
|
|
82
|
+
colors: [Color(white: 0.88), Color(white: 0.63)],
|
|
83
|
+
startPoint: .top,
|
|
84
|
+
endPoint: .bottom
|
|
85
|
+
)
|
|
86
|
+
)
|
|
87
|
+
// Inner highlight (top bevel)
|
|
88
|
+
Circle()
|
|
89
|
+
.stroke(
|
|
90
|
+
LinearGradient(
|
|
91
|
+
colors: [.white.opacity(0.8), .clear],
|
|
92
|
+
startPoint: .top,
|
|
93
|
+
endPoint: .center
|
|
94
|
+
),
|
|
95
|
+
lineWidth: 2
|
|
96
|
+
)
|
|
97
|
+
.padding(1)
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
.clipShape(Circle())
|
|
101
|
+
// Outer bezel ring
|
|
102
|
+
.overlay(Circle().stroke(Color(white: 0.5), lineWidth: 1))
|
|
103
|
+
// Physical drop shadow
|
|
104
|
+
.shadow(color: .black.opacity(isPressed ? 0.2 : 0.5), radius: isPressed ? 2 : 6,
|
|
105
|
+
x: 0, y: isPressed ? 1 : 4)
|
|
106
|
+
.scaleEffect(isPressed ? 0.96 : 1.0)
|
|
107
|
+
.animation(.easeOut(duration: 0.1), value: isPressed)
|
|
108
|
+
.simultaneousGesture(
|
|
109
|
+
DragGesture(minimumDistance: 0)
|
|
110
|
+
.onChanged { _ in isPressed = true }
|
|
111
|
+
.onEnded { _ in isPressed = false }
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
- Stack multiple shapes (`Circle`, `RoundedRectangle`) with different gradients to build up realistic depth.
|
|
117
|
+
- Use `.overlay()` with stroked shapes for highlight bezels along the edges.
|
|
118
|
+
- The pressed state should reduce shadow AND scale — simulating a physical push.
|
|
119
|
+
|
|
120
|
+
### Flutter
|
|
121
|
+
```dart
|
|
122
|
+
class SkeuoButton extends StatefulWidget {
|
|
123
|
+
@override
|
|
124
|
+
State<SkeuoButton> createState() => _SkeuoButtonState();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
class _SkeuoButtonState extends State<SkeuoButton> {
|
|
128
|
+
bool _isPressed = false;
|
|
129
|
+
|
|
130
|
+
@override
|
|
131
|
+
Widget build(BuildContext context) {
|
|
132
|
+
return GestureDetector(
|
|
133
|
+
onTapDown: (_) => setState(() => _isPressed = true),
|
|
134
|
+
onTapUp: (_) => setState(() => _isPressed = false),
|
|
135
|
+
onTapCancel: () => setState(() => _isPressed = false),
|
|
136
|
+
child: AnimatedContainer(
|
|
137
|
+
duration: const Duration(milliseconds: 100),
|
|
138
|
+
width: 80,
|
|
139
|
+
height: 80,
|
|
140
|
+
decoration: BoxDecoration(
|
|
141
|
+
shape: BoxShape.circle,
|
|
142
|
+
// Brushed metal gradient
|
|
143
|
+
gradient: LinearGradient(
|
|
144
|
+
colors: [Colors.grey[300]!, Colors.grey[600]!],
|
|
145
|
+
begin: Alignment.topCenter,
|
|
146
|
+
end: Alignment.bottomCenter,
|
|
147
|
+
),
|
|
148
|
+
border: Border.all(color: Colors.grey[500]!, width: 1),
|
|
149
|
+
boxShadow: [
|
|
150
|
+
// Outer drop shadow
|
|
151
|
+
BoxShadow(
|
|
152
|
+
color: Colors.black.withOpacity(_isPressed ? 0.2 : 0.5),
|
|
153
|
+
blurRadius: _isPressed ? 4 : 12,
|
|
154
|
+
offset: Offset(0, _isPressed ? 2 : 6),
|
|
155
|
+
),
|
|
156
|
+
// Inner top highlight (faked with a light inset)
|
|
157
|
+
BoxShadow(
|
|
158
|
+
color: Colors.white.withOpacity(0.6),
|
|
159
|
+
blurRadius: 1,
|
|
160
|
+
offset: const Offset(0, -1),
|
|
161
|
+
spreadRadius: -1,
|
|
162
|
+
),
|
|
163
|
+
],
|
|
164
|
+
),
|
|
165
|
+
transform: Matrix4.identity()..scale(_isPressed ? 0.96 : 1.0),
|
|
166
|
+
alignment: Alignment.center,
|
|
167
|
+
child: const Text('POWER',
|
|
168
|
+
style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold,
|
|
169
|
+
fontSize: 14, shadows: [
|
|
170
|
+
Shadow(color: Colors.black54, offset: Offset(0, 1), blurRadius: 2),
|
|
171
|
+
])),
|
|
172
|
+
),
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
- Use `AnimatedContainer` for smooth press transitions. Adjust `boxShadow`, `transform`, and gradient on tap.
|
|
178
|
+
- Layer `BoxShadow` entries: one for the outer drop shadow, one for the inner top-edge highlight.
|
|
179
|
+
- For complex textures (leather, wood), use `DecorationImage` with an asset file inside `BoxDecoration`.
|
|
180
|
+
|
|
181
|
+
### React Native
|
|
182
|
+
```jsx
|
|
183
|
+
const SkeuoButton = () => {
|
|
184
|
+
const [pressed, setPressed] = useState(false);
|
|
185
|
+
|
|
186
|
+
return (
|
|
187
|
+
<Pressable
|
|
188
|
+
onPressIn={() => setPressed(true)}
|
|
189
|
+
onPressOut={() => setPressed(false)}
|
|
190
|
+
style={{
|
|
191
|
+
width: 80,
|
|
192
|
+
height: 80,
|
|
193
|
+
borderRadius: 40,
|
|
194
|
+
alignItems: 'center',
|
|
195
|
+
justifyContent: 'center',
|
|
196
|
+
// Metal gradient must be done via an image or LinearGradient component
|
|
197
|
+
backgroundColor: '#A0A0A0',
|
|
198
|
+
borderWidth: 1,
|
|
199
|
+
borderColor: '#7A7A7A',
|
|
200
|
+
// Shadow changes on press
|
|
201
|
+
shadowColor: '#000',
|
|
202
|
+
shadowOffset: { width: 0, height: pressed ? 1 : 4 },
|
|
203
|
+
shadowOpacity: pressed ? 0.2 : 0.5,
|
|
204
|
+
shadowRadius: pressed ? 2 : 6,
|
|
205
|
+
elevation: pressed ? 2 : 8,
|
|
206
|
+
transform: [{ scale: pressed ? 0.96 : 1 }],
|
|
207
|
+
}}
|
|
208
|
+
>
|
|
209
|
+
<Text style={{
|
|
210
|
+
color: '#FFF',
|
|
211
|
+
fontWeight: '700',
|
|
212
|
+
fontSize: 14,
|
|
213
|
+
textShadowColor: 'rgba(0,0,0,0.5)',
|
|
214
|
+
textShadowOffset: { width: 0, height: 1 },
|
|
215
|
+
textShadowRadius: 2,
|
|
216
|
+
}}>
|
|
217
|
+
POWER
|
|
218
|
+
</Text>
|
|
219
|
+
</Pressable>
|
|
220
|
+
);
|
|
221
|
+
};
|
|
222
|
+
```
|
|
223
|
+
- For realistic textures, use `ImageBackground` with exported texture assets (leather.png, brushed-metal.png).
|
|
224
|
+
- Use `Pressable` with `onPressIn`/`onPressOut` to animate shadow depth, scale, and opacity changes.
|
|
225
|
+
- Complex gradient bevels require `react-native-linear-gradient` or `expo-linear-gradient`.
|
|
226
|
+
|
|
227
|
+
### Jetpack Compose
|
|
228
|
+
```kotlin
|
|
229
|
+
@Composable
|
|
230
|
+
fun SkeuoButton() {
|
|
231
|
+
var isPressed by remember { mutableStateOf(false) }
|
|
232
|
+
val scale by animateFloatAsState(if (isPressed) 0.96f else 1f)
|
|
233
|
+
val elevation by animateDpAsState(if (isPressed) 2.dp else 8.dp)
|
|
234
|
+
|
|
235
|
+
Box(
|
|
236
|
+
modifier = Modifier
|
|
237
|
+
.size(80.dp)
|
|
238
|
+
.graphicsLayer { scaleX = scale; scaleY = scale }
|
|
239
|
+
.shadow(elevation, CircleShape)
|
|
240
|
+
.clip(CircleShape)
|
|
241
|
+
.background(
|
|
242
|
+
Brush.verticalGradient(
|
|
243
|
+
colors = listOf(Color(0xFFE0E0E0), Color(0xFFA0A0A0))
|
|
244
|
+
)
|
|
245
|
+
)
|
|
246
|
+
.border(1.dp, Color(0xFF7A7A7A), CircleShape)
|
|
247
|
+
.pointerInput(Unit) {
|
|
248
|
+
detectTapGestures(
|
|
249
|
+
onPress = {
|
|
250
|
+
isPressed = true
|
|
251
|
+
tryAwaitRelease()
|
|
252
|
+
isPressed = false
|
|
253
|
+
}
|
|
254
|
+
)
|
|
255
|
+
},
|
|
256
|
+
contentAlignment = Alignment.Center,
|
|
257
|
+
) {
|
|
258
|
+
Text("POWER",
|
|
259
|
+
color = Color.White,
|
|
260
|
+
fontWeight = FontWeight.Bold,
|
|
261
|
+
fontSize = 14.sp,
|
|
262
|
+
style = TextStyle(shadow = Shadow(
|
|
263
|
+
color = Color.Black.copy(alpha = 0.5f),
|
|
264
|
+
offset = Offset(0f, 2f),
|
|
265
|
+
blurRadius = 4f,
|
|
266
|
+
)))
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
- Use `Brush.verticalGradient()` for metallic surfaces and `Modifier.border()` with `CircleShape` for bezels.
|
|
271
|
+
- Animate `shadow` elevation and `graphicsLayer { scaleX/scaleY }` on press for realistic physical push.
|
|
272
|
+
- For textures, use `Modifier.paint(painterResource(R.drawable.brushed_metal))` as a background.
|
|
273
|
+
|
|
274
|
+
## Do's and Don'ts
|
|
275
|
+
- **DO**: Ensure the metaphor makes sense for the user's task.
|
|
276
|
+
- **DON'T**: Overuse it to the point of clutter. Keep the interactive elements highly realistic, but let the structural layout remain clean.
|
|
277
|
+
|
|
278
|
+
## Limitations
|
|
279
|
+
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
|
|
280
|
+
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soft-pastel
|
|
3
|
+
description: Web and App implementation guide for Soft Pastel Design. Trigger when user wants gentle colors, calming UI, baby/lifestyle branding, or low-contrast aesthetics.
|
|
4
|
+
date_added: "2026-06-17"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Soft Pastel Design
|
|
11
|
+
|
|
12
|
+
> "Calm, airy, and gentle. A low-stress interface built on washed-out, cheerful hues."
|
|
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. **Desaturated, High-Lightness Colors**: Every color is mixed with a heavy amount of white.
|
|
20
|
+
2. **Soft, Rounded Edges**: Border radii are large and friendly.
|
|
21
|
+
3. **Airy Spacing**: Generous whitespace prevents the soft colors from feeling muddy or crowded.
|
|
22
|
+
|
|
23
|
+
## Visual DNA
|
|
24
|
+
- **Colors**: Mint green, baby blue, blush pink, lavender, and buttercream yellow. Use a warm, slightly off-white background (e.g., `#FFFBF7`) rather than clinical `#FFFFFF`.
|
|
25
|
+
- **Typography**: Soft, rounded sans-serifs (`Quicksand`, `Nunito`) or elegant, low-contrast serifs. Avoid aggressive, ultra-bold fonts.
|
|
26
|
+
- **Shadows**: Very soft, large-spread shadows, often tinted with the pastel color rather than black.
|
|
27
|
+
|
|
28
|
+
## Web Implementation
|
|
29
|
+
- **CSS Example**:
|
|
30
|
+
```css
|
|
31
|
+
:root {
|
|
32
|
+
--pastel-bg: #FFFBF7;
|
|
33
|
+
--pastel-pink: #FFD1DC;
|
|
34
|
+
--pastel-blue: #AEC6CF;
|
|
35
|
+
--pastel-green: #B7E4C7;
|
|
36
|
+
--pastel-text: #4A4A4A; /* Soft dark grey, NOT pure black */
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
body {
|
|
40
|
+
background-color: var(--pastel-bg);
|
|
41
|
+
color: var(--pastel-text);
|
|
42
|
+
font-family: 'Nunito', sans-serif;
|
|
43
|
+
line-height: 1.6;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.pastel-card {
|
|
47
|
+
background-color: #ffffff;
|
|
48
|
+
border-radius: 24px;
|
|
49
|
+
padding: 40px;
|
|
50
|
+
/* Tinted, very soft shadow */
|
|
51
|
+
box-shadow: 0 20px 40px rgba(174, 198, 207, 0.15);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.pastel-pill {
|
|
55
|
+
background-color: var(--pastel-pink);
|
|
56
|
+
color: #a05a6c; /* Darker version of the pink for contrast */
|
|
57
|
+
border-radius: 50px;
|
|
58
|
+
padding: 8px 24px;
|
|
59
|
+
font-weight: 700;
|
|
60
|
+
display: inline-block;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.pastel-btn {
|
|
64
|
+
background-color: var(--pastel-blue);
|
|
65
|
+
color: #2b5563; /* Darker text */
|
|
66
|
+
border: none;
|
|
67
|
+
border-radius: 12px;
|
|
68
|
+
padding: 16px 32px;
|
|
69
|
+
transition: transform 0.2s;
|
|
70
|
+
}
|
|
71
|
+
.pastel-btn:hover {
|
|
72
|
+
transform: translateY(-2px);
|
|
73
|
+
box-shadow: 0 10px 20px rgba(174, 198, 207, 0.4);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## App Implementation
|
|
78
|
+
|
|
79
|
+
### SwiftUI
|
|
80
|
+
```swift
|
|
81
|
+
struct SoftPastelView: View {
|
|
82
|
+
// Pastel Palette
|
|
83
|
+
let bg = Color(hex: "FFFBF7")
|
|
84
|
+
let pink = Color(hex: "FFD1DC")
|
|
85
|
+
let blue = Color(hex: "AEC6CF")
|
|
86
|
+
let textDark = Color(hex: "4A4A4A")
|
|
87
|
+
|
|
88
|
+
var body: some View {
|
|
89
|
+
ScrollView {
|
|
90
|
+
VStack(spacing: 32) {
|
|
91
|
+
// Pastel Card
|
|
92
|
+
VStack(alignment: .leading, spacing: 16) {
|
|
93
|
+
Text("Calm & Airy")
|
|
94
|
+
.font(.custom("Nunito-Bold", size: 28))
|
|
95
|
+
.foregroundColor(textDark)
|
|
96
|
+
|
|
97
|
+
Text("Generous whitespace and soft corners prevent the desaturated colors from feeling muddy.")
|
|
98
|
+
.font(.custom("Nunito-Regular", size: 16))
|
|
99
|
+
.foregroundColor(textDark.opacity(0.8))
|
|
100
|
+
.lineSpacing(6)
|
|
101
|
+
}
|
|
102
|
+
.padding(40)
|
|
103
|
+
.frame(maxWidth: .infinity, alignment: .leading)
|
|
104
|
+
.background(Color.white)
|
|
105
|
+
.cornerRadius(32) // Soft, large radius
|
|
106
|
+
// Tinted pastel shadow instead of black/gray
|
|
107
|
+
.shadow(color: blue.opacity(0.2), radius: 30, y: 15)
|
|
108
|
+
|
|
109
|
+
// Pastel Button
|
|
110
|
+
Button(action: {}) {
|
|
111
|
+
Text("Gentle Action")
|
|
112
|
+
.font(.custom("Nunito-Bold", size: 18))
|
|
113
|
+
.foregroundColor(Color(hex: "2B5563")) // Darker contrast of the blue
|
|
114
|
+
.frame(maxWidth: .infinity)
|
|
115
|
+
.padding(.vertical, 20)
|
|
116
|
+
.background(blue)
|
|
117
|
+
.cornerRadius(20)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
.padding(24)
|
|
121
|
+
}
|
|
122
|
+
.background(bg.ignoresSafeArea())
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
- A custom font like Nunito or Quicksand is practically required. System fonts are often too rigid.
|
|
127
|
+
- The `shadow(color:)` must be tinted with one of your pastel palette colors, never black or gray.
|
|
128
|
+
- Corner radii should be very large (20-32).
|
|
129
|
+
|
|
130
|
+
### Flutter
|
|
131
|
+
```dart
|
|
132
|
+
class SoftPastelScreen extends StatelessWidget {
|
|
133
|
+
final Color bg = const Color(0xFFFFFBF7);
|
|
134
|
+
final Color pink = const Color(0xFFFFD1DC);
|
|
135
|
+
final Color blue = const Color(0xFFAEC6CF);
|
|
136
|
+
final Color textDark = const Color(0xFF4A4A4A);
|
|
137
|
+
|
|
138
|
+
@override
|
|
139
|
+
Widget build(BuildContext context) {
|
|
140
|
+
return Scaffold(
|
|
141
|
+
backgroundColor: bg,
|
|
142
|
+
body: SingleChildScrollView(
|
|
143
|
+
padding: const EdgeInsets.all(24.0),
|
|
144
|
+
child: Column(
|
|
145
|
+
children: [
|
|
146
|
+
// Pastel Card
|
|
147
|
+
Container(
|
|
148
|
+
width: double.infinity,
|
|
149
|
+
padding: const EdgeInsets.all(40),
|
|
150
|
+
decoration: BoxDecoration(
|
|
151
|
+
color: Colors.white,
|
|
152
|
+
borderRadius: BorderRadius.circular(32), // Soft edges
|
|
153
|
+
boxShadow: [
|
|
154
|
+
// Tinted shadow
|
|
155
|
+
BoxShadow(color: blue.withOpacity(0.2), blurRadius: 30, offset: const Offset(0, 15))
|
|
156
|
+
],
|
|
157
|
+
),
|
|
158
|
+
child: Column(
|
|
159
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
160
|
+
children: [
|
|
161
|
+
Text('Calm & Airy', style: TextStyle(fontFamily: 'Nunito', fontSize: 28, fontWeight: FontWeight.bold, color: textDark)),
|
|
162
|
+
const SizedBox(height: 16),
|
|
163
|
+
Text('Generous whitespace and soft corners.', style: TextStyle(fontFamily: 'Nunito', fontSize: 16, height: 1.6, color: textDark.withOpacity(0.8))),
|
|
164
|
+
],
|
|
165
|
+
),
|
|
166
|
+
),
|
|
167
|
+
const SizedBox(height: 32),
|
|
168
|
+
|
|
169
|
+
// Pastel Button
|
|
170
|
+
ElevatedButton(
|
|
171
|
+
onPressed: () {},
|
|
172
|
+
style: ElevatedButton.styleFrom(
|
|
173
|
+
backgroundColor: blue,
|
|
174
|
+
foregroundColor: const Color(0xFF2B5563), // Darker text for contrast
|
|
175
|
+
minimumSize: const Size(double.infinity, 60),
|
|
176
|
+
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
|
|
177
|
+
elevation: 0, // Remove default harsh shadow
|
|
178
|
+
),
|
|
179
|
+
child: const Text('Gentle Action', style: TextStyle(fontFamily: 'Nunito', fontSize: 18, fontWeight: FontWeight.bold)),
|
|
180
|
+
),
|
|
181
|
+
],
|
|
182
|
+
),
|
|
183
|
+
),
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
- Disable `elevation` on Flutter buttons and cards if you want to apply custom tinted drop shadows. Default elevations cast black shadows.
|
|
189
|
+
|
|
190
|
+
### React Native
|
|
191
|
+
```jsx
|
|
192
|
+
const SoftPastelScreen = () => {
|
|
193
|
+
const colors = {
|
|
194
|
+
bg: '#FFFBF7',
|
|
195
|
+
blue: '#AEC6CF',
|
|
196
|
+
textDark: '#4A4A4A'
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
return (
|
|
200
|
+
<ScrollView style={{ flex: 1, backgroundColor: colors.bg, padding: 24 }}>
|
|
201
|
+
|
|
202
|
+
{/* Pastel Card */}
|
|
203
|
+
<View style={{
|
|
204
|
+
backgroundColor: '#FFFFFF',
|
|
205
|
+
borderRadius: 32,
|
|
206
|
+
padding: 40,
|
|
207
|
+
marginBottom: 32,
|
|
208
|
+
// iOS tinted shadow
|
|
209
|
+
shadowColor: colors.blue, shadowOffset: { width: 0, height: 15 },
|
|
210
|
+
shadowOpacity: 0.2, shadowRadius: 30,
|
|
211
|
+
// Android tinted shadow (Requires Android 9+)
|
|
212
|
+
elevation: 10, shadowColor: colors.blue,
|
|
213
|
+
}}>
|
|
214
|
+
<Text style={{ fontFamily: 'Nunito-Bold', fontSize: 28, color: colors.textDark, marginBottom: 16 }}>
|
|
215
|
+
Calm & Airy
|
|
216
|
+
</Text>
|
|
217
|
+
<Text style={{ fontFamily: 'Nunito-Regular', fontSize: 16, lineHeight: 26, color: colors.textDark, opacity: 0.8 }}>
|
|
218
|
+
Generous whitespace and soft corners prevent the desaturated colors from feeling muddy.
|
|
219
|
+
</Text>
|
|
220
|
+
</View>
|
|
221
|
+
|
|
222
|
+
{/* Pastel Button */}
|
|
223
|
+
<TouchableOpacity style={{
|
|
224
|
+
backgroundColor: colors.blue,
|
|
225
|
+
borderRadius: 20,
|
|
226
|
+
paddingVertical: 20,
|
|
227
|
+
alignItems: 'center'
|
|
228
|
+
}}>
|
|
229
|
+
<Text style={{ fontFamily: 'Nunito-Bold', fontSize: 18, color: '#2B5563' }}>
|
|
230
|
+
Gentle Action
|
|
231
|
+
</Text>
|
|
232
|
+
</TouchableOpacity>
|
|
233
|
+
|
|
234
|
+
</ScrollView>
|
|
235
|
+
);
|
|
236
|
+
};
|
|
237
|
+
```
|
|
238
|
+
- Make sure you are using a soft, non-pure-white background (`#FFFBF7`) so that pure `#FFFFFF` cards pop nicely against it without harsh borders.
|
|
239
|
+
- Tinted shadows work on Android 9+ via `shadowColor` combined with `elevation`.
|
|
240
|
+
|
|
241
|
+
### Jetpack Compose
|
|
242
|
+
```kotlin
|
|
243
|
+
@Composable
|
|
244
|
+
fun SoftPastelScreen() {
|
|
245
|
+
val bg = Color(0xFFFFFBF7)
|
|
246
|
+
val blue = Color(0xFFAEC6CF)
|
|
247
|
+
val textDark = Color(0xFF4A4A4A)
|
|
248
|
+
|
|
249
|
+
Column(
|
|
250
|
+
modifier = Modifier.fillMaxSize().background(bg).verticalScroll(rememberScrollState()).padding(24.dp)
|
|
251
|
+
) {
|
|
252
|
+
// Pastel Card
|
|
253
|
+
Box(
|
|
254
|
+
modifier = Modifier
|
|
255
|
+
.fillMaxWidth()
|
|
256
|
+
.shadow(
|
|
257
|
+
elevation = 20.dp,
|
|
258
|
+
shape = RoundedCornerShape(32.dp),
|
|
259
|
+
ambientColor = blue, // Tinted shadow
|
|
260
|
+
spotColor = blue
|
|
261
|
+
)
|
|
262
|
+
.background(Color.White, RoundedCornerShape(32.dp))
|
|
263
|
+
.padding(40.dp)
|
|
264
|
+
) {
|
|
265
|
+
Column {
|
|
266
|
+
Text(
|
|
267
|
+
text = "Calm & Airy",
|
|
268
|
+
fontSize = 28.sp,
|
|
269
|
+
fontWeight = FontWeight.Bold,
|
|
270
|
+
color = textDark,
|
|
271
|
+
fontFamily = FontFamily.SansSerif // Replace with Nunito
|
|
272
|
+
)
|
|
273
|
+
Spacer(Modifier.height(16.dp))
|
|
274
|
+
Text(
|
|
275
|
+
text = "Generous whitespace and soft corners.",
|
|
276
|
+
fontSize = 16.sp,
|
|
277
|
+
lineHeight = 26.sp,
|
|
278
|
+
color = textDark.copy(alpha = 0.8f),
|
|
279
|
+
fontFamily = FontFamily.SansSerif
|
|
280
|
+
)
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
Spacer(Modifier.height(32.dp))
|
|
285
|
+
|
|
286
|
+
// Pastel Button
|
|
287
|
+
Button(
|
|
288
|
+
onClick = { },
|
|
289
|
+
colors = ButtonDefaults.buttonColors(containerColor = blue, contentColor = Color(0xFF2B5563)),
|
|
290
|
+
shape = RoundedCornerShape(20.dp),
|
|
291
|
+
modifier = Modifier.fillMaxWidth().height(60.dp),
|
|
292
|
+
elevation = null
|
|
293
|
+
) {
|
|
294
|
+
Text("Gentle Action", fontSize = 18.sp, fontWeight = FontWeight.Bold)
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
- The `shadow` modifier in Compose takes `ambientColor` and `spotColor`. Set both to your pastel accent color to achieve the soft tinted glow.
|
|
300
|
+
|
|
301
|
+
## Do's and Don'ts
|
|
302
|
+
- **DO**: Use illustrative assets that match the pastel vibe (flat vectors, soft gradients).
|
|
303
|
+
- **DON'T**: Use stark black borders, sharp corners, or high-saturation primary colors.
|
|
304
|
+
|
|
305
|
+
## Limitations
|
|
306
|
+
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
|
|
307
|
+
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
|