create-tanqory-theme 0.0.0-stage → 0.2.3

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 (879) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -2
  3. package/bin/create-tanqory-theme.mjs +13 -0
  4. package/lib/agents.mjs +118 -0
  5. package/lib/create.mjs +245 -0
  6. package/package.json +39 -4
  7. package/templates/blank/README.md +13 -0
  8. package/templates/blank/config/settings.json +3 -0
  9. package/templates/blank/locales/en.json +22 -0
  10. package/templates/blank/locales/th.json +22 -0
  11. package/templates/blank/package.json +34 -0
  12. package/templates/blank/regions/footer.json +35 -0
  13. package/templates/blank/regions/header.json +13 -0
  14. package/templates/blank/scripts/build.mjs +193 -0
  15. package/templates/blank/scripts/probe.ts +4 -0
  16. package/templates/blank/src/bundle.ts +15 -0
  17. package/templates/blank/src/components/parts.tsx +32 -0
  18. package/templates/blank/src/entry.client.tsx +6 -0
  19. package/templates/blank/src/entry.server.tsx +13 -0
  20. package/templates/blank/src/sections/chrome.tsx +132 -0
  21. package/templates/blank/src/sections/commerce.tsx +242 -0
  22. package/templates/blank/src/sections/content.tsx +111 -0
  23. package/templates/blank/src/sections/editorial.tsx +107 -0
  24. package/templates/blank/src/settings.ts +15 -0
  25. package/templates/blank/src/styles/theme.css +195 -0
  26. package/templates/blank/src/templates.ts +14 -0
  27. package/templates/blank/src/theme.tsx +76 -0
  28. package/templates/blank/template.json +24 -0
  29. package/templates/blank/templates/404.json +14 -0
  30. package/templates/blank/templates/account.json +14 -0
  31. package/templates/blank/templates/article.json +14 -0
  32. package/templates/blank/templates/blog.json +14 -0
  33. package/templates/blank/templates/cart.json +14 -0
  34. package/templates/blank/templates/collection.json +14 -0
  35. package/templates/blank/templates/index.json +36 -0
  36. package/templates/blank/templates/page.contact.json +18 -0
  37. package/templates/blank/templates/page.json +14 -0
  38. package/templates/blank/templates/product.json +18 -0
  39. package/templates/blank/templates/search.json +14 -0
  40. package/templates/blank/tests/theme.test.ts +49 -0
  41. package/templates/blank/tsconfig.json +17 -0
  42. package/templates/blank/vite.client.config.ts +17 -0
  43. package/templates/blank/vite.probe.config.ts +16 -0
  44. package/templates/blank/vite.server.config.ts +32 -0
  45. package/templates/blank/vitest.config.ts +9 -0
  46. package/templates/common/.claude/settings.json +8 -0
  47. package/templates/common/.codex/config.toml +4 -0
  48. package/templates/common/.gemini/settings.json +12 -0
  49. package/templates/common/.github/workflows/theme-check.yml +44 -0
  50. package/templates/common/.mcp.json +12 -0
  51. package/templates/common/.vscode/mcp.json +9 -0
  52. package/templates/common/_gitignore +9 -0
  53. package/templates/common/scripts/check.mjs +44 -0
  54. package/templates/common/scripts/dev.mjs +30 -0
  55. package/templates/common/tanqory.config.json +6 -0
  56. package/templates/nova/.gitattributes +3 -0
  57. package/templates/nova/.tanqory/contracts/LOCK.json +66 -0
  58. package/templates/nova/.tanqory/contracts/nova-01.json +1092 -0
  59. package/templates/nova/.tanqory/contracts/nova-12A.json +2674 -0
  60. package/templates/nova/.tanqory/contracts/nova-12B.json +2285 -0
  61. package/templates/nova/.tanqory/contracts/nova-12C.json +2848 -0
  62. package/templates/nova/.tanqory/contracts/nova-12D.json +3039 -0
  63. package/templates/nova/.tanqory/contracts/nova-12E.json +1473 -0
  64. package/templates/nova/.tanqory/contracts/nova-12F.json +1670 -0
  65. package/templates/nova/.tanqory/contracts/nova-12G.json +1661 -0
  66. package/templates/nova/.tanqory/contracts/nova-13.json +301 -0
  67. package/templates/nova/.tanqory/contracts/nova-14.json +172 -0
  68. package/templates/nova/.tanqory/legacy-settings.json +1121 -0
  69. package/templates/nova/README.md +150 -0
  70. package/templates/nova/_gitignore +28 -0
  71. package/templates/nova/assets/ai-tokens.css +6 -0
  72. package/templates/nova/assets/starter/starter-art-1200x800-0b773ac4.svg +1 -0
  73. package/templates/nova/assets/starter/starter-art-1200x900-59600290.svg +1 -0
  74. package/templates/nova/assets/starter/starter-art-1200x900-c549d496.svg +1 -0
  75. package/templates/nova/assets/starter/starter-art-1600x900-8f979fcb.svg +1 -0
  76. package/templates/nova/assets/starter/starter-art-2100x900-cbb71bfd.svg +1 -0
  77. package/templates/nova/config/legacy-settings.json +438 -0
  78. package/templates/nova/config/promotion-popup.schema.ts +29 -0
  79. package/templates/nova/config/settings.json +23 -0
  80. package/templates/nova/config/settings.schema.ts +231 -0
  81. package/templates/nova/entry.abi.tsx +27 -0
  82. package/templates/nova/groups/footer.json +39 -0
  83. package/templates/nova/groups/header.json +11 -0
  84. package/templates/nova/lib/abi/abi.css +41 -0
  85. package/templates/nova/lib/bundle-core.ts +35 -0
  86. package/templates/nova/lib/bundle.client.ts +15 -0
  87. package/templates/nova/lib/bundle.ts +15 -0
  88. package/templates/nova/lib/legacy-settings.ts +104 -0
  89. package/templates/nova/locales/ar.json +590 -0
  90. package/templates/nova/locales/en.json +590 -0
  91. package/templates/nova/locales/th.json +590 -0
  92. package/templates/nova/main.abi.tsx +12 -0
  93. package/templates/nova/package.json +44 -0
  94. package/templates/nova/scripts/abi/build.mjs +145 -0
  95. package/templates/nova/scripts/abi/check-content.mjs +99 -0
  96. package/templates/nova/scripts/abi/jcs.mjs +27 -0
  97. package/templates/nova/scripts/abi/local-host.mjs +294 -0
  98. package/templates/nova/scripts/abi/manifest.mjs +392 -0
  99. package/templates/nova/scripts/abi/starter-assets.mjs +32 -0
  100. package/templates/nova/scripts/compiler/checks/check-a11y.mjs +88 -0
  101. package/templates/nova/scripts/compiler/checks/check-layout-sanity.mjs +169 -0
  102. package/templates/nova/scripts/compiler/checks/check-page-headings.mjs +67 -0
  103. package/templates/nova/scripts/compiler/checks/check-product-jsonld.mjs +80 -0
  104. package/templates/nova/scripts/compiler/checks/theme-spec/check.mjs +88 -0
  105. package/templates/nova/scripts/compiler/contracts/extract.mjs +188 -0
  106. package/templates/nova/scripts/compiler/contracts/index.ts +125 -0
  107. package/templates/nova/scripts/compiler/contracts/validate.ts +347 -0
  108. package/templates/nova/scripts/compiler/manifest/gen-manifest.mjs +156 -0
  109. package/templates/nova/scripts/compiler/manifest/manifest-entry.ts +386 -0
  110. package/templates/nova/scripts/compiler/manifest/manifest-sections.ts +247 -0
  111. package/templates/nova/scripts/compiler/migrate/migrate-content.mjs +171 -0
  112. package/templates/nova/scripts/compiler/migrate/migrate-groups.mjs +159 -0
  113. package/templates/nova/scripts/parity/case-shim.ts +14 -0
  114. package/templates/nova/scripts/parity/emit.ts +206 -0
  115. package/templates/nova/scripts/parity/index.html +12 -0
  116. package/templates/nova/scripts/parity/main.tsx +23 -0
  117. package/templates/nova/scripts/parity/pages.tsx +123 -0
  118. package/templates/nova/scripts/parity/vite.config.ts +29 -0
  119. package/templates/nova/src/components/base/Accordion.css +20 -0
  120. package/templates/nova/src/components/base/Accordion.tsx +50 -0
  121. package/templates/nova/src/components/base/Badge.css +17 -0
  122. package/templates/nova/src/components/base/Badge.tsx +26 -0
  123. package/templates/nova/src/components/base/Button.css +73 -0
  124. package/templates/nova/src/components/base/Button.tsx +64 -0
  125. package/templates/nova/src/components/base/Checkbox.tsx +18 -0
  126. package/templates/nova/src/components/base/Chip.css +20 -0
  127. package/templates/nova/src/components/base/Chip.tsx +33 -0
  128. package/templates/nova/src/components/base/Divider.css +6 -0
  129. package/templates/nova/src/components/base/Divider.tsx +28 -0
  130. package/templates/nova/src/components/base/IconButton.css +34 -0
  131. package/templates/nova/src/components/base/IconButton.tsx +41 -0
  132. package/templates/nova/src/components/base/Input.css +21 -0
  133. package/templates/nova/src/components/base/Input.tsx +24 -0
  134. package/templates/nova/src/components/base/Link.css +15 -0
  135. package/templates/nova/src/components/base/Link.tsx +23 -0
  136. package/templates/nova/src/components/base/Radio.tsx +13 -0
  137. package/templates/nova/src/components/base/Select.css +18 -0
  138. package/templates/nova/src/components/base/Select.tsx +34 -0
  139. package/templates/nova/src/components/base/Skeleton.css +17 -0
  140. package/templates/nova/src/components/base/Skeleton.tsx +23 -0
  141. package/templates/nova/src/components/base/Spinner.css +13 -0
  142. package/templates/nova/src/components/base/Spinner.tsx +8 -0
  143. package/templates/nova/src/components/base/Switch.tsx +16 -0
  144. package/templates/nova/src/components/base/Tabs.css +24 -0
  145. package/templates/nova/src/components/base/Tabs.tsx +61 -0
  146. package/templates/nova/src/components/base/Textarea.css +1 -0
  147. package/templates/nova/src/components/base/Textarea.tsx +8 -0
  148. package/templates/nova/src/components/base/choice-props.ts +9 -0
  149. package/templates/nova/src/components/base/choice.css +69 -0
  150. package/templates/nova/src/components/commerce/AddToCart.css +4 -0
  151. package/templates/nova/src/components/commerce/AddToCart.tsx +77 -0
  152. package/templates/nova/src/components/commerce/CartLine.css +26 -0
  153. package/templates/nova/src/components/commerce/CartLine.tsx +82 -0
  154. package/templates/nova/src/components/commerce/CartSummary.css +23 -0
  155. package/templates/nova/src/components/commerce/CartSummary.tsx +120 -0
  156. package/templates/nova/src/components/commerce/CollectionCard.css +66 -0
  157. package/templates/nova/src/components/commerce/CollectionCard.tsx +57 -0
  158. package/templates/nova/src/components/commerce/ComparisonTable.css +33 -0
  159. package/templates/nova/src/components/commerce/ComparisonTable.tsx +113 -0
  160. package/templates/nova/src/components/commerce/EarnHint.css +3 -0
  161. package/templates/nova/src/components/commerce/EarnHint.tsx +31 -0
  162. package/templates/nova/src/components/commerce/Hotspot.css +16 -0
  163. package/templates/nova/src/components/commerce/Hotspot.tsx +64 -0
  164. package/templates/nova/src/components/commerce/ListingParts.css +79 -0
  165. package/templates/nova/src/components/commerce/ListingParts.tsx +211 -0
  166. package/templates/nova/src/components/commerce/LookItem.css +19 -0
  167. package/templates/nova/src/components/commerce/LookItem.tsx +41 -0
  168. package/templates/nova/src/components/commerce/MiniCartLine.css +20 -0
  169. package/templates/nova/src/components/commerce/MiniCartLine.tsx +93 -0
  170. package/templates/nova/src/components/commerce/PaymentMark.css +2 -0
  171. package/templates/nova/src/components/commerce/PaymentMark.tsx +55 -0
  172. package/templates/nova/src/components/commerce/Price.css +27 -0
  173. package/templates/nova/src/components/commerce/Price.tsx +55 -0
  174. package/templates/nova/src/components/commerce/ProductCard.css +66 -0
  175. package/templates/nova/src/components/commerce/ProductCard.tsx +117 -0
  176. package/templates/nova/src/components/commerce/ProductGallery.css +72 -0
  177. package/templates/nova/src/components/commerce/ProductGallery.tsx +98 -0
  178. package/templates/nova/src/components/commerce/QuantitySelector.css +23 -0
  179. package/templates/nova/src/components/commerce/QuantitySelector.tsx +45 -0
  180. package/templates/nova/src/components/commerce/Reviews.css +34 -0
  181. package/templates/nova/src/components/commerce/Reviews.tsx +112 -0
  182. package/templates/nova/src/components/commerce/Stars.css +7 -0
  183. package/templates/nova/src/components/commerce/Stars.tsx +38 -0
  184. package/templates/nova/src/components/commerce/VariantPicker.css +31 -0
  185. package/templates/nova/src/components/commerce/VariantPicker.tsx +122 -0
  186. package/templates/nova/src/components/commerce/blocks/Badge.css +6 -0
  187. package/templates/nova/src/components/commerce/blocks/Badge.tsx +33 -0
  188. package/templates/nova/src/components/commerce/blocks/PaymentIcons.tsx +43 -0
  189. package/templates/nova/src/components/commerce/blocks/Swatches.tsx +17 -0
  190. package/templates/nova/src/components/commerce/blocks/payment.css +2 -0
  191. package/templates/nova/src/components/commerce/cart-limit.ts +11 -0
  192. package/templates/nova/src/components/commerce/money.ts +34 -0
  193. package/templates/nova/src/components/commerce/swatch.ts +54 -0
  194. package/templates/nova/src/components/content/ArticleCard.css +22 -0
  195. package/templates/nova/src/components/content/ArticleCard.tsx +53 -0
  196. package/templates/nova/src/components/content/BeforeAfterSlider.css +38 -0
  197. package/templates/nova/src/components/content/BeforeAfterSlider.tsx +87 -0
  198. package/templates/nova/src/components/content/CardRow.css +80 -0
  199. package/templates/nova/src/components/content/CardRow.tsx +140 -0
  200. package/templates/nova/src/components/content/CarouselControls.css +61 -0
  201. package/templates/nova/src/components/content/CarouselControls.tsx +90 -0
  202. package/templates/nova/src/components/content/ContentsNav.css +16 -0
  203. package/templates/nova/src/components/content/ContentsNav.tsx +55 -0
  204. package/templates/nova/src/components/content/Countdown.css +24 -0
  205. package/templates/nova/src/components/content/Countdown.tsx +115 -0
  206. package/templates/nova/src/components/content/HeroCopy.css +92 -0
  207. package/templates/nova/src/components/content/HeroCopy.tsx +148 -0
  208. package/templates/nova/src/components/content/HeroFrame.css +75 -0
  209. package/templates/nova/src/components/content/HeroFrame.tsx +49 -0
  210. package/templates/nova/src/components/content/HeroMedia.css +40 -0
  211. package/templates/nova/src/components/content/HeroMedia.tsx +170 -0
  212. package/templates/nova/src/components/content/LongForm.css +40 -0
  213. package/templates/nova/src/components/content/LongForm.tsx +56 -0
  214. package/templates/nova/src/components/content/MediaFrame.css +5 -0
  215. package/templates/nova/src/components/content/MediaFrame.tsx +52 -0
  216. package/templates/nova/src/components/content/RichText.tsx +30 -0
  217. package/templates/nova/src/components/content/SectionHead.css +8 -0
  218. package/templates/nova/src/components/content/SectionHead.tsx +34 -0
  219. package/templates/nova/src/components/content/ShareButtons.css +2 -0
  220. package/templates/nova/src/components/content/ShareButtons.tsx +40 -0
  221. package/templates/nova/src/components/content/StoreCard.css +14 -0
  222. package/templates/nova/src/components/content/StoreCard.tsx +60 -0
  223. package/templates/nova/src/components/content/TestimonialCard.css +36 -0
  224. package/templates/nova/src/components/content/TestimonialCard.tsx +102 -0
  225. package/templates/nova/src/components/content/UgcTile.css +8 -0
  226. package/templates/nova/src/components/content/UgcTile.tsx +33 -0
  227. package/templates/nova/src/components/content/blocks/Button.tsx +36 -0
  228. package/templates/nova/src/components/content/blocks/Column.tsx +30 -0
  229. package/templates/nova/src/components/content/blocks/Heading.tsx +31 -0
  230. package/templates/nova/src/components/content/blocks/Icon.tsx +25 -0
  231. package/templates/nova/src/components/content/blocks/Image.tsx +42 -0
  232. package/templates/nova/src/components/content/blocks/Text.tsx +26 -0
  233. package/templates/nova/src/components/content/blocks/Video.tsx +44 -0
  234. package/templates/nova/src/components/content/blocks/content.css +25 -0
  235. package/templates/nova/src/components/content/blocks/shared.ts +5 -0
  236. package/templates/nova/src/components/forms/ContactForm.css +19 -0
  237. package/templates/nova/src/components/forms/ContactForm.tsx +139 -0
  238. package/templates/nova/src/components/forms/FormField.css +15 -0
  239. package/templates/nova/src/components/forms/FormField.tsx +77 -0
  240. package/templates/nova/src/components/forms/GatewayFields.tsx +79 -0
  241. package/templates/nova/src/components/forms/NewsletterForm.css +9 -0
  242. package/templates/nova/src/components/forms/NewsletterForm.tsx +141 -0
  243. package/templates/nova/src/components/forms/SearchField.css +7 -0
  244. package/templates/nova/src/components/forms/SearchField.tsx +68 -0
  245. package/templates/nova/src/components/forms/blocks/Newsletter.css +5 -0
  246. package/templates/nova/src/components/forms/blocks/Newsletter.tsx +71 -0
  247. package/templates/nova/src/components/forms/validate.ts +4 -0
  248. package/templates/nova/src/components/listing/ProductListing.tsx +200 -0
  249. package/templates/nova/src/components/navigation/BrandLogo.tsx +35 -0
  250. package/templates/nova/src/components/navigation/Breadcrumb.css +16 -0
  251. package/templates/nova/src/components/navigation/Breadcrumb.tsx +59 -0
  252. package/templates/nova/src/components/navigation/LineAddFriend.css +5 -0
  253. package/templates/nova/src/components/navigation/LineAddFriend.tsx +42 -0
  254. package/templates/nova/src/components/navigation/LocaleSelector.css +33 -0
  255. package/templates/nova/src/components/navigation/LocaleSelector.tsx +64 -0
  256. package/templates/nova/src/components/navigation/Menu.tsx +26 -0
  257. package/templates/nova/src/components/navigation/Pagination.css +24 -0
  258. package/templates/nova/src/components/navigation/Pagination.tsx +74 -0
  259. package/templates/nova/src/components/navigation/RecoveryLinks.css +8 -0
  260. package/templates/nova/src/components/navigation/RecoveryLinks.tsx +23 -0
  261. package/templates/nova/src/components/navigation/SocialLinks.css +5 -0
  262. package/templates/nova/src/components/navigation/SocialLinks.tsx +51 -0
  263. package/templates/nova/src/components/navigation/blocks/SocialLinks.tsx +23 -0
  264. package/templates/nova/src/components/overlays/AccountMenu.css +11 -0
  265. package/templates/nova/src/components/overlays/AccountMenu.tsx +91 -0
  266. package/templates/nova/src/components/overlays/CartDrawer.css +17 -0
  267. package/templates/nova/src/components/overlays/CartDrawer.tsx +118 -0
  268. package/templates/nova/src/components/overlays/ConfirmationDialog.tsx +49 -0
  269. package/templates/nova/src/components/overlays/CookieConsent.css +56 -0
  270. package/templates/nova/src/components/overlays/CookieConsent.tsx +170 -0
  271. package/templates/nova/src/components/overlays/Drawer.css +38 -0
  272. package/templates/nova/src/components/overlays/Drawer.tsx +66 -0
  273. package/templates/nova/src/components/overlays/FriendOfferPanel.tsx +79 -0
  274. package/templates/nova/src/components/overlays/MarketSelector.css +111 -0
  275. package/templates/nova/src/components/overlays/MarketSelector.tsx +450 -0
  276. package/templates/nova/src/components/overlays/Menu.css +9 -0
  277. package/templates/nova/src/components/overlays/Menu.tsx +124 -0
  278. package/templates/nova/src/components/overlays/MobileNavDrawer.css +28 -0
  279. package/templates/nova/src/components/overlays/MobileNavDrawer.tsx +166 -0
  280. package/templates/nova/src/components/overlays/Modal.css +52 -0
  281. package/templates/nova/src/components/overlays/Modal.tsx +88 -0
  282. package/templates/nova/src/components/overlays/Popover.css +4 -0
  283. package/templates/nova/src/components/overlays/Popover.tsx +115 -0
  284. package/templates/nova/src/components/overlays/ProductLightbox.css +20 -0
  285. package/templates/nova/src/components/overlays/ProductLightbox.tsx +70 -0
  286. package/templates/nova/src/components/overlays/PromoPopup.css +32 -0
  287. package/templates/nova/src/components/overlays/PromoPopup.tsx +198 -0
  288. package/templates/nova/src/components/overlays/QuickView.css +31 -0
  289. package/templates/nova/src/components/overlays/QuickView.tsx +127 -0
  290. package/templates/nova/src/components/overlays/ReferralPanel.css +16 -0
  291. package/templates/nova/src/components/overlays/ReferralPanel.tsx +138 -0
  292. package/templates/nova/src/components/overlays/RewardsLauncher.css +22 -0
  293. package/templates/nova/src/components/overlays/RewardsLauncher.tsx +270 -0
  294. package/templates/nova/src/components/overlays/SearchModal.css +48 -0
  295. package/templates/nova/src/components/overlays/SearchModal.tsx +302 -0
  296. package/templates/nova/src/components/overlays/Sheet.css +16 -0
  297. package/templates/nova/src/components/overlays/Sheet.tsx +48 -0
  298. package/templates/nova/src/components/overlays/SizeGuide.css +8 -0
  299. package/templates/nova/src/components/overlays/SizeGuide.tsx +74 -0
  300. package/templates/nova/src/components/overlays/Toast.css +20 -0
  301. package/templates/nova/src/components/overlays/Toast.tsx +164 -0
  302. package/templates/nova/src/components/overlays/Tooltip.css +6 -0
  303. package/templates/nova/src/components/overlays/Tooltip.tsx +59 -0
  304. package/templates/nova/src/components/overlays/use-dialog.ts +74 -0
  305. package/templates/nova/src/components/section/shared.css +42 -0
  306. package/templates/nova/src/components/section/shared.ts +120 -0
  307. package/templates/nova/src/components/section/shell.tsx +29 -0
  308. package/templates/nova/src/components/states/Alert.css +10 -0
  309. package/templates/nova/src/components/states/Alert.tsx +50 -0
  310. package/templates/nova/src/components/states/EditorFrame.css +31 -0
  311. package/templates/nova/src/components/states/EditorFrame.tsx +43 -0
  312. package/templates/nova/src/components/states/MediaState.css +1 -0
  313. package/templates/nova/src/components/states/MediaState.tsx +49 -0
  314. package/templates/nova/src/components/states/OfflineNotice.css +4 -0
  315. package/templates/nova/src/components/states/OfflineNotice.tsx +24 -0
  316. package/templates/nova/src/components/states/SkeletonLayout.css +22 -0
  317. package/templates/nova/src/components/states/SkeletonLayout.tsx +104 -0
  318. package/templates/nova/src/components/states/StateBlock.css +22 -0
  319. package/templates/nova/src/components/states/StateBlock.tsx +39 -0
  320. package/templates/nova/src/components/states/media/MediaError.css +6 -0
  321. package/templates/nova/src/components/states/media/MediaError.tsx +49 -0
  322. package/templates/nova/src/components/states/media/MediaPlaceholder.css +24 -0
  323. package/templates/nova/src/components/states/media/MediaPlaceholder.tsx +101 -0
  324. package/templates/nova/src/components/states/media/placeholder-art.ts +142 -0
  325. package/templates/nova/src/layouts/Main.tsx +80 -0
  326. package/templates/nova/src/sections/Account/Account.tsx +109 -0
  327. package/templates/nova/src/sections/Account/index.ts +22 -0
  328. package/templates/nova/src/sections/Account/presets.ts +6 -0
  329. package/templates/nova/src/sections/Account/schema.ts +29 -0
  330. package/templates/nova/src/sections/AnnouncementBar/AnnouncementBar.css +37 -0
  331. package/templates/nova/src/sections/AnnouncementBar/AnnouncementBar.tsx +151 -0
  332. package/templates/nova/src/sections/AnnouncementBar/index.ts +20 -0
  333. package/templates/nova/src/sections/AnnouncementBar/presets.ts +10 -0
  334. package/templates/nova/src/sections/AnnouncementBar/schema.ts +26 -0
  335. package/templates/nova/src/sections/ArticleBody/ArticleBody.tsx +129 -0
  336. package/templates/nova/src/sections/ArticleBody/index.ts +21 -0
  337. package/templates/nova/src/sections/ArticleBody/presets.ts +10 -0
  338. package/templates/nova/src/sections/ArticleBody/schema.ts +40 -0
  339. package/templates/nova/src/sections/BeforeAfter/BeforeAfter.tsx +47 -0
  340. package/templates/nova/src/sections/BeforeAfter/blocks/Comparison.tsx +20 -0
  341. package/templates/nova/src/sections/BeforeAfter/index.ts +28 -0
  342. package/templates/nova/src/sections/BeforeAfter/presets.ts +10 -0
  343. package/templates/nova/src/sections/BeforeAfter/schema.ts +34 -0
  344. package/templates/nova/src/sections/BlogPosts/BlogPosts.tsx +106 -0
  345. package/templates/nova/src/sections/BlogPosts/index.ts +30 -0
  346. package/templates/nova/src/sections/BlogPosts/presets.ts +10 -0
  347. package/templates/nova/src/sections/BlogPosts/schema.ts +42 -0
  348. package/templates/nova/src/sections/Breadcrumbs/Breadcrumbs.css +10 -0
  349. package/templates/nova/src/sections/Breadcrumbs/Breadcrumbs.tsx +41 -0
  350. package/templates/nova/src/sections/Breadcrumbs/index.ts +20 -0
  351. package/templates/nova/src/sections/Breadcrumbs/presets.ts +6 -0
  352. package/templates/nova/src/sections/Breadcrumbs/schema.ts +24 -0
  353. package/templates/nova/src/sections/CartItems/CartItems.tsx +170 -0
  354. package/templates/nova/src/sections/CartItems/blocks/CartBadge.tsx +14 -0
  355. package/templates/nova/src/sections/CartItems/index.ts +37 -0
  356. package/templates/nova/src/sections/CartItems/presets.ts +8 -0
  357. package/templates/nova/src/sections/CartItems/schema.ts +34 -0
  358. package/templates/nova/src/sections/CollectionBanner/CollectionBanner.tsx +120 -0
  359. package/templates/nova/src/sections/CollectionBanner/index.ts +25 -0
  360. package/templates/nova/src/sections/CollectionBanner/presets.ts +10 -0
  361. package/templates/nova/src/sections/CollectionBanner/schema.ts +37 -0
  362. package/templates/nova/src/sections/CollectionLinks/CollectionLinks.tsx +47 -0
  363. package/templates/nova/src/sections/CollectionLinks/index.ts +20 -0
  364. package/templates/nova/src/sections/CollectionLinks/presets.ts +8 -0
  365. package/templates/nova/src/sections/CollectionLinks/schema.ts +33 -0
  366. package/templates/nova/src/sections/CollectionList/CollectionList.tsx +89 -0
  367. package/templates/nova/src/sections/CollectionList/blocks/CollectionItem.tsx +25 -0
  368. package/templates/nova/src/sections/CollectionList/index.ts +33 -0
  369. package/templates/nova/src/sections/CollectionList/presets.ts +10 -0
  370. package/templates/nova/src/sections/CollectionList/schema.ts +41 -0
  371. package/templates/nova/src/sections/ComparisonTable/ComparisonTable.tsx +52 -0
  372. package/templates/nova/src/sections/ComparisonTable/blocks/CompareItem.tsx +26 -0
  373. package/templates/nova/src/sections/ComparisonTable/index.ts +31 -0
  374. package/templates/nova/src/sections/ComparisonTable/presets.ts +8 -0
  375. package/templates/nova/src/sections/ComparisonTable/schema.ts +31 -0
  376. package/templates/nova/src/sections/ContactForm/ContactForm.tsx +83 -0
  377. package/templates/nova/src/sections/ContactForm/blocks/ContactDetail.tsx +13 -0
  378. package/templates/nova/src/sections/ContactForm/index.ts +29 -0
  379. package/templates/nova/src/sections/ContactForm/presets.ts +8 -0
  380. package/templates/nova/src/sections/ContactForm/schema.ts +34 -0
  381. package/templates/nova/src/sections/Divider/Divider.css +17 -0
  382. package/templates/nova/src/sections/Divider/Divider.tsx +21 -0
  383. package/templates/nova/src/sections/Divider/index.ts +20 -0
  384. package/templates/nova/src/sections/Divider/presets.ts +10 -0
  385. package/templates/nova/src/sections/Divider/schema.ts +24 -0
  386. package/templates/nova/src/sections/Faq/Faq.tsx +51 -0
  387. package/templates/nova/src/sections/Faq/blocks/FaqItem.tsx +13 -0
  388. package/templates/nova/src/sections/Faq/index.ts +28 -0
  389. package/templates/nova/src/sections/Faq/presets.ts +8 -0
  390. package/templates/nova/src/sections/Faq/schema.ts +32 -0
  391. package/templates/nova/src/sections/FeatureGridBlocks/FeatureGridBlocks.tsx +90 -0
  392. package/templates/nova/src/sections/FeatureGridBlocks/index.ts +35 -0
  393. package/templates/nova/src/sections/FeatureGridBlocks/presets.ts +8 -0
  394. package/templates/nova/src/sections/FeatureGridBlocks/schema.ts +35 -0
  395. package/templates/nova/src/sections/FeatureHighlights/FeatureHighlights.tsx +56 -0
  396. package/templates/nova/src/sections/FeatureHighlights/index.ts +20 -0
  397. package/templates/nova/src/sections/FeatureHighlights/presets.ts +6 -0
  398. package/templates/nova/src/sections/FeatureHighlights/schema.ts +27 -0
  399. package/templates/nova/src/sections/FeaturedCollection/FeaturedCollection.tsx +67 -0
  400. package/templates/nova/src/sections/FeaturedCollection/index.ts +21 -0
  401. package/templates/nova/src/sections/FeaturedCollection/presets.ts +10 -0
  402. package/templates/nova/src/sections/FeaturedCollection/schema.ts +39 -0
  403. package/templates/nova/src/sections/FeaturedProduct/FeaturedProduct.tsx +107 -0
  404. package/templates/nova/src/sections/FeaturedProduct/index.ts +23 -0
  405. package/templates/nova/src/sections/FeaturedProduct/presets.ts +8 -0
  406. package/templates/nova/src/sections/FeaturedProduct/schema.ts +35 -0
  407. package/templates/nova/src/sections/Footer/Footer.css +81 -0
  408. package/templates/nova/src/sections/Footer/Footer.tsx +256 -0
  409. package/templates/nova/src/sections/Footer/blocks/FooterBrand.tsx +40 -0
  410. package/templates/nova/src/sections/Footer/blocks/FooterLine.tsx +11 -0
  411. package/templates/nova/src/sections/Footer/blocks/FooterMenu.tsx +14 -0
  412. package/templates/nova/src/sections/Footer/blocks/FooterText.tsx +8 -0
  413. package/templates/nova/src/sections/Footer/blocks/footer.css +7 -0
  414. package/templates/nova/src/sections/Footer/index.ts +38 -0
  415. package/templates/nova/src/sections/Footer/presets.ts +10 -0
  416. package/templates/nova/src/sections/Footer/schema.ts +27 -0
  417. package/templates/nova/src/sections/Group/Group.css +59 -0
  418. package/templates/nova/src/sections/Group/Group.tsx +167 -0
  419. package/templates/nova/src/sections/Group/blocks/Accordion.tsx +26 -0
  420. package/templates/nova/src/sections/Group/blocks/JumboText.tsx +20 -0
  421. package/templates/nova/src/sections/Group/blocks/Spacer.tsx +16 -0
  422. package/templates/nova/src/sections/Group/index.ts +36 -0
  423. package/templates/nova/src/sections/Group/presets.ts +12 -0
  424. package/templates/nova/src/sections/Group/schema.ts +35 -0
  425. package/templates/nova/src/sections/Header/Header.css +185 -0
  426. package/templates/nova/src/sections/Header/Header.tsx +478 -0
  427. package/templates/nova/src/sections/Header/index.ts +32 -0
  428. package/templates/nova/src/sections/Header/presets.ts +10 -0
  429. package/templates/nova/src/sections/Header/schema.ts +32 -0
  430. package/templates/nova/src/sections/Hero/Hero.tsx +128 -0
  431. package/templates/nova/src/sections/Hero/index.ts +24 -0
  432. package/templates/nova/src/sections/Hero/presets.ts +16 -0
  433. package/templates/nova/src/sections/Hero/schema.ts +56 -0
  434. package/templates/nova/src/sections/ImageGallery/ImageGallery.tsx +86 -0
  435. package/templates/nova/src/sections/ImageGallery/index.ts +28 -0
  436. package/templates/nova/src/sections/ImageGallery/presets.ts +10 -0
  437. package/templates/nova/src/sections/ImageGallery/schema.ts +34 -0
  438. package/templates/nova/src/sections/ImageWithText/ImageWithText.tsx +62 -0
  439. package/templates/nova/src/sections/ImageWithText/index.ts +23 -0
  440. package/templates/nova/src/sections/ImageWithText/presets.ts +12 -0
  441. package/templates/nova/src/sections/ImageWithText/schema.ts +45 -0
  442. package/templates/nova/src/sections/LineAddFriend/LineAddFriend.tsx +25 -0
  443. package/templates/nova/src/sections/LineAddFriend/index.ts +20 -0
  444. package/templates/nova/src/sections/LineAddFriend/presets.ts +3 -0
  445. package/templates/nova/src/sections/LineAddFriend/schema.ts +25 -0
  446. package/templates/nova/src/sections/LogoList/LogoList.tsx +40 -0
  447. package/templates/nova/src/sections/LogoList/blocks/Logo.tsx +18 -0
  448. package/templates/nova/src/sections/LogoList/index.ts +29 -0
  449. package/templates/nova/src/sections/LogoList/presets.ts +8 -0
  450. package/templates/nova/src/sections/LogoList/schema.ts +29 -0
  451. package/templates/nova/src/sections/MainCollection/MainCollection.tsx +51 -0
  452. package/templates/nova/src/sections/MainCollection/index.ts +26 -0
  453. package/templates/nova/src/sections/MainCollection/presets.ts +10 -0
  454. package/templates/nova/src/sections/MainCollection/schema.ts +29 -0
  455. package/templates/nova/src/sections/Marquee/Marquee.tsx +114 -0
  456. package/templates/nova/src/sections/Marquee/index.ts +20 -0
  457. package/templates/nova/src/sections/Marquee/presets.ts +10 -0
  458. package/templates/nova/src/sections/Marquee/schema.ts +23 -0
  459. package/templates/nova/src/sections/Multicolumn/Multicolumn.tsx +56 -0
  460. package/templates/nova/src/sections/Multicolumn/index.ts +25 -0
  461. package/templates/nova/src/sections/Multicolumn/presets.ts +8 -0
  462. package/templates/nova/src/sections/Multicolumn/schema.ts +34 -0
  463. package/templates/nova/src/sections/Newsletter/Newsletter.tsx +64 -0
  464. package/templates/nova/src/sections/Newsletter/index.ts +20 -0
  465. package/templates/nova/src/sections/Newsletter/presets.ts +10 -0
  466. package/templates/nova/src/sections/Newsletter/schema.ts +36 -0
  467. package/templates/nova/src/sections/NotFound/NotFound.tsx +41 -0
  468. package/templates/nova/src/sections/NotFound/index.ts +20 -0
  469. package/templates/nova/src/sections/NotFound/presets.ts +6 -0
  470. package/templates/nova/src/sections/NotFound/schema.ts +30 -0
  471. package/templates/nova/src/sections/PageBody/PageBody.tsx +35 -0
  472. package/templates/nova/src/sections/PageBody/index.ts +21 -0
  473. package/templates/nova/src/sections/PageBody/presets.ts +6 -0
  474. package/templates/nova/src/sections/PageBody/schema.ts +29 -0
  475. package/templates/nova/src/sections/PolicyPage/PolicyPage.tsx +62 -0
  476. package/templates/nova/src/sections/PolicyPage/index.ts +23 -0
  477. package/templates/nova/src/sections/PolicyPage/presets.ts +6 -0
  478. package/templates/nova/src/sections/PolicyPage/schema.ts +27 -0
  479. package/templates/nova/src/sections/ProductDetails/ProductDetails.tsx +269 -0
  480. package/templates/nova/src/sections/ProductDetails/blocks/AddToCartBlock.tsx +15 -0
  481. package/templates/nova/src/sections/ProductDetails/blocks/ProductDescription.tsx +15 -0
  482. package/templates/nova/src/sections/ProductDetails/blocks/ProductInventory.tsx +38 -0
  483. package/templates/nova/src/sections/ProductDetails/blocks/ProductPrice.tsx +19 -0
  484. package/templates/nova/src/sections/ProductDetails/blocks/ProductSku.tsx +15 -0
  485. package/templates/nova/src/sections/ProductDetails/blocks/ProductTitle.tsx +17 -0
  486. package/templates/nova/src/sections/ProductDetails/blocks/Quantity.tsx +14 -0
  487. package/templates/nova/src/sections/ProductDetails/blocks/Tab.tsx +23 -0
  488. package/templates/nova/src/sections/ProductDetails/blocks/VariantPickerBlock.tsx +44 -0
  489. package/templates/nova/src/sections/ProductDetails/blocks/commerce-blocks.css +13 -0
  490. package/templates/nova/src/sections/ProductDetails/index.ts +44 -0
  491. package/templates/nova/src/sections/ProductDetails/presets.ts +10 -0
  492. package/templates/nova/src/sections/ProductDetails/schema.ts +44 -0
  493. package/templates/nova/src/sections/ProductGrid/ProductGrid.tsx +38 -0
  494. package/templates/nova/src/sections/ProductGrid/index.ts +25 -0
  495. package/templates/nova/src/sections/ProductGrid/presets.ts +6 -0
  496. package/templates/nova/src/sections/ProductGrid/schema.ts +37 -0
  497. package/templates/nova/src/sections/ProductRecommendations/ProductRecommendations.tsx +45 -0
  498. package/templates/nova/src/sections/ProductRecommendations/index.ts +20 -0
  499. package/templates/nova/src/sections/ProductRecommendations/presets.ts +8 -0
  500. package/templates/nova/src/sections/ProductRecommendations/schema.ts +28 -0
  501. package/templates/nova/src/sections/ProductReviews/ProductReviews.tsx +136 -0
  502. package/templates/nova/src/sections/ProductReviews/index.ts +22 -0
  503. package/templates/nova/src/sections/ProductReviews/presets.ts +6 -0
  504. package/templates/nova/src/sections/ProductReviews/schema.ts +31 -0
  505. package/templates/nova/src/sections/PromoBanner/PromoBanner.tsx +78 -0
  506. package/templates/nova/src/sections/PromoBanner/index.ts +20 -0
  507. package/templates/nova/src/sections/PromoBanner/presets.ts +10 -0
  508. package/templates/nova/src/sections/PromoBanner/schema.ts +38 -0
  509. package/templates/nova/src/sections/RecentlyViewed/RecentlyViewed.tsx +53 -0
  510. package/templates/nova/src/sections/RecentlyViewed/index.ts +20 -0
  511. package/templates/nova/src/sections/RecentlyViewed/presets.ts +6 -0
  512. package/templates/nova/src/sections/RecentlyViewed/schema.ts +26 -0
  513. package/templates/nova/src/sections/RichText/RichText.tsx +38 -0
  514. package/templates/nova/src/sections/RichText/index.ts +20 -0
  515. package/templates/nova/src/sections/RichText/presets.ts +10 -0
  516. package/templates/nova/src/sections/RichText/schema.ts +37 -0
  517. package/templates/nova/src/sections/SearchResults/SearchResults.tsx +112 -0
  518. package/templates/nova/src/sections/SearchResults/index.ts +26 -0
  519. package/templates/nova/src/sections/SearchResults/presets.ts +8 -0
  520. package/templates/nova/src/sections/SearchResults/schema.ts +30 -0
  521. package/templates/nova/src/sections/ShopTheLook/ShopTheLook.tsx +112 -0
  522. package/templates/nova/src/sections/ShopTheLook/blocks/Hotspot.tsx +22 -0
  523. package/templates/nova/src/sections/ShopTheLook/index.ts +33 -0
  524. package/templates/nova/src/sections/ShopTheLook/presets.ts +8 -0
  525. package/templates/nova/src/sections/ShopTheLook/schema.ts +31 -0
  526. package/templates/nova/src/sections/Slideshow/Slideshow.tsx +199 -0
  527. package/templates/nova/src/sections/Slideshow/blocks/Slide.tsx +93 -0
  528. package/templates/nova/src/sections/Slideshow/index.ts +30 -0
  529. package/templates/nova/src/sections/Slideshow/presets.ts +10 -0
  530. package/templates/nova/src/sections/Slideshow/schema.ts +36 -0
  531. package/templates/nova/src/sections/StoreLocator/StoreLocator.tsx +66 -0
  532. package/templates/nova/src/sections/StoreLocator/index.ts +20 -0
  533. package/templates/nova/src/sections/StoreLocator/presets.ts +6 -0
  534. package/templates/nova/src/sections/StoreLocator/schema.ts +34 -0
  535. package/templates/nova/src/sections/TeamFounders/TeamFounders.tsx +74 -0
  536. package/templates/nova/src/sections/TeamFounders/blocks/Person.tsx +28 -0
  537. package/templates/nova/src/sections/TeamFounders/index.ts +28 -0
  538. package/templates/nova/src/sections/TeamFounders/presets.ts +10 -0
  539. package/templates/nova/src/sections/TeamFounders/schema.ts +36 -0
  540. package/templates/nova/src/sections/Testimonials/Testimonials.tsx +83 -0
  541. package/templates/nova/src/sections/Testimonials/blocks/Testimonial.tsx +30 -0
  542. package/templates/nova/src/sections/Testimonials/index.ts +29 -0
  543. package/templates/nova/src/sections/Testimonials/presets.ts +10 -0
  544. package/templates/nova/src/sections/Testimonials/schema.ts +35 -0
  545. package/templates/nova/src/sections/Timeline/Timeline.tsx +43 -0
  546. package/templates/nova/src/sections/Timeline/blocks/Step.tsx +19 -0
  547. package/templates/nova/src/sections/Timeline/index.ts +28 -0
  548. package/templates/nova/src/sections/Timeline/presets.ts +8 -0
  549. package/templates/nova/src/sections/Timeline/schema.ts +31 -0
  550. package/templates/nova/src/sections/TrustBadges/TrustBadges.tsx +42 -0
  551. package/templates/nova/src/sections/TrustBadges/index.ts +29 -0
  552. package/templates/nova/src/sections/TrustBadges/presets.ts +8 -0
  553. package/templates/nova/src/sections/TrustBadges/schema.ts +29 -0
  554. package/templates/nova/src/sections/UgcGallery/UgcGallery.tsx +58 -0
  555. package/templates/nova/src/sections/UgcGallery/blocks/UgcImage.tsx +27 -0
  556. package/templates/nova/src/sections/UgcGallery/index.ts +31 -0
  557. package/templates/nova/src/sections/UgcGallery/presets.ts +8 -0
  558. package/templates/nova/src/sections/UgcGallery/schema.ts +35 -0
  559. package/templates/nova/src/sections/VideoHero/VideoHero.tsx +75 -0
  560. package/templates/nova/src/sections/VideoHero/index.ts +22 -0
  561. package/templates/nova/src/sections/VideoHero/presets.ts +8 -0
  562. package/templates/nova/src/sections/VideoHero/schema.ts +43 -0
  563. package/templates/nova/src/sections/data.ts +115 -0
  564. package/templates/nova/src/sections/shipped-copy.ts +25 -0
  565. package/templates/nova/src/sections/starter.ts +49 -0
  566. package/templates/nova/src/styles/Container.css +6 -0
  567. package/templates/nova/src/styles/Container.tsx +13 -0
  568. package/templates/nova/src/styles/Icon.css +2 -0
  569. package/templates/nova/src/styles/Icon.tsx +101 -0
  570. package/templates/nova/src/styles/NovaProvider.tsx +91 -0
  571. package/templates/nova/src/styles/base.css +142 -0
  572. package/templates/nova/src/styles/blocks.css +6 -0
  573. package/templates/nova/src/styles/fonts/OFL.txt +93 -0
  574. package/templates/nova/src/styles/fonts/geist-cyrillic-ext.woff2 +0 -0
  575. package/templates/nova/src/styles/fonts/geist-cyrillic.woff2 +0 -0
  576. package/templates/nova/src/styles/fonts/geist-latin-ext.woff2 +0 -0
  577. package/templates/nova/src/styles/fonts/geist-latin.woff2 +0 -0
  578. package/templates/nova/src/styles/fonts/geist-mono-cyrillic-ext.woff2 +0 -0
  579. package/templates/nova/src/styles/fonts/geist-mono-cyrillic.woff2 +0 -0
  580. package/templates/nova/src/styles/fonts/geist-mono-latin-ext.woff2 +0 -0
  581. package/templates/nova/src/styles/fonts/geist-mono-latin.woff2 +0 -0
  582. package/templates/nova/src/styles/fonts/geist-mono-vietnamese.woff2 +0 -0
  583. package/templates/nova/src/styles/fonts/geist-vietnamese.woff2 +0 -0
  584. package/templates/nova/src/styles/fonts.css +95 -0
  585. package/templates/nova/src/styles/global-settings.css +88 -0
  586. package/templates/nova/src/styles/index.css +6 -0
  587. package/templates/nova/src/styles/motion.ts +53 -0
  588. package/templates/nova/src/styles/scroll.ts +24 -0
  589. package/templates/nova/src/styles/sections/commerce.css +147 -0
  590. package/templates/nova/src/styles/sections/content.css +304 -0
  591. package/templates/nova/src/styles/sections/editorial.css +131 -0
  592. package/templates/nova/src/styles/sections/promotion.css +336 -0
  593. package/templates/nova/src/styles/sections/trust.css +117 -0
  594. package/templates/nova/src/styles/sections/utility.css +190 -0
  595. package/templates/nova/src/styles/strings.ts +492 -0
  596. package/templates/nova/src/styles/text.ts +4 -0
  597. package/templates/nova/src/styles/theme.ts +171 -0
  598. package/templates/nova/src/styles/tokens.css +600 -0
  599. package/templates/nova/src/styles/viewport.ts +23 -0
  600. package/templates/nova/template.json +94 -0
  601. package/templates/nova/templates/404.json +30 -0
  602. package/templates/nova/templates/account.json +15 -0
  603. package/templates/nova/templates/article.json +41 -0
  604. package/templates/nova/templates/article.longform.json +17 -0
  605. package/templates/nova/templates/blog.featured.json +22 -0
  606. package/templates/nova/templates/blog.json +29 -0
  607. package/templates/nova/templates/cart.json +67 -0
  608. package/templates/nova/templates/collection.featured.json +43 -0
  609. package/templates/nova/templates/collection.json +30 -0
  610. package/templates/nova/templates/contact.json +65 -0
  611. package/templates/nova/templates/index.json +167 -0
  612. package/templates/nova/templates/list-collections.json +19 -0
  613. package/templates/nova/templates/page.about.json +134 -0
  614. package/templates/nova/templates/page.contact.json +27 -0
  615. package/templates/nova/templates/page.json +27 -0
  616. package/templates/nova/templates/policy.json +23 -0
  617. package/templates/nova/templates/product.bundle.json +145 -0
  618. package/templates/nova/templates/product.json +119 -0
  619. package/templates/nova/templates/search.json +17 -0
  620. package/templates/nova/tests/abi-ai-contract.test.ts +99 -0
  621. package/templates/nova/tests/abi-forms.test.tsx +269 -0
  622. package/templates/nova/tests/abi-inventory.test.tsx +197 -0
  623. package/templates/nova/tests/abi-legacy-settings.test.tsx +105 -0
  624. package/templates/nova/tests/abi-opt-in.test.tsx +100 -0
  625. package/templates/nova/tests/abi-parity.test.tsx +95 -0
  626. package/templates/nova/tests/abi-r5-store-settings.test.tsx +337 -0
  627. package/templates/nova/tests/abi-render.test.tsx +178 -0
  628. package/templates/nova/tests/abi-shop-links.test.tsx +141 -0
  629. package/templates/nova/tests/abi-storefront-basics.test.tsx +233 -0
  630. package/templates/nova/tests/abi-variant-url.test.tsx +73 -0
  631. package/templates/nova/tests/add-refused-no-success.test.tsx +193 -0
  632. package/templates/nova/tests/architecture.test.ts +63 -0
  633. package/templates/nova/tests/architecture.ts +160 -0
  634. package/templates/nova/tests/audit-guards.test.ts +31 -0
  635. package/templates/nova/tests/bundle-split.test.ts +29 -0
  636. package/templates/nova/tests/cart-limit-message.test.tsx +212 -0
  637. package/templates/nova/tests/cart-link-message.test.tsx +98 -0
  638. package/templates/nova/tests/cases/components/Overview.cases.tsx +8 -0
  639. package/templates/nova/tests/cases/components/base/Accordion.cases.tsx +40 -0
  640. package/templates/nova/tests/cases/components/base/Badge.cases.tsx +30 -0
  641. package/templates/nova/tests/cases/components/base/Button.cases.tsx +73 -0
  642. package/templates/nova/tests/cases/components/base/Checkbox.cases.tsx +27 -0
  643. package/templates/nova/tests/cases/components/base/Chip.cases.tsx +37 -0
  644. package/templates/nova/tests/cases/components/base/Divider.cases.tsx +26 -0
  645. package/templates/nova/tests/cases/components/base/IconButton.cases.tsx +28 -0
  646. package/templates/nova/tests/cases/components/base/Input.cases.tsx +28 -0
  647. package/templates/nova/tests/cases/components/base/Link.cases.tsx +27 -0
  648. package/templates/nova/tests/cases/components/base/Radio.cases.tsx +27 -0
  649. package/templates/nova/tests/cases/components/base/Select.cases.tsx +26 -0
  650. package/templates/nova/tests/cases/components/base/Skeleton.cases.tsx +29 -0
  651. package/templates/nova/tests/cases/components/base/Spinner.cases.tsx +16 -0
  652. package/templates/nova/tests/cases/components/base/Switch.cases.tsx +26 -0
  653. package/templates/nova/tests/cases/components/base/Tabs.cases.tsx +39 -0
  654. package/templates/nova/tests/cases/components/base/Textarea.cases.tsx +17 -0
  655. package/templates/nova/tests/cases/components/commerce/AddToCart.cases.tsx +36 -0
  656. package/templates/nova/tests/cases/components/commerce/CartLine.cases.tsx +20 -0
  657. package/templates/nova/tests/cases/components/commerce/CartSummary.cases.tsx +16 -0
  658. package/templates/nova/tests/cases/components/commerce/CollectionCard.cases.tsx +19 -0
  659. package/templates/nova/tests/cases/components/commerce/ComparisonTable.cases.tsx +19 -0
  660. package/templates/nova/tests/cases/components/commerce/Hotspot.cases.tsx +25 -0
  661. package/templates/nova/tests/cases/components/commerce/LookItem.cases.tsx +19 -0
  662. package/templates/nova/tests/cases/components/commerce/PaymentMark.cases.tsx +16 -0
  663. package/templates/nova/tests/cases/components/commerce/Price.cases.tsx +27 -0
  664. package/templates/nova/tests/cases/components/commerce/ProductCard.cases.tsx +67 -0
  665. package/templates/nova/tests/cases/components/commerce/ProductGallery.cases.tsx +39 -0
  666. package/templates/nova/tests/cases/components/commerce/QuantitySelector.cases.tsx +31 -0
  667. package/templates/nova/tests/cases/components/commerce/Reviews.cases.tsx +35 -0
  668. package/templates/nova/tests/cases/components/commerce/Stars.cases.tsx +16 -0
  669. package/templates/nova/tests/cases/components/commerce/VariantPicker.cases.tsx +38 -0
  670. package/templates/nova/tests/cases/components/commerce/blocks/Badge.cases.tsx +17 -0
  671. package/templates/nova/tests/cases/components/commerce/blocks/PaymentIcons.cases.tsx +17 -0
  672. package/templates/nova/tests/cases/components/commerce/blocks/Swatches.cases.tsx +22 -0
  673. package/templates/nova/tests/cases/components/content/ArticleCard.cases.tsx +17 -0
  674. package/templates/nova/tests/cases/components/content/BeforeAfterSlider.cases.tsx +18 -0
  675. package/templates/nova/tests/cases/components/content/CardRow.cases.tsx +23 -0
  676. package/templates/nova/tests/cases/components/content/CarouselControls.cases.tsx +48 -0
  677. package/templates/nova/tests/cases/components/content/ContentsNav.cases.tsx +17 -0
  678. package/templates/nova/tests/cases/components/content/Countdown.cases.tsx +28 -0
  679. package/templates/nova/tests/cases/components/content/HeroCopy.cases.tsx +42 -0
  680. package/templates/nova/tests/cases/components/content/HeroFrame.cases.tsx +22 -0
  681. package/templates/nova/tests/cases/components/content/HeroMedia.cases.tsx +18 -0
  682. package/templates/nova/tests/cases/components/content/LongForm.cases.tsx +17 -0
  683. package/templates/nova/tests/cases/components/content/MediaFrame.cases.tsx +32 -0
  684. package/templates/nova/tests/cases/components/content/RichText.cases.tsx +19 -0
  685. package/templates/nova/tests/cases/components/content/SectionHead.cases.tsx +19 -0
  686. package/templates/nova/tests/cases/components/content/ShareButtons.cases.tsx +24 -0
  687. package/templates/nova/tests/cases/components/content/StoreCard.cases.tsx +17 -0
  688. package/templates/nova/tests/cases/components/content/TestimonialCard.cases.tsx +19 -0
  689. package/templates/nova/tests/cases/components/content/UgcTile.cases.tsx +18 -0
  690. package/templates/nova/tests/cases/components/content/blocks/Button.cases.tsx +20 -0
  691. package/templates/nova/tests/cases/components/content/blocks/Column.cases.tsx +17 -0
  692. package/templates/nova/tests/cases/components/content/blocks/Heading.cases.tsx +18 -0
  693. package/templates/nova/tests/cases/components/content/blocks/Icon.cases.tsx +17 -0
  694. package/templates/nova/tests/cases/components/content/blocks/Image.cases.tsx +22 -0
  695. package/templates/nova/tests/cases/components/content/blocks/Text.cases.tsx +18 -0
  696. package/templates/nova/tests/cases/components/content/blocks/Video.cases.tsx +18 -0
  697. package/templates/nova/tests/cases/components/forms/ContactForm.cases.tsx +29 -0
  698. package/templates/nova/tests/cases/components/forms/FormField.cases.tsx +61 -0
  699. package/templates/nova/tests/cases/components/forms/NewsletterForm.cases.tsx +17 -0
  700. package/templates/nova/tests/cases/components/forms/SearchField.cases.tsx +25 -0
  701. package/templates/nova/tests/cases/components/forms/blocks/Newsletter.cases.tsx +19 -0
  702. package/templates/nova/tests/cases/components/navigation/BrandLogo.cases.tsx +29 -0
  703. package/templates/nova/tests/cases/components/navigation/Breadcrumb.cases.tsx +19 -0
  704. package/templates/nova/tests/cases/components/navigation/LocaleSelector.cases.tsx +32 -0
  705. package/templates/nova/tests/cases/components/navigation/Menu.cases.tsx +27 -0
  706. package/templates/nova/tests/cases/components/navigation/Pagination.cases.tsx +25 -0
  707. package/templates/nova/tests/cases/components/navigation/RecoveryLinks.cases.tsx +16 -0
  708. package/templates/nova/tests/cases/components/navigation/SocialLinks.cases.tsx +18 -0
  709. package/templates/nova/tests/cases/components/navigation/blocks/SocialLinks.cases.tsx +17 -0
  710. package/templates/nova/tests/cases/components/overlays/AccountMenu.cases.tsx +28 -0
  711. package/templates/nova/tests/cases/components/overlays/CartDrawer.cases.tsx +30 -0
  712. package/templates/nova/tests/cases/components/overlays/ConfirmationDialog.cases.tsx +16 -0
  713. package/templates/nova/tests/cases/components/overlays/CookieConsent.cases.tsx +23 -0
  714. package/templates/nova/tests/cases/components/overlays/CookiePreferences.cases.tsx +16 -0
  715. package/templates/nova/tests/cases/components/overlays/Drawer.cases.tsx +52 -0
  716. package/templates/nova/tests/cases/components/overlays/MarketSelector.cases.tsx +82 -0
  717. package/templates/nova/tests/cases/components/overlays/Menu.cases.tsx +27 -0
  718. package/templates/nova/tests/cases/components/overlays/MobileNavDrawer.cases.tsx +32 -0
  719. package/templates/nova/tests/cases/components/overlays/Modal.cases.tsx +71 -0
  720. package/templates/nova/tests/cases/components/overlays/Popover.cases.tsx +50 -0
  721. package/templates/nova/tests/cases/components/overlays/PromoPopup.cases.tsx +19 -0
  722. package/templates/nova/tests/cases/components/overlays/QuickView.cases.tsx +18 -0
  723. package/templates/nova/tests/cases/components/overlays/SearchModal.cases.tsx +60 -0
  724. package/templates/nova/tests/cases/components/overlays/Sheet.cases.tsx +32 -0
  725. package/templates/nova/tests/cases/components/overlays/SizeGuide.cases.tsx +27 -0
  726. package/templates/nova/tests/cases/components/overlays/Toast.cases.tsx +48 -0
  727. package/templates/nova/tests/cases/components/overlays/Tooltip.cases.tsx +33 -0
  728. package/templates/nova/tests/cases/components/states/Alert.cases.tsx +27 -0
  729. package/templates/nova/tests/cases/components/states/EditorFrame.cases.tsx +36 -0
  730. package/templates/nova/tests/cases/components/states/Empty.cases.tsx +30 -0
  731. package/templates/nova/tests/cases/components/states/Error.cases.tsx +38 -0
  732. package/templates/nova/tests/cases/components/states/Loading.cases.tsx +15 -0
  733. package/templates/nova/tests/cases/components/states/MediaState.cases.tsx +29 -0
  734. package/templates/nova/tests/cases/components/states/SkeletonLayout.cases.tsx +20 -0
  735. package/templates/nova/tests/cases/components/states/Unavailable.cases.tsx +16 -0
  736. package/templates/nova/tests/cases/components/states/media/MediaError.cases.tsx +18 -0
  737. package/templates/nova/tests/cases/components/states/media/MediaPlaceholder.cases.tsx +87 -0
  738. package/templates/nova/tests/cases/sections/Overview.cases.tsx +8 -0
  739. package/templates/nova/tests/cases/sections/commerce/collection-list/CollectionList.cases.tsx +46 -0
  740. package/templates/nova/tests/cases/sections/commerce/collection-list/blocks/CollectionItem.cases.tsx +18 -0
  741. package/templates/nova/tests/cases/sections/commerce/featured-collection/FeaturedCollection.cases.tsx +46 -0
  742. package/templates/nova/tests/cases/sections/commerce/featured-product/FeaturedProduct.cases.tsx +40 -0
  743. package/templates/nova/tests/cases/sections/commerce/main-collection/MainCollection.cases.tsx +81 -0
  744. package/templates/nova/tests/cases/sections/commerce/product-details/ProductDetails.cases.tsx +110 -0
  745. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/AddToCartBlock.cases.tsx +21 -0
  746. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/ProductDescription.cases.tsx +17 -0
  747. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/ProductInventory.cases.tsx +17 -0
  748. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/ProductPrice.cases.tsx +17 -0
  749. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/ProductSku.cases.tsx +17 -0
  750. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/ProductTitle.cases.tsx +17 -0
  751. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/Quantity.cases.tsx +20 -0
  752. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/Tab.cases.tsx +29 -0
  753. package/templates/nova/tests/cases/sections/commerce/product-details/blocks/VariantPickerBlock.cases.tsx +32 -0
  754. package/templates/nova/tests/cases/sections/commerce/product-grid/ProductGrid.cases.tsx +48 -0
  755. package/templates/nova/tests/cases/sections/commerce/product-recommendations/ProductRecommendations.cases.tsx +27 -0
  756. package/templates/nova/tests/cases/sections/commerce/recently-viewed/RecentlyViewed.cases.tsx +36 -0
  757. package/templates/nova/tests/cases/sections/content/article-body/ArticleBody.cases.tsx +32 -0
  758. package/templates/nova/tests/cases/sections/content/before-after/BeforeAfter.cases.tsx +40 -0
  759. package/templates/nova/tests/cases/sections/content/before-after/blocks/Comparison.cases.tsx +17 -0
  760. package/templates/nova/tests/cases/sections/content/blog-posts/BlogPosts.cases.tsx +47 -0
  761. package/templates/nova/tests/cases/sections/content/collection-links/CollectionLinks.cases.tsx +36 -0
  762. package/templates/nova/tests/cases/sections/content/faq/Faq.cases.tsx +38 -0
  763. package/templates/nova/tests/cases/sections/content/faq/blocks/FaqItem.cases.tsx +17 -0
  764. package/templates/nova/tests/cases/sections/content/feature-grid-blocks/FeatureGridBlocks.cases.tsx +31 -0
  765. package/templates/nova/tests/cases/sections/content/feature-highlights/FeatureHighlights.cases.tsx +26 -0
  766. package/templates/nova/tests/cases/sections/content/image-gallery/ImageGallery.cases.tsx +31 -0
  767. package/templates/nova/tests/cases/sections/content/image-with-text/ImageWithText.cases.tsx +35 -0
  768. package/templates/nova/tests/cases/sections/content/multicolumn/Multicolumn.cases.tsx +32 -0
  769. package/templates/nova/tests/cases/sections/content/page-body/PageBody.cases.tsx +31 -0
  770. package/templates/nova/tests/cases/sections/content/rich-text/RichTextSection.cases.tsx +33 -0
  771. package/templates/nova/tests/cases/sections/content/team-founders/TeamFounders.cases.tsx +31 -0
  772. package/templates/nova/tests/cases/sections/content/team-founders/blocks/Person.cases.tsx +18 -0
  773. package/templates/nova/tests/cases/sections/content/timeline/Timeline.cases.tsx +27 -0
  774. package/templates/nova/tests/cases/sections/content/timeline/blocks/Step.cases.tsx +17 -0
  775. package/templates/nova/tests/cases/sections/layout/announcement-bar/AnnouncementBar.cases.tsx +119 -0
  776. package/templates/nova/tests/cases/sections/layout/breadcrumbs/Breadcrumbs.cases.tsx +73 -0
  777. package/templates/nova/tests/cases/sections/layout/divider/Divider.cases.tsx +81 -0
  778. package/templates/nova/tests/cases/sections/layout/footer/Footer.cases.tsx +116 -0
  779. package/templates/nova/tests/cases/sections/layout/footer/blocks/FooterBrand.cases.tsx +27 -0
  780. package/templates/nova/tests/cases/sections/layout/footer/blocks/FooterMenu.cases.tsx +22 -0
  781. package/templates/nova/tests/cases/sections/layout/footer/blocks/FooterText.cases.tsx +20 -0
  782. package/templates/nova/tests/cases/sections/layout/group/Group.cases.tsx +185 -0
  783. package/templates/nova/tests/cases/sections/layout/group/blocks/Accordion.cases.tsx +17 -0
  784. package/templates/nova/tests/cases/sections/layout/group/blocks/JumboText.cases.tsx +17 -0
  785. package/templates/nova/tests/cases/sections/layout/group/blocks/Spacer.cases.tsx +33 -0
  786. package/templates/nova/tests/cases/sections/layout/header/Header.cases.tsx +277 -0
  787. package/templates/nova/tests/cases/sections/marketing/collection-banner/CollectionBanner.cases.tsx +62 -0
  788. package/templates/nova/tests/cases/sections/marketing/hero/Hero.cases.tsx +138 -0
  789. package/templates/nova/tests/cases/sections/marketing/marquee/Marquee.cases.tsx +63 -0
  790. package/templates/nova/tests/cases/sections/marketing/promo-banner/PromoBanner.cases.tsx +87 -0
  791. package/templates/nova/tests/cases/sections/marketing/slideshow/Slideshow.cases.tsx +113 -0
  792. package/templates/nova/tests/cases/sections/marketing/slideshow/blocks/Slide.cases.tsx +26 -0
  793. package/templates/nova/tests/cases/sections/marketing/video-hero/VideoHero.cases.tsx +72 -0
  794. package/templates/nova/tests/cases/sections/trust/comparison-table/ComparisonTableSection.cases.tsx +42 -0
  795. package/templates/nova/tests/cases/sections/trust/comparison-table/blocks/CompareItem.cases.tsx +17 -0
  796. package/templates/nova/tests/cases/sections/trust/logo-list/LogoList.cases.tsx +29 -0
  797. package/templates/nova/tests/cases/sections/trust/logo-list/blocks/Logo.cases.tsx +17 -0
  798. package/templates/nova/tests/cases/sections/trust/product-reviews/ProductReviews.cases.tsx +51 -0
  799. package/templates/nova/tests/cases/sections/trust/shop-the-look/ShopTheLook.cases.tsx +51 -0
  800. package/templates/nova/tests/cases/sections/trust/shop-the-look/blocks/Hotspot.cases.tsx +17 -0
  801. package/templates/nova/tests/cases/sections/trust/testimonials/Testimonials.cases.tsx +61 -0
  802. package/templates/nova/tests/cases/sections/trust/testimonials/blocks/Testimonial.cases.tsx +17 -0
  803. package/templates/nova/tests/cases/sections/trust/trust-badges/TrustBadges.cases.tsx +30 -0
  804. package/templates/nova/tests/cases/sections/trust/ugc-gallery/UgcGallery.cases.tsx +32 -0
  805. package/templates/nova/tests/cases/sections/trust/ugc-gallery/blocks/UgcImage.cases.tsx +17 -0
  806. package/templates/nova/tests/cases/sections/utility/account/Account.cases.tsx +44 -0
  807. package/templates/nova/tests/cases/sections/utility/cart-items/CartItems.cases.tsx +43 -0
  808. package/templates/nova/tests/cases/sections/utility/cart-items/blocks/CartBadge.cases.tsx +16 -0
  809. package/templates/nova/tests/cases/sections/utility/contact-form/ContactFormSection.cases.tsx +52 -0
  810. package/templates/nova/tests/cases/sections/utility/contact-form/blocks/ContactDetail.cases.tsx +17 -0
  811. package/templates/nova/tests/cases/sections/utility/newsletter/NewsletterSection.cases.tsx +109 -0
  812. package/templates/nova/tests/cases/sections/utility/not-found/NotFound.cases.tsx +28 -0
  813. package/templates/nova/tests/cases/sections/utility/policy-page/PolicyPage.cases.tsx +29 -0
  814. package/templates/nova/tests/cases/sections/utility/search-results/SearchResultsSection.cases.tsx +39 -0
  815. package/templates/nova/tests/cases/sections/utility/store-locator/StoreLocator.cases.tsx +40 -0
  816. package/templates/nova/tests/cases/styles/Borders.cases.tsx +10 -0
  817. package/templates/nova/tests/cases/styles/Breakpoints.cases.tsx +10 -0
  818. package/templates/nova/tests/cases/styles/Colors.cases.tsx +10 -0
  819. package/templates/nova/tests/cases/styles/Elevation.cases.tsx +10 -0
  820. package/templates/nova/tests/cases/styles/Icon.cases.tsx +23 -0
  821. package/templates/nova/tests/cases/styles/Layout.cases.tsx +8 -0
  822. package/templates/nova/tests/cases/styles/Motion.cases.tsx +10 -0
  823. package/templates/nova/tests/cases/styles/Overview.cases.tsx +8 -0
  824. package/templates/nova/tests/cases/styles/Radius.cases.tsx +10 -0
  825. package/templates/nova/tests/cases/styles/SharedThemeSettings.cases.tsx +19 -0
  826. package/templates/nova/tests/cases/styles/Spacing.cases.tsx +10 -0
  827. package/templates/nova/tests/cases/styles/Typography.cases.tsx +10 -0
  828. package/templates/nova/tests/cases.test.tsx +38 -0
  829. package/templates/nova/tests/components/PromoPopup.test.ts +21 -0
  830. package/templates/nova/tests/components/RichText.test.tsx +65 -0
  831. package/templates/nova/tests/components/formatDate.test.ts +10 -0
  832. package/templates/nova/tests/contract-locks.test.ts +23 -0
  833. package/templates/nova/tests/contracts.test.ts +153 -0
  834. package/templates/nova/tests/cookie-consent-privacy.test.tsx +128 -0
  835. package/templates/nova/tests/empty-store.test.tsx +81 -0
  836. package/templates/nova/tests/fixtures/commerce.ts +128 -0
  837. package/templates/nova/tests/fixtures/content.ts +58 -0
  838. package/templates/nova/tests/fixtures/index.ts +8 -0
  839. package/templates/nova/tests/fixtures/merch.ts +161 -0
  840. package/templates/nova/tests/fixtures/navigation.ts +125 -0
  841. package/templates/nova/tests/fixtures/promotion.ts +43 -0
  842. package/templates/nova/tests/fixtures/sample-store.json +1674 -0
  843. package/templates/nova/tests/fixtures/shop.ts +88 -0
  844. package/templates/nova/tests/fixtures/stress.ts +21 -0
  845. package/templates/nova/tests/inert.test.tsx +285 -0
  846. package/templates/nova/tests/line-add-friend.test.tsx +108 -0
  847. package/templates/nova/tests/localized-copy.test.ts +330 -0
  848. package/templates/nova/tests/product-template-blocks.test.ts +28 -0
  849. package/templates/nova/tests/rewards-launcher.test.tsx +401 -0
  850. package/templates/nova/tests/schema.test.ts +65 -0
  851. package/templates/nova/tests/schema.typetest.ts +7 -0
  852. package/templates/nova/tests/section-groups.test.ts +189 -0
  853. package/templates/nova/tests/sections/Group.test.tsx +37 -0
  854. package/templates/nova/tests/setup.ts +30 -0
  855. package/templates/nova/tests/starter.test.ts +56 -0
  856. package/templates/nova/tests/storefront-click-path.test.tsx +157 -0
  857. package/templates/nova/tests/styles/button-brand.test.ts +24 -0
  858. package/templates/nova/tests/styles/theme.test.ts +43 -0
  859. package/templates/nova/tests/styles/tokens.test.ts +35 -0
  860. package/templates/nova/tests/support/abi-ctx.ts +136 -0
  861. package/templates/nova/tests/support/block-stories.tsx +13 -0
  862. package/templates/nova/tests/support/case.tsx +102 -0
  863. package/templates/nova/tests/support/contracts.ts +30 -0
  864. package/templates/nova/tests/support/foundation-pages.tsx +260 -0
  865. package/templates/nova/tests/support/ia-pages.tsx +154 -0
  866. package/templates/nova/tests/support/listing-demo.tsx +29 -0
  867. package/templates/nova/tests/support/presets.ts +14 -0
  868. package/templates/nova/tests/support/sections.ts +36 -0
  869. package/templates/nova/tests/support/story-content.ts +321 -0
  870. package/templates/nova/tests/support/story-helpers.tsx +37 -0
  871. package/templates/nova/tests/support/with-nova.tsx +26 -0
  872. package/templates/nova/tests/theme-config.test.ts +82 -0
  873. package/templates/nova/tests/theme-integrity.test.ts +315 -0
  874. package/templates/nova/theme.config.ts +134 -0
  875. package/templates/nova/theme.manifest.json +17495 -0
  876. package/templates/nova/tsconfig.json +19 -0
  877. package/templates/nova/vite.abi-ssr.config.ts +37 -0
  878. package/templates/nova/vite.abi.config.ts +26 -0
  879. package/templates/nova/vitest.config.ts +20 -0
