@pithyjs/ui-kit 0.1.0-beta.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 (417) hide show
  1. package/LICENSE +21 -0
  2. package/dist/animation/animate-in.d.ts +35 -0
  3. package/dist/animation/animate-in.d.ts.map +1 -0
  4. package/dist/animation/animate-in.js +71 -0
  5. package/dist/animation/animate-in.js.map +1 -0
  6. package/dist/atoms/actions/_icon-control.scss +53 -0
  7. package/dist/atoms/actions/button/Button.d.ts +93 -0
  8. package/dist/atoms/actions/button/Button.d.ts.map +1 -0
  9. package/dist/atoms/actions/button/Button.js +332 -0
  10. package/dist/atoms/actions/button/Button.js.map +1 -0
  11. package/dist/atoms/actions/button/button.scss +342 -0
  12. package/dist/atoms/actions/icon-button/IconButton.d.ts +47 -0
  13. package/dist/atoms/actions/icon-button/IconButton.d.ts.map +1 -0
  14. package/dist/atoms/actions/icon-button/IconButton.js +81 -0
  15. package/dist/atoms/actions/icon-button/IconButton.js.map +1 -0
  16. package/dist/atoms/actions/icon-button/icon-button.scss +20 -0
  17. package/dist/atoms/actions/icon-group/IconGroup.d.ts +60 -0
  18. package/dist/atoms/actions/icon-group/IconGroup.d.ts.map +1 -0
  19. package/dist/atoms/actions/icon-group/IconGroup.js +191 -0
  20. package/dist/atoms/actions/icon-group/IconGroup.js.map +1 -0
  21. package/dist/atoms/actions/icon-group/icon-group.scss +36 -0
  22. package/dist/atoms/actions/segmented-control/SegmentedControl.d.ts +49 -0
  23. package/dist/atoms/actions/segmented-control/SegmentedControl.d.ts.map +1 -0
  24. package/dist/atoms/actions/segmented-control/SegmentedControl.js +107 -0
  25. package/dist/atoms/actions/segmented-control/SegmentedControl.js.map +1 -0
  26. package/dist/atoms/actions/segmented-control/segmented-control.scss +90 -0
  27. package/dist/atoms/content/_mixins.scss +79 -0
  28. package/dist/atoms/content/action-tile/ActionTile.d.ts +27 -0
  29. package/dist/atoms/content/action-tile/ActionTile.d.ts.map +1 -0
  30. package/dist/atoms/content/action-tile/ActionTile.js +98 -0
  31. package/dist/atoms/content/action-tile/ActionTile.js.map +1 -0
  32. package/dist/atoms/content/action-tile/action-tile.scss +150 -0
  33. package/dist/atoms/content/badge/Badge.d.ts +57 -0
  34. package/dist/atoms/content/badge/Badge.d.ts.map +1 -0
  35. package/dist/atoms/content/badge/Badge.js +177 -0
  36. package/dist/atoms/content/badge/Badge.js.map +1 -0
  37. package/dist/atoms/content/badge/badge.scss +198 -0
  38. package/dist/atoms/content/heading/Heading.d.ts +53 -0
  39. package/dist/atoms/content/heading/Heading.d.ts.map +1 -0
  40. package/dist/atoms/content/heading/Heading.js +142 -0
  41. package/dist/atoms/content/heading/Heading.js.map +1 -0
  42. package/dist/atoms/content/heading/heading.scss +43 -0
  43. package/dist/atoms/content/icon/Icon.d.ts +68 -0
  44. package/dist/atoms/content/icon/Icon.d.ts.map +1 -0
  45. package/dist/atoms/content/icon/Icon.js +137 -0
  46. package/dist/atoms/content/icon/Icon.js.map +1 -0
  47. package/dist/atoms/content/icon/icon.scss +66 -0
  48. package/dist/atoms/content/icon/resolveIconSvg.d.ts +21 -0
  49. package/dist/atoms/content/icon/resolveIconSvg.d.ts.map +1 -0
  50. package/dist/atoms/content/icon/resolveIconSvg.js +73 -0
  51. package/dist/atoms/content/icon/resolveIconSvg.js.map +1 -0
  52. package/dist/atoms/content/image/Image.d.ts +81 -0
  53. package/dist/atoms/content/image/Image.d.ts.map +1 -0
  54. package/dist/atoms/content/image/Image.js +293 -0
  55. package/dist/atoms/content/image/Image.js.map +1 -0
  56. package/dist/atoms/content/image/image.scss +77 -0
  57. package/dist/atoms/content/text/Text.d.ts +58 -0
  58. package/dist/atoms/content/text/Text.d.ts.map +1 -0
  59. package/dist/atoms/content/text/Text.js +158 -0
  60. package/dist/atoms/content/text/Text.js.map +1 -0
  61. package/dist/atoms/content/text/text.scss +98 -0
  62. package/dist/atoms/content/tile/Tile.d.ts +66 -0
  63. package/dist/atoms/content/tile/Tile.d.ts.map +1 -0
  64. package/dist/atoms/content/tile/Tile.js +125 -0
  65. package/dist/atoms/content/tile/Tile.js.map +1 -0
  66. package/dist/atoms/content/tile/tile.scss +122 -0
  67. package/dist/atoms/feedback/tooltip/Tooltip.d.ts +44 -0
  68. package/dist/atoms/feedback/tooltip/Tooltip.d.ts.map +1 -0
  69. package/dist/atoms/feedback/tooltip/Tooltip.js +121 -0
  70. package/dist/atoms/feedback/tooltip/Tooltip.js.map +1 -0
  71. package/dist/atoms/feedback/tooltip/tooltip.scss +96 -0
  72. package/dist/atoms/forms/checkbox/Checkbox.d.ts +49 -0
  73. package/dist/atoms/forms/checkbox/Checkbox.d.ts.map +1 -0
  74. package/dist/atoms/forms/checkbox/Checkbox.js +269 -0
  75. package/dist/atoms/forms/checkbox/Checkbox.js.map +1 -0
  76. package/dist/atoms/forms/checkbox/CheckboxGroup.d.ts +50 -0
  77. package/dist/atoms/forms/checkbox/CheckboxGroup.d.ts.map +1 -0
  78. package/dist/atoms/forms/checkbox/CheckboxGroup.js +132 -0
  79. package/dist/atoms/forms/checkbox/CheckboxGroup.js.map +1 -0
  80. package/dist/atoms/forms/checkbox/checkbox.scss +506 -0
  81. package/dist/atoms/forms/file-picker/FilePicker.d.ts +23 -0
  82. package/dist/atoms/forms/file-picker/FilePicker.d.ts.map +1 -0
  83. package/dist/atoms/forms/file-picker/FilePicker.js +103 -0
  84. package/dist/atoms/forms/file-picker/FilePicker.js.map +1 -0
  85. package/dist/atoms/forms/file-picker/file-picker.scss +84 -0
  86. package/dist/atoms/forms/form-field/FormField.d.ts +39 -0
  87. package/dist/atoms/forms/form-field/FormField.d.ts.map +1 -0
  88. package/dist/atoms/forms/form-field/FormField.js +139 -0
  89. package/dist/atoms/forms/form-field/FormField.js.map +1 -0
  90. package/dist/atoms/forms/form-field/form-field.scss +46 -0
  91. package/dist/atoms/forms/input/Input.d.ts +81 -0
  92. package/dist/atoms/forms/input/Input.d.ts.map +1 -0
  93. package/dist/atoms/forms/input/Input.js +417 -0
  94. package/dist/atoms/forms/input/Input.js.map +1 -0
  95. package/dist/atoms/forms/input/input.scss +547 -0
  96. package/dist/atoms/forms/radio/Radio.d.ts +54 -0
  97. package/dist/atoms/forms/radio/Radio.d.ts.map +1 -0
  98. package/dist/atoms/forms/radio/Radio.js +278 -0
  99. package/dist/atoms/forms/radio/Radio.js.map +1 -0
  100. package/dist/atoms/forms/radio/RadioGroup.d.ts +54 -0
  101. package/dist/atoms/forms/radio/RadioGroup.d.ts.map +1 -0
  102. package/dist/atoms/forms/radio/RadioGroup.js +137 -0
  103. package/dist/atoms/forms/radio/RadioGroup.js.map +1 -0
  104. package/dist/atoms/forms/radio/radio.scss +459 -0
  105. package/dist/atoms/forms/select/Select.d.ts +57 -0
  106. package/dist/atoms/forms/select/Select.d.ts.map +1 -0
  107. package/dist/atoms/forms/select/Select.js +457 -0
  108. package/dist/atoms/forms/select/Select.js.map +1 -0
  109. package/dist/atoms/forms/select/select-dropdown.d.ts +49 -0
  110. package/dist/atoms/forms/select/select-dropdown.d.ts.map +1 -0
  111. package/dist/atoms/forms/select/select-dropdown.js +305 -0
  112. package/dist/atoms/forms/select/select-dropdown.js.map +1 -0
  113. package/dist/atoms/forms/select/select-keyboard.d.ts +14 -0
  114. package/dist/atoms/forms/select/select-keyboard.d.ts.map +1 -0
  115. package/dist/atoms/forms/select/select-keyboard.js +182 -0
  116. package/dist/atoms/forms/select/select-keyboard.js.map +1 -0
  117. package/dist/atoms/forms/select/select.scss +630 -0
  118. package/dist/atoms/forms/textarea/Textarea.d.ts +69 -0
  119. package/dist/atoms/forms/textarea/Textarea.d.ts.map +1 -0
  120. package/dist/atoms/forms/textarea/Textarea.js +394 -0
  121. package/dist/atoms/forms/textarea/Textarea.js.map +1 -0
  122. package/dist/atoms/forms/textarea/textarea.scss +486 -0
  123. package/dist/atoms/forms/toggle/Toggle.d.ts +47 -0
  124. package/dist/atoms/forms/toggle/Toggle.d.ts.map +1 -0
  125. package/dist/atoms/forms/toggle/Toggle.js +243 -0
  126. package/dist/atoms/forms/toggle/Toggle.js.map +1 -0
  127. package/dist/atoms/forms/toggle/toggle.scss +561 -0
  128. package/dist/compiler.d.ts +7 -0
  129. package/dist/compiler.d.ts.map +1 -0
  130. package/dist/compiler.js +18 -0
  131. package/dist/compiler.js.map +1 -0
  132. package/dist/icons/index.d.ts +14 -0
  133. package/dist/icons/index.d.ts.map +1 -0
  134. package/dist/icons/index.js +14 -0
  135. package/dist/icons/index.js.map +1 -0
  136. package/dist/icons/registry.d.ts +65 -0
  137. package/dist/icons/registry.d.ts.map +1 -0
  138. package/dist/icons/registry.js +126 -0
  139. package/dist/icons/registry.js.map +1 -0
  140. package/dist/index.d.ts +55 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +64 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/layout/Grid.d.ts +78 -0
  145. package/dist/layout/Grid.d.ts.map +1 -0
  146. package/dist/layout/Grid.js +272 -0
  147. package/dist/layout/Grid.js.map +1 -0
  148. package/dist/layout/GridItem.d.ts +52 -0
  149. package/dist/layout/GridItem.d.ts.map +1 -0
  150. package/dist/layout/GridItem.js +99 -0
  151. package/dist/layout/GridItem.js.map +1 -0
  152. package/dist/layout/PageSection.d.ts +43 -0
  153. package/dist/layout/PageSection.d.ts.map +1 -0
  154. package/dist/layout/PageSection.js +75 -0
  155. package/dist/layout/PageSection.js.map +1 -0
  156. package/dist/layout/SmartContainer.d.ts +66 -0
  157. package/dist/layout/SmartContainer.d.ts.map +1 -0
  158. package/dist/layout/SmartContainer.js +194 -0
  159. package/dist/layout/SmartContainer.js.map +1 -0
  160. package/dist/layout/Stack.d.ts +65 -0
  161. package/dist/layout/Stack.d.ts.map +1 -0
  162. package/dist/layout/Stack.js +114 -0
  163. package/dist/layout/Stack.js.map +1 -0
  164. package/dist/organisms/content/Card.d.ts +93 -0
  165. package/dist/organisms/content/Card.d.ts.map +1 -0
  166. package/dist/organisms/content/Card.js +353 -0
  167. package/dist/organisms/content/Card.js.map +1 -0
  168. package/dist/organisms/content/_card-horizontal.scss +88 -0
  169. package/dist/organisms/content/_card-link.scss +49 -0
  170. package/dist/organisms/content/_card-overlay.scss +91 -0
  171. package/dist/organisms/content/_card-root.scss +99 -0
  172. package/dist/organisms/content/_card-slots.scss +143 -0
  173. package/dist/organisms/content/_card-states.scss +166 -0
  174. package/dist/organisms/content/_card-tokens.scss +22 -0
  175. package/dist/organisms/content/_card-variants.scss +31 -0
  176. package/dist/organisms/content/card.scss +15 -0
  177. package/dist/organisms/feedback/Modal.d.ts +39 -0
  178. package/dist/organisms/feedback/Modal.d.ts.map +1 -0
  179. package/dist/organisms/feedback/Modal.js +120 -0
  180. package/dist/organisms/feedback/Modal.js.map +1 -0
  181. package/dist/organisms/feedback/Popover.d.ts +30 -0
  182. package/dist/organisms/feedback/Popover.d.ts.map +1 -0
  183. package/dist/organisms/feedback/Popover.js +151 -0
  184. package/dist/organisms/feedback/Popover.js.map +1 -0
  185. package/dist/organisms/feedback/modal.scss +66 -0
  186. package/dist/organisms/feedback/popover.scss +27 -0
  187. package/dist/organisms/forms/DynamicForm.d.ts +118 -0
  188. package/dist/organisms/forms/DynamicForm.d.ts.map +1 -0
  189. package/dist/organisms/forms/DynamicForm.js +546 -0
  190. package/dist/organisms/forms/DynamicForm.js.map +1 -0
  191. package/dist/organisms/forms/Form.d.ts +62 -0
  192. package/dist/organisms/forms/Form.d.ts.map +1 -0
  193. package/dist/organisms/forms/Form.js +131 -0
  194. package/dist/organisms/forms/Form.js.map +1 -0
  195. package/dist/organisms/forms/dynamic-form.scss +91 -0
  196. package/dist/organisms/forms/form-helpers.d.ts +21 -0
  197. package/dist/organisms/forms/form-helpers.d.ts.map +1 -0
  198. package/dist/organisms/forms/form-helpers.js +57 -0
  199. package/dist/organisms/forms/form-helpers.js.map +1 -0
  200. package/dist/organisms/forms/form-state.d.ts +66 -0
  201. package/dist/organisms/forms/form-state.d.ts.map +1 -0
  202. package/dist/organisms/forms/form-state.js +156 -0
  203. package/dist/organisms/forms/form-state.js.map +1 -0
  204. package/dist/organisms/forms/form.scss +23 -0
  205. package/dist/organisms/forms/validation.d.ts +32 -0
  206. package/dist/organisms/forms/validation.d.ts.map +1 -0
  207. package/dist/organisms/forms/validation.js +118 -0
  208. package/dist/organisms/forms/validation.js.map +1 -0
  209. package/dist/organisms/navigation/Navbar.d.ts +66 -0
  210. package/dist/organisms/navigation/Navbar.d.ts.map +1 -0
  211. package/dist/organisms/navigation/Navbar.js +881 -0
  212. package/dist/organisms/navigation/Navbar.js.map +1 -0
  213. package/dist/organisms/navigation/_navbar-announcement.scss +62 -0
  214. package/dist/organisms/navigation/_navbar-brand.scss +69 -0
  215. package/dist/organisms/navigation/_navbar-container.scss +37 -0
  216. package/dist/organisms/navigation/_navbar-desktop.scss +116 -0
  217. package/dist/organisms/navigation/_navbar-drawer.scss +97 -0
  218. package/dist/organisms/navigation/_navbar-links.scss +143 -0
  219. package/dist/organisms/navigation/_navbar-menu.scss +193 -0
  220. package/dist/organisms/navigation/_navbar-root.scss +107 -0
  221. package/dist/organisms/navigation/_navbar-search.scss +83 -0
  222. package/dist/organisms/navigation/_navbar-toggle.scss +91 -0
  223. package/dist/organisms/navigation/_navbar-tokens.scss +15 -0
  224. package/dist/organisms/navigation/navbar.scss +17 -0
  225. package/dist/registry/categories.d.ts +6 -0
  226. package/dist/registry/categories.d.ts.map +1 -0
  227. package/dist/registry/categories.js +13 -0
  228. package/dist/registry/categories.js.map +1 -0
  229. package/dist/registry/components.d.ts +5 -0
  230. package/dist/registry/components.d.ts.map +1 -0
  231. package/dist/registry/components.js +95 -0
  232. package/dist/registry/components.js.map +1 -0
  233. package/dist/registry/index.d.ts +59 -0
  234. package/dist/registry/index.d.ts.map +1 -0
  235. package/dist/registry/index.js +79 -0
  236. package/dist/registry/index.js.map +1 -0
  237. package/dist/registry/levels.d.ts +6 -0
  238. package/dist/registry/levels.d.ts.map +1 -0
  239. package/dist/registry/levels.js +9 -0
  240. package/dist/registry/levels.js.map +1 -0
  241. package/dist/registry/registry-meta-types.d.ts +67 -0
  242. package/dist/registry/registry-meta-types.d.ts.map +1 -0
  243. package/dist/registry/registry-meta-types.js +6 -0
  244. package/dist/registry/registry-meta-types.js.map +1 -0
  245. package/dist/registry/registry-meta.d.ts +5 -0
  246. package/dist/registry/registry-meta.d.ts.map +1 -0
  247. package/dist/registry/registry-meta.js +731 -0
  248. package/dist/registry/registry-meta.js.map +1 -0
  249. package/dist/registry/renderer.d.ts +69 -0
  250. package/dist/registry/renderer.d.ts.map +1 -0
  251. package/dist/registry/renderer.js +311 -0
  252. package/dist/registry/renderer.js.map +1 -0
  253. package/dist/sections/_section-base.scss +204 -0
  254. package/dist/sections/contact/ContactSection.d.ts +55 -0
  255. package/dist/sections/contact/ContactSection.d.ts.map +1 -0
  256. package/dist/sections/contact/ContactSection.js +142 -0
  257. package/dist/sections/contact/ContactSection.js.map +1 -0
  258. package/dist/sections/contact/contact-section.scss +142 -0
  259. package/dist/sections/cta/CTASection.d.ts +52 -0
  260. package/dist/sections/cta/CTASection.d.ts.map +1 -0
  261. package/dist/sections/cta/CTASection.js +130 -0
  262. package/dist/sections/cta/CTASection.js.map +1 -0
  263. package/dist/sections/cta/cta-section.scss +131 -0
  264. package/dist/sections/entrance.d.ts +29 -0
  265. package/dist/sections/entrance.d.ts.map +1 -0
  266. package/dist/sections/entrance.js +69 -0
  267. package/dist/sections/entrance.js.map +1 -0
  268. package/dist/sections/features/FeaturesSection.d.ts +54 -0
  269. package/dist/sections/features/FeaturesSection.d.ts.map +1 -0
  270. package/dist/sections/features/FeaturesSection.js +139 -0
  271. package/dist/sections/features/FeaturesSection.js.map +1 -0
  272. package/dist/sections/features/features-section.scss +140 -0
  273. package/dist/sections/footer/FooterSection.d.ts +53 -0
  274. package/dist/sections/footer/FooterSection.d.ts.map +1 -0
  275. package/dist/sections/footer/FooterSection.js +147 -0
  276. package/dist/sections/footer/FooterSection.js.map +1 -0
  277. package/dist/sections/footer/footer-section.scss +131 -0
  278. package/dist/sections/hero/HeroSection.d.ts +66 -0
  279. package/dist/sections/hero/HeroSection.d.ts.map +1 -0
  280. package/dist/sections/hero/HeroSection.js +156 -0
  281. package/dist/sections/hero/HeroSection.js.map +1 -0
  282. package/dist/sections/hero/hero-section.scss +211 -0
  283. package/dist/shared/_form-animations.scss +283 -0
  284. package/dist/shared/_media-fit.scss +63 -0
  285. package/dist/shared/_mixins.scss +69 -0
  286. package/dist/shared/_tokens.scss +116 -0
  287. package/dist/shared/badge.d.ts +15 -0
  288. package/dist/shared/badge.d.ts.map +1 -0
  289. package/dist/shared/badge.js +15 -0
  290. package/dist/shared/badge.js.map +1 -0
  291. package/dist/shared/button.d.ts +22 -0
  292. package/dist/shared/button.d.ts.map +1 -0
  293. package/dist/shared/button.js +22 -0
  294. package/dist/shared/button.js.map +1 -0
  295. package/dist/shared/card.d.ts +21 -0
  296. package/dist/shared/card.d.ts.map +1 -0
  297. package/dist/shared/card.js +38 -0
  298. package/dist/shared/card.js.map +1 -0
  299. package/dist/shared/checkbox.d.ts +10 -0
  300. package/dist/shared/checkbox.d.ts.map +1 -0
  301. package/dist/shared/checkbox.js +28 -0
  302. package/dist/shared/checkbox.js.map +1 -0
  303. package/dist/shared/clickable.d.ts +34 -0
  304. package/dist/shared/clickable.d.ts.map +1 -0
  305. package/dist/shared/clickable.js +54 -0
  306. package/dist/shared/clickable.js.map +1 -0
  307. package/dist/shared/common.d.ts +31 -0
  308. package/dist/shared/common.d.ts.map +1 -0
  309. package/dist/shared/common.js +92 -0
  310. package/dist/shared/common.js.map +1 -0
  311. package/dist/shared/entrance-config.d.ts +46 -0
  312. package/dist/shared/entrance-config.d.ts.map +1 -0
  313. package/dist/shared/entrance-config.js +54 -0
  314. package/dist/shared/entrance-config.js.map +1 -0
  315. package/dist/shared/focusable.d.ts +8 -0
  316. package/dist/shared/focusable.d.ts.map +1 -0
  317. package/dist/shared/focusable.js +17 -0
  318. package/dist/shared/focusable.js.map +1 -0
  319. package/dist/shared/form-elements.d.ts +57 -0
  320. package/dist/shared/form-elements.d.ts.map +1 -0
  321. package/dist/shared/form-elements.js +95 -0
  322. package/dist/shared/form-elements.js.map +1 -0
  323. package/dist/shared/form-state.d.ts +52 -0
  324. package/dist/shared/form-state.d.ts.map +1 -0
  325. package/dist/shared/form-state.js +151 -0
  326. package/dist/shared/form-state.js.map +1 -0
  327. package/dist/shared/grid.d.ts +21 -0
  328. package/dist/shared/grid.d.ts.map +1 -0
  329. package/dist/shared/grid.js +187 -0
  330. package/dist/shared/grid.js.map +1 -0
  331. package/dist/shared/icon-slot.d.ts +22 -0
  332. package/dist/shared/icon-slot.d.ts.map +1 -0
  333. package/dist/shared/icon-slot.js +38 -0
  334. package/dist/shared/icon-slot.js.map +1 -0
  335. package/dist/shared/icon.d.ts +17 -0
  336. package/dist/shared/icon.d.ts.map +1 -0
  337. package/dist/shared/icon.js +18 -0
  338. package/dist/shared/icon.js.map +1 -0
  339. package/dist/shared/icons.d.ts +19 -0
  340. package/dist/shared/icons.d.ts.map +1 -0
  341. package/dist/shared/icons.js +22 -0
  342. package/dist/shared/icons.js.map +1 -0
  343. package/dist/shared/image.d.ts +35 -0
  344. package/dist/shared/image.d.ts.map +1 -0
  345. package/dist/shared/image.js +46 -0
  346. package/dist/shared/image.js.map +1 -0
  347. package/dist/shared/input.d.ts +12 -0
  348. package/dist/shared/input.d.ts.map +1 -0
  349. package/dist/shared/input.js +29 -0
  350. package/dist/shared/input.js.map +1 -0
  351. package/dist/shared/radio.d.ts +10 -0
  352. package/dist/shared/radio.d.ts.map +1 -0
  353. package/dist/shared/radio.js +29 -0
  354. package/dist/shared/radio.js.map +1 -0
  355. package/dist/shared/reconcile-list.d.ts +37 -0
  356. package/dist/shared/reconcile-list.d.ts.map +1 -0
  357. package/dist/shared/reconcile-list.js +95 -0
  358. package/dist/shared/reconcile-list.js.map +1 -0
  359. package/dist/shared/section.d.ts +23 -0
  360. package/dist/shared/section.d.ts.map +1 -0
  361. package/dist/shared/section.js +65 -0
  362. package/dist/shared/section.js.map +1 -0
  363. package/dist/shared/segmented.d.ts +17 -0
  364. package/dist/shared/segmented.d.ts.map +1 -0
  365. package/dist/shared/segmented.js +53 -0
  366. package/dist/shared/segmented.js.map +1 -0
  367. package/dist/shared/select.d.ts +18 -0
  368. package/dist/shared/select.d.ts.map +1 -0
  369. package/dist/shared/select.js +14 -0
  370. package/dist/shared/select.js.map +1 -0
  371. package/dist/shared/slots.d.ts +11 -0
  372. package/dist/shared/slots.d.ts.map +1 -0
  373. package/dist/shared/slots.js +33 -0
  374. package/dist/shared/slots.js.map +1 -0
  375. package/dist/shared/smart-container.d.ts +19 -0
  376. package/dist/shared/smart-container.d.ts.map +1 -0
  377. package/dist/shared/smart-container.js +29 -0
  378. package/dist/shared/smart-container.js.map +1 -0
  379. package/dist/shared/text.d.ts +29 -0
  380. package/dist/shared/text.d.ts.map +1 -0
  381. package/dist/shared/text.js +72 -0
  382. package/dist/shared/text.js.map +1 -0
  383. package/dist/shared/textarea.d.ts +6 -0
  384. package/dist/shared/textarea.d.ts.map +1 -0
  385. package/dist/shared/textarea.js +18 -0
  386. package/dist/shared/textarea.js.map +1 -0
  387. package/dist/shared/toggle.d.ts +6 -0
  388. package/dist/shared/toggle.d.ts.map +1 -0
  389. package/dist/shared/toggle.js +19 -0
  390. package/dist/shared/toggle.js.map +1 -0
  391. package/dist/shared/types.d.ts +41 -0
  392. package/dist/shared/types.d.ts.map +1 -0
  393. package/dist/shared/types.js +20 -0
  394. package/dist/shared/types.js.map +1 -0
  395. package/dist/structural/ErrorBoundary.d.ts +18 -0
  396. package/dist/structural/ErrorBoundary.d.ts.map +1 -0
  397. package/dist/structural/ErrorBoundary.js +119 -0
  398. package/dist/structural/ErrorBoundary.js.map +1 -0
  399. package/dist/structural/For.d.ts +37 -0
  400. package/dist/structural/For.d.ts.map +1 -0
  401. package/dist/structural/For.js +129 -0
  402. package/dist/structural/For.js.map +1 -0
  403. package/dist/structural/Lazy.d.ts +43 -0
  404. package/dist/structural/Lazy.d.ts.map +1 -0
  405. package/dist/structural/Lazy.js +47 -0
  406. package/dist/structural/Lazy.js.map +1 -0
  407. package/dist/structural/NavLink.d.ts +45 -0
  408. package/dist/structural/NavLink.d.ts.map +1 -0
  409. package/dist/structural/NavLink.js +37 -0
  410. package/dist/structural/NavLink.js.map +1 -0
  411. package/dist/structural/Show.d.ts +35 -0
  412. package/dist/structural/Show.d.ts.map +1 -0
  413. package/dist/structural/Show.js +34 -0
  414. package/dist/structural/Show.js.map +1 -0
  415. package/dist/structural/nav-link.scss +54 -0
  416. package/dist/styles/index.scss +58 -0
  417. package/package.json +64 -0
