@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PithyJS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,35 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.animate-in",
4
+ "title": "Entrance Animation Helper",
5
+ "category": "runtime"
6
+ }
7
+ */
8
+ import { type AnimationPattern } from '@pithyjs/design-system';
9
+ /**
10
+ * Apply a design-system animation to an element.
11
+ *
12
+ * Despite the name, this helper supports **all** animation patterns defined in
13
+ * `ANIMATION_PATTERNS` — entrance (`fade-in`, `slide-up`, …), exit (`fade-out`),
14
+ * and continuous (`spin`). The name `animateIn` reflects the most common usage
15
+ * (entrance animations); a future `applyAnimation` alias may be added.
16
+ *
17
+ * Adds the appropriate `.u-animate-*` utility class from the design system.
18
+ * Animations are automatically disabled when `prefers-reduced-motion: reduce`
19
+ * is active (handled by the design system's motion tokens, which zero out
20
+ * durations — no JS-level media query check is needed).
21
+ *
22
+ * @param el - The element to animate
23
+ * @param rawPattern - Animation pattern from design system tokens (default: `"fade-in"`)
24
+ * @returns A cleanup function that removes the animation class
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const cleanup = animateIn(el);
29
+ * // later, in destroy():
30
+ * cleanup();
31
+ * ```
32
+ */
33
+ /** @codexApi {"parent":"pithy.ui-kit.animate-in","name":"animateIn","stability":"stable","signature":"(el: Element | null | undefined, pattern?: AnimationPattern) => () => void"} */
34
+ export declare function animateIn(el: Element | null | undefined, rawPattern?: AnimationPattern): () => void;
35
+ //# sourceMappingURL=animate-in.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animate-in.d.ts","sourceRoot":"","sources":["../../src/animation/animate-in.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAEF,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAkBhC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,sLAAsL;AACtL,wBAAgB,SAAS,CACvB,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,EAC9B,UAAU,GAAE,gBAA4B,GACvC,MAAM,IAAI,CA+BZ"}
@@ -0,0 +1,71 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.animate-in",
4
+ "title": "Entrance Animation Helper",
5
+ "category": "runtime"
6
+ }
7
+ */
8
+ import { ANIMATION_PATTERNS, } from '@pithyjs/design-system';
9
+ /**
10
+ * Static map from animation pattern to its utility class name.
11
+ * Written as literals so the design-system JIT scanner can detect every
12
+ * class during source scanning — do NOT replace with template literals.
13
+ */
14
+ const ANIMATE_CLASS = {
15
+ 'fade-in': 'u-animate-fade-in',
16
+ 'fade-out': 'u-animate-fade-out',
17
+ 'fade-scale-in': 'u-animate-fade-scale-in',
18
+ 'slide-up': 'u-animate-slide-up',
19
+ 'slide-down': 'u-animate-slide-down',
20
+ 'slide-left': 'u-animate-slide-left',
21
+ 'slide-right': 'u-animate-slide-right',
22
+ spin: 'u-animate-spin',
23
+ };
24
+ /**
25
+ * Apply a design-system animation to an element.
26
+ *
27
+ * Despite the name, this helper supports **all** animation patterns defined in
28
+ * `ANIMATION_PATTERNS` — entrance (`fade-in`, `slide-up`, …), exit (`fade-out`),
29
+ * and continuous (`spin`). The name `animateIn` reflects the most common usage
30
+ * (entrance animations); a future `applyAnimation` alias may be added.
31
+ *
32
+ * Adds the appropriate `.u-animate-*` utility class from the design system.
33
+ * Animations are automatically disabled when `prefers-reduced-motion: reduce`
34
+ * is active (handled by the design system's motion tokens, which zero out
35
+ * durations — no JS-level media query check is needed).
36
+ *
37
+ * @param el - The element to animate
38
+ * @param rawPattern - Animation pattern from design system tokens (default: `"fade-in"`)
39
+ * @returns A cleanup function that removes the animation class
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const cleanup = animateIn(el);
44
+ * // later, in destroy():
45
+ * cleanup();
46
+ * ```
47
+ */
48
+ /** @codexApi {"parent":"pithy.ui-kit.animate-in","name":"animateIn","stability":"stable","signature":"(el: Element | null | undefined, pattern?: AnimationPattern) => () => void"} */
49
+ export function animateIn(el, rawPattern = 'fade-in') {
50
+ // Guard: no element — return no-op cleanup
51
+ if (!el || !(el instanceof Element)) {
52
+ if (import.meta.env?.DEV) {
53
+ console.warn(`[animateIn] Expected an Element but received ${el === null ? 'null' : typeof el}. Animation skipped.`);
54
+ }
55
+ return () => { };
56
+ }
57
+ const validPattern = ANIMATION_PATTERNS.includes(rawPattern);
58
+ if (import.meta.env?.DEV) {
59
+ if (!validPattern) {
60
+ const valid = ANIMATION_PATTERNS.join(', ');
61
+ console.warn(`[animateIn] Invalid pattern: "${rawPattern}". Expected one of: ${valid}. Falling back to "fade-in".`);
62
+ }
63
+ }
64
+ const pattern = validPattern ? rawPattern : 'fade-in';
65
+ const cls = ANIMATE_CLASS[pattern];
66
+ el.classList.add(cls);
67
+ return () => {
68
+ el.classList.remove(cls);
69
+ };
70
+ }
71
+ //# sourceMappingURL=animate-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animate-in.js","sourceRoot":"","sources":["../../src/animation/animate-in.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAEF,OAAO,EACL,kBAAkB,GAEnB,MAAM,wBAAwB,CAAC;AAEhC;;;;GAIG;AACH,MAAM,aAAa,GAAqC;IACtD,SAAS,EAAE,mBAAmB;IAC9B,UAAU,EAAE,oBAAoB;IAChC,eAAe,EAAE,yBAAyB;IAC1C,UAAU,EAAE,oBAAoB;IAChC,YAAY,EAAE,sBAAsB;IACpC,YAAY,EAAE,sBAAsB;IACpC,aAAa,EAAE,uBAAuB;IACtC,IAAI,EAAE,gBAAgB;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,sLAAsL;AACtL,MAAM,UAAU,SAAS,CACvB,EAA8B,EAC9B,aAA+B,SAAS;IAExC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,YAAY,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CACV,gDAAgD,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,sBAAsB,CACvG,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAI,kBAAwC,CAAC,QAAQ,CACrE,UAAU,CACX,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CACV,iCAAiC,UAAU,uBAAuB,KAAK,8BAA8B,CACtG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEtB,OAAO,GAAG,EAAE;QACV,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ /// Shared visual for single icon-only control buttons — the circular icon
2
+ /// "option" used by both <IconGroup> options and the standalone <IconButton>.
3
+ /// Keeping this in one mixin means the two render pixel-identically.
4
+ ///
5
+ /// @group atoms/actions
6
+
7
+ @use '@pithyjs/design-system/a11y/styles/mixins' as a11y;
8
+
9
+ /// Circular icon button: muted by default, hover tint, primary "active" state
10
+ /// (driven by `[data-active="true"]`), focus ring, and forced-colors handling.
11
+ @mixin icon-control-button {
12
+ appearance: none;
13
+ margin: 0;
14
+ display: grid;
15
+ place-items: center;
16
+ border: 0;
17
+ // Pill radius keeps the icon button circular by default, but follows the
18
+ // design-system radius scale — the `sharp` preset sets `--radius-pill: 0`, so
19
+ // a square icon button is themeable rather than hard-locked to a circle.
20
+ // Falls back to a circle (`50%`) when the radius module isn't initialized.
21
+ border-radius: var(--radius-pill, 50%);
22
+ background: transparent;
23
+ color: var(--color-text-muted);
24
+ cursor: pointer;
25
+ font: inherit;
26
+
27
+ @include a11y.motion-safe {
28
+ transition:
29
+ var(--motion-transition-background), var(--motion-transition-color);
30
+ }
31
+
32
+ &:hover:not([data-active='true']) {
33
+ color: var(--color-text);
34
+ @include a11y.state-background(hover, var(--color-text));
35
+ }
36
+
37
+ &[data-active='true'] {
38
+ color: var(--color-primary);
39
+ @include a11y.state-background(selected, var(--color-primary));
40
+ }
41
+
42
+ &:focus-visible {
43
+ @include a11y.focus-ring;
44
+ }
45
+
46
+ @include a11y.forced-colors {
47
+ &[data-active='true'] {
48
+ forced-color-adjust: none;
49
+ background-color: Highlight;
50
+ color: HighlightText;
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,93 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.button",
4
+ "title": "<Button> Action Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import type { ReactiveText } from '../../../shared/clickable';
9
+ import { type ControlSize, type RadiusSize } from '@pithyjs/design-system';
10
+ import { type ButtonVariant, type ButtonType, type ButtonTag } from '../../../shared/button';
11
+ import { type SemanticColor } from '../../../shared/types';
12
+ /** @codexApi {"parent":"pithy.ui-kit.button","name":"ButtonProps","stability":"stable","signature":"interface ButtonProps"} */
13
+ export interface ButtonProps {
14
+ /** Visual variant (default: "solid") */
15
+ variant?: ButtonVariant;
16
+ /** Color scheme — maps to design-system semantic tokens (default: "primary") */
17
+ color?: SemanticColor;
18
+ /** Size — maps to u-control-* utilities (default: "md") */
19
+ size?: ControlSize;
20
+ /** Border-radius shape — `"xl"` reads as pill, `"none"` as square (default: `"md"`) */
21
+ shape?: RadiusSize;
22
+ /** Disabled state — static boolean or signal/computed accessor (default: false) */
23
+ disabled?: boolean | (() => boolean);
24
+ /** Loading state — static boolean or signal/computed accessor (default: false) */
25
+ loading?: boolean | (() => boolean);
26
+ /** HTML button type (default: "button") */
27
+ type?: ButtonType;
28
+ /** Screen-reader text shown during loading (default: "Loading…") */
29
+ loadingText?: string;
30
+ /** Tab index override (default: native <button> behaviour, i.e. 0) */
31
+ tabIndex?: number;
32
+ /** Stretch to full container width (default: false) */
33
+ fullWidth?: boolean;
34
+ /** Render as a different element — "a" without href becomes <a role="button">; "a" with href keeps native link semantics (default: "button") */
35
+ as?: ButtonTag;
36
+ /** href for anchor element — only used when as="a"; preserves native link semantics (no role="button") */
37
+ href?: string;
38
+ /** Click handler, guarded against disabled/loading. Prefer @click on the component tag; onClick is an alternative. */
39
+ onClick?: (e: MouseEvent) => void;
40
+ /** Accessible label — forwarded as aria-label on the root element.
41
+ * Static string or signal/computed accessor.
42
+ * Use when the button has no visible text (e.g. icon-only buttons). */
43
+ ariaLabel?: ReactiveText;
44
+ /** Visible button label — static string or signal/computed accessor. When set,
45
+ * the label is used as the button's content and slot children are ignored.
46
+ * Omit to fall back to slot content (`<Button>Click me</Button>`). */
47
+ text?: ReactiveText;
48
+ /** Icon name (from the registered sprite) rendered before the label — static or signal. */
49
+ iconStart?: ReactiveText;
50
+ /** Icon name (from the registered sprite) rendered after the label — static or signal. */
51
+ iconEnd?: ReactiveText;
52
+ }
53
+ /**
54
+ * Accessible, reactive button component.
55
+ *
56
+ * Renders a `<button>` by default, or `<a>` when `as="a"`.
57
+ * When `as="a"` with `href`, the anchor keeps native link semantics
58
+ * (screen reader announces "link", Enter navigates, Space scrolls).
59
+ * When `as="a"` without `href`, it becomes `<a role="button">` with
60
+ * full button keyboard emulation (Space + Enter activate).
61
+ * Supports reactive `disabled`/`loading` via signal accessors.
62
+ * For navigation links, use `<NavLink>` instead. The `link` variant is
63
+ * for buttons that look like hyperlinks (e.g. "Cancel" actions).
64
+ *
65
+ * @param props - Button configuration
66
+ * @param props.variant - Visual style: `"solid"` | `"outline"` | `"ghost"` | `"link"` (default: `"solid"`)
67
+ * @param props.color - Semantic color: `"primary"` | `"secondary"` | `"tertiary"` | `"success"` | `"info"` | `"warning"` | `"danger"` (default: `"primary"`)
68
+ * @param props.size - Control size: `"sm"` | `"md"` | `"lg"` (default: `"md"`)
69
+ * @param props.disabled - Disabled state, static or signal (default: `false`)
70
+ * @param props.loading - Loading state with spinner, static or signal (default: `false`)
71
+ * @param props.type - HTML button type: `"button"` | `"submit"` | `"reset"` (default: `"button"`)
72
+ * @param props.loadingText - Screen reader loading announcement (default: `"Loading…"`)
73
+ * @param props.tabIndex - Tab order override
74
+ * @param props.fullWidth - Stretch to 100% container width (default: `false`)
75
+ * @param props.as - Element tag: `"button"` | `"a"` (default: `"button"`)
76
+ * @param props.href - Link URL, only when `as="a"`
77
+ * @param props.onClick - Click handler, guarded against disabled/loading
78
+ * @param props.ariaLabel - Accessible label for icon-only or unlabelled buttons, static or signal
79
+ * @returns `{ el, destroy }` — mounted element and cleanup function
80
+ *
81
+ * @example
82
+ * ```html
83
+ * <Button variant="'solid'" color="'primary'">Save</Button>
84
+ * <Button variant="'outline'" loading="isLoading">Submit</Button>
85
+ * <Button as="'a'" href="'/docs'" variant="'ghost'">Read More</Button>
86
+ * ```
87
+ */
88
+ /** @codexApi {"parent":"pithy.ui-kit.button","name":"Button","stability":"stable","signature":"(props?: ButtonProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
89
+ export declare function Button({ variant: rawVariant, color: rawColor, size: rawSize, shape: rawShape, disabled, loading, type: rawType, loadingText, tabIndex, fullWidth, as: rawAs, href, onClick, ariaLabel, text, iconStart, iconEnd, }?: ButtonProps): {
90
+ el: HTMLElement | DocumentFragment;
91
+ destroy: () => void;
92
+ };
93
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../../src/atoms/actions/button/Button.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAIF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;AAE/B,+HAA+H;AAC/H,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,gFAAgF;IAChF,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,uFAAuF;IACvF,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACrC,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACpC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gJAAgJ;IAChJ,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,0GAA0G;IAC1G,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sHAAsH;IACtH,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC;;4EAEwE;IACxE,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB;;2EAEuE;IACvE,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,yLAAyL;AACzL,wBAAgB,MAAM,CAAC,EACrB,OAAO,EAAE,UAAoB,EAC7B,KAAK,EAAE,QAAoB,EAC3B,IAAI,EAAE,OAAc,EACpB,KAAK,EAAE,QAAe,EACtB,QAAgB,EAChB,OAAe,EACf,IAAI,EAAE,OAAkB,EACxB,WAA6B,EAC7B,QAAoB,EACpB,SAAiB,EACjB,EAAE,EAAE,KAAgB,EACpB,IAAgB,EAChB,OAAmB,EACnB,SAAqB,EACrB,IAAgB,EAChB,SAAqB,EACrB,OAAmB,GACpB,GAAE,WAAgB,GAAG;IACpB,EAAE,EAAE,WAAW,GAAG,gBAAgB,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAmUA"}
@@ -0,0 +1,332 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.button",
4
+ "title": "<Button> Action Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { renderChildren } from '@pithyjs/core';
9
+ import { effect } from '@pithyjs/signals';
10
+ import { RADIUS_SIZES, } from '@pithyjs/design-system';
11
+ import { Icon } from '../../content/icon/Icon';
12
+ import { BUTTON_VARIANTS, BUTTON_TYPES, BUTTON_TAGS, } from '../../../shared/button';
13
+ import { CONTROL_CLASS } from '../../../shared/common';
14
+ import { SEMANTIC_COLORS, CONTROL_SIZES, } from '../../../shared/types';
15
+ /**
16
+ * Accessible, reactive button component.
17
+ *
18
+ * Renders a `<button>` by default, or `<a>` when `as="a"`.
19
+ * When `as="a"` with `href`, the anchor keeps native link semantics
20
+ * (screen reader announces "link", Enter navigates, Space scrolls).
21
+ * When `as="a"` without `href`, it becomes `<a role="button">` with
22
+ * full button keyboard emulation (Space + Enter activate).
23
+ * Supports reactive `disabled`/`loading` via signal accessors.
24
+ * For navigation links, use `<NavLink>` instead. The `link` variant is
25
+ * for buttons that look like hyperlinks (e.g. "Cancel" actions).
26
+ *
27
+ * @param props - Button configuration
28
+ * @param props.variant - Visual style: `"solid"` | `"outline"` | `"ghost"` | `"link"` (default: `"solid"`)
29
+ * @param props.color - Semantic color: `"primary"` | `"secondary"` | `"tertiary"` | `"success"` | `"info"` | `"warning"` | `"danger"` (default: `"primary"`)
30
+ * @param props.size - Control size: `"sm"` | `"md"` | `"lg"` (default: `"md"`)
31
+ * @param props.disabled - Disabled state, static or signal (default: `false`)
32
+ * @param props.loading - Loading state with spinner, static or signal (default: `false`)
33
+ * @param props.type - HTML button type: `"button"` | `"submit"` | `"reset"` (default: `"button"`)
34
+ * @param props.loadingText - Screen reader loading announcement (default: `"Loading…"`)
35
+ * @param props.tabIndex - Tab order override
36
+ * @param props.fullWidth - Stretch to 100% container width (default: `false`)
37
+ * @param props.as - Element tag: `"button"` | `"a"` (default: `"button"`)
38
+ * @param props.href - Link URL, only when `as="a"`
39
+ * @param props.onClick - Click handler, guarded against disabled/loading
40
+ * @param props.ariaLabel - Accessible label for icon-only or unlabelled buttons, static or signal
41
+ * @returns `{ el, destroy }` — mounted element and cleanup function
42
+ *
43
+ * @example
44
+ * ```html
45
+ * <Button variant="'solid'" color="'primary'">Save</Button>
46
+ * <Button variant="'outline'" loading="isLoading">Submit</Button>
47
+ * <Button as="'a'" href="'/docs'" variant="'ghost'">Read More</Button>
48
+ * ```
49
+ */
50
+ /** @codexApi {"parent":"pithy.ui-kit.button","name":"Button","stability":"stable","signature":"(props?: ButtonProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
51
+ export function Button({ variant: rawVariant = 'solid', color: rawColor = 'primary', size: rawSize = 'md', shape: rawShape = 'md', disabled = false, loading = false, type: rawType = 'button', loadingText = 'Loading\u2026', tabIndex = undefined, fullWidth = false, as: rawAs = 'button', href = undefined, onClick = undefined, ariaLabel = undefined, text = undefined, iconStart = undefined, iconEnd = undefined, } = {}) {
52
+ const validVariant = BUTTON_VARIANTS.includes(rawVariant);
53
+ const validColor = SEMANTIC_COLORS.includes(rawColor);
54
+ const validSize = CONTROL_SIZES.includes(rawSize);
55
+ const validShape = RADIUS_SIZES.includes(rawShape);
56
+ const validType = BUTTON_TYPES.includes(rawType);
57
+ const validAs = BUTTON_TAGS.includes(rawAs);
58
+ if (import.meta.env?.DEV) {
59
+ if (!validVariant) {
60
+ const valid = BUTTON_VARIANTS.join(', ');
61
+ console.warn(`[<Button>] Invalid variant: "${rawVariant}". Expected one of: ${valid}. Falling back to "solid".`);
62
+ }
63
+ if (!validColor) {
64
+ const valid = SEMANTIC_COLORS.join(', ');
65
+ console.warn(`[<Button>] Invalid color: "${rawColor}". Expected one of: ${valid}. Falling back to "primary".`);
66
+ }
67
+ if (!validSize) {
68
+ const valid = CONTROL_SIZES.join(', ');
69
+ console.warn(`[<Button>] Invalid size: "${rawSize}". Expected one of: ${valid}. Falling back to "md".`);
70
+ }
71
+ if (!validShape) {
72
+ const valid = RADIUS_SIZES.join(', ');
73
+ console.warn(`[<Button>] Invalid shape: "${rawShape}". Expected one of: ${valid}. Falling back to "md".`);
74
+ }
75
+ if (!validType) {
76
+ const valid = BUTTON_TYPES.join(', ');
77
+ console.warn(`[<Button>] Invalid type: "${rawType}". Expected one of: ${valid}. Falling back to "button".`);
78
+ }
79
+ if (!validAs) {
80
+ const valid = BUTTON_TAGS.join(', ');
81
+ console.warn(`[<Button>] Invalid as: "${rawAs}". Expected one of: ${valid}. Falling back to "button".`);
82
+ }
83
+ }
84
+ const variant = validVariant ? rawVariant : 'solid';
85
+ const color = validColor ? rawColor : 'primary';
86
+ const size = validSize ? rawSize : 'md';
87
+ const shape = validShape ? rawShape : 'md';
88
+ const type = validType ? rawType : 'button';
89
+ const tag = validAs ? rawAs : 'button';
90
+ // Create element — <button> or <a role="button">
91
+ const el = document.createElement(tag);
92
+ // Classes
93
+ // Link variant is inline text, not a sized control — skip u-control-* class
94
+ // Radius is driven by data-shape attribute (see button.scss), not a class,
95
+ // for consistency with the data-variant/data-color/data-size pattern.
96
+ el.classList.add('ui-button', 'u-focus-ring');
97
+ if (variant !== 'link') {
98
+ el.classList.add(CONTROL_CLASS[size]);
99
+ }
100
+ // fullWidth
101
+ if (fullWidth) {
102
+ el.setAttribute('data-full-width', '');
103
+ }
104
+ // Attributes
105
+ el.setAttribute('data-variant', variant);
106
+ el.setAttribute('data-color', color);
107
+ el.setAttribute('data-size', size);
108
+ el.setAttribute('data-shape', shape);
109
+ const isAriaLabelFn = typeof ariaLabel === 'function';
110
+ const applyAriaLabel = (value) => {
111
+ const trimmed = value?.trim();
112
+ if (trimmed) {
113
+ el.setAttribute('aria-label', trimmed);
114
+ }
115
+ else {
116
+ el.removeAttribute('aria-label');
117
+ if (!isAriaLabelFn && value != null && import.meta.env?.DEV) {
118
+ console.warn(`[<Button>] ariaLabel was provided but is empty or whitespace-only; aria-label was not set.`);
119
+ }
120
+ }
121
+ };
122
+ const cleanupAriaLabelEffect = isAriaLabelFn
123
+ ? effect(() => applyAriaLabel(ariaLabel()))
124
+ : (applyAriaLabel(ariaLabel), undefined);
125
+ let keydownHandler;
126
+ let keyupHandler;
127
+ if (tag === 'button') {
128
+ el.type = type;
129
+ }
130
+ else if (href != null) {
131
+ // <a> with href: keep native link semantics (no role override).
132
+ // Screen reader announces "link" — correct since it navigates.
133
+ // Enter activates natively; Space scrolls (standard link behaviour).
134
+ el.setAttribute('href', href);
135
+ }
136
+ else {
137
+ // <a> without href: true button-as-anchor pattern.
138
+ // Add role="button", ensure focusability, and emulate button keyboard.
139
+ el.setAttribute('role', 'button');
140
+ if (tabIndex == null) {
141
+ el.tabIndex = 0;
142
+ }
143
+ // Keyboard support for <a role="button">:
144
+ // Space: keydown preventDefault on ALL events including repeats
145
+ // (prevents page scroll while held), keyup activates once
146
+ // Enter: activate on first keydown only (ignore repeats to match
147
+ // native <button> which fires once, not repeatedly)
148
+ keydownHandler = ((e) => {
149
+ if (e.key === ' ') {
150
+ e.preventDefault();
151
+ }
152
+ if (e.key === 'Enter' && !e.repeat) {
153
+ el.click();
154
+ }
155
+ });
156
+ keyupHandler = ((e) => {
157
+ if (e.key === ' ') {
158
+ el.click();
159
+ }
160
+ });
161
+ el.addEventListener('keydown', keydownHandler);
162
+ el.addEventListener('keyup', keyupHandler);
163
+ }
164
+ // tabIndex override
165
+ if (tabIndex != null) {
166
+ el.tabIndex = tabIndex;
167
+ }
168
+ // Visually-hidden live region for loading announcements.
169
+ // Hidden from the accessibility tree until loading activates it —
170
+ // prevents empty role="status" from polluting the a11y tree on every button.
171
+ const liveSpan = document.createElement('span');
172
+ liveSpan.className = 'u-sr-only ui-button-live';
173
+ liveSpan.setAttribute('role', 'status');
174
+ liveSpan.setAttribute('aria-live', 'polite');
175
+ liveSpan.setAttribute('aria-hidden', 'true');
176
+ el.appendChild(liveSpan);
177
+ // Click handler — guarded against disabled and loading states
178
+ // Uses aria-disabled instead of el.disabled so the button stays in the
179
+ // tab order and remains discoverable by screen reader users
180
+ // (native disabled removes the element from the tab order entirely)
181
+ const readDisabled = () => typeof disabled === 'function' ? disabled() : disabled;
182
+ const readLoading = () => typeof loading === 'function' ? loading() : loading;
183
+ const clickHandler = ((e) => {
184
+ if (readDisabled() || readLoading()) {
185
+ e.preventDefault();
186
+ e.stopImmediatePropagation();
187
+ return;
188
+ }
189
+ onClick?.(e);
190
+ });
191
+ el.addEventListener('click', clickHandler);
192
+ // Reactive disabled + loading state
193
+ // Uses typeof check (not isSignal) because template compilation wraps
194
+ // signal reads in arrow functions: () => mySignal() — which are not
195
+ // signals themselves but still need effect() tracking.
196
+ const isReactive = typeof disabled === 'function' || typeof loading === 'function';
197
+ const applyState = () => {
198
+ const isDisabled = readDisabled();
199
+ const isLoading = readLoading();
200
+ // aria-disabled: set when disabled OR loading (keeps button focusable)
201
+ const blocked = isDisabled || isLoading;
202
+ if (blocked) {
203
+ el.setAttribute('aria-disabled', 'true');
204
+ }
205
+ else {
206
+ el.removeAttribute('aria-disabled');
207
+ }
208
+ // Prevent implicit form submission while disabled/loading:
209
+ // aria-disabled doesn't stop the browser from using a submit/reset button
210
+ // for implicit form submission (e.g. Enter in a text input).
211
+ // Temporarily switch type to "button" to neutralise this.
212
+ if (tag === 'button') {
213
+ el.type = blocked ? 'button' : type;
214
+ }
215
+ // Loading — reveal the live region to AT only while loading
216
+ el.classList.toggle('ui-button-loading', isLoading);
217
+ if (isLoading) {
218
+ el.setAttribute('aria-busy', 'true');
219
+ liveSpan.removeAttribute('aria-hidden');
220
+ liveSpan.textContent = loadingText;
221
+ }
222
+ else {
223
+ el.removeAttribute('aria-busy');
224
+ liveSpan.setAttribute('aria-hidden', 'true');
225
+ liveSpan.textContent = '';
226
+ }
227
+ };
228
+ // If props are signals, wrap in effect for auto-tracking; otherwise run once
229
+ const cleanupEffect = isReactive
230
+ ? effect(applyState)
231
+ : (applyState(), undefined);
232
+ // Icons inherit button size; they're decorative when paired with text (use `ariaLabel` for icon-only).
233
+ const iconSize = size;
234
+ const isTextFn = typeof text === 'function';
235
+ const isIconStartFn = typeof iconStart === 'function';
236
+ const isIconEndFn = typeof iconEnd === 'function';
237
+ const readText = () => isTextFn
238
+ ? text()
239
+ : text;
240
+ const readIconStart = () => isIconStartFn
241
+ ? iconStart()
242
+ : iconStart;
243
+ const readIconEnd = () => isIconEndFn
244
+ ? iconEnd()
245
+ : iconEnd;
246
+ // `text` prop wins over slot content. A function `text` always uses a text node
247
+ // (so the signal can update it later); a static `undefined` `text` falls
248
+ // through to slot children. A static `""` keeps the button intentionally empty.
249
+ let textNode;
250
+ let destroyChildren;
251
+ const staticText = isTextFn ? undefined : readText();
252
+ if (isTextFn) {
253
+ textNode = document.createTextNode('');
254
+ el.appendChild(textNode);
255
+ }
256
+ else if (typeof staticText === 'string') {
257
+ textNode = document.createTextNode(staticText);
258
+ el.appendChild(textNode);
259
+ }
260
+ else {
261
+ const { el: childFragment, destroy } = renderChildren();
262
+ destroyChildren = destroy;
263
+ el.appendChild(childFragment);
264
+ }
265
+ let iconStartHandle;
266
+ const remountIconStart = (name) => {
267
+ if (iconStartHandle) {
268
+ iconStartHandle.destroy();
269
+ iconStartHandle.el.parentNode?.removeChild(iconStartHandle.el);
270
+ iconStartHandle = undefined;
271
+ }
272
+ if (typeof name === 'string' && name.length > 0) {
273
+ const handle = Icon({ name, size: iconSize, decorative: true });
274
+ iconStartHandle = handle;
275
+ el.insertBefore(handle.el, liveSpan.nextSibling);
276
+ }
277
+ };
278
+ let iconEndHandle;
279
+ const remountIconEnd = (name) => {
280
+ if (iconEndHandle) {
281
+ iconEndHandle.destroy();
282
+ iconEndHandle.el.parentNode?.removeChild(iconEndHandle.el);
283
+ iconEndHandle = undefined;
284
+ }
285
+ if (typeof name === 'string' && name.length > 0) {
286
+ const handle = Icon({ name, size: iconSize, decorative: true });
287
+ iconEndHandle = handle;
288
+ el.appendChild(handle.el);
289
+ }
290
+ };
291
+ const cleanupTextEffect = isTextFn
292
+ ? effect(() => {
293
+ const v = readText();
294
+ if (textNode)
295
+ textNode.nodeValue = typeof v === 'string' ? v : '';
296
+ })
297
+ : undefined;
298
+ const cleanupIconStartEffect = isIconStartFn
299
+ ? effect(() => remountIconStart(readIconStart()))
300
+ : (remountIconStart(readIconStart()), undefined);
301
+ const cleanupIconEndEffect = isIconEndFn
302
+ ? effect(() => remountIconEnd(readIconEnd()))
303
+ : (remountIconEnd(readIconEnd()), undefined);
304
+ // Skip when text/ariaLabel is a signal: initially-empty reactive labels would false-positive.
305
+ if (import.meta.env?.DEV &&
306
+ !isTextFn &&
307
+ !isAriaLabelFn &&
308
+ !el.hasAttribute('aria-label') &&
309
+ (el.textContent ?? '').trim().length === 0) {
310
+ console.warn(`[<Button>] Button has no accessible name. Provide \`text\`/slot content or set \`ariaLabel\` for icon-only buttons.`);
311
+ }
312
+ return {
313
+ el,
314
+ destroy: () => {
315
+ cleanupEffect?.();
316
+ cleanupAriaLabelEffect?.();
317
+ cleanupTextEffect?.();
318
+ cleanupIconStartEffect?.();
319
+ cleanupIconEndEffect?.();
320
+ el.removeEventListener('click', clickHandler);
321
+ if (keydownHandler)
322
+ el.removeEventListener('keydown', keydownHandler);
323
+ if (keyupHandler)
324
+ el.removeEventListener('keyup', keyupHandler);
325
+ iconStartHandle?.destroy();
326
+ iconEndHandle?.destroy();
327
+ destroyChildren?.();
328
+ el.replaceChildren();
329
+ },
330
+ };
331
+ }
332
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../../src/atoms/actions/button/Button.ts"],"names":[],"mappings":"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"}