@@ -0,0 +1,1473 @@
1
+ {
2
+ "sections": [
3
+ {
4
+ "name": "page-body",
5
+ "label": "Page content",
6
+ "status": "EXISTING",
7
+ "rows": [
8
+ {
9
+ "name": "showTitle",
10
+ "label": "Show title",
11
+ "control": "boolean",
12
+ "options": [],
13
+ "optionLabels": [],
14
+ "legacyOptions": [],
15
+ "legacyOptionLabels": [],
16
+ "def": true,
17
+ "min": null,
18
+ "max": null,
19
+ "step": null,
20
+ "resp": "same",
21
+ "dep": "",
22
+ "desc": "Off when a hero/rich-text above already titles the page (still one h1: page title becomes visually hidden).",
23
+ "status": "CHANGED"
24
+ },
25
+ {
26
+ "name": "textWidth",
27
+ "label": "Text width (legacy)",
28
+ "control": "select",
29
+ "options": [
30
+ "narrow",
31
+ "content",
32
+ "standard"
33
+ ],
34
+ "optionLabels": [
35
+ "Narrow",
36
+ "Default",
37
+ "Wide"
38
+ ],
39
+ "legacyOptions": [],
40
+ "legacyOptionLabels": [],
41
+ "def": "narrow",
42
+ "min": null,
43
+ "max": null,
44
+ "step": null,
45
+ "resp": "same",
46
+ "dep": "",
47
+ "desc": "Duplicates shared contentWidth; saved values keep rendering; hidden. Replacement: contentWidth.",
48
+ "status": "LEGACY-HIDDEN"
49
+ },
50
+ {
51
+ "name": "fallbackTitle",
52
+ "label": "Preview title",
53
+ "control": "text",
54
+ "options": [],
55
+ "optionLabels": [],
56
+ "legacyOptions": [],
57
+ "legacyOptionLabels": [],
58
+ "def": "Page",
59
+ "min": null,
60
+ "max": null,
61
+ "step": null,
62
+ "resp": "",
63
+ "dep": "editor without page context",
64
+ "desc": "Editor-only sample; never shown to shoppers.",
65
+ "status": "EXISTING"
66
+ },
67
+ {
68
+ "name": "fallbackBody",
69
+ "label": "Preview text",
70
+ "control": "richtext",
71
+ "options": [],
72
+ "optionLabels": [],
73
+ "legacyOptions": [],
74
+ "legacyOptionLabels": [],
75
+ "def": "",
76
+ "min": null,
77
+ "max": null,
78
+ "step": null,
79
+ "resp": "",
80
+ "dep": "editor without page context",
81
+ "desc": "Editor-only sample.",
82
+ "status": "EXISTING"
83
+ }
84
+ ]
85
+ },
86
+ {
87
+ "name": "article-body",
88
+ "label": "Article",
89
+ "status": "EXISTING",
90
+ "rows": [
91
+ {
92
+ "name": "showDate",
93
+ "label": "Show date",
94
+ "control": "boolean",
95
+ "options": [],
96
+ "optionLabels": [],
97
+ "legacyOptions": [],
98
+ "legacyOptionLabels": [],
99
+ "def": true,
100
+ "min": null,
101
+ "max": null,
102
+ "step": null,
103
+ "resp": "same",
104
+ "dep": "",
105
+ "desc": "Locale-aware (Nova 11 · B7).",
106
+ "status": "EXISTING"
107
+ },
108
+ {
109
+ "name": "showReadingTime",
110
+ "label": "Show reading time",
111
+ "control": "boolean",
112
+ "options": [],
113
+ "optionLabels": [],
114
+ "legacyOptions": [],
115
+ "legacyOptionLabels": [],
116
+ "def": true,
117
+ "min": null,
118
+ "max": null,
119
+ "step": null,
120
+ "resp": "same",
121
+ "dep": "",
122
+ "desc": "Computed from word count (≈ 230 wpm; Thai by character count). No platform data needed.",
123
+ "status": "NEW"
124
+ },
125
+ {
126
+ "name": "showAuthor",
127
+ "label": "Show author",
128
+ "control": "boolean",
129
+ "options": [],
130
+ "optionLabels": [],
131
+ "legacyOptions": [],
132
+ "legacyOptionLabels": [],
133
+ "def": false,
134
+ "min": null,
135
+ "max": null,
136
+ "step": null,
137
+ "resp": "same",
138
+ "dep": "",
139
+ "desc": "Name + initials monogram. Author photo and bio = DATA REQUIREMENT (not in article data).",
140
+ "status": "EXISTING"
141
+ },
142
+ {
143
+ "name": "showFeaturedImage",
144
+ "label": "Show featured image",
145
+ "control": "boolean",
146
+ "options": [],
147
+ "optionLabels": [],
148
+ "legacyOptions": [],
149
+ "legacyOptionLabels": [],
150
+ "def": true,
151
+ "min": null,
152
+ "max": null,
153
+ "step": null,
154
+ "resp": "full-bleed 4:3 at 390",
155
+ "dep": "",
156
+ "desc": "Breaks out to 960 content width, 16:9.",
157
+ "status": "EXISTING"
158
+ },
159
+ {
160
+ "name": "featuredImageStyle",
161
+ "label": "Featured image style",
162
+ "control": "select",
163
+ "options": [
164
+ "below-title",
165
+ "behind-title"
166
+ ],
167
+ "optionLabels": [
168
+ "Below the title",
169
+ "Behind the title"
170
+ ],
171
+ "legacyOptions": [],
172
+ "legacyOptionLabels": [],
173
+ "def": "below-title",
174
+ "min": null,
175
+ "max": null,
176
+ "step": null,
177
+ "resp": "below at 390",
178
+ "dep": "showFeaturedImage",
179
+ "desc": "behind-title = full-bleed hero with overlay floor 62% (title + meta on image).",
180
+ "status": "NEW"
181
+ },
182
+ {
183
+ "name": "showShare",
184
+ "label": "Show share",
185
+ "control": "boolean",
186
+ "options": [],
187
+ "optionLabels": [],
188
+ "legacyOptions": [],
189
+ "legacyOptionLabels": [],
190
+ "def": true,
191
+ "min": null,
192
+ "max": null,
193
+ "step": null,
194
+ "resp": "native share sheet at 390",
195
+ "dep": "",
196
+ "desc": "Copy link + system share. No counts, no third-party scripts.",
197
+ "status": "CHANGED"
198
+ },
199
+ {
200
+ "name": "showContents",
201
+ "label": "Show contents list",
202
+ "control": "boolean",
203
+ "options": [],
204
+ "optionLabels": [],
205
+ "legacyOptions": [],
206
+ "legacyOptionLabels": [],
207
+ "def": false,
208
+ "min": null,
209
+ "max": null,
210
+ "step": null,
211
+ "resp": "collapsed \"Contents\" disclosure at 390",
212
+ "dep": "",
213
+ "desc": "Built from the article's h2 headings; sticky beside the text on desktop when ≥ 4 headings. No platform data needed.",
214
+ "status": "NEW"
215
+ },
216
+ {
217
+ "name": "showTags",
218
+ "label": "Show tags",
219
+ "control": "boolean",
220
+ "options": [],
221
+ "optionLabels": [],
222
+ "legacyOptions": [],
223
+ "legacyOptionLabels": [],
224
+ "def": true,
225
+ "min": null,
226
+ "max": null,
227
+ "step": null,
228
+ "resp": "same",
229
+ "dep": "",
230
+ "desc": "Tags link to the blog filtered by tag.",
231
+ "status": "EXISTING"
232
+ },
233
+ {
234
+ "name": "width",
235
+ "label": "Text width (legacy)",
236
+ "control": "select",
237
+ "options": [
238
+ "narrow",
239
+ "content"
240
+ ],
241
+ "optionLabels": [
242
+ "Narrow",
243
+ "Default"
244
+ ],
245
+ "legacyOptions": [],
246
+ "legacyOptionLabels": [],
247
+ "def": "narrow",
248
+ "min": null,
249
+ "max": null,
250
+ "step": null,
251
+ "resp": "same",
252
+ "dep": "",
253
+ "desc": "Duplicates contentWidth; hidden.",
254
+ "status": "LEGACY-HIDDEN"
255
+ },
256
+ {
257
+ "name": "fallbackTitle",
258
+ "label": "Preview title",
259
+ "control": "text",
260
+ "options": [],
261
+ "optionLabels": [],
262
+ "legacyOptions": [],
263
+ "legacyOptionLabels": [],
264
+ "def": "Article",
265
+ "min": null,
266
+ "max": null,
267
+ "step": null,
268
+ "resp": "",
269
+ "dep": "editor without article context",
270
+ "desc": "Editor-only.",
271
+ "status": "EXISTING"
272
+ },
273
+ {
274
+ "name": "fallbackBody",
275
+ "label": "Preview text",
276
+ "control": "richtext",
277
+ "options": [],
278
+ "optionLabels": [],
279
+ "legacyOptions": [],
280
+ "legacyOptionLabels": [],
281
+ "def": "",
282
+ "min": null,
283
+ "max": null,
284
+ "step": null,
285
+ "resp": "",
286
+ "dep": "editor without article context",
287
+ "desc": "Editor-only.",
288
+ "status": "EXISTING"
289
+ }
290
+ ]
291
+ },
292
+ {
293
+ "name": "blog-posts",
294
+ "label": "Blog posts",
295
+ "status": "EXISTING",
296
+ "rows": [
297
+ {
298
+ "name": "blog",
299
+ "label": "Blog",
300
+ "control": "blog",
301
+ "options": [],
302
+ "optionLabels": [],
303
+ "legacyOptions": [],
304
+ "legacyOptionLabels": [],
305
+ "def": "",
306
+ "min": null,
307
+ "max": null,
308
+ "step": null,
309
+ "resp": "",
310
+ "dep": "",
311
+ "desc": "Persisted as the blog handle (text). IDEAL CONTROL: blog picker — the blog field type exists; control changes from text to blog, stored value unchanged.",
312
+ "status": "CHANGED"
313
+ },
314
+ {
315
+ "name": "fallbackTitle",
316
+ "label": "Preview title",
317
+ "control": "text",
318
+ "options": [],
319
+ "optionLabels": [],
320
+ "legacyOptions": [],
321
+ "legacyOptionLabels": [],
322
+ "def": "Journal",
323
+ "min": null,
324
+ "max": null,
325
+ "step": null,
326
+ "resp": "",
327
+ "dep": "",
328
+ "desc": "Editor-only when no blog.",
329
+ "status": "EXISTING"
330
+ },
331
+ {
332
+ "name": "columns",
333
+ "label": "Columns",
334
+ "control": "select",
335
+ "options": [
336
+ "2",
337
+ "3",
338
+ "4"
339
+ ],
340
+ "optionLabels": [
341
+ "2",
342
+ "3",
343
+ "4"
344
+ ],
345
+ "legacyOptions": [],
346
+ "legacyOptionLabels": [],
347
+ "def": "3",
348
+ "min": null,
349
+ "max": null,
350
+ "step": null,
351
+ "resp": "rows at 390",
352
+ "dep": "",
353
+ "desc": "",
354
+ "status": "EXISTING"
355
+ },
356
+ {
357
+ "name": "postsToShow",
358
+ "label": "Posts to show",
359
+ "control": "range",
360
+ "options": [],
361
+ "optionLabels": [],
362
+ "legacyOptions": [],
363
+ "legacyOptionLabels": [],
364
+ "def": 3,
365
+ "min": 1,
366
+ "max": 9,
367
+ "step": 1,
368
+ "resp": "same",
369
+ "dep": "paginate off",
370
+ "desc": "",
371
+ "status": "EXISTING"
372
+ },
373
+ {
374
+ "name": "showExcerpt",
375
+ "label": "Show excerpt",
376
+ "control": "boolean",
377
+ "options": [],
378
+ "optionLabels": [],
379
+ "legacyOptions": [],
380
+ "legacyOptionLabels": [],
381
+ "def": false,
382
+ "min": null,
383
+ "max": null,
384
+ "step": null,
385
+ "resp": "hidden in rows at 390",
386
+ "dep": "",
387
+ "desc": "2 lines.",
388
+ "status": "EXISTING"
389
+ },
390
+ {
391
+ "name": "featuredFirst",
392
+ "label": "Feature the first post",
393
+ "control": "boolean",
394
+ "options": [],
395
+ "optionLabels": [],
396
+ "legacyOptions": [],
397
+ "legacyOptionLabels": [],
398
+ "def": false,
399
+ "min": null,
400
+ "max": null,
401
+ "step": null,
402
+ "resp": "same",
403
+ "dep": "",
404
+ "desc": "",
405
+ "status": "EXISTING"
406
+ },
407
+ {
408
+ "name": "featuredStyle",
409
+ "label": "Featured post style",
410
+ "control": "select",
411
+ "options": [
412
+ "split",
413
+ "overlay"
414
+ ],
415
+ "optionLabels": [
416
+ "Split",
417
+ "Overlay"
418
+ ],
419
+ "legacyOptions": [],
420
+ "legacyOptionLabels": [],
421
+ "def": "split",
422
+ "min": null,
423
+ "max": null,
424
+ "step": null,
425
+ "resp": "4:5 overlay at 390",
426
+ "dep": "featuredFirst",
427
+ "desc": "Nova 11 · A2.",
428
+ "status": "EXISTING"
429
+ },
430
+ {
431
+ "name": "showDate",
432
+ "label": "Show date",
433
+ "control": "boolean",
434
+ "options": [],
435
+ "optionLabels": [],
436
+ "legacyOptions": [],
437
+ "legacyOptionLabels": [],
438
+ "def": true,
439
+ "min": null,
440
+ "max": null,
441
+ "step": null,
442
+ "resp": "same",
443
+ "dep": "",
444
+ "desc": "",
445
+ "status": "EXISTING"
446
+ },
447
+ {
448
+ "name": "showTagFilter",
449
+ "label": "Show tag filter",
450
+ "control": "boolean",
451
+ "options": [],
452
+ "optionLabels": [],
453
+ "legacyOptions": [],
454
+ "legacyOptionLabels": [],
455
+ "def": false,
456
+ "min": null,
457
+ "max": null,
458
+ "step": null,
459
+ "resp": "chips scroll at 390",
460
+ "dep": "",
461
+ "desc": "Tabs of tags; URL updates.",
462
+ "status": "EXISTING"
463
+ },
464
+ {
465
+ "name": "filterTags",
466
+ "label": "Tags in filter",
467
+ "control": "text",
468
+ "options": [],
469
+ "optionLabels": [],
470
+ "legacyOptions": [],
471
+ "legacyOptionLabels": [],
472
+ "def": "",
473
+ "min": null,
474
+ "max": null,
475
+ "step": null,
476
+ "resp": "",
477
+ "dep": "showTagFilter",
478
+ "desc": "IDEAL CONTROL: multi-select of the blog's tags. CURRENT FALLBACK: comma-separated text. WHY: typos silently hide tabs.",
479
+ "status": "NEEDS NEW FIELD TYPE"
480
+ },
481
+ {
482
+ "name": "paginate",
483
+ "label": "Paginate",
484
+ "control": "boolean",
485
+ "options": [],
486
+ "optionLabels": [],
487
+ "legacyOptions": [],
488
+ "legacyOptionLabels": [],
489
+ "def": false,
490
+ "min": null,
491
+ "max": null,
492
+ "step": null,
493
+ "resp": "same",
494
+ "dep": "",
495
+ "desc": "Journal template sets it on.",
496
+ "status": "EXISTING"
497
+ },
498
+ {
499
+ "name": "imageRatio",
500
+ "label": "Image shape",
501
+ "control": "select",
502
+ "options": [
503
+ "landscape",
504
+ "square",
505
+ "adapt"
506
+ ],
507
+ "optionLabels": [
508
+ "Landscape",
509
+ "Square",
510
+ "Fit image"
511
+ ],
512
+ "legacyOptions": [],
513
+ "legacyOptionLabels": [],
514
+ "def": "landscape",
515
+ "min": null,
516
+ "max": null,
517
+ "step": null,
518
+ "resp": "square in rows at 390",
519
+ "dep": "",
520
+ "desc": "landscape = 3:2.",
521
+ "status": "EXISTING"
522
+ },
523
+ {
524
+ "name": "fallbackEmpty",
525
+ "label": "Empty message",
526
+ "control": "richtext",
527
+ "options": [],
528
+ "optionLabels": [],
529
+ "legacyOptions": [],
530
+ "legacyOptionLabels": [],
531
+ "def": "",
532
+ "min": null,
533
+ "max": null,
534
+ "step": null,
535
+ "resp": "same",
536
+ "dep": "",
537
+ "desc": "Shown when the blog has no posts; default \"No stories yet.\"",
538
+ "status": "EXISTING"
539
+ }
540
+ ]
541
+ },
542
+ {
543
+ "name": "team-founders",
544
+ "label": "Team & founders",
545
+ "status": "NEW",
546
+ "rows": [
547
+ {
548
+ "name": "layout",
549
+ "label": "Layout",
550
+ "control": "select",
551
+ "options": [
552
+ "founder",
553
+ "grid",
554
+ "list"
555
+ ],
556
+ "optionLabels": [
557
+ "Founder story",
558
+ "Team grid",
559
+ "Compact list"
560
+ ],
561
+ "legacyOptions": [],
562
+ "legacyOptionLabels": [],
563
+ "def": "founder",
564
+ "min": null,
565
+ "max": null,
566
+ "step": null,
567
+ "resp": "grid → 2 columns, list → 1 at 390",
568
+ "dep": "",
569
+ "desc": "founder uses the first person block only.",
570
+ "status": "NEW"
571
+ },
572
+ {
573
+ "name": "columns",
574
+ "label": "Columns",
575
+ "control": "range",
576
+ "options": [],
577
+ "optionLabels": [],
578
+ "legacyOptions": [],
579
+ "legacyOptionLabels": [],
580
+ "def": 4,
581
+ "min": 2,
582
+ "max": 5,
583
+ "step": 1,
584
+ "resp": "2 at 390",
585
+ "dep": "layout = grid · list",
586
+ "desc": "",
587
+ "status": "NEW"
588
+ },
589
+ {
590
+ "name": "imageShape",
591
+ "label": "Portrait shape",
592
+ "control": "select",
593
+ "options": [
594
+ "portrait",
595
+ "square",
596
+ "circle"
597
+ ],
598
+ "optionLabels": [
599
+ "Portrait",
600
+ "Square",
601
+ "Circle"
602
+ ],
603
+ "legacyOptions": [],
604
+ "legacyOptionLabels": [],
605
+ "def": "portrait",
606
+ "min": null,
607
+ "max": null,
608
+ "step": null,
609
+ "resp": "same",
610
+ "dep": "",
611
+ "desc": "circle recommended for list.",
612
+ "status": "NEW"
613
+ },
614
+ {
615
+ "name": "showBio",
616
+ "label": "Show bios",
617
+ "control": "boolean",
618
+ "options": [],
619
+ "optionLabels": [],
620
+ "legacyOptions": [],
621
+ "legacyOptionLabels": [],
622
+ "def": false,
623
+ "min": null,
624
+ "max": null,
625
+ "step": null,
626
+ "resp": "same",
627
+ "dep": "layout = grid",
628
+ "desc": "founder always shows the bio.",
629
+ "status": "NEW"
630
+ },
631
+ {
632
+ "name": "showLinks",
633
+ "label": "Show links",
634
+ "control": "boolean",
635
+ "options": [],
636
+ "optionLabels": [],
637
+ "legacyOptions": [],
638
+ "legacyOptionLabels": [],
639
+ "def": true,
640
+ "min": null,
641
+ "max": null,
642
+ "step": null,
643
+ "resp": "same",
644
+ "dep": "",
645
+ "desc": "Per-person link (e.g. story or social).",
646
+ "status": "NEW"
647
+ },
648
+ {
649
+ "name": "mediaPosition",
650
+ "label": "Portrait side",
651
+ "control": "select",
652
+ "options": [
653
+ "start",
654
+ "end"
655
+ ],
656
+ "optionLabels": [
657
+ "First",
658
+ "Last"
659
+ ],
660
+ "legacyOptions": [],
661
+ "legacyOptionLabels": [],
662
+ "def": "start",
663
+ "min": null,
664
+ "max": null,
665
+ "step": null,
666
+ "resp": "portrait first at 390",
667
+ "dep": "layout = founder",
668
+ "desc": "Mirrors in RTL.",
669
+ "status": "NEW"
670
+ }
671
+ ]
672
+ },
673
+ {
674
+ "name": "before-after",
675
+ "label": "Before & after",
676
+ "status": "NEW",
677
+ "rows": [
678
+ {
679
+ "name": "layout",
680
+ "label": "Layout",
681
+ "control": "select",
682
+ "options": [
683
+ "slider",
684
+ "side-by-side"
685
+ ],
686
+ "optionLabels": [
687
+ "Drag slider",
688
+ "Side by side"
689
+ ],
690
+ "legacyOptions": [],
691
+ "legacyOptionLabels": [],
692
+ "def": "slider",
693
+ "min": null,
694
+ "max": null,
695
+ "step": null,
696
+ "resp": "side-by-side stacks at 390",
697
+ "dep": "",
698
+ "desc": "Reduced motion keeps the slider (no animation involved).",
699
+ "status": "NEW"
700
+ },
701
+ {
702
+ "name": "startPosition",
703
+ "label": "Divider start",
704
+ "control": "range",
705
+ "options": [],
706
+ "optionLabels": [],
707
+ "legacyOptions": [],
708
+ "legacyOptionLabels": [],
709
+ "def": 50,
710
+ "min": 10,
711
+ "max": 90,
712
+ "step": 5,
713
+ "resp": "same",
714
+ "dep": "layout = slider",
715
+ "desc": "Percent from the start side.",
716
+ "status": "NEW"
717
+ },
718
+ {
719
+ "name": "ratio",
720
+ "label": "Image shape",
721
+ "control": "select",
722
+ "options": [
723
+ "landscape",
724
+ "square",
725
+ "portrait"
726
+ ],
727
+ "optionLabels": [
728
+ "Landscape 3:2",
729
+ "Square",
730
+ "Portrait 4:5"
731
+ ],
732
+ "legacyOptions": [],
733
+ "legacyOptionLabels": [],
734
+ "def": "landscape",
735
+ "min": null,
736
+ "max": null,
737
+ "step": null,
738
+ "resp": "portrait at 390",
739
+ "dep": "",
740
+ "desc": "Both images cropped to the same ratio and focal centre.",
741
+ "status": "NEW"
742
+ },
743
+ {
744
+ "name": "beforeLabel",
745
+ "label": "Before label",
746
+ "control": "text",
747
+ "options": [],
748
+ "optionLabels": [],
749
+ "legacyOptions": [],
750
+ "legacyOptionLabels": [],
751
+ "def": "Before",
752
+ "min": null,
753
+ "max": null,
754
+ "step": null,
755
+ "resp": "same",
756
+ "dep": "",
757
+ "desc": "Blank hides both labels.",
758
+ "status": "NEW"
759
+ },
760
+ {
761
+ "name": "afterLabel",
762
+ "label": "After label",
763
+ "control": "text",
764
+ "options": [],
765
+ "optionLabels": [],
766
+ "legacyOptions": [],
767
+ "legacyOptionLabels": [],
768
+ "def": "After",
769
+ "min": null,
770
+ "max": null,
771
+ "step": null,
772
+ "resp": "same",
773
+ "dep": "",
774
+ "desc": "",
775
+ "status": "NEW"
776
+ },
777
+ {
778
+ "name": "mediaPosition",
779
+ "label": "Comparison side",
780
+ "control": "select",
781
+ "options": [
782
+ "end",
783
+ "start",
784
+ "full"
785
+ ],
786
+ "optionLabels": [
787
+ "Last",
788
+ "First",
789
+ "Full width"
790
+ ],
791
+ "legacyOptions": [],
792
+ "legacyOptionLabels": [],
793
+ "def": "end",
794
+ "min": null,
795
+ "max": null,
796
+ "step": null,
797
+ "resp": "stacked at 390",
798
+ "dep": "",
799
+ "desc": "full = comparison under the header, content width.",
800
+ "status": "NEW"
801
+ }
802
+ ]
803
+ }
804
+ ],
805
+ "blocks": [
806
+ {
807
+ "name": "person",
808
+ "label": "Person",
809
+ "parents": [
810
+ "team-founders"
811
+ ],
812
+ "min": 1,
813
+ "recommended": 4,
814
+ "max": 24,
815
+ "status": "NEW",
816
+ "resp": "portrait per imageShape; initials monogram when no image",
817
+ "empty": "skipped when name empty",
818
+ "summary": "",
819
+ "rows": [
820
+ {
821
+ "name": "name",
822
+ "label": "Name",
823
+ "control": "text",
824
+ "options": [],
825
+ "optionLabels": [],
826
+ "legacyOptions": [],
827
+ "legacyOptionLabels": [],
828
+ "def": "",
829
+ "min": null,
830
+ "max": null,
831
+ "step": null,
832
+ "resp": "",
833
+ "dep": "",
834
+ "desc": "",
835
+ "status": "NEW"
836
+ },
837
+ {
838
+ "name": "role",
839
+ "label": "Role",
840
+ "control": "text",
841
+ "options": [],
842
+ "optionLabels": [],
843
+ "legacyOptions": [],
844
+ "legacyOptionLabels": [],
845
+ "def": "",
846
+ "min": null,
847
+ "max": null,
848
+ "step": null,
849
+ "resp": "",
850
+ "dep": "",
851
+ "desc": "e.g. Founder & potter.",
852
+ "status": "NEW"
853
+ },
854
+ {
855
+ "name": "image",
856
+ "label": "Portrait",
857
+ "control": "image",
858
+ "options": [],
859
+ "optionLabels": [],
860
+ "legacyOptions": [],
861
+ "legacyOptionLabels": [],
862
+ "def": "",
863
+ "min": null,
864
+ "max": null,
865
+ "step": null,
866
+ "resp": "",
867
+ "dep": "",
868
+ "desc": "Face-centred crop.",
869
+ "status": "NEW"
870
+ },
871
+ {
872
+ "name": "quote",
873
+ "label": "Quote",
874
+ "control": "text",
875
+ "options": [],
876
+ "optionLabels": [],
877
+ "legacyOptions": [],
878
+ "legacyOptionLabels": [],
879
+ "def": "",
880
+ "min": null,
881
+ "max": null,
882
+ "step": null,
883
+ "resp": "",
884
+ "dep": "layout = founder",
885
+ "desc": "Shown as the large quote in founder layout.",
886
+ "status": "NEW"
887
+ },
888
+ {
889
+ "name": "bio",
890
+ "label": "Bio",
891
+ "control": "richtext",
892
+ "options": [],
893
+ "optionLabels": [],
894
+ "legacyOptions": [],
895
+ "legacyOptionLabels": [],
896
+ "def": "",
897
+ "min": null,
898
+ "max": null,
899
+ "step": null,
900
+ "resp": "",
901
+ "dep": "",
902
+ "desc": "2–4 sentences.",
903
+ "status": "NEW"
904
+ },
905
+ {
906
+ "name": "linkLabel",
907
+ "label": "Link label",
908
+ "control": "text",
909
+ "options": [],
910
+ "optionLabels": [],
911
+ "legacyOptions": [],
912
+ "legacyOptionLabels": [],
913
+ "def": "",
914
+ "min": null,
915
+ "max": null,
916
+ "step": null,
917
+ "resp": "",
918
+ "dep": "",
919
+ "desc": "",
920
+ "status": "NEW"
921
+ },
922
+ {
923
+ "name": "link",
924
+ "label": "Link",
925
+ "control": "url",
926
+ "options": [],
927
+ "optionLabels": [],
928
+ "legacyOptions": [],
929
+ "legacyOptionLabels": [],
930
+ "def": "",
931
+ "min": null,
932
+ "max": null,
933
+ "step": null,
934
+ "resp": "",
935
+ "dep": "linkLabel",
936
+ "desc": "",
937
+ "status": "NEW"
938
+ }
939
+ ]
940
+ },
941
+ {
942
+ "name": "comparison",
943
+ "label": "Comparison",
944
+ "parents": [
945
+ "before-after"
946
+ ],
947
+ "min": 1,
948
+ "recommended": 1,
949
+ "max": 4,
950
+ "status": "NEW",
951
+ "resp": "> 1 comparison → swipe carousel with count",
952
+ "empty": "skipped unless both images are set",
953
+ "summary": "",
954
+ "rows": [
955
+ {
956
+ "name": "beforeImage",
957
+ "label": "Before image",
958
+ "control": "image",
959
+ "options": [],
960
+ "optionLabels": [],
961
+ "legacyOptions": [],
962
+ "legacyOptionLabels": [],
963
+ "def": "",
964
+ "min": null,
965
+ "max": null,
966
+ "step": null,
967
+ "resp": "",
968
+ "dep": "",
969
+ "desc": "",
970
+ "status": "NEW"
971
+ },
972
+ {
973
+ "name": "afterImage",
974
+ "label": "After image",
975
+ "control": "image",
976
+ "options": [],
977
+ "optionLabels": [],
978
+ "legacyOptions": [],
979
+ "legacyOptionLabels": [],
980
+ "def": "",
981
+ "min": null,
982
+ "max": null,
983
+ "step": null,
984
+ "resp": "",
985
+ "dep": "",
986
+ "desc": "Same framing as before.",
987
+ "status": "NEW"
988
+ },
989
+ {
990
+ "name": "caption",
991
+ "label": "Caption",
992
+ "control": "text",
993
+ "options": [],
994
+ "optionLabels": [],
995
+ "legacyOptions": [],
996
+ "legacyOptionLabels": [],
997
+ "def": "",
998
+ "min": null,
999
+ "max": null,
1000
+ "step": null,
1001
+ "resp": "",
1002
+ "dep": "",
1003
+ "desc": "",
1004
+ "status": "NEW"
1005
+ },
1006
+ {
1007
+ "name": "alt",
1008
+ "label": "Description",
1009
+ "control": "text",
1010
+ "options": [],
1011
+ "optionLabels": [],
1012
+ "legacyOptions": [],
1013
+ "legacyOptionLabels": [],
1014
+ "def": "",
1015
+ "min": null,
1016
+ "max": null,
1017
+ "step": null,
1018
+ "resp": "",
1019
+ "dep": "",
1020
+ "desc": "Describes the change for screen readers.",
1021
+ "status": "NEW"
1022
+ }
1023
+ ]
1024
+ }
1025
+ ],
1026
+ "presets": [
1027
+ {
1028
+ "name": "page-standard",
1029
+ "label": "Standard page",
1030
+ "section": "page-body",
1031
+ "purpose": "Care guides, FAQs as text, info pages",
1032
+ "settings": {
1033
+ "showTitle": true,
1034
+ "contentWidth": "narrow"
1035
+ },
1036
+ "blocks": [],
1037
+ "content": ""
1038
+ },
1039
+ {
1040
+ "name": "article-standard",
1041
+ "label": "Standard article",
1042
+ "section": "article-body",
1043
+ "purpose": "Default journal article",
1044
+ "settings": {
1045
+ "showFeaturedImage": true,
1046
+ "featuredImageStyle": "below-title",
1047
+ "showDate": true,
1048
+ "showReadingTime": true,
1049
+ "showTags": true,
1050
+ "showShare": true
1051
+ },
1052
+ "blocks": [],
1053
+ "content": ""
1054
+ },
1055
+ {
1056
+ "name": "article-longform",
1057
+ "label": "Long-form feature",
1058
+ "section": "article-body",
1059
+ "purpose": "Feature story with hero image",
1060
+ "settings": {
1061
+ "featuredImageStyle": "behind-title",
1062
+ "showAuthor": true,
1063
+ "contentWidth": "narrow"
1064
+ },
1065
+ "blocks": [],
1066
+ "content": "Strong landscape image"
1067
+ },
1068
+ {
1069
+ "name": "article-minimal",
1070
+ "label": "Minimal note",
1071
+ "section": "article-body",
1072
+ "purpose": "Short updates",
1073
+ "settings": {
1074
+ "showFeaturedImage": false,
1075
+ "showShare": false,
1076
+ "showTags": false
1077
+ },
1078
+ "blocks": [],
1079
+ "content": ""
1080
+ },
1081
+ {
1082
+ "name": "blog-journal",
1083
+ "label": "Journal page",
1084
+ "section": "blog-posts",
1085
+ "purpose": "Main blog listing",
1086
+ "settings": {
1087
+ "columns": "3",
1088
+ "featuredFirst": true,
1089
+ "featuredStyle": "split",
1090
+ "showExcerpt": true,
1091
+ "showTagFilter": true,
1092
+ "paginate": true
1093
+ },
1094
+ "blocks": [],
1095
+ "content": ""
1096
+ },
1097
+ {
1098
+ "name": "blog-row",
1099
+ "label": "From the journal",
1100
+ "section": "blog-posts",
1101
+ "purpose": "3 latest posts on other pages",
1102
+ "settings": {
1103
+ "columns": "3",
1104
+ "postsToShow": 3,
1105
+ "showExcerpt": false,
1106
+ "background": "surface-secondary"
1107
+ },
1108
+ "blocks": [],
1109
+ "content": ""
1110
+ },
1111
+ {
1112
+ "name": "blog-featured",
1113
+ "label": "Featured stories",
1114
+ "section": "blog-posts",
1115
+ "purpose": "Photography-led journal",
1116
+ "settings": {
1117
+ "columns": "2",
1118
+ "featuredFirst": true,
1119
+ "featuredStyle": "overlay",
1120
+ "imageRatio": "landscape"
1121
+ },
1122
+ "blocks": [],
1123
+ "content": ""
1124
+ },
1125
+ {
1126
+ "name": "team-founder",
1127
+ "label": "Founder story",
1128
+ "section": "team-founders",
1129
+ "purpose": "One founder with quote",
1130
+ "settings": {
1131
+ "layout": "founder",
1132
+ "imageShape": "portrait",
1133
+ "background": "surface-secondary"
1134
+ },
1135
+ "blocks": [],
1136
+ "content": "1 person with portrait, quote and bio"
1137
+ },
1138
+ {
1139
+ "name": "team-grid",
1140
+ "label": "Team grid",
1141
+ "section": "team-founders",
1142
+ "purpose": "Small team",
1143
+ "settings": {
1144
+ "layout": "grid",
1145
+ "columns": 4,
1146
+ "imageShape": "portrait",
1147
+ "showBio": false
1148
+ },
1149
+ "blocks": [],
1150
+ "content": "3–8 people"
1151
+ },
1152
+ {
1153
+ "name": "team-list",
1154
+ "label": "Team list",
1155
+ "section": "team-founders",
1156
+ "purpose": "Larger teams or credits",
1157
+ "settings": {
1158
+ "layout": "list",
1159
+ "columns": 2,
1160
+ "imageShape": "circle"
1161
+ },
1162
+ "blocks": [],
1163
+ "content": "8–24 people"
1164
+ },
1165
+ {
1166
+ "name": "ba-proof",
1167
+ "label": "Proof slider",
1168
+ "section": "before-after",
1169
+ "purpose": "One strong comparison",
1170
+ "settings": {
1171
+ "layout": "slider",
1172
+ "ratio": "landscape",
1173
+ "mediaPosition": "end"
1174
+ },
1175
+ "blocks": [],
1176
+ "content": "1 aligned pair"
1177
+ },
1178
+ {
1179
+ "name": "ba-results",
1180
+ "label": "Results set",
1181
+ "section": "before-after",
1182
+ "purpose": "Several comparisons",
1183
+ "settings": {
1184
+ "layout": "slider",
1185
+ "ratio": "square",
1186
+ "mediaPosition": "full"
1187
+ },
1188
+ "blocks": [],
1189
+ "content": "2–4 pairs"
1190
+ },
1191
+ {
1192
+ "name": "ba-side",
1193
+ "label": "Side by side",
1194
+ "section": "before-after",
1195
+ "purpose": "Calm comparison",
1196
+ "settings": {
1197
+ "layout": "side-by-side",
1198
+ "ratio": "portrait"
1199
+ },
1200
+ "blocks": [],
1201
+ "content": "1–2 pairs"
1202
+ }
1203
+ ],
1204
+ "shared": [],
1205
+ "sharedApplicability": [
1206
+ {
1207
+ "prop": "sectionWidth",
1208
+ "page-body": "APPLIES",
1209
+ "page-bodyNote": "",
1210
+ "article-body": "APPLIES",
1211
+ "article-bodyNote": "",
1212
+ "blog-posts": "APPLIES",
1213
+ "blog-postsNote": "",
1214
+ "team-founders": "APPLIES",
1215
+ "team-foundersNote": "",
1216
+ "before-after": "APPLIES",
1217
+ "before-afterNote": ""
1218
+ },
1219
+ {
1220
+ "prop": "contentWidth",
1221
+ "page-body": "APPLIES",
1222
+ "page-bodyNote": "",
1223
+ "article-body": "APPLIES",
1224
+ "article-bodyNote": "",
1225
+ "blog-posts": "NOT APPLICABLE",
1226
+ "blog-postsNote": "grid",
1227
+ "team-founders": "NOT APPLICABLE",
1228
+ "team-foundersNote": "grid",
1229
+ "before-after": "NOT APPLICABLE",
1230
+ "before-afterNote": ""
1231
+ },
1232
+ {
1233
+ "prop": "contentAlignment",
1234
+ "page-body": "APPLIES",
1235
+ "page-bodyNote": "title only; prose always start",
1236
+ "article-body": "APPLIES",
1237
+ "article-bodyNote": "header only",
1238
+ "blog-posts": "APPLIES",
1239
+ "blog-postsNote": "",
1240
+ "team-founders": "APPLIES",
1241
+ "team-foundersNote": "header only",
1242
+ "before-after": "APPLIES",
1243
+ "before-afterNote": "text column"
1244
+ },
1245
+ {
1246
+ "prop": "spacingTop",
1247
+ "page-body": "APPLIES",
1248
+ "page-bodyNote": "",
1249
+ "article-body": "APPLIES",
1250
+ "article-bodyNote": "",
1251
+ "blog-posts": "APPLIES",
1252
+ "blog-postsNote": "",
1253
+ "team-founders": "APPLIES",
1254
+ "team-foundersNote": "",
1255
+ "before-after": "APPLIES",
1256
+ "before-afterNote": ""
1257
+ },
1258
+ {
1259
+ "prop": "spacingBottom",
1260
+ "page-body": "APPLIES",
1261
+ "page-bodyNote": "",
1262
+ "article-body": "APPLIES",
1263
+ "article-bodyNote": "",
1264
+ "blog-posts": "APPLIES",
1265
+ "blog-postsNote": "",
1266
+ "team-founders": "APPLIES",
1267
+ "team-foundersNote": "",
1268
+ "before-after": "APPLIES",
1269
+ "before-afterNote": ""
1270
+ },
1271
+ {
1272
+ "prop": "background",
1273
+ "page-body": "APPLIES",
1274
+ "page-bodyNote": "",
1275
+ "article-body": "APPLIES",
1276
+ "article-bodyNote": "",
1277
+ "blog-posts": "APPLIES",
1278
+ "blog-postsNote": "",
1279
+ "team-founders": "APPLIES",
1280
+ "team-foundersNote": "",
1281
+ "before-after": "APPLIES",
1282
+ "before-afterNote": ""
1283
+ },
1284
+ {
1285
+ "prop": "heading",
1286
+ "page-body": "OVERRIDDEN BY SECTION-SPECIFIC BEHAVIOR",
1287
+ "page-bodyNote": "page title",
1288
+ "article-body": "OVERRIDDEN BY SECTION-SPECIFIC BEHAVIOR",
1289
+ "article-bodyNote": "article title",
1290
+ "blog-posts": "APPLIES",
1291
+ "blog-postsNote": "falls back to fallbackTitle in editor",
1292
+ "team-founders": "APPLIES",
1293
+ "team-foundersNote": "",
1294
+ "before-after": "APPLIES",
1295
+ "before-afterNote": ""
1296
+ },
1297
+ {
1298
+ "prop": "eyebrow",
1299
+ "page-body": "NOT APPLICABLE",
1300
+ "page-bodyNote": "",
1301
+ "article-body": "OVERRIDDEN BY SECTION-SPECIFIC BEHAVIOR",
1302
+ "article-bodyNote": "tag · date line",
1303
+ "blog-posts": "APPLIES",
1304
+ "blog-postsNote": "",
1305
+ "team-founders": "APPLIES",
1306
+ "team-foundersNote": "",
1307
+ "before-after": "APPLIES",
1308
+ "before-afterNote": ""
1309
+ },
1310
+ {
1311
+ "prop": "description",
1312
+ "page-body": "OVERRIDDEN BY SECTION-SPECIFIC BEHAVIOR",
1313
+ "page-bodyNote": "page content",
1314
+ "article-body": "OVERRIDDEN BY SECTION-SPECIFIC BEHAVIOR",
1315
+ "article-bodyNote": "article excerpt as standfirst",
1316
+ "blog-posts": "APPLIES",
1317
+ "blog-postsNote": "",
1318
+ "team-founders": "APPLIES",
1319
+ "team-foundersNote": "",
1320
+ "before-after": "APPLIES",
1321
+ "before-afterNote": ""
1322
+ },
1323
+ {
1324
+ "prop": "headerSize",
1325
+ "page-body": "APPLIES",
1326
+ "page-bodyNote": "",
1327
+ "article-body": "APPLIES",
1328
+ "article-bodyNote": "",
1329
+ "blog-posts": "APPLIES",
1330
+ "blog-postsNote": "",
1331
+ "team-founders": "APPLIES",
1332
+ "team-foundersNote": "",
1333
+ "before-after": "APPLIES",
1334
+ "before-afterNote": ""
1335
+ },
1336
+ {
1337
+ "prop": "mobileContentAlignment",
1338
+ "page-body": "APPLIES",
1339
+ "page-bodyNote": "title only",
1340
+ "article-body": "APPLIES",
1341
+ "article-bodyNote": "header only",
1342
+ "blog-posts": "APPLIES",
1343
+ "blog-postsNote": "",
1344
+ "team-founders": "APPLIES",
1345
+ "team-foundersNote": "",
1346
+ "before-after": "APPLIES",
1347
+ "before-afterNote": ""
1348
+ },
1349
+ {
1350
+ "prop": "hideOnMobile",
1351
+ "page-body": "APPLIES",
1352
+ "page-bodyNote": "",
1353
+ "article-body": "APPLIES",
1354
+ "article-bodyNote": "",
1355
+ "blog-posts": "APPLIES",
1356
+ "blog-postsNote": "",
1357
+ "team-founders": "APPLIES",
1358
+ "team-foundersNote": "",
1359
+ "before-after": "APPLIES",
1360
+ "before-afterNote": ""
1361
+ },
1362
+ {
1363
+ "prop": "anchorId",
1364
+ "page-body": "APPLIES",
1365
+ "page-bodyNote": "",
1366
+ "article-body": "APPLIES",
1367
+ "article-bodyNote": "",
1368
+ "blog-posts": "APPLIES",
1369
+ "blog-postsNote": "",
1370
+ "team-founders": "APPLIES",
1371
+ "team-foundersNote": "",
1372
+ "before-after": "APPLIES",
1373
+ "before-afterNote": ""
1374
+ }
1375
+ ],
1376
+ "globals": [],
1377
+ "ai": [
1378
+ {
1379
+ "section": "page-body",
1380
+ "purpose": "Render a page's own content",
1381
+ "pageTypes": [
1382
+ "page",
1383
+ "about",
1384
+ "policy"
1385
+ ],
1386
+ "content": "Page content",
1387
+ "itemRange": "1 per page",
1388
+ "useWhen": "Any page template",
1389
+ "avoidWhen": "Home and product pages",
1390
+ "neighbours": [
1391
+ "breadcrumbs",
1392
+ "faq",
1393
+ "contact-form"
1394
+ ]
1395
+ },
1396
+ {
1397
+ "section": "article-body",
1398
+ "purpose": "Render an article",
1399
+ "pageTypes": [
1400
+ "article"
1401
+ ],
1402
+ "content": "Article",
1403
+ "itemRange": "1 per article",
1404
+ "useWhen": "Article templates; longform preset with a strong image",
1405
+ "avoidWhen": "Anywhere else",
1406
+ "neighbours": [
1407
+ "breadcrumbs",
1408
+ "blog-posts",
1409
+ "featured-collection"
1410
+ ]
1411
+ },
1412
+ {
1413
+ "section": "blog-posts",
1414
+ "purpose": "List journal posts",
1415
+ "pageTypes": [
1416
+ "blog",
1417
+ "home",
1418
+ "article",
1419
+ "about"
1420
+ ],
1421
+ "content": "Blog",
1422
+ "itemRange": "3 (row) · 9–12 (listing)",
1423
+ "useWhen": "Merchant has ≥ 3 posts",
1424
+ "avoidWhen": "Blog with < 2 posts on the home page",
1425
+ "neighbours": [
1426
+ "rich-text",
1427
+ "newsletter"
1428
+ ]
1429
+ },
1430
+ {
1431
+ "section": "team-founders",
1432
+ "purpose": "People behind the brand",
1433
+ "pageTypes": [
1434
+ "about",
1435
+ "home (small brands)"
1436
+ ],
1437
+ "content": "Merchant-supplied people",
1438
+ "itemRange": "founder 1 · grid 3–8",
1439
+ "useWhen": "Founder-led and craft brands with real portraits",
1440
+ "avoidWhen": "Stock photos or invented people",
1441
+ "neighbours": [
1442
+ "image-with-text",
1443
+ "timeline",
1444
+ "testimonials"
1445
+ ]
1446
+ },
1447
+ {
1448
+ "section": "before-after",
1449
+ "purpose": "Visual proof of a change",
1450
+ "pageTypes": [
1451
+ "product",
1452
+ "landing",
1453
+ "about"
1454
+ ],
1455
+ "content": "Aligned image pairs",
1456
+ "itemRange": "1–4",
1457
+ "useWhen": "Repair, beauty, cleaning, renovation results",
1458
+ "avoidWhen": "Unaligned photos; results that need medical or legal claims",
1459
+ "neighbours": [
1460
+ "testimonials",
1461
+ "product-reviews",
1462
+ "featured-product"
1463
+ ]
1464
+ }
1465
+ ],
1466
+ "conflicts": [
1467
+ "page-body.textWidth and article-body.width duplicate shared contentWidth → LEGACY-HIDDEN (saved values keep rendering).",
1468
+ "blog-posts.blog is stored as text; the blog field type exists. Control changes to blog with the same stored handle (CHANGED, no migration).",
1469
+ "blog-posts.filterTags is comma text → NEEDS NEW FIELD TYPE (tag multi-select).",
1470
+ "team-founders and before-after are NEW sections with NEW blocks person and comparison; justification in the blocks table.",
1471
+ "Author photo and bio are not in article data → initials only (DATA REQUIREMENT for richer author)."
1472
+ ]
1473
+ }