{"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, component patterns, Vite buildchain. Covers the full site template surface: atoms, molecules, organisms, props/extends/block pattern, layout chains, view routing, content builders, image presets, Tailw","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) | Toolbar config, nested entries with chunk rendering, HTML Purifier, custom styles, 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.469","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 39 github stars · SKILL.md body (15,112 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-01T18:56:48.769Z","embedding":null,"createdAt":"2026-04-18T22:19:35.433Z","updatedAt":"2026-05-01T18:56:48.769Z","lastSeenAt":"2026-05-01T18:56:48.769Z","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':1233 '5':6,42,56,68,772 '600':294 'accent':302,1624 'access':150,936,1011,1223 'account':1003 'across':1418 'action':309 'activ':1250,1609 'adapt':877,1374,1550 'add':416,433,508,529,546,597,635 'addit':250,1561,1589 'advanc':1400 'agnost':780,1425,1568 'alpin':442 'alpine/datastar':923,1735 'also':106 'alway':99,318,1426 'amazon':1368 'ambient':214 'analyt':952 'api':556,730,1049,1076,1096,1200,1300,1308,1311,1717 'appli':391,1460 'applic':1741 'architectur':15,79,632,971,1115,1557 'aren':478 'arrow':941 'asset':477,580,1355,1362 'assum':874,1543 'atom':12,26,47,49,230,320,459,769,801,908,1035,1225,1421,1526 'atomic-design.md':463 'atomic-patterns.md':401 'attribut':328 'audit':571,836 'auth':1018 'auth-account.md':612 'auth-flows.md':604,619 'authent':993 'auto':1237,1459 'auto-appli':1458 'autom':1394 'avail':1719 'aw':954,1375 'awar':1288 'base':869,1495 'batch':1403 'bg':292,300,1622 'bg-brand-acc':299,1621 'bg-yellow':291 'blank':1462 'blitz':502,959,1107,1277 'block':286,757 'boilerplate-routing.md':414,425 'bounc':1379 'boundari':1726 'brad':766 'brand':297,301,436,1603,1613,1623,1632,1643,1654,1658,1665 'bridg':890 'build':395,523,591,605,642,669,695,1713 'buildchain':19,86 'builder':36,283,419,852,1145 'bundl':1103 'button':236,241,304,307,1224 'button/link/text/icon':800 'cach':503,1268,1320 'call':816 'canon':1415 'card':398,743 'cascad':1093,1669 'categori':321 'caus':275 'chain':32,840 'chang':376,1240 'check':1208,1347 'checklist':837 'chunk':1160 'ckeditor':517,1153 'class':452,856,1196,1361,1489,1501,1547,1569,1620,1674,1712 'classif':782,822 'cli':165,1393 'cloud':915 'cloudflar':505,1119 'cmp':947 'cms':5,41,55,716,885,1345 'code':113,129 'coexist':929 'collect':861,932,1570,1684,1705,1716 'color':290,1655,1664 'color-brand':1663 'color/font/spacing':1646 'colour':1186,1193 'command':154,166,1151,1211 'common':205 'companion':97,1278 'compat':960 'compon':16,80,324,399,535,744,793,804,820,1173,1411,1416,1457,1616 'component-inventory.md':403,415 'compos':450,777 'composit':83,805,857,1548 'composition-patterns.md':402,426,1520 'compress':776 'concern':1576,1595 'condit':222,894,1504 'config':335,360,1131,1156,1190,1242,1289,1313,1346,1377,1529 'config-driven':1528 'config/vite.php':891 'configur':493,516,583,675,681,903,1025,1074 'conflict':349,454,1584,1675 'consol':1150,1210 'construct':794 'consum':727 'content':35,132,144,418,851,1113,1515 'context':233,779,1424,1537 'context-agnost':778,1423 'control':120,1012 'convent':817,827,1413,1540,1688 'cor':1050 'count':1331 'cover':20,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,1723 'craft-content-model':130 'craft-sit':1 'craft-twig-guidelin':108 'craft.embeddedassets.get':1363 'craft.timeloop':1298 'craft.vite.script':893 'craftcm':95,1154,1309,1384 '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':1188,1204,1294 'creat':553,689,703,818,935 'credenti':1376 'cross':208,974 'cross-cut':207 'cross-sit':973 'css':876,881,1538,1545,1554,1606,1627 'csv':1235 'currentsite.handle':1614 'custom':1040,1065,1100,1164,1248,1252,1365,1607 'cut':209 'dark':870 'data':151,262,327,652,927,950,1385,1612,1691,1697 'data-brand':1611 'date':548,1042,1296 'datemodifi':354 'ddev':152,157,356,363,902 'debug':475,560,1325 'decid':142,440 'decis':814,824,920,1729 'decompos':785 'decompose-downward':784 'decoupl':325 'default':1734 'defin':1497 'delay':1276 'deliveri':585 'depend':63 'deriv':1448 'design':13,48,50,81,460,770,831 'detail':204,1073 'detect':374,988,1333,1446 'develop':11 'devmod':280 'differ':1641,1647 'directori':853,1062 'doc':186,194 'document':167 'doesn':200 'downward':786 'driven':1530 'driver':1114 'duplic':1332,1391 'dynam':1112 'eager':269,1067,1335 'eager-load':1334 'edit':338,346,609,1005 'effect':1407 'element':1058,1101,1222,1307,1322,1329,1435 'element-partials.md':746,754,761 'email':584,1007 'emb':574,811,1518 'embed':1354 'end':9,45,77,602,735,992 'endpoint':557,1317 'enough':203 'entri':135,520,550,752,1158 'entry.render':740,1060 'environ':371,1287 'environment-awar':1286 'exact/regex':1232 'exampl':394,964,1549 'exclus':1291 'exist':1635 'extend':88,1590 'extends/block':228,1494 'extern':655,1409,1444,1466,1477 'fa':1488 'fallback':281,1443 'fathom/plausible':953 'featur':447 'feed':656,692,706,710,1032,1037,1382 'feeds.md':694,700,708 'fetch':266 'field':137,272,423,532,1142,1253,1297,1389 'file':199,378,383,389,798,828,1314,1535 'filter':644,938,1043,1180 'first':1360 'first-class':1359 'fix':721,1673 'flow':617 'follow':1650,1727 'fontawesom':1478 'forget':332 'form':510,986,994,1124,1181 'formi':1122 'fractal':1315 'framework':736,882,1555,1567,1661 'framework-agnost':1566 'frequenc':1305 'front':8,44,76,601,734,991 'front-end':7,43,75,733,990 'frost':767 'full':22,961,1715 'function':180,942,1302 'generalconfig':1017 'generat':1404 'geograph':1273 'get/set':1095 'getlinkattribut':1219 'gettext':1220 'git':343 'global':847 'globalp':1271 'graphql':722,729,1048,1105,1256,1303,1366 'gtm/analytics/cmp':486 'gtm/sgtm':949 'guidelin':111,833 'handl':118,427,906,1392,1522,1690,1693 'handoff':928 'hardcod':288 'head':962 'header':1344 'headless':714,1045 'headless.md':720,726,738 'headlessmod':1047 'helper':124,1016 'hero':235 'hero-button':234 'hibp':1207 'hierarchi':842 'hook':1136 'host':916 'hreflang':622,968 'html':1162,1434,1638 'htmx':1174 'http':1343 'hybrid':1046 'hyper':1215 'icon':1467,1482,1484 'ifram':1364 'ignit':1269 'imag':37,429,662,665,905,1397,1401,1521 'image-presets.md':431 'imageoptim':912,1139 'imager-x':664,1396 'imgtag':1143 'implement':802 'import':651,1236,1386 'includ':121,213,1699 '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,1226 'ip':1350 'isol':122 'javascript':639 'javascript-boundaries.md':449 'js':919,1184,1725 'json':555,705,709,1036,1098,1310 'json-ld':1097 'key':860,863,1087,1560,1573,1683 'knock':1280,1281 'languag':593,630,966 'layer':951,1652,1670,1680 'layout':31,841 'ld':1099 'leak':216 'level':331,1631 'line':1128 'link':306,315,531,1217,1445 'live':636,1175 'load':100,107,480,647,898,945,1068,1146,1177,1336 'load-mor':646 'locat':1082,1274 'logic':220,1505 'login':995 'login/registration':598 'lookup':1064 'mail':1372 'manag':1004 'manual':345 'map':1197,1390,1662 'matrix':138,422,756 'mechan':799,1581 'menu':526 'merg':256,348,1600 'meta':1092 'method':933,1149 'methodolog':461,765,823 'migrat':1167 'miss':210,268,279 'mix':303 'mode':871,1110 'model':133,1199 'modul':62,91 'molecul':27,806 'monitor':1352 'mount':925 'multi':435,629,984,1192,1602 'multi-brand':434,1601 'multi-colour':1191 'multi-languag':628 'multi-sit':983 'multi-site-patterns.md':596,625,634 'multipl':388 'n':276,561 'n8n':957 'name':116,229,254,781,826,829,859,864,1405,1427,1559,1572,1598,1649,1682 'named-key':858,1681 'named-slot':253,1597 'navig':317,525,1009,1244 'necessari':1686 'nest':519,1157 'never':1431,1452,1502,1701 'new':397,408,470,819,1000 'next.js':718,1054 'next.js/nuxt/astro':1053 'nginx':1117 'node':1246,1255 'noopen':1464 'noreferr':1465 'npm':162 'null':117 'nystudio107':888,1091,1140,1229,1259 'oemb':1357 'often':390 'one':1127,1414 'one-lin':1126 'opportun':1337 'optim':1408 'optimizedimag':1141 'order':946 'organ':28,808 'outsid':340 'overrid':247,251,1500,1592,1593,1633 'page':195,513,610,672,897 'pagin':1179,1319 'palett':1189 'panel':1323,1327 'parent':232,1433 'partial':749,759,1010,1059,1061,1070 'pass':1453,1486 'password':615,997,1001,1202,1284 'path':846 'pattern':17,30,52,796,807,809,812,878,1551 'per':896,1536,1574 'per-pag':895 'period':1304 'php':92,1689 'picturetag':1144 'pitfal':206,1078 'plan':626 'plugin':90,889,1071,1081,1086 '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':1203 'popul':1330 'prefer':873 'present':1694 'preset':38,910,1406,1531 'prevent':1266,1583 'preview':723,1051 'primari':242,1580 'primit':1653 'principl':771,1558 'problem':783 'product':482 'profil':608,1006 'project':69,334,359,409,472,490,1420 'project-config':333,358 'promot':835 'prop':244,314,830,866,1440,1456,1587,1710 'properti':1608 'props/extends/block':29,795 'protect':1285 'pull':344 'purifi':1163 'purpos':1659,1666 'putyourlightson':1108,1170,1270,1324,1340,1370 'queri':146,257,278,563,976,1024,1135,1247,1702 'quot':1264 'rank':1030 'reactiv':643,1171 '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,1696 'recommend':1212 'recurring/repeating':547 'recurringd':1301 'redactor':1166 'redirect':540,1230,1241 'refer':198,377,382,762,934,1072,1085,1617 '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':1367 'references/plugins/blitz.md':1106 'references/plugins/cache-igniter.md':1267 'references/plugins/ckeditor.md':1152 'references/plugins/colour-swatches.md':1185 'references/plugins/element-api.md':1306 'references/plugins/elements-panel.md':1321 'references/plugins/embedded-assets.md':1353 'references/plugins/feed-me.md':1381 'references/plugins/formie.md':1121 'references/plugins/hyper.md':1214 'references/plugins/image-optimize.md':1138 'references/plugins/imager-x.md':1395 'references/plugins/knock-knock.md':1279 'references/plugins/navigation.md':1243 'references/plugins/password-policy.md':1201 'references/plugins/retour.md':1227 'references/plugins/seomatic.md':1089 'references/plugins/sherlock.md':1338 'references/plugins/sprig.md':1168 'references/plugins/timeloop.md':1292 'references/plugins/typogrify.md':1257 '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,1275 'registr':996 'rel':1463 'relat':139,271 'relev':381 'remain':1685 'render':755,1125,1161,1249 'repeat':1295 'requir':125,140,158 'reset':616,998 'resolut':350 'resolv':310,1438,1625 'respons':428,661 'restrict':1351 'retention/expiry':1209 'retour':1228 'reusabl':742 'rewrit':1118 'rout':34,82,1041,1318,1687 'router':849 'rss':691,1033 'rule':930,1206 'run':155,160,355,568 'scaffold':832 'scan':1342,1349 'schedul':1348 'scope':73,763 'score':1028 'script':944 'search':637,671,676,680,684,1021,1176 'search.md':674,679,687 'section':134,497,844 'secur':570,1341 'see':93,1519 'semant':1563,1618,1657 'seo':1102 'seomat':494,1090 'separ':319,1533 'ses':587,955,1369,1371 'session':1015 'set':405,464,500,538,613,620,659,677,711,747,999,1019,1213 'setup':887 'shade':1656 'sherlock':1339 'silent':218 'singl':907,1525 'single/multi-link':1221 'site':3,23,57,543,631,970,975,980,985,987 'site-specif':979 'sitemap':698,702,1039,1104 'skeleton':1513 'skill':71,96,98,104,1542 'skill-craft-site' 'slice':940 'slot':255,1516,1599 'slug':1239 'slug-chang':1238 'smart':1263 'sns':1378 'sort':939 'source-michtio' 'space':872 'spacecrafttechnolog':1399 'specif':193,981,1594 'spicyweb':1356 'sprig':1169 'sr':1470 'sr-on':1469 'srcset/sizes':911 'stage':1283 'standard':114,862 'state':1251,1738,1742 'static':977 'storag':1410 'storage/purger/deployer':1116 'strategi':917,1147 'string':1490 'structur':412,810,854,1498,1512,1639 'style':1165,1510,1575 'subfolder/domain/subdomain/multi-brand':972 'submiss':1134,1182 'surfac':25,1088 'swatch':1187,1194 'switch':1507 'switcher':594,967 'syntax':1022 'system':51,1412,1417,1483 'tabl':815 'tag':175,623,969,1013 'tailw':39 'tailwind':289,451,467,875,899,1133,1195,1544,1619,1667 'tailwind-conventions.md':404,439,456 'target':1461 'task':387,393 'technolog':789 'technology-independ':788 'templat':14,24,58,78,149,174,179,411,565,750,839,845,963,982,1063,1496,1630 'template-level':1629 'text':1472 'theme':84,437,1130,1539,1604 'third-party-integration.md':492,590 'three':1651 'tier':775,834 'timeloop':1293 'togeth':101,392 'token':298,724,1052,1564,1648 'toolbar':1155,1326 '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':1234,1380 'tracking/analytics':322 'transform':937,1148,1316,1402 'translat':978 'transport':956,1373 'treatment':240,1430 'tree':825,921,1730 'trigger':105 'truncateonword':1262 'twig':10,46,60,110,112,128,168,184,922,1023,1075,1094,1111,1172,1198,1692,1721,1731 'twig-collections.md':457 'twig.symfony.com':188 'twig.symfony.com/doc/3.x/':187 'type':136,287,1218,1231,1436,1442 'typogrifi':1258,1260 'ui':1737 'understand':458 'univers':1481 'unknown':285 'updat':353 'url':1290,1441,1451,1475 'use':190,245,739,1493,1503,1517,1523,1571,1605,1707 'user':607,1014 'usercentrics/cookiebot':948 'util':243,865,1562,1586,1679 'v4':900,1668 'valid':1205 'vanilla':59 'variabl':115,215,848,1066,1299,1628 'variant':219,224,797,868,1492,1499,1509,1534 'variant-bas':867 'verbb':1123,1216,1245,1282 'verif':1008 'via':221,252,586,1312,1596,1626,1722 'video':577 'view':33,259,260,274,850,1695 'view/page':330 'visual':239,1429,1491 'vite':18,161,466,886 'vite-buildchain.md':474,484 'vite.config.ts':892 'vs':913 'vue':444,924,1739 'warmer':1272 'webfetch':191 'webhook':958 'whitespac':119 'widont':1261 'widow':1265 'within':1676 'without':453,638,1183 'won':372 'work':64 'workflow':787 'x':225,666,1398 'xml':697,701,1038 'xml/json/csv':1388 '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-01T18:56:48.769Z"}],"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":39,"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-04-30T21:00:38Z","description":"Production-ready Claude Code skills, agents, and project templates for Craft CMS 5 development","skill_md_sha":"cf0ad29dbe2617c81cf0819bb13e3636ea1ae11a","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, component patterns, Vite buildchain. Covers the full site template surface: atoms, molecules, organisms, props/extends/block pattern, layout chains, view routing, content builders, image presets, Tailwind named-key collections, multi-brand CSS tokens, JavaScript boundaries (Alpine/DataStar/Vue, tabs, accordions, interactive components), Vite asset loading, and front-end auth (login, registration, password reset, user profiles). Triggers on: {% include ... only %}, {% embed %}, _atoms/, _molecules/, _organisms/, _views/, _builders/, _boilerplate/, component--variant.twig, _component--props.twig, image presets, Tailwind class collections, collect({}), utilities prop, multi-brand theming, data-brand, hero sections, card components, content builders, Matrix block rendering, craft.vite.script, vite.php, vite.config.ts, nystudio107, buildchain, asset loading, per-page scripts, Blitz, static caching, page caching, dynamic caching with Sprig, ImageOptimize, Imager-X, responsive images, srcset, image transforms, SEOmatic, meta tags, OpenGraph, JSON-LD, Sprig, htmx, multi-language site, language switcher, hreflang, localization, Formie, form styling, login form, registration form, user authentication front-end, RSS feed, Atom feed, JSON Feed, XML sitemap, feed.xml, sitemap.xml, |rss, |atom, search page, search results, .search(), search index, search form, search configuration, headless, headless CMS, GraphQL queries, preview tokens, Next.js, Nuxt, Astro, consuming GraphQL API, front-end framework integration. Always use when creating, editing, or reviewing any Craft CMS front-end Twig template, component, layout, view, builder, buildchain configuration, or front-end auth flow — including plugin template integration (Blitz, SEOmatic, Sprig, Formie, Imager-X). Do NOT trigger for PHP plugin/module development or content modeling decisions."},"skills_sh_url":"https://skills.sh/michtio/craftcms-claude-skills/craft-site"},"updatedAt":"2026-05-01T18:56:48.769Z"}}