@jxsuite/starters 3.3.2 → 3.5.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 (513) hide show
  1. package/package.json +5 -5
  2. package/sites/blog/components/bl-author-bio.jxn +64 -0
  3. package/sites/blog/components/bl-contact-form.jxn +77 -0
  4. package/sites/blog/components/bl-contact-info.jxn +32 -0
  5. package/sites/blog/components/bl-cta.jxn +52 -0
  6. package/sites/blog/components/bl-footer.jxn +85 -0
  7. package/sites/blog/components/bl-masthead.jxn +111 -0
  8. package/sites/blog/components/bl-nav.jxn +62 -0
  9. package/sites/blog/components/bl-newsletter-cta.jxn +104 -0
  10. package/sites/blog/components/bl-post-card.jxn +106 -0
  11. package/sites/blog/components/bl-post-list.jxn +11 -0
  12. package/sites/blog/components/bl-prose.jxn +67 -0
  13. package/sites/blog/components/bl-section-header.jxn +52 -0
  14. package/sites/blog/components/bl-tag-pill.jxn +19 -0
  15. package/sites/blog/document.schema.json +11 -2
  16. package/sites/blog/layouts/base.jxn +17 -0
  17. package/sites/blog/layouts/post.jxn +13 -0
  18. package/sites/blog/package.json +3 -3
  19. package/sites/blog/pages/[slug].jxn +107 -0
  20. package/sites/blog/project.jxn +86 -0
  21. package/sites/course/components/co-application.jxn +106 -0
  22. package/sites/course/components/co-cohort.jxn +132 -0
  23. package/sites/course/components/co-cta.jxn +95 -0
  24. package/sites/course/components/co-curriculum-accordion.jxn +917 -0
  25. package/sites/course/components/co-faq.jxn +348 -0
  26. package/sites/course/components/co-footer.jxn +138 -0
  27. package/sites/course/components/co-hero.jxn +354 -0
  28. package/sites/course/components/co-instructor-card.jxn +128 -0
  29. package/sites/course/components/co-mentor.jxn +51 -0
  30. package/sites/course/components/co-module-card.jxn +101 -0
  31. package/sites/course/components/co-nav.jxn +172 -0
  32. package/sites/course/components/co-outcome-card.jxn +57 -0
  33. package/sites/course/components/co-outcomes.jxn +179 -0
  34. package/sites/course/components/co-pricing.jxn +145 -0
  35. package/sites/course/components/co-section-header.jxn +55 -0
  36. package/sites/course/components/co-testimonial-card.jxn +69 -0
  37. package/sites/course/document.schema.json +11 -2
  38. package/sites/course/layouts/base.jxn +17 -0
  39. package/sites/course/package.json +3 -3
  40. package/sites/course/project.jxn +94 -0
  41. package/sites/event/components/ev-agenda-tabs.jxn +663 -0
  42. package/sites/event/components/ev-cta.jxn +93 -0
  43. package/sites/event/components/ev-feature.jxn +46 -0
  44. package/sites/event/components/ev-footer.jxn +135 -0
  45. package/sites/event/components/ev-hero.jxn +323 -0
  46. package/sites/event/components/ev-nav.jxn +142 -0
  47. package/sites/event/components/ev-reason.jxn +50 -0
  48. package/sites/event/components/ev-savedate.jxn +268 -0
  49. package/sites/event/components/ev-section-header.jxn +51 -0
  50. package/sites/event/components/ev-session-row.jxn +103 -0
  51. package/sites/event/components/ev-speaker-card.jxn +104 -0
  52. package/sites/event/components/ev-sponsors.jxn +110 -0
  53. package/sites/event/components/ev-stat.jxn +39 -0
  54. package/sites/event/components/ev-ticket-card.jxn +169 -0
  55. package/sites/event/components/ev-venue.jxn +61 -0
  56. package/sites/event/document.schema.json +11 -2
  57. package/sites/event/layouts/base.jxn +12 -0
  58. package/sites/event/package.json +3 -3
  59. package/sites/event/project.jxn +114 -0
  60. package/sites/fitness-studio/components/fs-band.jxn +119 -0
  61. package/sites/fitness-studio/components/fs-booking.jxn +92 -0
  62. package/sites/fitness-studio/components/fs-class-card.jxn +103 -0
  63. package/sites/fitness-studio/components/fs-class-grid.jxn +23 -0
  64. package/sites/fitness-studio/components/fs-cta.jxn +81 -0
  65. package/sites/fitness-studio/components/fs-feature.jxn +40 -0
  66. package/sites/fitness-studio/components/fs-footer.jxn +116 -0
  67. package/sites/fitness-studio/components/fs-hero.jxn +290 -0
  68. package/sites/fitness-studio/components/fs-hours.jxn +78 -0
  69. package/sites/fitness-studio/components/fs-instructor-card.jxn +104 -0
  70. package/sites/fitness-studio/components/fs-intro.jxn +231 -0
  71. package/sites/fitness-studio/components/fs-modality.jxn +133 -0
  72. package/sites/fitness-studio/components/fs-nav.jxn +95 -0
  73. package/sites/fitness-studio/components/fs-pricing-card.jxn +190 -0
  74. package/sites/fitness-studio/components/fs-pricing-table.jxn +322 -0
  75. package/sites/fitness-studio/components/fs-review.jxn +59 -0
  76. package/sites/fitness-studio/components/fs-schedule.jxn +714 -0
  77. package/sites/fitness-studio/components/fs-section-header.jxn +55 -0
  78. package/sites/fitness-studio/document.schema.json +11 -2
  79. package/sites/fitness-studio/layouts/base.jxn +17 -0
  80. package/sites/fitness-studio/package.json +3 -3
  81. package/sites/fitness-studio/project.jxn +124 -0
  82. package/sites/home-services/components/hs-callbar.jxn +60 -0
  83. package/sites/home-services/components/hs-cta.jxn +139 -0
  84. package/sites/home-services/components/hs-feature.jxn +43 -0
  85. package/sites/home-services/components/hs-footer.jxn +169 -0
  86. package/sites/home-services/components/hs-gallery.jxn +51 -0
  87. package/sites/home-services/components/hs-hero.jxn +308 -0
  88. package/sites/home-services/components/hs-intro.jxn +97 -0
  89. package/sites/home-services/components/hs-nav.jxn +207 -0
  90. package/sites/home-services/components/hs-reservation.jxn +125 -0
  91. package/sites/home-services/components/hs-review.jxn +84 -0
  92. package/sites/home-services/components/hs-section-header.jxn +56 -0
  93. package/sites/home-services/components/hs-service-card.jxn +68 -0
  94. package/sites/home-services/components/hs-stat.jxn +40 -0
  95. package/sites/home-services/components/hs-step.jxn +67 -0
  96. package/sites/home-services/components/hs-trust-bar.jxn +183 -0
  97. package/sites/home-services/document.schema.json +11 -2
  98. package/sites/home-services/layouts/base.jxn +22 -0
  99. package/sites/home-services/package.json +3 -3
  100. package/sites/home-services/project.jxn +113 -0
  101. package/sites/museum/components/mu-band.jxn +63 -0
  102. package/sites/museum/components/mu-cta.jxn +76 -0
  103. package/sites/museum/components/mu-exhibition-card.jxn +118 -0
  104. package/sites/museum/components/mu-exhibition-row.jxn +142 -0
  105. package/sites/museum/components/mu-fact.jxn +40 -0
  106. package/sites/museum/components/mu-footer.jxn +206 -0
  107. package/sites/museum/components/mu-hero.jxn +165 -0
  108. package/sites/museum/components/mu-more.jxn +30 -0
  109. package/sites/museum/components/mu-oculus.jxn +33 -0
  110. package/sites/museum/components/mu-pagehead.jxn +76 -0
  111. package/sites/museum/components/mu-quote.jxn +36 -0
  112. package/sites/museum/document.schema.json +11 -2
  113. package/sites/museum/layouts/ar.jxn +31 -0
  114. package/sites/museum/layouts/base.jxn +227 -0
  115. package/sites/museum/layouts/fr-ca.jxn +30 -0
  116. package/sites/museum/package.json +3 -3
  117. package/sites/museum/pages/about.jxn +228 -0
  118. package/sites/museum/pages/ar/about.jxn +232 -0
  119. package/sites/museum/pages/ar/exhibitions/[slug].jxn +150 -0
  120. package/sites/museum/pages/ar/exhibitions/index.jxn +82 -0
  121. package/sites/museum/pages/ar/index.jxn +206 -0
  122. package/sites/museum/pages/ar/visit.jxn +270 -0
  123. package/sites/museum/pages/exhibitions/[slug].jxn +146 -0
  124. package/sites/museum/pages/exhibitions/index.jxn +78 -0
  125. package/sites/museum/pages/fr-ca/a-propos.jxn +233 -0
  126. package/sites/museum/pages/fr-ca/expositions/[slug].jxn +151 -0
  127. package/sites/museum/pages/fr-ca/expositions/index.jxn +83 -0
  128. package/sites/museum/pages/fr-ca/index.jxn +206 -0
  129. package/sites/museum/pages/fr-ca/visite.jxn +271 -0
  130. package/sites/museum/pages/index.jxn +202 -0
  131. package/sites/museum/pages/visit.jxn +266 -0
  132. package/sites/museum/project.jxn +130 -0
  133. package/sites/nonprofit/components/np-contact-form.jxn +97 -0
  134. package/sites/nonprofit/components/np-contact-info.jxn +104 -0
  135. package/sites/nonprofit/components/np-cta.jxn +163 -0
  136. package/sites/nonprofit/components/np-donate-tier.jxn +103 -0
  137. package/sites/nonprofit/components/np-feature.jxn +46 -0
  138. package/sites/nonprofit/components/np-footer.jxn +194 -0
  139. package/sites/nonprofit/components/np-hero.jxn +275 -0
  140. package/sites/nonprofit/components/np-impact-band.jxn +83 -0
  141. package/sites/nonprofit/components/np-intro.jxn +130 -0
  142. package/sites/nonprofit/components/np-nav.jxn +157 -0
  143. package/sites/nonprofit/components/np-program-card.jxn +95 -0
  144. package/sites/nonprofit/components/np-section-header.jxn +63 -0
  145. package/sites/nonprofit/components/np-stat.jxn +51 -0
  146. package/sites/nonprofit/components/np-step.jxn +73 -0
  147. package/sites/nonprofit/components/np-team-member.jxn +60 -0
  148. package/sites/nonprofit/components/np-testimonial.jxn +120 -0
  149. package/sites/nonprofit/document.schema.json +11 -2
  150. package/sites/nonprofit/layouts/base.jxn +17 -0
  151. package/sites/nonprofit/package.json +3 -3
  152. package/sites/nonprofit/project.jxn +99 -0
  153. package/sites/portfolio/components/pv-about-split.jxn +53 -0
  154. package/sites/portfolio/components/pv-category-pill.jxn +19 -0
  155. package/sites/portfolio/components/pv-contact-form.jxn +72 -0
  156. package/sites/portfolio/components/pv-cta.jxn +62 -0
  157. package/sites/portfolio/components/pv-feature.jxn +28 -0
  158. package/sites/portfolio/components/pv-footer.jxn +113 -0
  159. package/sites/portfolio/components/pv-gallery.jxn +40 -0
  160. package/sites/portfolio/components/pv-hero.jxn +109 -0
  161. package/sites/portfolio/components/pv-nav.jxn +76 -0
  162. package/sites/portfolio/components/pv-project-card.jxn +118 -0
  163. package/sites/portfolio/components/pv-project-grid.jxn +29 -0
  164. package/sites/portfolio/components/pv-section-header.jxn +65 -0
  165. package/sites/portfolio/document.schema.json +11 -2
  166. package/sites/portfolio/layouts/base.jxn +12 -0
  167. package/sites/portfolio/package.json +3 -3
  168. package/sites/portfolio/pages/[slug].jxn +177 -0
  169. package/sites/portfolio/project.jxn +85 -0
  170. package/sites/professional-firm/components/pf-article-header.jxn +60 -0
  171. package/sites/professional-firm/components/pf-contact-form.jxn +74 -0
  172. package/sites/professional-firm/components/pf-contact-info.jxn +101 -0
  173. package/sites/professional-firm/components/pf-cta.jxn +63 -0
  174. package/sites/professional-firm/components/pf-feature.jxn +32 -0
  175. package/sites/professional-firm/components/pf-footer.jxn +171 -0
  176. package/sites/professional-firm/components/pf-hero.jxn +139 -0
  177. package/sites/professional-firm/components/pf-insight-row.jxn +111 -0
  178. package/sites/professional-firm/components/pf-intro.jxn +68 -0
  179. package/sites/professional-firm/components/pf-logo-bar.jxn +90 -0
  180. package/sites/professional-firm/components/pf-nav.jxn +93 -0
  181. package/sites/professional-firm/components/pf-section-header.jxn +53 -0
  182. package/sites/professional-firm/components/pf-service-row.jxn +67 -0
  183. package/sites/professional-firm/components/pf-statband.jxn +135 -0
  184. package/sites/professional-firm/components/pf-team-member.jxn +53 -0
  185. package/sites/professional-firm/document.schema.json +11 -2
  186. package/sites/professional-firm/layouts/article.jxn +88 -0
  187. package/sites/professional-firm/layouts/base.jxn +12 -0
  188. package/sites/professional-firm/package.json +3 -3
  189. package/sites/professional-firm/pages/insights/[slug].jxn +106 -0
  190. package/sites/professional-firm/project.jxn +94 -0
  191. package/sites/real-estate/components/re-agent-band.jxn +165 -0
  192. package/sites/real-estate/components/re-agent-card.jxn +78 -0
  193. package/sites/real-estate/components/re-contact-form.jxn +119 -0
  194. package/sites/real-estate/components/re-cta.jxn +98 -0
  195. package/sites/real-estate/components/re-detail-row.jxn +18 -0
  196. package/sites/real-estate/components/re-feature.jxn +41 -0
  197. package/sites/real-estate/components/re-footer.jxn +219 -0
  198. package/sites/real-estate/components/re-hero.jxn +367 -0
  199. package/sites/real-estate/components/re-intro.jxn +43 -0
  200. package/sites/real-estate/components/re-listing-card.jxn +210 -0
  201. package/sites/real-estate/components/re-listings-filter.jxn +371 -0
  202. package/sites/real-estate/components/re-nav.jxn +162 -0
  203. package/sites/real-estate/components/re-neighborhood.jxn +101 -0
  204. package/sites/real-estate/components/re-section-header.jxn +55 -0
  205. package/sites/real-estate/components/re-stat.jxn +26 -0
  206. package/sites/real-estate/components/re-step.jxn +42 -0
  207. package/sites/real-estate/components/re-testimonial.jxn +66 -0
  208. package/sites/real-estate/document.schema.json +11 -2
  209. package/sites/real-estate/layouts/base.jxn +17 -0
  210. package/sites/real-estate/package.json +3 -3
  211. package/sites/real-estate/pages/[slug].jxn +452 -0
  212. package/sites/real-estate/project.jxn +103 -0
  213. package/sites/restaurant/components/bit-cta.jxn +105 -0
  214. package/sites/restaurant/components/bit-feature.jxn +38 -0
  215. package/sites/restaurant/components/bit-footer.jxn +142 -0
  216. package/sites/restaurant/components/bit-gallery.jxn +50 -0
  217. package/sites/restaurant/components/bit-hero.jxn +194 -0
  218. package/sites/restaurant/components/bit-hours.jxn +145 -0
  219. package/sites/restaurant/components/bit-intro.jxn +75 -0
  220. package/sites/restaurant/components/bit-menu-group.jxn +51 -0
  221. package/sites/restaurant/components/bit-menu-item.jxn +50 -0
  222. package/sites/restaurant/components/bit-nav.jxn +145 -0
  223. package/sites/restaurant/components/bit-reservation.jxn +90 -0
  224. package/sites/restaurant/components/bit-review.jxn +54 -0
  225. package/sites/restaurant/components/bit-section-header.jxn +73 -0
  226. package/sites/restaurant/document.schema.json +11 -2
  227. package/sites/restaurant/layouts/base.jxn +17 -0
  228. package/sites/restaurant/package.json +3 -3
  229. package/sites/restaurant/project.jxn +93 -0
  230. package/sites/saas/components/sa-check-item.jxn +25 -0
  231. package/sites/saas/components/sa-contact-form.jxn +94 -0
  232. package/sites/saas/components/sa-cta.jxn +68 -0
  233. package/sites/saas/components/sa-faq.jxn +347 -0
  234. package/sites/saas/components/sa-feature-card.jxn +57 -0
  235. package/sites/saas/components/sa-feature-split.jxn +43 -0
  236. package/sites/saas/components/sa-footer.jxn +106 -0
  237. package/sites/saas/components/sa-hero.jxn +217 -0
  238. package/sites/saas/components/sa-logo-cloud.jxn +98 -0
  239. package/sites/saas/components/sa-nav.jxn +108 -0
  240. package/sites/saas/components/sa-pricing.jxn +317 -0
  241. package/sites/saas/components/sa-section-header.jxn +43 -0
  242. package/sites/saas/components/sa-stat.jxn +32 -0
  243. package/sites/saas/components/sa-testimonial-card.jxn +37 -0
  244. package/sites/saas/document.schema.json +11 -2
  245. package/sites/saas/layouts/base.jxn +17 -0
  246. package/sites/saas/package.json +3 -3
  247. package/sites/saas/project.jxn +119 -0
  248. package/sites/shop/components/shp-badge.jxn +17 -0
  249. package/sites/shop/components/shp-category-tile.jxn +79 -0
  250. package/sites/shop/components/shp-contact-form.jxn +84 -0
  251. package/sites/shop/components/shp-cta.jxn +85 -0
  252. package/sites/shop/components/shp-feature.jxn +44 -0
  253. package/sites/shop/components/shp-footer.jxn +311 -0
  254. package/sites/shop/components/shp-hero.jxn +311 -0
  255. package/sites/shop/components/shp-intro.jxn +42 -0
  256. package/sites/shop/components/shp-nav.jxn +273 -0
  257. package/sites/shop/components/shp-newsletter.jxn +119 -0
  258. package/sites/shop/components/shp-product-card.jxn +187 -0
  259. package/sites/shop/components/shp-product-filter.jxn +263 -0
  260. package/sites/shop/components/shp-review.jxn +38 -0
  261. package/sites/shop/components/shp-section-header.jxn +61 -0
  262. package/sites/shop/components/shp-service.jxn +58 -0
  263. package/sites/shop/components/shp-stat.jxn +27 -0
  264. package/sites/shop/components/shp-trust.jxn +39 -0
  265. package/sites/shop/components/shp-visit-info.jxn +82 -0
  266. package/sites/shop/document.schema.json +11 -2
  267. package/sites/shop/layouts/base.jxn +17 -0
  268. package/sites/shop/package.json +3 -3
  269. package/sites/shop/pages/products/[sku].jxn +351 -0
  270. package/sites/shop/project.jxn +100 -0
  271. package/sites/blog/components/bl-author-bio.json +0 -86
  272. package/sites/blog/components/bl-contact-form.json +0 -114
  273. package/sites/blog/components/bl-contact-info.json +0 -54
  274. package/sites/blog/components/bl-cta.json +0 -68
  275. package/sites/blog/components/bl-footer.json +0 -122
  276. package/sites/blog/components/bl-masthead.json +0 -134
  277. package/sites/blog/components/bl-nav.json +0 -90
  278. package/sites/blog/components/bl-newsletter-cta.json +0 -134
  279. package/sites/blog/components/bl-post-card.json +0 -132
  280. package/sites/blog/components/bl-post-list.json +0 -10
  281. package/sites/blog/components/bl-prose.json +0 -89
  282. package/sites/blog/components/bl-section-header.json +0 -70
  283. package/sites/blog/components/bl-tag-pill.json +0 -29
  284. package/sites/blog/layouts/base.json +0 -22
  285. package/sites/blog/layouts/post.json +0 -15
  286. package/sites/blog/pages/[slug].json +0 -148
  287. package/sites/blog/project.json +0 -140
  288. package/sites/course/components/co-application.json +0 -225
  289. package/sites/course/components/co-cohort.json +0 -172
  290. package/sites/course/components/co-cta.json +0 -126
  291. package/sites/course/components/co-curriculum-accordion.json +0 -1476
  292. package/sites/course/components/co-faq.json +0 -524
  293. package/sites/course/components/co-footer.json +0 -195
  294. package/sites/course/components/co-hero.json +0 -475
  295. package/sites/course/components/co-instructor-card.json +0 -159
  296. package/sites/course/components/co-mentor.json +0 -65
  297. package/sites/course/components/co-module-card.json +0 -138
  298. package/sites/course/components/co-nav.json +0 -244
  299. package/sites/course/components/co-outcome-card.json +0 -84
  300. package/sites/course/components/co-outcomes.json +0 -248
  301. package/sites/course/components/co-pricing.json +0 -178
  302. package/sites/course/components/co-section-header.json +0 -74
  303. package/sites/course/components/co-testimonial-card.json +0 -109
  304. package/sites/course/layouts/base.json +0 -22
  305. package/sites/course/project.json +0 -141
  306. package/sites/event/components/ev-agenda-tabs.json +0 -828
  307. package/sites/event/components/ev-cta.json +0 -126
  308. package/sites/event/components/ev-feature.json +0 -62
  309. package/sites/event/components/ev-footer.json +0 -197
  310. package/sites/event/components/ev-hero.json +0 -431
  311. package/sites/event/components/ev-nav.json +0 -186
  312. package/sites/event/components/ev-reason.json +0 -64
  313. package/sites/event/components/ev-savedate.json +0 -331
  314. package/sites/event/components/ev-section-header.json +0 -70
  315. package/sites/event/components/ev-session-row.json +0 -132
  316. package/sites/event/components/ev-speaker-card.json +0 -130
  317. package/sites/event/components/ev-sponsors.json +0 -131
  318. package/sites/event/components/ev-stat.json +0 -47
  319. package/sites/event/components/ev-ticket-card.json +0 -214
  320. package/sites/event/components/ev-venue.json +0 -86
  321. package/sites/event/layouts/base.json +0 -22
  322. package/sites/event/project.json +0 -163
  323. package/sites/fitness-studio/components/fs-band.json +0 -149
  324. package/sites/fitness-studio/components/fs-booking.json +0 -147
  325. package/sites/fitness-studio/components/fs-class-card.json +0 -143
  326. package/sites/fitness-studio/components/fs-class-grid.json +0 -36
  327. package/sites/fitness-studio/components/fs-cta.json +0 -106
  328. package/sites/fitness-studio/components/fs-feature.json +0 -56
  329. package/sites/fitness-studio/components/fs-footer.json +0 -178
  330. package/sites/fitness-studio/components/fs-hero.json +0 -375
  331. package/sites/fitness-studio/components/fs-hours.json +0 -109
  332. package/sites/fitness-studio/components/fs-instructor-card.json +0 -136
  333. package/sites/fitness-studio/components/fs-intro.json +0 -294
  334. package/sites/fitness-studio/components/fs-modality.json +0 -171
  335. package/sites/fitness-studio/components/fs-nav.json +0 -128
  336. package/sites/fitness-studio/components/fs-pricing-card.json +0 -243
  337. package/sites/fitness-studio/components/fs-pricing-table.json +0 -458
  338. package/sites/fitness-studio/components/fs-review.json +0 -88
  339. package/sites/fitness-studio/components/fs-schedule.json +0 -1165
  340. package/sites/fitness-studio/components/fs-section-header.json +0 -77
  341. package/sites/fitness-studio/layouts/base.json +0 -22
  342. package/sites/fitness-studio/project.json +0 -175
  343. package/sites/home-services/components/hs-callbar.json +0 -72
  344. package/sites/home-services/components/hs-cta.json +0 -184
  345. package/sites/home-services/components/hs-feature.json +0 -62
  346. package/sites/home-services/components/hs-footer.json +0 -232
  347. package/sites/home-services/components/hs-gallery.json +0 -104
  348. package/sites/home-services/components/hs-hero.json +0 -446
  349. package/sites/home-services/components/hs-intro.json +0 -122
  350. package/sites/home-services/components/hs-nav.json +0 -278
  351. package/sites/home-services/components/hs-reservation.json +0 -225
  352. package/sites/home-services/components/hs-review.json +0 -114
  353. package/sites/home-services/components/hs-section-header.json +0 -70
  354. package/sites/home-services/components/hs-service-card.json +0 -89
  355. package/sites/home-services/components/hs-stat.json +0 -54
  356. package/sites/home-services/components/hs-step.json +0 -80
  357. package/sites/home-services/components/hs-trust-bar.json +0 -256
  358. package/sites/home-services/layouts/base.json +0 -24
  359. package/sites/home-services/project.json +0 -160
  360. package/sites/museum/components/mu-band.json +0 -92
  361. package/sites/museum/components/mu-cta.json +0 -101
  362. package/sites/museum/components/mu-exhibition-card.json +0 -191
  363. package/sites/museum/components/mu-exhibition-row.json +0 -237
  364. package/sites/museum/components/mu-fact.json +0 -64
  365. package/sites/museum/components/mu-footer.json +0 -256
  366. package/sites/museum/components/mu-hero.json +0 -236
  367. package/sites/museum/components/mu-more.json +0 -63
  368. package/sites/museum/components/mu-oculus.json +0 -44
  369. package/sites/museum/components/mu-pagehead.json +0 -105
  370. package/sites/museum/components/mu-quote.json +0 -49
  371. package/sites/museum/layouts/ar.json +0 -29
  372. package/sites/museum/layouts/base.json +0 -329
  373. package/sites/museum/layouts/fr-ca.json +0 -28
  374. package/sites/museum/pages/about.json +0 -378
  375. package/sites/museum/pages/ar/about.json +0 -314
  376. package/sites/museum/pages/ar/exhibitions/[slug].json +0 -211
  377. package/sites/museum/pages/ar/exhibitions/index.json +0 -103
  378. package/sites/museum/pages/ar/index.json +0 -246
  379. package/sites/museum/pages/ar/visit.json +0 -327
  380. package/sites/museum/pages/exhibitions/[slug].json +0 -200
  381. package/sites/museum/pages/exhibitions/index.json +0 -93
  382. package/sites/museum/pages/fr-ca/a-propos.json +0 -313
  383. package/sites/museum/pages/fr-ca/expositions/[slug].json +0 -215
  384. package/sites/museum/pages/fr-ca/expositions/index.json +0 -104
  385. package/sites/museum/pages/fr-ca/index.json +0 -246
  386. package/sites/museum/pages/fr-ca/visite.json +0 -328
  387. package/sites/museum/pages/index.json +0 -236
  388. package/sites/museum/pages/visit.json +0 -317
  389. package/sites/museum/project.json +0 -179
  390. package/sites/nonprofit/components/np-contact-form.json +0 -162
  391. package/sites/nonprofit/components/np-contact-info.json +0 -159
  392. package/sites/nonprofit/components/np-cta.json +0 -203
  393. package/sites/nonprofit/components/np-donate-tier.json +0 -116
  394. package/sites/nonprofit/components/np-feature.json +0 -57
  395. package/sites/nonprofit/components/np-footer.json +0 -257
  396. package/sites/nonprofit/components/np-hero.json +0 -360
  397. package/sites/nonprofit/components/np-impact-band.json +0 -108
  398. package/sites/nonprofit/components/np-intro.json +0 -166
  399. package/sites/nonprofit/components/np-nav.json +0 -216
  400. package/sites/nonprofit/components/np-program-card.json +0 -129
  401. package/sites/nonprofit/components/np-section-header.json +0 -79
  402. package/sites/nonprofit/components/np-stat.json +0 -69
  403. package/sites/nonprofit/components/np-step.json +0 -84
  404. package/sites/nonprofit/components/np-team-member.json +0 -74
  405. package/sites/nonprofit/components/np-testimonial.json +0 -169
  406. package/sites/nonprofit/layouts/base.json +0 -22
  407. package/sites/nonprofit/project.json +0 -147
  408. package/sites/portfolio/components/pv-about-split.json +0 -71
  409. package/sites/portfolio/components/pv-category-pill.json +0 -25
  410. package/sites/portfolio/components/pv-contact-form.json +0 -126
  411. package/sites/portfolio/components/pv-cta.json +0 -80
  412. package/sites/portfolio/components/pv-feature.json +0 -48
  413. package/sites/portfolio/components/pv-footer.json +0 -167
  414. package/sites/portfolio/components/pv-gallery.json +0 -50
  415. package/sites/portfolio/components/pv-hero.json +0 -139
  416. package/sites/portfolio/components/pv-nav.json +0 -100
  417. package/sites/portfolio/components/pv-project-card.json +0 -160
  418. package/sites/portfolio/components/pv-project-grid.json +0 -30
  419. package/sites/portfolio/components/pv-section-header.json +0 -90
  420. package/sites/portfolio/layouts/base.json +0 -22
  421. package/sites/portfolio/pages/[slug].json +0 -260
  422. package/sites/portfolio/project.json +0 -137
  423. package/sites/professional-firm/components/pf-article-header.json +0 -93
  424. package/sites/professional-firm/components/pf-contact-form.json +0 -146
  425. package/sites/professional-firm/components/pf-contact-info.json +0 -147
  426. package/sites/professional-firm/components/pf-cta.json +0 -86
  427. package/sites/professional-firm/components/pf-feature.json +0 -52
  428. package/sites/professional-firm/components/pf-footer.json +0 -231
  429. package/sites/professional-firm/components/pf-hero.json +0 -174
  430. package/sites/professional-firm/components/pf-insight-row.json +0 -144
  431. package/sites/professional-firm/components/pf-intro.json +0 -93
  432. package/sites/professional-firm/components/pf-logo-bar.json +0 -113
  433. package/sites/professional-firm/components/pf-nav.json +0 -135
  434. package/sites/professional-firm/components/pf-section-header.json +0 -77
  435. package/sites/professional-firm/components/pf-service-row.json +0 -104
  436. package/sites/professional-firm/components/pf-statband.json +0 -183
  437. package/sites/professional-firm/components/pf-team-member.json +0 -75
  438. package/sites/professional-firm/layouts/article.json +0 -130
  439. package/sites/professional-firm/layouts/base.json +0 -22
  440. package/sites/professional-firm/pages/insights/[slug].json +0 -129
  441. package/sites/professional-firm/project.json +0 -145
  442. package/sites/real-estate/components/re-agent-band.json +0 -240
  443. package/sites/real-estate/components/re-agent-card.json +0 -93
  444. package/sites/real-estate/components/re-contact-form.json +0 -181
  445. package/sites/real-estate/components/re-cta.json +0 -128
  446. package/sites/real-estate/components/re-detail-row.json +0 -26
  447. package/sites/real-estate/components/re-feature.json +0 -57
  448. package/sites/real-estate/components/re-footer.json +0 -291
  449. package/sites/real-estate/components/re-hero.json +0 -536
  450. package/sites/real-estate/components/re-intro.json +0 -60
  451. package/sites/real-estate/components/re-listing-card.json +0 -286
  452. package/sites/real-estate/components/re-listings-filter.json +0 -454
  453. package/sites/real-estate/components/re-nav.json +0 -216
  454. package/sites/real-estate/components/re-neighborhood.json +0 -135
  455. package/sites/real-estate/components/re-section-header.json +0 -69
  456. package/sites/real-estate/components/re-stat.json +0 -37
  457. package/sites/real-estate/components/re-step.json +0 -58
  458. package/sites/real-estate/components/re-testimonial.json +0 -91
  459. package/sites/real-estate/layouts/base.json +0 -22
  460. package/sites/real-estate/pages/[slug].json +0 -629
  461. package/sites/real-estate/project.json +0 -163
  462. package/sites/restaurant/components/bit-cta.json +0 -140
  463. package/sites/restaurant/components/bit-feature.json +0 -61
  464. package/sites/restaurant/components/bit-footer.json +0 -191
  465. package/sites/restaurant/components/bit-gallery.json +0 -74
  466. package/sites/restaurant/components/bit-hero.json +0 -253
  467. package/sites/restaurant/components/bit-hours.json +0 -183
  468. package/sites/restaurant/components/bit-intro.json +0 -96
  469. package/sites/restaurant/components/bit-menu-group.json +0 -74
  470. package/sites/restaurant/components/bit-menu-item.json +0 -72
  471. package/sites/restaurant/components/bit-nav.json +0 -214
  472. package/sites/restaurant/components/bit-reservation.json +0 -155
  473. package/sites/restaurant/components/bit-review.json +0 -84
  474. package/sites/restaurant/components/bit-section-header.json +0 -98
  475. package/sites/restaurant/layouts/base.json +0 -22
  476. package/sites/restaurant/project.json +0 -145
  477. package/sites/saas/components/sa-check-item.json +0 -40
  478. package/sites/saas/components/sa-contact-form.json +0 -153
  479. package/sites/saas/components/sa-cta.json +0 -102
  480. package/sites/saas/components/sa-faq.json +0 -413
  481. package/sites/saas/components/sa-feature-card.json +0 -69
  482. package/sites/saas/components/sa-feature-split.json +0 -60
  483. package/sites/saas/components/sa-footer.json +0 -145
  484. package/sites/saas/components/sa-hero.json +0 -277
  485. package/sites/saas/components/sa-logo-cloud.json +0 -119
  486. package/sites/saas/components/sa-nav.json +0 -138
  487. package/sites/saas/components/sa-pricing.json +0 -428
  488. package/sites/saas/components/sa-section-header.json +0 -55
  489. package/sites/saas/components/sa-stat.json +0 -44
  490. package/sites/saas/components/sa-testimonial-card.json +0 -57
  491. package/sites/saas/layouts/base.json +0 -22
  492. package/sites/saas/project.json +0 -166
  493. package/sites/shop/components/shp-badge.json +0 -18
  494. package/sites/shop/components/shp-category-tile.json +0 -104
  495. package/sites/shop/components/shp-contact-form.json +0 -156
  496. package/sites/shop/components/shp-cta.json +0 -121
  497. package/sites/shop/components/shp-feature.json +0 -60
  498. package/sites/shop/components/shp-footer.json +0 -411
  499. package/sites/shop/components/shp-hero.json +0 -395
  500. package/sites/shop/components/shp-intro.json +0 -59
  501. package/sites/shop/components/shp-nav.json +0 -358
  502. package/sites/shop/components/shp-newsletter.json +0 -166
  503. package/sites/shop/components/shp-product-card.json +0 -238
  504. package/sites/shop/components/shp-product-filter.json +0 -366
  505. package/sites/shop/components/shp-review.json +0 -54
  506. package/sites/shop/components/shp-section-header.json +0 -75
  507. package/sites/shop/components/shp-service.json +0 -83
  508. package/sites/shop/components/shp-stat.json +0 -37
  509. package/sites/shop/components/shp-trust.json +0 -58
  510. package/sites/shop/components/shp-visit-info.json +0 -132
  511. package/sites/shop/layouts/base.json +0 -22
  512. package/sites/shop/pages/products/[sku].json +0 -482
  513. package/sites/shop/project.json +0 -156
