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