howone 0.1.20 → 0.1.22

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.
Files changed (293) hide show
  1. package/package.json +1 -1
  2. package/templates/vite/.howone/skills/hallmark/LICENSE +21 -0
  3. package/templates/vite/.howone/skills/hallmark/README.md +147 -0
  4. package/templates/vite/.howone/skills/hallmark/ROADMAP.md +201 -0
  5. package/templates/vite/.howone/skills/hallmark/SKILL.md +551 -0
  6. package/templates/vite/.howone/skills/hallmark/docs/recipes.md +186 -0
  7. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
  8. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
  9. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
  10. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
  11. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
  12. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
  13. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
  14. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
  15. package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +176 -0
  16. package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +364 -0
  17. package/templates/vite/.howone/skills/hallmark/package.json +36 -0
  18. package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +412 -0
  19. package/templates/vite/.howone/skills/hallmark/references/assets.md +399 -0
  20. package/templates/vite/.howone/skills/hallmark/references/color.md +95 -0
  21. package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +256 -0
  22. package/templates/vite/.howone/skills/hallmark/references/components/c1-outlined-chip.md +12 -0
  23. package/templates/vite/.howone/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -0
  24. package/templates/vite/.howone/skills/hallmark/references/components/c3-typographic-link.md +8 -0
  25. package/templates/vite/.howone/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -0
  26. package/templates/vite/.howone/skills/hallmark/references/components/f1-bento-grid.md +20 -0
  27. package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -0
  28. package/templates/vite/.howone/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -0
  29. package/templates/vite/.howone/skills/hallmark/references/components/f4-step-sequence.md +11 -0
  30. package/templates/vite/.howone/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -0
  31. package/templates/vite/.howone/skills/hallmark/references/components/f6-product-card-grid.md +41 -0
  32. package/templates/vite/.howone/skills/hallmark/references/components/ft1-mast-headed.md +13 -0
  33. package/templates/vite/.howone/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -0
  34. package/templates/vite/.howone/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -0
  35. package/templates/vite/.howone/skills/hallmark/references/components/ft4-dense-typographic.md +10 -0
  36. package/templates/vite/.howone/skills/hallmark/references/components/ft5-statement.md +21 -0
  37. package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +19 -0
  38. package/templates/vite/.howone/skills/hallmark/references/components/ft7-newsletter-first.md +27 -0
  39. package/templates/vite/.howone/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -0
  40. package/templates/vite/.howone/skills/hallmark/references/components/h1-marquee.md +15 -0
  41. package/templates/vite/.howone/skills/hallmark/references/components/h2-split-diptych.md +15 -0
  42. package/templates/vite/.howone/skills/hallmark/references/components/h3-quote-led.md +11 -0
  43. package/templates/vite/.howone/skills/hallmark/references/components/h4-stat-led.md +14 -0
  44. package/templates/vite/.howone/skills/hallmark/references/components/h5-letter-hero.md +11 -0
  45. package/templates/vite/.howone/skills/hallmark/references/components/h6-photographic-fold.md +16 -0
  46. package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -0
  47. package/templates/vite/.howone/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -0
  48. package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -0
  49. package/templates/vite/.howone/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -0
  50. package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -0
  51. package/templates/vite/.howone/skills/hallmark/references/components/n2-floating-chip.md +14 -0
  52. package/templates/vite/.howone/skills/hallmark/references/components/n3-side-rail.md +14 -0
  53. package/templates/vite/.howone/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -0
  54. package/templates/vite/.howone/skills/hallmark/references/components/n5-floating-pill.md +28 -0
  55. package/templates/vite/.howone/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -0
  56. package/templates/vite/.howone/skills/hallmark/references/components/n7-brutal-slab.md +22 -0
  57. package/templates/vite/.howone/skills/hallmark/references/components/n8-terminal-command.md +21 -0
  58. package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -0
  59. package/templates/vite/.howone/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -0
  60. package/templates/vite/.howone/skills/hallmark/references/components/s2-hanging.md +13 -0
  61. package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +19 -0
  62. package/templates/vite/.howone/skills/hallmark/references/components/s4-inline-no-break.md +11 -0
  63. package/templates/vite/.howone/skills/hallmark/references/components/s5-bottom-anchored.md +13 -0
  64. package/templates/vite/.howone/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -0
  65. package/templates/vite/.howone/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -0
  66. package/templates/vite/.howone/skills/hallmark/references/components/t3-single-huge-quote.md +11 -0
  67. package/templates/vite/.howone/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -0
  68. package/templates/vite/.howone/skills/hallmark/references/contract.md +24 -0
  69. package/templates/vite/.howone/skills/hallmark/references/copy.md +182 -0
  70. package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +626 -0
  71. package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +329 -0
  72. package/templates/vite/.howone/skills/hallmark/references/design-md.md +116 -0
  73. package/templates/vite/.howone/skills/hallmark/references/export-formats.md +328 -0
  74. package/templates/vite/.howone/skills/hallmark/references/floating-nav.md +89 -0
  75. package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +65 -0
  76. package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +70 -0
  77. package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +67 -0
  78. package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +65 -0
  79. package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +474 -0
  80. package/templates/vite/.howone/skills/hallmark/references/imagery-kit.md +170 -0
  81. package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +207 -0
  82. package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +111 -0
  83. package/templates/vite/.howone/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -0
  84. package/templates/vite/.howone/skills/hallmark/references/macrostructures/02-long-document.md +34 -0
  85. package/templates/vite/.howone/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -0
  86. package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +32 -0
  87. package/templates/vite/.howone/skills/hallmark/references/macrostructures/05-workbench.md +32 -0
  88. package/templates/vite/.howone/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -0
  89. package/templates/vite/.howone/skills/hallmark/references/macrostructures/07-manifesto.md +32 -0
  90. package/templates/vite/.howone/skills/hallmark/references/macrostructures/08-photographic.md +34 -0
  91. package/templates/vite/.howone/skills/hallmark/references/macrostructures/09-quote-led.md +32 -0
  92. package/templates/vite/.howone/skills/hallmark/references/macrostructures/10-specimen.md +32 -0
  93. package/templates/vite/.howone/skills/hallmark/references/macrostructures/11-catalogue.md +23 -0
  94. package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +23 -0
  95. package/templates/vite/.howone/skills/hallmark/references/macrostructures/13-index-first.md +23 -0
  96. package/templates/vite/.howone/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -0
  97. package/templates/vite/.howone/skills/hallmark/references/macrostructures/15-split-studio.md +23 -0
  98. package/templates/vite/.howone/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
  99. package/templates/vite/.howone/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -0
  100. package/templates/vite/.howone/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -0
  101. package/templates/vite/.howone/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -0
  102. package/templates/vite/.howone/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -0
  103. package/templates/vite/.howone/skills/hallmark/references/macrostructures/21-component-playground.md +23 -0
  104. package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +89 -0
  105. package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +260 -0
  106. package/templates/vite/.howone/skills/hallmark/references/motion.md +109 -0
  107. package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +49 -0
  108. package/templates/vite/.howone/skills/hallmark/references/responsive.md +138 -0
  109. package/templates/vite/.howone/skills/hallmark/references/slop-test.md +205 -0
  110. package/templates/vite/.howone/skills/hallmark/references/structure.md +164 -0
  111. package/templates/vite/.howone/skills/hallmark/references/study.md +486 -0
  112. package/templates/vite/.howone/skills/hallmark/references/typography.md +243 -0
  113. package/templates/vite/.howone/skills/hallmark/references/verbs/audit.md +25 -0
  114. package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +269 -0
  115. package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
  116. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +71 -0
  117. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +64 -0
  118. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +240 -0
  119. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +65 -0
  120. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +105 -0
  121. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +250 -0
  122. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +64 -0
  123. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +131 -0
  124. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +240 -0
  125. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +67 -0
  126. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +86 -0
  127. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +262 -0
  128. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +63 -0
  129. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +167 -0
  130. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +457 -0
  131. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +65 -0
  132. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +159 -0
  133. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +288 -0
  134. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +64 -0
  135. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +146 -0
  136. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +484 -0
  137. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +64 -0
  138. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +116 -0
  139. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +354 -0
  140. package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +638 -0
  141. package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +515 -0
  142. package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +515 -0
  143. package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +608 -0
  144. package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +587 -0
  145. package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +157 -0
  146. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
  147. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
  148. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
  149. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
  150. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
  151. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
  152. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
  153. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
  154. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
  155. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
  156. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
  157. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
  158. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
  159. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
  160. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
  161. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
  162. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
  163. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
  164. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
  165. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
  166. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
  167. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
  168. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
  169. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +77 -0
  170. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +238 -0
  171. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +110 -0
  172. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +326 -0
  173. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +134 -0
  174. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +262 -0
  175. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +30 -0
  176. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +17 -0
  177. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +56 -0
  178. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +160 -0
  179. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +29 -0
  180. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +63 -0
  181. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +72 -0
  182. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +374 -0
  183. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +52 -0
  184. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +29 -0
  185. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +61 -0
  186. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +193 -0
  187. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +66 -0
  188. package/templates/vite/.howone/skills/hallmark/site/css/base.css +194 -0
  189. package/templates/vite/.howone/skills/hallmark/site/css/components.css +4886 -0
  190. package/templates/vite/.howone/skills/hallmark/site/css/sections.css +2072 -0
  191. package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +1129 -0
  192. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +475 -0
  193. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +1584 -0
  194. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +96 -0
  195. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +344 -0
  196. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +103 -0
  197. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +1103 -0
  198. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +83 -0
  199. package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +368 -0
  200. package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +133 -0
  201. package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +1062 -0
  202. package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +97 -0
  203. package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +84 -0
  204. package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +446 -0
  205. package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +1087 -0
  206. package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +101 -0
  207. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +359 -0
  208. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +1168 -0
  209. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +81 -0
  210. package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +5 -0
  211. package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +5 -0
  212. package/templates/vite/.howone/skills/hallmark/site/index.html +1043 -0
  213. package/templates/vite/.howone/skills/hallmark/site/js/main.js +1175 -0
  214. package/templates/vite/.howone/skills/hallmark/vercel.json +6 -0
  215. package/templates/vite/.howone/skills/howone-sdk/01-architect/01-app-generation.md +101 -0
  216. package/templates/vite/.howone/skills/howone-sdk/02-database/01-schema-design.md +147 -0
  217. package/templates/vite/.howone/skills/howone-sdk/02-database/02-schema-operations.md +96 -0
  218. package/templates/vite/.howone/skills/howone-sdk/02-database/03-data-access-patterns.md +172 -0
  219. package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/01-client-setup.md +3 -3
  220. package/templates/vite/.howone/skills/howone-sdk/{references/04-auth.md → 03-sdk/03-auth.md} +120 -3
  221. package/templates/vite/.howone/skills/howone-sdk/04-ai/.gitkeep +1 -0
  222. package/templates/vite/.howone/skills/howone-sdk/SKILL.md +67 -93
  223. package/templates/vite/.howone/skills/howone-sdk/agents/openai.yaml +3 -3
  224. package/templates/vite/.howone/skills/impeccable/SKILL.md +168 -0
  225. package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
  226. package/templates/vite/.howone/skills/impeccable/reference/adapt.md +190 -0
  227. package/templates/vite/.howone/skills/impeccable/reference/animate.md +175 -0
  228. package/templates/vite/.howone/skills/impeccable/reference/audit.md +133 -0
  229. package/templates/vite/.howone/skills/impeccable/reference/bolder.md +113 -0
  230. package/templates/vite/.howone/skills/impeccable/reference/brand.md +118 -0
  231. package/templates/vite/.howone/skills/impeccable/reference/clarify.md +174 -0
  232. package/templates/vite/.howone/skills/impeccable/reference/codex.md +105 -0
  233. package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +106 -0
  234. package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +105 -0
  235. package/templates/vite/.howone/skills/impeccable/reference/colorize.md +154 -0
  236. package/templates/vite/.howone/skills/impeccable/reference/craft.md +123 -0
  237. package/templates/vite/.howone/skills/impeccable/reference/critique.md +273 -0
  238. package/templates/vite/.howone/skills/impeccable/reference/delight.md +302 -0
  239. package/templates/vite/.howone/skills/impeccable/reference/distill.md +111 -0
  240. package/templates/vite/.howone/skills/impeccable/reference/document.md +427 -0
  241. package/templates/vite/.howone/skills/impeccable/reference/extract.md +69 -0
  242. package/templates/vite/.howone/skills/impeccable/reference/harden.md +347 -0
  243. package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +234 -0
  244. package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +195 -0
  245. package/templates/vite/.howone/skills/impeccable/reference/layout.md +141 -0
  246. package/templates/vite/.howone/skills/impeccable/reference/live.md +622 -0
  247. package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +109 -0
  248. package/templates/vite/.howone/skills/impeccable/reference/onboard.md +234 -0
  249. package/templates/vite/.howone/skills/impeccable/reference/optimize.md +258 -0
  250. package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +130 -0
  251. package/templates/vite/.howone/skills/impeccable/reference/personas.md +179 -0
  252. package/templates/vite/.howone/skills/impeccable/reference/polish.md +242 -0
  253. package/templates/vite/.howone/skills/impeccable/reference/product.md +62 -0
  254. package/templates/vite/.howone/skills/impeccable/reference/quieter.md +99 -0
  255. package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +114 -0
  256. package/templates/vite/.howone/skills/impeccable/reference/shape.md +165 -0
  257. package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +100 -0
  258. package/templates/vite/.howone/skills/impeccable/reference/teach.md +156 -0
  259. package/templates/vite/.howone/skills/impeccable/reference/typeset.md +124 -0
  260. package/templates/vite/.howone/skills/impeccable/reference/typography.md +159 -0
  261. package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +107 -0
  262. package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  263. package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +94 -0
  264. package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +242 -0
  265. package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +820 -0
  266. package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +198 -0
  267. package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +21 -0
  268. package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
  269. package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +69 -0
  270. package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +595 -0
  271. package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +123 -0
  272. package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +4860 -0
  273. package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +75 -0
  274. package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +18 -0
  275. package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +446 -0
  276. package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +200 -0
  277. package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +48 -0
  278. package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +838 -0
  279. package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +254 -0
  280. package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +47 -0
  281. package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +632 -0
  282. package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +247 -0
  283. package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +141 -0
  284. package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  285. package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +214 -0
  286. package/templates/vite/AGENTS.md +2 -12
  287. package/templates/vite/package.json +1 -1
  288. /package/templates/vite/.howone/skills/howone-sdk/{references/08-manifest-codegen.md → 01-architect/02-manifest-codegen.md} +0 -0
  289. /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/02-entity-operations.md +0 -0
  290. /package/templates/vite/.howone/skills/howone-sdk/{references/06-react-integration.md → 03-sdk/04-react-integration.md} +0 -0
  291. /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/05-file-upload.md +0 -0
  292. /package/templates/vite/.howone/skills/howone-sdk/{references/07-raw-http.md → 03-sdk/06-raw-http.md} +0 -0
  293. /package/templates/vite/.howone/skills/howone-sdk/{references/03-ai-actions.md → 03-sdk/07-ai-action-calls.md} +0 -0
