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,262 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: card-based-design
|
|
3
|
+
description: Web and App implementation guide for Card-Based Design. Trigger when user wants information cards, Pinterest-style layouts, and bite-sized content containers.
|
|
4
|
+
date_added: "2026-06-17"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Card-Based Design
|
|
11
|
+
|
|
12
|
+
> "Bite-sized consumption. Encapsulating discrete pieces of information into distinct visual containers."
|
|
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. **Encapsulation**: Every card is self-contained. It has an image, a title, a short description, and usually an action (like a button or a 'like' icon).
|
|
20
|
+
2. **Responsive Flow**: Cards easily reflow on different screen sizes (from a 4-column grid on desktop to a single column on mobile).
|
|
21
|
+
3. **Clear Boundaries**: Cards must visually pop off the background.
|
|
22
|
+
|
|
23
|
+
## Visual DNA
|
|
24
|
+
- **Colors**: Very flexible. The background should be slightly darker or distinct from the card color. **Sophisticated Neutral** works well for a premium feel.
|
|
25
|
+
- **Typography**: Clear hierarchy within the card (Header, Subheader, Body).
|
|
26
|
+
- **Styling**: Standard `border-radius: 8px` and a medium drop shadow.
|
|
27
|
+
|
|
28
|
+
## Web Implementation
|
|
29
|
+
- CSS Grid with `auto-fit` or a Masonry layout.
|
|
30
|
+
- **CSS Example**:
|
|
31
|
+
```css
|
|
32
|
+
body {
|
|
33
|
+
background-color: #f0f2f5; /* Standard app background */
|
|
34
|
+
padding: 40px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.card-grid {
|
|
38
|
+
display: grid;
|
|
39
|
+
/* Auto-responsive magic */
|
|
40
|
+
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
|
|
41
|
+
gap: 24px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.card {
|
|
45
|
+
background: #ffffff;
|
|
46
|
+
border-radius: 12px;
|
|
47
|
+
overflow: hidden; /* Keep images inside the rounded corners */
|
|
48
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.08);
|
|
49
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
50
|
+
display: flex;
|
|
51
|
+
flex-direction: column;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.card:hover {
|
|
55
|
+
transform: translateY(-4px);
|
|
56
|
+
box-shadow: 0 8px 24px rgba(0,0,0,0.12);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.card-image {
|
|
60
|
+
width: 100%;
|
|
61
|
+
height: 200px;
|
|
62
|
+
object-fit: cover;
|
|
63
|
+
border-bottom: 1px solid #eee;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.card-content {
|
|
67
|
+
padding: 20px;
|
|
68
|
+
flex-grow: 1; /* Pushes footer to the bottom */
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.card-footer {
|
|
72
|
+
padding: 16px 20px;
|
|
73
|
+
border-top: 1px solid #eee;
|
|
74
|
+
display: flex;
|
|
75
|
+
justify-content: space-between;
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## App Implementation
|
|
80
|
+
|
|
81
|
+
### SwiftUI
|
|
82
|
+
```swift
|
|
83
|
+
struct ContentCard: View {
|
|
84
|
+
var body: some View {
|
|
85
|
+
VStack(alignment: .leading, spacing: 0) {
|
|
86
|
+
// Image Area
|
|
87
|
+
Rectangle()
|
|
88
|
+
.fill(Color.gray.opacity(0.2))
|
|
89
|
+
.frame(height: 160)
|
|
90
|
+
|
|
91
|
+
// Content Area
|
|
92
|
+
VStack(alignment: .leading, spacing: 8) {
|
|
93
|
+
Text("Card Title")
|
|
94
|
+
.font(.headline)
|
|
95
|
+
Text("A brief description of the content inside this discrete card container.")
|
|
96
|
+
.font(.subheadline)
|
|
97
|
+
.foregroundColor(.secondary)
|
|
98
|
+
.lineLimit(2)
|
|
99
|
+
}
|
|
100
|
+
.padding(16)
|
|
101
|
+
}
|
|
102
|
+
.background(Color.white)
|
|
103
|
+
.cornerRadius(12)
|
|
104
|
+
// Clean, subtle drop shadow
|
|
105
|
+
.shadow(color: Color.black.opacity(0.08), radius: 12, x: 0, y: 4)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// In your view:
|
|
110
|
+
// LazyVGrid(columns: [GridItem(.adaptive(minimum: 160), spacing: 16)]) { ... }
|
|
111
|
+
```
|
|
112
|
+
- `VStack` inside a background with `.cornerRadius` and `.shadow` is the standard.
|
|
113
|
+
- Use `LazyVGrid` with `.adaptive(minimum: 160)` to automatically create a multi-column card grid that flows perfectly on iPad or iPhone.
|
|
114
|
+
|
|
115
|
+
### Flutter
|
|
116
|
+
```dart
|
|
117
|
+
class ContentCard extends StatelessWidget {
|
|
118
|
+
@override
|
|
119
|
+
Widget build(BuildContext context) {
|
|
120
|
+
return Card(
|
|
121
|
+
elevation: 4, // Handles shadow natively
|
|
122
|
+
shadowColor: Colors.black.withOpacity(0.4),
|
|
123
|
+
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
|
|
124
|
+
clipBehavior: Clip.antiAlias, // Critical: stops images from bleeding over corners
|
|
125
|
+
child: Column(
|
|
126
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
127
|
+
mainAxisSize: MainAxisSize.min,
|
|
128
|
+
children: [
|
|
129
|
+
// Image Area
|
|
130
|
+
Container(
|
|
131
|
+
height: 160,
|
|
132
|
+
color: Colors.grey[300],
|
|
133
|
+
width: double.infinity,
|
|
134
|
+
),
|
|
135
|
+
// Content Area
|
|
136
|
+
Padding(
|
|
137
|
+
padding: const EdgeInsets.all(16.0),
|
|
138
|
+
child: Column(
|
|
139
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
140
|
+
children: const [
|
|
141
|
+
Text('Card Title', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18)),
|
|
142
|
+
SizedBox(height: 8),
|
|
143
|
+
Text(
|
|
144
|
+
'A brief description of the content inside this discrete card container.',
|
|
145
|
+
style: TextStyle(color: Colors.black54),
|
|
146
|
+
maxLines: 2,
|
|
147
|
+
overflow: TextOverflow.ellipsis,
|
|
148
|
+
),
|
|
149
|
+
],
|
|
150
|
+
),
|
|
151
|
+
),
|
|
152
|
+
],
|
|
153
|
+
),
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// In your view: Use GridView.builder for the layout
|
|
158
|
+
```
|
|
159
|
+
- The native `Card` widget does almost all the heavy lifting.
|
|
160
|
+
- **Critical fix**: You must set `clipBehavior: Clip.antiAlias` on the `Card`, otherwise the top corners of your images will peek outside the border radius.
|
|
161
|
+
|
|
162
|
+
### React Native
|
|
163
|
+
```jsx
|
|
164
|
+
const ContentCard = () => {
|
|
165
|
+
return (
|
|
166
|
+
<View style={styles.card}>
|
|
167
|
+
<View style={styles.imageArea} />
|
|
168
|
+
<View style={styles.contentArea}>
|
|
169
|
+
<Text style={styles.title}>Card Title</Text>
|
|
170
|
+
<Text style={styles.description} numberOfLines={2}>
|
|
171
|
+
A brief description of the content inside this discrete card container.
|
|
172
|
+
</Text>
|
|
173
|
+
</View>
|
|
174
|
+
</View>
|
|
175
|
+
);
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
const styles = StyleSheet.create({
|
|
179
|
+
card: {
|
|
180
|
+
backgroundColor: '#FFF',
|
|
181
|
+
borderRadius: 12,
|
|
182
|
+
shadowColor: '#000',
|
|
183
|
+
shadowOffset: { width: 0, height: 4 },
|
|
184
|
+
shadowOpacity: 0.08,
|
|
185
|
+
shadowRadius: 12,
|
|
186
|
+
elevation: 4,
|
|
187
|
+
margin: 8,
|
|
188
|
+
overflow: 'hidden', // Keeps image inside borders
|
|
189
|
+
},
|
|
190
|
+
imageArea: {
|
|
191
|
+
height: 160,
|
|
192
|
+
backgroundColor: '#E0E0E0',
|
|
193
|
+
},
|
|
194
|
+
contentArea: {
|
|
195
|
+
padding: 16,
|
|
196
|
+
},
|
|
197
|
+
title: {
|
|
198
|
+
fontSize: 18,
|
|
199
|
+
fontWeight: '600',
|
|
200
|
+
marginBottom: 8,
|
|
201
|
+
},
|
|
202
|
+
description: {
|
|
203
|
+
color: '#666',
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
// In your view: <FlatList numColumns={2} data={data} renderItem={...} />
|
|
207
|
+
```
|
|
208
|
+
- Wrap everything in a View with `borderRadius` and `overflow: 'hidden'`.
|
|
209
|
+
- `elevation: 4` provides the drop shadow on Android, while the `shadow*` props handle iOS.
|
|
210
|
+
- For a Pinterest/Masonry style (columns of different heights), you must use a third-party library like `react-native-masonry-list`, as `FlatList` cannot do varying row heights in columns.
|
|
211
|
+
|
|
212
|
+
### Jetpack Compose
|
|
213
|
+
```kotlin
|
|
214
|
+
@Composable
|
|
215
|
+
fun ContentCard() {
|
|
216
|
+
// ElevatedCard provides the shadow and shape natively
|
|
217
|
+
ElevatedCard(
|
|
218
|
+
elevation = CardDefaults.elevatedCardElevation(defaultElevation = 4.dp),
|
|
219
|
+
shape = RoundedCornerShape(12.dp),
|
|
220
|
+
colors = CardDefaults.elevatedCardColors(containerColor = Color.White),
|
|
221
|
+
modifier = Modifier.fillMaxWidth().padding(8.dp)
|
|
222
|
+
) {
|
|
223
|
+
Column {
|
|
224
|
+
// Image Area
|
|
225
|
+
Box(
|
|
226
|
+
modifier = Modifier
|
|
227
|
+
.fillMaxWidth()
|
|
228
|
+
.height(160.dp)
|
|
229
|
+
.background(Color.LightGray)
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
// Content Area
|
|
233
|
+
Column(modifier = Modifier.padding(16.dp)) {
|
|
234
|
+
Text(
|
|
235
|
+
text = "Card Title",
|
|
236
|
+
style = MaterialTheme.typography.titleMedium,
|
|
237
|
+
fontWeight = FontWeight.Bold
|
|
238
|
+
)
|
|
239
|
+
Spacer(Modifier.height(8.dp))
|
|
240
|
+
Text(
|
|
241
|
+
text = "A brief description of the content inside this discrete card container.",
|
|
242
|
+
style = MaterialTheme.typography.bodyMedium,
|
|
243
|
+
color = Color.Gray,
|
|
244
|
+
maxLines = 2,
|
|
245
|
+
overflow = TextOverflow.Ellipsis
|
|
246
|
+
)
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// In your view: LazyVerticalGrid(columns = GridCells.Adaptive(minSize = 160.dp)) { ... }
|
|
252
|
+
```
|
|
253
|
+
- `ElevatedCard` is the perfect Material 3 component for this. It handles clipping and shadows automatically.
|
|
254
|
+
- Use `GridCells.Adaptive(minSize = 160.dp)` in a `LazyVerticalGrid` to achieve an auto-flowing grid identical to CSS Grid `auto-fit`.
|
|
255
|
+
|
|
256
|
+
## Do's and Don'ts
|
|
257
|
+
- **DO**: Make the entire card clickable, not just the title or image.
|
|
258
|
+
- **DON'T**: Put too much text in a card. If the user has to scroll *within* a card, the card is too big.
|
|
259
|
+
|
|
260
|
+
## Limitations
|
|
261
|
+
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
|
|
262
|
+
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: claymorphism
|
|
3
|
+
description: Web and App implementation guide for Claymorphism. Trigger when user wants soft 3D elements, rounded shapes, and a playful, tactile appearance.
|
|
4
|
+
date_added: "2026-06-17"
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Claymorphism
|
|
11
|
+
|
|
12
|
+
> "Like interacting with a pristine, digital claymation set. Soft, bubbly, and incredibly approachable."
|
|
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. **Fluffy 3D Volume**: Elements look like inflated balloons or soft clay blocks.
|
|
20
|
+
2. **Double Inner Shadows**: The signature of claymorphism is an inset light shadow on the top-left and an inset dark shadow on the bottom-right, giving 3D volume to a solid shape.
|
|
21
|
+
3. **Continuous Curves**: Maximum border-radius. No sharp edges exist in this universe.
|
|
22
|
+
|
|
23
|
+
## Visual DNA
|
|
24
|
+
- **Colors**: Thrives on pastels and bright, friendly hues. **Desert Mirage**, **Earth-Grounded Elegance**, or custom pastel palettes work best.
|
|
25
|
+
- **Typography**: Playful, thick, rounded fonts (e.g., `Sniglet`, `Fredoka One`, `Nunito`).
|
|
26
|
+
- **Shapes**: 'Squicles' (squares with heavily rounded, continuous corners) and perfect circles.
|
|
27
|
+
|
|
28
|
+
## Web Implementation
|
|
29
|
+
- Distinct from Neumorphism: Claymorphism elements detach from the background (they have drop shadows) and use inner shadows to create volume, often using colors that contrast with the background.
|
|
30
|
+
- **CSS Example**:
|
|
31
|
+
```css
|
|
32
|
+
.clay-card {
|
|
33
|
+
background-color: #F8B4A6; /* Soft coral */
|
|
34
|
+
border-radius: 32px;
|
|
35
|
+
padding: 40px;
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
1. Outer drop shadow (detaches from background)
|
|
39
|
+
2. Inner top-left highlight (volume)
|
|
40
|
+
3. Inner bottom-right shadow (volume)
|
|
41
|
+
*/
|
|
42
|
+
box-shadow:
|
|
43
|
+
8px 8px 24px rgba(0, 0, 0, 0.15), /* Outer */
|
|
44
|
+
inset -8px -8px 16px rgba(0, 0, 0, 0.1), /* Inner dark */
|
|
45
|
+
inset 8px 8px 16px rgba(255, 255, 255, 0.4); /* Inner light */
|
|
46
|
+
|
|
47
|
+
transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1); /* Bouncy */
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.clay-card:hover {
|
|
51
|
+
transform: translateY(-5px) scale(1.02);
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## App Implementation
|
|
56
|
+
|
|
57
|
+
### SwiftUI
|
|
58
|
+
```swift
|
|
59
|
+
struct ClayCard: View {
|
|
60
|
+
@State private var isPressed = false
|
|
61
|
+
|
|
62
|
+
var body: some View {
|
|
63
|
+
VStack(spacing: 16) {
|
|
64
|
+
Image(systemName: "cloud.sun.fill")
|
|
65
|
+
.font(.system(size: 48))
|
|
66
|
+
.foregroundColor(.white)
|
|
67
|
+
Text("Claymorphic Card")
|
|
68
|
+
.font(.system(size: 20, weight: .bold, design: .rounded))
|
|
69
|
+
.foregroundColor(.white)
|
|
70
|
+
}
|
|
71
|
+
.padding(40)
|
|
72
|
+
.background(Color(red: 0.97, green: 0.71, blue: 0.65)) // Soft coral
|
|
73
|
+
.cornerRadius(32)
|
|
74
|
+
// Outer shadow — detaches from background
|
|
75
|
+
.shadow(color: .black.opacity(0.15), radius: 12, x: 8, y: 8)
|
|
76
|
+
// Inner highlight (top-left) — faked with overlay
|
|
77
|
+
.overlay(
|
|
78
|
+
RoundedRectangle(cornerRadius: 32)
|
|
79
|
+
.stroke(
|
|
80
|
+
LinearGradient(
|
|
81
|
+
colors: [.white.opacity(0.5), .clear, .black.opacity(0.1)],
|
|
82
|
+
startPoint: .topLeading,
|
|
83
|
+
endPoint: .bottomTrailing
|
|
84
|
+
),
|
|
85
|
+
lineWidth: 3
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
// Bouncy spring animation on tap
|
|
89
|
+
.scaleEffect(isPressed ? 0.95 : 1.0)
|
|
90
|
+
.animation(.interpolatingSpring(stiffness: 300, damping: 10), value: isPressed)
|
|
91
|
+
.onTapGesture { }
|
|
92
|
+
.simultaneousGesture(
|
|
93
|
+
DragGesture(minimumDistance: 0)
|
|
94
|
+
.onChanged { _ in isPressed = true }
|
|
95
|
+
.onEnded { _ in isPressed = false }
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
- The "clay" volume comes from a gradient stroke overlay: white on top-left, dark on bottom-right.
|
|
101
|
+
- Use `.interpolatingSpring(stiffness: 300, damping: 10)` for the bouncy feel — critical for clay aesthetics.
|
|
102
|
+
- Background color should be pastel/bright but NOT the same as the parent (unlike neumorphism).
|
|
103
|
+
|
|
104
|
+
### Flutter
|
|
105
|
+
```dart
|
|
106
|
+
class ClayCard extends StatefulWidget {
|
|
107
|
+
@override
|
|
108
|
+
State<ClayCard> createState() => _ClayCardState();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
class _ClayCardState extends State<ClayCard> with SingleTickerProviderStateMixin {
|
|
112
|
+
double _scale = 1.0;
|
|
113
|
+
|
|
114
|
+
@override
|
|
115
|
+
Widget build(BuildContext context) {
|
|
116
|
+
return GestureDetector(
|
|
117
|
+
onTapDown: (_) => setState(() => _scale = 0.95),
|
|
118
|
+
onTapUp: (_) => setState(() => _scale = 1.0),
|
|
119
|
+
onTapCancel: () => setState(() => _scale = 1.0),
|
|
120
|
+
child: AnimatedScale(
|
|
121
|
+
scale: _scale,
|
|
122
|
+
duration: const Duration(milliseconds: 200),
|
|
123
|
+
curve: Curves.elasticOut, // Bouncy clay feel
|
|
124
|
+
child: Container(
|
|
125
|
+
padding: const EdgeInsets.all(40),
|
|
126
|
+
decoration: BoxDecoration(
|
|
127
|
+
color: const Color(0xFFF8B4A6), // Soft coral
|
|
128
|
+
borderRadius: BorderRadius.circular(32),
|
|
129
|
+
boxShadow: [
|
|
130
|
+
// Outer shadow
|
|
131
|
+
BoxShadow(
|
|
132
|
+
color: Colors.black.withOpacity(0.15),
|
|
133
|
+
offset: const Offset(8, 8),
|
|
134
|
+
blurRadius: 24,
|
|
135
|
+
),
|
|
136
|
+
],
|
|
137
|
+
// Gradient border for the clay volume effect
|
|
138
|
+
border: GradientBorder(
|
|
139
|
+
gradient: LinearGradient(
|
|
140
|
+
colors: [
|
|
141
|
+
Colors.white.withOpacity(0.5),
|
|
142
|
+
Colors.transparent,
|
|
143
|
+
Colors.black.withOpacity(0.1),
|
|
144
|
+
],
|
|
145
|
+
begin: Alignment.topLeft,
|
|
146
|
+
end: Alignment.bottomRight,
|
|
147
|
+
),
|
|
148
|
+
width: 3,
|
|
149
|
+
),
|
|
150
|
+
),
|
|
151
|
+
child: Column(
|
|
152
|
+
mainAxisSize: MainAxisSize.min,
|
|
153
|
+
children: [
|
|
154
|
+
const Icon(Icons.wb_sunny, size: 48, color: Colors.white),
|
|
155
|
+
const SizedBox(height: 16),
|
|
156
|
+
const Text('Claymorphic Card',
|
|
157
|
+
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold,
|
|
158
|
+
color: Colors.white)),
|
|
159
|
+
],
|
|
160
|
+
),
|
|
161
|
+
),
|
|
162
|
+
),
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
- Use `Curves.elasticOut` or `Curves.bounceOut` for the spring animation — essential for the clay feeling.
|
|
168
|
+
- Gradient borders require a custom `ShapeDecoration` or a `Stack` with a gradient container behind the main container.
|
|
169
|
+
- Alternative for inner shadow: use `flutter_inset_box_shadow` package with light top-left and dark bottom-right insets.
|
|
170
|
+
|
|
171
|
+
### React Native
|
|
172
|
+
```jsx
|
|
173
|
+
const ClayCard = () => {
|
|
174
|
+
const scale = useRef(new Animated.Value(1)).current;
|
|
175
|
+
|
|
176
|
+
const pressIn = () => {
|
|
177
|
+
Animated.spring(scale, {
|
|
178
|
+
toValue: 0.95,
|
|
179
|
+
friction: 3, // Low friction = bouncy
|
|
180
|
+
tension: 100,
|
|
181
|
+
useNativeDriver: true,
|
|
182
|
+
}).start();
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const pressOut = () => {
|
|
186
|
+
Animated.spring(scale, {
|
|
187
|
+
toValue: 1,
|
|
188
|
+
friction: 3,
|
|
189
|
+
tension: 100,
|
|
190
|
+
useNativeDriver: true,
|
|
191
|
+
}).start();
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
return (
|
|
195
|
+
<Pressable onPressIn={pressIn} onPressOut={pressOut}>
|
|
196
|
+
<Animated.View style={{
|
|
197
|
+
transform: [{ scale }],
|
|
198
|
+
padding: 40,
|
|
199
|
+
backgroundColor: '#F8B4A6',
|
|
200
|
+
borderRadius: 32,
|
|
201
|
+
alignItems: 'center',
|
|
202
|
+
// Outer shadow
|
|
203
|
+
shadowColor: '#000',
|
|
204
|
+
shadowOffset: { width: 8, height: 8 },
|
|
205
|
+
shadowOpacity: 0.15,
|
|
206
|
+
shadowRadius: 12,
|
|
207
|
+
elevation: 8,
|
|
208
|
+
// Gradient border must be faked with a wrapper or SVG
|
|
209
|
+
borderWidth: 3,
|
|
210
|
+
borderColor: 'rgba(255,255,255,0.3)', // Simplified — top highlight
|
|
211
|
+
}}>
|
|
212
|
+
<Text style={{ fontSize: 48 }}>☀️</Text>
|
|
213
|
+
<Text style={{
|
|
214
|
+
fontSize: 20, fontWeight: '700', color: '#FFF', marginTop: 16,
|
|
215
|
+
}}>
|
|
216
|
+
Claymorphic Card
|
|
217
|
+
</Text>
|
|
218
|
+
</Animated.View>
|
|
219
|
+
</Pressable>
|
|
220
|
+
);
|
|
221
|
+
};
|
|
222
|
+
```
|
|
223
|
+
- Use `Animated.spring` with low `friction` (3-5) for the signature bouncy clay behavior.
|
|
224
|
+
- Gradient borders aren't possible natively — use a solid white-tinted border as a simplified approximation, or wrap in an `expo-linear-gradient` View.
|
|
225
|
+
|
|
226
|
+
### Jetpack Compose
|
|
227
|
+
```kotlin
|
|
228
|
+
@Composable
|
|
229
|
+
fun ClayCard() {
|
|
230
|
+
var isPressed by remember { mutableStateOf(false) }
|
|
231
|
+
val scale by animateFloatAsState(
|
|
232
|
+
targetValue = if (isPressed) 0.95f else 1f,
|
|
233
|
+
animationSpec = spring(dampingRatio = 0.3f, stiffness = 300f),
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
Box(
|
|
237
|
+
modifier = Modifier
|
|
238
|
+
.graphicsLayer { scaleX = scale; scaleY = scale }
|
|
239
|
+
.shadow(8.dp, RoundedCornerShape(32.dp))
|
|
240
|
+
.clip(RoundedCornerShape(32.dp))
|
|
241
|
+
.background(Color(0xFFF8B4A6))
|
|
242
|
+
.border(
|
|
243
|
+
3.dp,
|
|
244
|
+
Brush.linearGradient(
|
|
245
|
+
colors = listOf(
|
|
246
|
+
Color.White.copy(alpha = 0.5f),
|
|
247
|
+
Color.Transparent,
|
|
248
|
+
Color.Black.copy(alpha = 0.1f),
|
|
249
|
+
),
|
|
250
|
+
start = Offset.Zero,
|
|
251
|
+
end = Offset.Infinite,
|
|
252
|
+
),
|
|
253
|
+
RoundedCornerShape(32.dp),
|
|
254
|
+
)
|
|
255
|
+
.padding(40.dp)
|
|
256
|
+
.pointerInput(Unit) {
|
|
257
|
+
detectTapGestures(
|
|
258
|
+
onPress = {
|
|
259
|
+
isPressed = true
|
|
260
|
+
tryAwaitRelease()
|
|
261
|
+
isPressed = false
|
|
262
|
+
},
|
|
263
|
+
)
|
|
264
|
+
},
|
|
265
|
+
contentAlignment = Alignment.Center,
|
|
266
|
+
) {
|
|
267
|
+
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
|
268
|
+
Icon(Icons.Default.WbSunny, tint = Color.White,
|
|
269
|
+
modifier = Modifier.size(48.dp))
|
|
270
|
+
Spacer(Modifier.height(16.dp))
|
|
271
|
+
Text("Claymorphic Card",
|
|
272
|
+
fontSize = 20.sp, fontWeight = FontWeight.Bold, color = Color.White)
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
- Use `spring(dampingRatio = 0.3f)` — low damping = bouncy. This is the core of the clay feeling.
|
|
278
|
+
- Gradient borders work natively in Compose via `Modifier.border(width, Brush.linearGradient(...), shape)`.
|
|
279
|
+
- Use `Modifier.clip()` before `.background()` to ensure the rounded corners clip content properly.
|
|
280
|
+
|
|
281
|
+
## Do's and Don'ts
|
|
282
|
+
- **DO**: Use highly bouncy, spring-based animations to reinforce the soft, physical nature of the "clay."
|
|
283
|
+
- **DON'T**: Use thin, delicate fonts. They will get lost against the heavy, voluminous UI elements.
|
|
284
|
+
|
|
285
|
+
## Limitations
|
|
286
|
+
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
|
|
287
|
+
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
|