@@ -0,0 +1,118 @@
1
+ /- kdl-version 2
2
+
3
+ pv-project-card {
4
+ state {
5
+ number ""
6
+ title ""
7
+ category ""
8
+ year ""
9
+ href "#"
10
+ cover type=string format=image default=""
11
+ alt ""
12
+ }
13
+ style display=block minWidth="0"
14
+ a href="${state.href}" {
15
+ style {
16
+ position relative
17
+ display block
18
+ height "100%"
19
+ overflow hidden
20
+ textDecoration none
21
+ color "var(--color-text-white)"
22
+ backgroundColor "var(--color-bg-elev)"
23
+ ":hover img" transform="scale(1.06)"
24
+ ":hover figcaption" transform="translateY(0)" opacity="1"
25
+ }
26
+ img src="${state.cover}" alt="${state.alt}" loading=lazy {
27
+ style {
28
+ position absolute
29
+ inset "0"
30
+ width "100%"
31
+ height "100%"
32
+ objectFit cover
33
+ display block
34
+ transition "transform 0.8s cubic-bezier(0.22, 1, 0.36, 1)"
35
+ }
36
+ }
37
+ div {
38
+ style {
39
+ position absolute
40
+ inset "0"
41
+ background "linear-gradient(to top, rgba(10,10,11,0.82) 0%, rgba(10,10,11,0.25) 40%, transparent 68%)"
42
+ }
43
+ }
44
+ div {
45
+ style {
46
+ position absolute
47
+ left "0"
48
+ right "0"
49
+ bottom "0"
50
+ padding "clamp(1.25rem, 2.5vw, 2rem)"
51
+ }
52
+ div {
53
+ style display=flex alignItems=center gap="0.7rem" marginBottom="0.6rem"
54
+ span "${state.number}" {
55
+ style {
56
+ fontFamily "var(--font-label)"
57
+ fontSize "0.72rem"
58
+ letterSpacing "0.1em"
59
+ color "var(--color-primary)"
60
+ }
61
+ }
62
+ span {
63
+ style {
64
+ width "1.5rem"
65
+ height "1px"
66
+ backgroundColor "var(--color-primary)"
67
+ opacity "0.7"
68
+ }
69
+ }
70
+ span "${state.category}" {
71
+ style {
72
+ display "${state.category ? 'inline' : 'none'}"
73
+ fontSize "0.66rem"
74
+ fontWeight "600"
75
+ letterSpacing "0.2em"
76
+ textTransform uppercase
77
+ color "var(--color-text-white)"
78
+ opacity "0.75"
79
+ }
80
+ }
81
+ }
82
+ div {
83
+ style display=flex alignItems=baseline justifyContent=space-between gap="1rem"
84
+ h3 "${state.title}" {
85
+ style {
86
+ fontFamily "var(--font-heading)"
87
+ fontWeight "500"
88
+ fontSize "clamp(1.6rem, 2.8vw, 2.4rem)"
89
+ lineHeight "1.05"
90
+ margin "0"
91
+ }
92
+ }
93
+ span "${state.year}" {
94
+ style {
95
+ display "${state.year ? 'inline' : 'none'}"
96
+ fontSize "0.8rem"
97
+ color "var(--color-text-white)"
98
+ opacity "0.6"
99
+ whiteSpace nowrap
100
+ }
101
+ }
102
+ }
103
+ figcaption "View project →" {
104
+ style {
105
+ marginTop "0.75rem"
106
+ fontSize "0.72rem"
107
+ fontWeight "600"
108
+ textTransform uppercase
109
+ letterSpacing "0.18em"
110
+ color "var(--color-primary)"
111
+ transform "translateY(0.75rem)"
112
+ opacity "0"
113
+ transition "transform 0.3s, opacity 0.3s"
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
@@ -0,0 +1,29 @@
1
+ /- kdl-version 2
2
+
3
+ pv-project-grid {
4
+ state {}
5
+ style {
6
+ display grid
7
+ gridTemplateColumns "repeat(12, 1fr)"
8
+ gridAutoRows "clamp(230px, 32vw, 460px)"
9
+ gap "0.5rem"
10
+ padding "0 0.5rem"
11
+ "& pv-project-card" gridColumn="span 6"
12
+ "& pv-project-card:nth-of-type(6n + 1)" gridColumn="span 7"
13
+ "& pv-project-card:nth-of-type(6n + 2)" gridColumn="span 5"
14
+ "& pv-project-card:nth-of-type(6n + 3)" gridColumn="span 5"
15
+ "& pv-project-card:nth-of-type(6n + 4)" gridColumn="span 7"
16
+ "& pv-project-card:nth-of-type(6n + 5)" gridColumn="span 6"
17
+ "& pv-project-card:nth-of-type(6n + 6)" gridColumn="span 6"
18
+ @--sm gridTemplateColumns="1fr" gridAutoRows="68vw" {
19
+ "& pv-project-card" gridColumn="span 1"
20
+ "& pv-project-card:nth-of-type(6n + 1)" gridColumn="span 1"
21
+ "& pv-project-card:nth-of-type(6n + 2)" gridColumn="span 1"
22
+ "& pv-project-card:nth-of-type(6n + 3)" gridColumn="span 1"
23
+ "& pv-project-card:nth-of-type(6n + 4)" gridColumn="span 1"
24
+ "& pv-project-card:nth-of-type(6n + 5)" gridColumn="span 1"
25
+ "& pv-project-card:nth-of-type(6n + 6)" gridColumn="span 1"
26
+ }
27
+ }
28
+ slot
29
+ }
@@ -0,0 +1,65 @@
1
+ /- kdl-version 2
2
+
3
+ pv-section-header {
4
+ state eyebrow="" heading="" subheading=""
5
+ style {
6
+ display block
7
+ maxWidth "var(--max-width)"
8
+ margin "0 auto"
9
+ padding "0 clamp(1.5rem, 4vw, 4rem)"
10
+ }
11
+ div {
12
+ style {
13
+ display flex
14
+ alignItems flex-end
15
+ justifyContent space-between
16
+ gap "2rem"
17
+ flexWrap wrap
18
+ borderBottom "1px solid var(--color-line)"
19
+ paddingBottom "1.5rem"
20
+ }
21
+ div {
22
+ div {
23
+ style {
24
+ display "${state.eyebrow ? 'flex' : 'none'}"
25
+ alignItems center
26
+ gap "0.85rem"
27
+ marginBottom "1.1rem"
28
+ }
29
+ span {
30
+ style width="2.25rem" height="1px" backgroundColor="var(--color-primary)"
31
+ }
32
+ span "${state.eyebrow}" {
33
+ style {
34
+ textTransform uppercase
35
+ letterSpacing "0.24em"
36
+ fontSize "0.7rem"
37
+ fontWeight "500"
38
+ color "var(--color-primary)"
39
+ }
40
+ }
41
+ }
42
+ h2 "${state.heading}" {
43
+ style {
44
+ fontFamily "var(--font-heading)"
45
+ fontSize "clamp(2.2rem, 5vw, 3.6rem)"
46
+ fontWeight "400"
47
+ lineHeight "1.02"
48
+ letterSpacing "-0.01em"
49
+ margin "0"
50
+ color "var(--color-text-primary)"
51
+ }
52
+ }
53
+ }
54
+ p "${state.subheading}" {
55
+ style {
56
+ display "${state.subheading ? 'block' : 'none'}"
57
+ fontSize "1.02rem"
58
+ lineHeight "1.7"
59
+ color "var(--color-text-muted)"
60
+ margin "0"
61
+ maxWidth "40ch"
62
+ }
63
+ }
64
+ }
65
+ }
@@ -303,7 +303,13 @@
303
303
  },
304
304
  "FunctionDef": {
305
305
  "additionalProperties": false,
306
- "description": "A function declaration. $prototype must be \"Function\". body (inline) and $src (external) are mutually exclusive. First parameter is always state (the reactive scope).",
306
+ "description": "A function declaration. $prototype must be \"Function\". body (inline) and $src (external) are mutually exclusive; declaring both is an error. First parameter is always state (the reactive scope).",
307
+ "not": {
308
+ "required": [
309
+ "body",
310
+ "$src"
311
+ ]
312
+ },
307
313
  "properties": {
308
314
  "$export": {
309
315
  "description": "Named export in $src module. Defaults to the state key name.",
@@ -339,11 +345,12 @@
339
345
  "type": "array"
340
346
  },
341
347
  "body": {
342
- "description": "Inline function body: an opaque JS source string (first implicit parameter is state), or a structured statement array (spec §20) — explicit structured function declaration, analyzable by tooling and editable visually. The escalation ladder within the shape is structured statements → JS string.",
348
+ "description": "Inline function body: a source string in erasable TypeScript, which plain JavaScript already is (spec §23.1; types are erased before it is analysed or run; first implicit parameter is state), or a structured statement array (spec §20) — explicit structured function declaration, analyzable by tooling and editable visually. The escalation ladder within the shape is structured statements → source string.",
343
349
  "examples": [
344
350
  "state.count++",
345
351
  "state.items.push({ id: Date.now(), text: \"\", done: false })",
346
352
  "return state.score >= 90 ? \"gold\" : \"silver\"",
353
+ "const input = event.target as HTMLInputElement; state.label = input.value",
347
354
  [
348
355
  {
349
356
  "operator": "push",
@@ -604,6 +611,7 @@
604
611
  "type": "string"
605
612
  },
606
613
  "body": {
614
+ "description": "The member's body in erasable TypeScript, which plain JavaScript already is (spec §23.1), as one string or as an array of lines.",
607
615
  "oneOf": [
608
616
  {
609
617
  "type": "string"
@@ -675,6 +683,7 @@
675
683
  "type": "string"
676
684
  },
677
685
  "body": {
686
+ "description": "The member's body in erasable TypeScript, which plain JavaScript already is (spec §23.1), as one string or as an array of lines.",
678
687
  "oneOf": [
679
688
  {
680
689
  "type": "string"
@@ -0,0 +1,12 @@
1
+ /- kdl-version 2
2
+ $elements (ref)"../components/pv-nav.jxn" (ref)"../components/pv-footer.jxn"
3
+
4
+ div {
5
+ style minHeight="100vh" display=flex flexDirection=column backgroundColor="var(--color-bg)"
6
+ pv-nav
7
+ main {
8
+ style flex="1"
9
+ slot
10
+ }
11
+ pv-footer
12
+ }
@@ -9,10 +9,10 @@
9
9
  "dev": "jx dev"
10
10
  },
11
11
  "dependencies": {
12
- "@jxsuite/parser": "^4.3.2"
12
+ "@jxsuite/parser": "^4.3.4"
13
13
  },
14
14
  "devDependencies": {
15
- "@jxsuite/compiler": "^8.4.0",
16
- "@jxsuite/runtime": "^6.2.1"
15
+ "@jxsuite/compiler": "^8.6.0",
16
+ "@jxsuite/runtime": "^6.3.0"
17
17
  }
18
18
  }
@@ -0,0 +1,177 @@
1
+ /- kdl-version 2
2
+ $paths contentType=projects param=slug field=slug
3
+ $head {
4
+ meta name=description content="${state.entry.data.title} — a ${state.entry.data.category} project by Aperture Studio."
5
+ }
6
+
7
+ $element .title="${state.entry.data.title} — Aperture Studio" {
8
+ state {
9
+ entry {
10
+ $prototype ContentEntry
11
+ contentType projects
12
+ field slug
13
+ id (ref)"#/$params/slug"
14
+ $src "@jxsuite/parser/ContentEntry.class.json"
15
+ }
16
+ }
17
+ article {
18
+ style {
19
+ maxWidth "var(--max-width-narrow)"
20
+ margin "0 auto"
21
+ padding "clamp(7rem, 11vw, 9rem) 1.5rem clamp(3.5rem, 8vw, 6rem)"
22
+ }
23
+ a href="/work/" "← All work" {
24
+ style {
25
+ display inline-block
26
+ color "var(--color-primary)"
27
+ textDecoration none
28
+ fontWeight "600"
29
+ fontSize "0.85rem"
30
+ letterSpacing "0.05em"
31
+ textTransform uppercase
32
+ marginBottom "2rem"
33
+ :hover textDecoration=underline
34
+ }
35
+ }
36
+ header {
37
+ style marginBottom="2.5rem"
38
+ div {
39
+ style display=flex alignItems=center gap="0.85rem" marginBottom="1.25rem"
40
+ span "${state.entry.data.category}" {
41
+ style {
42
+ display inline-block
43
+ padding "0.3rem 0.8rem"
44
+ border "1px solid var(--color-border)"
45
+ borderRadius "999px"
46
+ fontSize "0.72rem"
47
+ fontWeight "600"
48
+ letterSpacing "0.14em"
49
+ textTransform uppercase
50
+ color "var(--color-primary)"
51
+ backgroundColor "var(--color-bg-cream)"
52
+ }
53
+ }
54
+ span "${state.entry.data.year}" {
55
+ style fontSize="0.85rem" color="var(--color-text-muted)" letterSpacing="0.05em"
56
+ }
57
+ }
58
+ h1 "${state.entry.data.title}" {
59
+ style {
60
+ fontFamily "var(--font-heading)"
61
+ fontSize "clamp(2.5rem, 6vw, 4rem)"
62
+ fontWeight "600"
63
+ lineHeight "1.06"
64
+ letterSpacing "-0.01em"
65
+ margin "0"
66
+ }
67
+ }
68
+ }
69
+ img src="${state.entry.data.cover}" alt="${state.entry.data.title}" {
70
+ style {
71
+ width "100%"
72
+ maxHeight "34rem"
73
+ objectFit cover
74
+ borderRadius "var(--radius)"
75
+ display "${state.entry.data.cover ? 'block' : 'none'}"
76
+ marginBottom "2.75rem"
77
+ }
78
+ }
79
+ div {
80
+ style {
81
+ fontSize "1.15rem"
82
+ lineHeight "1.85"
83
+ color "var(--color-text-primary)"
84
+ maxWidth "62ch"
85
+ margin "0 0 3.5rem"
86
+ }
87
+ .children "${state.entry.$children ?? []}"
88
+ }
89
+ section {
90
+ h2 "Selected frames" {
91
+ style {
92
+ fontFamily "var(--font-heading)"
93
+ fontSize "1.75rem"
94
+ fontWeight "600"
95
+ margin "0 0 1.5rem"
96
+ paddingBottom "0.6rem"
97
+ borderBottom "2px solid var(--color-ink)"
98
+ }
99
+ }
100
+ div {
101
+ style display=grid gridTemplateColumns="repeat(3, 1fr)" gap="1rem" {
102
+ @--sm gridTemplateColumns="1fr"
103
+ }
104
+ img src="/images/project-2.jpg" alt="${state.entry.data.title} — frame" loading=lazy {
105
+ style {
106
+ width "100%"
107
+ aspectRatio "4 / 5"
108
+ objectFit cover
109
+ borderRadius "var(--radius)"
110
+ display block
111
+ }
112
+ }
113
+ img src="/images/project-4.jpg" alt="${state.entry.data.title} — frame" loading=lazy {
114
+ style {
115
+ width "100%"
116
+ aspectRatio "4 / 5"
117
+ objectFit cover
118
+ borderRadius "var(--radius)"
119
+ display block
120
+ }
121
+ }
122
+ img src="/images/project-6.jpg" alt="${state.entry.data.title} — frame" loading=lazy {
123
+ style {
124
+ width "100%"
125
+ aspectRatio "4 / 5"
126
+ objectFit cover
127
+ borderRadius "var(--radius)"
128
+ display block
129
+ }
130
+ }
131
+ }
132
+ }
133
+ div {
134
+ style {
135
+ marginTop "3.5rem"
136
+ padding "clamp(2.5rem, 6vw, 3.5rem)"
137
+ backgroundColor "var(--color-bg-dark)"
138
+ color "var(--color-text-white)"
139
+ borderRadius "var(--radius)"
140
+ textAlign center
141
+ }
142
+ h2 "Planning something similar?" {
143
+ style {
144
+ fontFamily "var(--font-heading)"
145
+ fontSize "clamp(1.75rem, 4vw, 2.5rem)"
146
+ fontWeight "600"
147
+ margin "0 0 1rem"
148
+ }
149
+ }
150
+ p "Tell us about your project and we'll be in touch to talk through the details." {
151
+ style {
152
+ fontSize "1.1rem"
153
+ lineHeight "1.7"
154
+ opacity "0.82"
155
+ margin "0 auto 2rem"
156
+ maxWidth "48ch"
157
+ }
158
+ }
159
+ a href="/contact/" "Start a Project" {
160
+ style {
161
+ display inline-block
162
+ backgroundColor "var(--color-primary)"
163
+ color "var(--color-text-white)"
164
+ padding "0.9rem 2.25rem"
165
+ borderRadius "var(--radius)"
166
+ fontSize "0.95rem"
167
+ fontWeight "600"
168
+ letterSpacing "0.05em"
169
+ textTransform uppercase
170
+ textDecoration none
171
+ transition "background-color 0.15s"
172
+ :hover backgroundColor="var(--color-primary-hover)"
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
@@ -0,0 +1,85 @@
1
+ /- kdl-version 2
2
+ $schema "./project.schema.json"
3
+ project "Aperture Studio"
4
+
5
+ url "https://example.com"
6
+
7
+ defaults layout="./layouts/base.jxn" lang=en
8
+
9
+ $head {
10
+ meta name=viewport content="width=device-width, initial-scale=1"
11
+ meta name=description content="Aperture Studio — a photography and creative studio crafting image-forward stories across weddings, portraits, editorial, travel, food, and architecture."
12
+ link rel=icon href="/favicon.svg"
13
+ link rel=preconnect href="https://fonts.googleapis.com"
14
+ link rel=preconnect href="https://fonts.gstatic.com" crossorigin=""
15
+ link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500&family=Fraunces:opsz,wght@9..144,300;9..144,400&display=swap"
16
+ }
17
+
18
+ $media {
19
+ -- "1200px"
20
+ --lg "(max-width: 1024px)"
21
+ --md "(max-width: 768px)"
22
+ --sm "(max-width: 640px)"
23
+ }
24
+
25
+ style {
26
+ --color-primary "#c8a45c"
27
+ --color-primary-hover "#dcbd77"
28
+ --color-ink "#ece9e3"
29
+ --color-bg-dark "#161619"
30
+ --color-bg-cream "#161619"
31
+ --color-bg-white "#0c0c0d"
32
+ --color-bg "#0c0c0d"
33
+ --color-bg-elev "#161619"
34
+ --color-text-primary "#ece9e3"
35
+ --color-text-white "#ece9e3"
36
+ --color-text-muted "#8f8b82"
37
+ --color-border "#2a2a2e"
38
+ --color-line "#2a2a2e"
39
+ --color-accent "#c8a45c"
40
+ --font-heading "'Cormorant Garamond', Georgia, 'Times New Roman', serif"
41
+ --font-label "'Fraunces', Georgia, serif"
42
+ --max-width "1400px"
43
+ --max-width-narrow "760px"
44
+ --radius "0"
45
+ margin "0"
46
+ padding "0"
47
+ fontFamily "system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
48
+ lineHeight "1.6"
49
+ color "var(--color-text-primary)"
50
+ backgroundColor "var(--color-bg)"
51
+ }
52
+
53
+ images {
54
+ optimize #true
55
+ widths 320 640 960 1280 1920
56
+ formats webp avif
57
+ quality webp=80 avif=65 jpeg=80 png=80
58
+ sizes "(max-width: 768px) 100vw, 50vw"
59
+ lazyLoad #true
60
+ }
61
+
62
+ content {
63
+ projects {
64
+ source "./content/projects/"
65
+ format Markdown
66
+ schema {
67
+ type object
68
+ properties {
69
+ title type=string
70
+ category type=string
71
+ cover type=string format=image
72
+ year type=number
73
+ order type=number
74
+ slug type=string
75
+ }
76
+ required title category slug
77
+ }
78
+ }
79
+ }
80
+
81
+ build outDir="./dist" format=directory trailingSlash=always
82
+
83
+ extensions {
84
+ - "@jxsuite/parser"
85
+ }
@@ -0,0 +1,60 @@
1
+ /- kdl-version 2
2
+
3
+ pf-article-header {
4
+ state eyebrow=Insight title="" date="" author="" readingTime=""
5
+ style display=block marginBottom="clamp(2rem, 4vw, 3rem)"
6
+ p "${state.eyebrow}" {
7
+ style {
8
+ fontFamily "var(--font-sans)"
9
+ textTransform uppercase
10
+ letterSpacing "0.2em"
11
+ fontSize "0.72rem"
12
+ fontWeight "600"
13
+ color "var(--color-accent)"
14
+ paddingBottom "1rem"
15
+ borderBottom "1px solid var(--color-rule)"
16
+ margin "0 0 1.5rem"
17
+ }
18
+ }
19
+ h1 "${state.title}" {
20
+ style {
21
+ fontFamily "var(--font-serif)"
22
+ fontSize "clamp(2.1rem, 5vw, 3.2rem)"
23
+ fontWeight "500"
24
+ lineHeight "1.1"
25
+ letterSpacing "-0.02em"
26
+ margin "0 0 1.5rem"
27
+ color "var(--color-ink)"
28
+ }
29
+ }
30
+ div {
31
+ style {
32
+ display flex
33
+ flexWrap wrap
34
+ alignItems center
35
+ gap "0.6rem"
36
+ paddingTop "1.25rem"
37
+ borderTop "1px solid var(--color-hairline)"
38
+ fontFamily "var(--font-sans)"
39
+ fontSize "0.8rem"
40
+ textTransform uppercase
41
+ letterSpacing "0.1em"
42
+ color "var(--color-muted)"
43
+ }
44
+ span "${state.author}" {
45
+ style fontWeight="600" color="var(--color-ink)"
46
+ }
47
+ span "/" {
48
+ style color="var(--color-hairline)"
49
+ }
50
+ span "${state.date}" {
51
+ style fontVariantNumeric=tabular-nums
52
+ }
53
+ span "/" {
54
+ style display="${state.readingTime ? 'inline' : 'none'}" color="var(--color-hairline)"
55
+ }
56
+ span "${state.readingTime} min read" {
57
+ style display="${state.readingTime ? 'inline' : 'none'}" fontVariantNumeric=tabular-nums
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,74 @@
1
+ /- kdl-version 2
2
+
3
+ pf-contact-form {
4
+ state {
5
+ heading "Request a consultation"
6
+ note "This is a demo form. Wire it to your CRM or email in pages/contact.md."
7
+ }
8
+ style display=block
9
+ h3 "${state.heading}" {
10
+ style {
11
+ fontFamily "var(--font-serif)"
12
+ fontSize "1.7rem"
13
+ fontWeight "500"
14
+ letterSpacing "-0.01em"
15
+ margin "0 0 0.4rem"
16
+ color "var(--color-ink)"
17
+ }
18
+ }
19
+ div {
20
+ style height="2px" width="3rem" backgroundColor="var(--color-accent)" margin="0 0 1.5rem"
21
+ }
22
+ form action="#" method=post {
23
+ style display=grid gap="1rem" alignContent=start {
24
+ "& input, & textarea" {
25
+ width "100%"
26
+ padding "0.8rem 0"
27
+ border none
28
+ borderBottom "1px solid var(--color-hairline)"
29
+ borderRadius "0"
30
+ backgroundColor transparent
31
+ fontFamily "var(--font-sans)"
32
+ fontSize "1rem"
33
+ color "var(--color-ink)"
34
+ outline none
35
+ transition "border-color 0.15s"
36
+ }
37
+ "& input:focus, & textarea:focus" borderBottom="1px solid var(--color-accent)"
38
+ }
39
+ input type=text name=name placeholder="Your name" required="true" aria-label="Your name"
40
+ input type=email name=email placeholder="Work email" required="true" aria-label="Work email"
41
+ div {
42
+ style display=grid gridTemplateColumns="1fr 1fr" gap="1rem" {
43
+ @--sm gridTemplateColumns="1fr"
44
+ }
45
+ input type=text name=company placeholder=Company aria-label=Company
46
+ input type=text name=revenue placeholder="Annual revenue (approx.)" aria-label="Annual revenue"
47
+ }
48
+ textarea name=notes rows="4" placeholder="What can we help with?" aria-label="What can we help with?" {
49
+ style fontFamily="var(--font-sans)"
50
+ }
51
+ button type=submit "Request a consultation" {
52
+ style {
53
+ marginTop "0.75rem"
54
+ backgroundColor "var(--color-ink)"
55
+ color "var(--color-paper)"
56
+ padding "0.9rem 1.75rem"
57
+ border none
58
+ borderRadius "0"
59
+ fontFamily "var(--font-sans)"
60
+ fontSize "0.78rem"
61
+ fontWeight "600"
62
+ textTransform uppercase
63
+ letterSpacing "0.14em"
64
+ cursor pointer
65
+ justifySelf start
66
+ transition "background-color 0.15s"
67
+ :hover backgroundColor="var(--color-primary-hover)"
68
+ }
69
+ }
70
+ p "${state.note}" {
71
+ style fontSize="0.82rem" color="var(--color-muted)" margin="0"
72
+ }
73
+ }
74
+ }