create-fornix 0.2.0 → 0.3.0

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 (275) hide show
  1. package/dist/archetypes/agency.json +332 -0
  2. package/dist/archetypes/gym.json +342 -0
  3. package/dist/archetypes/portfolio.json +258 -0
  4. package/dist/archetypes/restaurant.json +318 -0
  5. package/dist/archetypes/saas.json +311 -0
  6. package/dist/blocks/cta-strip/block.json +68 -0
  7. package/dist/blocks/cta-strip/cta-strip.astro +136 -0
  8. package/dist/blocks/cta-strip/default-content.json +9 -0
  9. package/dist/blocks/faq/block.json +62 -0
  10. package/dist/blocks/faq/default-content.json +31 -0
  11. package/dist/blocks/faq/faq.astro +167 -0
  12. package/dist/blocks/features-bento/block.json +27 -25
  13. package/dist/blocks/features-bento/default-content.json +28 -9
  14. package/dist/blocks/features-bento/features-bento.astro +138 -27
  15. package/dist/blocks/features-grid/block.json +25 -19
  16. package/dist/blocks/features-grid/default-content.json +21 -20
  17. package/dist/blocks/features-grid/features-grid.astro +138 -26
  18. package/dist/blocks/footer-columns/block.json +71 -0
  19. package/dist/blocks/footer-columns/default-content.json +32 -0
  20. package/dist/blocks/footer-columns/footer-columns.astro +276 -0
  21. package/dist/blocks/header-sticky/block.json +30 -38
  22. package/dist/blocks/header-sticky/header-sticky.astro +294 -32
  23. package/dist/blocks/hero-media/block.json +89 -0
  24. package/dist/blocks/hero-media/default-content.json +11 -0
  25. package/dist/blocks/hero-media/default-illustration.svg +37 -0
  26. package/dist/blocks/hero-media/hero-media.astro +140 -0
  27. package/dist/blocks/hero-text/block.json +68 -0
  28. package/dist/blocks/hero-text/default-content.json +9 -0
  29. package/dist/blocks/hero-text/hero-text.astro +88 -0
  30. package/dist/blocks/how-it-works/block.json +20 -27
  31. package/dist/blocks/how-it-works/default-content.json +18 -6
  32. package/dist/blocks/how-it-works/how-it-works.astro +157 -57
  33. package/dist/blocks/logo-cloud/block.json +20 -28
  34. package/dist/blocks/logo-cloud/default-content.json +7 -7
  35. package/dist/blocks/logo-cloud/logo-cloud.astro +117 -23
  36. package/dist/blocks/pricing-table/block.json +42 -105
  37. package/dist/blocks/pricing-table/default-content.json +45 -23
  38. package/dist/blocks/pricing-table/pricing-table.astro +220 -40
  39. package/dist/blocks/stats-strip/block.json +16 -32
  40. package/dist/blocks/stats-strip/default-content.json +5 -6
  41. package/dist/blocks/stats-strip/stats-strip.astro +81 -63
  42. package/dist/blocks/testimonials-grid/block.json +68 -0
  43. package/dist/blocks/testimonials-grid/default-content.json +48 -0
  44. package/dist/blocks/testimonials-grid/testimonials-grid.astro +199 -0
  45. package/dist/cli.js +837 -91
  46. package/dist/cli.js.map +1 -1
  47. package/dist/index.js +599 -77
  48. package/dist/index.js.map +1 -1
  49. package/dist/palettes/aurora.json +33 -0
  50. package/dist/palettes/ember.json +24 -5
  51. package/dist/palettes/fraktur.json +33 -0
  52. package/dist/palettes/obsidian.json +26 -7
  53. package/dist/palettes/paper.json +33 -0
  54. package/dist/palettes/sage.json +33 -0
  55. package/dist/palettes/terracotta.json +25 -6
  56. package/dist/primitives/Badge.astro +63 -0
  57. package/dist/primitives/Button.astro +136 -0
  58. package/dist/primitives/Card.astro +87 -0
  59. package/dist/primitives/Container.astro +60 -0
  60. package/dist/primitives/Eyebrow.astro +57 -0
  61. package/dist/primitives/Headline.astro +74 -0
  62. package/dist/primitives/Icon.astro +110 -0
  63. package/dist/primitives/Section.astro +71 -0
  64. package/dist/templates/astro.config.mjs.template +4 -0
  65. package/dist/templates/global.css.template +32 -0
  66. package/dist/templates/layout.astro.template +2 -3
  67. package/dist/templates/netlify.toml.template +16 -0
  68. package/dist/templates/site.config.ts.template +39 -0
  69. package/dist/templates/vercel.json.template +8 -0
  70. package/package.json +2 -2
  71. package/dist/blocks/about-stats/about-stats.astro +0 -72
  72. package/dist/blocks/about-stats/about-stats.css +0 -167
  73. package/dist/blocks/about-stats/block.json +0 -78
  74. package/dist/blocks/about-stats/default-content.json +0 -12
  75. package/dist/blocks/about-stats/schema.ts +0 -19
  76. package/dist/blocks/about-timeline/about-timeline.astro +0 -106
  77. package/dist/blocks/about-timeline/about-timeline.css +0 -261
  78. package/dist/blocks/about-timeline/block.json +0 -49
  79. package/dist/blocks/about-timeline/default-content.json +0 -14
  80. package/dist/blocks/about-timeline/schema.ts +0 -20
  81. package/dist/blocks/about-values/about-values.astro +0 -103
  82. package/dist/blocks/about-values/about-values.css +0 -242
  83. package/dist/blocks/about-values/block.json +0 -52
  84. package/dist/blocks/about-values/default-content.json +0 -37
  85. package/dist/blocks/about-values/schema.ts +0 -23
  86. package/dist/blocks/ai-og-images/block.json +0 -57
  87. package/dist/blocks/ai-og-images/default-content.json +0 -1
  88. package/dist/blocks/ai-og-images/og-api.ts +0 -25
  89. package/dist/blocks/ai-og-images/og-generator.ts +0 -80
  90. package/dist/blocks/analytics-cf/CfAnalytics.astro +0 -13
  91. package/dist/blocks/analytics-cf/block.json +0 -39
  92. package/dist/blocks/analytics-cf/default-content.json +0 -1
  93. package/dist/blocks/auth-better-auth/auth-api.ts +0 -15
  94. package/dist/blocks/auth-better-auth/auth.ts +0 -34
  95. package/dist/blocks/auth-better-auth/block.json +0 -99
  96. package/dist/blocks/auth-better-auth/default-content.json +0 -18
  97. package/dist/blocks/auth-better-auth/login.astro +0 -47
  98. package/dist/blocks/auth-better-auth/middleware.ts +0 -35
  99. package/dist/blocks/auth-better-auth/signup.astro +0 -45
  100. package/dist/blocks/blog-mdx/block.json +0 -48
  101. package/dist/blocks/blog-mdx/pages/[slug].astro +0 -39
  102. package/dist/blocks/blog-mdx/pages/index.astro +0 -37
  103. package/dist/blocks/blog-mdx/pages/rss.xml.ts +0 -17
  104. package/dist/blocks/blog-mdx/schema.ts +0 -8
  105. package/dist/blocks/callout/block.json +0 -46
  106. package/dist/blocks/callout/callout.astro +0 -44
  107. package/dist/blocks/callout/callout.css +0 -96
  108. package/dist/blocks/contact-form/block.json +0 -86
  109. package/dist/blocks/contact-form/contact-action.ts +0 -28
  110. package/dist/blocks/contact-form/contact-form.astro +0 -92
  111. package/dist/blocks/contact-form/contact-form.css +0 -90
  112. package/dist/blocks/contact-form/default-content.json +0 -10
  113. package/dist/blocks/contact-form/schema.ts +0 -14
  114. package/dist/blocks/contact-split/block.json +0 -41
  115. package/dist/blocks/contact-split/contact-split.astro +0 -84
  116. package/dist/blocks/contact-split/contact-split.css +0 -175
  117. package/dist/blocks/contact-split/default-content.json +0 -16
  118. package/dist/blocks/contact-split/schema.ts +0 -18
  119. package/dist/blocks/cta-banner/block.json +0 -55
  120. package/dist/blocks/cta-banner/cta-banner.astro +0 -35
  121. package/dist/blocks/cta-banner/cta-banner.css +0 -62
  122. package/dist/blocks/cta-banner/default-content.json +0 -6
  123. package/dist/blocks/cta-banner/schema.ts +0 -10
  124. package/dist/blocks/cta-newsletter/block.json +0 -62
  125. package/dist/blocks/cta-newsletter/cta-newsletter.astro +0 -49
  126. package/dist/blocks/cta-newsletter/cta-newsletter.css +0 -86
  127. package/dist/blocks/cta-newsletter/default-content.json +0 -7
  128. package/dist/blocks/cta-newsletter/schema.ts +0 -11
  129. package/dist/blocks/db-d1/block.json +0 -49
  130. package/dist/blocks/db-d1/db.ts +0 -21
  131. package/dist/blocks/db-d1/default-content.json +0 -1
  132. package/dist/blocks/db-d1/drizzle.config.ts +0 -7
  133. package/dist/blocks/db-d1/schema.ts +0 -20
  134. package/dist/blocks/docs-collection/block.json +0 -39
  135. package/dist/blocks/docs-collection/pages/[...slug].astro +0 -63
  136. package/dist/blocks/docs-collection/schema.ts +0 -7
  137. package/dist/blocks/email-resend/block.json +0 -45
  138. package/dist/blocks/email-resend/default-content.json +0 -1
  139. package/dist/blocks/email-resend/resend.ts +0 -9
  140. package/dist/blocks/faq-accordion/block.json +0 -61
  141. package/dist/blocks/faq-accordion/default-content.json +0 -11
  142. package/dist/blocks/faq-accordion/faq-accordion.astro +0 -45
  143. package/dist/blocks/faq-accordion/faq-accordion.css +0 -89
  144. package/dist/blocks/faq-accordion/schema.ts +0 -14
  145. package/dist/blocks/faq-home/block.json +0 -43
  146. package/dist/blocks/faq-home/default-content.json +0 -11
  147. package/dist/blocks/faq-home/faq-home.astro +0 -88
  148. package/dist/blocks/faq-home/faq-home.css +0 -150
  149. package/dist/blocks/faq-home/schema.ts +0 -14
  150. package/dist/blocks/features-bento/features-bento.css +0 -87
  151. package/dist/blocks/features-bento/schema.ts +0 -16
  152. package/dist/blocks/features-grid/features-grid.css +0 -83
  153. package/dist/blocks/features-grid/schema.ts +0 -19
  154. package/dist/blocks/footer-minimal/block.json +0 -91
  155. package/dist/blocks/footer-minimal/default-content.json +0 -10
  156. package/dist/blocks/footer-minimal/footer-minimal.astro +0 -42
  157. package/dist/blocks/footer-minimal/footer-minimal.css +0 -66
  158. package/dist/blocks/footer-minimal/schema.ts +0 -18
  159. package/dist/blocks/footer-rich/block.json +0 -132
  160. package/dist/blocks/footer-rich/default-content.json +0 -30
  161. package/dist/blocks/footer-rich/footer-rich.astro +0 -61
  162. package/dist/blocks/footer-rich/footer-rich.css +0 -89
  163. package/dist/blocks/footer-rich/schema.ts +0 -20
  164. package/dist/blocks/header-sticky/default-content.json +0 -11
  165. package/dist/blocks/header-sticky/header-sticky.css +0 -115
  166. package/dist/blocks/header-sticky/schema.ts +0 -15
  167. package/dist/blocks/header-transparent/block.json +0 -64
  168. package/dist/blocks/header-transparent/default-content.json +0 -10
  169. package/dist/blocks/header-transparent/header-transparent.astro +0 -51
  170. package/dist/blocks/header-transparent/header-transparent.css +0 -116
  171. package/dist/blocks/header-transparent/schema.ts +0 -15
  172. package/dist/blocks/hero-glass/block.json +0 -67
  173. package/dist/blocks/hero-glass/default-content.json +0 -9
  174. package/dist/blocks/hero-glass/hero-glass.astro +0 -99
  175. package/dist/blocks/hero-glass/hero-glass.css +0 -283
  176. package/dist/blocks/hero-glass/schema.ts +0 -13
  177. package/dist/blocks/hero-gradient/block.json +0 -80
  178. package/dist/blocks/hero-gradient/default-content.json +0 -7
  179. package/dist/blocks/hero-gradient/hero-gradient.astro +0 -39
  180. package/dist/blocks/hero-gradient/hero-gradient.css +0 -96
  181. package/dist/blocks/hero-gradient/schema.ts +0 -15
  182. package/dist/blocks/hero-split/block.json +0 -93
  183. package/dist/blocks/hero-split/default-content.json +0 -9
  184. package/dist/blocks/hero-split/hero-split.astro +0 -56
  185. package/dist/blocks/hero-split/hero-split.css +0 -101
  186. package/dist/blocks/hero-split/schema.ts +0 -13
  187. package/dist/blocks/hero-video/block.json +0 -84
  188. package/dist/blocks/hero-video/default-content.json +0 -8
  189. package/dist/blocks/hero-video/hero-video.astro +0 -48
  190. package/dist/blocks/hero-video/hero-video.css +0 -82
  191. package/dist/blocks/hero-video/schema.ts +0 -12
  192. package/dist/blocks/how-it-works/how-it-works.css +0 -186
  193. package/dist/blocks/how-it-works/schema.ts +0 -17
  194. package/dist/blocks/layout-dashboard/block.json +0 -52
  195. package/dist/blocks/layout-dashboard/default-content.json +0 -7
  196. package/dist/blocks/layout-dashboard/layout-dashboard.astro +0 -56
  197. package/dist/blocks/layout-docs/block.json +0 -41
  198. package/dist/blocks/layout-docs/default-content.json +0 -4
  199. package/dist/blocks/layout-docs/layout-docs.astro +0 -33
  200. package/dist/blocks/layout-marketing/block.json +0 -50
  201. package/dist/blocks/layout-marketing/default-content.json +0 -8
  202. package/dist/blocks/layout-marketing/layout-marketing.astro +0 -37
  203. package/dist/blocks/logo-cloud/logo-cloud.css +0 -74
  204. package/dist/blocks/logo-cloud/schema.ts +0 -14
  205. package/dist/blocks/payments-stripe/block.json +0 -55
  206. package/dist/blocks/payments-stripe/default-content.json +0 -1
  207. package/dist/blocks/payments-stripe/stripe.ts +0 -12
  208. package/dist/blocks/portfolio-grid/block.json +0 -65
  209. package/dist/blocks/portfolio-grid/default-content.json +0 -14
  210. package/dist/blocks/portfolio-grid/portfolio-grid.astro +0 -120
  211. package/dist/blocks/portfolio-grid/portfolio-grid.css +0 -193
  212. package/dist/blocks/portfolio-grid/schema.ts +0 -19
  213. package/dist/blocks/pricing-comparison/block.json +0 -169
  214. package/dist/blocks/pricing-comparison/default-content.json +0 -17
  215. package/dist/blocks/pricing-comparison/pricing-comparison.astro +0 -78
  216. package/dist/blocks/pricing-comparison/pricing-comparison.css +0 -111
  217. package/dist/blocks/pricing-comparison/schema.ts +0 -23
  218. package/dist/blocks/pricing-table/pricing-table.css +0 -137
  219. package/dist/blocks/pricing-table/schema.ts +0 -20
  220. package/dist/blocks/pricing-toggle/block.json +0 -53
  221. package/dist/blocks/pricing-toggle/default-content.json +0 -40
  222. package/dist/blocks/pricing-toggle/pricing-toggle.astro +0 -134
  223. package/dist/blocks/pricing-toggle/pricing-toggle.css +0 -256
  224. package/dist/blocks/pricing-toggle/schema.ts +0 -24
  225. package/dist/blocks/stats-strip/schema.ts +0 -13
  226. package/dist/blocks/stats-strip/stats-strip.css +0 -71
  227. package/dist/blocks/testimonials-carousel/block.json +0 -55
  228. package/dist/blocks/testimonials-carousel/default-content.json +0 -8
  229. package/dist/blocks/testimonials-carousel/schema.ts +0 -15
  230. package/dist/blocks/testimonials-carousel/testimonials-carousel.astro +0 -56
  231. package/dist/blocks/testimonials-carousel/testimonials-carousel.css +0 -99
  232. package/dist/blocks/testimonials-chat/block.json +0 -49
  233. package/dist/blocks/testimonials-chat/default-content.json +0 -56
  234. package/dist/blocks/testimonials-chat/schema.ts +0 -25
  235. package/dist/blocks/testimonials-chat/testimonials-chat.astro +0 -147
  236. package/dist/blocks/testimonials-chat/testimonials-chat.css +0 -257
  237. package/dist/blocks/testimonials-wall/block.json +0 -64
  238. package/dist/blocks/testimonials-wall/default-content.json +0 -12
  239. package/dist/blocks/testimonials-wall/schema.ts +0 -16
  240. package/dist/blocks/testimonials-wall/testimonials-wall.astro +0 -59
  241. package/dist/blocks/testimonials-wall/testimonials-wall.css +0 -82
  242. package/dist/blocks/theme-switcher/block.json +0 -38
  243. package/dist/blocks/theme-switcher/default-content.json +0 -3
  244. package/dist/blocks/theme-switcher/schema.ts +0 -10
  245. package/dist/blocks/theme-switcher/theme-switcher.astro +0 -133
  246. package/dist/blocks/theme-switcher/theme-switcher.css +0 -122
  247. package/dist/palettes/arctic.json +0 -14
  248. package/dist/palettes/charcoal.json +0 -14
  249. package/dist/palettes/copper.json +0 -14
  250. package/dist/palettes/corporate-blue.json +0 -14
  251. package/dist/palettes/cotton.json +0 -14
  252. package/dist/palettes/cream.json +0 -14
  253. package/dist/palettes/cyber-punk.json +0 -14
  254. package/dist/palettes/deep-sea.json +0 -14
  255. package/dist/palettes/desert-sand.json +0 -14
  256. package/dist/palettes/electric-violet.json +0 -14
  257. package/dist/palettes/executive.json +0 -14
  258. package/dist/palettes/fintech-dark.json +0 -14
  259. package/dist/palettes/forest.json +0 -14
  260. package/dist/palettes/frost.json +0 -14
  261. package/dist/palettes/glacier.json +0 -14
  262. package/dist/palettes/golden-hour.json +0 -14
  263. package/dist/palettes/health-clean.json +0 -14
  264. package/dist/palettes/luxury-gold.json +0 -14
  265. package/dist/palettes/midnight.json +0 -14
  266. package/dist/palettes/neon-tokyo.json +0 -14
  267. package/dist/palettes/ocean-breeze.json +0 -14
  268. package/dist/palettes/pearl.json +0 -14
  269. package/dist/palettes/slate-modern.json +0 -14
  270. package/dist/palettes/snow.json +0 -14
  271. package/dist/palettes/startup-bold.json +0 -14
  272. package/dist/palettes/storm.json +0 -14
  273. package/dist/palettes/sunset-glow.json +0 -14
  274. package/dist/palettes/trust.json +0 -14
  275. package/dist/palettes/void.json +0 -14
