@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,58 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.text",
4
+ "title": "<Text> Content Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import type { ReactiveText } from '../../../shared/clickable';
9
+ import { type FontSize, type FontWeight } from '@pithyjs/design-system/typography';
10
+ import { type TextColor, type TextAlign, type TextTag } from '../../../shared/text';
11
+ /** @codexApi {"parent":"pithy.ui-kit.text","name":"TextProps","stability":"stable","signature":"interface TextProps"} */
12
+ export interface TextProps {
13
+ /** Font size — maps to u-text-* typography utilities (default: "base") */
14
+ size?: FontSize;
15
+ /** Font weight — sets data-weight attribute, styled via SCSS weight-scheme mixin (default: "normal") */
16
+ weight?: FontWeight;
17
+ /** Text color — maps to --color-* design tokens (default: "text") */
18
+ color?: TextColor;
19
+ /** Text alignment — uses logical values for RTL support (default: none) */
20
+ align?: TextAlign;
21
+ /** Truncation: true = single-line ellipsis, number = line-clamp (default: false) */
22
+ truncate?: boolean | number;
23
+ /** HTML element tag (default: "p") */
24
+ as?: TextTag;
25
+ /** Expansion text for <abbr> — sets the title attribute (only used when as="abbr") */
26
+ title?: string;
27
+ /** Machine-readable date/time for <time> — sets the datetime attribute (only used when as="time") */
28
+ datetime?: string;
29
+ /** Inline style string — forwarded to the rendered element */
30
+ style?: string;
31
+ /** Additional CSS class(es) — appended to the rendered element */
32
+ class?: string;
33
+ /** Visible body text — static string or signal/computed accessor. When set,
34
+ * the text is used as the content and slot children are ignored. Newlines
35
+ * (`\n`) are rendered as `<br>` elements so multi-line input preserves its
36
+ * line breaks regardless of `white-space` styling. Omit to fall back to
37
+ * slot content. */
38
+ text?: ReactiveText;
39
+ }
40
+ /**
41
+ * Typography wrapper for body text content.
42
+ *
43
+ * Maps props to design-system typography tokens and utility classes.
44
+ * Uses logical properties for RTL/LTR support.
45
+ *
46
+ * @example
47
+ * ```html
48
+ * <Text size="'lg'" weight="'bold'" color="'primary'">Hello</Text>
49
+ * <Text truncate="true" as="'span'">Long text that truncates...</Text>
50
+ * <Text truncate="3">Multi-line clamped text...</Text>
51
+ * ```
52
+ */
53
+ /** @codexApi {"parent":"pithy.ui-kit.text","name":"Text","stability":"stable","signature":"(props?: TextProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
54
+ export declare function Text({ size: rawSize, weight: rawWeight, color: rawColor, align: rawAlign, truncate, as: rawTag, title, datetime, style, class: extraClassName, text, }?: TextProps): {
55
+ el: HTMLElement | DocumentFragment;
56
+ destroy: () => void;
57
+ };
58
+ //# sourceMappingURL=Text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../../../src/atoms/content/text/Text.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAIF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,UAAU,EAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAQ9B,yHAAyH;AACzH,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,wGAAwG;IACxG,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,sCAAsC;IACtC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;wBAIoB;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,mLAAmL;AACnL,wBAAgB,IAAI,CAAC,EACnB,IAAI,EAAE,OAAgB,EACtB,MAAM,EAAE,SAAoB,EAC5B,KAAK,EAAE,QAAiB,EACxB,KAAK,EAAE,QAAoB,EAC3B,QAAgB,EAChB,EAAE,EAAE,MAAY,EAChB,KAAiB,EACjB,QAAoB,EACpB,KAAiB,EACjB,KAAK,EAAE,cAA0B,EACjC,IAAgB,GACjB,GAAE,SAAc,GAAG;IAClB,EAAE,EAAE,WAAW,GAAG,gBAAgB,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA2JA"}
@@ -0,0 +1,158 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.text",
4
+ "title": "<Text> Content Component",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { renderChildren } from '@pithyjs/core';
9
+ import { effect } from '@pithyjs/signals';
10
+ import { FONT_SIZES, FONT_WEIGHTS, } from '@pithyjs/design-system/typography';
11
+ import { TEXT_COLORS, TEXT_ALIGNS, TEXT_TAGS, SIZE_CLASS, } from '../../../shared/text';
12
+ // Tags whose native browser styles convey semantic meaning.
13
+ // Defined at module scope to avoid re-allocating on every Text() call.
14
+ const BOLD_TAGS = ['strong'];
15
+ const ITALIC_TAGS = ['em', 'cite'];
16
+ const SMALL_TAGS = ['small'];
17
+ /**
18
+ * Typography wrapper for body text content.
19
+ *
20
+ * Maps props to design-system typography tokens and utility classes.
21
+ * Uses logical properties for RTL/LTR support.
22
+ *
23
+ * @example
24
+ * ```html
25
+ * <Text size="'lg'" weight="'bold'" color="'primary'">Hello</Text>
26
+ * <Text truncate="true" as="'span'">Long text that truncates...</Text>
27
+ * <Text truncate="3">Multi-line clamped text...</Text>
28
+ * ```
29
+ */
30
+ /** @codexApi {"parent":"pithy.ui-kit.text","name":"Text","stability":"stable","signature":"(props?: TextProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
31
+ export function Text({ size: rawSize = 'base', weight: rawWeight = 'normal', color: rawColor = 'text', align: rawAlign = undefined, truncate = false, as: rawTag = 'p', title = undefined, datetime = undefined, style = undefined, class: extraClassName = undefined, text = undefined, } = {}) {
32
+ const validSize = FONT_SIZES.includes(rawSize);
33
+ const validWeight = FONT_WEIGHTS.includes(rawWeight);
34
+ const validColor = TEXT_COLORS.includes(rawColor);
35
+ const validAlign = rawAlign === undefined ||
36
+ TEXT_ALIGNS.includes(rawAlign);
37
+ const validTag = TEXT_TAGS.includes(rawTag);
38
+ if (import.meta.env?.DEV) {
39
+ if (!validSize) {
40
+ const valid = FONT_SIZES.join(', ');
41
+ console.warn(`[<Text>] Invalid size: "${rawSize}". Expected one of: ${valid}. Falling back to "base".`);
42
+ }
43
+ if (!validWeight) {
44
+ const valid = FONT_WEIGHTS.join(', ');
45
+ console.warn(`[<Text>] Invalid weight: "${rawWeight}". Expected one of: ${valid}. Falling back to "normal".`);
46
+ }
47
+ if (!validColor) {
48
+ const valid = TEXT_COLORS.join(', ');
49
+ console.warn(`[<Text>] Invalid color: "${rawColor}". Expected one of: ${valid}. Falling back to "text".`);
50
+ }
51
+ if (!validAlign) {
52
+ const valid = TEXT_ALIGNS.join(', ');
53
+ console.warn(`[<Text>] Invalid align: "${rawAlign}". Expected one of: ${valid}. Ignoring.`);
54
+ }
55
+ if (!validTag) {
56
+ const valid = TEXT_TAGS.join(', ');
57
+ console.warn(`[<Text>] Invalid as: "${rawTag}". Expected one of: ${valid}. Falling back to "p".`);
58
+ }
59
+ if (rawTag === 'abbr' && !title) {
60
+ console.warn(`[<Text>] <abbr> without a title attribute is inaccessible. Pass title="..." to provide the abbreviation expansion.`);
61
+ }
62
+ if (rawTag === 'time' && !datetime) {
63
+ console.warn(`[<Text>] <time> without a datetime attribute has no machine-readable value. Pass datetime="..." (e.g. "2026-03-06").`);
64
+ }
65
+ }
66
+ const size = validSize ? rawSize : 'base';
67
+ const weight = validWeight ? rawWeight : 'normal';
68
+ const color = validColor ? rawColor : 'text';
69
+ const align = validAlign ? rawAlign : undefined;
70
+ const tag = validTag ? rawTag : 'p';
71
+ // Tags whose native browser styles convey semantic meaning.
72
+ // When using defaults, skip the utility class so the tag's native style is preserved.
73
+ // e.g. <strong> stays bold, <em> stays italic, <small> stays smaller.
74
+ // Create element
75
+ const el = document.createElement(tag);
76
+ // Classes — skip default utility when tag already conveys that style natively
77
+ el.classList.add('ui-text');
78
+ const skipSize = size === 'base' && SMALL_TAGS.includes(tag);
79
+ if (!skipSize) {
80
+ el.classList.add(SIZE_CLASS[size]);
81
+ }
82
+ const skipWeight = weight === 'normal' &&
83
+ (BOLD_TAGS.includes(tag) || ITALIC_TAGS.includes(tag));
84
+ if (!skipWeight) {
85
+ el.setAttribute('data-weight', weight);
86
+ }
87
+ // Color via data attribute (styled in text.scss)
88
+ el.setAttribute('data-color', color);
89
+ // Alignment via data attribute (styled in text.scss with logical properties)
90
+ if (align) {
91
+ el.setAttribute('data-align', align);
92
+ }
93
+ // Truncation
94
+ if (truncate === true) {
95
+ el.classList.add('u-truncate');
96
+ }
97
+ else if (typeof truncate === 'number' && truncate > 0) {
98
+ const clampValue = Math.min(Math.max(Math.round(truncate), 1), 4);
99
+ el.classList.add(`u-line-clamp-${clampValue}`);
100
+ }
101
+ // Semantic attributes — only applied on matching tags
102
+ if (title && tag === 'abbr') {
103
+ el.setAttribute('title', title);
104
+ }
105
+ if (datetime && tag === 'time') {
106
+ el.dateTime = datetime;
107
+ }
108
+ // Pass-through HTML attributes
109
+ if (style) {
110
+ el.setAttribute('style', style);
111
+ }
112
+ if (extraClassName) {
113
+ el.classList.add(...extraClassName.split(/\s+/).filter(Boolean));
114
+ }
115
+ // `text` prop wins over slot content — they're alternate ways to set the
116
+ // body text, not concatenated. Skip renderChildren() when text is set.
117
+ const isTextFn = typeof text === 'function';
118
+ const readText = () => isTextFn
119
+ ? text()
120
+ : text;
121
+ const renderText = (value) => {
122
+ el.replaceChildren();
123
+ const parts = value.split(/\r?\n/);
124
+ parts.forEach((part, i) => {
125
+ if (i > 0)
126
+ el.appendChild(document.createElement('br'));
127
+ if (part.length > 0)
128
+ el.appendChild(document.createTextNode(part));
129
+ });
130
+ };
131
+ let destroyChildren;
132
+ const staticText = isTextFn ? undefined : readText();
133
+ if (!isTextFn) {
134
+ if (typeof staticText === 'string') {
135
+ renderText(staticText);
136
+ }
137
+ else {
138
+ const { el: childFragment, destroy } = renderChildren();
139
+ destroyChildren = destroy;
140
+ el.appendChild(childFragment);
141
+ }
142
+ }
143
+ const cleanupTextEffect = isTextFn
144
+ ? effect(() => {
145
+ const v = readText();
146
+ renderText(typeof v === 'string' ? v : '');
147
+ })
148
+ : undefined;
149
+ return {
150
+ el,
151
+ destroy: () => {
152
+ cleanupTextEffect?.();
153
+ destroyChildren?.();
154
+ el.replaceChildren();
155
+ },
156
+ };
157
+ }
158
+ //# sourceMappingURL=Text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Text.js","sourceRoot":"","sources":["../../../../src/atoms/content/text/Text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /// Text component styles
2
+ /// Uses design system tokens. Color is driven by data-color attribute,
3
+ /// alignment by data-align with logical properties. Inline <code>/<kbd>
4
+ /// drive from the em-based --inline-code-* tokens (typography/tokens.json)
5
+ /// so code scales with parent text in headings, body, and prose contexts.
6
+ ///
7
+ /// @group atoms/content
8
+
9
+ @use '@pithyjs/design-system/a11y/styles/mixins' as a11y;
10
+ @use '../mixins' as content;
11
+
12
+ // ============================================
13
+ // Base styles
14
+ // ============================================
15
+
16
+ .ui-text {
17
+ // Default: inherit from parent (natural cascade)
18
+ color: var(--color-text);
19
+ // Reset margins — external spacing controlled by parent layout
20
+ margin: 0;
21
+ // Prevent long words/URLs from overflowing on small screens.
22
+ // Using break-word (not anywhere) to avoid shrinking min-content in flex/grid.
23
+ overflow-wrap: break-word;
24
+ }
25
+
26
+ // Preformatted text preserves whitespace — don't wrap by default
27
+ pre.ui-text {
28
+ overflow-wrap: normal;
29
+ }
30
+
31
+ // ============================================
32
+ // Color scheme + Alignment (shared)
33
+ // ============================================
34
+
35
+ @include content.color-scheme('.ui-text');
36
+ @include content.weight-scheme('.ui-text');
37
+ @include content.alignment('.ui-text');
38
+
39
+ // ============================================
40
+ // Semantic element styles
41
+ // Visual styling for tags whose meaning requires visual distinction.
42
+ // ============================================
43
+
44
+ code.ui-text,
45
+ kbd.ui-text {
46
+ font-family: var(--font-family-mono);
47
+ font-size: var(--inline-code-font-size);
48
+ padding-block: var(--inline-code-padding-block);
49
+ padding-inline: var(--inline-code-padding-inline);
50
+ margin-inline: var(--inline-code-margin-inline);
51
+ background-color: var(--color-surface-variant);
52
+ border-radius: var(--radius-xs);
53
+ }
54
+
55
+ kbd.ui-text {
56
+ border: var(--border-width-thin) solid var(--color-border);
57
+ }
58
+
59
+ blockquote.ui-text {
60
+ border-inline-start: var(--border-width-medium) solid var(--color-border);
61
+ padding-inline-start: var(--space-md);
62
+ font-style: italic;
63
+ }
64
+
65
+ // ============================================
66
+ // Screen reader announcements for non-announced tags
67
+ // <mark> and <s> have visual meaning that screen readers skip by default.
68
+ // Visually-hidden pseudo-elements provide equivalent text cues.
69
+ // ============================================
70
+
71
+ mark.ui-text {
72
+ &::before {
73
+ content: '[highlight start]';
74
+ @include a11y.visually-hidden;
75
+ }
76
+ &::after {
77
+ content: '[highlight end]';
78
+ @include a11y.visually-hidden;
79
+ }
80
+ }
81
+
82
+ s.ui-text {
83
+ &::before {
84
+ content: '[strikethrough start]';
85
+ @include a11y.visually-hidden;
86
+ }
87
+ &::after {
88
+ content: '[strikethrough end]';
89
+ @include a11y.visually-hidden;
90
+ }
91
+ }
92
+
93
+ // ============================================
94
+ // Accessibility (shared)
95
+ // ============================================
96
+
97
+ @include content.forced-colors('.ui-text');
98
+ @include content.high-contrast('.ui-text');
@@ -0,0 +1,66 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.tile",
4
+ "title": "<Tile> Content Component",
5
+ "category": "feature",
6
+ "risk": "medium"
7
+ }
8
+ */
9
+ import { type Reactive } from '../../../shared/clickable';
10
+ /** @codexApi {"parent":"pithy.ui-kit.tile","name":"TileProps","stability":"stable","signature":"interface TileProps"} */
11
+ export interface TileProps {
12
+ /** Visible label rendered below the media slot. Required. */
13
+ label: string;
14
+ /**
15
+ * Selected state. Adds `aria-pressed` + primary-tinted chrome.
16
+ * Static boolean or `() => boolean` accessor.
17
+ */
18
+ selected?: Reactive<boolean>;
19
+ /**
20
+ * Disabled state. Sets `disabled` and the design-system disabled appearance.
21
+ * Static boolean or `() => boolean` accessor.
22
+ */
23
+ disabled?: Reactive<boolean>;
24
+ /** Click handler. Guarded against `disabled`. */
25
+ onClick?: (e: MouseEvent) => void;
26
+ /** Accessible label override — defaults to `label`. */
27
+ ariaLabel?: string;
28
+ /** Marks the root button as a drag source via the native `draggable` attribute. */
29
+ draggable?: boolean;
30
+ /**
31
+ * Map of `data-*` attributes to set on the root button. Keys use camelCase
32
+ * (the `dataset` convention) and emit kebab-case attrs:
33
+ * `{ componentId: "card" }` → `data-component-id="card"`.
34
+ */
35
+ data?: Record<string, string>;
36
+ /** Native `dragstart` listener — forwarded as-is. */
37
+ onDragStart?: (e: DragEvent) => void;
38
+ /** Native `dragend` listener — forwarded as-is. */
39
+ onDragEnd?: (e: DragEvent) => void;
40
+ /** Native `animationend` listener — useful for one-shot CSS flash effects. */
41
+ onAnimationEnd?: (e: AnimationEvent) => void;
42
+ /**
43
+ * Callback invoked once with the rendered label `<span>`. Use it to wire
44
+ * effects against the label DOM (search-match highlighting, animated counts)
45
+ * without querying Tile internals.
46
+ */
47
+ labelRef?: (el: HTMLSpanElement) => void;
48
+ }
49
+ /**
50
+ * Compact clickable tile with an icon/glyph slot above a visible label.
51
+ * Used for launchers, recents rails, template pickers — any small surface
52
+ * that reads as "pick this".
53
+ *
54
+ * @example
55
+ * ```html
56
+ * <Tile label="'Card'" selected="isSelected" @click="handleSelect">
57
+ * <Icon name="'card'" decorative="true" size="'sm'" />
58
+ * </Tile>
59
+ * ```
60
+ */
61
+ /** @codexApi {"parent":"pithy.ui-kit.tile","name":"Tile","stability":"stable","signature":"(props: TileProps) => { el: HTMLButtonElement; destroy: () => void }"} */
62
+ export declare function Tile(props: TileProps): {
63
+ el: HTMLButtonElement;
64
+ destroy: () => void;
65
+ };
66
+ //# sourceMappingURL=Tile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tile.d.ts","sourceRoot":"","sources":["../../../../src/atoms/content/tile/Tile.ts"],"names":[],"mappings":"AAAA;;;;;;;EAOE;AAGF,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AAInC,yHAAyH;AACzH,MAAM,WAAW,SAAS;IACxB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,qDAAqD;IACrD,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,mDAAmD;IACnD,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,8EAA8E;IAC9E,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;;;;;;;GAWG;AACH,qKAAqK;AACrK,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG;IACtC,EAAE,EAAE,iBAAiB,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAoIA"}
@@ -0,0 +1,125 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.tile",
4
+ "title": "<Tile> Content Component",
5
+ "category": "feature",
6
+ "risk": "medium"
7
+ }
8
+ */
9
+ import { renderChildren } from '@pithyjs/core';
10
+ import { bindReactive, guardClick, hasReactive, readReactive, } from '../../../shared/clickable';
11
+ /**
12
+ * Compact clickable tile with an icon/glyph slot above a visible label.
13
+ * Used for launchers, recents rails, template pickers — any small surface
14
+ * that reads as "pick this".
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <Tile label="'Card'" selected="isSelected" @click="handleSelect">
19
+ * <Icon name="'card'" decorative="true" size="'sm'" />
20
+ * </Tile>
21
+ * ```
22
+ */
23
+ /** @codexApi {"parent":"pithy.ui-kit.tile","name":"Tile","stability":"stable","signature":"(props: TileProps) => { el: HTMLButtonElement; destroy: () => void }"} */
24
+ export function Tile(props) {
25
+ const { label: rawLabel, selected, disabled = false, onClick, ariaLabel: rawAriaLabel, draggable = false, data, onDragStart, onDragEnd, onAnimationEnd, labelRef, } = props;
26
+ const isToggle = selected !== undefined;
27
+ const label = rawLabel?.trim() ?? '';
28
+ const ariaLabel = rawAriaLabel?.trim() || label || undefined;
29
+ if (import.meta.env?.DEV && !label) {
30
+ console.warn('[<Tile>] `label` is required and must be a non-empty string.');
31
+ }
32
+ const disposers = [];
33
+ const button = document.createElement('button');
34
+ button.type = 'button';
35
+ button.classList.add('ui-tile');
36
+ if (ariaLabel)
37
+ button.setAttribute('aria-label', ariaLabel);
38
+ if (draggable)
39
+ button.setAttribute('draggable', 'true');
40
+ if (data) {
41
+ const RESERVED = ['selected', 'disabled'];
42
+ for (const [key, value] of Object.entries(data)) {
43
+ if (RESERVED.includes(key)) {
44
+ if (import.meta.env?.DEV) {
45
+ console.warn(`[<Tile>] data key "${key}" is reserved — use the \`${key}\` prop instead.`);
46
+ }
47
+ continue;
48
+ }
49
+ button.dataset[key] = value;
50
+ }
51
+ }
52
+ // -- Media slot ------------------------------------------------------------
53
+ const { el: childFragment, destroy: destroyChildren } = renderChildren();
54
+ disposers.push(destroyChildren);
55
+ const hasContent = Array.from(childFragment.childNodes).some(n => n.nodeType === Node.ELEMENT_NODE ||
56
+ (n.nodeType === Node.TEXT_NODE && n.textContent?.trim() !== ''));
57
+ if (hasContent) {
58
+ const media = document.createElement('span');
59
+ media.classList.add('ui-tile-media');
60
+ media.setAttribute('aria-hidden', 'true');
61
+ media.appendChild(childFragment);
62
+ button.appendChild(media);
63
+ }
64
+ // -- Label -----------------------------------------------------------------
65
+ const labelEl = document.createElement('span');
66
+ labelEl.classList.add('ui-tile-label');
67
+ labelEl.textContent = label;
68
+ button.appendChild(labelEl);
69
+ labelRef?.(labelEl);
70
+ // -- Reactive state --------------------------------------------------------
71
+ const readSelected = () => isToggle && selected !== undefined ? readReactive(selected) : false;
72
+ const readDisabled = () => readReactive(disabled);
73
+ disposers.push(bindReactive(hasReactive(selected, disabled), () => {
74
+ const isDisabled = readDisabled();
75
+ if (isToggle) {
76
+ const isSelected = readSelected();
77
+ if (isSelected) {
78
+ button.dataset.selected = 'true';
79
+ button.setAttribute('aria-pressed', 'true');
80
+ }
81
+ else {
82
+ delete button.dataset.selected;
83
+ button.setAttribute('aria-pressed', 'false');
84
+ }
85
+ }
86
+ button.disabled = isDisabled;
87
+ if (isDisabled) {
88
+ button.dataset.disabled = 'true';
89
+ }
90
+ else {
91
+ delete button.dataset.disabled;
92
+ }
93
+ }));
94
+ // -- Listeners -------------------------------------------------------------
95
+ const addListener = (type, handler) => {
96
+ button.addEventListener(type, handler);
97
+ disposers.push(() => button.removeEventListener(type, handler));
98
+ };
99
+ if (onClick)
100
+ addListener('click', guardClick(onClick, readDisabled));
101
+ if (onDragStart)
102
+ addListener('dragstart', onDragStart);
103
+ if (onDragEnd)
104
+ addListener('dragend', onDragEnd);
105
+ if (onAnimationEnd)
106
+ addListener('animationend', onAnimationEnd);
107
+ return {
108
+ el: button,
109
+ destroy: () => {
110
+ for (const dispose of disposers) {
111
+ try {
112
+ dispose();
113
+ }
114
+ catch (err) {
115
+ if (import.meta.env?.DEV) {
116
+ console.error('[<Tile>] disposer threw:', err);
117
+ }
118
+ }
119
+ }
120
+ disposers.length = 0;
121
+ button.replaceChildren();
122
+ },
123
+ };
124
+ }
125
+ //# sourceMappingURL=Tile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tile.js","sourceRoot":"","sources":["../../../../src/atoms/content/tile/Tile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /// Tile component styles
2
+ /// Compact clickable surface — icon/glyph slot above a visible label.
3
+ /// Used for launchers, recents rails, template pickers.
4
+ ///
5
+ /// @group atoms/content
6
+
7
+ @use '@pithyjs/design-system/a11y/styles/mixins' as a11y;
8
+
9
+ // ============================================
10
+ // Tile (root <button>)
11
+ // ============================================
12
+
13
+ .ui-tile {
14
+ --_tile-color: var(--color-primary);
15
+ --_tile-on-color: var(--color-on-primary);
16
+
17
+ appearance: none;
18
+ margin: 0;
19
+ display: flex;
20
+ flex-direction: column;
21
+ align-items: center;
22
+ justify-content: center;
23
+ gap: var(--space-md);
24
+ inline-size: 100%;
25
+ min-inline-size: 0;
26
+ min-block-size: calc(var(--control-min-touch) * 2 + var(--space-md));
27
+ padding-block: var(--space-md);
28
+ padding-inline: var(--space-sm);
29
+ background-color: var(--color-surface);
30
+ color: var(--color-text);
31
+ border: var(--border-width-hairline) solid var(--color-border);
32
+ border-radius: var(--radius-md);
33
+ cursor: pointer;
34
+ font: inherit;
35
+ text-align: center;
36
+ -webkit-font-smoothing: antialiased;
37
+ -moz-osx-font-smoothing: grayscale;
38
+
39
+ @include a11y.motion-safe {
40
+ transition:
41
+ var(--motion-transition-background),
42
+ var(--motion-transition-color),
43
+ border-color var(--motion-duration-normal) var(--motion-easing-standard);
44
+ }
45
+
46
+ &:hover:not(:disabled) {
47
+ border-color: color-mix(
48
+ in oklch,
49
+ var(--_tile-color) 50%,
50
+ var(--color-border)
51
+ );
52
+ @include a11y.state-background(hover, var(--_tile-color));
53
+ }
54
+
55
+ &:focus-visible {
56
+ @include a11y.focus-ring;
57
+ }
58
+
59
+ &[data-selected='true'] {
60
+ border-color: var(--_tile-color);
61
+ @include a11y.state-background(selected, var(--_tile-color));
62
+ }
63
+
64
+ @include a11y.state-disabled;
65
+
66
+ @include a11y.forced-colors {
67
+ border: var(--border-width-thin) solid ButtonText;
68
+
69
+ &[data-selected='true'] {
70
+ border-color: Highlight;
71
+ }
72
+
73
+ &:disabled {
74
+ color: GrayText;
75
+ border-color: GrayText;
76
+ }
77
+ }
78
+ }
79
+
80
+ // ============================================
81
+ // Media slot (icon / glyph container)
82
+ // ============================================
83
+
84
+ .ui-tile-media {
85
+ display: inline-flex;
86
+ align-items: center;
87
+ justify-content: center;
88
+ flex-shrink: 0;
89
+ inline-size: var(--icon-size-xl);
90
+ block-size: var(--icon-size-xl);
91
+ color: var(--_tile-color);
92
+ background-color: color-mix(in oklch, var(--_tile-color) 12%, transparent);
93
+ border-radius: var(--radius-sm);
94
+ font-size: var(--font-size-xs);
95
+ font-weight: var(--font-weight-semibold);
96
+ line-height: 1;
97
+
98
+ @include a11y.motion-safe {
99
+ transition:
100
+ var(--motion-transition-background), var(--motion-transition-color);
101
+ }
102
+ }
103
+
104
+ .ui-tile:hover:not(:disabled) .ui-tile-media,
105
+ .ui-tile:focus-visible .ui-tile-media,
106
+ .ui-tile[data-selected='true'] .ui-tile-media {
107
+ color: var(--_tile-on-color);
108
+ background-color: var(--_tile-color);
109
+ }
110
+
111
+ // ============================================
112
+ // Label
113
+ // ============================================
114
+
115
+ .ui-tile-label {
116
+ font-size: var(--font-size-sm);
117
+ font-weight: var(--font-weight-normal);
118
+ line-height: var(--line-height-sm);
119
+ text-align: center;
120
+ inline-size: 100%;
121
+ overflow-wrap: anywhere;
122
+ }