howone 0.1.20 → 0.1.23

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 (298) hide show
  1. package/package.json +1 -1
  2. package/templates/nextjs/lib/sdk.ts +3 -0
  3. package/templates/vite/.howone/skills/hallmark/LICENSE +21 -0
  4. package/templates/vite/.howone/skills/hallmark/README.md +147 -0
  5. package/templates/vite/.howone/skills/hallmark/ROADMAP.md +201 -0
  6. package/templates/vite/.howone/skills/hallmark/SKILL.md +551 -0
  7. package/templates/vite/.howone/skills/hallmark/docs/recipes.md +186 -0
  8. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
  9. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
  10. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
  11. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
  12. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
  13. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
  14. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
  15. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
  16. package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +176 -0
  17. package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +364 -0
  18. package/templates/vite/.howone/skills/hallmark/package.json +36 -0
  19. package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +412 -0
  20. package/templates/vite/.howone/skills/hallmark/references/assets.md +399 -0
  21. package/templates/vite/.howone/skills/hallmark/references/color.md +95 -0
  22. package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +256 -0
  23. package/templates/vite/.howone/skills/hallmark/references/components/c1-outlined-chip.md +12 -0
  24. package/templates/vite/.howone/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -0
  25. package/templates/vite/.howone/skills/hallmark/references/components/c3-typographic-link.md +8 -0
  26. package/templates/vite/.howone/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -0
  27. package/templates/vite/.howone/skills/hallmark/references/components/f1-bento-grid.md +20 -0
  28. package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -0
  29. package/templates/vite/.howone/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -0
  30. package/templates/vite/.howone/skills/hallmark/references/components/f4-step-sequence.md +11 -0
  31. package/templates/vite/.howone/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -0
  32. package/templates/vite/.howone/skills/hallmark/references/components/f6-product-card-grid.md +41 -0
  33. package/templates/vite/.howone/skills/hallmark/references/components/ft1-mast-headed.md +13 -0
  34. package/templates/vite/.howone/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -0
  35. package/templates/vite/.howone/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -0
  36. package/templates/vite/.howone/skills/hallmark/references/components/ft4-dense-typographic.md +10 -0
  37. package/templates/vite/.howone/skills/hallmark/references/components/ft5-statement.md +21 -0
  38. package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +19 -0
  39. package/templates/vite/.howone/skills/hallmark/references/components/ft7-newsletter-first.md +27 -0
  40. package/templates/vite/.howone/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -0
  41. package/templates/vite/.howone/skills/hallmark/references/components/h1-marquee.md +15 -0
  42. package/templates/vite/.howone/skills/hallmark/references/components/h2-split-diptych.md +15 -0
  43. package/templates/vite/.howone/skills/hallmark/references/components/h3-quote-led.md +11 -0
  44. package/templates/vite/.howone/skills/hallmark/references/components/h4-stat-led.md +14 -0
  45. package/templates/vite/.howone/skills/hallmark/references/components/h5-letter-hero.md +11 -0
  46. package/templates/vite/.howone/skills/hallmark/references/components/h6-photographic-fold.md +16 -0
  47. package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -0
  48. package/templates/vite/.howone/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -0
  49. package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -0
  50. package/templates/vite/.howone/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -0
  51. package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -0
  52. package/templates/vite/.howone/skills/hallmark/references/components/n2-floating-chip.md +14 -0
  53. package/templates/vite/.howone/skills/hallmark/references/components/n3-side-rail.md +14 -0
  54. package/templates/vite/.howone/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -0
  55. package/templates/vite/.howone/skills/hallmark/references/components/n5-floating-pill.md +28 -0
  56. package/templates/vite/.howone/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -0
  57. package/templates/vite/.howone/skills/hallmark/references/components/n7-brutal-slab.md +22 -0
  58. package/templates/vite/.howone/skills/hallmark/references/components/n8-terminal-command.md +21 -0
  59. package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -0
  60. package/templates/vite/.howone/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -0
  61. package/templates/vite/.howone/skills/hallmark/references/components/s2-hanging.md +13 -0
  62. package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +19 -0
  63. package/templates/vite/.howone/skills/hallmark/references/components/s4-inline-no-break.md +11 -0
  64. package/templates/vite/.howone/skills/hallmark/references/components/s5-bottom-anchored.md +13 -0
  65. package/templates/vite/.howone/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -0
  66. package/templates/vite/.howone/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -0
  67. package/templates/vite/.howone/skills/hallmark/references/components/t3-single-huge-quote.md +11 -0
  68. package/templates/vite/.howone/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -0
  69. package/templates/vite/.howone/skills/hallmark/references/contract.md +24 -0
  70. package/templates/vite/.howone/skills/hallmark/references/copy.md +182 -0
  71. package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +626 -0
  72. package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +329 -0
  73. package/templates/vite/.howone/skills/hallmark/references/design-md.md +116 -0
  74. package/templates/vite/.howone/skills/hallmark/references/export-formats.md +328 -0
  75. package/templates/vite/.howone/skills/hallmark/references/floating-nav.md +89 -0
  76. package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +65 -0
  77. package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +70 -0
  78. package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +67 -0
  79. package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +65 -0
  80. package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +474 -0
  81. package/templates/vite/.howone/skills/hallmark/references/imagery-kit.md +170 -0
  82. package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +207 -0
  83. package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +111 -0
  84. package/templates/vite/.howone/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -0
  85. package/templates/vite/.howone/skills/hallmark/references/macrostructures/02-long-document.md +34 -0
  86. package/templates/vite/.howone/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -0
  87. package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +32 -0
  88. package/templates/vite/.howone/skills/hallmark/references/macrostructures/05-workbench.md +32 -0
  89. package/templates/vite/.howone/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -0
  90. package/templates/vite/.howone/skills/hallmark/references/macrostructures/07-manifesto.md +32 -0
  91. package/templates/vite/.howone/skills/hallmark/references/macrostructures/08-photographic.md +34 -0
  92. package/templates/vite/.howone/skills/hallmark/references/macrostructures/09-quote-led.md +32 -0
  93. package/templates/vite/.howone/skills/hallmark/references/macrostructures/10-specimen.md +32 -0
  94. package/templates/vite/.howone/skills/hallmark/references/macrostructures/11-catalogue.md +23 -0
  95. package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +23 -0
  96. package/templates/vite/.howone/skills/hallmark/references/macrostructures/13-index-first.md +23 -0
  97. package/templates/vite/.howone/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -0
  98. package/templates/vite/.howone/skills/hallmark/references/macrostructures/15-split-studio.md +23 -0
  99. package/templates/vite/.howone/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
  100. package/templates/vite/.howone/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -0
  101. package/templates/vite/.howone/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -0
  102. package/templates/vite/.howone/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -0
  103. package/templates/vite/.howone/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -0
  104. package/templates/vite/.howone/skills/hallmark/references/macrostructures/21-component-playground.md +23 -0
  105. package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +89 -0
  106. package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +260 -0
  107. package/templates/vite/.howone/skills/hallmark/references/motion.md +109 -0
  108. package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +49 -0
  109. package/templates/vite/.howone/skills/hallmark/references/responsive.md +138 -0
  110. package/templates/vite/.howone/skills/hallmark/references/slop-test.md +205 -0
  111. package/templates/vite/.howone/skills/hallmark/references/structure.md +164 -0
  112. package/templates/vite/.howone/skills/hallmark/references/study.md +486 -0
  113. package/templates/vite/.howone/skills/hallmark/references/typography.md +243 -0
  114. package/templates/vite/.howone/skills/hallmark/references/verbs/audit.md +25 -0
  115. package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +269 -0
  116. package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
  117. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +71 -0
  118. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +64 -0
  119. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +240 -0
  120. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +65 -0
  121. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +105 -0
  122. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +250 -0
  123. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +64 -0
  124. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +131 -0
  125. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +240 -0
  126. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +67 -0
  127. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +86 -0
  128. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +262 -0
  129. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +63 -0
  130. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +167 -0
  131. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +457 -0
  132. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +65 -0
  133. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +159 -0
  134. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +288 -0
  135. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +64 -0
  136. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +146 -0
  137. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +484 -0
  138. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +64 -0
  139. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +116 -0
  140. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +354 -0
  141. package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +638 -0
  142. package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +515 -0
  143. package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +515 -0
  144. package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +608 -0
  145. package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +587 -0
  146. package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +157 -0
  147. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
  148. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
  149. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
  150. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
  151. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
  152. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
  153. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
  154. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
  155. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
  156. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
  157. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
  158. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
  159. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
  160. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
  161. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
  162. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
  163. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
  164. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
  165. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
  166. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
  167. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
  168. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
  169. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
  170. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +77 -0
  171. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +238 -0
  172. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +110 -0
  173. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +326 -0
  174. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +134 -0
  175. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +262 -0
  176. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +30 -0
  177. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +17 -0
  178. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +56 -0
  179. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +160 -0
  180. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +29 -0
  181. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +63 -0
  182. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +72 -0
  183. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +374 -0
  184. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +52 -0
  185. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +29 -0
  186. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +61 -0
  187. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +193 -0
  188. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +66 -0
  189. package/templates/vite/.howone/skills/hallmark/site/css/base.css +194 -0
  190. package/templates/vite/.howone/skills/hallmark/site/css/components.css +4886 -0
  191. package/templates/vite/.howone/skills/hallmark/site/css/sections.css +2072 -0
  192. package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +1129 -0
  193. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +475 -0
  194. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +1584 -0
  195. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +96 -0
  196. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +344 -0
  197. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +103 -0
  198. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +1103 -0
  199. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +83 -0
  200. package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +368 -0
  201. package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +133 -0
  202. package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +1062 -0
  203. package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +97 -0
  204. package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +84 -0
  205. package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +446 -0
  206. package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +1087 -0
  207. package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +101 -0
  208. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +359 -0
  209. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +1168 -0
  210. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +81 -0
  211. package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +5 -0
  212. package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +5 -0
  213. package/templates/vite/.howone/skills/hallmark/site/index.html +1043 -0
  214. package/templates/vite/.howone/skills/hallmark/site/js/main.js +1175 -0
  215. package/templates/vite/.howone/skills/hallmark/vercel.json +6 -0
  216. package/templates/vite/.howone/skills/howone-sdk/01-architect/01-app-generation.md +126 -0
  217. package/templates/vite/.howone/skills/howone-sdk/{references/08-manifest-codegen.md → 01-architect/02-manifest-codegen.md} +31 -19
  218. package/templates/vite/.howone/skills/howone-sdk/02-database/01-schema-design.md +147 -0
  219. package/templates/vite/.howone/skills/howone-sdk/02-database/02-schema-operations.md +96 -0
  220. package/templates/vite/.howone/skills/howone-sdk/02-database/03-data-access-patterns.md +172 -0
  221. package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/01-client-setup.md +3 -3
  222. package/templates/vite/.howone/skills/howone-sdk/{references/04-auth.md → 03-sdk/03-auth.md} +120 -3
  223. package/templates/vite/.howone/skills/howone-sdk/{references/06-react-integration.md → 03-sdk/04-react-integration.md} +2 -4
  224. package/templates/vite/.howone/skills/howone-sdk/{references/03-ai-actions.md → 03-sdk/07-ai-action-calls.md} +31 -34
  225. package/templates/vite/.howone/skills/howone-sdk/04-ai/.gitkeep +1 -0
  226. package/templates/vite/.howone/skills/howone-sdk/04-ai/01-ai-capability-architecture.md +142 -0
  227. package/templates/vite/.howone/skills/howone-sdk/04-ai/02-workflow-contract-rules.md +169 -0
  228. package/templates/vite/.howone/skills/howone-sdk/04-ai/03-ai-sdk-handoff.md +80 -0
  229. package/templates/vite/.howone/skills/howone-sdk/SKILL.md +118 -93
  230. package/templates/vite/.howone/skills/howone-sdk/agents/openai.yaml +3 -3
  231. package/templates/vite/.howone/skills/impeccable/SKILL.md +168 -0
  232. package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
  233. package/templates/vite/.howone/skills/impeccable/reference/adapt.md +190 -0
  234. package/templates/vite/.howone/skills/impeccable/reference/animate.md +175 -0
  235. package/templates/vite/.howone/skills/impeccable/reference/audit.md +133 -0
  236. package/templates/vite/.howone/skills/impeccable/reference/bolder.md +113 -0
  237. package/templates/vite/.howone/skills/impeccable/reference/brand.md +118 -0
  238. package/templates/vite/.howone/skills/impeccable/reference/clarify.md +174 -0
  239. package/templates/vite/.howone/skills/impeccable/reference/codex.md +105 -0
  240. package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +106 -0
  241. package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +105 -0
  242. package/templates/vite/.howone/skills/impeccable/reference/colorize.md +154 -0
  243. package/templates/vite/.howone/skills/impeccable/reference/craft.md +123 -0
  244. package/templates/vite/.howone/skills/impeccable/reference/critique.md +273 -0
  245. package/templates/vite/.howone/skills/impeccable/reference/delight.md +302 -0
  246. package/templates/vite/.howone/skills/impeccable/reference/distill.md +111 -0
  247. package/templates/vite/.howone/skills/impeccable/reference/document.md +427 -0
  248. package/templates/vite/.howone/skills/impeccable/reference/extract.md +69 -0
  249. package/templates/vite/.howone/skills/impeccable/reference/harden.md +347 -0
  250. package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +234 -0
  251. package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +195 -0
  252. package/templates/vite/.howone/skills/impeccable/reference/layout.md +141 -0
  253. package/templates/vite/.howone/skills/impeccable/reference/live.md +622 -0
  254. package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +109 -0
  255. package/templates/vite/.howone/skills/impeccable/reference/onboard.md +234 -0
  256. package/templates/vite/.howone/skills/impeccable/reference/optimize.md +258 -0
  257. package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +130 -0
  258. package/templates/vite/.howone/skills/impeccable/reference/personas.md +179 -0
  259. package/templates/vite/.howone/skills/impeccable/reference/polish.md +242 -0
  260. package/templates/vite/.howone/skills/impeccable/reference/product.md +62 -0
  261. package/templates/vite/.howone/skills/impeccable/reference/quieter.md +99 -0
  262. package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +114 -0
  263. package/templates/vite/.howone/skills/impeccable/reference/shape.md +165 -0
  264. package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +100 -0
  265. package/templates/vite/.howone/skills/impeccable/reference/teach.md +156 -0
  266. package/templates/vite/.howone/skills/impeccable/reference/typeset.md +124 -0
  267. package/templates/vite/.howone/skills/impeccable/reference/typography.md +159 -0
  268. package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +107 -0
  269. package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  270. package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +94 -0
  271. package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +242 -0
  272. package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +820 -0
  273. package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +198 -0
  274. package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +21 -0
  275. package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
  276. package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +69 -0
  277. package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +595 -0
  278. package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +123 -0
  279. package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +4860 -0
  280. package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +75 -0
  281. package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +18 -0
  282. package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +446 -0
  283. package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +200 -0
  284. package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +48 -0
  285. package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +838 -0
  286. package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +254 -0
  287. package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +47 -0
  288. package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +632 -0
  289. package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +247 -0
  290. package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +141 -0
  291. package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  292. package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +214 -0
  293. package/templates/vite/AGENTS.md +2 -12
  294. package/templates/vite/package.json +1 -1
  295. package/templates/vite/src/lib/sdk.ts +3 -0
  296. /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/02-entity-operations.md +0 -0
  297. /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/05-file-upload.md +0 -0
  298. /package/templates/vite/.howone/skills/howone-sdk/{references/07-raw-http.md → 03-sdk/06-raw-http.md} +0 -0