@@ -0,0 +1,83 @@
1
+ /* Hallmark · pre-emit critique: P5 H5 E5 S5 R4 V5
2
+ * genre: atmospheric · macrostructure: Marquee Hero · theme: Bloom
3
+ * tokens · paper-band: dark · display-style: weighty-sans · accent-hue: warm-amber
4
+ */
5
+
6
+ :root {
7
+ color-scheme: dark;
8
+
9
+ /* === Color: Bloom (atmospheric) ============================== */
10
+ --color-paper: oklch(13% 0.018 35);
11
+ --color-paper-2: oklch(17% 0.020 35);
12
+ --color-paper-3: oklch(22% 0.022 35);
13
+ --color-paper-4: oklch(28% 0.020 35);
14
+ --color-ink: oklch(95% 0.010 70);
15
+ --color-ink-2: oklch(78% 0.015 60);
16
+ --color-ink-3: oklch(58% 0.015 50);
17
+ --color-rule: oklch(28% 0.018 40);
18
+ --color-rule-strong: oklch(40% 0.025 40);
19
+ --color-accent: oklch(74% 0.180 55);
20
+ --color-accent-2: oklch(68% 0.220 18);
21
+ --color-accent-soft: oklch(74% 0.060 55);
22
+ --color-accent-ink: oklch(15% 0.040 50);
23
+ --color-focus: oklch(82% 0.180 55);
24
+ --color-error: oklch(70% 0.220 25);
25
+ --color-success: oklch(74% 0.160 145);
26
+ --color-bloom-1: oklch(74% 0.220 50);
27
+ --color-bloom-2: oklch(60% 0.220 15);
28
+
29
+ /* === Typography ============================================== */
30
+ --font-display: "Inter Tight", system-ui, sans-serif;
31
+ --font-body: "Inter", system-ui, sans-serif;
32
+ --font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", monospace;
33
+ --font-accent: "Instrument Serif", "Times New Roman", Georgia, serif;
34
+
35
+ --text-xs: 0.75rem;
36
+ --text-sm: 0.8125rem;
37
+ --text-base: 1rem;
38
+ --text-md: 1.0625rem;
39
+ --text-lg: 1.25rem;
40
+ --text-xl: 1.5rem;
41
+ --text-2xl: 2rem;
42
+ --text-3xl: 2.75rem;
43
+ --text-4xl: clamp(2.5rem, 4vw + 1rem, 4.5rem);
44
+ --text-display: clamp(3rem, 11vw + 0.25rem, 9.5rem);
45
+
46
+ --leading-display: 0.92;
47
+ --leading-tight: 1.05;
48
+ --leading-snug: 1.25;
49
+ --leading-body: 1.55;
50
+
51
+ /* === Spacing (4 pt) ========================================== */
52
+ --space-2xs: 0.25rem;
53
+ --space-xs: 0.5rem;
54
+ --space-sm: 0.75rem;
55
+ --space-md: 1rem;
56
+ --space-lg: 1.5rem;
57
+ --space-xl: 2.5rem;
58
+ --space-2xl: 4rem;
59
+ --space-3xl: 6rem;
60
+ --space-4xl: 9rem;
61
+
62
+ /* === Motion ================================================== */
63
+ --ease-out: cubic-bezier(0.20, 0.80, 0.20, 1.00);
64
+ --ease-in: cubic-bezier(0.40, 0.00, 1.00, 1.00);
65
+ --ease-in-out: cubic-bezier(0.40, 0.00, 0.20, 1.00);
66
+ --dur-fast: 120ms;
67
+ --dur-base: 220ms;
68
+ --dur-slow: 400ms;
69
+
70
+ /* === Rules / radii =========================================== */
71
+ --rule-hair: 1px;
72
+ --rule-bold: 2px;
73
+ --radius-xs: 3px;
74
+ --radius-sm: 6px;
75
+ --radius-md: 12px;
76
+ --radius-lg: 20px;
77
+ --radius-pill: 999px;
78
+
79
+ /* === Layout ================================================== */
80
+ --page-gutter: clamp(1rem, 4vw, 3rem);
81
+ --max-width: 80rem;
82
+ --measure: 60ch;
83
+ }
@@ -0,0 +1,368 @@
1
+ <!doctype html>
2
+ <html lang="en" dir="ltr">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
6
+ <title>NAJM · W&rsquo;25 — Made in Morocco. Worn anywhere.</title>
7
+ <meta name="description" content="NAJM is a Moroccan clothing house. Hand-cut in Marrakech, shipped from Casablanca. New drop every six weeks." />
8
+ <meta name="theme-color" content="#1a1411" />
9
+
10
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
11
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
12
+ <link rel="stylesheet"
13
+ href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,600;12..96,700;12..96,800;12..96,900&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" />
14
+ <link rel="stylesheet" href="./styles.css" />
15
+ </head>
16
+ <body>
17
+
18
+ <!-- Announcement -->
19
+ <div class="announce" role="status" aria-label="Site promotions">
20
+ <span><strong>★</strong> Free shipping in Morocco over 1500 MAD</span>
21
+ <span>New drop · Friday 06.05 · 18h00</span>
22
+ <span>Use code <strong>NAJM10</strong> · 100 MAD off your first order</span>
23
+ </div>
24
+
25
+ <!-- Nav -->
26
+ <header class="nav">
27
+ <div class="shell nav__inner">
28
+ <a href="#" class="brand" aria-label="NAJM home">
29
+ NAJM<span class="brand__ar" aria-hidden="true">نجم</span>
30
+ </a>
31
+ <nav class="nav__links" aria-label="Primary">
32
+ <a href="#shop">Shop</a>
33
+ <a href="#lookbook">Lookbook</a>
34
+ <a href="#story">Story</a>
35
+ <a href="#stockists">Stockists</a>
36
+ </nav>
37
+ <div class="nav__util">
38
+ <button class="icon-btn" aria-label="Search">
39
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/></svg>
40
+ </button>
41
+ <button id="cartBtn" class="cart-btn" aria-label="Open bag" aria-controls="drawer">
42
+ Bag
43
+ <span id="cartCount" class="cart-btn__count" aria-live="polite">2</span>
44
+ </button>
45
+ </div>
46
+ </div>
47
+ </header>
48
+
49
+ <!-- Marquee -->
50
+ <div class="marquee" aria-hidden="true">
51
+ <div class="marquee__track">
52
+ <span>
53
+ <span>Hand-cut in Marrakech</span><span class="marquee__star"></span>
54
+ <span>New drop W&rsquo;25</span><span class="marquee__star"></span>
55
+ <span>Free returns across Morocco</span><span class="marquee__star"></span>
56
+ <span>Shipped from Casablanca</span><span class="marquee__star"></span>
57
+ <span>1% to oasis reforestation</span><span class="marquee__star"></span>
58
+ </span>
59
+ <span>
60
+ <span>Hand-cut in Marrakech</span><span class="marquee__star"></span>
61
+ <span>New drop W&rsquo;25</span><span class="marquee__star"></span>
62
+ <span>Free returns across Morocco</span><span class="marquee__star"></span>
63
+ <span>Shipped from Casablanca</span><span class="marquee__star"></span>
64
+ <span>1% to oasis reforestation</span><span class="marquee__star"></span>
65
+ </span>
66
+ </div>
67
+ </div>
68
+
69
+ <!-- Hero -->
70
+ <section class="hero shell" id="shop">
71
+ <div class="hero__grid">
72
+ <div class="hero__lead">
73
+ <p class="hero__meta"><b></b> Live · 2,318 watching the drop</p>
74
+ <h1 class="hero__h1">
75
+ New cuts.<br/>
76
+ Old <em>soul</em>.<br/>
77
+ Made in Morocco.
78
+ </h1>
79
+ <p class="hero__sub">
80
+ Twenty-three pieces, hand-cut in Marrakech and shipped from Casablanca. The Winter <em>&rsquo;25</em> drop opens Friday at 18h00.
81
+ </p>
82
+ <div class="hero__cta-row">
83
+ <a class="btn btn--primary" href="#shop">
84
+ Shop the drop <span class="btn__arrow" aria-hidden="true">→</span>
85
+ </a>
86
+ <a class="btn btn--ghost" href="#lookbook">Lookbook</a>
87
+ </div>
88
+ </div>
89
+
90
+ <div class="hero__feature">
91
+ <a class="feature-card" href="#"
92
+ data-product="medina"
93
+ data-name="Médina Cropped Jacket"
94
+ data-variant="Terracotta · M"
95
+ data-price="1450"
96
+ data-surface="terracotta">
97
+ <div class="surface surface--terracotta"></div>
98
+ <div class="zellige" aria-hidden="true"></div>
99
+ <div class="feature-card__body">
100
+ <span class="feature-card__tag">★ Drop · 01 / 23</span>
101
+ <div>
102
+ <div class="feature-card__title">Médina<br/>Cropped Jacket</div>
103
+ <div class="feature-card__row" style="margin-top:.5rem">
104
+ <div class="feature-card__price">1,450 <small>MAD</small></div>
105
+ <button class="feature-card__cta" aria-label="Add Médina Cropped Jacket to bag" data-add data-label="↗">↗</button>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </a>
110
+ </div>
111
+ </div>
112
+ </section>
113
+
114
+ <!-- Featured Collection -->
115
+ <section class="section shell">
116
+ <div class="section__head">
117
+ <div>
118
+ <p class="eyebrow">The W&rsquo;25 Collection</p>
119
+ <h2 class="section__title">Twenty-three pieces. <em>Made to be worn out.</em></h2>
120
+ </div>
121
+ <div>
122
+ <p class="section__lede">Pre-order opens Friday 06.05 at 18h00 (Casablanca). First 200 orders ship same-week.</p>
123
+ <a href="#shop" class="section__link" style="margin-top:.75rem; display:inline-flex">View the full drop <span aria-hidden="true">→</span></a>
124
+ </div>
125
+ </div>
126
+
127
+ <div class="collection" role="list">
128
+
129
+ <article class="product" role="listitem"
130
+ data-product="atlas"
131
+ data-name="Atlas Wide-Leg Trouser"
132
+ data-variant="Bone · 32"
133
+ data-price="980"
134
+ data-surface="bone">
135
+ <div class="product__media">
136
+ <div class="surface surface--bone"></div>
137
+ <div class="zellige zellige--dark" aria-hidden="true"></div>
138
+ <span class="product__badge product__badge--new">New</span>
139
+ <button class="product__quick" data-add data-label="Add to bag">Add to bag</button>
140
+ </div>
141
+ <div class="product__row">
142
+ <div>
143
+ <h3 class="product__name">Atlas Wide-Leg Trouser</h3>
144
+ <p class="product__meta">Heavy linen · Bone</p>
145
+ </div>
146
+ <p class="product__price">980 MAD</p>
147
+ </div>
148
+ </article>
149
+
150
+ <article class="product" role="listitem"
151
+ data-product="zellige"
152
+ data-name="Zellige Knit Sweater"
153
+ data-variant="Saffron · M"
154
+ data-price="1180"
155
+ data-surface="saffron">
156
+ <div class="product__media">
157
+ <div class="surface surface--saffron"></div>
158
+ <div class="zellige zellige--dark" aria-hidden="true"></div>
159
+ <span class="product__badge product__badge--low">Low stock</span>
160
+ <button class="product__quick" data-add data-label="Add to bag">Add to bag</button>
161
+ </div>
162
+ <div class="product__row">
163
+ <div>
164
+ <h3 class="product__name">Zellige Knit Sweater</h3>
165
+ <p class="product__meta">Atlas wool · Saffron</p>
166
+ </div>
167
+ <p class="product__price">1,180 MAD</p>
168
+ </div>
169
+ </article>
170
+
171
+ <article class="product" role="listitem"
172
+ data-product="saadian"
173
+ data-name="Saadian Linen Shirt"
174
+ data-variant="Ink · L"
175
+ data-price="640"
176
+ data-surface="ink">
177
+ <div class="product__media">
178
+ <div class="surface surface--ink"></div>
179
+ <div class="zellige" aria-hidden="true"></div>
180
+ <button class="product__quick" data-add data-label="Add to bag">Add to bag</button>
181
+ </div>
182
+ <div class="product__row">
183
+ <div>
184
+ <h3 class="product__name">Saadian Linen Shirt</h3>
185
+ <p class="product__meta">Hand-loomed linen · Ink</p>
186
+ </div>
187
+ <p class="product__price"><s>820</s> 640 MAD</p>
188
+ </div>
189
+ </article>
190
+
191
+ <article class="product" role="listitem"
192
+ data-product="riad"
193
+ data-name="Riad Wool Coat"
194
+ data-variant="Marine · M"
195
+ data-price="2480"
196
+ data-surface="marine">
197
+ <div class="product__media">
198
+ <div class="surface surface--marine"></div>
199
+ <div class="zellige" aria-hidden="true"></div>
200
+ <span class="product__badge product__badge--new">New</span>
201
+ <button class="product__quick" data-add data-label="Add to bag">Add to bag</button>
202
+ </div>
203
+ <div class="product__row">
204
+ <div>
205
+ <h3 class="product__name">Riad Wool Coat</h3>
206
+ <p class="product__meta">Boiled Atlas wool · Marine</p>
207
+ </div>
208
+ <p class="product__price">2,480 MAD</p>
209
+ </div>
210
+ </article>
211
+
212
+ </div>
213
+ </section>
214
+
215
+ <!-- Editorial moment -->
216
+ <section class="shell" id="lookbook">
217
+ <div class="editorial">
218
+ <div class="editorial__bg" aria-hidden="true"></div>
219
+
220
+ <div>
221
+ <p class="editorial__eyebrow">Lookbook · W&rsquo;25 / 02</p>
222
+ <p class="editorial__quote">
223
+ A coat that should outlast its country of origin.
224
+ </p>
225
+ <p class="editorial__byline">— Karim Bennani · founder, NAJM</p>
226
+ </div>
227
+
228
+ <div>
229
+ <p style="max-width: 36ch; opacity: .9; line-height: 1.5; font-size: var(--text-md);">
230
+ Every piece is built for ten years. Boiled Atlas wool, hand-loomed linen, vegetable-tanned leather — sourced inside the country, cut by people we know by name.
231
+ </p>
232
+ <a href="#" class="editorial__cta">
233
+ See the full lookbook <span aria-hidden="true">→</span>
234
+ </a>
235
+ </div>
236
+ </div>
237
+ </section>
238
+
239
+ <!-- Trust strip -->
240
+ <section class="shell" id="story">
241
+ <div class="trust">
242
+ <div class="trust__item">
243
+ <span class="trust__num">24h</span>
244
+ <div>
245
+ <h3 class="trust__title">Same-week shipping</h3>
246
+ <p class="trust__body">Orders before 14h00 (Casablanca) leave the same day. Tracked, signed, in your hands.</p>
247
+ </div>
248
+ </div>
249
+ <div class="trust__item">
250
+ <span class="trust__num">14d</span>
251
+ <div>
252
+ <h3 class="trust__title">Free returns, no friction</h3>
253
+ <p class="trust__body">Don't love it, send it back. Anywhere in Morocco — we cover the courier.</p>
254
+ </div>
255
+ </div>
256
+ <div class="trust__item">
257
+ <span class="trust__num">100%</span>
258
+ <div>
259
+ <h3 class="trust__title">Made in Morocco</h3>
260
+ <p class="trust__body">Marrakech atelier, Casablanca warehouse. Every label tells you who cut the piece.</p>
261
+ </div>
262
+ </div>
263
+ <div class="trust__item">
264
+ <span class="trust__num">1%</span>
265
+ <div>
266
+ <h3 class="trust__title">Oasis reforestation</h3>
267
+ <p class="trust__body">One percent of every order plants palms in the Drâa-Tafilalet oases. Receipt with every shipment.</p>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ </section>
272
+
273
+ <!-- Newsletter -->
274
+ <section class="shell">
275
+ <div class="news">
276
+ <div>
277
+ <h2 class="news__h">Get the drop <em>before</em> it goes live.</h2>
278
+ <p class="news__p">Friday at 18h00 — first dibs on twenty-three pieces. Some are made once.</p>
279
+ </div>
280
+ <form id="news" class="news__form-wrap" novalidate>
281
+ <div class="news__form">
282
+ <input class="news__input" type="email" required placeholder="you@email.com" aria-label="Email" />
283
+ <button class="news__submit" type="submit">Notify me</button>
284
+ </div>
285
+ <p id="newsNote" class="news__note">No spam. One mail per drop. Unsubscribe with one tap.</p>
286
+ </form>
287
+ </div>
288
+ </section>
289
+
290
+ <!-- Footer -->
291
+ <footer class="footer">
292
+ <div class="shell">
293
+ <div class="footer__top">
294
+ <div>
295
+ <div class="footer__brand">NAJM<span style="color:var(--color-accent); margin-inline-start:8px; font-size:.6em" aria-hidden="true">نجم</span></div>
296
+ <p class="footer__tag">A clothing house from Morocco. Hand-cut in Marrakech, shipped from Casablanca, worn from Tangier to Tokyo.</p>
297
+ </div>
298
+ <div class="footer__col">
299
+ <h4 class="footer__col-h">Shop</h4>
300
+ <ul>
301
+ <li><a href="#">Winter &rsquo;25</a></li>
302
+ <li><a href="#">Outerwear</a></li>
303
+ <li><a href="#">Knitwear</a></li>
304
+ <li><a href="#">Linen</a></li>
305
+ <li><a href="#">Archive</a></li>
306
+ </ul>
307
+ </div>
308
+ <div class="footer__col">
309
+ <h4 class="footer__col-h">Help</h4>
310
+ <ul>
311
+ <li><a href="#">Sizing</a></li>
312
+ <li><a href="#">Shipping</a></li>
313
+ <li><a href="#">Returns</a></li>
314
+ <li><a href="#">Care</a></li>
315
+ <li><a href="#">Contact</a></li>
316
+ </ul>
317
+ </div>
318
+ <div class="footer__col">
319
+ <h4 class="footer__col-h">House</h4>
320
+ <ul>
321
+ <li><a href="#">Story</a></li>
322
+ <li><a href="#">Atelier</a></li>
323
+ <li><a href="#">Stockists</a></li>
324
+ <li><a href="#">Press</a></li>
325
+ <li><a href="#">Newsletter</a></li>
326
+ </ul>
327
+ </div>
328
+ </div>
329
+ <div class="footer__bottom">
330
+ <span>© 2026 NAJM · Casablanca</span>
331
+ <span>EN · FR · العربية</span>
332
+ <span>MAD · EUR · USD</span>
333
+ </div>
334
+ </div>
335
+ </footer>
336
+
337
+ <!-- Mobile sticky bar -->
338
+ <div class="mobile-bar" role="region" aria-label="Quick shop">
339
+ <span class="mobile-bar__text">W&rsquo;25 drop · Friday 18h00</span>
340
+ <button id="mobileCart" class="mobile-bar__cta">Shop now →</button>
341
+ </div>
342
+
343
+ <!-- Cart drawer -->
344
+ <div id="scrim" class="scrim" aria-hidden="true"></div>
345
+ <aside id="drawer" class="drawer" role="dialog" aria-modal="true" aria-labelledby="drawerTitle" aria-hidden="true">
346
+ <div class="drawer__head">
347
+ <h3 id="drawerTitle" class="drawer__title">Your bag</h3>
348
+ <button class="icon-btn drawer__close" aria-label="Close bag">
349
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M18 6 6 18M6 6l12 12"/></svg>
350
+ </button>
351
+ </div>
352
+ <div id="cartLines" class="drawer__body"></div>
353
+ <div class="drawer__foot">
354
+ <p id="cartFree" class="drawer__free">Calculating shipping…</p>
355
+ <div class="drawer__total">
356
+ <span>Total</span>
357
+ <b id="cartTotal">—</b>
358
+ </div>
359
+ <a href="#checkout" class="drawer__checkout">
360
+ Checkout <span aria-hidden="true">→</span>
361
+ </a>
362
+ <p class="drawer__free">Apple Pay · CMI · Cash on delivery (Morocco only)</p>
363
+ </div>
364
+ </aside>
365
+
366
+ <script src="./script.js" defer></script>
367
+ </body>
368
+ </html>
@@ -0,0 +1,133 @@
1
+ // NAJM · cart drawer + add-to-bag micro
2
+ const $ = (s, p = document) => p.querySelector(s);
3
+ const $$ = (s, p = document) => Array.from(p.querySelectorAll(s));
4
+
5
+ const drawer = $("#drawer");
6
+ const scrim = $("#scrim");
7
+ const cartBtn = $("#cartBtn");
8
+ const cartCount = $("#cartCount");
9
+ const cartTotal = $("#cartTotal");
10
+ const cartLines = $("#cartLines");
11
+ const cartFree = $("#cartFree");
12
+
13
+ const state = {
14
+ items: [
15
+ { id: "atlas", name: "Atlas Wide-Leg Trouser", variant: "Bone · 32", price: 980, qty: 1, surface: "bone" },
16
+ { id: "medina", name: "Médina Cropped Jacket", variant: "Terracotta · M", price: 1450, qty: 1, surface: "terracotta" },
17
+ ],
18
+ };
19
+
20
+ const fmt = (n) => `${n.toLocaleString("fr-MA")} MAD`;
21
+ const FREE_OVER = 1500;
22
+
23
+ function render() {
24
+ cartLines.innerHTML = state.items.map(item => `
25
+ <div class="drawer__line" data-id="${item.id}">
26
+ <div class="drawer__thumb">
27
+ <div class="surface surface--${item.surface}"></div>
28
+ <div class="zellige${item.surface === "bone" ? " zellige--dark" : ""}"></div>
29
+ </div>
30
+ <div>
31
+ <div class="drawer__name">${item.name}</div>
32
+ <div class="drawer__sub">${item.variant}</div>
33
+ <div class="drawer__qty" role="group" aria-label="Quantity for ${item.name}">
34
+ <button data-act="dec" aria-label="Decrease">–</button>
35
+ <span aria-live="polite">${item.qty}</span>
36
+ <button data-act="inc" aria-label="Increase">+</button>
37
+ </div>
38
+ </div>
39
+ <div class="drawer__price">${fmt(item.price * item.qty)}</div>
40
+ </div>
41
+ `).join("");
42
+
43
+ const subtotal = state.items.reduce((s, i) => s + i.price * i.qty, 0);
44
+ const count = state.items.reduce((s, i) => s + i.qty, 0);
45
+
46
+ cartCount.textContent = count;
47
+ cartTotal.textContent = fmt(subtotal);
48
+
49
+ const remain = FREE_OVER - subtotal;
50
+ cartFree.textContent = remain > 0
51
+ ? `${fmt(remain)} away from free shipping`
52
+ : "Free shipping unlocked · ships in 24h";
53
+ }
54
+
55
+ function open() {
56
+ drawer.classList.add("is-open");
57
+ scrim.classList.add("is-open");
58
+ drawer.setAttribute("aria-hidden", "false");
59
+ document.body.style.overflow = "hidden";
60
+ setTimeout(() => $(".drawer__close")?.focus(), 50);
61
+ }
62
+ function close() {
63
+ drawer.classList.remove("is-open");
64
+ scrim.classList.remove("is-open");
65
+ drawer.setAttribute("aria-hidden", "true");
66
+ document.body.style.overflow = "";
67
+ cartBtn.focus();
68
+ }
69
+
70
+ cartBtn.addEventListener("click", open);
71
+ $("#mobileCart")?.addEventListener("click", open);
72
+ scrim.addEventListener("click", close);
73
+ $(".drawer__close").addEventListener("click", close);
74
+ document.addEventListener("keydown", (e) => {
75
+ if (e.key === "Escape" && drawer.classList.contains("is-open")) close();
76
+ });
77
+
78
+ cartLines.addEventListener("click", (e) => {
79
+ const btn = e.target.closest("button[data-act]");
80
+ if (!btn) return;
81
+ const line = btn.closest(".drawer__line");
82
+ const item = state.items.find(i => i.id === line.dataset.id);
83
+ if (!item) return;
84
+ if (btn.dataset.act === "inc") item.qty += 1;
85
+ if (btn.dataset.act === "dec") item.qty = Math.max(1, item.qty - 1);
86
+ render();
87
+ });
88
+
89
+ // Add-to-bag from product cards
90
+ $$("[data-add]").forEach(btn => {
91
+ btn.addEventListener("click", (e) => {
92
+ e.preventDefault();
93
+ const card = btn.closest("[data-product]");
94
+ const id = card.dataset.product;
95
+ const found = state.items.find(i => i.id === id);
96
+ if (found) {
97
+ found.qty += 1;
98
+ } else {
99
+ state.items.push({
100
+ id,
101
+ name: card.dataset.name,
102
+ variant: card.dataset.variant,
103
+ price: Number(card.dataset.price),
104
+ surface: card.dataset.surface,
105
+ qty: 1,
106
+ });
107
+ }
108
+ render();
109
+ cartCount.classList.remove("is-pulse");
110
+ void cartCount.offsetWidth; // restart animation
111
+ cartCount.classList.add("is-pulse");
112
+ btn.textContent = "Added ✓";
113
+ setTimeout(() => { btn.textContent = btn.dataset.label || "Add to bag"; }, 1400);
114
+ });
115
+ });
116
+
117
+ // Newsletter — inline confirmation, no toast
118
+ $("#news")?.addEventListener("submit", (e) => {
119
+ e.preventDefault();
120
+ const input = e.target.querySelector("input");
121
+ const note = $("#newsNote");
122
+ if (!input.value.includes("@")) {
123
+ note.textContent = "Add a valid email to subscribe.";
124
+ note.style.color = "var(--color-accent-deep)";
125
+ input.focus();
126
+ return;
127
+ }
128
+ note.textContent = `${input.value} is on the list — first drop ships Friday.`;
129
+ note.style.color = "var(--color-ink)";
130
+ input.value = "";
131
+ });
132
+
133
+ render();