efficient-web-builder 44.0.1 → 45.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/CHANGELOG.md +0 -4
  2. package/README.md +8 -0
  3. package/dist/editor/components/BlogPostSource.js +1 -1
  4. package/dist/editor/components/CanvasPartsBridge.js +1 -1
  5. package/dist/editor/components/CardShadowField.js +1 -1
  6. package/dist/editor/components/ChatSettingsPanel.js +1 -1
  7. package/dist/editor/components/FieldGlyph.js +1 -1
  8. package/dist/editor/components/LocationsGroupedField.js +1 -1
  9. package/dist/editor/components/PartInkControl.js +1 -1
  10. package/dist/editor/components/PartSettingsPanel.d.ts +0 -2
  11. package/dist/editor/components/PartSettingsPanel.js +1 -1
  12. package/dist/editor/components/PartTextBox.d.ts +6 -3
  13. package/dist/editor/components/PartTextBox.js +1 -1
  14. package/dist/editor/components/PreviewChatContext.d.ts +1 -2
  15. package/dist/editor/components/PreviewChatContext.js +1 -1
  16. package/dist/editor/components/PreviewPartAnchors.js +1 -1
  17. package/dist/editor/components/SectionIcon.js +1 -1
  18. package/dist/editor/components/SectionThemePicker.js +1 -1
  19. package/dist/editor/components/SectionWidthRows.d.ts +6 -13
  20. package/dist/editor/components/SectionWidthRows.js +1 -1
  21. package/dist/editor/components/SourceStatus.d.ts +2 -1
  22. package/dist/editor/components/SourceStatus.js +1 -1
  23. package/dist/editor/components/ThemeCard.js +1 -1
  24. package/dist/editor/components/ThemeColourField.js +1 -1
  25. package/dist/editor/components/ThemeField.js +1 -1
  26. package/dist/editor/components/TickerSettingsPanel.js +1 -1
  27. package/dist/editor/components/WebsiteScreenParts.js +1 -1
  28. package/dist/editor/components/WebsiteSettingsPanel.js +1 -1
  29. package/dist/editor/components/storefront-editor.css +90 -359
  30. package/dist/editor/components/useHostDocumentBridge.js +1 -1
  31. package/dist/editor/components/useLocationsTree.js +1 -1
  32. package/dist/editor/lib/animation/AnimationDurationRow.d.ts +3 -0
  33. package/dist/editor/lib/animation/AnimationDurationRow.js +1 -0
  34. package/dist/editor/lib/animation/entrance-fields.d.ts +4 -0
  35. package/dist/editor/lib/animation/entrance-fields.js +1 -0
  36. package/dist/editor/lib/animation/fields.d.ts +2 -0
  37. package/dist/editor/lib/animation/fields.js +1 -0
  38. package/dist/editor/lib/animation/loop-fields.d.ts +2 -0
  39. package/dist/editor/lib/animation/loop-fields.js +1 -0
  40. package/dist/editor/lib/document/ColourControl.js +1 -1
  41. package/dist/editor/lib/document/add-palette.js +1 -1
  42. package/dist/editor/lib/document/block-offer.js +1 -1
  43. package/dist/editor/lib/document/block-source-fields.d.ts +1 -1
  44. package/dist/editor/lib/document/block-source-fields.js +1 -1
  45. package/dist/editor/lib/document/blocks/general/Banner/fields.js +1 -1
  46. package/dist/editor/lib/document/blocks/general/Breadcrumb/fields.js +1 -1
  47. package/dist/editor/lib/document/blocks/general/ButtonBlock/fields.js +1 -1
  48. package/dist/editor/lib/document/blocks/general/Cards/fields.js +1 -1
  49. package/dist/editor/lib/document/blocks/general/CategoryBar/fields.js +1 -1
  50. package/dist/editor/lib/document/blocks/general/Chart/fields.js +1 -1
  51. package/dist/editor/lib/document/blocks/general/Divider/fields.js +1 -1
  52. package/dist/editor/lib/document/blocks/general/DocBody/fields.js +1 -1
  53. package/dist/editor/lib/document/blocks/general/DocMasthead/fields.js +1 -1
  54. package/dist/editor/lib/document/blocks/general/DocTabs/fields.js +1 -1
  55. package/dist/editor/lib/document/blocks/general/Eyebrow/fields.js +1 -1
  56. package/dist/editor/lib/document/blocks/general/FAQ/fields.js +1 -1
  57. package/dist/editor/lib/document/blocks/general/FeaturedCover/fields.js +1 -1
  58. package/dist/editor/lib/document/blocks/general/Flex/fields.js +1 -1
  59. package/dist/editor/lib/document/blocks/general/Footprint/fields.js +1 -1
  60. package/dist/editor/lib/document/blocks/general/Grid/fields.js +1 -1
  61. package/dist/editor/lib/document/blocks/general/Heading/fields.js +1 -1
  62. package/dist/editor/lib/document/blocks/general/Hero/fields.js +1 -1
  63. package/dist/editor/lib/document/blocks/general/HeroGroup/fields.js +1 -1
  64. package/dist/editor/lib/document/blocks/general/HeroSingle/fields.js +1 -1
  65. package/dist/editor/lib/document/blocks/general/HeroSlide/fields.js +1 -1
  66. package/dist/editor/lib/document/blocks/general/ImageBlock/fields.js +1 -1
  67. package/dist/editor/lib/document/blocks/general/Integrations/fields.js +2 -2
  68. package/dist/editor/lib/document/blocks/general/IntroBleed/fields.js +1 -1
  69. package/dist/editor/lib/document/blocks/general/KeyFeatures/fields.js +1 -1
  70. package/dist/editor/lib/document/blocks/general/LocationMap/fields.d.ts +10 -0
  71. package/dist/editor/lib/document/blocks/general/LocationMap/fields.js +1 -0
  72. package/dist/editor/lib/document/blocks/general/LogoBlock/fields.js +1 -1
  73. package/dist/editor/lib/document/blocks/general/Logos/fields.js +1 -1
  74. package/dist/editor/lib/document/blocks/general/LongRead/fields.js +1 -1
  75. package/dist/editor/lib/document/blocks/general/Manifesto/fields.js +2 -2
  76. package/dist/editor/lib/document/blocks/general/Masthead/fields.js +1 -1
  77. package/dist/editor/lib/document/blocks/general/Mockup/fields.js +2 -2
  78. package/dist/editor/lib/document/blocks/general/OrderSummary/fields.js +1 -1
  79. package/dist/editor/lib/document/blocks/general/ParagraphsA/fields.js +1 -1
  80. package/dist/editor/lib/document/blocks/general/PaymentBadges/fields.js +1 -1
  81. package/dist/editor/lib/document/blocks/general/PostCard/fields.js +1 -1
  82. package/dist/editor/lib/document/blocks/general/ProcessSteps/fields.js +1 -1
  83. package/dist/editor/lib/document/blocks/general/Prose/fields.js +1 -1
  84. package/dist/editor/lib/document/blocks/general/SectionHeader/fields.js +1 -1
  85. package/dist/editor/lib/document/blocks/general/Series/fields.js +1 -1
  86. package/dist/editor/lib/document/blocks/general/SpecStrip/fields.js +1 -1
  87. package/dist/editor/lib/document/blocks/general/Split/fields.js +1 -1
  88. package/dist/editor/lib/document/blocks/general/Stats/fields.js +1 -1
  89. package/dist/editor/lib/document/blocks/general/StatsParagraph/fields.js +1 -1
  90. package/dist/editor/lib/document/blocks/general/Testimonials/fields.js +1 -1
  91. package/dist/editor/lib/document/blocks/general/Text/fields.js +1 -1
  92. package/dist/editor/lib/document/blocks/general/Ticker/fields.js +1 -1
  93. package/dist/editor/lib/document/blocks/general/Timeline/fields.js +1 -1
  94. package/dist/editor/lib/document/blocks/general/TimelineTrack/fields.js +1 -1
  95. package/dist/editor/lib/document/blocks/general/TitleWithButtons/fields.js +1 -1
  96. package/dist/editor/lib/document/blocks/general/index.d.ts +2 -2
  97. package/dist/editor/lib/document/blocks/general/index.js +1 -1
  98. package/dist/editor/lib/document/blocks/shared-fields.d.ts +3 -4
  99. package/dist/editor/lib/document/blocks/shared-fields.js +1 -1
  100. package/dist/editor/lib/document/box-fields.d.ts +32 -0
  101. package/dist/editor/lib/document/box-fields.js +1 -0
  102. package/dist/editor/lib/document/box-gutter-field.d.ts +1 -0
  103. package/dist/editor/lib/document/box-gutter-field.js +1 -0
  104. package/dist/editor/lib/document/card-row-fields.d.ts +1 -1
  105. package/dist/editor/lib/document/card-row-fields.js +1 -1
  106. package/dist/editor/lib/document/consent-words-field.d.ts +2 -3
  107. package/dist/editor/lib/document/consent-words-field.js +1 -1
  108. package/dist/editor/lib/document/controls.d.ts +34 -94
  109. package/dist/editor/lib/document/controls.js +1 -1
  110. package/dist/editor/lib/document/enclosing-section.d.ts +5 -1
  111. package/dist/editor/lib/document/enclosing-section.js +1 -1
  112. package/dist/editor/lib/document/field-groups.js +1 -1
  113. package/dist/editor/lib/document/general-registry.js +1 -1
  114. package/dist/editor/lib/document/overrides.js +1 -1
  115. package/dist/editor/lib/document/page-root-fields.d.ts +1 -1
  116. package/dist/editor/lib/document/page-root-fields.js +1 -1
  117. package/dist/editor/lib/document/page-root.d.ts +2 -7
  118. package/dist/editor/lib/document/page-root.js +2 -2
  119. package/dist/editor/lib/document/part-anchors.d.ts +0 -1
  120. package/dist/editor/lib/document/part-anchors.js +1 -1
  121. package/dist/editor/lib/document/part-panel-rows.d.ts +75 -0
  122. package/dist/editor/lib/document/part-panel-rows.js +1 -0
  123. package/dist/editor/lib/document/passes/inspector.js +1 -1
  124. package/dist/editor/lib/document/separator-field.d.ts +10 -0
  125. package/dist/editor/lib/document/separator-field.js +1 -0
  126. package/dist/editor/lib/document/shell-glyph.d.ts +2 -0
  127. package/dist/editor/lib/document/shell-glyph.js +1 -0
  128. package/dist/{format → editor}/lib/host-document-bridge.d.ts +1 -3
  129. package/dist/editor/lib/host-document-bridge.js +1 -0
  130. package/dist/editor/lib/pinned-chrome-doc.js +1 -1
  131. package/dist/editor/lib/sections/new-section-node.js +1 -1
  132. package/dist/editor/lib/sections/section-dry-run.d.ts +13 -2
  133. package/dist/editor/lib/sections/section-dry-run.js +2 -2
  134. package/dist/editor/lib/sections/text-layouts.d.ts +6 -0
  135. package/dist/editor/lib/sections/text-layouts.js +1 -0
  136. package/dist/editor/lib/source-rules/part-slider-fills-row.d.ts +1 -0
  137. package/dist/editor/lib/source-rules/part-slider-fills-row.js +5 -5
  138. package/dist/format/lib/animation/index.d.ts +1 -0
  139. package/dist/format/lib/animation/index.js +1 -0
  140. package/dist/format/lib/animation/loop.d.ts +29 -0
  141. package/dist/format/lib/animation/loop.js +1 -0
  142. package/dist/format/lib/content/block-size.d.ts +59 -0
  143. package/dist/format/lib/content/block-size.js +1 -0
  144. package/dist/format/lib/content/box-background.js +1 -1
  145. package/dist/format/lib/content/box-layout.d.ts +16 -37
  146. package/dist/format/lib/content/box-layout.js +1 -1
  147. package/dist/format/lib/content/box-link.d.ts +13 -0
  148. package/dist/format/lib/content/box-link.js +13 -0
  149. package/dist/format/lib/content/box-separator.d.ts +10 -0
  150. package/dist/format/lib/content/box-separator.js +1 -0
  151. package/dist/format/lib/content/box-shape.d.ts +10 -0
  152. package/dist/format/lib/content/box-shape.js +1 -0
  153. package/dist/format/lib/content/button-icon.d.ts +1 -0
  154. package/dist/format/lib/content/button-icon.js +1 -1
  155. package/dist/format/lib/content/card-corners.d.ts +0 -3
  156. package/dist/format/lib/content/card-corners.js +1 -1
  157. package/dist/format/lib/content/card-template.d.ts +2 -0
  158. package/dist/format/lib/content/card-template.js +1 -1
  159. package/dist/format/lib/content/cart-drawer.d.ts +7 -0
  160. package/dist/format/lib/content/cart-drawer.js +1 -1
  161. package/dist/format/lib/content/chat-launcher.js +1 -1
  162. package/dist/format/lib/content/container-gap.d.ts +9 -1
  163. package/dist/format/lib/content/container-gap.js +1 -1
  164. package/dist/format/lib/content/gallery-card-layout.js +1 -1
  165. package/dist/format/lib/content/gallery-layout.d.ts +1 -0
  166. package/dist/format/lib/content/gallery-layout.js +1 -1
  167. package/dist/format/lib/content/page-background.js +1 -1
  168. package/dist/format/lib/content/post-date.d.ts +1 -0
  169. package/dist/format/lib/content/post-date.js +1 -0
  170. package/dist/format/lib/content/scrim.d.ts +1 -0
  171. package/dist/format/lib/content/scrim.js +1 -0
  172. package/dist/format/lib/content/section-min-height.d.ts +4 -0
  173. package/dist/format/lib/content/section-min-height.js +1 -1
  174. package/dist/format/lib/content/section-width.d.ts +2 -18
  175. package/dist/format/lib/content/section-width.js +1 -1
  176. package/dist/format/lib/content/site-gutter.d.ts +11 -1
  177. package/dist/format/lib/content/site-gutter.js +1 -1
  178. package/dist/format/lib/content/tint.d.ts +1 -0
  179. package/dist/format/lib/content/tint.js +1 -0
  180. package/dist/format/lib/document/blocks/block-types.d.ts +0 -1
  181. package/dist/format/lib/document/blocks/general/HeroSingle/meta.js +1 -1
  182. package/dist/format/lib/document/blocks/general/HeroSlide/meta.js +1 -1
  183. package/dist/format/lib/document/blocks/general/IntroBleed/meta.js +1 -1
  184. package/dist/format/lib/document/blocks/general/LocationMap/meta.d.ts +2 -0
  185. package/dist/format/lib/document/blocks/general/LocationMap/meta.js +1 -0
  186. package/dist/format/lib/document/blocks/general/SpecStrip/meta.d.ts +5 -0
  187. package/dist/format/lib/document/blocks/general/SpecStrip/meta.js +1 -1
  188. package/dist/format/lib/document/blocks/general/Ticker/meta.js +1 -1
  189. package/dist/format/lib/document/blocks/general/metas.d.ts +1 -0
  190. package/dist/format/lib/document/blocks/general/metas.js +1 -1
  191. package/dist/format/lib/document/blocks/general/text-part-shapes.json +30 -0
  192. package/dist/format/lib/document/box-footer.d.ts +1 -0
  193. package/dist/format/lib/document/box-footer.js +1 -1
  194. package/dist/format/lib/document/cap-hero-groups.js +1 -1
  195. package/dist/format/lib/document/container-blocks.js +1 -1
  196. package/dist/format/lib/document/editor-site-widths.d.ts +2 -0
  197. package/dist/format/lib/document/editor-site-widths.js +1 -0
  198. package/dist/format/lib/document/general-order.d.ts +1 -1
  199. package/dist/format/lib/document/general-order.js +1 -1
  200. package/dist/format/lib/document/part-inks.js +1 -1
  201. package/dist/format/lib/document/passes/document-position.js +1 -1
  202. package/dist/format/lib/document/passes/settings-groups.js +1 -1
  203. package/dist/format/lib/document/passes/types.d.ts +10 -5
  204. package/dist/format/lib/document/renamed-props.js +1 -1
  205. package/dist/format/lib/document/section-catalog.js +2 -2
  206. package/dist/format/lib/editor-words-catalogue.d.ts +32 -31
  207. package/dist/format/lib/editor-words-catalogue.js +6 -6
  208. package/dist/format/lib/fit-words.js +77 -18
  209. package/dist/format/lib/fonts.d.ts +1 -0
  210. package/dist/format/lib/fonts.js +1 -1
  211. package/dist/format/lib/hero-group-placement.js +1 -1
  212. package/dist/format/lib/hero-texture.d.ts +1 -1
  213. package/dist/format/lib/hero-texture.js +1 -1
  214. package/dist/format/lib/locations-grid.d.ts +1 -0
  215. package/dist/format/lib/locations-grid.js +1 -1
  216. package/dist/format/lib/map-styles.d.ts +0 -1
  217. package/dist/format/lib/map-styles.js +1 -1
  218. package/dist/format/lib/popup/look.js +1 -1
  219. package/dist/format/lib/popup/text-kinds.d.ts +0 -1
  220. package/dist/format/lib/popup/text-kinds.js +1 -1
  221. package/dist/format/lib/sections/hero-overlay.d.ts +1 -1
  222. package/dist/format/lib/sections/hero-overlay.js +1 -1
  223. package/dist/format/lib/sections/section-head-placement.d.ts +0 -4
  224. package/dist/format/lib/sections/section-head-placement.js +1 -1
  225. package/dist/format/lib/sections/section-presets.js +1 -1
  226. package/dist/format/lib/sections/strip-shape.d.ts +16 -0
  227. package/dist/format/lib/sections/strip-shape.js +1 -0
  228. package/dist/format/lib/sections/timeline-year-shape.d.ts +4 -0
  229. package/dist/format/lib/sections/timeline-year-shape.js +1 -0
  230. package/dist/format/lib/source-rules/box-fields-from-easel.d.ts +4 -0
  231. package/dist/format/lib/source-rules/box-fields-from-easel.js +8 -0
  232. package/dist/format/lib/source-rules/editor-chrome-note.js +1 -1
  233. package/dist/format/lib/source-rules/editor-words.js +2 -2
  234. package/dist/format/lib/source-rules/no-glyph-rows.d.ts +0 -4
  235. package/dist/format/lib/source-rules/no-glyph-rows.js +4 -4
  236. package/dist/format/lib/source-rules/one-loop-module.d.ts +7 -0
  237. package/dist/format/lib/source-rules/one-loop-module.js +6 -0
  238. package/dist/format/lib/source-rules/one-node-list.d.ts +2 -0
  239. package/dist/format/lib/source-rules/one-node-list.js +1 -0
  240. package/dist/format/lib/source-rules/one-page-theme-reader.d.ts +6 -0
  241. package/dist/format/lib/source-rules/one-page-theme-reader.js +6 -0
  242. package/dist/format/lib/source-rules/part-style-naming.js +1 -1
  243. package/dist/format/lib/source-rules/shell-width-token-not-colour.d.ts +5 -0
  244. package/dist/format/lib/source-rules/shell-width-token-not-colour.js +2 -0
  245. package/dist/format/lib/source-rules/site-square-by-default.js +3 -3
  246. package/dist/format/lib/source-rules/support/panel-select-cascade.js +2 -2
  247. package/dist/format/lib/theme.d.ts +3 -0
  248. package/dist/format/lib/theme.js +4 -4
  249. package/dist/render/components/Banner.js +1 -1
  250. package/dist/render/components/ButtonBlock.d.ts +1 -0
  251. package/dist/render/components/ButtonBlock.js +1 -1
  252. package/dist/render/components/CardRowContext.d.ts +4 -4
  253. package/dist/render/components/CardRowContext.js +1 -1
  254. package/dist/render/components/Cards.d.ts +1 -0
  255. package/dist/render/components/Cards.js +1 -1
  256. package/dist/render/components/ContactLocations.js +2 -14
  257. package/dist/render/components/FeaturedCover.js +1 -1
  258. package/dist/render/components/Flex.d.ts +19 -1
  259. package/dist/render/components/Flex.js +1 -1
  260. package/dist/render/components/Grid.js +1 -1
  261. package/dist/render/components/Heading.d.ts +1 -0
  262. package/dist/render/components/Heading.js +1 -1
  263. package/dist/render/components/HeroSection.js +1 -1
  264. package/dist/render/components/HeroSingle.js +1 -1
  265. package/dist/render/components/HeroSlide.js +1 -1
  266. package/dist/render/components/HeroVideoPlay.js +1 -1
  267. package/dist/render/components/ImageBlock.d.ts +1 -2
  268. package/dist/render/components/ImageBlock.js +1 -1
  269. package/dist/render/components/InBoxContext.d.ts +2 -0
  270. package/dist/render/components/InBoxContext.js +1 -0
  271. package/dist/render/components/KeyFeatures.js +1 -1
  272. package/dist/render/components/LocationMap.d.ts +23 -0
  273. package/dist/render/components/LocationMap.js +1 -0
  274. package/dist/render/components/Logo.js +1 -1
  275. package/dist/render/components/LongRead.js +1 -1
  276. package/dist/render/components/Manifesto.d.ts +2 -1
  277. package/dist/render/components/Manifesto.js +1 -1
  278. package/dist/render/components/PreviewHeaderContext.d.ts +1 -4
  279. package/dist/render/components/PreviewHeaderContext.js +1 -1
  280. package/dist/render/components/PreviewLocationPartContext.d.ts +1 -1
  281. package/dist/render/components/PreviewLocationPartContext.js +1 -1
  282. package/dist/render/components/ProcessSteps.js +1 -1
  283. package/dist/render/components/SectionAnimation.d.ts +16 -3
  284. package/dist/render/components/SectionAnimation.js +1 -1
  285. package/dist/render/components/SiteGutterFrame.d.ts +7 -1
  286. package/dist/render/components/SiteGutterFrame.js +1 -1
  287. package/dist/render/components/SiteMap.js +1 -1
  288. package/dist/render/components/SpecStrip.d.ts +2 -4
  289. package/dist/render/components/SpecStrip.js +1 -1
  290. package/dist/render/components/Split.d.ts +2 -1
  291. package/dist/render/components/Split.js +1 -1
  292. package/dist/render/components/Text.d.ts +2 -0
  293. package/dist/render/components/Text.js +1 -1
  294. package/dist/render/components/Ticker.d.ts +5 -4
  295. package/dist/render/components/Ticker.js +1 -1
  296. package/dist/render/components/TickerSection.d.ts +5 -4
  297. package/dist/render/components/TickerSection.js +1 -1
  298. package/dist/render/components/Timeline.js +1 -1
  299. package/dist/render/components/TimelineRail.d.ts +55 -0
  300. package/dist/render/components/TimelineRail.js +1 -0
  301. package/dist/render/components/TimelineTrack.js +1 -1
  302. package/dist/render/components/goldPhrases.js +1 -1
  303. package/dist/render/lib/animation/LoopTrack.d.ts +14 -0
  304. package/dist/render/lib/animation/LoopTrack.js +1 -0
  305. package/dist/render/lib/animation/entrance.d.ts +18 -0
  306. package/dist/render/lib/animation/entrance.js +1 -0
  307. package/dist/render/lib/document/blocks/general/ButtonBlock/render.js +1 -1
  308. package/dist/render/lib/document/blocks/general/Flex/render.js +1 -1
  309. package/dist/render/lib/document/blocks/general/ImageBlock/render.js +1 -1
  310. package/dist/render/lib/document/blocks/general/LocationMap/render.d.ts +2 -0
  311. package/dist/render/lib/document/blocks/general/LocationMap/render.js +1 -0
  312. package/dist/render/lib/document/blocks/general/Manifesto/render.js +1 -1
  313. package/dist/render/lib/document/blocks/general/SectionHeader/render.js +1 -1
  314. package/dist/render/lib/document/blocks/general/Split/render.js +1 -1
  315. package/dist/render/lib/document/blocks/general/Text/render.js +1 -1
  316. package/dist/render/lib/document/blocks/general/Ticker/render.js +1 -1
  317. package/dist/render/lib/document/blocks/general/renders.d.ts +1 -0
  318. package/dist/render/lib/document/blocks/general/renders.js +1 -1
  319. package/dist/render/lib/document/blocks/general/section-head-looks.d.ts +9 -0
  320. package/dist/render/lib/document/blocks/general/section-head-looks.js +2 -0
  321. package/dist/render/lib/document/blocks/general/section-to-box-row-parts.d.ts +9 -1
  322. package/dist/render/lib/document/blocks/general/section-to-box-row-parts.js +1 -1
  323. package/dist/render/lib/document/blocks/general/section-to-box-rows-cards.d.ts +2 -0
  324. package/dist/render/lib/document/blocks/general/section-to-box-rows-cards.js +1 -0
  325. package/dist/render/lib/document/blocks/general/section-to-box-rows-head.d.ts +4 -0
  326. package/dist/render/lib/document/blocks/general/section-to-box-rows-head.js +1 -0
  327. package/dist/render/lib/document/blocks/general/section-to-box-rows-locations.d.ts +2 -0
  328. package/dist/render/lib/document/blocks/general/section-to-box-rows-locations.js +1 -0
  329. package/dist/render/lib/document/blocks/general/section-to-box-rows-logos.js +1 -1
  330. package/dist/render/lib/document/blocks/general/section-to-box-rows-stats.js +1 -1
  331. package/dist/render/lib/document/blocks/general/section-to-box-rows-strip.d.ts +2 -0
  332. package/dist/render/lib/document/blocks/general/section-to-box-rows-strip.js +1 -0
  333. package/dist/render/lib/document/blocks/general/section-to-box-rows-timeline.d.ts +2 -0
  334. package/dist/render/lib/document/blocks/general/section-to-box-rows-timeline.js +3 -0
  335. package/dist/render/lib/document/blocks/general/section-to-box-rows.js +1 -1
  336. package/dist/render/lib/document/page-frame.d.ts +3 -21
  337. package/dist/render/lib/document/page-frame.js +1 -1
  338. package/dist/render/lib/document/part-styles.d.ts +14 -13
  339. package/dist/render/lib/document/part-styles.js +2 -2
  340. package/dist/render/lib/document/passes/block-size.d.ts +3 -0
  341. package/dist/render/lib/document/passes/block-size.js +1 -0
  342. package/dist/render/lib/document/passes/cell-width.d.ts +1 -0
  343. package/dist/render/lib/document/passes/cell-width.js +1 -1
  344. package/dist/render/lib/document/passes/clickable-parts.js +1 -1
  345. package/dist/render/lib/document/passes/corners.js +1 -1
  346. package/dist/render/lib/document/passes/index.js +1 -1
  347. package/dist/render/lib/document/passes/section-anchor.d.ts +1 -0
  348. package/dist/render/lib/document/passes/section-anchor.js +1 -1
  349. package/dist/render/lib/document/passes/section-animation.d.ts +1 -0
  350. package/dist/render/lib/document/passes/section-animation.js +1 -1
  351. package/dist/render/lib/document/passes/section-padding.js +1 -1
  352. package/dist/render/lib/document/passes/section-width.d.ts +1 -4
  353. package/dist/render/lib/document/passes/section-width.js +1 -1
  354. package/dist/render/lib/sections/section-to-box.d.ts +28 -7
  355. package/dist/render/lib/sections/section-to-box.js +1 -1
  356. package/dist/render/lib/text-styles/site-text-styles.js +2 -2
  357. package/package.json +5 -5
  358. package/dist/editor/components/PartResetDot.d.ts +0 -5
  359. package/dist/editor/components/PartResetDot.js +0 -1
  360. package/dist/editor/lib/document/section-width-fields.d.ts +0 -2
  361. package/dist/editor/lib/document/section-width-fields.js +0 -1
  362. package/dist/format/lib/content/image-width.d.ts +0 -9
  363. package/dist/format/lib/content/image-width.js +0 -1
  364. package/dist/format/lib/content/section-animation.d.ts +0 -13
  365. package/dist/format/lib/content/section-animation.js +0 -1
  366. package/dist/format/lib/host-document-bridge.js +0 -1
  367. package/dist/format/lib/sections/ticker-scroll.d.ts +0 -11
  368. package/dist/format/lib/sections/ticker-scroll.js +0 -1