@@ -0,0 +1,18 @@
1
+ /** @codex { "id": "pithy.ui-kit.shared-textarea", "title": "Shared Textarea Constants", "category": "types" } */
2
+ /**
3
+ * Shared constants for form Textarea component.
4
+ * Single source of truth for ID generation.
5
+ */
6
+ // ---------------------------------------------------------------------------
7
+ // Auto-generated IDs — enables FormField <label for=""> association
8
+ // ---------------------------------------------------------------------------
9
+ let textareaIdCounter = 0;
10
+ /** @codexApi {"parent":"pithy.ui-kit.shared-textarea","name":"generateTextareaId","stability":"stable","signature":"() => string"} */
11
+ export function generateTextareaId() {
12
+ return `ui-textarea-${++textareaIdCounter}`;
13
+ }
14
+ /** @codexApi {"parent":"pithy.ui-kit.shared-textarea","name":"resetTextareaIdCounter","stability":"stable","signature":"() => void"} */
15
+ export function resetTextareaIdCounter() {
16
+ textareaIdCounter = 0;
17
+ }
18
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../src/shared/textarea.ts"],"names":[],"mappings":"AAAA,iHAAiH;AAEjH;;;GAGG;AAEH,8EAA8E;AAC9E,oEAAoE;AACpE,8EAA8E;AAE9E,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B,sIAAsI;AACtI,MAAM,UAAU,kBAAkB;IAChC,OAAO,eAAe,EAAE,iBAAiB,EAAE,CAAC;AAC9C,CAAC;AAED,wIAAwI;AACxI,MAAM,UAAU,sBAAsB;IACpC,iBAAiB,GAAG,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** @codex { "id": "pithy.ui-kit.shared-toggle", "title": "Shared Toggle Constants", "category": "types" } */
2
+ /** @codexApi {"parent":"pithy.ui-kit.shared-toggle","name":"generateToggleId","stability":"stable","signature":"() => string"} */
3
+ export declare function generateToggleId(): string;
4
+ /** @codexApi {"parent":"pithy.ui-kit.shared-toggle","name":"resetToggleIdCounter","stability":"stable","signature":"() => void"} */
5
+ export declare function resetToggleIdCounter(): void;
6
+ //# sourceMappingURL=toggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../src/shared/toggle.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAa7G,kIAAkI;AAClI,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,oIAAoI;AACpI,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -0,0 +1,19 @@
1
+ /** @codex { "id": "pithy.ui-kit.shared-toggle", "title": "Shared Toggle Constants", "category": "types" } */
2
+ /**
3
+ * Shared constants for the Toggle atom.
4
+ * Single source of truth for ID generation.
5
+ *
6
+ * **SSR:** Counter is module-level state. Call `resetToggleIdCounter()`
7
+ * between SSR requests to ensure deterministic IDs (same pattern as
8
+ * `resetCheckboxIdCounter()` / `resetRadioIdCounter()`).
9
+ */
10
+ let toggleIdCounter = 0;
11
+ /** @codexApi {"parent":"pithy.ui-kit.shared-toggle","name":"generateToggleId","stability":"stable","signature":"() => string"} */
12
+ export function generateToggleId() {
13
+ return `ui-toggle-${++toggleIdCounter}`;
14
+ }
15
+ /** @codexApi {"parent":"pithy.ui-kit.shared-toggle","name":"resetToggleIdCounter","stability":"stable","signature":"() => void"} */
16
+ export function resetToggleIdCounter() {
17
+ toggleIdCounter = 0;
18
+ }
19
+ //# sourceMappingURL=toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.js","sourceRoot":"","sources":["../../src/shared/toggle.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAE7G;;;;;;;GAOG;AAEH,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB,kIAAkI;AAClI,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,EAAE,eAAe,EAAE,CAAC;AAC1C,CAAC;AAED,oIAAoI;AACpI,MAAM,UAAU,oBAAoB;IAClC,eAAe,GAAG,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /** @codex { "id": "pithy.ui-kit.shared-types", "title": "Shared UI-Kit Types", "category": "types" } */
2
+ /**
3
+ * Shared types and utilities for ui-kit components.
4
+ */
5
+ import type { ControlSize } from '@pithyjs/design-system';
6
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"SEMANTIC_COLORS","stability":"stable","signature":"readonly [\"primary\", \"secondary\", \"tertiary\", \"success\", \"info\", \"warning\", \"danger\"]"} */
7
+ export declare const SEMANTIC_COLORS: readonly ["primary", "secondary", "tertiary", "success", "info", "warning", "danger"];
8
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"SemanticColor","stability":"stable","signature":"type SemanticColor = \"primary\" | \"secondary\" | \"tertiary\" | \"success\" | \"info\" | \"warning\" | \"danger\""} */
9
+ export type SemanticColor = (typeof SEMANTIC_COLORS)[number];
10
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"CONTROL_SIZES","stability":"stable","signature":"readonly [\"sm\", \"md\", \"lg\"] satisfies readonly ControlSize[]"} */
11
+ export declare const CONTROL_SIZES: readonly ["sm", "md", "lg"];
12
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"ORIENTATIONS","stability":"stable","signature":"readonly [\"vertical\", \"horizontal\"]"} */
13
+ export declare const ORIENTATIONS: readonly ["vertical", "horizontal"];
14
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"Orientation","stability":"stable","signature":"type Orientation = \"vertical\" | \"horizontal\""} */
15
+ export type Orientation = (typeof ORIENTATIONS)[number];
16
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"FormControlBaseProps","stability":"stable","signature":"interface FormControlBaseProps"} */
17
+ export interface FormControlBaseProps {
18
+ /** Explicit element ID — overrides auto-generated ID. Used by FormField for label association. */
19
+ id?: string;
20
+ /** Accessible label — required for all form controls */
21
+ label: string;
22
+ /** Control size (default: "md") */
23
+ size?: ControlSize;
24
+ /** Disabled state — static boolean or signal accessor */
25
+ disabled?: boolean | (() => boolean);
26
+ /** Readonly state — static boolean or signal accessor */
27
+ readonly?: boolean | (() => boolean);
28
+ /** Required field — sets aria-required */
29
+ required?: boolean;
30
+ /** Error state — visual only, sets aria-invalid */
31
+ error?: boolean | (() => boolean);
32
+ /** Error message — shown below control when error is truthy */
33
+ errorMessage?: string | (() => string);
34
+ /** Helper text — persistent hint below control */
35
+ helperText?: string;
36
+ /** Success state — visual only */
37
+ success?: boolean | (() => boolean);
38
+ /** Loading state — shows spinner, sets aria-busy */
39
+ loading?: boolean | (() => boolean);
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,wGAAwG;AAExG;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1D,uNAAuN;AACvN,eAAO,MAAM,eAAe,uFAGlB,CAAC;AACX,qOAAqO;AACrO,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAI7D,oLAAoL;AACpL,eAAO,MAAM,aAAa,6BAIiB,CAAC;AAI5C,wJAAwJ;AACxJ,eAAO,MAAM,YAAY,qCAAsC,CAAC;AAChE,gKAAgK;AAChK,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAMxD,uJAAuJ;AACvJ,MAAM,WAAW,oBAAoB;IACnC,kGAAkG;IAClG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACrC,yDAAyD;IACzD,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACrC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IAClC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACvC,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACpC,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;CACrC"}
@@ -0,0 +1,20 @@
1
+ /** @codex { "id": "pithy.ui-kit.shared-types", "title": "Shared UI-Kit Types", "category": "types" } */
2
+ import { COLOR_TOKENS } from '@pithyjs/design-system/colors';
3
+ // -- Semantic colors (Button, Badge, Alert, Tag, etc.) ------------------------
4
+ // Derived from design system COLOR_TOKENS — single source of truth.
5
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"SEMANTIC_COLORS","stability":"stable","signature":"readonly [\"primary\", \"secondary\", \"tertiary\", \"success\", \"info\", \"warning\", \"danger\"]"} */
6
+ export const SEMANTIC_COLORS = [
7
+ ...COLOR_TOKENS.brand,
8
+ ...COLOR_TOKENS.status,
9
+ ];
10
+ // -- Control sizes (runtime tuple synced with ControlSize) --------------------
11
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"CONTROL_SIZES","stability":"stable","signature":"readonly [\"sm\", \"md\", \"lg\"] satisfies readonly ControlSize[]"} */
12
+ export const CONTROL_SIZES = [
13
+ 'sm',
14
+ 'md',
15
+ 'lg',
16
+ ];
17
+ // -- Orientation (axis vocabulary shared by Stack, Card, Divider, etc.) -------
18
+ /** @codexApi {"parent":"pithy.ui-kit.shared-types","name":"ORIENTATIONS","stability":"stable","signature":"readonly [\"vertical\", \"horizontal\"]"} */
19
+ export const ORIENTATIONS = ['vertical', 'horizontal'];
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,wGAAwG;AAOxG,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,gFAAgF;AAChF,oEAAoE;AAEpE,uNAAuN;AACvN,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,GAAG,YAAY,CAAC,KAAK;IACrB,GAAG,YAAY,CAAC,MAAM;CACd,CAAC;AAIX,gFAAgF;AAEhF,oLAAoL;AACpL,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI;IACJ,IAAI;IACJ,IAAI;CACqC,CAAC;AAE5C,gFAAgF;AAEhF,wJAAwJ;AACxJ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,YAAY,CAAU,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.error-boundary",
4
+ "title": "<ErrorBoundary> Structural Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ /** @codexApi {"parent":"pithy.ui-kit.error-boundary","name":"ErrorBoundaryProps","stability":"stable","signature":"interface ErrorBoundaryProps"} */
9
+ export interface ErrorBoundaryProps {
10
+ /** Called when an error is caught */
11
+ onError?: (error: Error) => void;
12
+ }
13
+ /** @codexApi {"parent":"pithy.ui-kit.error-boundary","name":"ErrorBoundary","stability":"stable","signature":"(props: ErrorBoundaryProps) => { el: DocumentFragment; destroy: () => void }"} */
14
+ export declare function ErrorBoundary({ onError }?: ErrorBoundaryProps): {
15
+ el: DocumentFragment;
16
+ destroy: () => void;
17
+ };
18
+ //# sourceMappingURL=ErrorBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/structural/ErrorBoundary.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAMF,qJAAqJ;AACrJ,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,gMAAgM;AAChM,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,GAAE,kBAAuB,GAAG;IACnE,EAAE,EAAE,gBAAgB,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAmIA"}
@@ -0,0 +1,119 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.error-boundary",
4
+ "title": "<ErrorBoundary> Structural Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { signal } from '@pithyjs/signals';
9
+ import { compileNodes } from '@pithyjs/core';
10
+ /** @codexApi {"parent":"pithy.ui-kit.error-boundary","name":"ErrorBoundary","stability":"stable","signature":"(props: ErrorBoundaryProps) => { el: DocumentFragment; destroy: () => void }"} */
11
+ export function ErrorBoundary({ onError } = {}) {
12
+ // 1. Read child AST nodes from component context
13
+ const componentCtx = globalThis.__pithyComponentContext;
14
+ const childAstNodes = componentCtx?.__childAstNodes;
15
+ if (import.meta.env?.DEV) {
16
+ if (!childAstNodes || childAstNodes.length === 0) {
17
+ console.warn('[<ErrorBoundary>] No child AST nodes found. Ensure <ErrorBoundary> has children in the template.');
18
+ }
19
+ }
20
+ // 2. Separate into default and fallback slot nodes
21
+ const defaultNodes = [];
22
+ const fallbackNodes = [];
23
+ if (childAstNodes) {
24
+ for (const node of childAstNodes) {
25
+ if (node.directives?.slot === 'fallback' ||
26
+ node.attrs?.slot === 'fallback') {
27
+ // Strip slot attribute — these nodes are now direct children of the
28
+ // fallback container, not slot projections.
29
+ const cleaned = { ...node };
30
+ if (cleaned.attrs?.slot) {
31
+ cleaned.attrs = { ...cleaned.attrs };
32
+ delete cleaned.attrs.slot;
33
+ }
34
+ if (cleaned.directives?.slot) {
35
+ cleaned.directives = { ...cleaned.directives };
36
+ delete cleaned.directives.slot;
37
+ }
38
+ fallbackNodes.push(cleaned);
39
+ }
40
+ else {
41
+ defaultNodes.push(node);
42
+ }
43
+ }
44
+ }
45
+ // 3. Create error signal
46
+ const errorSignal = signal(null);
47
+ // 4. Build parent context (strip all internal __ properties)
48
+ const parentCtx = componentCtx
49
+ ? Object.fromEntries(Object.entries(componentCtx).filter(([k]) => !k.startsWith('__')))
50
+ : {};
51
+ // 5. Build boundary context with error signal injected
52
+ // The babel plugin's componentScopes declares `error` as an injected variable
53
+ // for ErrorBoundary, so it won't clash with parent scope identifiers.
54
+ const boundaryCtx = {
55
+ ...parentCtx,
56
+ __errorSignal: errorSignal,
57
+ error: errorSignal,
58
+ };
59
+ // 6. Build the complete boundary as a unified AST tree.
60
+ // By passing the entire tree to compileNodes in one shot, we guarantee that:
61
+ // - The error boundary is registered (bindErrorBoundary step) BEFORE
62
+ // child components are instantiated (bindComponentTags step)
63
+ // - Structural directives (@if, @switch, @for) inside children work correctly
64
+ const uid = Math.random().toString(36).slice(2, 8);
65
+ const boundaryAst = [
66
+ {
67
+ type: 'element',
68
+ tagName: 'div',
69
+ nodeId: `__eb-root-${uid}`,
70
+ directives: {
71
+ error: '__errorSignal', // → data-error attr (pithyTreeToDom.ts:163)
72
+ },
73
+ children: [
74
+ ...defaultNodes,
75
+ {
76
+ type: 'element',
77
+ tagName: 'div',
78
+ nodeId: `__eb-fallback-${uid}`,
79
+ directives: {
80
+ fallback: true, // → data-fallback attr (pithyTreeToDom.ts:168)
81
+ },
82
+ children: fallbackNodes.length > 0
83
+ ? fallbackNodes
84
+ : [
85
+ {
86
+ type: 'text',
87
+ textContent: 'Something went wrong.',
88
+ nodeId: `__eb-text-${uid}`,
89
+ },
90
+ ],
91
+ },
92
+ ],
93
+ },
94
+ ];
95
+ // 7. Compile with full pipeline (structural + non-structural directives)
96
+ const { el, destroy: destroyCompiled } = compileNodes(boundaryAst, boundaryCtx);
97
+ // 8. Set up onError callback via subscribe() (not effect())
98
+ // subscribe() avoids tracking signal reads inside the callback,
99
+ // which could cause infinite loops if the callback updates other signals.
100
+ const localDisposers = [];
101
+ if (onError) {
102
+ const unsubscribe = errorSignal.subscribe(err => {
103
+ if (err !== null) {
104
+ onError(err);
105
+ }
106
+ });
107
+ localDisposers.push(unsubscribe);
108
+ }
109
+ // 9. Return
110
+ return {
111
+ el,
112
+ destroy: () => {
113
+ for (const d of localDisposers)
114
+ d();
115
+ destroyCompiled();
116
+ },
117
+ };
118
+ }
119
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/structural/ErrorBoundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.for",
4
+ "title": "<For> Structural Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { type Signal } from '@pithyjs/signals';
9
+ /** @codexApi {"parent":"pithy.ui-kit.for","name":"ForProps","stability":"stable","signature":"interface ForProps<T>"} */
10
+ export interface ForProps<T = unknown> {
11
+ /** Reactive or static list of items to render */
12
+ list: Signal<T[]> | T[];
13
+ /** Key extractor — string property name or function */
14
+ trackBy?: string | ((item: T, index: number) => string);
15
+ /** Item variable name exposed to children (default: "item") */
16
+ as?: string;
17
+ /** Index variable name exposed to children (default: "index") */
18
+ indexAs?: string;
19
+ /** Count signal alias (default: "count") */
20
+ countAs?: string;
21
+ /** First signal alias (default: "first") */
22
+ firstAs?: string;
23
+ /** Last signal alias (default: "last") */
24
+ lastAs?: string;
25
+ /** Even signal alias (default: "even") */
26
+ evenAs?: string;
27
+ /** Odd signal alias (default: "odd") */
28
+ oddAs?: string;
29
+ /** Suppress the DEV warning when intentionally shadowing outer loop helpers */
30
+ allowShadow?: boolean;
31
+ }
32
+ /** @codexApi {"parent":"pithy.ui-kit.for","name":"For","stability":"stable","signature":"<T>(props: ForProps<T>) => { el: DocumentFragment; destroy: () => void }"} */
33
+ export declare function For<T>({ list, trackBy, as: _as, indexAs: _indexAs, countAs: _countAs, firstAs: _firstAs, lastAs: _lastAs, evenAs: _evenAs, oddAs: _oddAs, allowShadow, }: ForProps<T>): {
34
+ el: DocumentFragment;
35
+ destroy: () => void;
36
+ };
37
+ //# sourceMappingURL=For.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"For.d.ts","sourceRoot":"","sources":["../../src/structural/For.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAEF,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAKjE,yHAAyH;AACzH,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACnC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACxD,+DAA+D;IAC/D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,uKAAuK;AACvK,wBAAgB,GAAG,CAAC,CAAC,EAAE,EACrB,IAAI,EACJ,OAAmB,EACnB,EAAE,EAAE,GAAY,EAChB,OAAO,EAAE,QAAkB,EAC3B,OAAO,EAAE,QAAkB,EAC3B,OAAO,EAAE,QAAkB,EAC3B,MAAM,EAAE,OAAgB,EACxB,MAAM,EAAE,OAAgB,EACxB,KAAK,EAAE,MAAc,EACrB,WAAmB,GACpB,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG;IAAE,EAAE,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CA0J7D"}
@@ -0,0 +1,129 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.for",
4
+ "title": "<For> Structural Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { effect, isSignal } from '@pithyjs/signals';
9
+ import { createLoopManager } from '@pithyjs/core';
10
+ import { isValidJsIdentifier } from '@pithyjs/shared';
11
+ /** @codexApi {"parent":"pithy.ui-kit.for","name":"For","stability":"stable","signature":"<T>(props: ForProps<T>) => { el: DocumentFragment; destroy: () => void }"} */
12
+ export function For({ list, trackBy = undefined, as: _as = 'item', indexAs: _indexAs = 'index', countAs: _countAs = 'count', firstAs: _firstAs = 'first', lastAs: _lastAs = 'last', evenAs: _evenAs = 'even', oddAs: _oddAs = 'odd', allowShadow = false, }) {
13
+ let as = _as;
14
+ let indexAs = _indexAs;
15
+ let countAs = _countAs;
16
+ let firstAs = _firstAs;
17
+ let lastAs = _lastAs;
18
+ let evenAs = _evenAs;
19
+ let oddAs = _oddAs;
20
+ // Validate all alias props are valid JS identifiers (not reserved words).
21
+ // Fallback always runs (prevents broken templates in prod); warning is DEV-only.
22
+ const validateAlias = (value, name, fallback) => {
23
+ if (!isValidJsIdentifier(value)) {
24
+ if (import.meta.env?.DEV) {
25
+ console.warn(`[<For>] Invalid "${name}" value: "${value}". Must be a valid, non-reserved JS identifier. Falling back to "${fallback}".`);
26
+ }
27
+ return fallback;
28
+ }
29
+ return value;
30
+ };
31
+ as = validateAlias(as, 'as', 'item');
32
+ indexAs = validateAlias(indexAs, 'indexAs', 'index');
33
+ countAs = validateAlias(countAs, 'countAs', 'count');
34
+ firstAs = validateAlias(firstAs, 'firstAs', 'first');
35
+ lastAs = validateAlias(lastAs, 'lastAs', 'last');
36
+ evenAs = validateAlias(evenAs, 'evenAs', 'even');
37
+ oddAs = validateAlias(oddAs, 'oddAs', 'odd');
38
+ // 1. Read child AST nodes from component context
39
+ const componentCtx = globalThis.__pithyComponentContext;
40
+ const childAstNodes = componentCtx?.__childAstNodes;
41
+ if (!childAstNodes || childAstNodes.length === 0) {
42
+ if (import.meta.env?.DEV) {
43
+ console.warn('[<For>] No child AST nodes found. Ensure <For> has children in the template.');
44
+ }
45
+ const emptyFragment = document.createDocumentFragment();
46
+ return { el: emptyFragment, destroy: () => { } };
47
+ }
48
+ // 2. Build trackBy function
49
+ let trackByFn;
50
+ if (typeof trackBy === 'function') {
51
+ trackByFn = trackBy;
52
+ }
53
+ else if (typeof trackBy === 'string') {
54
+ trackByFn = (item) => String(item[trackBy]);
55
+ }
56
+ else {
57
+ trackByFn = (_item, index) => String(index);
58
+ }
59
+ // 3. Create anchor and fragment
60
+ const anchor = document.createComment('#for-component');
61
+ const fragment = document.createDocumentFragment();
62
+ fragment.appendChild(anchor);
63
+ // 4. Build parent context (strip all internal __ properties)
64
+ const parentCtx = componentCtx
65
+ ? Object.fromEntries(Object.entries(componentCtx).filter(([k]) => !k.startsWith('__')))
66
+ : {};
67
+ // Warn when nested <For> will shadow outer loop helpers without aliases
68
+ if (import.meta.env?.DEV && !allowShadow) {
69
+ const helperNames = [countAs, firstAs, lastAs, evenAs, oddAs];
70
+ const shadowedHelpers = helperNames.filter(name => typeof parentCtx[name] === 'function');
71
+ if (shadowedHelpers.length > 0) {
72
+ console.warn(`[<For>] Nested <For> detected. Helper signals (${shadowedHelpers.join(', ')}) ` +
73
+ 'from the outer loop will be shadowed. Use countAs/firstAs/lastAs/evenAs/oddAs to alias them, ' +
74
+ 'or pass allowShadow to suppress this warning.');
75
+ }
76
+ }
77
+ // 5. Delegate to createLoopManager with templateNodes
78
+ const loopManager = createLoopManager({
79
+ anchor,
80
+ trackByFn,
81
+ parentCtx,
82
+ itemVar: as,
83
+ indexVar: indexAs,
84
+ countVar: countAs,
85
+ firstVar: firstAs,
86
+ lastVar: lastAs,
87
+ evenVar: evenAs,
88
+ oddVar: oddAs,
89
+ templateNodes: childAstNodes,
90
+ });
91
+ // 6. Reactive effect that watches `list`
92
+ if (import.meta.env?.DEV) {
93
+ if (!isSignal(list) && Array.isArray(list)) {
94
+ console.warn("[<For>] list is a static array — updates won't be reactive. Wrap it in signal() for reactivity.");
95
+ }
96
+ }
97
+ const disposers = [];
98
+ const stopEffect = effect(() => {
99
+ let collection;
100
+ if (Array.isArray(list)) {
101
+ collection = list;
102
+ }
103
+ else if (isSignal(list)) {
104
+ collection = list();
105
+ }
106
+ else {
107
+ if (import.meta.env?.DEV) {
108
+ console.warn('[<For>] list prop is not an array or signal:', list);
109
+ }
110
+ collection = [];
111
+ }
112
+ if (!Array.isArray(collection)) {
113
+ if (import.meta.env?.DEV) {
114
+ console.warn('[<For>] list signal did not return an array:', collection);
115
+ }
116
+ collection = [];
117
+ }
118
+ loopManager.update(collection);
119
+ });
120
+ disposers.push(stopEffect);
121
+ // 7. Return fragment and destroy
122
+ const destroy = () => {
123
+ for (const d of disposers)
124
+ d();
125
+ loopManager.destroyAll();
126
+ };
127
+ return { el: fragment, destroy };
128
+ }
129
+ //# sourceMappingURL=For.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"For.js","sourceRoot":"","sources":["../../src/structural/For.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.lazy",
4
+ "title": "<Lazy> Structural Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { type Signal } from '@pithyjs/signals';
9
+ import { type LazyHandle } from '@pithyjs/core';
10
+ /** @codexApi {"parent":"pithy.ui-kit.lazy","name":"LazyProps","stability":"stable","signature":"interface LazyProps"} */
11
+ export interface LazyProps {
12
+ /** Lazy handle created by lazy() — required */
13
+ load: LazyHandle<unknown>;
14
+ /** Trigger mode: 'visible' (default) loads on viewport entry, 'when' loads on condition */
15
+ trigger?: 'visible' | 'when';
16
+ /** Condition for trigger='when' — accepts Signal<boolean> or static boolean */
17
+ when?: Signal<boolean> | boolean;
18
+ }
19
+ /**
20
+ * Lazy-loads a component using the existing @defer directive.
21
+ *
22
+ * Delegates entirely to @defer + content projection —
23
+ * the existing framework handles IntersectionObserver, loading,
24
+ * timeout, retry, error boundaries, and cleanup.
25
+ *
26
+ * @example
27
+ * ```html
28
+ * <Lazy load="HeavyChart" trigger="'visible'">
29
+ * <div slot="placeholder">Loading chart...</div>
30
+ * <div slot="error">Failed to load</div>
31
+ * </Lazy>
32
+ *
33
+ * <Lazy load="ExpensiveTab" trigger="'when'" when="isTabVisible">
34
+ * <span slot="placeholder">Loading...</span>
35
+ * </Lazy>
36
+ * ```
37
+ */
38
+ /** @codexApi {"parent":"pithy.ui-kit.lazy","name":"Lazy","stability":"stable","signature":"(props: LazyProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
39
+ export declare function Lazy({ load, trigger, when, }: LazyProps): {
40
+ el: HTMLElement | DocumentFragment;
41
+ destroy: () => void;
42
+ };
43
+ //# sourceMappingURL=Lazy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lazy.d.ts","sourceRoot":"","sources":["../../src/structural/Lazy.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAEF,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtD,yHAAyH;AACzH,MAAM,WAAW,SAAS;IACxB,+CAA+C;IAC/C,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1B,2FAA2F;IAC3F,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,kLAAkL;AAClL,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,OAAmB,EACnB,IAAgB,GACjB,EAAE,SAAS,GAAG;IAAE,EAAE,EAAE,WAAW,GAAG,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAmBzE"}
@@ -0,0 +1,47 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.lazy",
4
+ "title": "<Lazy> Structural Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { isSignal } from '@pithyjs/signals';
9
+ import { html } from '@pithyjs/core';
10
+ /**
11
+ * Lazy-loads a component using the existing @defer directive.
12
+ *
13
+ * Delegates entirely to @defer + content projection —
14
+ * the existing framework handles IntersectionObserver, loading,
15
+ * timeout, retry, error boundaries, and cleanup.
16
+ *
17
+ * @example
18
+ * ```html
19
+ * <Lazy load="HeavyChart" trigger="'visible'">
20
+ * <div slot="placeholder">Loading chart...</div>
21
+ * <div slot="error">Failed to load</div>
22
+ * </Lazy>
23
+ *
24
+ * <Lazy load="ExpensiveTab" trigger="'when'" when="isTabVisible">
25
+ * <span slot="placeholder">Loading...</span>
26
+ * </Lazy>
27
+ * ```
28
+ */
29
+ /** @codexApi {"parent":"pithy.ui-kit.lazy","name":"Lazy","stability":"stable","signature":"(props: LazyProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
30
+ export function Lazy({ load, trigger = 'visible', when = undefined, }) {
31
+ if (trigger === 'when') {
32
+ const whenCondition = when !== undefined ? (isSignal(when) ? when : () => !!when) : () => false;
33
+ return html `
34
+ <div @defer="when" @load="load" @when="whenCondition()">
35
+ <slot name="placeholder"></slot>
36
+ <slot name="error"></slot>
37
+ </div>
38
+ `;
39
+ }
40
+ return html `
41
+ <div @defer="visible" @load="load">
42
+ <slot name="placeholder"></slot>
43
+ <slot name="error"></slot>
44
+ </div>
45
+ `;
46
+ }
47
+ //# sourceMappingURL=Lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lazy.js","sourceRoot":"","sources":["../../src/structural/Lazy.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAEF,OAAO,EAAE,QAAQ,EAAe,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAmB,MAAM,eAAe,CAAC;AAYtD;;;;;;;;;;;;;;;;;;GAkBG;AACH,kLAAkL;AAClL,MAAM,UAAU,IAAI,CAAC,EACnB,IAAI,EACJ,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,SAAS,GACN;IACV,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,aAAa,GACjB,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;QAE5E,OAAO,IAAI,CAAA;;;;;KAKV,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAA;;;;;GAKV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.nav-link",
4
+ "title": "<NavLink> Structural Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import type { PrefetchStrategy } from '@pithyjs/router';
9
+ /** @codexApi {"parent":"pithy.ui-kit.nav-link","name":"NavLinkProps","stability":"stable","signature":"interface NavLinkProps"} */
10
+ export interface NavLinkProps {
11
+ /** Target URL — required */
12
+ to: string;
13
+ /** Prefetch strategy (default: 'none') */
14
+ prefetch?: PrefetchStrategy;
15
+ /** CSS class when route is active (default: 'router-link-active') */
16
+ activeClass?: string;
17
+ /** Use exact path matching for active state (default: false) */
18
+ exactActive?: boolean;
19
+ /** Replace current history entry instead of push (default: false) */
20
+ replace?: boolean;
21
+ /** CSS class(es) forwarded to the inner <a> element */
22
+ linkClass?: string;
23
+ }
24
+ /**
25
+ * Router-aware anchor that delegates to the @routerLink directive.
26
+ *
27
+ * Named NavLink (not Link) to avoid collision with the HTML <link>
28
+ * void element — parse5 treats <link> as self-closing, so children
29
+ * would be lost.
30
+ *
31
+ * @example
32
+ * ```html
33
+ * <NavLink to="'/about'">About</NavLink>
34
+ *
35
+ * <NavLink to="'/dashboard'" prefetch="'hover'" activeClass="'is-active'" exactActive="true">
36
+ * Dashboard
37
+ * </NavLink>
38
+ * ```
39
+ */
40
+ /** @codexApi {"parent":"pithy.ui-kit.nav-link","name":"NavLink","stability":"stable","signature":"(props: NavLinkProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
41
+ export declare function NavLink({ to, prefetch, activeClass, exactActive, replace, linkClass, }: NavLinkProps): {
42
+ el: HTMLElement | DocumentFragment;
43
+ destroy: () => void;
44
+ };
45
+ //# sourceMappingURL=NavLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavLink.d.ts","sourceRoot":"","sources":["../../src/structural/NavLink.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAGF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,mIAAmI;AACnI,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qEAAqE;IACrE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,4LAA4L;AAC5L,wBAAgB,OAAO,CAAC,EACtB,EAAE,EACF,QAAiB,EACjB,WAAkC,EAClC,WAAmB,EACnB,OAAe,EACf,SAAc,GACf,EAAE,YAAY,GAAG;IAAE,EAAE,EAAE,WAAW,GAAG,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAW5E"}