@@ -0,0 +1,110 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Loop — real-time payment-rail observability for fintechs</title>
7
+ <meta name="description" content="See every cross-rail payment in real time. Find the regressed leg, read why, and clear the queue before the SLA fires." />
8
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500&family=Geist:wght@400;500;600&display=swap" />
11
+ <link rel="stylesheet" href="style.css" />
12
+ </head>
13
+ <body>
14
+ <main class="page">
15
+ <header class="masthead">
16
+ <span class="masthead__brand"><span class="dot"></span>loop · v0.7</span>
17
+ <nav class="masthead__nav">
18
+ <a href="#walkthrough">Walkthrough</a>
19
+ <a href="#">Rails</a>
20
+ <a href="#">Pricing</a>
21
+ <a href="#">Docs</a>
22
+ </nav>
23
+ </header>
24
+
25
+ <section class="hero">
26
+ <div class="hero__copy">
27
+ <p class="hero__eyebrow">For payment platform engineers</p>
28
+ <h1 class="hero__head">Real-time payment-rail observability that <em>tells you why.</em></h1>
29
+ <p class="hero__sub">
30
+ Watch every leg of a cross-rail payment in flight. Find the regressed
31
+ hop, read why — in plain text — without grafana, splunk, and a status-page hunt.
32
+ Loop is what your on-call wishes the bank's API gave them.
33
+ </p>
34
+ <div class="hero__cta">
35
+ <a class="btn btn--primary" href="#">Try it free <span aria-hidden="true">→</span></a>
36
+ <a class="btn" href="#">Talk to sales</a>
37
+ </div>
38
+ </div>
39
+ <aside class="hero__panel" aria-label="Sample trace preview">
40
+ <div class="hero__panel-head"><span>payment · 9c3a72ef</span><span>4.21 s</span></div>
41
+ <div class="trace">
42
+ <div class="span"><span class="span__label">api.transfer</span><span class="span__bar"><i style="width:100%"></i></span><span class="span__time">4.21s</span></div>
43
+ <div class="span"><span class="span__label">↳ kyc.verify</span><span class="span__bar"><i style="width:18%"></i></span><span class="span__time">762ms</span></div>
44
+ <div class="span span--err"><span class="span__label">↳ rail.swift</span><span class="span__bar"><i style="width:78%"></i></span><span class="span__time">3.28s</span></div>
45
+ <div class="span span--warn"><span class="span__label">&nbsp;&nbsp;↳ fx.spot</span><span class="span__bar"><i style="width:62%"></i></span><span class="span__time">2.71s</span></div>
46
+ <div class="span"><span class="span__label">↳ ledger.write</span><span class="span__bar"><i style="width:6%"></i></span><span class="span__time">240ms</span></div>
47
+ </div>
48
+ </aside>
49
+ </section>
50
+
51
+ <section class="workbench" id="walkthrough">
52
+ <div class="steps">
53
+ <article class="step">
54
+ <p class="step__num">step 01 · open</p>
55
+ <h2 class="step__head">Open the payment, not a dashboard.</h2>
56
+ <p class="step__body">
57
+ Drop a payment ID, an idempotency key, or a five-second time window. Loop
58
+ pulls the legs from your rails and renders them inline — no Grafana hop,
59
+ no link to Splunk, no separate logs window. The payment is the unit of work.
60
+ </p>
61
+ </article>
62
+
63
+ <article class="step">
64
+ <p class="step__num">step 02 · find</p>
65
+ <h2 class="step__head">Find the regressed leg.</h2>
66
+ <p class="step__body">
67
+ Loop ranks legs by <strong>p99 deviation against your rail's seven-day baseline</strong>.
68
+ The first one in the list is almost always the problem. The baseline is
69
+ precomputed every five minutes per rail; you don't set it.
70
+ </p>
71
+ </article>
72
+
73
+ <article class="step">
74
+ <p class="step__num">step 03 · read</p>
75
+ <h2 class="step__head">Read why, in plain text.</h2>
76
+ <p class="step__body">
77
+ Each leg carries an <strong>auto-generated explainer</strong>: which dependency
78
+ regressed, which version of which service, which deploy correlates, and the
79
+ diff between then and now. Plain text, copy-paste ready into a post-mortem.
80
+ </p>
81
+ </article>
82
+ </div>
83
+
84
+ <aside class="pinned" aria-label="Pinned trace panel">
85
+ <header class="pinned__head">
86
+ <span>payment · 9c3a72ef</span>
87
+ <span class="pinned__chip">REGRESSED</span>
88
+ </header>
89
+ <div class="trace">
90
+ <div class="span"><span class="span__label">api.transfer</span><span class="span__bar"><i style="width:100%"></i></span><span class="span__time">4.21s</span></div>
91
+ <div class="span"><span class="span__label">↳ kyc.verify</span><span class="span__bar"><i style="width:18%"></i></span><span class="span__time">762ms</span></div>
92
+ <div class="span span--err"><span class="span__label">↳ rail.swift</span><span class="span__bar"><i style="width:78%"></i></span><span class="span__time">3.28s</span></div>
93
+ <div class="span span--warn"><span class="span__label">&nbsp;&nbsp;↳ fx.spot</span><span class="span__bar"><i style="width:62%"></i></span><span class="span__time">2.71s</span></div>
94
+ <div class="span"><span class="span__label">↳ ledger.write</span><span class="span__bar"><i style="width:6%"></i></span><span class="span__time">240ms</span></div>
95
+ </div>
96
+ <p class="pinned__why">
97
+ <strong>WHY:</strong> rail.swift p99 doubled at 14:02 UTC. Correlates with
98
+ counterparty BNYM-N's queue depth crossing 12 k pending. Loop's escalation
99
+ fires automatically; oncall has the diff in their inbox.
100
+ </p>
101
+ </aside>
102
+ </section>
103
+
104
+ <footer class="colophon">
105
+ <span>Loop · v0.7 · made in Lisbon &amp; Berlin</span>
106
+ <span><a href="#">docs</a> · <a href="#">changelog</a> · <a href="#">status</a> · <a href="#">github</a></span>
107
+ </footer>
108
+ </main>
109
+ </body>
110
+ </html>
@@ -0,0 +1,326 @@
1
+ /* Hallmark · macrostructure: Workbench · F2 sticky-scroll knobs: pinned=right, content=trace-panel, steps=3
2
+ * theme: custom · vibe: "industrial precision, cool, technical" · paper: oklch(13% 0.012 220) · accent: oklch(72% 0.16 220)
3
+ * display: Geist Mono 500 · body: Geist · axes: dark / mono / cool
4
+ * studied: no · context: explicit · v0.7.0
5
+ */
6
+
7
+ :root {
8
+ /* Custom palette — dark cool, sea-blue anchor */
9
+ --color-paper: oklch(13% 0.012 220);
10
+ --color-paper-2: oklch(17% 0.014 220);
11
+ --color-paper-3: oklch(22% 0.014 220);
12
+ --color-rule: oklch(30% 0.012 220);
13
+ --color-rule-2: oklch(26% 0.012 220);
14
+ --color-muted: oklch(58% 0.012 220);
15
+ --color-neutral: oklch(50% 0.012 220);
16
+ --color-ink: oklch(94% 0.010 220);
17
+ --color-ink-2: oklch(72% 0.010 220);
18
+ --color-accent: oklch(72% 0.16 220);
19
+ --color-accent-ink: oklch(13% 0.012 220);
20
+ --color-focus: oklch(78% 0.20 220);
21
+ --color-warn: oklch(72% 0.16 70);
22
+ --color-error: oklch(64% 0.18 28);
23
+
24
+ /* Single-family pair: Geist Mono display + Geist body — same family, different widths */
25
+ --font-display: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
26
+ --font-body: "Geist", "Inter Tight", -apple-system, sans-serif;
27
+ --font-mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
28
+
29
+ --space-3xs: 0.25rem;
30
+ --space-2xs: 0.5rem;
31
+ --space-xs: 0.75rem;
32
+ --space-sm: 1rem;
33
+ --space-md: 1.5rem;
34
+ --space-lg: 2rem;
35
+ --space-xl: 3rem;
36
+ --space-2xl: 4.5rem;
37
+ --space-3xl: 6.5rem;
38
+
39
+ --ease-out: cubic-bezier(0.2, 0.8, 0.2, 1);
40
+ --dur-micro: 100ms;
41
+ --dur-short: 200ms;
42
+ }
43
+
44
+ * { box-sizing: border-box; }
45
+ html, body { overflow-x: clip; }
46
+
47
+ body {
48
+ margin: 0;
49
+ background: var(--color-paper);
50
+ color: var(--color-ink);
51
+ font-family: var(--font-body);
52
+ font-size: 0.9375rem;
53
+ line-height: 1.55;
54
+ -webkit-font-smoothing: antialiased;
55
+ }
56
+
57
+ .page { max-width: 80rem; margin: 0 auto; padding: 0 var(--space-lg); }
58
+
59
+ .masthead {
60
+ display: flex;
61
+ justify-content: space-between;
62
+ align-items: center;
63
+ padding: var(--space-md) 0;
64
+ border-block-end: 1px solid var(--color-rule);
65
+ font-family: var(--font-display);
66
+ font-size: 0.8125rem;
67
+ letter-spacing: 0.04em;
68
+ color: var(--color-ink-2);
69
+ }
70
+
71
+ .masthead__brand { color: var(--color-ink); font-weight: 500; }
72
+ .masthead__brand .dot {
73
+ display: inline-block;
74
+ width: 0.55ch;
75
+ height: 0.55ch;
76
+ background: var(--color-accent);
77
+ border-radius: 50%;
78
+ margin-inline-end: 0.5ch;
79
+ vertical-align: 0.1em;
80
+ }
81
+
82
+ .masthead__nav { display: flex; gap: var(--space-md); }
83
+ .masthead__nav a {
84
+ color: var(--color-ink-2);
85
+ text-decoration: none;
86
+ transition: color var(--dur-micro) var(--ease-out);
87
+ }
88
+ .masthead__nav a:hover, .masthead__nav a:focus-visible { color: var(--color-ink); }
89
+ .masthead__nav a:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 3px; }
90
+
91
+ /* Hero */
92
+ .hero {
93
+ padding: var(--space-3xl) 0 var(--space-2xl);
94
+ display: grid;
95
+ grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
96
+ gap: var(--space-2xl);
97
+ align-items: end;
98
+ border-block-end: 1px solid var(--color-rule);
99
+ }
100
+
101
+ .hero__copy { max-width: 36rem; }
102
+
103
+ .hero__eyebrow {
104
+ font-family: var(--font-display);
105
+ font-size: 0.75rem;
106
+ letter-spacing: 0.12em;
107
+ text-transform: uppercase;
108
+ color: var(--color-accent);
109
+ margin: 0 0 var(--space-md);
110
+ }
111
+
112
+ .hero__head {
113
+ font-family: var(--font-display);
114
+ font-size: clamp(2rem, 4.5vw, 3.5rem);
115
+ font-weight: 500;
116
+ line-height: 1.05;
117
+ letter-spacing: -0.025em;
118
+ margin: 0 0 var(--space-md);
119
+ color: var(--color-ink);
120
+ }
121
+
122
+ .hero__head em { font-style: normal; color: var(--color-accent); }
123
+
124
+ .hero__sub {
125
+ font-size: 1.0625rem;
126
+ line-height: 1.5;
127
+ color: var(--color-ink-2);
128
+ margin: 0 0 var(--space-lg);
129
+ max-width: 56ch;
130
+ }
131
+
132
+ .hero__cta { display: flex; gap: var(--space-sm); flex-wrap: wrap; }
133
+
134
+ .btn {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ gap: 0.5ch;
138
+ padding: var(--space-sm) var(--space-md);
139
+ font-family: var(--font-display);
140
+ font-size: 0.875rem;
141
+ font-weight: 500;
142
+ text-decoration: none;
143
+ border: 1px solid var(--color-rule);
144
+ background: transparent;
145
+ color: var(--color-ink);
146
+ cursor: pointer;
147
+ line-height: 1;
148
+ transition: background var(--dur-micro) var(--ease-out),
149
+ border-color var(--dur-micro) var(--ease-out),
150
+ color var(--dur-micro) var(--ease-out);
151
+ }
152
+
153
+ .btn--primary { background: var(--color-accent); color: var(--color-accent-ink); border-color: var(--color-accent); }
154
+ .btn--primary:hover, .btn--primary:focus-visible { background: var(--color-ink); border-color: var(--color-ink); }
155
+ .btn:hover, .btn:focus-visible { border-color: var(--color-accent); color: var(--color-accent); }
156
+ .btn:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 3px; }
157
+
158
+ /* Hero panel — sample trace */
159
+ .hero__panel {
160
+ background: var(--color-paper-2);
161
+ border: 1px solid var(--color-rule);
162
+ border-radius: 4px;
163
+ padding: var(--space-md);
164
+ font-family: var(--font-display);
165
+ font-size: 0.75rem;
166
+ }
167
+
168
+ .hero__panel-head {
169
+ display: flex; justify-content: space-between;
170
+ border-block-end: 1px solid var(--color-rule);
171
+ padding-block-end: var(--space-2xs);
172
+ margin-block-end: var(--space-sm);
173
+ color: var(--color-ink-2);
174
+ }
175
+
176
+ .trace { display: grid; gap: 4px; }
177
+ .span {
178
+ display: grid;
179
+ grid-template-columns: 14ch 1fr 6ch;
180
+ gap: var(--space-2xs);
181
+ align-items: center;
182
+ }
183
+ .span__label { color: var(--color-ink); white-space: nowrap; }
184
+ .span__bar {
185
+ position: relative;
186
+ height: 8px;
187
+ background: var(--color-paper-3);
188
+ border-radius: 1px;
189
+ overflow: hidden;
190
+ }
191
+ .span__bar > i {
192
+ position: absolute;
193
+ inset-block: 0;
194
+ inset-inline-start: 0;
195
+ background: var(--color-accent);
196
+ border-radius: 1px;
197
+ }
198
+ .span--err .span__bar > i { background: var(--color-error); }
199
+ .span--warn .span__bar > i { background: var(--color-warn); }
200
+ .span__time { font-variant-numeric: tabular-nums; color: var(--color-ink-2); text-align: end; }
201
+
202
+ /* Walkthrough */
203
+ .workbench {
204
+ display: grid;
205
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
206
+ gap: var(--space-2xl);
207
+ padding: var(--space-3xl) 0;
208
+ }
209
+
210
+ .steps { display: grid; gap: var(--space-3xl); }
211
+
212
+ .step {
213
+ border-inline-start: 2px solid var(--color-rule);
214
+ padding-inline-start: var(--space-lg);
215
+ position: relative;
216
+ }
217
+ .step::before {
218
+ content: "";
219
+ position: absolute;
220
+ inset-inline-start: -2px;
221
+ inset-block-start: 0;
222
+ width: 2px;
223
+ height: 0;
224
+ background: var(--color-accent);
225
+ transition: height var(--dur-short) var(--ease-out);
226
+ }
227
+ .step:hover::before, .step:focus-within::before { height: 100%; }
228
+
229
+ .step__num {
230
+ font-family: var(--font-display);
231
+ font-size: 0.75rem;
232
+ letter-spacing: 0.12em;
233
+ color: var(--color-accent);
234
+ text-transform: uppercase;
235
+ margin-block-end: var(--space-sm);
236
+ }
237
+
238
+ .step__head {
239
+ font-family: var(--font-display);
240
+ font-size: clamp(1.5rem, 2.5vw, 2rem);
241
+ font-weight: 500;
242
+ letter-spacing: -0.015em;
243
+ line-height: 1.1;
244
+ margin: 0 0 var(--space-md);
245
+ color: var(--color-ink);
246
+ }
247
+
248
+ .step__body {
249
+ font-size: 1rem;
250
+ line-height: 1.6;
251
+ color: var(--color-ink-2);
252
+ max-width: 48ch;
253
+ }
254
+ .step__body strong { color: var(--color-ink); font-weight: 500; }
255
+
256
+ .pinned {
257
+ position: sticky;
258
+ top: var(--space-xl);
259
+ height: fit-content;
260
+ background: var(--color-paper-2);
261
+ border: 1px solid var(--color-rule);
262
+ border-radius: 4px;
263
+ padding: var(--space-lg);
264
+ }
265
+
266
+ .pinned__head {
267
+ display: flex;
268
+ justify-content: space-between;
269
+ align-items: center;
270
+ font-family: var(--font-display);
271
+ font-size: 0.75rem;
272
+ letter-spacing: 0.06em;
273
+ color: var(--color-ink-2);
274
+ border-block-end: 1px solid var(--color-rule);
275
+ padding-block-end: var(--space-sm);
276
+ margin-block-end: var(--space-md);
277
+ }
278
+
279
+ .pinned__chip {
280
+ font-family: var(--font-display);
281
+ font-size: 0.6875rem;
282
+ letter-spacing: 0.08em;
283
+ padding: 2px 6px;
284
+ border: 1px solid var(--color-accent);
285
+ color: var(--color-accent);
286
+ border-radius: 2px;
287
+ }
288
+
289
+ .pinned__why {
290
+ margin-block-start: var(--space-md);
291
+ padding-block-start: var(--space-md);
292
+ border-block-start: 1px solid var(--color-rule);
293
+ font-family: var(--font-body);
294
+ font-size: 0.875rem;
295
+ color: var(--color-ink-2);
296
+ line-height: 1.5;
297
+ }
298
+
299
+ .pinned__why strong { color: var(--color-error); font-weight: 500; }
300
+
301
+ .colophon {
302
+ padding: var(--space-md) 0;
303
+ display: flex;
304
+ justify-content: space-between;
305
+ flex-wrap: wrap;
306
+ gap: var(--space-sm);
307
+ font-family: var(--font-display);
308
+ font-size: 0.75rem;
309
+ letter-spacing: 0.06em;
310
+ color: var(--color-ink-2);
311
+ border-block-start: 1px solid var(--color-rule);
312
+ }
313
+
314
+ .colophon a { color: var(--color-ink-2); text-decoration: none; transition: color var(--dur-micro) var(--ease-out); }
315
+ .colophon a:hover, .colophon a:focus-visible { color: var(--color-accent); }
316
+ .colophon a:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 3px; }
317
+
318
+ @media (max-width: 56rem) {
319
+ .hero { grid-template-columns: 1fr; }
320
+ .workbench { grid-template-columns: 1fr; }
321
+ .pinned { position: static; }
322
+ }
323
+
324
+ @media (prefers-reduced-motion: reduce) {
325
+ .step::before { transition: none; }
326
+ }
@@ -0,0 +1,134 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Mossroot — small-batch herbal apothecary, Porto</title>
7
+ <meta name="description" content="A small herbal apothecary in Porto. Tinctures, salves, tea blends, dried herbs. Made by hand, sold by the gram." />
8
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;1,400&family=EB+Garamond:ital,wght@0,400;0,500;1,400&display=swap" />
11
+ <link rel="stylesheet" href="style.css" />
12
+ </head>
13
+ <body>
14
+ <main class="page">
15
+ <header class="masthead">
16
+ <hr class="masthead__rule" />
17
+ <h1 class="masthead__brand">Moss<span class="em">root</span></h1>
18
+ <p class="masthead__sub">Herbal apothecary · Porto · est. 2024 · made by hand · sold by the gram</p>
19
+ </header>
20
+
21
+ <section class="todays">
22
+ <h2 class="todays__head">This week's batch</h2>
23
+ <p class="todays__date">made the first of May — eight things — sold from the bench until they're gone</p>
24
+ </section>
25
+
26
+ <ul class="catalogue" role="list" aria-label="This week's apothecary batch">
27
+
28
+ <li class="item">
29
+ <span class="item__shape item__shape--accent" aria-hidden="true">
30
+ <svg viewBox="0 0 96 96"><path d="M48 12 C 24 28, 24 60, 48 84 C 72 60, 72 28, 48 12"/><path d="M48 24 L48 80 M30 50 L48 50 L66 50"/></svg>
31
+ </span>
32
+ <div class="item__body">
33
+ <h3 class="item__name">Calendula <em>salve</em></h3>
34
+ <p class="item__desc">Cold-infused calendula in olive oil, set with beeswax. For dry hands and small cuts.</p>
35
+ </div>
36
+ <span class="item__price">€18 / 30 g</span>
37
+ </li>
38
+
39
+ <li class="item">
40
+ <span class="item__shape" aria-hidden="true">
41
+ <svg viewBox="0 0 96 96"><path d="M30 76 L30 30 Q48 18 66 30 L66 76 Z"/><path d="M30 36 L66 36 M30 50 L66 50 M30 64 L66 64"/></svg>
42
+ </span>
43
+ <div class="item__body">
44
+ <h3 class="item__name">Lemon balm <em>tincture</em></h3>
45
+ <p class="item__desc">Garden-grown <em>melissa</em>, six-week alcohol extraction. Forty drops at bedtime.</p>
46
+ </div>
47
+ <span class="item__price">€24 / 50 ml</span>
48
+ </li>
49
+
50
+ <li class="item">
51
+ <span class="item__shape item__shape--accent" aria-hidden="true">
52
+ <svg viewBox="0 0 96 96"><circle cx="48" cy="48" r="32"/><path d="M48 16 Q56 32 48 48 Q40 64 48 80"/><path d="M16 48 Q32 56 48 48 Q64 40 80 48"/></svg>
53
+ </span>
54
+ <div class="item__body">
55
+ <h3 class="item__name">Three-flower <em>tea blend</em></h3>
56
+ <p class="item__desc">Chamomile, rose, lavender. Loose-leaf, no tea-bag, no flavour.</p>
57
+ </div>
58
+ <span class="item__price">€14 / 60 g</span>
59
+ </li>
60
+
61
+ <li class="item">
62
+ <span class="item__shape" aria-hidden="true">
63
+ <svg viewBox="0 0 96 96"><path d="M16 60 Q32 36 48 60 Q64 36 80 60"/><path d="M16 60 L16 72 L80 72 L80 60"/><path d="M48 30 L48 60"/></svg>
64
+ </span>
65
+ <div class="item__body">
66
+ <h3 class="item__name">Mossy forest <em>balm</em></h3>
67
+ <p class="item__desc">Pine resin, comfrey, beeswax. For aching joints — what the dock workers buy.</p>
68
+ </div>
69
+ <span class="item__price">€26 / 60 g</span>
70
+ </li>
71
+
72
+ <li class="item">
73
+ <span class="item__shape item__shape--accent" aria-hidden="true">
74
+ <svg viewBox="0 0 96 96"><path d="M48 16 Q34 24 30 38 Q26 52 32 64 Q40 76 48 80"/><path d="M48 16 Q62 24 66 38 Q70 52 64 64 Q56 76 48 80"/></svg>
75
+ </span>
76
+ <div class="item__body">
77
+ <h3 class="item__name">Yarrow <em>tincture</em></h3>
78
+ <p class="item__desc">Wild-foraged from Gerês, six-week extraction. For colds, fevers, and blood-tonic.</p>
79
+ </div>
80
+ <span class="item__price">€22 / 50 ml</span>
81
+ </li>
82
+
83
+ <li class="item">
84
+ <span class="item__shape" aria-hidden="true">
85
+ <svg viewBox="0 0 96 96"><circle cx="48" cy="48" r="20"/><circle cx="48" cy="48" r="32"/><path d="M48 16 L48 80 M16 48 L80 48"/></svg>
86
+ </span>
87
+ <div class="item__body">
88
+ <h3 class="item__name">Rose-petal <em>honey</em></h3>
89
+ <p class="item__desc">Local honey, wild rose petals from the Douro. Friday batch only — six jars.</p>
90
+ </div>
91
+ <span class="item__price item__price--out">sold out</span>
92
+ </li>
93
+
94
+ <li class="item">
95
+ <span class="item__shape item__shape--accent" aria-hidden="true">
96
+ <svg viewBox="0 0 96 96"><path d="M48 14 Q60 28 60 48 Q60 68 48 82 Q36 68 36 48 Q36 28 48 14"/><path d="M48 14 L48 82"/></svg>
97
+ </span>
98
+ <div class="item__body">
99
+ <h3 class="item__name">Sage &amp; thyme <em>vinegar</em></h3>
100
+ <p class="item__desc">Apple cider, fresh sage, thyme, four weeks dark. For salad, for sore throats.</p>
101
+ </div>
102
+ <span class="item__price">€16 / 250 ml</span>
103
+ </li>
104
+
105
+ <li class="item">
106
+ <span class="item__shape" aria-hidden="true">
107
+ <svg viewBox="0 0 96 96"><circle cx="48" cy="48" r="6"/><circle cx="28" cy="38" r="4"/><circle cx="68" cy="38" r="4"/><circle cx="38" cy="62" r="4"/><circle cx="58" cy="62" r="4"/><circle cx="48" cy="22" r="3"/><circle cx="48" cy="74" r="3"/></svg>
108
+ </span>
109
+ <div class="item__body">
110
+ <h3 class="item__name">Dried <em>seven-herb</em> bunch</h3>
111
+ <p class="item__desc">St-John's-wort, mugwort, chamomile, rosemary, lavender, lemon balm, sage. Tied with twine.</p>
112
+ </div>
113
+ <span class="item__price">€12 / bunch</span>
114
+ </li>
115
+
116
+ </ul>
117
+
118
+ <section class="visit">
119
+ <h2 class="visit__head">Find us</h2>
120
+ <div class="visit__lines">
121
+ <span><strong>Rua de Cedofeita 308, Porto</strong></span>
122
+ <span><em>Tuesday – Saturday, 11 a.m. until the bench is empty (usually 6 p.m.)</em></span>
123
+ <span><em>No online orders. Bring a glass jar if you'd like a refill.</em></span>
124
+ </div>
125
+ </section>
126
+
127
+ <footer class="colophon">
128
+ <span>Mossroot · the year twenty twenty-six · the first of May</span>
129
+ &nbsp;·&nbsp;
130
+ <a href="mailto:hello@mossroot.pt">hello@mossroot.pt</a>
131
+ </footer>
132
+ </main>
133
+ </body>
134
+ </html>