@@ -1 +1 @@
1
- const l=[{key:"space-grotesk",label:"Space Grotesk",cssVar:"--font-display",category:"sans",italic:!1,italicLoaded:!1},{key:"inter",label:"Inter",cssVar:"--font-body",category:"sans",italic:!0,italicLoaded:!0},{key:"poppins",label:"Poppins",cssVar:"--font-poppins",category:"sans",italic:!0,italicLoaded:!0},{key:"dm-sans",label:"DM Sans",cssVar:"--font-dm-sans",category:"sans",italic:!0,italicLoaded:!0},{key:"sora",label:"Sora",cssVar:"--font-sora",category:"sans",italic:!1,italicLoaded:!1},{key:"oswald",label:"Oswald",cssVar:"--font-oswald",category:"sans",italic:!1,italicLoaded:!1},{key:"archivo",label:"Archivo",cssVar:"--font-archivo",category:"sans",italic:!0,italicLoaded:!0},{key:"outfit",label:"Outfit",cssVar:"--font-outfit",category:"sans",italic:!1,italicLoaded:!1},{key:"manrope",label:"Manrope",cssVar:"--font-manrope",category:"sans",italic:!1,italicLoaded:!1},{key:"big-shoulders",label:"Big Shoulders",cssVar:"--font-big-shoulders",category:"sans",italic:!1,italicLoaded:!1},{key:"michroma",label:"Michroma",cssVar:"--font-michroma",category:"sans",italic:!1,italicLoaded:!1},{key:"assistant",label:"Assistant",cssVar:"--font-assistant",category:"sans",italic:!1,italicLoaded:!1},{key:"fraunces",label:"Fraunces",cssVar:"--font-serif",category:"serif",italic:!0,italicLoaded:!0},{key:"playfair-display",label:"Playfair Display",cssVar:"--font-playfair",category:"serif",italic:!0,italicLoaded:!0},{key:"cormorant",label:"Cormorant",cssVar:"--font-cormorant",category:"serif",italic:!0,italicLoaded:!0},{key:"jetbrains-mono",label:"JetBrains Mono",cssVar:"--font-mono-loaded",category:"mono",italic:!0,italicLoaded:!0}],n=new Map(l.map(e=>[e.key,e])),g={sans:"Sans",serif:"Serif",mono:"Mono"};function m(){return Object.keys(g).map(e=>[e,l.filter(t=>t.category===e)]).filter(([,e])=>e.length>0)}function S(e){return n.get(e)?.italic??!1}function O(e){return n.get(e)?.italicLoaded??!1}function _(e){return n.get(e)}const c=["heading","heading2","heading3","body","accent","label"],k={heading:"Heading 1",heading2:"Heading 2",heading3:"Heading 3",body:"Body",accent:"Accent",label:"Labels"},u=[["font-heading2","heading2"],["font-heading3","heading3"],["font-display","heading"],["font-serif","accent"],["font-mono","label"],["font-body","body"]],y=/var\(--size-(headingLarge|headingMedium|headingSmall|accent|body|label)\s*,/,x={heading:"headingLarge",heading2:"headingMedium",heading3:"headingSmall",accent:"accent",body:"body",label:"label"},p={headingLarge:"heading",headingMedium:"heading2",headingSmall:"heading3",accent:"accent",body:"body",label:"label"};function V(e){const t=e?y.exec(e):null;return t?p[t[1]]??null:h(e)}function h(e){if(!e)return null;const t=e.split(/\s+/).filter(a=>!a.slice(0,a.lastIndexOf(":")+1).includes("&")).map(a=>a.slice(a.lastIndexOf(":")+1));for(const[a,i]of u)if(t.includes(a))return i;return null}const E=["heading","heading2","heading3"],b=["font-display","font-heading2","font-heading3"];function I(e){if(!e)return!1;const t=e.split(/\s+/).filter(a=>!a.slice(0,a.lastIndexOf(":")+1).includes("&")).map(a=>a.slice(a.lastIndexOf(":")+1));return b.some(a=>t.includes(a))}const s={heading:"space-grotesk",heading2:"space-grotesk",heading3:"space-grotesk",body:"inter",accent:"fraunces",label:"jetbrains-mono"};function d(e){const t=a=>{const i=e?.[a];if(i&&n.has(i))return i;if(a==="heading2"||a==="heading3"){const r=e?.heading;return r&&n.has(r)?r:s.heading}return s[a]};return Object.fromEntries(c.map(a=>[a,t(a)]))}function f(e,t){return n.get(e[t])??n.get(s[t])}function o(e,t){return`var(${f(e,t).cssVar})`}function T(e){const t=d(e);return[...new Set([...L,...c.map(a=>f(t,a).cssVar)])]}const L=[...new Set(c.map(e=>n.get(s[e]).cssVar))],F=[...new Set(l.map(e=>e.cssVar))];function A(e){const t=d(e);return{"--font-role-heading":o(t,"heading"),"--font-role-heading2":o(t,"heading2"),"--font-role-heading3":o(t,"heading3"),"--font-role-body":o(t,"body"),"--font-role-accent":o(t,"accent"),"--font-role-label":o(t,"label"),fontFamily:"var(--font-role-body)"}}export{F as ALL_FONT_CSS_VARS,s as DEFAULT_FONTS,g as FONT_CATEGORY_LABELS,l as FONT_OPTIONS,c as FONT_ROLES,k as FONT_ROLE_LABELS,b as HEADING_FACE_UTILITIES,E as HEADING_FONT_ROLES,L as ROOT_FALLBACK_CSS_VARS,x as SIZE_STEP_OF_ROLE,I as drawsHeadingFace,S as fontHasItalic,O as fontItalicIsUsable,_ as fontOption,h as fontRoleOfClassName,A as fontRoleStyle,m as fontsByCategory,d as normalizeFonts,T as siteFontCssVars,V as styleRoleOfClassName};
1
+ const c=[{key:"space-grotesk",label:"Space Grotesk",cssVar:"--font-display",category:"sans",italic:!1,italicLoaded:!1},{key:"inter",label:"Inter",cssVar:"--font-body",category:"sans",italic:!0,italicLoaded:!0},{key:"poppins",label:"Poppins",cssVar:"--font-poppins",category:"sans",italic:!0,italicLoaded:!0},{key:"dm-sans",label:"DM Sans",cssVar:"--font-dm-sans",category:"sans",italic:!0,italicLoaded:!0},{key:"sora",label:"Sora",cssVar:"--font-sora",category:"sans",italic:!1,italicLoaded:!1},{key:"oswald",label:"Oswald",cssVar:"--font-oswald",category:"sans",italic:!1,italicLoaded:!1},{key:"archivo",label:"Archivo",cssVar:"--font-archivo",category:"sans",italic:!0,italicLoaded:!0},{key:"outfit",label:"Outfit",cssVar:"--font-outfit",category:"sans",italic:!1,italicLoaded:!1},{key:"manrope",label:"Manrope",cssVar:"--font-manrope",category:"sans",italic:!1,italicLoaded:!1},{key:"big-shoulders",label:"Big Shoulders",cssVar:"--font-big-shoulders",category:"sans",italic:!1,italicLoaded:!1},{key:"michroma",label:"Michroma",cssVar:"--font-michroma",category:"sans",italic:!1,italicLoaded:!1},{key:"assistant",label:"Assistant",cssVar:"--font-assistant",category:"sans",italic:!1,italicLoaded:!1},{key:"fraunces",label:"Fraunces",cssVar:"--font-serif",category:"serif",italic:!0,italicLoaded:!0},{key:"playfair-display",label:"Playfair Display",cssVar:"--font-playfair",category:"serif",italic:!0,italicLoaded:!0},{key:"cormorant",label:"Cormorant",cssVar:"--font-cormorant",category:"serif",italic:!0,italicLoaded:!0},{key:"jetbrains-mono",label:"JetBrains Mono",cssVar:"--font-mono-loaded",category:"mono",italic:!0,italicLoaded:!0}],n=new Map(c.map(e=>[e.key,e])),g={sans:"Sans",serif:"Serif",mono:"Mono"};function m(){return Object.keys(g).map(e=>[e,c.filter(t=>t.category===e)]).filter(([,e])=>e.length>0)}function O(e){return n.get(e)?.italic??!1}function S(e){return n.get(e)?.italicLoaded??!1}function _(e){return n.get(e)}const s=["heading","heading2","heading3","body","accent","label"];function x(e){return typeof e=="string"&&s.includes(e)?e:null}const k={heading:"Heading 1",heading2:"Heading 2",heading3:"Heading 3",body:"Body",accent:"Accent",label:"Labels"},u=[["font-heading2","heading2"],["font-heading3","heading3"],["font-display","heading"],["font-serif","accent"],["font-mono","label"],["font-body","body"]],y=/var\(--size-(headingLarge|headingMedium|headingSmall|accent|body|label)\s*,/,V={heading:"headingLarge",heading2:"headingMedium",heading3:"headingSmall",accent:"accent",body:"body",label:"label"},p={headingLarge:"heading",headingMedium:"heading2",headingSmall:"heading3",accent:"accent",body:"body",label:"label"};function E(e){const t=e?y.exec(e):null;return t?p[t[1]]??null:h(e)}function h(e){if(!e)return null;const t=e.split(/\s+/).filter(a=>!a.slice(0,a.lastIndexOf(":")+1).includes("&")).map(a=>a.slice(a.lastIndexOf(":")+1));for(const[a,i]of u)if(t.includes(a))return i;return null}const I=["heading","heading2","heading3"],b=["font-display","font-heading2","font-heading3"];function T(e){if(!e)return!1;const t=e.split(/\s+/).filter(a=>!a.slice(0,a.lastIndexOf(":")+1).includes("&")).map(a=>a.slice(a.lastIndexOf(":")+1));return b.some(a=>t.includes(a))}const r={heading:"space-grotesk",heading2:"space-grotesk",heading3:"space-grotesk",body:"inter",accent:"fraunces",label:"jetbrains-mono"};function d(e){const t=a=>{const i=e?.[a];if(i&&n.has(i))return i;if(a==="heading2"||a==="heading3"){const l=e?.heading;return l&&n.has(l)?l:r.heading}return r[a]};return Object.fromEntries(s.map(a=>[a,t(a)]))}function f(e,t){return n.get(e[t])??n.get(r[t])}function o(e,t){return`var(${f(e,t).cssVar})`}function F(e){const t=d(e);return[...new Set([...L,...s.map(a=>f(t,a).cssVar)])]}const L=[...new Set(s.map(e=>n.get(r[e]).cssVar))],A=[...new Set(c.map(e=>e.cssVar))];function R(e){const t=d(e);return{"--font-role-heading":o(t,"heading"),"--font-role-heading2":o(t,"heading2"),"--font-role-heading3":o(t,"heading3"),"--font-role-body":o(t,"body"),"--font-role-accent":o(t,"accent"),"--font-role-label":o(t,"label"),fontFamily:"var(--font-role-body)"}}export{A as ALL_FONT_CSS_VARS,r as DEFAULT_FONTS,g as FONT_CATEGORY_LABELS,c as FONT_OPTIONS,s as FONT_ROLES,k as FONT_ROLE_LABELS,b as HEADING_FACE_UTILITIES,I as HEADING_FONT_ROLES,L as ROOT_FALLBACK_CSS_VARS,V as SIZE_STEP_OF_ROLE,T as drawsHeadingFace,O as fontHasItalic,S as fontItalicIsUsable,_ as fontOption,x as fontRoleOf,h as fontRoleOfClassName,R as fontRoleStyle,m as fontsByCategory,d as normalizeFonts,F as siteFontCssVars,E as styleRoleOfClassName};
@@ -1 +1 @@
1
- const u=["top-left","top-center","top-right","left","center","right","bottom-left","bottom-center","bottom-right"],E="bottom-left",U=4,b=5,A=40,D=30,g=100,M=60,N=100,S=["left","center","right"],l={"top-left":"Top left","top-center":"Top center","top-right":"Top right",left:"Left",center:"Center",right:"Right","bottom-left":"Bottom left","bottom-center":"Bottom center","bottom-right":"Bottom right"};function H(t){const e=u.indexOf(i(t));return{band:Math.floor(e/3),column:["start","center","end"][e%3]}}function P(t){return 1+H(t).band*6}function y(t){return P(t)+1}function i(t){return u.includes(t)?t:E}function I(t){const e=typeof t=="number"&&Number.isFinite(t)?t:0;return Math.max(-40,Math.min(40,Math.round(e)))}function L(t,e=60){const o=typeof t=="number"&&Number.isFinite(t)?t:e;return Math.max(30,Math.min(100,Math.round(o)))}function f(t,e){const o=i(e);return t.filter(n=>i(n?.props?.placement)===o).length}function h(t){return`${l[i(t)]} already holds 4 boxes. Move one somewhere else first.`}function C(t,e){const o=t.filter(n=>n?.props?.id!==e);return u.map(n=>{const r=f(o,n)>=4,c=l[n];return r?{value:n,label:c,disabled:!0,title:h(n)}:{value:n,label:c}})}function a(t,e){const o=e===void 0?E:i(e?.props?.placement);return f(t,o)>=4?h(o):null}const T="HeroGroup";function w(t){const e=new Map;let o=!1;const n=t.filter(r=>{const c=i(r?.props?.placement),s=(e.get(c)??0)+1;return e.set(c,s),s<=4?!0:(o=!0,!1)});return o?n:t}function d(t){return u.map(e=>{const o=f(t,e);return{anchor:e,total:o,hidden:o-4}}).filter(e=>e.hidden>0)}function W(t){const e=d(t);return e.length===0?null:e.map(({anchor:o,total:n,hidden:r})=>{const c=l[o],s=r===1?"1 is not shown":`${r} are not shown`;return`${c} holds ${n} boxes. The published page draws the first 4, so ${s}. ${r===1?"Move it":"Move them"} somewhere else.`}).join(" ")}function B(t,e){const o=e;if(o?.type!==T)return null;const n=o.props?.id===void 0?"":String(o.props.id);return n?a(m(t,n),o):null}function K(t,e){return O(t,e)?.siblings??null}function m(t,e){const o=O(t,e);return o&&o.ownerType===G?o.siblings:[]}function $(t,e){const o=O(t,e);return o?o.ancestorTypes.filter(n=>n===T).length:x}const x=1,G="HeroSlide";function O(t,e){const o=r=>Array.isArray(r)&&r.length>0&&r.every(c=>!!c&&typeof c=="object"&&typeof c.type=="string"),n=(r,c,s)=>{if(c>12||!r||typeof r!="object")return null;if(o(r)){if(r.some(p=>p?.props?.id===e))return{siblings:r,ownerType:s.at(-1)??null,ancestorTypes:s};for(const p of r){const _=p.type,R=n(p,c+1,[...s,String(_)]);if(R)return R}return null}for(const p of Object.values(r)){const _=n(p,c+1,s);if(_)return _}return null};return n(t,0,[])}export{S as HERO_COPY_ALIGNMENTS,b as HERO_GROUP_BAND_ROWS,A as HERO_GROUP_NUDGE_LIMIT,u as HERO_GROUP_PLACEMENTS,E as HERO_GROUP_PLACEMENT_DEFAULT,l as HERO_GROUP_PLACEMENT_LABELS,U as HERO_GROUP_STACK_DEPTH,T as HERO_GROUP_TYPE,M as HERO_GROUP_WIDTH_DEFAULT,g as HERO_GROUP_WIDTH_MAX,D as HERO_GROUP_WIDTH_MIN,N as HERO_GROUP_WIDTH_NESTED_DEFAULT,G as HERO_SLIDE_TYPE,h as anchorFullReason,m as anchorSiblingsOf,I as clampNudge,L as clampWidth,P as copyRow,f as countAtAnchor,B as duplicateBlocked,a as heroGroupAddBlocked,$ as heroGroupNestDepth,W as heroGroupOverCapNotice,i as normalisePlacement,d as overCapAnchors,H as placementParts,C as placementPoints,y as placementRow,w as publishableGroups,K as siblingsOf};
1
+ import{isNodeList as O}from"efficient-easel/data";const l=["top-left","top-center","top-right","left","center","right","bottom-left","bottom-center","bottom-right"],d="bottom-left",i=4,R=i+1,a=40,b=30,T=100,P=60,D=100,y=["left","center","right"],f={"top-left":"Top left","top-center":"Top center","top-right":"Top right",left:"Left",center:"Center",right:"Right","bottom-left":"Bottom left","bottom-center":"Bottom center","bottom-right":"Bottom right"};function g(t){const e=l.indexOf(p(t));return{band:Math.floor(e/3),column:["start","center","end"][e%3]}}function H(t){return 1+g(t).band*(R+1)}function S(t){return H(t)+1}function p(t){return l.includes(t)?t:d}function w(t){const e=typeof t=="number"&&Number.isFinite(t)?t:0;return Math.max(-a,Math.min(a,Math.round(e)))}function I(t,e=P){const o=typeof t=="number"&&Number.isFinite(t)?t:e;return Math.max(b,Math.min(T,Math.round(o)))}function h(t,e){const o=p(e);return t.filter(n=>p(n?.props?.placement)===o).length}function x(t){return`${f[p(t)]} already holds ${i} boxes. Move one somewhere else first.`}function C(t,e){const o=t.filter(n=>n?.props?.id!==e);return l.map(n=>{const c=h(o,n)>=i,r=f[n];return c?{value:n,label:r,disabled:!0,title:x(n)}:{value:n,label:r}})}function G(t,e){const o=e===void 0?d:p(e?.props?.placement);return h(t,o)>=i?x(o):null}const E="HeroGroup";function $(t){const e=new Map;let o=!1;const n=t.filter(c=>{const r=p(c?.props?.placement),s=(e.get(r)??0)+1;return e.set(r,s),s<=i?!0:(o=!0,!1)});return o?n:t}function M(t){return l.map(e=>{const o=h(t,e);return{anchor:e,total:o,hidden:o-i}}).filter(e=>e.hidden>0)}function B(t){const e=M(t);return e.length===0?null:e.map(({anchor:o,total:n,hidden:c})=>{const r=f[o],s=c===1?"1 is not shown":`${c} are not shown`;return`${r} holds ${n} boxes. The published page draws the first ${i}, so ${s}. ${c===1?"Move it":"Move them"} somewhere else.`}).join(" ")}function F(t,e){const o=e;if(o?.type!==E)return null;const n=o.props?.id===void 0?"":String(o.props.id);return n?G(A(t,n),o):null}function W(t,e){return m(t,e)?.siblings??null}function A(t,e){const o=m(t,e);return o&&o.ownerType===U?o.siblings:[]}function j(t,e){const o=m(t,e);return o?o.ancestorTypes.filter(n=>n===E).length:N}const N=1,U="HeroSlide";function m(t,e){const o=(n,c,r)=>{if(c>12||!n||typeof n!="object")return null;if(O(n)){if(n.some(s=>s?.props?.id===e))return{siblings:n,ownerType:r.at(-1)??null,ancestorTypes:r};for(const s of n){const u=s.type,_=o(s,c+1,[...r,String(u)]);if(_)return _}return null}for(const s of Object.values(n)){const u=o(s,c+1,r);if(u)return u}return null};return o(t,0,[])}export{y as HERO_COPY_ALIGNMENTS,R as HERO_GROUP_BAND_ROWS,a as HERO_GROUP_NUDGE_LIMIT,l as HERO_GROUP_PLACEMENTS,d as HERO_GROUP_PLACEMENT_DEFAULT,f as HERO_GROUP_PLACEMENT_LABELS,i as HERO_GROUP_STACK_DEPTH,E as HERO_GROUP_TYPE,P as HERO_GROUP_WIDTH_DEFAULT,T as HERO_GROUP_WIDTH_MAX,b as HERO_GROUP_WIDTH_MIN,D as HERO_GROUP_WIDTH_NESTED_DEFAULT,U as HERO_SLIDE_TYPE,x as anchorFullReason,A as anchorSiblingsOf,w as clampNudge,I as clampWidth,H as copyRow,h as countAtAnchor,F as duplicateBlocked,G as heroGroupAddBlocked,j as heroGroupNestDepth,B as heroGroupOverCapNotice,p as normalisePlacement,M as overCapAnchors,g as placementParts,C as placementPoints,S as placementRow,$ as publishableGroups,W as siblingsOf};
@@ -1,4 +1,4 @@
1
1
  export declare const HERO_TEXTURE_SHOWN_DEFAULT = true;
2
- export declare const HERO_TEXTURE_COLOUR_DEFAULT = "#0A0A0A";
2
+ export declare const HERO_TEXTURE_COLOUR_DEFAULT: "#000000";
3
3
  export declare function heroTextureShown(shown?: unknown): boolean;
4
4
  export declare function heroTextureGradient(colour?: string): string;
@@ -1 +1 @@
1
- import{hexToRgb as u}from"efficient-shell/format";const s=!0,c="#0A0A0A",i=[[0,".5"],[30,".1"],[60,".1"],[100,".85"]];function t(n){const e=u(n);return e?`${e.r},${e.g},${e.b}`:null}function a(n){return n==null?s:n!==!1}function p(n){const e=(n?t(n):null)??t(c);return`linear-gradient(180deg, ${i.map(([r,o])=>`rgba(${e},${o}) ${r}%`).join(", ")})`}export{c as HERO_TEXTURE_COLOUR_DEFAULT,s as HERO_TEXTURE_SHOWN_DEFAULT,p as heroTextureGradient,a as heroTextureShown};
1
+ import{hexToRgb as T}from"efficient-shell/format";import{DEFAULT_TINT as e}from"./content/tint.js";const s=!0,E=e,c=[[0,".5"],[30,".1"],[60,".1"],[100,".85"]];function r(n){const t=T(n);return t?`${t.r},${t.g},${t.b}`:null}function a(n){return n==null?s:n!==!1}function f(n){const t=(n?r(n):null)??r(e);return`linear-gradient(180deg, ${c.map(([o,u])=>`rgba(${t},${u}) ${o}%`).join(", ")})`}export{E as HERO_TEXTURE_COLOUR_DEFAULT,s as HERO_TEXTURE_SHOWN_DEFAULT,f as heroTextureGradient,a as heroTextureShown};
@@ -8,3 +8,4 @@ export interface LocationGroup<T> {
8
8
  }
9
9
  export declare function bucketByGroup<T>(rows: T[], getGroup: (row: T) => string, getName: (row: T) => string): LocationGroup<T>[];
10
10
  export declare function groupColsClass(count: number): string;
11
+ export declare function groupColumns(count: number): number;
@@ -1 +1 @@
1
- function l(r,s,o){const e=[];return r.forEach((i,u)=>{const n=s(i);let t=e.find(c=>c.key===n);t||(t={key:n,name:o(i),items:[]},e.push(t)),t.items.push({item:i,index:u})}),e}function f(r){if(r<=1)return"grid-cols-1";if(r===2)return"grid-cols-2";if(r===3)return"grid-cols-3";if(r===4)return"grid-cols-4";const s=o=>r%o||o;return s(4)>=s(3)?"grid-cols-4":"grid-cols-3"}export{l as bucketByGroup,f as groupColsClass};
1
+ function p(r,o,t){const n=[];return r.forEach((e,c)=>{const u=o(e);let s=n.find(i=>i.key===u);s||(s={key:u,name:t(e),items:[]},n.push(s)),s.items.push({item:e,index:c})}),n}function g(r){return l[f(r)]}const l={1:"grid-cols-1",2:"grid-cols-2",3:"grid-cols-3",4:"grid-cols-4"};function f(r){if(r<=1)return 1;if(r<=4)return r;const o=t=>r%t||t;return o(4)>=o(3)?4:3}export{p as bucketByGroup,g as groupColsClass,f as groupColumns};
@@ -1,5 +1,4 @@
1
1
  export type MapThemeMode = "auto" | "dark" | "light";
2
2
  export declare function mapModeIsLight(mode?: MapThemeMode): boolean;
3
- export declare function watchMapTheme(onChange: () => void): () => void;
4
3
  export declare function hasMapCoords(lat: number, lng: number): boolean;
5
4
  export declare function mapCoordOfText(value: string | undefined): number;
@@ -1 +1 @@
1
- function n(){return typeof document>"u"?!1:document.documentElement.getAttribute("data-theme")==="light"}function r(e="auto"){return e==="light"?!0:e==="dark"?!1:n()}function u(e){if(typeof document>"u")return()=>{};const t=new MutationObserver(e);return t.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>t.disconnect()}function i(e,t){return Number.isFinite(e)&&Number.isFinite(t)&&!(e===0&&t===0)}function o(e){const t=Number.parseFloat(e??"");return Number.isFinite(t)?t:0}export{i as hasMapCoords,o as mapCoordOfText,r as mapModeIsLight,u as watchMapTheme};
1
+ import{rootIsDark as e}from"efficient-shell/format";function n(r="auto"){return r==="light"?!0:r==="dark"?!1:!e({whenUnset:!0})}function o(r,t){return Number.isFinite(r)&&Number.isFinite(t)&&!(r===0&&t===0)}function u(r){const t=Number.parseFloat(r??"");return Number.isFinite(t)?t:0}export{o as hasMapCoords,u as mapCoordOfText,n as mapModeIsLight};
@@ -1 +1 @@
1
- import{HERO_GROUP_PLACEMENTS as c}from"../hero-group-placement.js";import{authoredBoolean as l}from"../content/authored-props.js";import{inRange as r,oneOf as n}from"./behavior.js";const _="popup",P=c,p=["auto","full"],s=["inside","outside","none"],u={min:240,max:1440},O={min:0,max:100},h={placement:"center",fullWidth:!1,width:720,height:"auto",tintColor:"#000000",tintOpacity:60,outsideClick:!0,closeButton:"inside"};function a(i,e){return typeof i=="string"&&/^#[0-9a-fA-F]{6}$/.test(i.trim())?i.trim():e}function C(i,e=h){const t=i??{},o=e;return{placement:n(P,t.placement,o.placement),fullWidth:l(t.fullWidth,o.fullWidth),width:r(t.width,u,o.width),height:n(p,t.height,o.height),tintColor:a(t.tintColor,o.tintColor),tintOpacity:r(t.tintOpacity,O,o.tintOpacity),outsideClick:l(t.outsideClick,o.outsideClick),closeButton:n(s,t.closeButton,o.closeButton)}}export{s as POPUP_CLOSE_BUTTONS,p as POPUP_HEIGHTS,h as POPUP_LOOK_DEFAULTS,_ as POPUP_PAGE_KIND,P as POPUP_PLACEMENTS,O as POPUP_TINT_OPACITY_RANGE,u as POPUP_WIDTH_RANGE,C as resolvePopupLook};
1
+ import{parseHexColor as c}from"efficient-shell/format";import{HERO_GROUP_PLACEMENTS as p}from"../hero-group-placement.js";import{authoredBoolean as r}from"../content/authored-props.js";import{inRange as l,oneOf as n}from"./behavior.js";import{DEFAULT_TINT as P}from"../content/tint.js";const E="popup",s=p,u=["auto","full"],O=["inside","outside","none"],m={min:240,max:1440},a={min:0,max:100},h={placement:"center",fullWidth:!1,width:720,height:"auto",tintColor:P,tintOpacity:60,outsideClick:!0,closeButton:"inside"};function d(e,i){const t=typeof e=="string"?e.trim():"";return t&&c(t)===t.toLowerCase()?t:i}function U(e,i=h){const t=e??{},o=i;return{placement:n(s,t.placement,o.placement),fullWidth:r(t.fullWidth,o.fullWidth),width:l(t.width,m,o.width),height:n(u,t.height,o.height),tintColor:d(t.tintColor,o.tintColor),tintOpacity:l(t.tintOpacity,a,o.tintOpacity),outsideClick:r(t.outsideClick,o.outsideClick),closeButton:n(O,t.closeButton,o.closeButton)}}export{O as POPUP_CLOSE_BUTTONS,u as POPUP_HEIGHTS,h as POPUP_LOOK_DEFAULTS,E as POPUP_PAGE_KIND,s as POPUP_PLACEMENTS,a as POPUP_TINT_OPACITY_RANGE,m as POPUP_WIDTH_RANGE,U as resolvePopupLook};
@@ -7,5 +7,4 @@ export declare const POPUP_KIND_VARS: Record<PopupTextKind, {
7
7
  font: string;
8
8
  size: string;
9
9
  }>;
10
- export declare function popupKindRole(value: unknown): FontRole | null;
11
10
  export declare function popupTextStyles(props: Record<string, unknown>): Partial<Record<PopupTextKind, FontRole>>;
@@ -1 +1 @@
1
- import{FONT_ROLES as i}from"../fonts.js";const s=["meta","eyebrow","heading","body","statName","statValue","formEyebrow","formHeading","formIntro","fieldLabel","option","finePrint","dismiss","doneHeading","doneBody"],d={meta:"Meta line",eyebrow:"Eyebrow",heading:"Heading",body:"Body",statName:"Stat name",statValue:"Stat value",formEyebrow:"Form eyebrow",formHeading:"Form heading",formIntro:"Form intro",fieldLabel:"Field label",option:"Option",finePrint:"Fine print",dismiss:"Dismiss link",doneHeading:"Success heading",doneBody:"Success message"},p={meta:"styleMeta",eyebrow:"styleEyebrow",heading:"styleHeading",body:"styleBody",statName:"styleStatName",statValue:"styleStatValue",formEyebrow:"styleFormEyebrow",formHeading:"styleFormHeading",formIntro:"styleFormIntro",fieldLabel:"styleFieldLabel",option:"styleOption",finePrint:"styleFinePrint",dismiss:"styleDismiss",doneHeading:"styleDoneHeading",doneBody:"styleDoneBody"},f={meta:{font:"--pp-meta-font",size:"--pp-meta-size"},eyebrow:{font:"--pp-eyebrow-font",size:"--pp-eyebrow-size"},heading:{font:"--pp-heading-font",size:"--pp-heading-size"},body:{font:"--pp-body-font",size:"--pp-body-size"},statName:{font:"--pp-statname-font",size:"--pp-statname-size"},statValue:{font:"--pp-statvalue-font",size:"--pp-statvalue-size"},formEyebrow:{font:"--pp-formeyebrow-font",size:"--pp-formeyebrow-size"},formHeading:{font:"--pp-formheading-font",size:"--pp-formheading-size"},formIntro:{font:"--pp-formintro-font",size:"--pp-formintro-size"},fieldLabel:{font:"--pp-fieldlabel-font",size:"--pp-fieldlabel-size"},option:{font:"--pp-option-font",size:"--pp-option-size"},finePrint:{font:"--pp-fineprint-font",size:"--pp-fineprint-size"},dismiss:{font:"--pp-dismiss-font",size:"--pp-dismiss-size"},doneHeading:{font:"--pp-doneheading-font",size:"--pp-doneheading-size"},doneBody:{font:"--pp-donebody-font",size:"--pp-donebody-size"}};function a(e){return typeof e=="string"&&i.includes(e)?e:null}function m(e){const o={};for(const t of s){const n=a(e[p[t]]);n&&(o[t]=n)}return o}export{p as POPUP_KIND_PROP,f as POPUP_KIND_VARS,s as POPUP_TEXT_KINDS,d as POPUP_TEXT_KIND_LABELS,a as popupKindRole,m as popupTextStyles};
1
+ import{fontRoleOf as i}from"../fonts.js";const s=["meta","eyebrow","heading","body","statName","statValue","formEyebrow","formHeading","formIntro","fieldLabel","option","finePrint","dismiss","doneHeading","doneBody"],f={meta:"Meta line",eyebrow:"Eyebrow",heading:"Heading",body:"Body",statName:"Stat name",statValue:"Stat value",formEyebrow:"Form eyebrow",formHeading:"Form heading",formIntro:"Form intro",fieldLabel:"Field label",option:"Option",finePrint:"Fine print",dismiss:"Dismiss link",doneHeading:"Success heading",doneBody:"Success message"},p={meta:"styleMeta",eyebrow:"styleEyebrow",heading:"styleHeading",body:"styleBody",statName:"styleStatName",statValue:"styleStatValue",formEyebrow:"styleFormEyebrow",formHeading:"styleFormHeading",formIntro:"styleFormIntro",fieldLabel:"styleFieldLabel",option:"styleOption",finePrint:"styleFinePrint",dismiss:"styleDismiss",doneHeading:"styleDoneHeading",doneBody:"styleDoneBody"},r={meta:{font:"--pp-meta-font",size:"--pp-meta-size"},eyebrow:{font:"--pp-eyebrow-font",size:"--pp-eyebrow-size"},heading:{font:"--pp-heading-font",size:"--pp-heading-size"},body:{font:"--pp-body-font",size:"--pp-body-size"},statName:{font:"--pp-statname-font",size:"--pp-statname-size"},statValue:{font:"--pp-statvalue-font",size:"--pp-statvalue-size"},formEyebrow:{font:"--pp-formeyebrow-font",size:"--pp-formeyebrow-size"},formHeading:{font:"--pp-formheading-font",size:"--pp-formheading-size"},formIntro:{font:"--pp-formintro-font",size:"--pp-formintro-size"},fieldLabel:{font:"--pp-fieldlabel-font",size:"--pp-fieldlabel-size"},option:{font:"--pp-option-font",size:"--pp-option-size"},finePrint:{font:"--pp-fineprint-font",size:"--pp-fineprint-size"},dismiss:{font:"--pp-dismiss-font",size:"--pp-dismiss-size"},doneHeading:{font:"--pp-doneheading-font",size:"--pp-doneheading-size"},doneBody:{font:"--pp-donebody-font",size:"--pp-donebody-size"}};function d(n){const e={};for(const o of s){const t=i(n[p[o]]);t&&(e[o]=t)}return e}export{p as POPUP_KIND_PROP,r as POPUP_KIND_VARS,s as POPUP_TEXT_KINDS,f as POPUP_TEXT_KIND_LABELS,d as popupTextStyles};
@@ -1,6 +1,6 @@
1
1
  export type OverlayPosition = "top" | "right" | "bottom" | "left";
2
2
  export declare const DEFAULT_OVERLAY_POSITION: OverlayPosition;
3
- export declare const DEFAULT_OVERLAY_COLOR = "#0A0A0A";
3
+ export declare const DEFAULT_OVERLAY_COLOR: "#000000";
4
4
  export declare const OVERLAY_POSITION_OPTIONS: readonly {
5
5
  label: string;
6
6
  value: OverlayPosition;
@@ -1 +1 @@
1
- import{hexToRgb as a}from"efficient-shell/format";import{parseOption as O}from"../parse-option.js";const i="bottom",c="#0A0A0A",u=[{label:"Bottom",value:"bottom",cell:"bottom"},{label:"Top",value:"top",cell:"top"},{label:"Left",value:"left",cell:"left"},{label:"Right",value:"right",cell:"right"}],b={bottom:180,top:0,left:270,right:90},m=[[.55,0],[.15,18],[null,35],[null,55],[.85,100]],A=[[null,33],[.6,67],[.94,100]];function T(t,e){const{r:o,g:l,b:n}=a(t)??a(c);return`rgba(${o},${l},${n},${e})`}function g(t){return O(u,i,t)}function v(t=c,e=i){const o=g(e),p=(o==="top"||o==="bottom"?m:A).map(([r,s])=>`${r===null?"transparent":T(t,r)} ${s}%`);return`linear-gradient(${b[o]}deg, ${p.join(", ")})`}export{c as DEFAULT_OVERLAY_COLOR,i as DEFAULT_OVERLAY_POSITION,u as OVERLAY_POSITION_OPTIONS,v as overlayGradient,g as parseOverlayPosition};
1
+ import{hexToRgb as a}from"efficient-shell/format";import{parseOption as O}from"../parse-option.js";import{DEFAULT_TINT as l}from"../content/tint.js";const p="bottom",v=l,u=[{label:"Bottom",value:"bottom",cell:"bottom"},{label:"Top",value:"top",cell:"top"},{label:"Left",value:"left",cell:"left"},{label:"Right",value:"right",cell:"right"}],T={bottom:180,top:0,left:270,right:90},b=[[.55,0],[.15,18],[null,35],[null,55],[.85,100]],m=[[null,33],[.6,67],[.94,100]];function L(t,e){const{r:o,g:n,b:r}=a(t)??a(l);return`rgba(${o},${n},${r},${e})`}function f(t){return O(u,p,t)}function E(t=l,e=p){const o=f(e),c=(o==="top"||o==="bottom"?b:m).map(([i,s])=>`${i===null?"transparent":L(t,i)} ${s}%`);return`linear-gradient(${T[o]}deg, ${c.join(", ")})`}export{v as DEFAULT_OVERLAY_COLOR,p as DEFAULT_OVERLAY_POSITION,u as OVERLAY_POSITION_OPTIONS,E as overlayGradient,f as parseOverlayPosition};
@@ -26,10 +26,6 @@ export declare function parseSectionHeadPlacement(value: unknown): SectionHeadPl
26
26
  export declare function parentCapsWidth(parent: {
27
27
  type?: string;
28
28
  } | null | undefined): boolean;
29
- export declare const WIDTH_ROWS_SHOW_WHEN: ShowWhenRule;
30
- export declare function widthFieldsForParent<T extends Record<string, unknown>>(fields: T, _parent: {
31
- type?: string;
32
- } | null | undefined, widthKeys: readonly string[]): T;
33
29
  export declare const HEAD_ROWS_SHOW_WHEN: ShowWhenRule;
34
30
  export declare const OWN_BOX_ROWS_SHOW_WHEN: ShowWhenRule;
35
31
  export declare function headFieldsForPlacement<T extends Record<string, unknown>>(fields: T, _placement: unknown, headKeys: readonly string[]): T;
@@ -1 +1 @@
1
- import{parseOption as d}from"../parse-option.js";import{withRowsShownWhen as r}from"../document/show-when-attach.js";import{nonEmptyString as l}from"../non-empty-string.js";const a="inline",s=[{label:"In this section",value:"inline"},{label:"In its own box",value:"own-box"}];function w(e){return[e.num,e.title,e.description,e.linkProp].filter(t=>l(t)!==void 0)}const p={ProductGrid:{num:"num",title:"title",description:"description",headRows:["num","title","titleSize","description","linkText","linkHref"],renderer:"ProductGridSection",padKey:"padTop",linkProp:"link"},TyreSizes:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicTyreSizes"},FitmentFinder:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"FitmentFinder"},TyreFitment:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicTyreFitment"},BundleOffer:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicBundleOffer"},CompatibleTyres:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicRelatedProducts"},RelatedProducts:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicRelatedProducts"},SpecTable:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"SpecTable"},FAQ:{num:"num",title:"title",linkProp:"link",headRows:["num","title","linkText","linkHref"],renderer:"FAQ"},GalleryB:{num:"num",title:"title",headRows:["num","title","linkText","linkHref"],renderer:"GalleryGrid"},FitmentTable:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"FitmentTable"},Events:{num:"num",title:"title",linkProp:"link",headRows:["num","title","linkText","linkHref"],renderer:"Events"},ProcessSteps:{num:"num",title:"title",description:"description",headRows:["num","title","description"],headStyle:"editorial",renderer:"ProcessSteps",padKey:"padTop"},LongRead:{num:"headNum",title:"headTitle",description:"headDesc",headRows:["headNum","headTitle","headDesc"],headStyle:"editorial",renderer:"LongRead"},Series:{num:"headNum",title:"headTitle",description:"headDesc",headRows:["headNum","headTitle","headDesc"],headStyle:"editorial",renderer:"Series"},TimelineTrack:{num:"eyebrow",title:"title",description:"intro",headRows:["eyebrow","title","intro"],headStyle:"editorial",renderer:"TimelineTrack",padKey:"padTop"},StatsParagraph:{num:"eyebrow",title:"title",description:"desc",headRows:["eyebrow","title","desc"],headStyle:"editorial",renderer:"StatsParagraph"},Footprint:{num:"sectionNumber",title:"heading",description:"tagline",headRows:["sectionNumber","heading","tagline"],headStyle:"editorial",renderer:"Footprint",padKey:"padTop"},Collections:{num:"eyebrow",title:"heading",headRows:["eyebrow","heading"],renderer:"Collections"},Cards:{num:"eyebrow",title:"title",headRows:["eyebrow","eyebrowLook","title"],headStyle:"simple",renderer:"Cards"},Testimonials:{num:"eyebrow",title:"title",headRows:["eyebrow","eyebrowLook","title"],headStyle:"simple",renderer:"Testimonials"},Reviews:{num:"eyebrow",title:"title",headRows:["eyebrow","eyebrowLook","title"],headStyle:"simple",renderer:"Reviews"},Prose:{num:"eyebrow",title:"title",headRows:["eyebrow","title"],headStyle:"essay",renderer:"Prose"},ReviewForm:{num:"eyebrow",title:"title",headRows:["eyebrow","title"],headStyle:"simple",renderer:"ReviewForm"},DeliveryOptions:{num:"eyebrow",title:"title",description:"body",headRows:["eyebrow","title","body"],headStyle:"natural",headRowGap:"gap-3",headDescriptionSize:"text-[15px]",renderer:"DeliveryOptions"}},y="SectionHeader";function S(e){return e in p}function T(e){return d(s,a,e)}const n=new Set(["Flex"]);function R(e){return!!e?.type&&n.has(e.type)}const m={not:{context:"parentType",in:[...n]}};function b(e,t,i){return r(e,i,m)}const o={not:{field:"headPlacement",is:"own-box"}},P={not:o};function x(e,t,i){return r(e,i,o)}export{a as DEFAULT_SECTION_HEAD_PLACEMENT,o as HEAD_ROWS_SHOW_WHEN,P as OWN_BOX_ROWS_SHOW_WHEN,s as SECTION_HEAD_PLACEMENT_OPTIONS,y as SECTION_HEAD_TYPE,p as SPLITTABLE_SECTIONS,m as WIDTH_ROWS_SHOW_WHEN,S as canSplitHead,x as headFieldsForPlacement,w as headRoleProps,R as parentCapsWidth,T as parseSectionHeadPlacement,b as widthFieldsForParent};
1
+ import{parseOption as n}from"../parse-option.js";import{withRowsShownWhen as o}from"../document/show-when-attach.js";import{nonEmptyString as d}from"../non-empty-string.js";const l="inline",a=[{label:"In this section",value:"inline"},{label:"In its own box",value:"own-box"}];function h(e){return[e.num,e.title,e.description,e.linkProp].filter(t=>d(t)!==void 0)}const s={ProductGrid:{num:"num",title:"title",description:"description",headRows:["num","title","titleSize","description","linkText","linkHref"],renderer:"ProductGridSection",padKey:"padTop",linkProp:"link"},TyreSizes:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicTyreSizes"},FitmentFinder:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"FitmentFinder"},TyreFitment:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicTyreFitment"},BundleOffer:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicBundleOffer"},CompatibleTyres:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicRelatedProducts"},RelatedProducts:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"DynamicRelatedProducts"},SpecTable:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"SpecTable"},FAQ:{num:"num",title:"title",linkProp:"link",headRows:["num","title","linkText","linkHref"],renderer:"FAQ"},GalleryB:{num:"num",title:"title",headRows:["num","title","linkText","linkHref"],renderer:"GalleryGrid"},FitmentTable:{num:"num",title:"title",description:"description",headRows:["num","title","description"],renderer:"FitmentTable"},Events:{num:"num",title:"title",linkProp:"link",headRows:["num","title","linkText","linkHref"],renderer:"Events"},ProcessSteps:{num:"num",title:"title",description:"description",headRows:["num","title","description"],headStyle:"editorial",renderer:"ProcessSteps",padKey:"padTop"},LongRead:{num:"headNum",title:"headTitle",description:"headDesc",headRows:["headNum","headTitle","headDesc"],headStyle:"editorial",renderer:"LongRead"},Series:{num:"headNum",title:"headTitle",description:"headDesc",headRows:["headNum","headTitle","headDesc"],headStyle:"editorial",renderer:"Series"},TimelineTrack:{num:"eyebrow",title:"title",description:"intro",headRows:["eyebrow","title","intro"],headStyle:"editorial",renderer:"TimelineTrack",padKey:"padTop"},StatsParagraph:{num:"eyebrow",title:"title",description:"desc",headRows:["eyebrow","title","desc"],headStyle:"editorial",renderer:"StatsParagraph"},Footprint:{num:"sectionNumber",title:"heading",description:"tagline",headRows:["sectionNumber","heading","tagline"],headStyle:"editorial",renderer:"Footprint",padKey:"padTop"},Collections:{num:"eyebrow",title:"heading",headRows:["eyebrow","heading"],renderer:"Collections"},Cards:{num:"eyebrow",title:"title",headRows:["eyebrow","eyebrowLook","title"],headStyle:"simple",renderer:"Cards"},Testimonials:{num:"eyebrow",title:"title",headRows:["eyebrow","eyebrowLook","title"],headStyle:"simple",renderer:"Testimonials"},Reviews:{num:"eyebrow",title:"title",headRows:["eyebrow","eyebrowLook","title"],headStyle:"simple",renderer:"Reviews"},Prose:{num:"eyebrow",title:"title",headRows:["eyebrow","title"],headStyle:"essay",renderer:"Prose"},ReviewForm:{num:"eyebrow",title:"title",headRows:["eyebrow","title"],headStyle:"simple",renderer:"ReviewForm"},DeliveryOptions:{num:"eyebrow",title:"title",description:"body",headRows:["eyebrow","title","body"],headStyle:"natural",headRowGap:"gap-3",headDescriptionSize:"text-[15px]",renderer:"DeliveryOptions"}},w="SectionHeader";function y(e){return e in s}function S(e){return n(a,l,e)}const p=new Set(["Flex"]);function R(e){return!!e?.type&&p.has(e.type)}const i={not:{field:"headPlacement",is:"own-box"}},T={not:i};function b(e,t,r){return o(e,r,i)}export{l as DEFAULT_SECTION_HEAD_PLACEMENT,i as HEAD_ROWS_SHOW_WHEN,T as OWN_BOX_ROWS_SHOW_WHEN,a as SECTION_HEAD_PLACEMENT_OPTIONS,w as SECTION_HEAD_TYPE,s as SPLITTABLE_SECTIONS,y as canSplitHead,b as headFieldsForPlacement,h as headRoleProps,R as parentCapsWidth,S as parseSectionHeadPlacement};
@@ -1 +1 @@
1
- import{BOX_TYPE as e}from"../document/container-blocks.js";import{headingTextSeed as c,labelTextSeed as p}from"../document/text-seeds.js";function i(t,n,o,m={}){return{type:t,props:{...n(t),id:o(t),...m}}}function g(t,n,o){return i(e,t,n,{...o,sectionPaddingTop:void 0,sectionPaddingBottom:void 0})}const r={Manifesto:(t,n)=>({type:e,props:{...t(e),id:n(e),direction:"row",share:"equal",sectionHeightMode:"screen",name:"Brand Text",content:[i(e,t,n,{direction:"column",justify:"center",blockSpacing:"gap",name:"Text",sectionPaddingTop:100,sectionPaddingBottom:100,sectionPaddingLeft:40,sectionPaddingRight:40,content:[i("Text",t,n,p()),i("Text",t,n,c()),i("Text",t,n),i("Stats",t,n)]}),g(t,n,{direction:"column",name:"Picture",content:[]})]}}),Split:(t,n)=>({type:e,props:{...t(e),id:n(e),direction:"row",share:"equal",sectionHeightMode:"screen",sectionHeightValue:70,name:"Image & Text Split",content:[i(e,t,n,{direction:"column",justify:"center",blockSpacing:"gap",name:"Text",sectionPaddingTop:100,sectionPaddingBottom:100,sectionPaddingLeft:60,sectionPaddingRight:60,content:[i("Text",t,n,p()),i("Text",t,n,c()),i("Text",t,n),i("ButtonBlock",t,n)]}),g(t,n,{direction:"column",name:"Image",content:[i("ImageBlock",t,n)]})]}}),Subscribe:(t,n)=>({type:e,props:{...t(e),id:n(e),direction:"column",name:"Subscribe",content:[i("Text",t,n,c()),i("Text",t,n),i("Form",t,n)]}})};function x(t){return r[t]??null}export{r as SECTION_PRESETS,x as presetFor};
1
+ import{BOX_TYPE as i}from"../document/container-blocks.js";import{headingTextSeed as c,labelTextSeed as p}from"../document/text-seeds.js";import{TICKER_SCAFFOLD_ITEMS as P}from"../document/blocks/general/Ticker/meta.js";import{specStripScaffold as S}from"../document/blocks/general/SpecStrip/meta.js";import{TIMELINE_YEAR_BOX as B,TIMELINE_YEAR_HEAD as h}from"./timeline-year-shape.js";import{SPEC_PAD as s,SPEC_STRIP as E,SPEC_TEXT as _,STRIP_BOX as R,TICKER_PAD as b,TICKER_SMALL as y,TICKER_STRIP as C}from"./strip-shape.js";function e(t,n,o,m={}){return{type:t,props:{...n(t),id:o(t),...m}}}function a(t,n,o){return e(i,t,n,{...o,sectionPaddingTop:void 0,sectionPaddingBottom:void 0})}const k={Manifesto:(t,n)=>({type:i,props:{...t(i),id:n(i),direction:"row",share:"equal",sectionHeightMode:"screen",name:"Brand Text",content:[e(i,t,n,{direction:"column",justify:"center",blockSpacing:"gap",name:"Text",sectionPaddingTop:100,sectionPaddingBottom:100,sectionPaddingLeft:40,sectionPaddingRight:40,content:[e("Text",t,n,p()),e("Text",t,n,c()),e("Text",t,n),e("Stats",t,n)]}),a(t,n,{direction:"column",name:"Picture",content:[]})]}}),Split:(t,n)=>({type:i,props:{...t(i),id:n(i),direction:"row",share:"equal",sectionHeightMode:"screen",sectionHeightValue:70,name:"Image & Text Split",content:[e(i,t,n,{direction:"column",justify:"center",blockSpacing:"gap",name:"Text",sectionPaddingTop:100,sectionPaddingBottom:100,sectionPaddingLeft:60,sectionPaddingRight:60,content:[e("Text",t,n,p()),e("Text",t,n,c()),e("Text",t,n),e("ButtonBlock",t,n)]}),a(t,n,{direction:"column",name:"Image",content:[e("ImageBlock",t,n)]})]}}),Subscribe:(t,n)=>({type:i,props:{...t(i),id:n(i),direction:"column",name:"Subscribe",content:[e("Text",t,n,c()),e("Text",t,n),e("Form",t,n)]}}),Ticker:(t,n)=>x("Scrolling Bar",C,b,P.map(o=>({text:o.text,style:y,muted:!0})),t,n),SpecStrip:(t,n)=>x("Spec Strip",{...E,sectionBorder:{top:1}},s,S().map(o=>({text:o.text??"",style:_,muted:o.tone==="muted"})),t,n),TimelineTrack:(t,n)=>{const o=m=>e(i,t,n,{...B,name:"Year",sectionPaddingTop:0,sectionPaddingBottom:0,...m?{upcoming:!0}:{},content:[e(i,t,n,{...h,sectionPaddingTop:0,sectionPaddingBottom:0,content:[e("Text",t,n,p()),e("Text",t,n,c())]}),e("Text",t,n)]});return{type:i,props:{...t(i),id:n(i),direction:"column",gap:48,name:"Milestone Timeline",content:[e(i,t,n,{direction:"row",align:"end",justify:"between",share:"content",name:"Heading",content:[e("Text",t,n,p()),e("Text",t,n,c()),e("Text",t,n)]}),e(i,t,n,{direction:"row",share:"equal",gap:0,line:!0,name:"Years",content:[o(!1),o(!1),o(!0)]}),e("ButtonBlock",t,n)]}}},Timeline:(t,n)=>{const o=()=>e(i,t,n,{direction:"row",share:"biggerRight",gap:24,name:"Chapter",content:[e("Text",t,n,p()),e(i,t,n,{direction:"column",gap:12,name:"Words",content:[e("Text",t,n,c()),e("Text",t,n)]})]});return{type:i,props:{...t(i),id:n(i),direction:"row",share:"bigRight",gap:48,name:"Story Timeline",content:[e(i,t,n,{direction:"column",gap:24,name:"Heading",content:[e("Text",t,n,p()),e("Text",t,n,c()),e("Text",t,n),e("ImageBlock",t,n),e("ButtonBlock",t,n)]}),e(i,t,n,{direction:"column",gap:48,line:!1,name:"Chapters",content:[o(),o(),o()]})]}}}};function x(t,n,o,m,T,g){return e(i,T,g,{...R,...n,blockSpacing:"gap",padV2:!0,name:t,sectionPaddingTop:o.top,sectionPaddingBottom:o.bottom,sectionPaddingTopPhone:o.topPhone,sectionPaddingBottomPhone:o.bottomPhone,content:m.map(r=>e("Text",T,g,{text:r.text,...r.muted?{tone:"dim"}:{},_partStyles:{text:r.style}}))})}function Y(t){return k[t]??null}export{k as SECTION_PRESETS,Y as presetFor};
@@ -0,0 +1,16 @@
1
+ type Props = Record<string, unknown>;
2
+ export type StripPad = {
3
+ top: number;
4
+ bottom: number;
5
+ topPhone: number;
6
+ bottomPhone: number;
7
+ };
8
+ export declare const STRIP_BOX: Props;
9
+ export declare const TICKER_PAD: StripPad;
10
+ export declare const TICKER_STRIP: Props;
11
+ export declare const TICKER_SMALL: Props;
12
+ export declare const TICKER_DISPLAY: Props;
13
+ export declare const SPEC_PAD: StripPad;
14
+ export declare const SPEC_STRIP: Props;
15
+ export declare const SPEC_TEXT: Props;
16
+ export {};
@@ -0,0 +1 @@
1
+ const t={direction:"row",share:"content",align:"center"},e={top:16,bottom:16,topPhone:12,bottomPhone:12},o={wrap:"nowrap",gap:128,separator:"dot",sectionBorder:{top:1,bottom:1}},p={textStyle:"body-5",letterSpacing:.25,case:"upper",lineHeight:1.5},n={textStyle:"heading-3",letterSpacing:.005,case:"upper",lineHeight:1},r={top:16,bottom:16,topPhone:12,bottomPhone:12},a={justify:"between",wrap:"wrap",gap:32,separator:"none"},c={textStyle:"body-5",letterSpacing:.1,case:"upper",lineHeight:1.5};export{r as SPEC_PAD,a as SPEC_STRIP,c as SPEC_TEXT,t as STRIP_BOX,n as TICKER_DISPLAY,e as TICKER_PAD,p as TICKER_SMALL,o as TICKER_STRIP};
@@ -0,0 +1,4 @@
1
+ type Props = Record<string, unknown>;
2
+ export declare const TIMELINE_YEAR_BOX: Props;
3
+ export declare const TIMELINE_YEAR_HEAD: Props;
4
+ export {};
@@ -0,0 +1 @@
1
+ const e={direction:"column",justify:"between",gap:14,sectionPaddingLeft:14,sectionPaddingRight:14,sectionPaddingLeftPhone:0,sectionHeightMode:"fixed",sectionHeightValue:280,sectionHeightUnit:"px",sectionHeightModePhone:"auto"},t={name:"Year and title",direction:"column",gap:14};export{e as TIMELINE_YEAR_BOX,t as TIMELINE_YEAR_HEAD};
@@ -0,0 +1,4 @@
1
+ import { type RuleReport, type SourceFile } from "./rule.js";
2
+ export declare const EASEL_BOX_FIELD_NAMES: readonly ["group", "section", "slider", "select", "segmented", "Segmented", "SelectOption", "SelectField", "gapField", "directionField", "boxJustifyField", "boxAlignField", "boxWrapField", "positionFields", "positionPatch", "sidesPaddingFields", "sidesPaddingPatch", "SIDE_PAD_KEYS", "placementField", "PlacementGridView", "noGlyph", "isNoGlyph", "iconOf", "sharedStyleKinds", "describedAs", "FIELD_DESCRIPTION_MARKER", "BOX_JUSTIFY_POINTS", "BOX_ALIGN_POINTS", "BOX_WRAP_POINTS", "BOX_WRAP_LABEL"];
3
+ export declare const EASEL_BOX_FIELDS = "efficient-easel/screen/lib/document/box-fields";
4
+ export declare function boxFieldsFromEasel(files: readonly SourceFile[]): RuleReport;
@@ -0,0 +1,8 @@
1
+ import{ruleChecks as c}from"./rule.js";const a=["group","section","slider","select","segmented","Segmented","SelectOption","SelectField","gapField","directionField","boxJustifyField","boxAlignField","boxWrapField","positionFields","positionPatch","sidesPaddingFields","sidesPaddingPatch","SIDE_PAD_KEYS","placementField","PlacementGridView","noGlyph","isNoGlyph","iconOf","sharedStyleKinds","describedAs","FIELD_DESCRIPTION_MARKER","BOX_JUSTIFY_POINTS","BOX_ALIGN_POINTS","BOX_WRAP_POINTS","BOX_WRAP_LABEL"],d="efficient-easel/screen/lib/document/box-fields",f=new RegExp(String.raw`^(?:export\s+)?(?:declare\s+)?(?:async\s+)?(?:function\*?|const|let|var|class|type|interface|enum)\s+(${a.join("|")})\b`,"gm"),x=new RegExp(String.raw`import\s*\{[^}]*\bboxFieldBuilders\b[^}]*\}\s*from\s*["']${d}["'][\s\S]*\bboxFieldBuilders\s*\(`),p=(i,n)=>new RegExp(String.raw`=\s*\w+\.${n}\s*;`).test(i);function r(i){const n=[],o=[];for(const e of i){if(!/\.tsx?$/.test(e.path))continue;const l=x.test(e.text);l&&o.push(e.path);for(const s of e.text.matchAll(f)){const t=e.text.slice(s.index,e.text.indexOf(`
2
+ `,s.index));l&&p(t,s[1])||n.push({file:e.path,line:e.text.slice(0,s.index).split(`
3
+ `).length,name:s[1]})}}return{own:n,binders:o}}const b=[{path:"lib/document/controls.tsx",text:`export function slider(label: string) {}
4
+ const SIDE_PAD_KEYS = rows.SIDE_PAD_KEYS;
5
+ `}],g=[{path:"lib/document/box-fields.ts",text:`import { boxFieldBuilders } from "${d}";
6
+ const rows = boxFieldBuilders(say);
7
+ export const slider: Rows["slider"] = rows.slider;
8
+ `}];function S(i){const n=c("box-fields-from-easel: the Box rows are efficient-easel's, with no copy here"),o=r(b),e=r(g);n.check("fixture: a declared `slider` and `SIDE_PAD_KEYS` are flagged, a missing binding is flagged",o.own.map(t=>t.name).join(",")==="slider,SIDE_PAD_KEYS"&&o.binders.length===0),n.check("fixture: a binding of easel's builders passes",e.own.length===0&&e.binders.length===1);const{own:l,binders:s}=r(i);return n.check("R1 no file declares a name easel's box-fields exports",l.length===0,l.map(t=>`${t.file}:${t.line} ${t.name}`).join("; ")),n.check(`R2 one file binds boxFieldBuilders from ${d} to the website's words`,s.length===1,`found ${s.length}: ${s.join(", ")||"none"}`),n.report()}export{d as EASEL_BOX_FIELDS,a as EASEL_BOX_FIELD_NAMES,S as boxFieldsFromEasel};
@@ -8,6 +8,6 @@ import{ruleChecks as z}from"./rule.js";const g="sf-note";function y(o){const i=[
8
8
  font-size: 12px;
9
9
  `,"font-size")==="12px"&&m(` font-size-adjust: 0.5;
10
10
  `,"font-size")===null),t("a grouping block reports its children, not itself",p(y("@keyframes sf-x { from { opacity: 0; } to { opacity: 1; } }").map(h=>h.selector),["from","to"])),t("braces in comments and strings do not shift nesting",p(y('/* .a { x } */ .b { content: "}"; } .c { color: red; }').map(h=>h.selector),[".b",".c"])),t("modifiers and descendants report the base note class",p([...u(".sf-note--error")],["sf-note"])&&p([...u(".sf-note p + p")],["sf-note"])&&p([...u(`.${e("pages")}, .${e("sm")}`)],[e("pages"),e("sm")])&&u(".sf-notebook").size===0);const f=[`/* Two homes were rejected: \`.${e("pages")}\` belongs to the chrome. */`,`// …and .${e("sm")} is the sitemap's own.`,'const url = "https://x/y";','export const Note = () => <div className="sf-note">hi</div>;'].join(`
11
- `);t("a class a file only TALKS about is not a class it renders, and a `//` in a URL is not a comment",p([...u(b(f))],["sf-note"])&&/https:\/\/x\/y/.test(b(f)))}let r=new Set([g]);if(i.stylesheet){const e=o.find(s=>s.path===i.stylesheet);if(t(`read the stylesheet ${i.stylesheet}`,!!e)&&e){const s=y(e.text);r=new Set;for(const l of s)for(const d of u(l.selector))r.add(d);t(`the stylesheet parses (${s.length} rules, more than 300)`,s.length>300,"the walker looks broken"),t(`the scan is not vacuous: it finds a note class (${r.size})`,r.size>0,"the selector scan looks broken"),t(`the chrome declares exactly ONE note class, .${g}`,p([...r].sort(),[g]),`it declares ${[...r].sort().map(l=>`.${l}`).join(", ")}. One quiet sentence, one class: a note that needs a different INSET takes it from the block it sits in (\`.sf-pages-list > .sf-note\`), never from a new class`);const f=new Map;for(const l of r){const d=s.find(x=>x.selector===`.${l}`),w=d?m(d.body,"font-size"):null;t(`.${l} has a type rule of its own`,!!d,"it is a modifier without a base"),t(`.${l} states its own font-size`,w!==null,"it inherits one — that is a size nobody chose"),f.set(l,w)}const h=new Set(f.values());t("every note class states the same size",h.size<=1,`the chrome's notes are set at ${h.size} sizes: ${[...f].map(([l,d])=>`.${l} ${d}`).join(", ")}`);const $=s.find(l=>l.selector===`.${g}`);t(`the note still reads as a note: .${g} is var(--sf-muted)`,!!$&&m($.body,"color")==="var(--sf-muted)",$?`color: ${m($.body,"color")}`:"the chrome no longer declares it")}}const n=o.filter(e=>/\.(tsx?|jsx?|mjs)$/.test(e.path));t(`read the source (${n.length} JS/TS files, at least ${i.minFiles})`,n.length>=i.minFiles,"fewer means the walk broke, and the check below is vacuous");const a=[];for(const e of n)for(const s of u(b(e.text)))r.has(s)||a.push(`${e.path} ${s}`);return t(`no source file names a note class the chrome does not declare (${[...r].map(e=>`.${e}`).join(", ")})`,a.length===0,`a \`.sf-*\` class is scoped under \`.sf-editor\` in the PARENT document, so a missing rule is not a compile error — the text simply renders at whatever it inherits:
11
+ `);t("a class a file only TALKS about is not a class it renders, and a `//` in a URL is not a comment",p([...u(b(f))],["sf-note"])&&/https:\/\/x\/y/.test(b(f)))}let r=new Set([g]);if(i.stylesheet){const e=o.find(s=>s.path===i.stylesheet);if(t(`read the stylesheet ${i.stylesheet}`,!!e)&&e){const s=y(e.text);r=new Set;for(const l of s)for(const d of u(l.selector))r.add(d);t(`the stylesheet parses (${s.length} rules, more than 200)`,s.length>200,"the walker looks broken"),t(`the scan is not vacuous: it finds a note class (${r.size})`,r.size>0,"the selector scan looks broken"),t(`the chrome declares exactly ONE note class, .${g}`,p([...r].sort(),[g]),`it declares ${[...r].sort().map(l=>`.${l}`).join(", ")}. One quiet sentence, one class: a note that needs a different INSET takes it from the block it sits in (\`.sf-pages-list > .sf-note\`), never from a new class`);const f=new Map;for(const l of r){const d=s.find(x=>x.selector===`.${l}`),w=d?m(d.body,"font-size"):null;t(`.${l} has a type rule of its own`,!!d,"it is a modifier without a base"),t(`.${l} states its own font-size`,w!==null,"it inherits one — that is a size nobody chose"),f.set(l,w)}const h=new Set(f.values());t("every note class states the same size",h.size<=1,`the chrome's notes are set at ${h.size} sizes: ${[...f].map(([l,d])=>`.${l} ${d}`).join(", ")}`);const $=s.find(l=>l.selector===`.${g}`);t(`the note still reads as a note: .${g} is var(--sf-muted)`,!!$&&m($.body,"color")==="var(--sf-muted)",$?`color: ${m($.body,"color")}`:"the chrome no longer declares it")}}const n=o.filter(e=>/\.(tsx?|jsx?|mjs)$/.test(e.path));t(`read the source (${n.length} JS/TS files, at least ${i.minFiles})`,n.length>=i.minFiles,"fewer means the walk broke, and the check below is vacuous");const a=[];for(const e of n)for(const s of u(b(e.text)))r.has(s)||a.push(`${e.path} ${s}`);return t(`no source file names a note class the chrome does not declare (${[...r].map(e=>`.${e}`).join(", ")})`,a.length===0,`a \`.sf-*\` class is scoped under \`.sf-editor\` in the PARENT document, so a missing rule is not a compile error — the text simply renders at whatever it inherits:
12
12
  ${a.join(`
13
13
  `)}`),c()}export{g as CHROME_NOTE_CLASS,m as declaration,S as editorChromeNote,y as leafRules,u as noteClasses,b as withoutComments};
@@ -1,3 +1,3 @@
1
- import{ruleChecks as A}from"./rule.js";const E={text:[0,1,2],textarea:[0,1,2],plainText:[0,1,2],copyText:[0,1,2],plainTextarea:[0,1,2],linkField:[0],textList:[0,2],upload:[0,2],toggle:[0],checkbox:[0],select:[0,4],searchSelect:[0,3],segmented:[0],multiSelect:[0,2],slider:[0],colorInput:[0],focalPicker:[0],sizeField:[0],backgroundField:[0],cardImageBackgroundField:[0],placementField:[0],pxField:[0],dateTime:[0,2],edgePad:[0,3],blockSourceField:[0,1],phPrev:[1],phHide:[1],phHideDefault:[1],group:[0],section:[0],panelNote:[0]},b=new Set(["value","render","defaultProps","fields","type","arrayFields","icon"]),N=/(^|_)(PH|LABELS?|HINTS?|NOTES?|TITLES?|SWATCH_NAMES|GROUP|REASON|ROWS|PANELS|TABS|LINES)$/,O=new Set(["key","value","id","type","href","slug","kind","cell","set","icon","token","unit","path","url","src","className","variant","mode","side","align","role"]),$=new Set(["hint","coverHint","unsetLabel","emptyLabel","addLabel"]),_=new Set(["say","sayCount"]);function C(t){return/\p{L}/u.test(t)&&t.trim()===t&&t.length>0&&!/^[a-z0-9]+(?:-[a-z0-9]+)+$/.test(t)}const P=/(?:Key|Id|Slug|Href|Url|ClassName)$/;function L(t,p,s={}){const a=new Map,k=new Set(s.skip??[]),S=new Map((s.dataFiles??[]).map(e=>[e.path,e.keys])),u=(e,l)=>{if(!C(e))return;let d=a.get(e);d||a.set(e,d=new Set),d.add(l)},f=e=>e&&(t.isStringLiteral(e)||t.isNoSubstitutionTemplateLiteral(e))?e.text:null,o=e=>{if(!e)return[];const l=f(e);return l!==null?[l]:t.isParenthesizedExpression(e)?o(e.expression):t.isConditionalExpression(e)?[...o(e.whenTrue),...o(e.whenFalse)]:t.isBinaryExpression(e)&&(e.operatorToken.kind===t.SyntaxKind.QuestionQuestionToken||e.operatorToken.kind===t.SyntaxKind.BarBarToken)?[...o(e.left),...o(e.right)]:[]},y=e=>{const l=e.expression;return t.isIdentifier(l)?l.text:t.isPropertyAccessExpression(l)?l.name.text:null},g=e=>e.name&&(t.isIdentifier(e.name)||t.isStringLiteral(e.name))?e.name.text:null;for(const e of p){if(!/\.tsx?$/.test(e.path)||k.has(e.path))continue;const l=S.get(e.path),d=t.createSourceFile(e.path,e.text,t.ScriptTarget.Latest,!0,e.path.endsWith(".tsx")?t.ScriptKind.TSX:t.ScriptKind.TS),T=n=>{if(t.isCallExpression(n)){const r=y(n);if(r&&_.has(r))for(const c of n.arguments){const i=f(c);i!==null&&u(i,e.path)}else if(r&&t.isIdentifier(n.expression)&&Object.prototype.hasOwnProperty.call(E,r)){for(const c of E[r])for(const i of o(n.arguments[c]))u(i,e.path);if(r==="segmented"){const c=n.arguments[2];if(c&&t.isArrayLiteralExpression(c))for(const i of c.elements){const h=f(i);h!==null&&u(h,e.path)}}}}else if(t.isJsxAttribute(n)&&n.name.getText(d)==="label"&&n.initializer&&t.isStringLiteral(n.initializer)&&/^[A-Z]/.test(n.parent.parent.tagName.getText(d).split(".").pop()??""))u(n.initializer.text,e.path);else if(t.isObjectLiteralExpression(n)){const r=n.properties.filter(t.isPropertyAssignment),c=r.find(i=>g(i)==="label");if(c&&r.some(i=>b.has(g(i)??""))){const i=f(c.initializer);i!==null&&u(i,e.path)}for(const i of r){const h=g(i);if(h!==null&&$.has(h))for(const x of o(i.initializer))u(x,e.path)}if(l)for(const i of r){const h=g(i);if(h!==null&&(l==="*"||l.includes(h))){const x=f(i.initializer);x!==null&&u(x,e.path)}}}else if(t.isVariableDeclaration(n)&&t.isIdentifier(n.name)&&N.test(n.name.text)&&n.initializer&&!/CSSProperties|Style\b/.test(n.type?.getText(d)??"")){const r=f(n.initializer);r!==null&&!/^[a-z0-9_]+$/.test(r)&&u(r,e.path);const c=i=>{const h=t.isPropertyAssignment(i)?g(i)??"":"";if(t.isPropertyAssignment(i)&&!O.has(h)&&!P.test(h)){const x=f(i.initializer);x!==null&&u(x,e.path)}t.forEachChild(i,c)};c(n.initializer)}t.forEachChild(n,T)};T(d)}const m=new Map;for(const e of[...a.keys()].sort(w))s.known?.has(e)||m.set(e,[...a.get(e)].sort());return m}function w(t,p){return t<p?-1:t>p?1:0}function z(t,p){return["/**",...p.header.map(a=>a?` * ${a}`:" *")," */",`export const ${p.constant} = {`,...[...t].map(a=>` ${JSON.stringify(a)}: ${JSON.stringify(a)},`),"} as const;","",`/** Every phrase of {@link ${p.constant}}: what a host's words are keyed by. */`,`export type ${p.phraseType} = keyof typeof ${p.constant};`,""].join(`
1
+ import{ruleChecks as A}from"./rule.js";const E={text:[0,1,2],textarea:[0,1,2],plainText:[0,1,2],copyText:[0,1,2],plainTextarea:[0,1,2],linkField:[0],textList:[0,2],upload:[0,2],toggle:[0,3],checkbox:[0],select:[0,4],searchSelect:[0,3],segmented:[0],iconPickerRow:[0],multiSelect:[0,2],slider:[0],colorInput:[0],focalPicker:[0],sizeField:[0],backgroundField:[0],cardImageBackgroundField:[0],placementField:[0],pxField:[0],dateTime:[0,2],edgePad:[0,3],blockSourceField:[0,1],phPrev:[1],phHide:[1],phHideDefault:[1],group:[0],section:[0],panelNote:[0]},b=new Set(["value","render","defaultProps","fields","type","arrayFields","icon"]),N=/(^|_)(PH|LABELS?|HINTS?|NOTES?|TITLES?|SWATCH_NAMES|GROUP|REASON|ROWS|PANELS|TABS|LINES)$/,O=new Set(["key","value","id","type","href","slug","kind","cell","set","icon","token","unit","path","url","src","className","variant","mode","side","align","role"]),$=new Set(["hint","coverHint","unsetLabel","emptyLabel","addLabel"]),_=new Set(["say","sayCount"]);function C(t){return/\p{L}/u.test(t)&&t.trim()===t&&t.length>0&&!/^[a-z0-9]+(?:-[a-z0-9]+)+$/.test(t)}const P=/(?:Key|Id|Slug|Href|Url|ClassName)$/;function L(t,p,s={}){const a=new Map,k=new Set(s.skip??[]),S=new Map((s.dataFiles??[]).map(e=>[e.path,e.keys])),u=(e,l)=>{if(!C(e))return;let d=a.get(e);d||a.set(e,d=new Set),d.add(l)},f=e=>e&&(t.isStringLiteral(e)||t.isNoSubstitutionTemplateLiteral(e))?e.text:null,o=e=>{if(!e)return[];const l=f(e);return l!==null?[l]:t.isParenthesizedExpression(e)?o(e.expression):t.isConditionalExpression(e)?[...o(e.whenTrue),...o(e.whenFalse)]:t.isBinaryExpression(e)&&(e.operatorToken.kind===t.SyntaxKind.QuestionQuestionToken||e.operatorToken.kind===t.SyntaxKind.BarBarToken)?[...o(e.left),...o(e.right)]:[]},y=e=>{const l=e.expression;return t.isIdentifier(l)?l.text:t.isPropertyAccessExpression(l)?l.name.text:null},g=e=>e.name&&(t.isIdentifier(e.name)||t.isStringLiteral(e.name))?e.name.text:null;for(const e of p){if(!/\.tsx?$/.test(e.path)||k.has(e.path))continue;const l=S.get(e.path),d=t.createSourceFile(e.path,e.text,t.ScriptTarget.Latest,!0,e.path.endsWith(".tsx")?t.ScriptKind.TSX:t.ScriptKind.TS),T=n=>{if(t.isCallExpression(n)){const r=y(n);if(r&&_.has(r))for(const c of n.arguments){const i=f(c);i!==null&&u(i,e.path)}else if(r&&t.isIdentifier(n.expression)&&Object.prototype.hasOwnProperty.call(E,r)){for(const c of E[r])for(const i of o(n.arguments[c]))u(i,e.path);if(r==="segmented"){const c=n.arguments[2];if(c&&t.isArrayLiteralExpression(c))for(const i of c.elements){const h=f(i);h!==null&&u(h,e.path)}}}}else if(t.isJsxAttribute(n)&&n.name.getText(d)==="label"&&n.initializer&&t.isStringLiteral(n.initializer)&&/^[A-Z]/.test(n.parent.parent.tagName.getText(d).split(".").pop()??""))u(n.initializer.text,e.path);else if(t.isObjectLiteralExpression(n)){const r=n.properties.filter(t.isPropertyAssignment),c=r.find(i=>g(i)==="label");if(c&&r.some(i=>b.has(g(i)??""))){const i=f(c.initializer);i!==null&&u(i,e.path)}for(const i of r){const h=g(i);if(h!==null&&$.has(h))for(const x of o(i.initializer))u(x,e.path)}if(l)for(const i of r){const h=g(i);if(h!==null&&(l==="*"||l.includes(h))){const x=f(i.initializer);x!==null&&u(x,e.path)}}}else if(t.isVariableDeclaration(n)&&t.isIdentifier(n.name)&&N.test(n.name.text)&&n.initializer&&!/CSSProperties|Style\b/.test(n.type?.getText(d)??"")){const r=f(n.initializer);r!==null&&!/^[a-z0-9_]+$/.test(r)&&u(r,e.path);const c=i=>{const h=t.isPropertyAssignment(i)?g(i)??"":"";if(t.isPropertyAssignment(i)&&!O.has(h)&&!P.test(h)){const x=f(i.initializer);x!==null&&u(x,e.path)}t.forEachChild(i,c)};c(n.initializer)}t.forEachChild(n,T)};T(d)}const m=new Map;for(const e of[...a.keys()].sort(w))s.known?.has(e)||m.set(e,[...a.get(e)].sort());return m}function w(t,p){return t<p?-1:t>p?1:0}function R(t,p){return["/**",...p.header.map(a=>a?` * ${a}`:" *")," */",`export const ${p.constant} = {`,...[...t].map(a=>` ${JSON.stringify(a)}: ${JSON.stringify(a)},`),"} as const;","",`/** Every phrase of {@link ${p.constant}}: what a host's words are keyed by. */`,`export type ${p.phraseType} = keyof typeof ${p.constant};`,""].join(`
2
2
  `)}function I(t,p,s){const{check:a,report:k}=A("editor words");{const f=[{path:"fixture.tsx",text:['const a = say("Delete {name}", { name });','const b = sayCount("{n} page", "{n} pages", n);','const c = text("Heading", "Main heading", "A hint");','const d = select("Align", icon, [{ label: "Left", value: "left" }], "left", "A note");','const e = segmented("Size", icon, ["Small", "Large"], "Small");','const SERIES_PH = { headTitle: "Section heading", link: "#" };','export const CORNER_SIDES_LABEL = "Corner sides";','const VIEW_TIER_LABEL = { desktop: "Desktop" };',"const DEFAULT_LABEL_KEY = 12;",'const FOCUS_HINT: CSSProperties = { display: "flex" };','const LAYOUT_TABS = "tabs";','const TEMPLATE_GROUP = { group: "Template pages", groupKey: "template" };','const a4 = <MenuLink label="text-fg" />;','const THEME_COLOUR_ROWS = [{ key: "fg", label: "Text color" }, { group: "Borders" }];','const a1 = <GroupLabel label="Wording" />;','const a2 = <input label="raw" />;','const a3 = say("Already listed");','const f = toggle("Show", false, "not-a-word");','const i = pxField("Corners", { min: 0, unsetLabel: on ? "Square" : "Round", hint: opts?.hint ?? "Rounds it." });','const g = { label: "Content", href: "/" };',"const h = say(`${x} colour`);"].join(`
3
- `)},{path:"names.ts",text:'export const N = [{ key: "openers", title: "Hero & intros", sections: [{ type: "Hero", label: "Hero Slideshow" }] }];'},{path:"block.tsx",text:'export const B = { label: "Banner", fields: {}, defaultProps: { cta: { label: "Shop now", href: "/" } } };'}],o=[...L(t,f,{dataFiles:[{path:"names.ts",keys:["title"]}],known:new Set(["Already listed"])}).keys()],y=["A hint","A note","Align","Banner","Borders","Corner sides","Corners","Round","Rounds it.","Square","Template pages","Text color","Wording","Desktop","Delete {name}","Heading","Hero & intros","Hero Slideshow","Large","Left","Main heading","Section heading","Show","Size","Small","{n} page","{n} pages"].sort(w);a("the reader reads every shape on a fixture, and no value, link or built phrase",JSON.stringify(o)===JSON.stringify(y),`read ${JSON.stringify(o)}`)}const S=L(t,p,s);a(`the source says at least ${s.floor} phrases`,S.size>=s.floor,`read ${S.size}: the reader broke, or the editor stopped saying its words through it`);const u=z(S.keys(),s.shape);if(!s.catalogue)a("the catalogue exists",!1,`run ${s.write}`);else{const f=s.catalogue.text===u;let o;if(!f){const y=new Set([...s.catalogue.text.matchAll(/^ {2}("(?:[^"\\]|\\.)*"): /gm)].map(e=>JSON.parse(e[1]))),g=[...S.keys()].filter(e=>!y.has(e)),m=[...y].filter(e=>!S.has(e));o=`${s.catalogue.path} is not what the source says — run ${s.write}. Missing ${g.length}${g.length?` (${g.slice(0,5).map(e=>JSON.stringify(e)).join(", ")}…)`:""}; no longer said ${m.length}${m.length?` (${m.slice(0,5).map(e=>JSON.stringify(e)).join(", ")}…)`:""}.`}a(`${s.catalogue.path} lists exactly the ${S.size} phrases the source says`,f,o)}return k()}export{E as BUILDER_WORDS,L as editorPhrases,I as editorWordsCatalogue,z as editorWordsCatalogueText,C as isPhrase};
3
+ `)},{path:"names.ts",text:'export const N = [{ key: "openers", title: "Hero & intros", sections: [{ type: "Hero", label: "Hero Slideshow" }] }];'},{path:"block.tsx",text:'export const B = { label: "Banner", fields: {}, defaultProps: { cta: { label: "Shop now", href: "/" } } };'}],o=[...L(t,f,{dataFiles:[{path:"names.ts",keys:["title"]}],known:new Set(["Already listed"])}).keys()],y=["A hint","A note","Align","Banner","Borders","Corner sides","Corners","Round","Rounds it.","Square","Template pages","Text color","Wording","Desktop","Delete {name}","Heading","Hero & intros","Hero Slideshow","Large","Left","Main heading","Section heading","Show","Size","Small","{n} page","{n} pages"].sort(w);a("the reader reads every shape on a fixture, and no value, link or built phrase",JSON.stringify(o)===JSON.stringify(y),`read ${JSON.stringify(o)}`)}const S=L(t,p,s);a(`the source says at least ${s.floor} phrases`,S.size>=s.floor,`read ${S.size}: the reader broke, or the editor stopped saying its words through it`);const u=R(S.keys(),s.shape);if(!s.catalogue)a("the catalogue exists",!1,`run ${s.write}`);else{const f=s.catalogue.text===u;let o;if(!f){const y=new Set([...s.catalogue.text.matchAll(/^ {2}("(?:[^"\\]|\\.)*"): /gm)].map(e=>JSON.parse(e[1]))),g=[...S.keys()].filter(e=>!y.has(e)),m=[...y].filter(e=>!S.has(e));o=`${s.catalogue.path} is not what the source says — run ${s.write}. Missing ${g.length}${g.length?` (${g.slice(0,5).map(e=>JSON.stringify(e)).join(", ")}…)`:""}; no longer said ${m.length}${m.length?` (${m.slice(0,5).map(e=>JSON.stringify(e)).join(", ")}…)`:""}.`}a(`${s.catalogue.path} lists exactly the ${S.size} phrases the source says`,f,o)}return k()}export{E as BUILDER_WORDS,L as editorPhrases,I as editorWordsCatalogue,R as editorWordsCatalogueText,C as isPhrase};
@@ -1,11 +1,7 @@
1
1
  import { type RuleReport, type SourceFile } from "./rule.js";
2
- export declare const CONTROLS_FILE = "lib/document/controls.tsx";
3
2
  export type NoGlyphRowsOptions = {
4
3
  readonly expected: number;
5
4
  readonly minChars: number;
6
- readonly controls?: {
7
- readonly buildersFloor: number;
8
- };
9
5
  };
10
6
  export type NoGlyphRow = {
11
7
  readonly at: string;
@@ -1,4 +1,4 @@
1
- import{isRegistryPath as x,registryFiles as y}from"./support/registry-source.js";import{ruleChecks as w}from"./rule.js";import{isDocumentPath as b}from"./support/document-folder.js";const p="lib/document/controls.tsx",u=s=>b(s,"controls.tsx"),f=/doc\/naming\.md|N10\.\d|owner|GG|SS seat|editor-shell|\d{4}-\d{2}-\d{2}/;function G(s){const e=y(s),o=s.filter(n=>u(n.path)&&!x(n.path)),l=s.filter(n=>/^components\/[^/]+\.tsx$/.test(n.path));return[...e,...o,...l]}function g(s){const e=s.text,o=[],l=/noGlyph\(/g;let n;for(;n=l.exec(e);){const h=e.lastIndexOf(`
2
- `,n.index)+1,r=e.slice(h,n.index);if(/^\s*(\/\/|\*|\/\*)/.test(r)||(r.match(/"/g)??[]).length%2===1||/\bfunction\s+$/.test(r))continue;let c=1,a=n.index+n[0].length;for(;a<e.length&&c>0;a++)e[a]==="("?c+=1:e[a]===")"&&(c-=1);const i=[...e.slice(n.index+n[0].length,a-1).matchAll(/"((?:[^"\\]|\\.)*)"/g)].map(m=>m[1]).join(""),d=e.slice(0,n.index).split(`
3
- `).length;o.push({at:`${s.path}:${d}`,reason:i})}return o}function A(s,e){const{check:o,report:l}=w("no-glyph rows");{const t=g({path:"fixture.tsx",text:["/**"," * `noGlyph(reason)` — the docblock names it; that is not a use."," */","export function noGlyph(reason: string) {",' if (!reason) throw new Error("noGlyph() needs a reason");',"}",'const a = select("Process", noGlyph(',` "A facet's options grow out of the CATALOGUE — owner, " +`,' "2026-08-29.",',"));",'// noGlyph("in a comment") is not a use','const b = noGlyph("");'].join(`
4
- `)});o("the reader finds the two calls, and neither the docblock, the declaration, the string nor the comment",t.length===2&&t[0].at==="fixture.tsx:7"&&t[1].at==="fixture.tsx:12",JSON.stringify(t)),o("…reads a concatenated reason whole, so it can be checked for a source",t[0]?.reason==="A facet's options grow out of the CATALOGUE — owner, 2026-08-29."&&f.test(t[0].reason),JSON.stringify(t[0])),o("…and reads a bare call as no reason",t[1]?.reason==="",JSON.stringify(t[1]))}const n=G(s),h=n.reduce((t,i)=>t+i.text.length,0);o(`the scan read the files it meant to (${n.length} files, ${h} characters, at least ${e.minChars})`,h>=e.minChars,"the registry, lib/document/controls.tsx or components/ moved — a scan that reads nothing finds no exceptions");const r=n.flatMap(g),c=r.filter(t=>!t.reason.trim());o("every noGlyph() states a reason",c.length===0,c.map(t=>t.at).join(" · "));const a=r.filter(t=>t.reason.trim()&&!f.test(t.reason));if(o("…and every reason names a source that can be checked",a.length===0,a.map(t=>`${t.at} — "${t.reason.slice(0,60)}"`).join(" · ")),o(`the no-glyph rows still number ${e.expected} (found ${r.length}${r.length?`: ${r.map(t=>t.at).join(", ")}`:""})`,r.length===e.expected,"a ruling was added or lost — move the number, with the ruling, in the guard that counts it"),e.controls){const t=s.find(d=>u(d.path))?.text??"";o(`read ${p}`,t.length>0,"the file noGlyph and iconOf are written in is not among the files handed in"),o(`noGlyph is still exported from ${p}`,/export function noGlyph\(/.test(t)),o("…and a marker is unwrapped rather than drawn as an empty gutter",/export function iconOf\(/.test(t)&&/isNoGlyph\(icon\) \? undefined : icon/.test(t),"SettingsField draws its icon span only when given an icon");const i=(t.match(/icon=\{iconOf\(icon\)\}/g)??[]).length;o(`…and the shared builders pass their icon through it (${i}, at least ${e.controls.buildersFloor})`,i>=e.controls.buildersFloor,`${i} builders`)}return l()}export{p as CONTROLS_FILE,A as noGlyphRows,g as noGlyphRowsIn};
1
+ import{isRegistryPath as g,registryFiles as m}from"./support/registry-source.js";import{ruleChecks as x}from"./rule.js";import{isDocumentPath as y}from"./support/document-folder.js";const w=s=>y(s,"controls.tsx"),d=/doc\/naming\.md|N10\.\d|owner|GG|SS seat|editor-shell|\d{4}-\d{2}-\d{2}/;function G(s){const n=m(s),o=s.filter(e=>w(e.path)&&!g(e.path)),c=s.filter(e=>/^components\/[^/]+\.tsx$/.test(e.path));return[...n,...o,...c]}function p(s){const n=s.text,o=[],c=/noGlyph\(/g;let e;for(;e=c.exec(n);){const h=n.lastIndexOf(`
2
+ `,e.index)+1,r=n.slice(h,e.index);if(/^\s*(\/\/|\*|\/\*)/.test(r)||(r.match(/"/g)??[]).length%2===1||/\bfunction\s+$/.test(r))continue;let i=1,a=e.index+e[0].length;for(;a<n.length&&i>0;a++)n[a]==="("?i+=1:n[a]===")"&&(i-=1);const l=[...n.slice(e.index+e[0].length,a-1).matchAll(/"((?:[^"\\]|\\.)*)"/g)].map(u=>u[1]).join(""),f=n.slice(0,e.index).split(`
3
+ `).length;o.push({at:`${s.path}:${f}`,reason:l})}return o}function S(s,n){const{check:o,report:c}=x("no-glyph rows");{const t=p({path:"fixture.tsx",text:["/**"," * `noGlyph(reason)` — the docblock names it; that is not a use."," */","export function noGlyph(reason: string) {",' if (!reason) throw new Error("noGlyph() needs a reason");',"}",'const a = select("Process", noGlyph(',` "A facet's options grow out of the CATALOGUE — owner, " +`,' "2026-08-29.",',"));",'// noGlyph("in a comment") is not a use','const b = noGlyph("");'].join(`
4
+ `)});o("the reader finds the two calls, and neither the docblock, the declaration, the string nor the comment",t.length===2&&t[0].at==="fixture.tsx:7"&&t[1].at==="fixture.tsx:12",JSON.stringify(t)),o("…reads a concatenated reason whole, so it can be checked for a source",t[0]?.reason==="A facet's options grow out of the CATALOGUE — owner, 2026-08-29."&&d.test(t[0].reason),JSON.stringify(t[0])),o("…and reads a bare call as no reason",t[1]?.reason==="",JSON.stringify(t[1]))}const e=G(s),h=e.reduce((t,l)=>t+l.text.length,0);o(`the scan read the files it meant to (${e.length} files, ${h} characters, at least ${n.minChars})`,h>=n.minChars,"the registry, lib/document/controls.tsx or components/ moved — a scan that reads nothing finds no exceptions");const r=e.flatMap(p),i=r.filter(t=>!t.reason.trim());o("every noGlyph() states a reason",i.length===0,i.map(t=>t.at).join(" · "));const a=r.filter(t=>t.reason.trim()&&!d.test(t.reason));return o("…and every reason names a source that can be checked",a.length===0,a.map(t=>`${t.at} — "${t.reason.slice(0,60)}"`).join(" · ")),o(`the no-glyph rows still number ${n.expected} (found ${r.length}${r.length?`: ${r.map(t=>t.at).join(", ")}`:""})`,r.length===n.expected,"a ruling was added or lost — move the number, with the ruling, in the guard that counts it"),c()}export{S as noGlyphRows,p as noGlyphRowsIn};
@@ -0,0 +1,7 @@
1
+ import { type RuleReport, type SourceFile } from "./rule.js";
2
+ export type OneLoopModuleOptions = {
3
+ readonly moduleDir: string;
4
+ readonly allowed?: Readonly<Record<string, string>>;
5
+ readonly minFiles: number;
6
+ };
7
+ export declare function oneLoopModule(files: readonly SourceFile[], options: OneLoopModuleOptions): RuleReport;
@@ -0,0 +1,6 @@
1
+ import{ruleChecks as k}from"./rule.js";import{stripComments as f}from"./support/ts-source.js";const b=/\.(ts|tsx|js|jsx|mjs|cjs)$/,u=new RegExp(`\\b${["storefront","ticker"].join("-")}(?:-(?:right|up|down))?\\b`,"g"),g=new RegExp("(?<![A-Za-z])infinite(?![A-Za-z])","g"),j=/\bmotionSeconds\(\s*["'`]loop["'`]|\bMOTION_TIMING(?:\.loop\b|\[\s*["'`]loop["'`]\s*\])/g,x=new RegExp(`\\b(?:${["ticker","scroll"].join("-")}|${["ticker","Animation"].join("")}|${["parse","Ticker","Scroll"].join("")}|${["TICKER","SCROLL","OPTIONS"].join("_")})\\b`,"g"),A=/\bparseOption\(\s*LOOP_\w*OPTIONS\b/g,T=/\b(?:loopFields|loopDirectionField|animationDurationField)\b/g;function a(l){const e=f(l),t=[];for(const n of e.matchAll(u))t.push(`loop keyframe (${n[0]})`);for(const n of e.matchAll(g))t.push(`endless animation (${n[0]})`);for(const n of e.matchAll(j))t.push(`loop time (${n[0]})`);for(const n of e.matchAll(x))t.push(`the old loop module (${n[0]})`);for(const n of e.matchAll(A))t.push(`loop reader (${n[0]})`);for(const n of e.matchAll(T))t.push(`loop row (${n[0]})`);return t}function S(l,e){const{check:t,report:n}=k("one loop module"),m=e.allowed??{};{const o=["storefront","ticker"].join("-"),s="infinite",O=[["a copied keyframe map",`const K = { left: "${o}" };`],["a direction keyframe",`const k = "${o}-down";`],["a hand-made marquee",`style={{ animation: \`spin 30s linear ${s}\` }}`],["a Tailwind marquee",`className="[animation:mq_40s_linear_${s}]"`],["the loop's time",'const sec = motionSeconds("loop", "duration", v);'],["the loop's time, by key","const r = MOTION_TIMING.loop.duration;"],["the old module's path",`import { x } from "@/lib/sections/${["ticker","scroll"].join("-")}";`],["the old writer",`${["ticker","Animation"].join("")}(dir, 50)`],["a loop reader",'parseOption(LOOP_DIRECTION_OPTIONS, "left", v)'],["a loop row","const f = { dir: loopDirectionField() };"],["the Duration row","const f = animationDurationField();"]];for(const[c,r]of O)t(`the reader finds ${c}`,a(r).length===1,a(r).join(", ")||"none");const w=[["a note that names it",`// runs ${o} for ever (${s})`],["the module's own writer, called","style={{ animation: loopAnimation(dir, step) }}"],["the entrance time",'motionSeconds("entrance", "duration", v)'],["a word that starts like one","const infinitely = true;"],["the one builder, called",'const f = animationTabFields("box");']];for(const[c,r]of w)t(`…and leaves ${c} alone`,a(r).length===0,a(r).join(", "))}const i=l.filter(o=>b.test(o.path));t(`read the source (${i.length} JS/TS files, at least ${e.minFiles})`,i.length>=e.minFiles,"fewer means the walk broke, and every check below is vacuous");const d=i.filter(o=>o.path.startsWith(e.moduleDir));t(`the module is there (${e.moduleDir}, ${d.length} files)`,d.some(o=>new RegExp(u.source).test(f(o.text))),"the keyframes are written in the module; none found means the folder moved");const h=i.filter(o=>!o.path.startsWith(e.moduleDir)&&!(o.path in m)).flatMap(o=>a(o.text).map(s=>`${o.path}: ${s}`));t("no file outside the module reads or writes a loop",h.length===0,`
2
+ ${h.join(`
3
+ `)}
4
+ A loop is ${e.moduleDir}: loopAnimation for the keyframe, loopSecondsOf and
5
+ parseLoopDirection for the stored values, LoopTrack for a Box's row,
6
+ animationTabFields for the rows on the Animation tab.`);const $=new Set(i.map(o=>o.path)),p=Object.keys(m).filter(o=>!$.has(o));return t("every exemption names a file that is still here",p.length===0,`drop these from \`allowed\`: ${p.join(", ")}`),n()}export{S as oneLoopModule};
@@ -0,0 +1,2 @@
1
+ import { type RuleReport, type SourceFile } from "./rule.js";
2
+ export declare function oneNodeList(files: readonly SourceFile[]): RuleReport;
@@ -0,0 +1 @@
1
+ import{ruleChecks as c}from"./rule.js";const a=/\b(?:function|const|let)\s+isNode(?:List|Array)?\b/,d=/Array\.isArray\(([\w.$]+)\)\s*(?:&&|\|\|)[^;]{0,240}?(?:\1\.every\(|\1\[0\])[^;]{0,240}?\btype\b/,h=/\.type\s*===\s*["']string["'][^;]{0,160}?\.props\b/;function p(r){const{check:s,report:i}=c("one node-list check"),o=r.filter(e=>/\.(?:ts|tsx|js|jsx|mjs)$/.test(e.path)),t=o.filter(e=>a.test(e.text)).map(e=>e.path);s("no file declares isNode / isNodeList / isNodeArray (import them from efficient-easel/data)",t.length===0,t.length?`a local node check: ${t.join(", ")}`:void 0);const n=o.filter(e=>d.test(e.text)||h.test(e.text)).map(e=>e.path);return s("no file writes the node check under another name",n.length===0,n.length?`a renamed node check: ${n.join(", ")}`:void 0),i()}export{p as oneNodeList};
@@ -0,0 +1,6 @@
1
+ import { type RuleReport, type SourceFile } from "./rule.js";
2
+ export type OnePageThemeReaderOptions = {
3
+ readonly allowed?: Readonly<Record<string, string>>;
4
+ readonly minFiles: number;
5
+ };
6
+ export declare function onePageThemeReader(files: readonly SourceFile[], options: OnePageThemeReaderOptions): RuleReport;
@@ -0,0 +1,6 @@
1
+ import{ruleChecks as w}from"./rule.js";const b=/\.(ts|tsx|js|jsx|mjs|cjs)$/,s=["data","theme"].join("-"),f="dark",k=[["reads data-theme",new RegExp(`getAttribute\\(\\s*["'\`]${s}["'\`]\\s*\\)`,"g")],["tests the dark class",new RegExp(`classList\\.contains\\(\\s*["'\`]${f}["'\`]\\s*\\)`,"g")],["watches data-theme alone",new RegExp(`attributeFilter\\s*:\\s*\\[\\s*["'\`]${s}["'\`]`,"g")],["watches the theme itself",/attributeFilter\s*:\s*ROOT_THEME_ATTRIBUTES\b/g]];function n(i){const o=[];for(const[e,l]of k)for(const a of i.matchAll(l))o.push(`${e} (${a[0]})`);return o}function T(i,o){const{check:e,report:l}=w("one page theme reader"),a=o.allowed??{};{const t=[["a light test",`const light = document.documentElement.getAttribute("${s}") === "light";`],["a dark test on another document",`const dark = doc.documentElement.getAttribute('${s}') !== "light";`],["a class test",`if (root.classList.contains("${f}")) return true;`],["an observer on the attribute",`obs.observe(root, { attributes: true, attributeFilter: ["${s}"] });`],["an observer on the shell's attribute list","obs.observe(root, { attributes: true, attributeFilter: ROOT_THEME_ATTRIBUTES });"]];for(const[u,r]of t)e(`the reader finds ${u}`,n(r).length===1,n(r).join(", "));const c=[["the shell's reader","const dark = rootIsDark({ doc, whenUnset: true });"],["the shell's watcher","return watchRootTheme(update, { doc });"],["the shell's hook","const dark = useRootIsDark({ doc, whenUnset: true });"],["a writer",`root.setAttribute("${s}", "light"); root.removeAttribute("${s}");`],["a writer's echo check by constant","return root.getAttribute(THEME_ATTR) === LIGHT_VALUE;"]];for(const[u,r]of c)e(`…and leaves ${u} alone`,n(r).length===0,n(r).join(", "))}const h=i.filter(t=>b.test(t.path));e(`read the source (${h.length} JS/TS files, at least ${o.minFiles})`,h.length>=o.minFiles,"fewer means the walk broke, and every check below is vacuous");const d=h.filter(t=>!(t.path in a)).flatMap(t=>n(t.text).map(c=>`${t.path}: ${c}`));e("no file reads the page's light/dark mode itself",d.length===0,`
2
+ ${d.join(`
3
+ `)}
4
+ Read it with rootIsDark (efficient-shell/format; whenUnset: true where the
5
+ site sheet is dark unless it says light), and watch it with watchRootTheme
6
+ (efficient-shell/format) or follow it with useRootIsDark (efficient-shell/theme).`);const g=new Set(h.map(t=>t.path)),m=Object.keys(a).filter(t=>!g.has(t));return e("every exemption names a file that is still here",m.length===0,`drop these from \`allowed\`: ${m.join(", ")}`),l()}export{T as onePageThemeReader};
@@ -1,2 +1,2 @@
1
1
  import{fontRoleOfClassName as y,FONT_ROLE_LABELS as x}from"../fonts.js";import{inlineTextSizes as w,isRuleSource as E,ruleChecks as N}from"./rule.js";import{enclosingLiteral as R}from"./heading-ceiling-sweep.js";import{stripComments as b}from"./support/ts-source.js";import{typeScaleGroupOfClassName as u}from"../theme.js";const T=["app/","components/","lib/"],p={"font-display":"heading","font-heading2":"heading2","font-heading3":"heading3","font-body":"body","font-serif":"accent","font-mono":"label"},k={heading:"--font-role-heading",heading2:"--font-role-heading2",heading3:"--font-role-heading3",body:"--font-role-body",accent:"--font-role-accent",label:"--font-role-label"},$=[];function L(m){const n=[],t=new Set;for(const d of m){const c=b(w(d.text)),l=/\bfont-(?:display|body|serif|mono)\b/g;let r;for(;r=l.exec(c);){const i=R(c,r.index);if(!i)continue;const o=c.slice(0,r.index).split(`
2
- `).length,h=`${d.path}:${o}:${i}`;if(t.has(h))continue;t.add(h);const g=i.split(/\s+/).filter(a=>!a.slice(0,a.lastIndexOf(":")+1).includes("&")).map(a=>a.slice(a.lastIndexOf(":")+1)),f=Object.keys(p).filter(a=>g.includes(a));f.length!==0&&n.push({file:d.path,line:o,className:i,utilities:f})}}return n}function I(m,n){const{check:t,report:d}=N("part style naming"),c=m.filter(e=>/\.tsx?$/.test(e.path)&&!E(e.path)&&T.some(s=>e.path.startsWith(s))),l=L(c),r=new Map(m.map(e=>[e.path,e]));t(`read the source (${c.length} .ts/.tsx files)`,c.length>0,"found no source to sweep — this rule is not measuring anything"),t(`the scanner finds face-tagged class lists at all (${l.length}, at least ${n.minSites})`,l.length>=n.minSites);const i=l.filter(e=>u(e.className)!==null),o=l.filter(e=>u(e.className)===null);t(`…both taggings are represented, so neither branch below is untested (${i.length} with a scale token, at least ${n.minWithScale})`,i.length>=n.minWithScale&&i.length>0),t(`…and the face-without-a-size-knob population is real, not an artefact (${o.length}, at least ${n.minWithoutScale})`,o.length>=n.minWithoutScale&&o.length>0,`${o.length} class lists carry a face utility and no matching scale token`);const h=l.filter(e=>y(e.className)!==p[e.utilities[0]]);if(t("every class list in the census reads back as its own utility's role",h.length===0,h.slice(0,5).map(e=>`${e.file}:${e.line} has ${e.utilities[0]} but reads ${y(e.className)}`).join("; ")),n.roleSheet!==void 0){const e=r.get(n.roleSheet),s=Object.values(k).filter(O=>!e||!e.text.includes(O));t(`…and every role named here is a custom property ${n.roleSheet} defines`,!!e&&s.length===0,e?s.join(", "):"the sheet was not read")}const g=Object.values(p).filter(e=>!(e in x));t("every face utility names a role the panel offers",g.length===0,g.join(", "));const f=Object.keys(x).filter(e=>!Object.values(p).includes(e));t("…and the roles no utility can name are exactly the ones decided to have none",f.join()===$.join(),`no utility reaches: [${f}] — expected [${$}]`);const a=o.filter(e=>u(e.className)!==null);t("no class list without a scale token claims a size group",a.length===0,a.slice(0,5).map(e=>`${e.file}:${e.line}`).join("; ")),t("the reported case: a `font-display text-[22px]` heading is Headings, size group none",y("font-display text-[22px] font-medium")==="heading"&&u("font-display text-[22px] font-medium")===null),t("…and genuinely body-tagged copy still reads as the body size group",u("text-[var(--size-body,16px)]")==="body");const S=l.filter(e=>e.utilities.length>1);if(t("every class list names at most one face",S.length===0,S.slice(0,5).map(e=>`${e.file}:${e.line} — ${e.utilities.join(" + ")}`).join("; ")),n.panel!==void 0){const e=r.get(n.panel),s=e?b(e.text):"";t(`read the part panel ${n.panel}`,!!e),t("the box's name comes from the FACE, not from a size group",s.includes("FONT_ROLE_LABELS[face.role]")&&!s.includes("TYPE_GROUP_LABELS[")),t("…a face the page does not draw as its declared role is called Custom",/return\s*"Custom"/.test(s)&&s.includes('kind: "custom"')),t("…and a part no size knob reaches says so under the text box",/sizeGroup === null && \(\s*<p className="es-field-hint sf-hint-keep">(?:\{say\(")?Fixed size/.test(s))}if(n.bridge!==void 0){const e=r.get(n.bridge),s=e?b(e.text):"";t(`read the preview's part bridge ${n.bridge}`,!!e),t("the preview publishes BOTH tags, each walked up to its own nearest declarer",s.includes("fontRoleOfClassName")&&s.includes("typeScaleGroupOfClassName")&&s.includes("el.parentElement")),t("…and the element it reads from is one that declares EITHER tag",/partStyleSource\([\s\S]{0,200}fontRoleOfClassName[\s\S]{0,120}typeScaleGroupOfClassName/.test(s))}return d()}export{I as partStyleNaming};
2
+ `).length,h=`${d.path}:${o}:${i}`;if(t.has(h))continue;t.add(h);const g=i.split(/\s+/).filter(a=>!a.slice(0,a.lastIndexOf(":")+1).includes("&")).map(a=>a.slice(a.lastIndexOf(":")+1)),f=Object.keys(p).filter(a=>g.includes(a));f.length!==0&&n.push({file:d.path,line:o,className:i,utilities:f})}}return n}function I(m,n){const{check:t,report:d}=N("part style naming"),c=m.filter(e=>/\.tsx?$/.test(e.path)&&!E(e.path)&&T.some(s=>e.path.startsWith(s))),l=L(c),r=new Map(m.map(e=>[e.path,e]));t(`read the source (${c.length} .ts/.tsx files)`,c.length>0,"found no source to sweep — this rule is not measuring anything"),t(`the scanner finds face-tagged class lists at all (${l.length}, at least ${n.minSites})`,l.length>=n.minSites);const i=l.filter(e=>u(e.className)!==null),o=l.filter(e=>u(e.className)===null);t(`…both taggings are represented, so neither branch below is untested (${i.length} with a scale token, at least ${n.minWithScale})`,i.length>=n.minWithScale&&i.length>0),t(`…and the face-without-a-size-knob population is real, not an artefact (${o.length}, at least ${n.minWithoutScale})`,o.length>=n.minWithoutScale&&o.length>0,`${o.length} class lists carry a face utility and no matching scale token`);const h=l.filter(e=>y(e.className)!==p[e.utilities[0]]);if(t("every class list in the census reads back as its own utility's role",h.length===0,h.slice(0,5).map(e=>`${e.file}:${e.line} has ${e.utilities[0]} but reads ${y(e.className)}`).join("; ")),n.roleSheet!==void 0){const e=r.get(n.roleSheet),s=Object.values(k).filter(O=>!e||!e.text.includes(O));t(`…and every role named here is a custom property ${n.roleSheet} defines`,!!e&&s.length===0,e?s.join(", "):"the sheet was not read")}const g=Object.values(p).filter(e=>!(e in x));t("every face utility names a role the panel offers",g.length===0,g.join(", "));const f=Object.keys(x).filter(e=>!Object.values(p).includes(e));t("…and the roles no utility can name are exactly the ones decided to have none",f.join()===$.join(),`no utility reaches: [${f}] — expected [${$}]`);const a=o.filter(e=>u(e.className)!==null);t("no class list without a scale token claims a size group",a.length===0,a.slice(0,5).map(e=>`${e.file}:${e.line}`).join("; ")),t("the reported case: a `font-display text-[22px]` heading is Headings, size group none",y("font-display text-[22px] font-medium")==="heading"&&u("font-display text-[22px] font-medium")===null),t("…and genuinely body-tagged copy still reads as the body size group",u("text-[var(--size-body,16px)]")==="body");const S=l.filter(e=>e.utilities.length>1);if(t("every class list names at most one face",S.length===0,S.slice(0,5).map(e=>`${e.file}:${e.line} — ${e.utilities.join(" + ")}`).join("; ")),n.panel!==void 0){const e=r.get(n.panel),s=e?b(e.text):"";t(`read the part panel ${n.panel}`,!!e),t("the box's name comes from the FACE, not from a size group",s.includes("FONT_ROLE_LABELS[face.role]")&&!s.includes("TYPE_GROUP_LABELS[")),t("…a face the page does not draw as its declared role is called Custom",/return\s*"Custom"/.test(s)&&s.includes('kind: "custom"')),t("…and a part no size knob reaches says so under the text box",/sizeGroup === null(?: && shows\("fixedSizeHint"\))? && \(\s*<p className="es-field-hint sf-hint-keep">(?:\{say\(")?Fixed size/.test(s))}if(n.bridge!==void 0){const e=r.get(n.bridge),s=e?b(e.text):"";t(`read the preview's part bridge ${n.bridge}`,!!e),t("the preview publishes BOTH tags, each walked up to its own nearest declarer",s.includes("fontRoleOfClassName")&&s.includes("typeScaleGroupOfClassName")&&s.includes("el.parentElement")),t("…and the element it reads from is one that declares EITHER tag",/partStyleSource\([\s\S]{0,200}fontRoleOfClassName[\s\S]{0,120}typeScaleGroupOfClassName/.test(s))}return d()}export{I as partStyleNaming};
@@ -0,0 +1,5 @@
1
+ import { type RuleReport, type SourceFile } from "./rule.js";
2
+ export type ShellWidthTokenNotColourOptions = {
3
+ readonly minFiles: number;
4
+ };
5
+ export declare function shellWidthTokenNotColour(files: readonly SourceFile[], options: ShellWidthTokenNotColourOptions): RuleReport;
@@ -0,0 +1,2 @@
1
+ import{ruleChecks as i}from"./rule.js";const n=String.raw`var\(--border-(?:hairline|strong|accent)\b`,h=new RegExp(String.raw`(?:\b(?:solid|dashed|dotted|double)\s+${n})`+String.raw`|(?:${n}\s*,\s*(?:#|rgb|hsl))`+String.raw`|(?:\b(?:color|background|backgroundColor|background-color|borderColor|border-color|fill|stroke|outlineColor|outline-color)\s*:\s*["'\x60]?\s*${n})`);function r(e){return e.split(`
2
+ `).flatMap((t,o)=>h.test(t)?[o+1]:[])}function b(e,t){const{check:o,report:d}=i("shell width token not colour");o("the reader finds a width token used as a colour",r('border: "1px solid var(--border-strong, #d0d0d0)"').length===1&&r(" border: 1px dashed var(--border-hairline);").length===1&&r('{ color: "var(--border-accent)" }').length===1&&r("border-color: var(--border-strong);").length===1&&r('`1px solid ${on ? "x" : "var(--border-strong, #d0d0d0)"}`').length===1),o("the reader passes a width token used as a width, and a colour role",r("border-width: var(--border-strong);").length===0&&r("border: var(--border-hairline) solid var(--line-strong);").length===0&&r('border: "1px solid var(--line-strong)"').length===0),o(`read the source (${e.length} files, at least ${t.minFiles})`,e.length>=t.minFiles,"fewer means the walk broke, and the check below is vacuous");const l=e.flatMap(a=>r(a.text).map(s=>`${a.path}:${s}`));return o("no file uses --border-hairline / --border-strong / --border-accent as a colour",l.length===0,`a width token as a colour at: ${l.join(", ")} — use the shell's --line / --line-strong role`),d()}export{b as shellWidthTokenNotColour};
@@ -1,3 +1,3 @@
1
- import{ruleChecks as f}from"./rule.js";const c=["--site-radius","--site-radius-xs","--site-radius-sm","--site-radius-md","--site-radius-lg","--site-radius-xl","--site-radius-2xl","--site-radius-3xl","--site-radius-4xl"],a=(i,r)=>JSON.stringify(i)===JSON.stringify(r);function h(i){const r=[];return i.text.split(`
2
- `).forEach((s,u)=>{for(const o of s.matchAll(/["'`]([^"'`]*\brounded-full\b[^"'`]*)["'`]/g))/(^|\s)px-(?!0\b|0\.5\b|1\b|px\b)[\d[]/.test(o[1])&&r.push(`${i.path}:${u+1}`)}),r}function g(i,r){const{check:s,report:u}=f("site square by default"),o=e=>i.find(n=>n.path===e),t=r.corners;if(t){const e=t.siteCornerRadiusTokens(null);s("a website that has chosen no corners publishes every step of the radius scale a `rounded-*` utility reads",c.every(n=>n in e),`missing: ${c.filter(n=>!(n in e)).join(", ")}`),s("…and the card's and the button's own properties","--sf-card-radius"in e&&"--sf-button-radius"in e),s("…every one of them 0 — square",Object.values(e).every(n=>n==="0"),JSON.stringify(e)),s("…exactly what a site that chose 0 publishes",a(e,t.cornerRadiusTokens(0))),s("an absent value and a blank one are the same statement",a(t.siteCornerRadiusTokens(void 0),e)&&a(t.siteCornerRadiusTokens(""),e)&&a(t.siteCornerRadiusTokens(" "),e)),s("a website that has chosen keeps its number",a(t.siteCornerRadiusTokens(16),t.cornerRadiusTokens(16))&&t.siteCornerRadiusTokens(16)["--site-radius-lg"]==="1rem"),s('the retired `large` word is still 16, and `small` is still "not set"',t.cornerStyleToPx[t.normalizeCornerStyle("large")]===16&&t.cornerStyleToPx[t.normalizeCornerStyle("small")]===null),s('`cornerRadiusTokens(null)` publishes NOTHING — not set there means "follow the site"',a(t.cornerRadiusTokens(null),{})),s("…so an untouched section declares no radius of its own",t.sectionCornerStyle(null)===void 0,JSON.stringify(t.sectionCornerStyle(null)))}if(r.livePage!==void 0){const e=o(r.livePage);if(s(`read the live page's layout ${r.livePage}`,!!e)){const n=e.text;s("the live page publishes the site's corners through siteCornerRadiusTokens",/const siteCornerTokens = siteCornerRadiusTokens\(/.test(n)&&/\.\.\.siteCornerTokens,/.test(n)),s("…and never through the two that publish nothing for an untouched site",!/\bcornerRadiusTokens\(|\bcornerStyleTokens\(/.test(n))}}if(r.canvas!==void 0){const e=o(r.canvas);if(s(`read the editor canvas ${r.canvas}`,!!e)){const n=e.text;s("the editor canvas publishes them through the same function",/\.\.\.siteCornerRadiusTokens\(cornerRadiusPx\),/.test(n)&&/siteCardRadiusTokens\(siteCornerRadiusTokens\(cornerRadiusPx\)\)/.test(n)),s("…and nowhere through the bare one",!/(?<![A-Za-z])cornerRadiusTokens\(/.test(n))}}{const e=h({path:"fixture.tsx",text:['<button className="rounded-full px-4 py-2">Sign in</button>','<span className="rounded-full px-1 text-xs">3</span>','<span className="h-2 w-2 rounded-full bg-fg" />',"<i className={`rounded-full px-[10px]`} />"].join(`
3
- `)});s("the pill sweep flags a padded circle, and neither a count badge nor a dot",a(e,["fixture.tsx:1","fixture.tsx:4"]),JSON.stringify(e))}const l=i.filter(e=>e.path.endsWith(".tsx"));s(`the pill sweep read the .tsx files (${l.length}, at least ${r.minFiles})`,l.length>=r.minFiles&&l.length>0);const d=l.flatMap(h);return s("no control with horizontal padding wears the circle utility",d.length===0,d.join(", ")),u()}export{g as siteSquareByDefault};
1
+ import{ruleChecks as f}from"./rule.js";const c=["--site-radius","--site-radius-xs","--site-radius-sm","--site-radius-md","--site-radius-lg","--site-radius-xl","--site-radius-2xl","--site-radius-3xl","--site-radius-4xl"],a=(i,n)=>JSON.stringify(i)===JSON.stringify(n);function h(i){const n=[];return i.text.split(`
2
+ `).forEach((t,u)=>{for(const o of t.matchAll(/["'`]([^"'`]*\brounded-full\b[^"'`]*)["'`]/g))/(^|\s)px-(?!0\b|0\.5\b|1\b|px\b)[\d[]/.test(o[1])&&n.push(`${i.path}:${u+1}`)}),n}function g(i,n){const{check:t,report:u}=f("site square by default"),o=e=>i.find(r=>r.path===e),s=n.corners;if(s){const e=s.siteCornerRadiusTokens(null);t("a website that has chosen no corners publishes every step of the radius scale a `rounded-*` utility reads",c.every(r=>r in e),`missing: ${c.filter(r=>!(r in e)).join(", ")}`),t("…and the card's and the button's own properties","--sf-card-radius"in e&&"--sf-button-radius"in e),t("…every one of them 0 — square",Object.values(e).every(r=>r==="0"),JSON.stringify(e)),t("…exactly what a site that chose 0 publishes",a(e,s.cornerRadiusTokens(0))),t("an absent value and a blank one are the same statement",a(s.siteCornerRadiusTokens(void 0),e)&&a(s.siteCornerRadiusTokens(""),e)&&a(s.siteCornerRadiusTokens(" "),e)),t("a website that has chosen keeps its number",a(s.siteCornerRadiusTokens(16),s.cornerRadiusTokens(16))&&s.siteCornerRadiusTokens(16)["--site-radius-lg"]==="1rem"),t('the retired `large` word is still 16, and `small` is still "not set"',s.cornerStyleToPx[s.normalizeCornerStyle("large")]===16&&s.cornerStyleToPx[s.normalizeCornerStyle("small")]===null),t('`cornerRadiusTokens(null)` publishes NOTHING — not set there means "follow the site"',a(s.cornerRadiusTokens(null),{})),t("…so an untouched section declares no radius of its own",s.sectionCornerStyle(null)===void 0,JSON.stringify(s.sectionCornerStyle(null)))}if(n.livePage!==void 0){const e=o(n.livePage);if(t(`read the live page's layout ${n.livePage}`,!!e)){const r=e.text;t("the live page publishes the site's corners through siteCornerRadiusTokens",/const siteCornerTokens = siteCornerRadiusTokens\(/.test(r)&&/\.\.\.siteCornerTokens,/.test(r)),t("…and never through the two that publish nothing for an untouched site",!/\bcornerRadiusTokens\(|\bcornerStyleTokens\(/.test(r))}}if(n.canvas!==void 0){const e=o(n.canvas);if(t(`read the editor canvas ${n.canvas}`,!!e)){const r=e.text;t("the editor canvas publishes them through the same function",/\.\.\.siteCornerRadiusTokens\(cornerRadiusPx\),/.test(r)),t("…and nowhere through the bare one",!/(?<![A-Za-z])cornerRadiusTokens\(/.test(r))}}{const e=h({path:"fixture.tsx",text:['<button className="rounded-full px-4 py-2">Sign in</button>','<span className="rounded-full px-1 text-xs">3</span>','<span className="h-2 w-2 rounded-full bg-fg" />',"<i className={`rounded-full px-[10px]`} />"].join(`
3
+ `)});t("the pill sweep flags a padded circle, and neither a count badge nor a dot",a(e,["fixture.tsx:1","fixture.tsx:4"]),JSON.stringify(e))}const l=i.filter(e=>e.path.endsWith(".tsx"));t(`the pill sweep read the .tsx files (${l.length}, at least ${n.minFiles})`,l.length>=n.minFiles&&l.length>0);const d=l.flatMap(h);return t("no control with horizontal padding wears the circle utility",d.length===0,d.join(", ")),u()}export{g as siteSquareByDefault};
@@ -1,2 +1,2 @@
1
- function N(t,i){const r=t.createSourceFile(i.path,i.text,t.ScriptTarget.Latest,!0),s=[],n=o=>{(t.isImportDeclaration(o)||t.isExportDeclaration(o))&&o.moduleSpecifier&&t.isStringLiteral(o.moduleSpecifier)&&s.push(o.moduleSpecifier.text),t.isCallExpression(o)&&(o.expression.kind===t.SyntaxKind.ImportKeyword||t.isIdentifier(o.expression)&&o.expression.text==="require")&&o.arguments.length>0&&t.isStringLiteral(o.arguments[0])&&s.push(o.arguments[0].text),o.forEachChild(n)};return n(r),s}const k=t=>/\.(tsx?|mts)$/.test(t)&&!t.endsWith(".d.ts");function L(t,i){const r=new Map,s=new Set(["/"]);for(const e of i){if(!k(e.path))continue;r.set(`/${e.path}`,e.text);const c=e.path.split("/");for(let u=1;u<c.length;u++)s.add(`/${c.slice(0,u).join("/")}`)}const n={noLib:!0,types:[],noEmit:!0,jsx:t.JsxEmit.Preserve,target:t.ScriptTarget.ESNext,module:t.ModuleKind.ESNext,moduleResolution:t.ModuleResolutionKind.Bundler,baseUrl:"/",paths:{"@/*":["./*"]}},o={fileExists:e=>r.has(e),readFile:e=>r.get(e),directoryExists:e=>s.has(e.replace(/\/+$/,"")||"/"),getDirectories:()=>[],realpath:e=>e,getSourceFile:(e,c)=>{const u=r.get(e);return u===void 0?void 0:t.createSourceFile(e,u,c,!0)},getDefaultLibFileName:()=>"/lib.d.ts",writeFile:()=>{},getCurrentDirectory:()=>"/",getCanonicalFileName:e=>e,useCaseSensitiveFileNames:()=>!0,getNewLine:()=>`
2
- `};return t.createProgram({rootNames:[...r.keys()],options:n,host:o})}function M(t,i,r){const s=L(t,i),n=s.getTypeChecker();let o;s.getSourceFile(`/${r.file}`)?.forEachChild(a=>{t.isFunctionDeclaration(a)&&a.name?.text==="select"&&(o=a)});const e=new Set(r.modules??[]),c=a=>{if(!t.isImportSpecifier(a))return!1;const m=a.parent.parent.parent;return(a.propertyName??a.name).text==="select"&&t.isStringLiteral(m.moduleSpecifier)&&e.has(m.moduleSpecifier.text)},u=[];for(const a of s.getSourceFiles()){if(a.isDeclarationFile)continue;const m=a.fileName.slice(1),g=l=>a.getLineAndCharacterOfPosition(l.getStart()).line+1;let S=!1;const d=l=>{t.isStringLiteral(l)&&/(^|\s)sf-[a-z0-9-]/.test(l.text)&&(S=!0),t.isImportDeclaration(l)&&t.isStringLiteral(l.moduleSpecifier)&&/^(editor-shell|efficient-easel)(\/|$)/.test(l.moduleSpecifier.text)&&(S=!0),l.forEachChild(d)};d(a);const h=l=>{if(t.isPropertyAssignment(l)&&t.isIdentifier(l.name)&&l.name.text==="type"&&t.isStringLiteral(l.initializer)&&l.initializer.text==="select"&&u.push({file:m,line:g(l),kind:'field: type "select"',engineDrawn:!0,classes:[]}),t.isCallExpression(l)&&t.isIdentifier(l.expression)){const p=n.getSymbolAtLocation(l.expression),x=p&&p.flags&t.SymbolFlags.Alias?n.getAliasedSymbol(p):p;[...p?.declarations??[],...x?.declarations??[]].some(f=>o!==void 0&&f===o||c(f))&&u.push({file:m,line:g(l),kind:"field: select() helper",engineDrawn:!0,classes:[]})}if(t.isJsxOpeningLikeElement(l)&&l.tagName.getText()==="select"&&S&&m!==r.file){const p=l.attributes.properties.find(b=>t.isJsxAttribute(b)&&t.isIdentifier(b.name)&&b.name.text==="className"),x=p&&p.initializer&&t.isStringLiteral(p.initializer)?p.initializer.text:"";u.push({file:m,line:g(l),kind:"element: <select> in panel markup",engineDrawn:!1,classes:x.split(/\s+/).filter(Boolean)})}l.forEachChild(h)};h(a)}return{population:u,helperDeclared:o!==void 0}}const v=(t,i)=>t[0]-i[0]||t[1]-i[1]||t[2]-i[2],O=t=>`(${t[0]},${t[1]},${t[2]})`;function $(t){const i=[];let r=0,s=null,n="";const o=()=>{const e=n.indexOf(":");e>0&&i.push({prop:n.slice(0,e).trim(),value:n.slice(e+1).trim()}),n=""};for(const e of t){if(s){n+=e,e===s&&(s=null);continue}if(e==='"'||e==="'")s=e;else if(e==="(")r+=1;else if(e===")")r=Math.max(0,r-1);else if(e===";"&&r===0){o();continue}n+=e}return o(),i}function A(t){const i=[];let r=0,s="";for(const n of t){if(n==="("&&(r+=1),n===")"&&(r-=1),r===0&&/[\s>+~]/.test(n)){s.trim()&&i.push(s.trim()),s="";continue}s+=n}return s.trim()&&i.push(s.trim()),i}function C(t){let i=t.trim();const r=[],s=[];let n=null;const o=/^[a-zA-Z][a-zA-Z0-9-]*/.exec(i);for(o&&(n=o[0],i=i.slice(o[0].length));i.length;){let e;if(e=/^\.([A-Za-z0-9_-]+)/.exec(i))r.push(e[1]);else if(e=/^:(focus-visible|focus-within|hover|focus|active|checked|disabled)\b/.exec(i))s.push(e[1]);else if(e=/^:dir\([^)]*\)/.exec(i))s.push("dir");else if(e=/^:not\(\[([A-Za-z-]+)\]\)/.exec(i))r.push(`@not-${e[1]}`);else if(e=/^\[([A-Za-z-]+)(?:[~^$*|]?=[^\]]*)?\]/.exec(i))s.push(`[${e[1]}]`);else if(e=/^:has\(([^)]*)\)/.exec(i)){if(!/^\s*>?\s*[a-z]+\s*$/.test(e[1]))return null;r.push("@has-type")}else return null;i=i.slice(e[0].length)}return{type:n,classes:r,needsState:s}}const D=t=>t.reduce((i,r)=>[i[0],i[1]+r.classes.filter(s=>s!=="@has-type").length+r.needsState.length,i[2]+(r.type?1:0)+(r.classes.includes("@has-type")?1:0)],[0,0,0]);function F(t){if(t===null)return!0;let i=!0;for(const r of t.replace(/^@media\s*/i,"").split(/\s+and\s+/i)){const s=r.trim().replace(/^\(|\)$/g,"").trim(),n=/^([a-z-]+)\s*:\s*(.+)$/.exec(s);if(!n)return null;const o=n[1],e=n[2].trim();if(o==="hover"||o==="any-hover"){if(e==="hover")continue;return e==="none"?!1:null}if(o==="pointer"||o==="any-pointer"){if(e==="fine")continue;return e==="coarse"||e==="none"?!1:null}i=null}return i}const T=t=>t??"(no media query)";function Z(t,i,r,s,n="rest"){const o=[],e=[],c=[],u=n==="hover"?new Set(["hover"]):new Set;return t.forEach((a,m)=>{const g=n==="rest"?a.media===null:F(a.media);for(const S of a.selector.split(",")){const d=S.trim();if(!d||!/(^|[\s,>+~])select\b/.test(d)&&!i.own.some(f=>d.includes(`.${f}`)))continue;const h=A(d).map(C),l=h[h.length-1];if(h.some(f=>f===null)||!l){e.push(`${r}: ${d}`);continue}const p=h;if(l.type&&l.type!=="select")continue;const x=l.classes.filter(f=>!f.startsWith("@"));if(!(!x.every(f=>i.own.includes(f))||!l.type&&x.length===0||!l.needsState.every(f=>u.has(f))||!p.slice(0,-1).every(f=>(!f.type||f.type==="div")&&f.classes.filter(y=>!y.startsWith("@")).every(y=>i.ancestors.includes(y))&&f.needsState.every(y=>u.has(y))))&&g!==!1){if(g===null){c.push({sheet:r,selector:d,media:a.media??"",decls:a.decls});continue}o.push({spec:D(p),order:s+m,decls:a.decls,selector:d,sheet:r})}}}),{applied:o,unreadable:e,undecided:c}}const w={appearance:"auto","background-image":"none","background-size":"auto","background-repeat":"repeat","background-position":"0% 0%","background-color":"transparent","border-color":"currentcolor"};function z(t){const i=t.replace(/url\([\s\S]*?\)/g," "),r=/var\(--[A-Za-z0-9-]+(?:\s*,[^()]*)?\)|#[0-9a-fA-F]{3,8}\b|(?:rgba?|hsla?|color-mix|color)\([^()]*(?:\([^()]*\)[^()]*)*\)|\b(?:transparent|currentcolor|white|black)\b/i.exec(i);return r?r[0]:null}function W(t){const i=new Map;for(const r of $(t.replace(/[^{}]*\{|\}/g,";")))r.prop.startsWith("--")&&i.set(r.prop,r.value);return i}function E(t,i,r=0){if(r>8)return t;let s=!1;const n=t.replace(/var\(\s*(--[A-Za-z0-9-]+)\s*(?:,([^()]*(?:\([^()]*\)[^()]*)*))?\)/g,(o,e)=>{const c=i.get(e);return c===void 0?o:(s=!0,c)});return s?E(n,i,r+1):n}function j(t,i,r=new Map){let s=null;const n=(e,c)=>{(!s||v(e.spec,s.spec)>0||v(e.spec,s.spec)===0&&e.order>=s.order)&&(s={value:c.trim(),from:`${e.sheet} { ${e.selector} }`,spec:e.spec,order:e.order})};for(const e of t)for(const c of $(e.decls)){if(c.prop===i||i==="appearance"&&c.prop==="-webkit-appearance"){n(e,c.value);continue}if(c.prop==="border"&&i==="border-color"){n(e,z(c.value)??w[i]);continue}if(c.prop!=="background"||!i.startsWith("background-"))continue;const u=c.value;n(e,i==="background-image"?/url\([\s\S]*?\)|linear-gradient\([\s\S]*?\)|image-set\([\s\S]*?\)/.exec(u)?.[0]??"none":i==="background-repeat"?/\b(no-repeat|repeat-x|repeat-y|round|space|repeat)\b/.exec(u)?.[0]??"repeat":i==="background-color"?z(u)??w[i]:w[i])}const o=s??{value:w[i],from:"(nothing declares one)"};return{value:E(o.value,r),from:o.from}}const I=["sf-editor","sf-body","sf-panel","sf-insp-body","sf-styles","sf-field","es-field","sf-copybox"];function K(t,i){const r=t.filter(e=>!e.engineDrawn),s=e=>new RegExp(`\\.${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\b`).test(i),n=e=>[...e.classes].filter(s).sort().join(" "),o=new Set([""]);for(const e of r)o.add(n(e));return[...o].sort().map(e=>({name:e?`house .${e.split(" ").join(".")}`:"house (bare)",own:e?e.split(" "):[],ancestors:[...I],rows:r.filter(c=>n(c)===e).length}))}function P(t,i,r){const s=new Map;for(const n of r)s.set(n,[]);for(const n of i){if(!k(n.path))continue;const o=t.createSourceFile(n.path,n.text,t.ScriptTarget.Latest,!0),e=c=>{if(t.isJsxAttribute(c)&&t.isIdentifier(c.name)&&c.name.text==="className"&&c.initializer&&t.isStringLiteral(c.initializer)){const u=c.initializer.text.split(/\s+/).filter(Boolean);for(const a of r)u.includes(a)&&s.get(a)?.push(n.path)}c.forEachChild(e)};e(o)}return s}export{I as ANCESTORS,w as INITIAL,Z as applicable,M as census,P as chainInMarkup,z as colorIn,C as compound,E as derefVars,K as deriveShapes,N as importsOf,F as mediaHolds,T as mediaLabel,W as readVars,j as resolve,v as specCmp,D as specOf,O as specStr,A as splitCombinators,$ as splitDecls};
1
+ function N(t,i){const r=t.createSourceFile(i.path,i.text,t.ScriptTarget.Latest,!0),n=[],s=o=>{(t.isImportDeclaration(o)||t.isExportDeclaration(o))&&o.moduleSpecifier&&t.isStringLiteral(o.moduleSpecifier)&&n.push(o.moduleSpecifier.text),t.isCallExpression(o)&&(o.expression.kind===t.SyntaxKind.ImportKeyword||t.isIdentifier(o.expression)&&o.expression.text==="require")&&o.arguments.length>0&&t.isStringLiteral(o.arguments[0])&&n.push(o.arguments[0].text),o.forEachChild(s)};return s(r),n}const k=t=>/\.(tsx?|mts)$/.test(t)&&!t.endsWith(".d.ts");function E(t,i){const r=new Map,n=new Set(["/"]);for(const e of i){if(!k(e.path))continue;r.set(`/${e.path}`,e.text);const c=e.path.split("/");for(let u=1;u<c.length;u++)n.add(`/${c.slice(0,u).join("/")}`)}const s={noLib:!0,types:[],noEmit:!0,jsx:t.JsxEmit.Preserve,target:t.ScriptTarget.ESNext,module:t.ModuleKind.ESNext,moduleResolution:t.ModuleResolutionKind.Bundler,baseUrl:"/",paths:{"@/*":["./*"]}},o={fileExists:e=>r.has(e),readFile:e=>r.get(e),directoryExists:e=>n.has(e.replace(/\/+$/,"")||"/"),getDirectories:()=>[],realpath:e=>e,getSourceFile:(e,c)=>{const u=r.get(e);return u===void 0?void 0:t.createSourceFile(e,u,c,!0)},getDefaultLibFileName:()=>"/lib.d.ts",writeFile:()=>{},getCurrentDirectory:()=>"/",getCanonicalFileName:e=>e,useCaseSensitiveFileNames:()=>!0,getNewLine:()=>`
2
+ `};return t.createProgram({rootNames:[...r.keys()],options:s,host:o})}function M(t,i,r){const n=E(t,i),s=n.getTypeChecker();let o;n.getSourceFile(`/${r.file}`)?.forEachChild(a=>{if(t.isFunctionDeclaration(a)&&a.name?.text==="select"&&(o=a),t.isVariableStatement(a))for(const p of a.declarationList.declarations)t.isIdentifier(p.name)&&p.name.text==="select"&&(o=p)});const e=new Set(r.modules??[]),c=a=>{if(!t.isImportSpecifier(a))return!1;const p=a.parent.parent.parent;return(a.propertyName??a.name).text==="select"&&t.isStringLiteral(p.moduleSpecifier)&&e.has(p.moduleSpecifier.text)},u=[];for(const a of n.getSourceFiles()){if(a.isDeclarationFile)continue;const p=a.fileName.slice(1),g=l=>a.getLineAndCharacterOfPosition(l.getStart()).line+1;let S=!1;const m=l=>{t.isStringLiteral(l)&&/(^|\s)sf-[a-z0-9-]/.test(l.text)&&(S=!0),t.isImportDeclaration(l)&&t.isStringLiteral(l.moduleSpecifier)&&/^(editor-shell|efficient-easel)(\/|$)/.test(l.moduleSpecifier.text)&&(S=!0),l.forEachChild(m)};m(a);const h=l=>{if(t.isPropertyAssignment(l)&&t.isIdentifier(l.name)&&l.name.text==="type"&&t.isStringLiteral(l.initializer)&&l.initializer.text==="select"&&u.push({file:p,line:g(l),kind:'field: type "select"',engineDrawn:!0,classes:[]}),t.isCallExpression(l)&&t.isIdentifier(l.expression)){const d=s.getSymbolAtLocation(l.expression),x=d&&d.flags&t.SymbolFlags.Alias?s.getAliasedSymbol(d):d;[...d?.declarations??[],...x?.declarations??[]].some(f=>o!==void 0&&f===o||c(f))&&u.push({file:p,line:g(l),kind:"field: select() helper",engineDrawn:!0,classes:[]})}if(t.isJsxOpeningLikeElement(l)&&l.tagName.getText()==="select"&&S&&p!==r.file){const d=l.attributes.properties.find(b=>t.isJsxAttribute(b)&&t.isIdentifier(b.name)&&b.name.text==="className"),x=d&&d.initializer&&t.isStringLiteral(d.initializer)?d.initializer.text:"";u.push({file:p,line:g(l),kind:"element: <select> in panel markup",engineDrawn:!1,classes:x.split(/\s+/).filter(Boolean)})}l.forEachChild(h)};h(a)}return{population:u,helperDeclared:o!==void 0}}const v=(t,i)=>t[0]-i[0]||t[1]-i[1]||t[2]-i[2],O=t=>`(${t[0]},${t[1]},${t[2]})`;function $(t){const i=[];let r=0,n=null,s="";const o=()=>{const e=s.indexOf(":");e>0&&i.push({prop:s.slice(0,e).trim(),value:s.slice(e+1).trim()}),s=""};for(const e of t){if(n){s+=e,e===n&&(n=null);continue}if(e==='"'||e==="'")n=e;else if(e==="(")r+=1;else if(e===")")r=Math.max(0,r-1);else if(e===";"&&r===0){o();continue}s+=e}return o(),i}function A(t){const i=[];let r=0,n="";for(const s of t){if(s==="("&&(r+=1),s===")"&&(r-=1),r===0&&/[\s>+~]/.test(s)){n.trim()&&i.push(n.trim()),n="";continue}n+=s}return n.trim()&&i.push(n.trim()),i}function C(t){let i=t.trim();const r=[],n=[];let s=null;const o=/^[a-zA-Z][a-zA-Z0-9-]*/.exec(i);for(o&&(s=o[0],i=i.slice(o[0].length));i.length;){let e;if(e=/^\.([A-Za-z0-9_-]+)/.exec(i))r.push(e[1]);else if(e=/^:(focus-visible|focus-within|hover|focus|active|checked|disabled)\b/.exec(i))n.push(e[1]);else if(e=/^:dir\([^)]*\)/.exec(i))n.push("dir");else if(e=/^:not\(\[([A-Za-z-]+)\]\)/.exec(i))r.push(`@not-${e[1]}`);else if(e=/^\[([A-Za-z-]+)(?:[~^$*|]?=[^\]]*)?\]/.exec(i))n.push(`[${e[1]}]`);else if(e=/^:has\(([^)]*)\)/.exec(i)){if(!/^\s*>?\s*[a-z]+\s*$/.test(e[1]))return null;r.push("@has-type")}else return null;i=i.slice(e[0].length)}return{type:s,classes:r,needsState:n}}const D=t=>t.reduce((i,r)=>[i[0],i[1]+r.classes.filter(n=>n!=="@has-type").length+r.needsState.length,i[2]+(r.type?1:0)+(r.classes.includes("@has-type")?1:0)],[0,0,0]);function F(t){if(t===null)return!0;let i=!0;for(const r of t.replace(/^@media\s*/i,"").split(/\s+and\s+/i)){const n=r.trim().replace(/^\(|\)$/g,"").trim(),s=/^([a-z-]+)\s*:\s*(.+)$/.exec(n);if(!s)return null;const o=s[1],e=s[2].trim();if(o==="hover"||o==="any-hover"){if(e==="hover")continue;return e==="none"?!1:null}if(o==="pointer"||o==="any-pointer"){if(e==="fine")continue;return e==="coarse"||e==="none"?!1:null}i=null}return i}const T=t=>t??"(no media query)";function Z(t,i,r,n,s="rest"){const o=[],e=[],c=[],u=s==="hover"?new Set(["hover"]):new Set;return t.forEach((a,p)=>{const g=s==="rest"?a.media===null:F(a.media);for(const S of a.selector.split(",")){const m=S.trim();if(!m||!/(^|[\s,>+~])select\b/.test(m)&&!i.own.some(f=>m.includes(`.${f}`)))continue;const h=A(m).map(C),l=h[h.length-1];if(h.some(f=>f===null)||!l){e.push(`${r}: ${m}`);continue}const d=h;if(l.type&&l.type!=="select")continue;const x=l.classes.filter(f=>!f.startsWith("@"));if(!(!x.every(f=>i.own.includes(f))||!l.type&&x.length===0||!l.needsState.every(f=>u.has(f))||!d.slice(0,-1).every(f=>(!f.type||f.type==="div")&&f.classes.filter(y=>!y.startsWith("@")).every(y=>i.ancestors.includes(y))&&f.needsState.every(y=>u.has(y))))&&g!==!1){if(g===null){c.push({sheet:r,selector:m,media:a.media??"",decls:a.decls});continue}o.push({spec:D(d),order:n+p,decls:a.decls,selector:m,sheet:r})}}}),{applied:o,unreadable:e,undecided:c}}const w={appearance:"auto","background-image":"none","background-size":"auto","background-repeat":"repeat","background-position":"0% 0%","background-color":"transparent","border-color":"currentcolor"};function z(t){const i=t.replace(/url\([\s\S]*?\)/g," "),r=/var\(--[A-Za-z0-9-]+(?:\s*,[^()]*)?\)|#[0-9a-fA-F]{3,8}\b|(?:rgba?|hsla?|color-mix|color)\([^()]*(?:\([^()]*\)[^()]*)*\)|\b(?:transparent|currentcolor|white|black)\b/i.exec(i);return r?r[0]:null}function W(t){const i=new Map;for(const r of $(t.replace(/[^{}]*\{|\}/g,";")))r.prop.startsWith("--")&&i.set(r.prop,r.value);return i}function L(t,i,r=0){if(r>8)return t;let n=!1;const s=t.replace(/var\(\s*(--[A-Za-z0-9-]+)\s*(?:,([^()]*(?:\([^()]*\)[^()]*)*))?\)/g,(o,e)=>{const c=i.get(e);return c===void 0?o:(n=!0,c)});return n?L(s,i,r+1):s}function j(t,i,r=new Map){let n=null;const s=(e,c)=>{(!n||v(e.spec,n.spec)>0||v(e.spec,n.spec)===0&&e.order>=n.order)&&(n={value:c.trim(),from:`${e.sheet} { ${e.selector} }`,spec:e.spec,order:e.order})};for(const e of t)for(const c of $(e.decls)){if(c.prop===i||i==="appearance"&&c.prop==="-webkit-appearance"){s(e,c.value);continue}if(c.prop==="border"&&i==="border-color"){s(e,z(c.value)??w[i]);continue}if(c.prop!=="background"||!i.startsWith("background-"))continue;const u=c.value;s(e,i==="background-image"?/url\([\s\S]*?\)|linear-gradient\([\s\S]*?\)|image-set\([\s\S]*?\)/.exec(u)?.[0]??"none":i==="background-repeat"?/\b(no-repeat|repeat-x|repeat-y|round|space|repeat)\b/.exec(u)?.[0]??"repeat":i==="background-color"?z(u)??w[i]:w[i])}const o=n??{value:w[i],from:"(nothing declares one)"};return{value:L(o.value,r),from:o.from}}const I=["sf-editor","sf-body","sf-panel","sf-insp-body","sf-styles","sf-field","es-field","sf-copybox"];function K(t,i){const r=t.filter(e=>!e.engineDrawn),n=e=>new RegExp(`\\.${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\b`).test(i),s=e=>[...e.classes].filter(n).sort().join(" "),o=new Set([""]);for(const e of r)o.add(s(e));return[...o].sort().map(e=>({name:e?`house .${e.split(" ").join(".")}`:"house (bare)",own:e?e.split(" "):[],ancestors:[...I],rows:r.filter(c=>s(c)===e).length}))}function P(t,i,r){const n=new Map;for(const s of r)n.set(s,[]);for(const s of i){if(!k(s.path))continue;const o=t.createSourceFile(s.path,s.text,t.ScriptTarget.Latest,!0),e=c=>{if(t.isJsxAttribute(c)&&t.isIdentifier(c.name)&&c.name.text==="className"&&c.initializer&&t.isStringLiteral(c.initializer)){const u=c.initializer.text.split(/\s+/).filter(Boolean);for(const a of r)u.includes(a)&&n.get(a)?.push(s.path)}c.forEachChild(e)};e(o)}return n}export{I as ANCESTORS,w as INITIAL,Z as applicable,M as census,P as chainInMarkup,z as colorIn,C as compound,L as derefVars,K as deriveShapes,N as importsOf,F as mediaHolds,T as mediaLabel,W as readVars,j as resolve,v as specCmp,D as specOf,O as specStr,A as splitCombinators,$ as splitDecls};