@@ -0,0 +1,332 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "agency",
4
+ "displayName": "Agency",
5
+ "description": "Branding & product studio. Light, editorial palette. Home + Work + About + Contact, with case-study bento on Work and FAQ on Contact.",
6
+ "palette": "paper",
7
+
8
+ "site": {
9
+ "name": "Atelier North",
10
+ "tagline": "A branding & product studio for companies that care about details.",
11
+ "logo": { "type": "monogram", "text": "AN" },
12
+ "nav": [
13
+ { "label": "Work", "href": "/work" },
14
+ { "label": "About", "href": "/about" },
15
+ { "label": "Journal", "href": "/journal" },
16
+ { "label": "Contact", "href": "/contact" }
17
+ ],
18
+ "ctaPrimary": { "text": "Start a project", "href": "/contact" },
19
+ "ctaSecondary": { "text": "See our work", "href": "/work" },
20
+ "social": {
21
+ "twitter": "ateliernorth",
22
+ "instagram": "atelier.north",
23
+ "linkedin": "company/atelier-north"
24
+ },
25
+ "contact": {
26
+ "email": "hello@ateliernorth.studio",
27
+ "phone": "+46 8 555 0144",
28
+ "address": "Krukmakargatan 22, 118 51 Stockholm"
29
+ },
30
+ "legal": {
31
+ "copyright": "© 2026 Atelier North AB",
32
+ "privacyHref": "/privacy",
33
+ "termsHref": "/terms"
34
+ },
35
+ "meta": {
36
+ "twitterHandle": "ateliernorth"
37
+ }
38
+ },
39
+
40
+ "pages": [
41
+ {
42
+ "slug": "",
43
+ "title": "Atelier North — Branding & product studio, Stockholm",
44
+ "description": "We help category-defining companies find their voice, build their identity systems, and ship products that feel like the brand looks.",
45
+ "blocks": [
46
+ { "name": "header-sticky" },
47
+ { "name": "hero-media" },
48
+ { "name": "logo-cloud" },
49
+ { "name": "features-grid" },
50
+ { "name": "how-it-works" },
51
+ { "name": "testimonials-grid" },
52
+ { "name": "cta-strip" },
53
+ { "name": "footer-columns" }
54
+ ]
55
+ },
56
+ {
57
+ "slug": "work",
58
+ "title": "Work — Atelier North",
59
+ "description": "Selected projects across identity, product, and packaging. We work on a small number of engagements per year so each gets the room it needs.",
60
+ "blocks": [
61
+ { "name": "header-sticky" },
62
+ { "name": "features-bento" },
63
+ { "name": "testimonials-grid" },
64
+ { "name": "footer-columns" }
65
+ ]
66
+ },
67
+ {
68
+ "slug": "about",
69
+ "title": "About — Atelier North",
70
+ "description": "Eight people in a converted bakery in Södermalm. What we believe and how we work.",
71
+ "blocks": [
72
+ { "name": "header-sticky" },
73
+ { "name": "hero-text" },
74
+ { "name": "stats-strip" },
75
+ { "name": "footer-columns" }
76
+ ]
77
+ },
78
+ {
79
+ "slug": "contact",
80
+ "title": "Contact — Atelier North",
81
+ "description": "Start a conversation. We reply within one business day.",
82
+ "blocks": [
83
+ { "name": "header-sticky" },
84
+ { "name": "faq" },
85
+ { "name": "cta-strip" },
86
+ { "name": "footer-columns" }
87
+ ]
88
+ }
89
+ ],
90
+
91
+ "content": {
92
+ "hero-media": {
93
+ "eyebrow": "Studio",
94
+ "headline": "Identity, product, and packaging — for companies that read the spec sheet",
95
+ "subheadline": "Atelier North is a branding & product studio in Stockholm. We take on six engagements a year and live inside each one.",
96
+ "primaryCtaText": "Start a project",
97
+ "primaryCtaHref": "/contact",
98
+ "secondaryCtaText": "See our work",
99
+ "secondaryCtaHref": "/work",
100
+ "mediaAlt": "Brand identity system laid out across stationery, packaging, and a product UI screen.",
101
+ "mediaPlacement": "right"
102
+ },
103
+
104
+ "logo-cloud": {
105
+ "label": "Selected clients",
106
+ "logos": [
107
+ { "name": "Lexura" },
108
+ { "name": "Norrbro" },
109
+ { "name": "Klocka" },
110
+ { "name": "Föregång" },
111
+ { "name": "Vault HQ" },
112
+ { "name": "Bloom Studio" }
113
+ ]
114
+ },
115
+
116
+ "features-grid": {
117
+ "eyebrow": "What we do",
118
+ "headline": "Three disciplines, one studio",
119
+ "subheadline": "We don't pretend to do everything. We do these three things, and we do them with the same hands that started them.",
120
+ "features": [
121
+ {
122
+ "icon": "star",
123
+ "title": "Brand identity",
124
+ "description": "Naming, logotype, type system, color, motion principles, and the brand guide that makes it survive contact with reality."
125
+ },
126
+ {
127
+ "icon": "external-link",
128
+ "title": "Product design",
129
+ "description": "From early product thinking to shipping interfaces. We design in code with engineering, not over a wall."
130
+ },
131
+ {
132
+ "icon": "check",
133
+ "title": "Packaging & print",
134
+ "description": "Physical surfaces still matter. We design unboxings, business systems, books, and the occasional pop-up shop."
135
+ },
136
+ {
137
+ "icon": "arrow-right",
138
+ "title": "Type & wordmark",
139
+ "description": "Custom type design when off-the-shelf doesn't fit. Wordmarks drawn from scratch, not modified Helvetica."
140
+ },
141
+ {
142
+ "icon": "mail",
143
+ "title": "Editorial direction",
144
+ "description": "Voice systems, content principles, launch comms. The words a brand uses are part of the identity."
145
+ },
146
+ {
147
+ "icon": "play",
148
+ "title": "Motion & video",
149
+ "description": "Brand motion principles, launch films, and the short loops that make a product page feel alive."
150
+ }
151
+ ]
152
+ },
153
+
154
+ "how-it-works": {
155
+ "eyebrow": "How we work",
156
+ "headline": "A six-month engagement, run like a real partnership",
157
+ "subheadline": "We embed with your team, ship in milestones, and hand off a brand that your in-house team can extend without us.",
158
+ "steps": [
159
+ {
160
+ "icon": "external-link",
161
+ "title": "1. Listen",
162
+ "description": "Three weeks of conversations with founders, customers, and the team. We map what the brand is, what it isn't, and what it needs to become."
163
+ },
164
+ {
165
+ "icon": "check",
166
+ "title": "2. Make",
167
+ "description": "Four months of focused design work. Weekly milestones, monthly reviews, and a shared Figma where you watch the brand build in real time."
168
+ },
169
+ {
170
+ "icon": "arrow-right",
171
+ "title": "3. Hand off",
172
+ "description": "A brand guide your team actually reads, a working component library, and three weeks of paired sessions to make sure it lives after we're gone."
173
+ }
174
+ ]
175
+ },
176
+
177
+ "testimonials-grid": {
178
+ "eyebrow": "What clients say",
179
+ "headline": "Long engagements, lasting relationships",
180
+ "subheadline": "Selected words from people we've spent six months with.",
181
+ "items": [
182
+ {
183
+ "quote": "Atelier North didn't sell us a moodboard. They moved into our Slack for six months and came out the other side with a brand we still use every part of.",
184
+ "author": "Maya Patel",
185
+ "role": "VP Eng",
186
+ "company": "Lexura",
187
+ "rating": 5
188
+ },
189
+ {
190
+ "quote": "The brand guide is the only one I've ever seen designers actually read. Everything ladders back to a clear principle.",
191
+ "author": "Anya Kowalski",
192
+ "role": "Co-founder",
193
+ "company": "Vault HQ",
194
+ "rating": 5
195
+ },
196
+ {
197
+ "quote": "Their packaging sketches showed up with the production tolerances already accounted for. That's the difference between studios that ship and studios that pitch.",
198
+ "author": "Marcus Lee",
199
+ "role": "Founder",
200
+ "company": "Iron Forge",
201
+ "rating": 5
202
+ }
203
+ ]
204
+ },
205
+
206
+ "cta-strip": {
207
+ "headline": "Have a project in mind?",
208
+ "subheadline": "We're taking on two more engagements for late 2026. The earlier you write, the better the chance.",
209
+ "primaryCtaText": "Start a conversation",
210
+ "primaryCtaHref": "/contact",
211
+ "secondaryCtaText": "See selected work",
212
+ "secondaryCtaHref": "/work",
213
+ "variant": "accent"
214
+ },
215
+
216
+ "footer-columns": {
217
+ "tagline": "A branding & product studio in Stockholm. Six engagements a year. No retainers.",
218
+ "columns": [
219
+ {
220
+ "title": "Studio",
221
+ "links": [
222
+ { "label": "Work", "href": "/work" },
223
+ { "label": "About", "href": "/about" },
224
+ { "label": "Journal", "href": "/journal" },
225
+ { "label": "Contact", "href": "/contact" }
226
+ ]
227
+ },
228
+ {
229
+ "title": "Services",
230
+ "links": [
231
+ { "label": "Brand identity", "href": "/services/identity" },
232
+ { "label": "Product design", "href": "/services/product" },
233
+ { "label": "Packaging", "href": "/services/packaging" },
234
+ { "label": "Type design", "href": "/services/type" }
235
+ ]
236
+ },
237
+ {
238
+ "title": "Visit",
239
+ "links": [
240
+ { "label": "Krukmakargatan 22", "href": "https://maps.google.com/?q=Krukmakargatan+22+Stockholm" },
241
+ { "label": "Stockholm, Sweden", "href": "/about" },
242
+ { "label": "hello@ateliernorth.studio", "href": "mailto:hello@ateliernorth.studio" },
243
+ { "label": "+46 8 555 0144", "href": "tel:+4685550144" }
244
+ ]
245
+ }
246
+ ]
247
+ },
248
+
249
+ "features-bento": {
250
+ "eyebrow": "Selected work",
251
+ "headline": "A small studio's case files",
252
+ "subheadline": "We publish in detail, not in volume. Each case study is a real engagement, not a moodboard.",
253
+ "features": [
254
+ {
255
+ "icon": "star",
256
+ "title": "Lexura — full brand & product system",
257
+ "description": "Six-month engagement: naming, identity, type, marketing site, and a 60-component product library. Lexura raised their Series A two weeks after launch.",
258
+ "span": "large"
259
+ },
260
+ {
261
+ "icon": "check",
262
+ "title": "Norrbro — packaging",
263
+ "description": "Coffee subscription. 14 SKU packaging system that survived a 3× catalog expansion.",
264
+ "span": "default"
265
+ },
266
+ {
267
+ "icon": "external-link",
268
+ "title": "Klocka — type & wordmark",
269
+ "description": "Custom display face for a Swedish watchmaker. Drawn from a 1958 reference, modernized for screens.",
270
+ "span": "default"
271
+ },
272
+ {
273
+ "icon": "arrow-right",
274
+ "title": "Föregång — editorial system",
275
+ "description": "Quarterly print magazine. Grid, type pairings, contributor voice guidelines, and a website that holds its weight against print.",
276
+ "span": "large"
277
+ }
278
+ ]
279
+ },
280
+
281
+ "hero-text": {
282
+ "eyebrow": "About the studio",
283
+ "headline": "Eight people. A converted bakery. Six engagements a year.",
284
+ "subheadline": "We started Atelier North because we missed working in studios where designers and engineers sat in the same room. So we built one.",
285
+ "primaryCtaText": "Read our journal",
286
+ "primaryCtaHref": "/journal",
287
+ "secondaryCtaText": "Get in touch",
288
+ "secondaryCtaHref": "/contact"
289
+ },
290
+
291
+ "stats-strip": {
292
+ "stats": [
293
+ { "value": "8", "label": "People in the studio", "accent": true },
294
+ { "value": "6", "label": "Engagements a year" },
295
+ { "value": "12", "label": "Years in business" },
296
+ { "value": "94", "label": "Projects shipped" }
297
+ ]
298
+ },
299
+
300
+ "faq": {
301
+ "eyebrow": "Before we talk",
302
+ "headline": "Questions clients ask in the first email",
303
+ "subheadline": "If yours isn't here, write anyway — we read everything.",
304
+ "items": [
305
+ {
306
+ "question": "How long is a typical engagement?",
307
+ "answer": "Six months for a full brand + product system. Shorter for a focused project (packaging, identity refresh, a single product surface) — usually 8–12 weeks."
308
+ },
309
+ {
310
+ "question": "What does it cost?",
311
+ "answer": "Full engagements start at €120k. Single-discipline projects start around €35k. We send a real budget after the first conversation, not a tier sheet."
312
+ },
313
+ {
314
+ "question": "Do you work with early-stage companies?",
315
+ "answer": "Yes — we take on two pre-seed engagements a year at a reduced rate, often in exchange for a small equity slice. Ask if that's interesting."
316
+ },
317
+ {
318
+ "question": "Can you start next week?",
319
+ "answer": "Almost never. Our calendar is usually booked 4–6 months out. The earlier you write, the better the chance of fitting your timeline."
320
+ },
321
+ {
322
+ "question": "Do you offer retainers?",
323
+ "answer": "No. Retainers reward us for being slow. We work in fixed-scope engagements and recommend an in-house hire when you need ongoing design."
324
+ },
325
+ {
326
+ "question": "Where are you based?",
327
+ "answer": "Stockholm. We work remotely with clients across Europe and North America, and travel for kickoff and milestone weeks."
328
+ }
329
+ ]
330
+ }
331
+ }
332
+ }
@@ -0,0 +1,342 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "gym",
4
+ "displayName": "Gym",
5
+ "description": "Boutique strength gym. High-contrast ember palette with bold display type. Home + Classes + Pricing + Contact, with stats-strip social proof and pricing tiers.",
6
+ "palette": "ember",
7
+
8
+ "site": {
9
+ "name": "Iron Forge",
10
+ "tagline": "A serious gym for people who lift heavy and live well.",
11
+ "logo": { "type": "monogram", "text": "IF" },
12
+ "nav": [
13
+ { "label": "Classes", "href": "/classes" },
14
+ { "label": "Pricing", "href": "/pricing" },
15
+ { "label": "Coaches", "href": "/coaches" },
16
+ { "label": "Contact", "href": "/contact" }
17
+ ],
18
+ "ctaPrimary": { "text": "Start free week", "href": "/signup" },
19
+ "ctaSecondary": { "text": "Book a tour", "href": "/tour" },
20
+ "social": {
21
+ "instagram": "ironforge.gym",
22
+ "youtube": "@ironforge",
23
+ "twitter": "ironforgegym"
24
+ },
25
+ "contact": {
26
+ "email": "hello@ironforge.gym",
27
+ "phone": "+1 (415) 555-0117",
28
+ "address": "1411 Folsom Street, San Francisco, CA 94103"
29
+ },
30
+ "legal": {
31
+ "copyright": "© 2026 Iron Forge Strength Co.",
32
+ "privacyHref": "/privacy",
33
+ "termsHref": "/terms"
34
+ },
35
+ "meta": {
36
+ "twitterHandle": "ironforgegym"
37
+ }
38
+ },
39
+
40
+ "pages": [
41
+ {
42
+ "slug": "",
43
+ "title": "Iron Forge — A serious strength gym in San Francisco",
44
+ "description": "Olympic platforms, real coaches, and a 5-block radius of people who actually know your name. Free first week, no pressure.",
45
+ "blocks": [
46
+ { "name": "header-sticky" },
47
+ { "name": "hero-media" },
48
+ { "name": "stats-strip" },
49
+ { "name": "how-it-works" },
50
+ { "name": "testimonials-grid" },
51
+ { "name": "cta-strip" },
52
+ { "name": "footer-columns" }
53
+ ]
54
+ },
55
+ {
56
+ "slug": "classes",
57
+ "title": "Classes — Iron Forge",
58
+ "description": "Six class formats, six days a week. Every session capped at 12 people with two coaches on the floor.",
59
+ "blocks": [
60
+ { "name": "header-sticky" },
61
+ { "name": "features-grid" },
62
+ { "name": "testimonials-grid" },
63
+ { "name": "footer-columns" }
64
+ ]
65
+ },
66
+ {
67
+ "slug": "pricing",
68
+ "title": "Pricing — Iron Forge",
69
+ "description": "Monthly memberships with no annual contract. Five-day free trial, then choose your cadence.",
70
+ "blocks": [
71
+ { "name": "header-sticky" },
72
+ { "name": "pricing-table" },
73
+ { "name": "faq" },
74
+ { "name": "cta-strip" },
75
+ { "name": "footer-columns" }
76
+ ]
77
+ },
78
+ {
79
+ "slug": "contact",
80
+ "title": "Contact — Iron Forge",
81
+ "description": "Visit us at 1411 Folsom, or email hello@ironforge.gym.",
82
+ "blocks": [
83
+ { "name": "header-sticky" },
84
+ { "name": "hero-text" },
85
+ { "name": "cta-strip" },
86
+ { "name": "footer-columns" }
87
+ ]
88
+ }
89
+ ],
90
+
91
+ "content": {
92
+ "hero-media": {
93
+ "eyebrow": "Open daily, 5am — 10pm",
94
+ "headline": "A serious gym for people who lift heavy and live well",
95
+ "subheadline": "Olympic platforms, calibrated plates, real coaching, and a 5-block radius of people who actually know your name. Your first week is free; we'd rather you join because you want to.",
96
+ "primaryCtaText": "Start free week",
97
+ "primaryCtaHref": "/signup",
98
+ "secondaryCtaText": "Book a tour",
99
+ "secondaryCtaHref": "/tour",
100
+ "mediaAlt": "Iron Forge main floor: four Eleiko platforms with calibrated plates, racks of competition kettlebells, and natural light from the south windows.",
101
+ "mediaPlacement": "right"
102
+ },
103
+
104
+ "stats-strip": {
105
+ "stats": [
106
+ { "value": "1,400", "label": "Active members", "accent": true },
107
+ { "value": "12", "label": "Coaches on staff" },
108
+ { "value": "94%", "label": "Member retention, 12 months" },
109
+ { "value": "4.9★", "label": "Rated by 320+ reviews" }
110
+ ]
111
+ },
112
+
113
+ "how-it-works": {
114
+ "eyebrow": "Joining is simple",
115
+ "headline": "Three steps. Lift this week.",
116
+ "subheadline": "We've never asked anyone to fill out a 14-page intake form, and we never will.",
117
+ "steps": [
118
+ {
119
+ "icon": "external-link",
120
+ "title": "1. Book a tour",
121
+ "description": "Stop by any weekday for a 20-minute walkthrough. Meet a coach. See if the room feels right. No sales pitch."
122
+ },
123
+ {
124
+ "icon": "check",
125
+ "title": "2. Take the free week",
126
+ "description": "Five days, any classes, any time. We'll match you to a coach for your first session and give you the keys to the schedule."
127
+ },
128
+ {
129
+ "icon": "arrow-right",
130
+ "title": "3. Pick a plan",
131
+ "description": "Three monthly options, no contracts, pause any time. Pick what fits and start the work."
132
+ }
133
+ ]
134
+ },
135
+
136
+ "testimonials-grid": {
137
+ "eyebrow": "Members",
138
+ "headline": "What our community says",
139
+ "subheadline": "Real members. Real names. Real lifts.",
140
+ "items": [
141
+ {
142
+ "quote": "I tried four gyms in this part of the city. Iron Forge is the only one where the coaches actually watch the lifts and call out cues. I'm 38 and lifting better than I did at 25.",
143
+ "author": "Maya Patel",
144
+ "role": "Member since 2024",
145
+ "rating": 5
146
+ },
147
+ {
148
+ "quote": "The community is the whole thing. Five mornings a week with the same dozen people, watching each other PR — that's what I pay for.",
149
+ "author": "Diego Romero",
150
+ "role": "Member since 2023",
151
+ "rating": 5
152
+ },
153
+ {
154
+ "quote": "I had a serious back injury in 2022. The Iron Forge coaches built me a 6-month return plan with my PT. I'm back to deadlifting bodyweight × 2. I'd never have gotten there at a Globo gym.",
155
+ "author": "Soren Mikkelsen",
156
+ "role": "Member since 2022",
157
+ "rating": 5
158
+ }
159
+ ]
160
+ },
161
+
162
+ "cta-strip": {
163
+ "headline": "Five days, no card, no follow-up sales call",
164
+ "subheadline": "If you don't love it, ghost us — we promise no awkward emails. If you love it, we'll see you Monday.",
165
+ "primaryCtaText": "Claim free week",
166
+ "primaryCtaHref": "/signup",
167
+ "secondaryCtaText": "Take the tour first",
168
+ "secondaryCtaHref": "/tour",
169
+ "variant": "accent"
170
+ },
171
+
172
+ "footer-columns": {
173
+ "tagline": "Iron Forge Strength Co. — A serious gym in San Francisco. Open daily 5am — 10pm.",
174
+ "columns": [
175
+ {
176
+ "title": "Gym",
177
+ "links": [
178
+ { "label": "Classes", "href": "/classes" },
179
+ { "label": "Pricing", "href": "/pricing" },
180
+ { "label": "Coaches", "href": "/coaches" },
181
+ { "label": "Schedule", "href": "/schedule" }
182
+ ]
183
+ },
184
+ {
185
+ "title": "Visit",
186
+ "links": [
187
+ { "label": "1411 Folsom Street", "href": "https://maps.google.com/?q=1411+Folsom+San+Francisco" },
188
+ { "label": "Mon — Fri · 5am to 10pm", "href": "/hours" },
189
+ { "label": "Sat — Sun · 7am to 8pm", "href": "/hours" },
190
+ { "label": "Get directions", "href": "https://maps.google.com/?q=1411+Folsom+San+Francisco" }
191
+ ]
192
+ },
193
+ {
194
+ "title": "More",
195
+ "links": [
196
+ { "label": "Personal training", "href": "/personal-training" },
197
+ { "label": "Open gym", "href": "/open-gym" },
198
+ { "label": "Workshops", "href": "/workshops" },
199
+ { "label": "FAQ", "href": "/pricing#faq" }
200
+ ]
201
+ }
202
+ ]
203
+ },
204
+
205
+ "features-grid": {
206
+ "eyebrow": "Class formats",
207
+ "headline": "Six ways to train at Iron Forge",
208
+ "subheadline": "Every class is capped at 12 with two coaches on the floor. Pick a format, build a habit, get strong.",
209
+ "features": [
210
+ {
211
+ "icon": "star",
212
+ "title": "Strength · 60 min",
213
+ "description": "Linear-progression barbell work. Squat, bench, deadlift, press, in 4-week blocks with a percentage-based template."
214
+ },
215
+ {
216
+ "icon": "check",
217
+ "title": "Engine · 45 min",
218
+ "description": "Conditioning built around an erg, a sled, and a kettlebell. Aerobic base by Tuesday, threshold work by Friday."
219
+ },
220
+ {
221
+ "icon": "arrow-right",
222
+ "title": "Olympic Lifts · 75 min",
223
+ "description": "Snatch and clean & jerk technical work. Three coaches on the floor for this one. Bring your knee sleeves."
224
+ },
225
+ {
226
+ "icon": "external-link",
227
+ "title": "Beginner Foundations · 60 min",
228
+ "description": "Twelve-week onramp for new lifters. By the end you've squatted, benched, deadlifted, and pressed under load."
229
+ },
230
+ {
231
+ "icon": "mail",
232
+ "title": "Mobility · 30 min",
233
+ "description": "Joint health and breath work. Tuesday and Saturday mornings. The class your future self thanks you for."
234
+ },
235
+ {
236
+ "icon": "play",
237
+ "title": "Open Gym",
238
+ "description": "Run your own program with a coach available for cues. Members get unlimited open-gym access on all plans."
239
+ }
240
+ ]
241
+ },
242
+
243
+ "pricing-table": {
244
+ "eyebrow": "Memberships",
245
+ "headline": "Pick a cadence, start the work",
246
+ "subheadline": "No annual contracts. Pause any time. Five-day free trial included on all plans.",
247
+ "popularBadge": "Most Popular",
248
+ "plans": [
249
+ {
250
+ "name": "Drop-in",
251
+ "price": "$30",
252
+ "period": "/class",
253
+ "description": "Visiting town or testing the room. Pay per session.",
254
+ "features": [
255
+ "Any single class",
256
+ "All coaching included",
257
+ "No commitment",
258
+ "Five-day free trial available"
259
+ ],
260
+ "ctaText": "Book a class",
261
+ "ctaHref": "/signup?plan=dropin",
262
+ "highlighted": false
263
+ },
264
+ {
265
+ "name": "Unlimited",
266
+ "price": "$240",
267
+ "period": "/month",
268
+ "description": "The standard membership. Train as much as you want.",
269
+ "features": [
270
+ "Unlimited classes",
271
+ "Unlimited open gym",
272
+ "Quarterly programming reviews",
273
+ "Member events + workshops",
274
+ "Pause for up to 60 days/year"
275
+ ],
276
+ "ctaText": "Start free week",
277
+ "ctaHref": "/signup?plan=unlimited",
278
+ "highlighted": true
279
+ },
280
+ {
281
+ "name": "Coached",
282
+ "price": "$640",
283
+ "period": "/month",
284
+ "description": "For lifters with specific goals. Custom programming, weekly check-ins.",
285
+ "features": [
286
+ "Everything in Unlimited",
287
+ "Custom monthly programming",
288
+ "Weekly 1:1 with a coach",
289
+ "Video review of key lifts",
290
+ "Nutrition framework + macros",
291
+ "Quarterly testing day"
292
+ ],
293
+ "ctaText": "Apply for coached",
294
+ "ctaHref": "/contact?topic=coached",
295
+ "highlighted": false
296
+ }
297
+ ]
298
+ },
299
+
300
+ "faq": {
301
+ "eyebrow": "Honest answers",
302
+ "headline": "Questions before joining",
303
+ "subheadline": "If your situation isn't here, email hello@ironforge.gym — a human replies same-day.",
304
+ "items": [
305
+ {
306
+ "question": "I've never lifted with a barbell. Will I survive?",
307
+ "answer": "Yes — start with Beginner Foundations. Twelve weeks, two classes a week, structured progression. By week 4 you'll be doing all four lifts. By week 12 you'll be ready for any class."
308
+ },
309
+ {
310
+ "question": "Do I need to bring my own equipment?",
311
+ "answer": "No. Belts, sleeves, straps, chalk — all here. If you have your own shoes, bring them; otherwise borrow a pair until you decide what feels right."
312
+ },
313
+ {
314
+ "question": "What if I get injured?",
315
+ "answer": "We work with three PTs in the neighborhood and have built return-to-lift plans with all of them. If you're rehabbing, tell your coach — we modify, we don't push through."
316
+ },
317
+ {
318
+ "question": "Can I pause my membership?",
319
+ "answer": "Up to 60 days per year, no questions asked. Travel, injury, life — just message and we pause. You don't lose your spot."
320
+ },
321
+ {
322
+ "question": "Are there annual contracts?",
323
+ "answer": "No. Month-to-month, cancel any time from your account. We'd rather you stay because we're good than because you're locked in."
324
+ },
325
+ {
326
+ "question": "Is this a CrossFit gym?",
327
+ "answer": "No. We share some lineage but our programming is more focused: classical strength training plus aerobic conditioning, no high-rep Olympic lifts under fatigue. Quieter, more technical, fewer screams."
328
+ }
329
+ ]
330
+ },
331
+
332
+ "hero-text": {
333
+ "eyebrow": "Visit us",
334
+ "headline": "Come see the room",
335
+ "subheadline": "1411 Folsom Street. Five blocks from the Civic Center BART. Free 20-minute tours weekdays, no booking required — just walk in.",
336
+ "primaryCtaText": "Book a tour",
337
+ "primaryCtaHref": "/tour",
338
+ "secondaryCtaText": "Email us",
339
+ "secondaryCtaHref": "mailto:hello@ironforge.gym"
340
+ }
341
+ }
342
+ }