@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,342 @@
1
+ /// Button component styles
2
+ /// Uses design system tokens and a11y mixins for colors and states.
3
+ /// Color scheme is driven by --_btn-* custom properties, set via data-color.
4
+ ///
5
+ /// @group atoms/actions
6
+
7
+ @use 'sass:map';
8
+ @use '@pithyjs/design-system/a11y/styles/mixins' as a11y;
9
+ @use '@pithyjs/design-system/radius/styles/tokens' as radius;
10
+ @use '../../../shared/tokens' as shared;
11
+ @use '@pithyjs/design-system/layout/styles/glass' as glass;
12
+
13
+ // ============================================
14
+ // Color scheme custom properties
15
+ // ============================================
16
+
17
+ .ui-button {
18
+ // Default to primary
19
+ --_btn-color: var(--color-primary);
20
+ --_btn-on-color: var(--color-on-primary);
21
+ --_btn-color-hover: var(--color-primary-hover);
22
+ --_btn-color-pressed: var(--color-primary-active);
23
+ // Focus ring matches button color, no offset gap (flush with border)
24
+ --color-focus-ring: var(--_btn-color);
25
+ --ring-color: var(--_btn-color);
26
+ --focus-ring-offset: 0px;
27
+ }
28
+
29
+ @each $scheme in shared.$semantic-colors {
30
+ .ui-button[data-color='#{$scheme}'] {
31
+ --_btn-color: var(--color-#{$scheme});
32
+ --_btn-on-color: var(--color-on-#{$scheme});
33
+ --_btn-color-hover: var(--color-#{$scheme}-hover);
34
+ --_btn-color-pressed: var(--color-#{$scheme}-active);
35
+ }
36
+ }
37
+
38
+ // ============================================
39
+ // Base
40
+ // ============================================
41
+
42
+ .ui-button {
43
+ // Reset
44
+ appearance: none;
45
+ border: none;
46
+ background: none;
47
+ outline: none;
48
+ margin: 0;
49
+ font: inherit;
50
+ color: inherit;
51
+ text-decoration: none;
52
+ cursor: pointer;
53
+
54
+ // Layout
55
+ display: inline-flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ position: relative;
59
+
60
+ // Typography
61
+ font-weight: var(--font-weight-medium);
62
+ line-height: 1;
63
+ white-space: nowrap;
64
+
65
+ // Transitions (motion-safe, using design-system motion tokens)
66
+ @include a11y.motion-safe {
67
+ transition:
68
+ var(--motion-transition-background),
69
+ var(--motion-transition-color),
70
+ var(--motion-transition-border),
71
+ var(--motion-transition-shadow),
72
+ var(--motion-transition-opacity),
73
+ translate var(--motion-duration-fast) var(--motion-easing-standard);
74
+ }
75
+ }
76
+
77
+ // ============================================
78
+ // Full width
79
+ // ============================================
80
+
81
+ .ui-button[data-full-width] {
82
+ inline-size: 100%;
83
+ }
84
+
85
+ // ============================================
86
+ // Sizes
87
+ // Font sizes are one step below the control size on the type scale
88
+ // because u-control-* utilities handle physical dimensions (padding,
89
+ // min-height), so the text stays compact within the control.
90
+ // ============================================
91
+
92
+ @each $size in shared.$control-sizes {
93
+ .ui-button[data-size='#{$size}'] {
94
+ font-size: map.get(shared.$control-font-sizes, $size);
95
+ }
96
+ }
97
+
98
+ // ============================================
99
+ // Shape (border-radius)
100
+ // Driven by data-shape (mirrors RadiusSize: none | xs..xl).
101
+ // ============================================
102
+
103
+ @each $shape, $value in radius.$radius-sizes {
104
+ .ui-button[data-shape='#{$shape}'] {
105
+ border-radius: $value;
106
+ }
107
+ }
108
+
109
+ // ============================================
110
+ // Variants (all use --_btn-* tokens)
111
+ // ============================================
112
+
113
+ // --- Solid ---
114
+ .ui-button[data-variant='solid'] {
115
+ background-color: var(--_btn-color);
116
+ color: var(--_btn-on-color);
117
+ // Layered: outer depth + inner highlight (on-color = contrast color for glass effect)
118
+ @include glass.glass-highlight(var(--_btn-on-color), 12%, var(--shadow-xs));
119
+
120
+ // Persistent on-state for toggles (aria-pressed) and disclosure triggers
121
+ // (aria-expanded). Distinct from :active which is transient (held down).
122
+ &[aria-pressed='true']:not(:disabled):not([aria-disabled='true']),
123
+ &[aria-expanded='true']:not(:disabled):not([aria-disabled='true']) {
124
+ background-color: var(--_btn-color-pressed);
125
+ }
126
+
127
+ &:hover:not(:disabled):not([aria-disabled='true']) {
128
+ background-color: var(--_btn-color-hover);
129
+ @include glass.glass-highlight(var(--_btn-on-color), 12%, var(--shadow-sm));
130
+ }
131
+
132
+ &:active:not(:disabled):not([aria-disabled='true']) {
133
+ background-color: var(--_btn-color-pressed);
134
+ // Inverted: inset shadow from the button color for pressed feel
135
+ box-shadow: inset 0 var(--border-width-thin) 0 0
136
+ color-mix(in oklch, var(--_btn-color-pressed) 80%, transparent);
137
+ }
138
+
139
+ @include a11y.motion-safe {
140
+ &:hover:not(:disabled):not([aria-disabled='true']) {
141
+ translate: 0 calc(-1 * var(--border-width-thin));
142
+ }
143
+
144
+ &:active:not(:disabled):not([aria-disabled='true']) {
145
+ translate: 0 var(--border-width-hairline);
146
+ }
147
+ }
148
+ }
149
+
150
+ // --- Outline ---
151
+ .ui-button[data-variant='outline'] {
152
+ background-color: transparent;
153
+ color: var(--_btn-color);
154
+ box-shadow: inset 0 0 0 var(--border-width-hairline) var(--_btn-color);
155
+
156
+ &[aria-pressed='true']:not(:disabled):not([aria-disabled='true']),
157
+ &[aria-expanded='true']:not(:disabled):not([aria-disabled='true']) {
158
+ @include a11y.state-background(selected, var(--_btn-color));
159
+ }
160
+
161
+ &:hover:not(:disabled):not([aria-disabled='true']) {
162
+ @include a11y.state-background(hover, var(--_btn-color));
163
+ }
164
+
165
+ &:active:not(:disabled):not([aria-disabled='true']) {
166
+ @include a11y.state-background(pressed, var(--_btn-color));
167
+ }
168
+
169
+ @include a11y.motion-safe {
170
+ &:hover:not(:disabled):not([aria-disabled='true']) {
171
+ translate: 0 calc(-1 * var(--border-width-thin));
172
+ }
173
+
174
+ &:active:not(:disabled):not([aria-disabled='true']) {
175
+ translate: 0 var(--border-width-hairline);
176
+ }
177
+ }
178
+ }
179
+
180
+ // --- Ghost ---
181
+ .ui-button[data-variant='ghost'] {
182
+ background-color: transparent;
183
+ color: var(--_btn-color);
184
+
185
+ &[aria-pressed='true']:not(:disabled):not([aria-disabled='true']),
186
+ &[aria-expanded='true']:not(:disabled):not([aria-disabled='true']) {
187
+ @include a11y.state-background(selected, var(--_btn-color));
188
+ }
189
+
190
+ &:hover:not(:disabled):not([aria-disabled='true']) {
191
+ // Double the normal state-background opacity for ghost since there is
192
+ // no border or background to anchor the hover feedback visually.
193
+ background-color: color-mix(
194
+ in oklch,
195
+ var(--_btn-color) calc(var(--state-hover-opacity) * 200%),
196
+ transparent
197
+ );
198
+ }
199
+
200
+ &:active:not(:disabled):not([aria-disabled='true']) {
201
+ @include a11y.state-background(pressed, var(--_btn-color));
202
+ }
203
+
204
+ @include a11y.motion-safe {
205
+ &:hover:not(:disabled):not([aria-disabled='true']) {
206
+ translate: 0 calc(-1 * var(--border-width-thin));
207
+ }
208
+
209
+ &:active:not(:disabled):not([aria-disabled='true']) {
210
+ translate: 0 var(--border-width-hairline);
211
+ }
212
+ }
213
+ }
214
+
215
+ // --- Link ---
216
+ .ui-button[data-variant='link'] {
217
+ background-color: transparent;
218
+ color: var(--_btn-color);
219
+ text-decoration: underline;
220
+ // Reset control-size padding/min-size — link buttons are inline text
221
+ padding: 0;
222
+ min-block-size: auto;
223
+ min-inline-size: auto;
224
+ position: relative;
225
+
226
+ &:hover:not(:disabled):not([aria-disabled='true']) {
227
+ color: var(--_btn-color-hover);
228
+ text-decoration: none;
229
+ }
230
+
231
+ &:active:not(:disabled):not([aria-disabled='true']) {
232
+ color: var(--_btn-color-pressed);
233
+ text-decoration: none;
234
+ }
235
+
236
+ // Invisible expanded hit area — provides a 44×44 target and exceeds
237
+ // WCAG 2.5.8 Target Size (Minimum) without changing the visual footprint
238
+ // of the inline text.
239
+ &::before {
240
+ content: '';
241
+ position: absolute;
242
+ inset-block-start: 50%;
243
+ inset-inline-start: 50%;
244
+ translate: -50% -50%;
245
+ min-inline-size: var(--control-min-touch);
246
+ min-block-size: var(--control-min-touch);
247
+ inline-size: 100%;
248
+ block-size: 100%;
249
+ }
250
+ }
251
+
252
+ // ============================================
253
+ // Disabled state
254
+ // ============================================
255
+
256
+ .ui-button:disabled,
257
+ .ui-button[aria-disabled='true'] {
258
+ opacity: var(--state-disabled-opacity, 0.38);
259
+ cursor: not-allowed;
260
+ // No pointer-events: none — aria-disabled keeps button focusable and
261
+ // interactive for assistive tech. JS click guard handles prevention.
262
+ }
263
+
264
+ // ============================================
265
+ // Loading state
266
+ // ============================================
267
+
268
+ .ui-button.ui-button-loading {
269
+ color: transparent;
270
+
271
+ // Hide content visually but preserve accessible name
272
+ // (opacity: 0 keeps elements in the a11y tree, unlike visibility: hidden
273
+ // which removes children — leaving the button without an accessible name)
274
+ > * {
275
+ opacity: 0;
276
+ }
277
+
278
+ // Spinner via ::after pseudo-element
279
+ &::after {
280
+ content: '';
281
+ position: absolute;
282
+ inline-size: 1em;
283
+ block-size: 1em;
284
+ border: var(--border-width-thin) solid
285
+ var(--_ui-button-spinner-color, var(--_btn-on-color));
286
+ border-inline-end-color: transparent;
287
+ border-radius: 50%;
288
+
289
+ @include a11y.motion-safe {
290
+ animation: var(--motion-animation-spin) var(--motion-duration-deliberate)
291
+ linear infinite;
292
+ }
293
+
294
+ // Static indicator for reduced motion (full ring at lower opacity)
295
+ @include a11y.motion-reduced {
296
+ border-inline-end-color: var(
297
+ --_ui-button-spinner-color,
298
+ var(--_btn-on-color)
299
+ );
300
+ opacity: 0.5;
301
+ }
302
+ }
303
+ }
304
+
305
+ // Spinner color overrides per variant
306
+ .ui-button[data-variant='outline'].ui-button-loading,
307
+ .ui-button[data-variant='ghost'].ui-button-loading,
308
+ .ui-button[data-variant='link'].ui-button-loading {
309
+ --_ui-button-spinner-color: var(--_btn-color);
310
+ }
311
+
312
+ // ============================================
313
+ // High Contrast
314
+ // ============================================
315
+
316
+ @include a11y.forced-colors {
317
+ .ui-button {
318
+ border: var(--border-width-hairline) solid ButtonText;
319
+ }
320
+
321
+ .ui-button[data-variant='ghost'],
322
+ .ui-button[data-variant='link'] {
323
+ border-color: transparent;
324
+ }
325
+
326
+ .ui-button[aria-pressed='true'],
327
+ .ui-button[aria-expanded='true'] {
328
+ border-color: Highlight;
329
+ }
330
+
331
+ .ui-button:disabled,
332
+ .ui-button[aria-disabled='true'] {
333
+ border-color: GrayText;
334
+ color: GrayText;
335
+ }
336
+
337
+ // Focus ring fallback: box-shadow (used by u-focus-ring) is stripped
338
+ // in forced-colors mode. Use outline instead so focus stays visible.
339
+ .ui-button:focus-visible {
340
+ @include a11y.focus-outline(Highlight);
341
+ }
342
+ }
@@ -0,0 +1,47 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.icon-button",
4
+ "title": "<IconButton> Action Component",
5
+ "category": "feature",
6
+ "risk": "low"
7
+ }
8
+ */
9
+ import type { ControlSize } from '@pithyjs/design-system';
10
+ import type { IconSizeLevel } from '@pithyjs/design-system/iconography';
11
+ import { type Reactive } from '../../../shared/clickable';
12
+ /** @codexApi {"parent":"pithy.ui-kit.icon-button","name":"IconButtonProps","stability":"stable","signature":"interface IconButtonProps"} */
13
+ export interface IconButtonProps {
14
+ /** Icon name (from the icon sprite). */
15
+ icon: string;
16
+ /** Accessible name — required (icon-only button). */
17
+ ariaLabel: string;
18
+ /** Control size — maps to `--control-min-height-{size}` (default `"md"`). */
19
+ size?: ControlSize;
20
+ /** Icon size (default `"sm"`). */
21
+ iconSize?: IconSizeLevel;
22
+ /**
23
+ * Active/pressed visual state (e.g. an open popover or a toggled control).
24
+ * Static or a `() => boolean` accessor for reactive state. Drives both the
25
+ * `[data-active]` styling hook and `aria-pressed`.
26
+ */
27
+ pressed?: Reactive<boolean>;
28
+ /** Fires on click or keyboard activation. */
29
+ onClick: () => void;
30
+ }
31
+ /**
32
+ * A single icon-only button sharing the circular visual of an `<IconGroup>`
33
+ * option (same `_icon-control` mixin), so standalone icon controls match the
34
+ * segmented ones pixel-for-pixel.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * html`<IconButton icon="'palette'" ariaLabel="'Design system'"
39
+ * pressed="open" onClick="toggle" size="'sm'" />`
40
+ * ```
41
+ */
42
+ /** @codexApi {"parent":"pithy.ui-kit.icon-button","name":"IconButton","stability":"stable","signature":"(props: IconButtonProps) => { el: HTMLButtonElement; destroy: () => void }"} */
43
+ export declare function IconButton({ icon, ariaLabel, size, iconSize, pressed, onClick, }: IconButtonProps): {
44
+ el: HTMLButtonElement;
45
+ destroy(): void;
46
+ };
47
+ //# sourceMappingURL=IconButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.d.ts","sourceRoot":"","sources":["../../../../src/atoms/actions/icon-button/IconButton.ts"],"names":[],"mappings":"AAAA;;;;;;;EAOE;AAGF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAGxE,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AAInC,4IAA4I;AAC5I,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wLAAwL;AACxL,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,SAAS,EACT,IAAW,EACX,QAAe,EACf,OAAO,EACP,OAAO,GACR,EAAE,eAAe;;;EA4DjB"}
@@ -0,0 +1,81 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.icon-button",
4
+ "title": "<IconButton> Action Component",
5
+ "category": "feature",
6
+ "risk": "low"
7
+ }
8
+ */
9
+ import { effect } from '@pithyjs/signals';
10
+ import { resolveIconSvg } from '../../content/icon/resolveIconSvg';
11
+ import { ICON_SIZE_CLASS } from '../../../shared/icon';
12
+ import { hasReactive, readReactive, } from '../../../shared/clickable';
13
+ /**
14
+ * A single icon-only button sharing the circular visual of an `<IconGroup>`
15
+ * option (same `_icon-control` mixin), so standalone icon controls match the
16
+ * segmented ones pixel-for-pixel.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * html`<IconButton icon="'palette'" ariaLabel="'Design system'"
21
+ * pressed="open" onClick="toggle" size="'sm'" />`
22
+ * ```
23
+ */
24
+ /** @codexApi {"parent":"pithy.ui-kit.icon-button","name":"IconButton","stability":"stable","signature":"(props: IconButtonProps) => { el: HTMLButtonElement; destroy: () => void }"} */
25
+ export function IconButton({ icon, ariaLabel, size = 'md', iconSize = 'sm', pressed, onClick, }) {
26
+ if (import.meta.env?.DEV && !ariaLabel?.trim()) {
27
+ console.warn('[<IconButton>] `ariaLabel` is required and must be a non-empty string (icon-only button).');
28
+ }
29
+ const btn = document.createElement('button');
30
+ btn.type = 'button';
31
+ btn.classList.add('ui-icon-button');
32
+ btn.dataset.size = size;
33
+ btn.setAttribute('aria-label', ariaLabel);
34
+ const iconWrap = document.createElement('span');
35
+ // Fall back to the default size class if an invalid `iconSize` slips through
36
+ // (avoids adding a literal "undefined" class).
37
+ const iconSizeClass = ICON_SIZE_CLASS[iconSize] ?? ICON_SIZE_CLASS.sm;
38
+ iconWrap.classList.add('ui-icon', iconSizeClass);
39
+ iconWrap.setAttribute('aria-hidden', 'true');
40
+ iconWrap.setAttribute('role', 'none');
41
+ iconWrap.dataset.icon = icon;
42
+ const resolved = resolveIconSvg(icon);
43
+ if (resolved) {
44
+ iconWrap.appendChild(resolved.svg);
45
+ if (resolved.missing)
46
+ iconWrap.dataset.iconMissing = icon;
47
+ }
48
+ btn.appendChild(iconWrap);
49
+ const disposers = [];
50
+ // Only a TOGGLE button (caller passed `pressed`) gets `aria-pressed` +
51
+ // `[data-active]`. A plain action button (e.g. the reset affordance) leaves
52
+ // them off so AT doesn't announce it as a toggle ("not pressed").
53
+ if (pressed !== undefined) {
54
+ const applyPressed = () => {
55
+ const isPressed = readReactive(pressed) === true;
56
+ btn.dataset.active = String(isPressed);
57
+ btn.setAttribute('aria-pressed', String(isPressed));
58
+ };
59
+ if (hasReactive(pressed)) {
60
+ disposers.push(effect(applyPressed));
61
+ }
62
+ else {
63
+ applyPressed();
64
+ }
65
+ }
66
+ const handler = () => onClick();
67
+ btn.addEventListener('click', handler);
68
+ disposers.push(() => btn.removeEventListener('click', handler));
69
+ return {
70
+ el: btn,
71
+ destroy() {
72
+ for (const dispose of disposers)
73
+ dispose();
74
+ disposers.length = 0;
75
+ // Clear the icon subtree on destroy (matches Icon/Button) so no stale DOM
76
+ // lingers when the button is destroyed but `el` is still referenced.
77
+ btn.replaceChildren();
78
+ },
79
+ };
80
+ }
81
+ //# sourceMappingURL=IconButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../../../src/atoms/actions/icon-button/IconButton.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /// IconButton component styles — a standalone circular icon button that shares
2
+ /// the icon-control visual with <IconGroup> options.
3
+ ///
4
+ /// @group atoms/actions
5
+
6
+ @use '../../../shared/tokens' as shared;
7
+ @use '../icon-control' as icon-control;
8
+
9
+ .ui-icon-button {
10
+ @include icon-control.icon-control-button;
11
+ }
12
+
13
+ // Size-based dimensions — maps data-size to --control-min-height-{size}
14
+ // (identical to .ui-icon-group-option sizing).
15
+ @each $size in shared.$control-sizes {
16
+ .ui-icon-button[data-size='#{$size}'] {
17
+ inline-size: var(--control-min-height-#{$size});
18
+ block-size: var(--control-min-height-#{$size});
19
+ }
20
+ }
@@ -0,0 +1,60 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.icon-group",
4
+ "title": "<IconGroup> Action Component",
5
+ "category": "feature",
6
+ "risk": "medium"
7
+ }
8
+ */
9
+ import type { ControlSize } from '@pithyjs/design-system';
10
+ import { type IconSizeLevel } from '@pithyjs/design-system/iconography';
11
+ import { type Reactive } from '../../../shared/clickable';
12
+ /** @codexApi {"parent":"pithy.ui-kit.icon-group","name":"IconGroupItem","stability":"stable","signature":"interface IconGroupItem<T extends string>"} */
13
+ export interface IconGroupItem<T extends string = string> {
14
+ value: T;
15
+ icon: string;
16
+ /** Accessible label per option — required for icon-only buttons. */
17
+ ariaLabel: string;
18
+ }
19
+ /** @codexApi {"parent":"pithy.ui-kit.icon-group","name":"IconGroupProps","stability":"stable","signature":"interface IconGroupProps<T extends string>"} */
20
+ export interface IconGroupProps<T extends string = string> {
21
+ /** Options to choose from in display order. */
22
+ items: ReadonlyArray<IconGroupItem<T>>;
23
+ /** Currently selected value. Static or `() => T` accessor for reactive state. */
24
+ value: Reactive<T>;
25
+ /** Fires with the new value on click or keyboard activation. */
26
+ onChange: (value: T) => void;
27
+ /** Required accessible label — announced by screen readers as the radiogroup name. */
28
+ ariaLabel: string;
29
+ /** Control size — maps option dimensions to `--control-min-height-{size}` (default: `"md"`). */
30
+ size?: ControlSize;
31
+ /** Icon size — defaults to `"sm"`. */
32
+ iconSize?: IconSizeLevel;
33
+ /**
34
+ * Disables the whole group — options become non-interactive and `onChange`
35
+ * never fires. Static or a `() => boolean` accessor. Pair with a `<Tooltip>`
36
+ * to explain why it's disabled.
37
+ */
38
+ disabled?: Reactive<boolean>;
39
+ }
40
+ /**
41
+ * Single-select icon-only segmented control. Renders a `role="radiogroup"`
42
+ * pill with one `role="radio"` button per item. The selected option gets a
43
+ * circular indicator behind its icon.
44
+ *
45
+ * @example
46
+ * ```html
47
+ * <IconGroup
48
+ * items="viewportItems"
49
+ * value="viewport"
50
+ * onChange="setViewport"
51
+ * ariaLabel="'Viewport size'"
52
+ * />
53
+ * ```
54
+ */
55
+ /** @codexApi {"parent":"pithy.ui-kit.icon-group","name":"IconGroup","stability":"stable","signature":"<T extends string>(props: IconGroupProps<T>) => { el: HTMLDivElement; destroy: () => void }"} */
56
+ export declare function IconGroup<T extends string = string>(props: IconGroupProps<T>): {
57
+ el: HTMLDivElement;
58
+ destroy: () => void;
59
+ };
60
+ //# sourceMappingURL=IconGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconGroup.d.ts","sourceRoot":"","sources":["../../../../src/atoms/actions/icon-group/IconGroup.ts"],"names":[],"mappings":"AAAA;;;;;;;EAOE;AAGF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AASnC,yJAAyJ;AACzJ,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACtD,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2JAA2J;AAC3J,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACvD,+CAA+C;IAC/C,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,iFAAiF;IACjF,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnB,gEAAgE;IAChE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,gGAAgG;IAChG,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,uMAAuM;AACvM,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EACjD,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GACvB;IAAE,EAAE,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CA4L7C"}