@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,486 @@
1
+ /// Textarea component styles
2
+ /// Wrapper div pattern with floating label, auto-resize, error shake,
3
+ /// success state, character counter, clear button, loading spinner.
4
+ ///
5
+ /// Uses stable border-width to prevent layout shift on hover/focus.
6
+ /// State changes only modify border-color; focus emphasis via box-shadow ring().
7
+ ///
8
+ /// @group atoms/forms
9
+
10
+ @use 'sass:map';
11
+ @use '@pithyjs/design-system/a11y/styles/mixins' as a11y;
12
+ @use '@pithyjs/design-system/borders/styles/tokens' as borders;
13
+ @use '../../../shared/tokens' as shared;
14
+ @use '../../../shared/form-animations' as form-anim;
15
+
16
+ // ============================================
17
+ // Base wrapper
18
+ // ============================================
19
+
20
+ .ui-textarea {
21
+ // Default scroll-shadow bg — overridden by error/success/focus/hover states
22
+ --_scroll-bg: var(--color-surface);
23
+ --_textarea-scrollbar-size: #{shared.$scrollbar-thumb-size};
24
+
25
+ display: inline-flex;
26
+ flex-direction: column;
27
+ gap: var(--space-xs);
28
+ cursor: text;
29
+ position: relative;
30
+ inline-size: 100%;
31
+ background-color: var(--_scroll-bg);
32
+
33
+ // Stable border — width never changes across states to prevent layout shift.
34
+ border: borders.border(control);
35
+
36
+ // Motion-safe transitions — entrance easing on shadow for smooth focus ring
37
+ @include a11y.motion-safe {
38
+ transition:
39
+ var(--motion-transition-border),
40
+ box-shadow var(--motion-duration-normal) var(--motion-easing-entrance),
41
+ var(--motion-transition-color),
42
+ background-color var(--motion-duration-fast) var(--motion-easing-standard);
43
+ }
44
+
45
+ // Caret color, error background wash, adaptive selection color
46
+ @include form-anim.form-field-polish('.ui-textarea-field');
47
+
48
+ // Spinner inherits error/success color
49
+ @include form-anim.form-spinner-adaptive('.ui-textarea-loading');
50
+
51
+ // Required asterisk on floating label
52
+ @include form-anim.form-required-indicator('.ui-textarea-label');
53
+ }
54
+
55
+ // ============================================
56
+ // Inner textarea — fully reset
57
+ // ============================================
58
+
59
+ .ui-textarea-field {
60
+ appearance: none;
61
+ border: none;
62
+ background: none;
63
+ outline: none;
64
+ margin: 0;
65
+ padding: 0;
66
+ font: inherit;
67
+ color: inherit;
68
+ inline-size: 100%;
69
+ resize: vertical;
70
+
71
+ &::placeholder {
72
+ color: var(--color-text-muted);
73
+ opacity: shared.$placeholder-opacity;
74
+
75
+ @include a11y.motion-safe {
76
+ transition: opacity var(--motion-duration-fast)
77
+ var(--motion-easing-standard);
78
+ }
79
+ }
80
+
81
+ // On-brand text selection
82
+ &::selection {
83
+ background-color: color-mix(
84
+ in oklch,
85
+ var(--color-primary) calc(var(--state-selected-opacity) * 100%),
86
+ transparent
87
+ );
88
+ color: inherit;
89
+ }
90
+ }
91
+
92
+ // ============================================
93
+ // Auto-resize — CSS field-sizing progressive enhancement
94
+ // ============================================
95
+
96
+ .ui-textarea[data-auto-resize] .ui-textarea-field {
97
+ field-sizing: content;
98
+ // Use auto, not hidden — field-sizing:content grows to fit so no scrollbar
99
+ // appears until max-block-size caps growth, then scrollbar activates.
100
+ overflow-y: auto;
101
+ resize: none;
102
+ }
103
+
104
+ // Thin scrollbar for long content
105
+ // Note: scroll-shadows mixin is NOT used here because the field must stay
106
+ // background: none (transparent) so the wrapper's background (including
107
+ // error/success wash and hover tint) shows through without a blink.
108
+ .ui-textarea-field {
109
+ scrollbar-width: thin;
110
+ scrollbar-color: var(--color-border) transparent;
111
+
112
+ &::-webkit-scrollbar {
113
+ inline-size: var(--_textarea-scrollbar-size);
114
+ }
115
+
116
+ &::-webkit-scrollbar-track {
117
+ background: transparent;
118
+ }
119
+
120
+ &::-webkit-scrollbar-thumb {
121
+ background-color: var(--color-border);
122
+ border-radius: var(--radius-sm);
123
+ }
124
+ }
125
+
126
+ // ============================================
127
+ // Focus — bridge inner textarea focus to wrapper
128
+ // ============================================
129
+
130
+ .ui-textarea:not([data-readonly]):focus-within {
131
+ border-color: var(--color-focus-ring);
132
+ outline: none;
133
+ --ring-offset: 0px;
134
+ box-shadow:
135
+ borders.ring(),
136
+ 0 0 var(--shadow-base-blur) var(--ring-width)
137
+ color-mix(
138
+ in oklch,
139
+ var(--ring-color) calc(var(--state-selected-opacity) * 100%),
140
+ transparent
141
+ );
142
+ --_scroll-bg: var(--color-surface-bright);
143
+ background-color: var(--_scroll-bg);
144
+ }
145
+
146
+ // ============================================
147
+ // Hover (not disabled, not readonly)
148
+ // ============================================
149
+
150
+ .ui-textarea:hover:not([data-disabled]):not([data-readonly]):not(
151
+ :focus-within
152
+ ) {
153
+ --_scroll-bg: var(--color-surface-bright);
154
+ background-color: var(--_scroll-bg);
155
+ }
156
+
157
+ .ui-textarea:hover:not([data-disabled]):not([data-readonly]):not(
158
+ :focus-within
159
+ ):not([data-error]):not([data-success]) {
160
+ border-color: var(--color-primary);
161
+ }
162
+
163
+ // ============================================
164
+ // Sizes — font one step below control size
165
+ // ============================================
166
+
167
+ @each $size in shared.$control-sizes {
168
+ .ui-textarea[data-size='#{$size}'] {
169
+ font-size: map.get(shared.$control-font-sizes, $size);
170
+ --_textarea-icon-size: #{map.get(shared.$control-icon-sizes, $size)};
171
+ --_form-btn-size: #{map.get(shared.$control-btn-sizes, $size)};
172
+ }
173
+ }
174
+
175
+ // ============================================
176
+ // Success state
177
+ // ============================================
178
+
179
+ .ui-textarea[data-success] {
180
+ border-color: var(--color-success);
181
+
182
+ &:focus-within {
183
+ border-color: var(--color-success);
184
+ --ring-color: var(--color-success);
185
+ }
186
+ }
187
+
188
+ // ============================================
189
+ // Error state (after success — source order wins)
190
+ // ============================================
191
+
192
+ .ui-textarea[data-error] {
193
+ border-color: var(--color-danger);
194
+
195
+ &:focus-within {
196
+ border-color: var(--color-danger);
197
+ --ring-color: var(--color-danger);
198
+ }
199
+ }
200
+
201
+ // ============================================
202
+ // Error shake animation (shared keyframe)
203
+ // ============================================
204
+
205
+ @include form-anim.form-shake('.ui-textarea-shake');
206
+
207
+ // Helper + error text use shared .ui-form-helper / .ui-form-error classes
208
+ // from _form-animations.scss — no component-specific overrides needed.
209
+
210
+ // ============================================
211
+ // Disabled state
212
+ // ============================================
213
+
214
+ .ui-textarea[data-disabled] {
215
+ opacity: var(--state-disabled-opacity);
216
+ cursor: not-allowed;
217
+
218
+ .ui-textarea-field {
219
+ cursor: not-allowed;
220
+ resize: none;
221
+ }
222
+ }
223
+
224
+ // ============================================
225
+ // Readonly state
226
+ // ============================================
227
+
228
+ .ui-textarea[data-readonly] {
229
+ --_scroll-bg: var(--color-surface-variant);
230
+ background-color: var(--_scroll-bg);
231
+
232
+ .ui-textarea-field {
233
+ cursor: default;
234
+ }
235
+ }
236
+
237
+ // ============================================
238
+ // Floating Label — Inner Float Pattern
239
+ // Same approach as Input — label starts centered, floats to top on focus/fill.
240
+ // ============================================
241
+
242
+ .ui-textarea[data-floating-label] {
243
+ position: relative;
244
+ }
245
+
246
+ @each $size in shared.$control-sizes {
247
+ .ui-textarea[data-floating-label][data-size='#{$size}'] {
248
+ padding: calc(var(--control-padding-y-#{$size}) + 1em)
249
+ var(--control-padding-x-#{$size})
250
+ calc(var(--control-padding-y-#{$size}) * 0.4)
251
+ var(--control-padding-x-#{$size});
252
+ }
253
+ }
254
+
255
+ .ui-textarea-label {
256
+ position: absolute;
257
+ inset-block-start: var(--space-md);
258
+ transform-origin: inline-start top;
259
+ font-size: inherit;
260
+ color: var(--color-text-muted);
261
+ pointer-events: none;
262
+ white-space: nowrap;
263
+ line-height: 1;
264
+
265
+ @include a11y.motion-safe {
266
+ transition:
267
+ inset-block-start var(--motion-duration-normal)
268
+ var(--motion-easing-entrance),
269
+ transform var(--motion-duration-normal) var(--motion-easing-entrance),
270
+ padding-block-start var(--motion-duration-normal)
271
+ var(--motion-easing-entrance),
272
+ font-size var(--motion-duration-normal) var(--motion-easing-entrance),
273
+ color var(--motion-duration-fast) var(--motion-easing-standard);
274
+ }
275
+ }
276
+
277
+ // Label horizontal position per size
278
+ @each $size in shared.$control-sizes {
279
+ .ui-textarea[data-size='#{$size}'] .ui-textarea-label {
280
+ inset-inline-start: var(--control-padding-x-#{$size});
281
+ }
282
+ }
283
+
284
+ // Floating state — label anchors to top-inside
285
+ .ui-textarea:not([data-readonly]):focus-within .ui-textarea-label,
286
+ .ui-textarea[data-filled] .ui-textarea-label,
287
+ .ui-textarea[data-readonly] .ui-textarea-label {
288
+ inset-block-start: 0;
289
+ transform: none;
290
+ font-size: var(--font-size-xs);
291
+ color: var(--color-primary);
292
+ letter-spacing: var(--body-letter-spacing);
293
+ padding-block-start: var(--space-xs);
294
+ }
295
+
296
+ // Filled but not focused — muted label color
297
+ .ui-textarea[data-filled]:not(:focus-within) .ui-textarea-label,
298
+ .ui-textarea[data-readonly] .ui-textarea-label {
299
+ color: var(--color-text-muted);
300
+ }
301
+
302
+ // Error overrides label color
303
+ .ui-textarea[data-error]:not([data-readonly]):focus-within .ui-textarea-label,
304
+ .ui-textarea[data-error][data-filled] .ui-textarea-label {
305
+ color: var(--color-danger);
306
+ }
307
+
308
+ // Success overrides label color (error wins when both present)
309
+ // Darkened via color-mix for WCAG 1.4.3 text contrast (≥4.5:1 vs surface)
310
+ .ui-textarea[data-success]:not([data-error]):not([data-readonly]):focus-within
311
+ .ui-textarea-label,
312
+ .ui-textarea[data-success]:not([data-error])[data-filled] .ui-textarea-label {
313
+ color: var(
314
+ --color-success-text,
315
+ color-mix(in oklch, var(--color-success) 66%, var(--color-text))
316
+ );
317
+ }
318
+
319
+ // Hide placeholder when label is in resting position
320
+ .ui-textarea[data-floating-label]:not(:focus-within):not([data-filled]):not(
321
+ [data-readonly]
322
+ )
323
+ .ui-textarea-field::placeholder {
324
+ opacity: 0;
325
+ }
326
+
327
+ // ============================================
328
+ // Action row — clear button, state icon, counter
329
+ // ============================================
330
+
331
+ .ui-textarea-actions {
332
+ display: flex;
333
+ align-items: center;
334
+ gap: var(--space-xs);
335
+ padding-block-end: var(--space-xs);
336
+ }
337
+
338
+ // ============================================
339
+ // Character Counter
340
+ // ============================================
341
+
342
+ .ui-textarea-counter {
343
+ font-size: var(--font-size-xs);
344
+ font-variant-numeric: tabular-nums;
345
+ color: var(--color-text-muted);
346
+ flex-shrink: 0;
347
+ white-space: nowrap;
348
+ margin-inline-start: auto;
349
+ opacity: 0;
350
+
351
+ @include a11y.motion-safe {
352
+ transition:
353
+ color var(--motion-duration-fast) var(--motion-easing-standard),
354
+ opacity var(--motion-duration-normal) var(--motion-easing-standard);
355
+ }
356
+
357
+ .ui-textarea[data-filled] &,
358
+ .ui-textarea:not([data-readonly]):focus-within & {
359
+ opacity: 1;
360
+ }
361
+ }
362
+
363
+ .ui-textarea-counter-warn {
364
+ color: var(--color-warning);
365
+ }
366
+
367
+ .ui-textarea-counter-danger {
368
+ color: var(--color-danger);
369
+ font-weight: var(--font-weight-medium);
370
+ }
371
+
372
+ // ============================================
373
+ // Clear Button
374
+ // ============================================
375
+
376
+ .ui-textarea-clear {
377
+ @include form-anim.form-inline-button(var(--color-text));
378
+
379
+ // Override: position in the top-right corner of the wrapper
380
+ & {
381
+ position: absolute;
382
+ inset-block-start: var(--space-xs);
383
+ inset-inline-end: var(--space-xs);
384
+ z-index: 1;
385
+ }
386
+ }
387
+
388
+ // ============================================
389
+ // State Icons (success / error)
390
+ // ============================================
391
+
392
+ .ui-textarea-state-icon {
393
+ display: inline-flex;
394
+ align-items: center;
395
+ justify-content: center;
396
+ flex-shrink: 0;
397
+ inline-size: var(--_textarea-icon-size);
398
+ block-size: var(--_textarea-icon-size);
399
+ line-height: 1;
400
+
401
+ @include a11y.motion-safe {
402
+ transition: var(--motion-transition-color);
403
+ }
404
+ }
405
+
406
+ .ui-textarea-state-icon-success {
407
+ color: var(--color-success);
408
+ }
409
+
410
+ @include a11y.motion-safe {
411
+ .ui-textarea-state-icon-pop {
412
+ animation: var(--motion-animation-fade-scale-in)
413
+ var(--motion-duration-normal) var(--motion-easing-entrance);
414
+ }
415
+ }
416
+
417
+ .ui-textarea-state-icon-error {
418
+ color: var(--color-danger);
419
+ }
420
+
421
+ // ============================================
422
+ // Loading Spinner
423
+ // ============================================
424
+
425
+ // Spinner on the wrapper ::after — always available regardless of action row
426
+ .ui-textarea.ui-textarea-loading::after {
427
+ content: '';
428
+ position: absolute;
429
+ inset-block-end: var(--space-xs);
430
+ inset-inline-end: var(--space-xs);
431
+ inline-size: var(--_textarea-icon-size);
432
+ block-size: var(--_textarea-icon-size);
433
+ border: var(--border-width-thin) solid var(--color-text-muted);
434
+ border-inline-end-color: transparent;
435
+ border-radius: 50%;
436
+
437
+ @include a11y.motion-safe {
438
+ animation: var(--motion-animation-spin) var(--motion-duration-deliberate)
439
+ linear infinite;
440
+ }
441
+
442
+ @include a11y.motion-reduced {
443
+ border-inline-end-color: var(--color-text-muted);
444
+ opacity: shared.$spinner-reduced-opacity;
445
+ }
446
+ }
447
+
448
+ // Loading state: hide clear button
449
+ .ui-textarea.ui-textarea-loading > .ui-textarea-clear {
450
+ display: none;
451
+ }
452
+
453
+ // Disabled / readonly: hide clear button
454
+ .ui-textarea[data-disabled] > .ui-textarea-clear,
455
+ .ui-textarea[data-readonly] > .ui-textarea-clear {
456
+ display: none;
457
+ }
458
+
459
+ // ============================================
460
+ // High Contrast / Forced Colors
461
+ // ============================================
462
+
463
+ @include a11y.forced-colors {
464
+ .ui-textarea {
465
+ border: var(--border-width-hairline) solid ButtonText;
466
+ }
467
+
468
+ .ui-textarea[data-disabled] {
469
+ border-color: GrayText;
470
+ color: GrayText;
471
+ }
472
+
473
+ .ui-textarea:not([data-readonly]):focus-within {
474
+ @include a11y.focus-outline(Highlight);
475
+ }
476
+
477
+ .ui-textarea-label {
478
+ color: inherit;
479
+ }
480
+
481
+ .ui-textarea-clear {
482
+ border: var(--border-width-hairline) solid ButtonText;
483
+ color: ButtonText;
484
+ background: Field;
485
+ }
486
+ }
@@ -0,0 +1,47 @@
1
+ /** @codex
2
+ {
3
+ "id": "pithy.ui-kit.toggle",
4
+ "title": "<Toggle> Form Atom",
5
+ "category": "feature"
6
+ }
7
+ */
8
+ import { type FormControlBaseProps } from '../../../shared/types';
9
+ /** @codexApi {"parent":"pithy.ui-kit.toggle","name":"ToggleProps","stability":"stable","signature":"interface ToggleProps extends FormControlBaseProps"} */
10
+ export interface ToggleProps extends FormControlBaseProps {
11
+ /** Toggle name attribute */
12
+ name?: string;
13
+ /** Submitted value when the toggle is on (default: "on") */
14
+ value?: string;
15
+ /** Checked (on) state — static boolean or signal accessor for controlled toggle */
16
+ checked?: boolean | (() => boolean);
17
+ /** Fires whenever the checked state changes */
18
+ onChange?: (checked: boolean, e: Event) => void;
19
+ /** Fires when the toggle loses focus */
20
+ onBlur?: (e: FocusEvent) => void;
21
+ /** Fires when the toggle gains focus */
22
+ onFocus?: (e: FocusEvent) => void;
23
+ }
24
+ /**
25
+ * Accessible toggle / switch atom.
26
+ *
27
+ * Renders a `<label class="ui-toggle">` wrapping a native
28
+ * `<input type="checkbox" role="switch">`, a custom track + thumb
29
+ * drawn from CSS, and a visible label. Supports error/success states
30
+ * (with shake), helper/error text, loading, and full a11y wiring.
31
+ *
32
+ * This is a pure visual atom — no validation logic. Error/success are
33
+ * driven externally via props.
34
+ *
35
+ * @example
36
+ * ```html
37
+ * <Toggle label="'Dark mode'" />
38
+ * <Toggle label="'Notifications'" checked="isEnabled" onChange="toggle" />
39
+ * <Toggle label="'Auto-save'" checked="true" disabled="true" />
40
+ * ```
41
+ */
42
+ /** @codexApi {"parent":"pithy.ui-kit.toggle","name":"Toggle","stability":"stable","signature":"(props: ToggleProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
43
+ export declare function Toggle({ id: externalId, name, value, checked, disabled, readonly: readonlyProp, required, error, errorMessage, helperText, success, size: rawSize, label, loading, onChange, onBlur, onFocus, }: ToggleProps): {
44
+ el: HTMLElement | DocumentFragment;
45
+ destroy: () => void;
46
+ };
47
+ //# sourceMappingURL=Toggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toggle.d.ts","sourceRoot":"","sources":["../../../../src/atoms/forms/toggle/Toggle.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAGF,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAc/B,4JAA4J;AAC5J,MAAM,WAAW,WAAY,SAAQ,oBAAoB;IACvD,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAChD,wCAAwC;IACxC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACjC,wCAAwC;IACxC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wLAAwL;AACxL,wBAAgB,MAAM,CAAC,EACrB,EAAE,EAAE,UAAU,EACd,IAAI,EACJ,KAAY,EACZ,OAAe,EACf,QAAgB,EAChB,QAAQ,EAAE,YAAoB,EAC9B,QAAgB,EAChB,KAAa,EACb,YAAY,EACZ,UAAU,EACV,OAAe,EACf,IAAI,EAAE,OAAc,EACpB,KAAK,EACL,OAAe,EACf,QAAQ,EACR,MAAM,EACN,OAAO,GACR,EAAE,WAAW,GAAG;IAAE,EAAE,EAAE,WAAW,GAAG,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAkQ3E"}