{"id":"2baf9890-e5fc-4337-ba90-3b63bcc3c13c","shortId":"8mZNhh","kind":"skill","title":"craft-site","tagline":"Craft CMS 5 front-end Twig development — atomic design, template architecture, components, Vite buildchain. Covers atoms/molecules/organisms, props/extends/block patterns, layout chains, view routing, content builders, image presets, Tailwind named-key collections, multi-brand CS","description":"# Craft CMS 5 — Front-End Twig (Atomic Design)\n\nAtomic design system patterns for Craft CMS 5 site templates. Vanilla Twig —\nno module dependency. Works with any Craft 5 project.\n\nThis skill is scoped to **front-end template architecture** — component design,\nrouting, composition, theming, and buildchain. For extending Craft (plugins,\nmodules, PHP), see the `craftcms` skill.\n\n## Companion Skills — Always Load Together\n\nWhen this skill triggers, also load:\n\n- **`craft-twig-guidelines`** — Twig coding standards: variable naming, null handling, whitespace control, include isolation, Craft helpers. Required for any Twig code.\n- **`craft-content-modeling`** — Sections, entry types, fields, Matrix, relations. Required when deciding what content to query or how templates access data.\n- **`ddev`** — All commands run through DDEV. Required for running Vite, npm, and Craft CLI commands.\n\n## Documentation\n\n- Twig in Craft: https://craftcms.com/docs/5.x/development/twig.html\n- Template tags: https://craftcms.com/docs/5.x/reference/twig/tags.html\n- Template functions: https://craftcms.com/docs/5.x/reference/twig/functions.html\n- Twig 3 docs: https://twig.symfony.com/doc/3.x/\n\nUse `WebFetch` on specific doc pages when a reference file doesn't cover enough detail.\n\n## Common Pitfalls (Cross-Cutting)\n\n- Missing `only` on `{% include %}` — ambient variables leak in silently.\n- Variant logic via conditionals (`{% if variant == 'x' %}`) instead of extends/block.\n- Naming atoms by parent context (`hero-button`) instead of visual treatment (`button--primary`).\n- `utilities` prop used as override — it's additive. Override via named-slot merge.\n- Queries inside views — views receive data, they don't fetch it.\n- Missing `.eagerly()` on relation fields in views — causes N+1 queries.\n- Missing `devMode` fallback in builders for unknown block types.\n- Hardcoded Tailwind colors (`bg-yellow-600`) instead of brand tokens (`bg-brand-accent`).\n- Mixing buttons and links — buttons are actions (resolve to `<a>`, `<button>`, or `<span>` from props), links are navigation (always `<a>`). Separate atom categories.\n- Tracking/analytics inside components — decouple to data attributes at view/page level.\n- Forgetting `project-config/touch` after editing YAML outside the CP — Git pulls, manual edits, and merge conflict resolution don't update `dateModified`. Run `ddev craft project-config/touch` then `ddev craft up`, or `craft up` on other environments won't detect the change.\n\n## Reference Files\n\nRead the relevant reference file(s) for your task. Multiple files often apply together.\n\n**Task examples:**\n- \"Build a new card component\" → read `atomic-patterns.md` + `composition-patterns.md` + `component-inventory.md` + `tailwind-conventions.md`\n- \"Set up a new project's template structure\" → read `boilerplate-routing.md` + `component-inventory.md`\n- \"Add a content builder for a Matrix field\" → read `boilerplate-routing.md` + `composition-patterns.md`\n- \"Handle responsive images\" → read `image-presets.md` + `plugins/image-optimize.md`\n- \"Add multi-brand theming\" → read `tailwind-conventions.md`\n- \"Decide between Alpine and Vue for a feature\" → read `javascript-boundaries.md`\n- \"Compose Tailwind classes without conflicts\" → read `tailwind-conventions.md` + `twig-collections.md`\n- \"Understand atomic design methodology\" → read `atomic-design.md`\n- \"Set up Vite + Tailwind in a new Craft project\" → read `vite-buildchain.md`\n- \"Debug why assets aren't loading in production\" → read `vite-buildchain.md`\n- \"Install GTM/analytics/CMP in a Craft project\" → read `third-party-integration.md`\n- \"Configure SEOMatic for a section\" → read `plugins/seomatic.md`\n- \"Set up Blitz caching with Cloudflare\" → read `plugins/blitz.md`\n- \"Add a form to a page\" → read `plugins/formie.md`\n- \"Configure CKEditor with nested entries\" → read `plugins/ckeditor.md`\n- \"Build a navigation menu\" → read `plugins/navigation.md`\n- \"Add a link field to a component\" → read `plugins/hyper.md`\n- \"Set up redirects for a site\" → read `plugins/retour.md`\n- \"Add recurring/repeating dates to entries\" → read `plugins/timeloop.md`\n- \"Create a JSON API endpoint\" → read `plugins/element-api.md`\n- \"Debug N+1 queries in templates\" → read `plugins/elements-panel.md`\n- \"Run a security audit\" → read `plugins/sherlock.md`\n- \"Embed a YouTube/Vimeo video as an asset\" → read `plugins/embedded-assets.md`\n- \"Configure email delivery via SES\" → read `plugins/amazon-ses.md` + `third-party-integration.md`\n- \"Build a language switcher\" → read `multi-site-patterns.md`\n- \"Add login/registration to the front end\" → read `auth-flows.md`\n- \"Build a user profile edit page\" → read `auth-account.md`\n- \"Set up password reset flow\" → read `auth-flows.md`\n- \"Set up hreflang tags\" → read `multi-site-patterns.md`\n- \"Plan a multi-language site architecture\" → read `multi-site-patterns.md`\n- \"Add live search without JavaScript\" → read `plugins/sprig.md`\n- \"Build reactive filtering or load-more\" → read `plugins/sprig.md`\n- \"Import data from an external feed\" → read `plugins/feed-me.md`\n- \"Set up responsive images with Imager-X\" → read `plugins/imager-x.md`\n- \"Build a search page\" → read `search.md`\n- \"Configure search settings\" → read `search.md` (Search Configuration)\n- \"Rebuild the search index\" → read `search.md` (Rebuilding)\n- \"Create an RSS feed\" → read `feeds.md`\n- \"Build an XML sitemap\" → read `feeds.md` (XML Sitemap)\n- \"Create a JSON Feed\" → read `feeds.md` (JSON Feed)\n- \"Set up a headless Craft CMS with Next.js\" → read `headless.md`\n- \"Fix GraphQL preview tokens\" → read `headless.md`\n- \"Consume Craft GraphQL API from a front-end framework\" → read `headless.md`\n- \"Use entry.render() for reusable card components\" → read `element-partials.md`\n- \"Set up _partials/ templates for entries\" → read `element-partials.md`\n- \"Render Matrix blocks with partials\" → read `element-partials.md`\n\n\n| Reference | Scope |\n|-----------|-------|\n| `references/atomic-design.md` | Methodology: Brad Frost's atomic design principles, 5-to-3 tier compression, composability, context-agnostic naming, classification problem, decompose-downward workflow. Technology-independent. |\n| `references/atomic-patterns.md` | Individual component construction: props/extends/block pattern, variant file mechanics, button/link/text/icon atom implementations |\n| `references/composition-patterns.md` | Component composition: molecule pattern, organism pattern, structural embed pattern, include/extends/embed decision table, calling conventions, creating new components |\n| `references/component-inventory.md` | Classification methodology: decision tree, naming conventions, file naming, props design, scaffold guidelines, tier promotion, audit checklist |\n| `references/boilerplate-routing.md` | Template chain: layout hierarchy, Craft section template paths, global variables, routers, views, content builders, directory structure |\n| `references/tailwind-conventions.md` | Class composition: named-key collections, standard key names, `utilities` prop, variant-based dark mode, spacing preference. Assumes Tailwind CSS — adapt patterns to your CSS framework. |\n| `references/vite-buildchain.md` | Craft CMS Vite setup: nystudio107 plugin bridge, `config/vite.php`, `vite.config.ts`, `craft.vite.script()`, conditional per-page loading, Tailwind v4 integration, DDEV configuration |\n| `references/image-presets.md` | Image handling: single atom with presets, srcset/sizes, ImageOptimize vs Craft Cloud, hosting strategies |\n| `references/javascript-boundaries.md` | JS decision tree: Twig → Alpine/DataStar → Vue, mount points, data handoff, coexistence rules |\n| `references/twig-collections.md` | `collect()` method reference: creating, accessing, transforming, filtering, sorting, slicing, arrow functions |\n| `references/third-party-integration.md` | Script loading order, CMP (UserCentrics/CookieBot), GTM/sGTM data layer, analytics (Fathom/Plausible), AWS SES transport, n8n webhooks, Blitz compatibility, full head template example |\n| `references/multi-site-patterns.md` | Language switchers, hreflang tags, site architectures (subfolder/domain/subdomain/multi-brand), cross-site queries, static translations, site-specific templates, multi-site forms, site detection |\n| `references/auth-flows.md` | Front-end authentication forms: login, registration, password reset, set new password |\n| `references/auth-account.md` | Account management: edit profile, email verification, navigation partial, access control tags, user session helpers, GeneralConfig auth settings |\n| `references/search.md` | Search: syntax, Twig queries, configuration, indexing, rebuilding, score and ranking |\n| `references/feeds.md` | Feeds: RSS 2.0, Atom, JSON Feed, XML sitemap, custom routes, date filters |\n| `references/headless.md` | Headless & hybrid: headlessMode, GraphQL API, CORS, preview tokens, Next.js/Nuxt/Astro integration |\n| `references/element-partials.md` | Element partials: entry.render(), _partials/ directory, template lookup, custom variables, eager loading in partials |\n\n### Plugin References\n\nDetailed configuration, Twig API, and pitfalls for Craft plugins. Located in `references/plugins/`.\n\n| Reference | Plugin | Key Surface |\n|-----------|--------|-------------|\n| `references/plugins/seomatic.md` | SEOMatic (nystudio107) | Meta cascade, Twig get/set API, JSON-LD, custom element SEO bundles, sitemaps, GraphQL |\n| `references/plugins/blitz.md` | Blitz (putyourlightson) | Refresh modes, Twig dynamic content, driver architecture (storage/purger/deployer), Nginx rewrite, Cloudflare integration |\n| `references/plugins/formie.md` | Formie (verbb) | Form rendering (one-line/granular), theme config for Tailwind, submission querying, hooks, integrations |\n| `references/plugins/image-optimize.md` | ImageOptimize (nystudio107) | OptimizedImages field, `imgTag()`/`pictureTag()` builders, loading strategies, transform methods, console commands |\n| `references/plugins/ckeditor.md` | CKEditor (craftcms) | Field settings (toolbar, headings, image mode), nested entries with chunk rendering and value helpers, image mode (img vs entries), link configuration, GraphQL Mode, ES-module custom plugins, HTML Purifier, Redactor migration |\n| `references/plugins/sprig.md` | Sprig (putyourlightson) | Reactive Twig components (htmx), live search, load more, pagination, filtering, form submissions without JS |\n| `references/plugins/colour-swatches.md` | Colour Swatches (craftpulse) | Palette config, multi-colour swatches, Tailwind class mapping, Twig model API |\n| `references/plugins/password-policy.md` | Password Policy (craftpulse) | Validation rules, HIBP check, retention/expiry, console commands, recommended settings |\n| `references/plugins/hyper.md` | Hyper (verbb) | Link types, `getLinkAttributes()`, `getText()`, single/multi-link, element access, button atom integration |\n| `references/plugins/retour.md` | Retour (nystudio107) | Redirect types (exact/regex), 404 tracking, CSV import, auto slug-change redirects, config |\n| `references/plugins/navigation.md` | Navigation (verbb) | Node querying, custom rendering, active states, custom fields on nodes, GraphQL |\n| `references/plugins/typogrify.md` | Typogrify (nystudio107) | `\\|typogrify`, `\\|widont`, `\\|truncateOnWord`, smart quotes, widow prevention |\n| `references/plugins/cache-igniter.md` | Cache Igniter (putyourlightson) | GlobalPing warmer, geographic locations, refresh delay, Blitz companion |\n| `references/plugins/knock-knock.md` | Knock Knock (verbb) | Staging password protection, environment-aware config, URL exclusions |\n| `references/plugins/timeloop.md` | Timeloop (craftpulse) | Repeating date field, `craft.timeloop` variable API, `recurringDates()` function, GraphQL, period frequencies |\n| `references/plugins/element-api.md` | Element API (craftcms) | JSON API via config file, Fractal transformers, endpoint routing, pagination, caching |\n| `references/plugins/elements-panel.md` | Elements Panel (putyourlightson) | Debug toolbar panels for element population counts, duplicate detection, eager-loading opportunities |\n| `references/plugins/sherlock.md` | Sherlock (putyourlightson) | Security scanning, HTTP headers, CMS config checks, scheduled scans, IP restriction, monitoring |\n| `references/plugins/embedded-assets.md` | Embedded Assets (spicyweb) | oEmbed as first-class assets, `craft.embeddedAssets.get()`, iframe customization, GraphQL |\n| `references/plugins/amazon-ses.md` | Amazon SES (putyourlightson) | SES mail transport adapter, AWS credential config, SNS bounce tracking |\n| `references/plugins/feed-me.md` | Feed Me (craftcms) | Data import from XML/JSON/CSV, field mapping, duplicate handling, CLI automation |\n| `references/plugins/imager-x.md` | Imager-X (spacecrafttechnologies) | Advanced image transforms, batch generation, named presets, effects, optimizers, external storage |\n\n\n## Component System Conventions\n\nOne canonical component system across all projects. Atoms are context-agnostic — always named by visual treatment, never by parent. HTML element type is resolved from props (`url` → `<a>`, `type` → `<button>`, fallback → `<span>`).\n\nExternal link detection is derived from the URL, never passed as a prop. Components auto-apply `target=\"_blank\"`, `rel=\"noopener noreferrer\"`, external icon, and sr-only text when a URL is external.\n\nFontAwesome is the universal icon system. Icons are passed as FA class strings.\n\nVisual variants use extends/block — base template defines structure, variant overrides classes. Never use conditional logic to switch between variant styles. For structural skeletons with content slots, use `{% embed %}` — see `composition-patterns.md`.\n\nImage handling uses a single atom with config-driven presets, not separate variant files per context.\n\n## CSS & Theming Conventions\n\nThis skill assumes Tailwind CSS for class composition examples. Adapt patterns\nto your CSS framework — the architectural principles (named keys, additive\nutilities, semantic tokens) are framework-agnostic.\n\nClass collections use named keys per style concern — this is the primary mechanism for preventing conflicts. The `utilities` prop is additive (extending), not overriding. Override specific concerns via named-slot merge.\n\nMulti-brand theming uses CSS custom properties activated by `data-brand=\"{{ currentSite.handle }}\"` on `<html>`. Components reference semantic Tailwind classes (`bg-brand-accent`) resolved via CSS variables. Template-level brand overrides only exist when the HTML structure itself differs between brands — not for color/font/spacing differences.\n\nToken naming follows three layers: primitives (`--brand-{color}-{shade}`), semantics (`--brand-{purpose}`), and framework mapping (`--color-brand-{purpose}`).\n\nTailwind v4 cascade layers don't fix class conflicts within the same utilities layer. Named-key collections remain necessary.\n\n## Routing Conventions\n\nPHP handles data, Twig handles presentation. Views receive data through includes — they never query it themselves.\n\n`collect()` is used for both props and class building. The full Collection API is available in Twig via Craft.\n\nThe JS boundary follows a decision tree: Twig is the default → Alpine/DataStar for UI state → Vue for application state.","tags":["craft","site","craftcms","claude","skills","michtio","agent-skills","claude-code","claude-code-plugin","claude-code-skills","claude-skills","content-modeling"],"capabilities":["skill","source-michtio","skill-craft-site","topic-agent-skills","topic-claude-code","topic-claude-code-plugin","topic-claude-code-skills","topic-claude-skills","topic-content-modeling","topic-craft-cms","topic-craft-cms-5","topic-craftcms","topic-ddev","topic-php","topic-twig"],"categories":["craftcms-claude-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/michtio/craftcms-claude-skills/craft-site","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add michtio/craftcms-claude-skills","source_repo":"https://github.com/michtio/craftcms-claude-skills","install_from":"skills.sh"}},"qualityScore":"0.471","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 42 github stars · SKILL.md body (15,236 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:58:16.895Z","embedding":null,"createdAt":"2026-04-18T22:19:35.433Z","updatedAt":"2026-05-18T18:58:16.895Z","lastSeenAt":"2026-05-18T18:58:16.895Z","tsv":"'+1':277,562 '-3':774 '/doc/3.x/':189 '/docs/5.x/development/twig.html':173 '/docs/5.x/reference/twig/functions.html':183 '/docs/5.x/reference/twig/tags.html':178 '/granular':1129 '/nuxt/astro':1055 '/touch':336,361 '2.0':1034 '3':185 '404':1252 '5':6,42,56,68,772 '600':294 'accent':302,1643 'access':150,936,1011,1242 'account':1003 'across':1437 'action':309 'activ':1269,1628 'adapt':877,1393,1569 'add':416,433,508,529,546,597,635 'addit':250,1580,1608 'advanc':1419 'agnost':780,1444,1587 'alpin':442 'alpine/datastar':923,1754 'also':106 'alway':99,318,1445 'amazon':1387 'ambient':214 'analyt':952 'api':556,730,1049,1076,1096,1219,1319,1327,1330,1736 'appli':391,1479 'applic':1760 'architectur':15,79,632,971,1115,1576 'aren':478 'arrow':941 'asset':477,580,1374,1381 'assum':874,1562 'atom':12,47,49,230,320,459,769,801,908,1035,1244,1440,1545 'atomic-design.md':463 'atomic-patterns.md':401 'atoms/molecules/organisms':20 'attribut':328 'audit':571,836 'auth':1018 'auth-account.md':612 'auth-flows.md':604,619 'authent':993 'auto':1256,1478 'auto-appli':1477 'autom':1413 'avail':1738 'aw':954,1394 'awar':1307 'base':869,1514 'batch':1422 'bg':292,300,1641 'bg-brand-acc':299,1640 'bg-yellow':291 'blank':1481 'blitz':502,959,1107,1296 'block':286,757 'boilerplate-routing.md':414,425 'bounc':1398 'boundari':1745 'brad':766 'brand':38,297,301,436,1622,1632,1642,1651,1662,1673,1677,1684 'bridg':890 'build':395,523,591,605,642,669,695,1732 'buildchain':18,86 'builder':28,283,419,852,1145 'bundl':1103 'button':236,241,304,307,1243 'button/link/text/icon':800 'cach':503,1287,1339 'call':816 'canon':1434 'card':398,743 'cascad':1093,1688 'categori':321 'caus':275 'chain':24,840 'chang':376,1259 'check':1227,1366 'checklist':837 'chunk':1164 'ckeditor':517,1153 'class':452,856,1215,1380,1508,1520,1566,1588,1639,1693,1731 'classif':782,822 'cli':165,1412 'cloud':915 'cloudflar':505,1119 'cmp':947 'cms':5,41,55,716,885,1364 'code':113,129 'coexist':929 'collect':35,861,932,1589,1703,1724,1735 'color':290,1674,1683 'color-brand':1682 'color/font/spacing':1665 'colour':1205,1212 'command':154,166,1151,1230 'common':205 'companion':97,1297 'compat':960 'compon':16,80,324,399,535,744,793,804,820,1192,1430,1435,1476,1635 'component-inventory.md':403,415 'compos':450,777 'composit':83,805,857,1567 'composition-patterns.md':402,426,1539 'compress':776 'concern':1595,1614 'condit':222,894,1523 'config':335,360,1131,1209,1261,1308,1332,1365,1396,1548 'config-driven':1547 'config/vite.php':891 'configur':493,516,583,675,681,903,1025,1074,1175 'conflict':349,454,1603,1694 'consol':1150,1229 'construct':794 'consum':727 'content':27,132,144,418,851,1113,1534 'context':233,779,1443,1556 'context-agnost':778,1442 'control':120,1012 'convent':817,827,1432,1559,1707 'cor':1050 'count':1350 'cover':19,202 'cp':342 'craft':2,4,40,54,67,89,109,123,131,164,170,357,364,367,471,489,715,728,843,884,914,1080,1742 'craft-content-model':130 'craft-sit':1 'craft-twig-guidelin':108 'craft.embeddedassets.get':1382 'craft.timeloop':1317 'craft.vite.script':893 'craftcm':95,1154,1328,1403 'craftcms.com':172,177,182 'craftcms.com/docs/5.x/development/twig.html':171 'craftcms.com/docs/5.x/reference/twig/functions.html':181 'craftcms.com/docs/5.x/reference/twig/tags.html':176 'craftpuls':1207,1223,1313 'creat':553,689,703,818,935 'credenti':1395 'cross':208,974 'cross-cut':207 'cross-sit':973 'cs':39 'css':876,881,1557,1564,1573,1625,1646 'csv':1254 'currentsite.handle':1633 'custom':1040,1065,1100,1181,1267,1271,1384,1626 'cut':209 'dark':870 'data':151,262,327,652,927,950,1404,1631,1710,1716 'data-brand':1630 'date':548,1042,1315 'datemodifi':354 'ddev':152,157,356,363,902 'debug':475,560,1344 'decid':142,440 'decis':814,824,920,1748 'decompos':785 'decompose-downward':784 'decoupl':325 'default':1753 'defin':1516 'delay':1295 'deliveri':585 'depend':63 'deriv':1467 'design':13,48,50,81,460,770,831 'detail':204,1073 'detect':374,988,1352,1465 'develop':11 'devmod':280 'differ':1660,1666 'directori':853,1062 'doc':186,194 'document':167 'doesn':200 'downward':786 'driven':1549 'driver':1114 'duplic':1351,1410 'dynam':1112 'eager':269,1067,1354 'eager-load':1353 'edit':338,346,609,1005 'effect':1426 'element':1058,1101,1241,1326,1341,1348,1454 'element-partials.md':746,754,761 'email':584,1007 'emb':574,811,1537 'embed':1373 'end':9,45,77,602,735,992 'endpoint':557,1336 'enough':203 'entri':135,520,550,752,1162,1173 'entry.render':740,1060 'environ':371,1306 'environment-awar':1305 'es':1179 'es-modul':1178 'exact/regex':1251 'exampl':394,964,1568 'exclus':1310 'exist':1654 'extend':88,1609 'extends/block':228,1513 'extern':655,1428,1463,1485,1496 'fa':1507 'fallback':281,1462 'fathom/plausible':953 'featur':447 'feed':656,692,706,710,1032,1037,1401 'feeds.md':694,700,708 'fetch':266 'field':137,272,423,532,1142,1155,1272,1316,1408 'file':199,378,383,389,798,828,1333,1554 'filter':644,938,1043,1199 'first':1379 'first-class':1378 'fix':721,1692 'flow':617 'follow':1669,1746 'fontawesom':1497 'forget':332 'form':510,986,994,1124,1200 'formi':1122 'fractal':1334 'framework':736,882,1574,1586,1680 'framework-agnost':1585 'frequenc':1324 'front':8,44,76,601,734,991 'front-end':7,43,75,733,990 'frost':767 'full':961,1734 'function':180,942,1321 'generalconfig':1017 'generat':1423 'geograph':1292 'get/set':1095 'getlinkattribut':1238 'gettext':1239 'git':343 'global':847 'globalp':1290 'graphql':722,729,1048,1105,1176,1275,1322,1385 'gtm/analytics/cmp':486 'gtm/sgtm':949 'guidelin':111,833 'handl':118,427,906,1411,1541,1709,1712 'handoff':928 'hardcod':288 'head':962,1158 'header':1363 'headless':714,1045 'headless.md':720,726,738 'headlessmod':1047 'helper':124,1016,1168 'hero':235 'hero-button':234 'hibp':1226 'hierarchi':842 'hook':1136 'host':916 'hreflang':622,968 'html':1183,1453,1657 'htmx':1193 'http':1362 'hybrid':1046 'hyper':1234 'icon':1486,1501,1503 'ifram':1383 'ignit':1288 'imag':29,429,662,665,905,1159,1169,1416,1420,1540 'image-presets.md':431 'imageoptim':912,1139 'imager-x':664,1415 'img':1171 'imgtag':1143 'implement':802 'import':651,1255,1405 'includ':121,213,1718 'include/extends/embed':813 'independ':790 'index':685,1026 'individu':792 'insid':258,323 'instal':485 'instead':226,237,295 'integr':901,1056,1120,1137,1245 'ip':1369 'isol':122 'javascript':639 'javascript-boundaries.md':449 'js':919,1203,1744 'json':555,705,709,1036,1098,1329 'json-ld':1097 'key':34,860,863,1087,1579,1592,1702 'knock':1299,1300 'languag':593,630,966 'layer':951,1671,1689,1699 'layout':23,841 'ld':1099 'leak':216 'level':331,1650 'line':1128 'link':306,315,531,1174,1236,1464 'live':636,1194 'load':100,107,480,647,898,945,1068,1146,1196,1355 'load-mor':646 'locat':1082,1293 'logic':220,1524 'login':995 'login/registration':598 'lookup':1064 'mail':1391 'manag':1004 'manual':345 'map':1216,1409,1681 'matrix':138,422,756 'mechan':799,1600 'menu':526 'merg':256,348,1619 'meta':1092 'method':933,1149 'methodolog':461,765,823 'migrat':1186 'miss':210,268,279 'mix':303 'mode':871,1110,1160,1170,1177 'model':133,1218 'modul':62,91,1180 'molecul':806 'monitor':1371 'mount':925 'multi':37,435,629,984,1211,1621 'multi-brand':36,434,1620 'multi-colour':1210 'multi-languag':628 'multi-sit':983 'multi-site-patterns.md':596,625,634 'multipl':388 'n':276,561 'n8n':957 'name':33,116,229,254,781,826,829,859,864,1424,1446,1578,1591,1617,1668,1701 'named-key':32,858,1700 'named-slot':253,1616 'navig':317,525,1009,1263 'necessari':1705 'nest':519,1161 'never':1450,1471,1521,1720 'new':397,408,470,819,1000 'next.js':718,1054 'next.js/nuxt/astro':1053 'nginx':1117 'node':1265,1274 'noopen':1483 'noreferr':1484 'npm':162 'null':117 'nystudio107':888,1091,1140,1248,1278 'oemb':1376 'often':390 'one':1127,1433 'one-lin':1126 'opportun':1356 'optim':1427 'optimizedimag':1141 'order':946 'organ':808 'outsid':340 'overrid':247,251,1519,1611,1612,1652 'page':195,513,610,672,897 'pagin':1198,1338 'palett':1208 'panel':1342,1346 'parent':232,1452 'partial':749,759,1010,1059,1061,1070 'pass':1472,1505 'password':615,997,1001,1221,1303 'path':846 'pattern':22,52,796,807,809,812,878,1570 'per':896,1555,1593 'per-pag':895 'period':1323 'php':92,1708 'picturetag':1144 'pitfal':206,1078 'plan':626 'plugin':90,889,1071,1081,1086,1182 'plugins/amazon-ses.md':589 'plugins/blitz.md':507 'plugins/ckeditor.md':522 'plugins/element-api.md':559 'plugins/elements-panel.md':567 'plugins/embedded-assets.md':582 'plugins/feed-me.md':658 'plugins/formie.md':515 'plugins/hyper.md':537 'plugins/image-optimize.md':432 'plugins/imager-x.md':668 'plugins/navigation.md':528 'plugins/retour.md':545 'plugins/seomatic.md':499 'plugins/sherlock.md':573 'plugins/sprig.md':641,650 'plugins/timeloop.md':552 'point':926 'polici':1222 'popul':1349 'prefer':873 'present':1713 'preset':30,910,1425,1550 'prevent':1285,1602 'preview':723,1051 'primari':242,1599 'primit':1672 'principl':771,1577 'problem':783 'product':482 'profil':608,1006 'project':69,334,359,409,472,490,1439 'project-config':333,358 'promot':835 'prop':244,314,830,866,1459,1475,1606,1729 'properti':1627 'props/extends/block':21,795 'protect':1304 'pull':344 'purifi':1184 'purpos':1678,1685 'putyourlightson':1108,1189,1289,1343,1359,1389 'queri':146,257,278,563,976,1024,1135,1266,1721 'quot':1283 'rank':1030 'reactiv':643,1190 'read':379,400,413,424,430,438,448,455,462,473,483,491,498,506,514,521,527,536,544,551,558,566,572,581,588,595,603,611,618,624,633,640,649,657,667,673,678,686,693,699,707,719,725,737,745,753,760 'rebuild':682,688,1027 'receiv':261,1715 'recommend':1231 'recurring/repeating':547 'recurringd':1320 'redactor':1185 'redirect':540,1249,1260 'refer':198,377,382,762,934,1072,1085,1636 'references/atomic-design.md':764 'references/atomic-patterns.md':791 'references/auth-account.md':1002 'references/auth-flows.md':989 'references/boilerplate-routing.md':838 'references/component-inventory.md':821 'references/composition-patterns.md':803 'references/element-partials.md':1057 'references/feeds.md':1031 'references/headless.md':1044 'references/image-presets.md':904 'references/javascript-boundaries.md':918 'references/multi-site-patterns.md':965 'references/plugins':1084 'references/plugins/amazon-ses.md':1386 'references/plugins/blitz.md':1106 'references/plugins/cache-igniter.md':1286 'references/plugins/ckeditor.md':1152 'references/plugins/colour-swatches.md':1204 'references/plugins/element-api.md':1325 'references/plugins/elements-panel.md':1340 'references/plugins/embedded-assets.md':1372 'references/plugins/feed-me.md':1400 'references/plugins/formie.md':1121 'references/plugins/hyper.md':1233 'references/plugins/image-optimize.md':1138 'references/plugins/imager-x.md':1414 'references/plugins/knock-knock.md':1298 'references/plugins/navigation.md':1262 'references/plugins/password-policy.md':1220 'references/plugins/retour.md':1246 'references/plugins/seomatic.md':1089 'references/plugins/sherlock.md':1357 'references/plugins/sprig.md':1187 'references/plugins/timeloop.md':1311 'references/plugins/typogrify.md':1276 'references/search.md':1020 'references/tailwind-conventions.md':855 'references/third-party-integration.md':943 'references/twig-collections.md':931 'references/vite-buildchain.md':883 'refresh':1109,1294 'registr':996 'rel':1482 'relat':139,271 'relev':381 'remain':1704 'render':755,1125,1165,1268 'repeat':1314 'requir':125,140,158 'reset':616,998 'resolut':350 'resolv':310,1457,1644 'respons':428,661 'restrict':1370 'retention/expiry':1228 'retour':1247 'reusabl':742 'rewrit':1118 'rout':26,82,1041,1337,1706 'router':849 'rss':691,1033 'rule':930,1225 'run':155,160,355,568 'scaffold':832 'scan':1361,1368 'schedul':1367 'scope':73,763 'score':1028 'script':944 'search':637,671,676,680,684,1021,1195 'search.md':674,679,687 'section':134,497,844 'secur':570,1360 'see':93,1538 'semant':1582,1637,1676 'seo':1102 'seomat':494,1090 'separ':319,1552 'ses':587,955,1388,1390 'session':1015 'set':405,464,500,538,613,620,659,677,711,747,999,1019,1156,1232 'setup':887 'shade':1675 'sherlock':1358 'silent':218 'singl':907,1544 'single/multi-link':1240 'site':3,57,543,631,970,975,980,985,987 'site-specif':979 'sitemap':698,702,1039,1104 'skeleton':1532 'skill':71,96,98,104,1561 'skill-craft-site' 'slice':940 'slot':255,1535,1618 'slug':1258 'slug-chang':1257 'smart':1282 'sns':1397 'sort':939 'source-michtio' 'space':872 'spacecrafttechnolog':1418 'specif':193,981,1613 'spicyweb':1375 'sprig':1188 'sr':1489 'sr-on':1488 'srcset/sizes':911 'stage':1302 'standard':114,862 'state':1270,1757,1761 'static':977 'storag':1429 'storage/purger/deployer':1116 'strategi':917,1147 'string':1509 'structur':412,810,854,1517,1531,1658 'style':1529,1594 'subfolder/domain/subdomain/multi-brand':972 'submiss':1134,1201 'surfac':1088 'swatch':1206,1213 'switch':1526 'switcher':594,967 'syntax':1022 'system':51,1431,1436,1502 'tabl':815 'tag':175,623,969,1013 'tailwind':31,289,451,467,875,899,1133,1214,1563,1638,1686 'tailwind-conventions.md':404,439,456 'target':1480 'task':387,393 'technolog':789 'technology-independ':788 'templat':14,58,78,149,174,179,411,565,750,839,845,963,982,1063,1515,1649 'template-level':1648 'text':1491 'theme':84,437,1130,1558,1623 'third-party-integration.md':492,590 'three':1670 'tier':775,834 'timeloop':1312 'togeth':101,392 'token':298,724,1052,1583,1667 'toolbar':1157,1345 'topic-agent-skills' 'topic-claude-code' 'topic-claude-code-plugin' 'topic-claude-code-skills' 'topic-claude-skills' 'topic-content-modeling' 'topic-craft-cms' 'topic-craft-cms-5' 'topic-craftcms' 'topic-ddev' 'topic-php' 'topic-twig' 'track':1253,1399 'tracking/analytics':322 'transform':937,1148,1335,1421 'translat':978 'transport':956,1392 'treatment':240,1449 'tree':825,921,1749 'trigger':105 'truncateonword':1281 'twig':10,46,60,110,112,128,168,184,922,1023,1075,1094,1111,1191,1217,1711,1740,1750 'twig-collections.md':457 'twig.symfony.com':188 'twig.symfony.com/doc/3.x/':187 'type':136,287,1237,1250,1455,1461 'typogrifi':1277,1279 'ui':1756 'understand':458 'univers':1500 'unknown':285 'updat':353 'url':1309,1460,1470,1494 'use':190,245,739,1512,1522,1536,1542,1590,1624,1726 'user':607,1014 'usercentrics/cookiebot':948 'util':243,865,1581,1605,1698 'v4':900,1687 'valid':1224 'valu':1167 'vanilla':59 'variabl':115,215,848,1066,1318,1647 'variant':219,224,797,868,1511,1518,1528,1553 'variant-bas':867 'verbb':1123,1235,1264,1301 'verif':1008 'via':221,252,586,1331,1615,1645,1741 'video':577 'view':25,259,260,274,850,1714 'view/page':330 'visual':239,1448,1510 'vite':17,161,466,886 'vite-buildchain.md':474,484 'vite.config.ts':892 'vs':913,1172 'vue':444,924,1758 'warmer':1291 'webfetch':191 'webhook':958 'whitespac':119 'widont':1280 'widow':1284 'within':1695 'without':453,638,1202 'won':372 'work':64 'workflow':787 'x':225,666,1417 'xml':697,701,1038 'xml/json/csv':1407 'yaml':339 'yellow':293 'youtube/vimeo':576","prices":[{"id":"09b9fa9c-f9e8-40c7-9e84-35626b244fb8","listingId":"2baf9890-e5fc-4337-ba90-3b63bcc3c13c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"michtio","category":"craftcms-claude-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:19:35.433Z"}],"sources":[{"listingId":"2baf9890-e5fc-4337-ba90-3b63bcc3c13c","source":"github","sourceId":"michtio/craftcms-claude-skills/craft-site","sourceUrl":"https://github.com/michtio/craftcms-claude-skills/tree/main/skills/craft-site","isPrimary":false,"firstSeenAt":"2026-04-18T22:19:35.433Z","lastSeenAt":"2026-05-18T18:58:16.895Z"}],"details":{"listingId":"2baf9890-e5fc-4337-ba90-3b63bcc3c13c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"michtio","slug":"craft-site","github":{"repo":"michtio/craftcms-claude-skills","stars":42,"topics":["agent-skills","claude-code","claude-code-plugin","claude-code-skills","claude-skills","content-modeling","craft-cms","craft-cms-5","craftcms","ddev","php","twig"],"license":"mit","html_url":"https://github.com/michtio/craftcms-claude-skills","pushed_at":"2026-05-18T16:55:33Z","description":"Production-ready Claude Code skills, agents, and project templates for Craft CMS 5 development","skill_md_sha":"552f3d107a710dec61fd8f77ee0975b5294dc39a","skill_md_path":"skills/craft-site/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/michtio/craftcms-claude-skills/tree/main/skills/craft-site"},"layout":"multi","source":"github","category":"craftcms-claude-skills","frontmatter":{"name":"craft-site","description":"Craft CMS 5 front-end Twig development — atomic design, template architecture, components, Vite buildchain. Covers atoms/molecules/organisms, props/extends/block patterns, layout chains, view routing, content builders, image presets, Tailwind named-key collections, multi-brand CSS tokens, JavaScript boundaries (Alpine/DataStar/Vue, tabs, accordions), Vite asset loading, and front-end auth (login, registration, password reset, profiles). Triggers on: {% include ... only %}, {% embed %}, _atoms/, _molecules/, _organisms/, _views/, _builders/, component--variant.twig, _component--props.twig, collect({}), utilities prop, data-brand theming, hero/card components, Matrix block rendering, craft.vite.script, vite.php, vite.config.ts, nystudio107, buildchain, per-page scripts, Blitz static/page/dynamic caching, ImageOptimize, Imager-X, responsive images, srcset, image transforms, SEOmatic meta/OpenGraph/JSON-LD, Sprig, htmx, multi-language, hreflang, localization, Formie form styling, login/registration form, RSS/Atom/JSON feeds, XML sitemap, |rss, |atom, search page, .search(), headless GraphQL queries, preview tokens, Next.js/Nuxt/Astro integration. Always use when creating, editing, or reviewing Craft front-end Twig templates, components, layouts, views, builders, buildchain configuration, or front-end auth — including plugin template integration (Blitz, SEOmatic, Sprig, Formie, Imager-X). Do NOT trigger for PHP plugin/module development (craftcms) or content modeling (craft-content-modeling)."},"skills_sh_url":"https://skills.sh/michtio/craftcms-claude-skills/craft-site"},"updatedAt":"2026-05-18T18:58:16.895Z"}}