@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,156 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.hero-section",
4
+ "title": "<HeroSection> Section Template",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { captureChildren } from '@pithyjs/core';
9
+ import { Heading } from '../../atoms/content/heading/Heading';
10
+ import { Text } from '../../atoms/content/text/Text';
11
+ import { Image } from '../../atoms/content/image/Image';
12
+ import { PY_CLASS } from '../../shared/common';
13
+ import { captureSlot } from '../../shared/slots';
14
+ import { clampHeadingLevel, validateSpacing, applyContainment, generateSectionHeadingId, } from '../../shared/section';
15
+ import { bindReactive, readReactive, hasReactive, } from '../../shared/clickable';
16
+ import { observeEntrance } from '../entrance';
17
+ const HERO_VARIANTS = ['centered', 'split'];
18
+ /**
19
+ * Hero section with heading, subtext, and CTA area.
20
+ *
21
+ * Two variants: "centered" (stacked, text-centered) and "split"
22
+ * (image + text side by side). Children are projected into the
23
+ * actions area for CTA buttons.
24
+ *
25
+ * @example
26
+ * ```html
27
+ * <HeroSection heading="'Welcome'" subheading="'Build faster'">
28
+ * <Button color="'primary'">Get Started</Button>
29
+ * </HeroSection>
30
+ * ```
31
+ */
32
+ /** @codexApi {"parent":"pithy.ui-kit.hero-section","name":"HeroSection","stability":"stable","signature":"(props: HeroSectionProps) => { el: HTMLElement; destroy: () => void }"} */
33
+ export function HeroSection({ variant: rawVariant = 'centered', eyebrow, heading, headingLevel: rawLevel = 1, subheading, imageSrc, imageAlt, imageWidth, imageHeight, spacing: rawSpacing = 'xl', id, }) {
34
+ const validVariant = HERO_VARIANTS.includes(rawVariant);
35
+ const resolvedImageSrc = readReactive(imageSrc);
36
+ const resolvedImageAlt = readReactive(imageAlt);
37
+ if (import.meta.env?.DEV) {
38
+ if (!validVariant) {
39
+ console.warn(`[<HeroSection>] Invalid variant: "${rawVariant}". Expected "centered" or "split". Falling back to "centered".`);
40
+ }
41
+ if (resolvedImageSrc && !resolvedImageAlt) {
42
+ console.warn(`[<HeroSection>] imageSrc provided without imageAlt. Images must have alt text for accessibility.`);
43
+ }
44
+ if (resolvedImageSrc && rawVariant !== 'split') {
45
+ console.warn(`[<HeroSection>] imageSrc is only rendered in the "split" variant. Current variant: "${rawVariant}".`);
46
+ }
47
+ }
48
+ const variant = validVariant ? rawVariant : 'centered';
49
+ const spacing = validateSpacing('HeroSection', rawSpacing, 'xl');
50
+ const level = clampHeadingLevel(rawLevel);
51
+ const disposers = [];
52
+ // Capture projected children FIRST and clear context so inner component
53
+ // calls (Heading, Text, Image) don't consume our children.
54
+ const { el: childFragment, destroy: destroyChildren } = captureChildren();
55
+ disposers.push(destroyChildren);
56
+ // Root section element
57
+ const section = document.createElement('section');
58
+ section.classList.add('ui-section', 'ui-hero', PY_CLASS[spacing]);
59
+ if (id)
60
+ section.id = id;
61
+ // Inner container with containment
62
+ const container = document.createElement('div');
63
+ applyContainment(container);
64
+ section.appendChild(container);
65
+ // Create heading via Heading() component — link to section via aria-labelledby
66
+ const headingId = generateSectionHeadingId('hero', id);
67
+ const headingComp = Heading({
68
+ level,
69
+ align: variant === 'centered' ? 'center' : undefined,
70
+ text: heading,
71
+ });
72
+ const headingEl = headingComp.el;
73
+ headingEl.id = headingId;
74
+ section.setAttribute('aria-labelledby', headingId);
75
+ disposers.push(headingComp.destroy);
76
+ // Create subheading via Text() component
77
+ let subheadingComp;
78
+ if (subheading) {
79
+ subheadingComp = Text({
80
+ size: 'xl',
81
+ color: 'text-muted',
82
+ align: variant === 'centered' ? 'center' : undefined,
83
+ text: subheading,
84
+ });
85
+ disposers.push(subheadingComp.destroy);
86
+ }
87
+ // Text block groups eyebrow + heading + subheading (Close Friends spacing via SCSS)
88
+ const textBlock = document.createElement('div');
89
+ textBlock.classList.add('ui-hero-text-block');
90
+ // Eyebrow label
91
+ // Optional reactive fields are live-patched, not re-rendered: clearing one to ""
92
+ // empties the text but leaves the element (and its ~12px flex-gap slot) in place.
93
+ // Accepted over hide-on-empty — studio edits are transient and the slot is negligible.
94
+ if (eyebrow) {
95
+ const eyebrowEl = document.createElement('span');
96
+ eyebrowEl.classList.add('ui-section-eyebrow');
97
+ const eyebrowText = eyebrowEl.appendChild(document.createTextNode(''));
98
+ disposers.push(bindReactive(hasReactive(eyebrow), () => {
99
+ eyebrowText.nodeValue = readReactive(eyebrow) ?? '';
100
+ }));
101
+ textBlock.appendChild(eyebrowEl);
102
+ }
103
+ textBlock.appendChild(headingComp.el);
104
+ if (subheadingComp)
105
+ textBlock.appendChild(subheadingComp.el);
106
+ // Actions area
107
+ const actionsArea = document.createElement('div');
108
+ actionsArea.classList.add('ui-hero-actions');
109
+ captureSlot(actionsArea, 'actions');
110
+ actionsArea.appendChild(childFragment);
111
+ if (variant === 'split') {
112
+ // Split layout: content + image side by side
113
+ container.classList.add('ui-hero-content');
114
+ container.setAttribute('data-variant', 'split');
115
+ // Content side
116
+ const contentSide = document.createElement('div');
117
+ contentSide.classList.add('ui-hero-text-side');
118
+ contentSide.appendChild(textBlock);
119
+ contentSide.appendChild(actionsArea);
120
+ container.appendChild(contentSide);
121
+ // Image side
122
+ if (imageSrc && (typeof imageSrc === 'function' || resolvedImageSrc)) {
123
+ const imageComp = Image({
124
+ src: imageSrc,
125
+ alt: imageAlt,
126
+ width: imageWidth,
127
+ height: imageHeight,
128
+ loading: 'eager',
129
+ rounded: 'md',
130
+ });
131
+ disposers.push(imageComp.destroy);
132
+ const imageSide = document.createElement('div');
133
+ imageSide.classList.add('ui-hero-image-side');
134
+ imageSide.appendChild(imageComp.el);
135
+ container.appendChild(imageSide);
136
+ }
137
+ }
138
+ else {
139
+ // Centered variant (default)
140
+ container.classList.add('ui-hero-content');
141
+ container.setAttribute('data-variant', 'centered');
142
+ container.appendChild(textBlock);
143
+ container.appendChild(actionsArea);
144
+ }
145
+ // Entrance animation
146
+ disposers.push(observeEntrance(section));
147
+ return {
148
+ el: section,
149
+ destroy: () => {
150
+ for (const dispose of disposers)
151
+ dispose();
152
+ section.replaceChildren();
153
+ },
154
+ };
155
+ }
156
+ //# sourceMappingURL=HeroSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeroSection.js","sourceRoot":"","sources":["../../../src/sections/hero/HeroSection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ /// HeroSection styles
2
+ /// Provides the design layer for centered and split hero layouts.
3
+ /// Friendship spacing: heading↔subheading = Close Friends (sm),
4
+ /// text-block↔CTA = Acquaintances (lg).
5
+ ///
6
+ /// @group sections
7
+
8
+ @use '@pithyjs/design-system/a11y/styles/mixins' as a11y;
9
+ @use '../../shared/tokens' as shared;
10
+ @use '../../shared/mixins' as shared-mix;
11
+
12
+ // ============================================
13
+ // Base
14
+ // ============================================
15
+
16
+ .ui-hero {
17
+ // Subtle depth — radial glow behind content
18
+ position: relative;
19
+ overflow-inline: clip;
20
+
21
+ &::before {
22
+ content: '';
23
+ position: absolute;
24
+ inset-block-start: 0;
25
+ inset-inline-start: 50%;
26
+ // NOTE: translate is physical but the glow is centered symmetrically — RTL is visually identical.
27
+ translate: -50% -30%;
28
+ inline-size: 60%;
29
+ block-size: 60%;
30
+ border-radius: 50%;
31
+ background: radial-gradient(
32
+ ellipse at center,
33
+ color-mix(in oklch, var(--color-primary) 8%, transparent) 0%,
34
+ transparent 70%
35
+ );
36
+ pointer-events: none;
37
+ z-index: 0;
38
+ }
39
+ }
40
+
41
+ // ============================================
42
+ // Centered variant
43
+ // ============================================
44
+
45
+ .ui-hero-content[data-variant='centered'] {
46
+ display: flex;
47
+ flex-direction: column;
48
+ align-items: center;
49
+ text-align: center;
50
+ position: relative;
51
+ z-index: 1;
52
+ }
53
+
54
+ // Heading → subheading: Close Friends (sm)
55
+ .ui-hero-text-block {
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: var(--space-sm);
59
+ }
60
+
61
+ // Constrain centered text for readability
62
+ .ui-hero-content[data-variant='centered'] .ui-hero-text-block {
63
+ max-inline-size: shared.$measure-content;
64
+ }
65
+
66
+ // Text-block → actions: Acquaintances (lg)
67
+ .ui-hero-content[data-variant='centered']
68
+ .ui-hero-text-block
69
+ + .ui-hero-actions {
70
+ margin-block-start: var(--space-lg);
71
+ }
72
+
73
+ // Subheading: lighter weight + constrained width for readability
74
+ .ui-hero-text-block .ui-text {
75
+ max-inline-size: shared.$measure-text;
76
+ font-weight: var(--font-weight-regular);
77
+ }
78
+
79
+ // Hero headings: larger, tighter line-height, tight tracking for impact
80
+ .ui-hero .ui-heading {
81
+ font-size: var(--font-size-3xl);
82
+ line-height: var(--line-height-3xl);
83
+ letter-spacing: var(--heading-letter-spacing);
84
+ }
85
+
86
+ // Balance centered headings
87
+ .ui-hero-content[data-variant='centered'] .ui-heading {
88
+ text-wrap: balance;
89
+ }
90
+
91
+ // ============================================
92
+ // Split variant
93
+ // ============================================
94
+
95
+ .ui-hero-content[data-variant='split'] {
96
+ display: flex;
97
+ flex-wrap: wrap;
98
+ align-items: center;
99
+ gap: var(--space-xl);
100
+ position: relative;
101
+ z-index: 1;
102
+
103
+ // Centre wrapped children whose width is capped by fluid-center-child
104
+ @include shared-mix.fluid-center-parent;
105
+ }
106
+
107
+ .ui-hero-text-side {
108
+ flex: 1 1 shared.$min-column;
109
+ display: flex;
110
+ flex-direction: column;
111
+
112
+ // Cap width so parent's justify-content: center kicks in when wrapped
113
+ @include shared-mix.fluid-center-child;
114
+ }
115
+
116
+ // Heading → subheading: Close Friends (sm)
117
+ .ui-hero-text-side .ui-hero-text-block {
118
+ gap: var(--space-sm);
119
+ }
120
+
121
+ // Text-block → actions: Acquaintances (lg)
122
+ .ui-hero-text-side .ui-hero-actions {
123
+ margin-block-start: var(--space-lg);
124
+ }
125
+
126
+ .ui-hero-image-side {
127
+ flex: 1 1 shared.$min-column;
128
+
129
+ // Image depth — shadow + radius for lifted appearance
130
+ .ui-image {
131
+ box-shadow: var(--shadow-lg);
132
+ border-radius: var(--radius-lg);
133
+
134
+ @include a11y.motion-safe {
135
+ transition: var(--motion-transition-shadow);
136
+ }
137
+
138
+ &:hover {
139
+ box-shadow: var(--shadow-xl);
140
+ }
141
+ }
142
+ }
143
+
144
+ // ============================================
145
+ // Actions (button pair)
146
+ // ============================================
147
+
148
+ .ui-hero-actions {
149
+ display: flex;
150
+ flex-direction: row;
151
+ gap: var(--space-sm);
152
+ flex-wrap: wrap;
153
+
154
+ // Centre buttons only when parent stacks (inherits container from fluid-center-parent)
155
+ @container (max-width: #{shared.$min-column * 2 + 4rem}) {
156
+ justify-content: center;
157
+ }
158
+ }
159
+
160
+ // ============================================
161
+ // Motion
162
+ // ============================================
163
+
164
+ @include a11y.motion-safe {
165
+ .ui-hero {
166
+ &::before {
167
+ transition: opacity var(--motion-duration-slow)
168
+ var(--motion-easing-standard);
169
+ }
170
+ }
171
+
172
+ // Expressive preset: split hero image slides in from the inline-end side
173
+ [data-entrance='expressive'] .ui-hero-image-side {
174
+ opacity: 0;
175
+ translate: var(--motion-distance-big) 0;
176
+ transition:
177
+ opacity var(--motion-duration-deliberate) var(--motion-easing-entrance),
178
+ translate var(--motion-duration-deliberate)
179
+ var(--motion-easing-emphasized);
180
+ }
181
+
182
+ [data-entrance='expressive'] .ui-section-visible .ui-hero-image-side {
183
+ opacity: 1;
184
+ translate: 0 0;
185
+ }
186
+
187
+ // Expressive: text side fades up with slight delay
188
+ [data-entrance='expressive'] .ui-hero-text-side {
189
+ opacity: 0;
190
+ translate: 0 var(--motion-distance-medium);
191
+ transition:
192
+ opacity var(--motion-duration-deliberate) var(--motion-easing-entrance),
193
+ translate var(--motion-duration-deliberate) var(--motion-easing-entrance);
194
+ transition-delay: 100ms;
195
+ }
196
+
197
+ [data-entrance='expressive'] .ui-section-visible .ui-hero-text-side {
198
+ opacity: 1;
199
+ translate: 0 0;
200
+ }
201
+ }
202
+
203
+ // ============================================
204
+ // Forced colors
205
+ // ============================================
206
+
207
+ @include a11y.forced-colors {
208
+ .ui-hero::before {
209
+ display: none;
210
+ }
211
+ }
@@ -0,0 +1,283 @@
1
+ /// Shared form control styles and animations
2
+ /// Keyframes and text styles used by multiple form atoms (Input, Select, Textarea).
3
+ ///
4
+ /// @group atoms/forms
5
+
6
+ @use '@pithyjs/design-system/a11y/styles/mixins' as a11y;
7
+
8
+ // ============================================
9
+ // Error shake animation
10
+ // ============================================
11
+
12
+ @keyframes ui-form-shake {
13
+ 0%,
14
+ 100% {
15
+ translate: 0;
16
+ }
17
+ 20% {
18
+ translate: calc(-1 * var(--motion-distance-subtle));
19
+ }
20
+ 40% {
21
+ translate: var(--motion-distance-subtle);
22
+ }
23
+ 60% {
24
+ translate: calc(-1 * var(--motion-distance-subtle) / 2);
25
+ }
26
+ 80% {
27
+ translate: calc(var(--motion-distance-subtle) / 2);
28
+ }
29
+ }
30
+
31
+ /// Mixin to apply shake animation class on a given selector.
32
+ /// Usage: @include form-shake('.ui-input-shake');
33
+ /// @param {String} $selector - The class selector that triggers the shake
34
+ @mixin form-shake($selector) {
35
+ @include a11y.motion-safe {
36
+ #{$selector} {
37
+ animation: ui-form-shake var(--motion-duration-normal)
38
+ var(--motion-easing-standard);
39
+ }
40
+ }
41
+ }
42
+
43
+ // ============================================
44
+ // State-engage pop animation (for Checkbox, Radio, Toggle)
45
+ // 1 → var(--motion-scale-big) → 1 with springy easing — gives a tactile
46
+ // "this state just turned on" feel without altering the layout box.
47
+ // ============================================
48
+
49
+ @keyframes ui-form-pop {
50
+ 0% {
51
+ transform: scale(1);
52
+ }
53
+ 35% {
54
+ transform: scale(var(--motion-scale-big));
55
+ }
56
+ 100% {
57
+ transform: scale(1);
58
+ }
59
+ }
60
+
61
+ /// Mixin to apply the pop animation to a target. Wrap your selector and
62
+ /// pass it in. The mixin handles motion-safe gating.
63
+ /// Usage: @include form-pop('.ui-checkbox-box');
64
+ /// @param {String} $selector - The element to animate
65
+ @mixin form-pop($selector) {
66
+ @include a11y.motion-safe {
67
+ #{$selector} {
68
+ animation: ui-form-pop var(--motion-duration-slow)
69
+ var(--motion-easing-springy) both;
70
+ }
71
+ }
72
+ }
73
+
74
+ // ============================================
75
+ // Shared field polish
76
+ // Caret color, error background wash, adaptive selection color.
77
+ // ============================================
78
+
79
+ /// Mixin for polished text-input field styles (caret, selection, error wash).
80
+ /// Apply inside the wrapper selector (e.g., .ui-input, .ui-textarea).
81
+ /// @param {String} $field-selector - Inner field element class (e.g., '.ui-input-field')
82
+ @mixin form-field-polish($field-selector) {
83
+ // Caret synced to primary — subtle but noticeable on focus
84
+ #{$field-selector} {
85
+ caret-color: var(--color-primary);
86
+ }
87
+
88
+ // Error state — danger caret + faint background wash for scanability
89
+ &[data-error] {
90
+ --_scroll-bg: color-mix(
91
+ in oklch,
92
+ var(--color-danger) 3%,
93
+ var(--color-surface)
94
+ );
95
+ background-color: var(--_scroll-bg);
96
+
97
+ #{$field-selector} {
98
+ caret-color: var(--color-danger);
99
+ }
100
+
101
+ #{$field-selector}::selection {
102
+ background-color: color-mix(
103
+ in oklch,
104
+ var(--color-danger) calc(var(--state-selected-opacity) * 100%),
105
+ transparent
106
+ );
107
+ }
108
+ }
109
+
110
+ // Success state — success caret + selection tint
111
+ &[data-success]:not([data-error]) {
112
+ #{$field-selector} {
113
+ caret-color: var(--color-success);
114
+ }
115
+
116
+ #{$field-selector}::selection {
117
+ background-color: color-mix(
118
+ in oklch,
119
+ var(--color-success) calc(var(--state-selected-opacity) * 100%),
120
+ transparent
121
+ );
122
+ }
123
+ }
124
+ }
125
+
126
+ /// Mixin for spinner color that inherits error/success state.
127
+ /// Apply inside the wrapper selector that holds the ::after spinner.
128
+ /// @param {String} $loading-selector - Full selector from wrapper to ::after host
129
+ /// e.g., '.ui-input-loading' (spinner on wrapper::after)
130
+ /// e.g., '.ui-select-loading .ui-select-trigger' (spinner on child::after)
131
+ @mixin form-spinner-adaptive($loading-selector) {
132
+ &[data-error]#{$loading-selector}::after {
133
+ border-color: var(--color-danger);
134
+ border-inline-end-color: transparent;
135
+ }
136
+
137
+ &[data-success]:not([data-error])#{$loading-selector}::after {
138
+ border-color: var(--color-success);
139
+ border-inline-end-color: transparent;
140
+ }
141
+ }
142
+
143
+ /// Mixin for scroll overflow shadows (top + bottom fade).
144
+ /// Uses background-attachment: local trick — pure CSS, no JS needed.
145
+ /// Requires --_scroll-bg set on the element or an ancestor (defaults via wrapper).
146
+ @mixin scroll-shadows {
147
+ background:
148
+ // Top shadow — scrolls with content (disappears at top)
149
+ linear-gradient(var(--_scroll-bg) 30%, transparent) center top,
150
+ // Bottom shadow — scrolls with content (disappears at bottom)
151
+ linear-gradient(transparent, var(--_scroll-bg) 70%) center bottom,
152
+ // Top fade indicator — fixed
153
+ radial-gradient(
154
+ farthest-side at 50% 0,
155
+ color-mix(
156
+ in oklch,
157
+ var(--color-text) calc(var(--state-hover-opacity) * 100%),
158
+ transparent
159
+ ),
160
+ transparent
161
+ )
162
+ center top,
163
+ // Bottom fade indicator — fixed
164
+ radial-gradient(
165
+ farthest-side at 50% 100%,
166
+ color-mix(
167
+ in oklch,
168
+ var(--color-text) calc(var(--state-hover-opacity) * 100%),
169
+ transparent
170
+ ),
171
+ transparent
172
+ )
173
+ center bottom;
174
+ background-repeat: no-repeat;
175
+ background-size:
176
+ 100% var(--space-lg),
177
+ 100% var(--space-lg),
178
+ 100% var(--space-sm),
179
+ 100% var(--space-sm);
180
+ background-attachment: local, local, scroll, scroll;
181
+ }
182
+
183
+ /// Mixin for required asterisk on floating labels.
184
+ /// Shows red asterisk after label text when wrapper has [data-required][data-floating-label].
185
+ /// @param {String} $label-selector - Label element class (e.g., '.ui-input-label')
186
+ @mixin form-required-indicator($label-selector) {
187
+ &[data-required][data-floating-label] #{$label-selector}::after {
188
+ content: ' *';
189
+ color: var(--color-danger);
190
+ font-weight: var(--font-weight-medium);
191
+ }
192
+ }
193
+
194
+ // ============================================
195
+ // Shared inline button inside form controls (clear ×, password toggle)
196
+ // Provides consistent styling, focus ring, hover state, and a 44×44
197
+ // invisible touch target for WCAG 2.2 SC 2.5.8 AAA compliance.
198
+ // ============================================
199
+
200
+ /// @param {Color} $hover-color - The color used for hover/active state backgrounds
201
+ @mixin form-inline-button($hover-color: var(--color-text)) {
202
+ appearance: none;
203
+ border: none;
204
+ background: none;
205
+ padding: 0;
206
+ margin: 0;
207
+ cursor: pointer;
208
+ color: var(--color-text-muted);
209
+ line-height: 1;
210
+ flex-shrink: 0;
211
+ display: inline-flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ border-radius: 50%;
215
+ position: relative;
216
+ inline-size: var(--_form-btn-size, var(--icon-size-md));
217
+ block-size: var(--_form-btn-size, var(--icon-size-md));
218
+ // Scale text glyph (×) to match button container size
219
+ font-size: var(--_form-btn-size, var(--icon-size-md));
220
+
221
+ // 44×44 invisible touch target (WCAG 2.2 SC 2.5.8 AAA)
222
+ &::after {
223
+ content: '';
224
+ position: absolute;
225
+ inset-block-start: 50%;
226
+ inset-inline-start: 50%;
227
+ translate: -50% -50%;
228
+ min-inline-size: 44px;
229
+ min-block-size: 44px;
230
+ }
231
+
232
+ &:hover {
233
+ color: $hover-color;
234
+ @include a11y.state-background(hover, $hover-color);
235
+ }
236
+
237
+ @include a11y.focus-ring-visible;
238
+
239
+ @include a11y.motion-safe {
240
+ transition:
241
+ var(--motion-transition-opacity), var(--motion-transition-color),
242
+ var(--motion-transition-background);
243
+ }
244
+
245
+ // Keeps layout space when hidden to prevent input width shift.
246
+ // Uses [data-hidden] (not [hidden]) so the global display:none!important reset doesn't apply.
247
+ &[data-hidden] {
248
+ display: inline-flex;
249
+ visibility: hidden;
250
+ opacity: 0;
251
+ pointer-events: none;
252
+ }
253
+ }
254
+
255
+ // ============================================
256
+ // Shared helper / error text below form controls
257
+ // ============================================
258
+
259
+ .ui-form-helper {
260
+ display: block;
261
+ margin-block-start: var(--space-xs);
262
+ font-size: var(--font-size-xs);
263
+ color: var(--color-text-muted);
264
+ line-height: var(--leading-tight);
265
+
266
+ @include a11y.motion-safe {
267
+ animation: var(--motion-animation-fade-in) var(--motion-duration-fast)
268
+ var(--motion-easing-entrance);
269
+ }
270
+ }
271
+
272
+ .ui-form-error {
273
+ display: block;
274
+ margin-block-start: var(--space-xs);
275
+ font-size: var(--font-size-xs);
276
+ color: var(--color-danger);
277
+ line-height: var(--leading-tight);
278
+
279
+ @include a11y.motion-safe {
280
+ animation: var(--motion-animation-fade-in) var(--motion-duration-fast)
281
+ var(--motion-easing-entrance);
282
+ }
283
+ }