@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
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/// Badge component styles
|
|
2
|
+
/// Premium inline status indicator with filled, outline, and subtle variants.
|
|
3
|
+
/// Uses semantic color tokens and design-system a11y mixins.
|
|
4
|
+
///
|
|
5
|
+
/// @group atoms/content
|
|
6
|
+
|
|
7
|
+
@use 'sass:map';
|
|
8
|
+
@use '@pithyjs/design-system/a11y/styles/mixins' as a11y;
|
|
9
|
+
@use '../../../shared/tokens' as shared;
|
|
10
|
+
@use '@pithyjs/design-system/layout/styles/glass' as glass;
|
|
11
|
+
|
|
12
|
+
// ============================================
|
|
13
|
+
// Pulse keyframe (dot "live" indicator)
|
|
14
|
+
// ============================================
|
|
15
|
+
|
|
16
|
+
@keyframes pithy-badge-pulse {
|
|
17
|
+
0%,
|
|
18
|
+
100% {
|
|
19
|
+
opacity: 1;
|
|
20
|
+
transform: scale(1);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
50% {
|
|
24
|
+
opacity: 0.6;
|
|
25
|
+
transform: scale(0.85);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ============================================
|
|
30
|
+
// Color scheme custom properties
|
|
31
|
+
// ============================================
|
|
32
|
+
|
|
33
|
+
.ui-badge {
|
|
34
|
+
// Default to primary
|
|
35
|
+
--_badge-color: var(--color-primary);
|
|
36
|
+
--_badge-on-color: var(--color-on-primary);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@each $scheme in shared.$semantic-colors {
|
|
40
|
+
.ui-badge[data-color='#{$scheme}'] {
|
|
41
|
+
--_badge-color: var(--color-#{$scheme});
|
|
42
|
+
--_badge-on-color: var(--color-on-#{$scheme});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ============================================
|
|
47
|
+
// Base
|
|
48
|
+
// ============================================
|
|
49
|
+
|
|
50
|
+
.ui-badge {
|
|
51
|
+
display: inline-flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
justify-content: center;
|
|
54
|
+
border-radius: var(--radius-pill);
|
|
55
|
+
font-weight: var(--font-weight-semibold);
|
|
56
|
+
line-height: 1;
|
|
57
|
+
white-space: nowrap;
|
|
58
|
+
// Superscript positioning — notification-count style when inline with text.
|
|
59
|
+
// Ignored in flex containers (where align-items handles alignment).
|
|
60
|
+
vertical-align: super;
|
|
61
|
+
flex-shrink: 0;
|
|
62
|
+
user-select: none;
|
|
63
|
+
// Crisp text on dark backgrounds (filled variant)
|
|
64
|
+
-webkit-font-smoothing: antialiased;
|
|
65
|
+
-moz-osx-font-smoothing: grayscale;
|
|
66
|
+
// Circle guarantee — single-char badges (counts like "3") render as circles.
|
|
67
|
+
// Height = 1em (line-height:1) + 2×padding-block; match min-width to height.
|
|
68
|
+
min-inline-size: calc(1em + 2 * var(--space-xs));
|
|
69
|
+
// Inline gap — small optical space between badge and preceding text.
|
|
70
|
+
// In flex containers gap handles spacing; this is additive but negligible.
|
|
71
|
+
margin-inline-start: calc(var(--space-xs) * 0.5);
|
|
72
|
+
// Truncation safety — ~20 chars at body font-size; prevents runaway
|
|
73
|
+
// user-generated labels from breaking inline layout.
|
|
74
|
+
max-inline-size: 12rem;
|
|
75
|
+
overflow: hidden;
|
|
76
|
+
text-overflow: ellipsis;
|
|
77
|
+
|
|
78
|
+
@include a11y.motion-safe {
|
|
79
|
+
transition:
|
|
80
|
+
var(--motion-transition-background), var(--motion-transition-color);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ============================================
|
|
85
|
+
// Sizes
|
|
86
|
+
// ============================================
|
|
87
|
+
|
|
88
|
+
// Font sizes derived from shared control-font-sizes (same scale as Button)
|
|
89
|
+
@each $size in shared.$control-sizes {
|
|
90
|
+
.ui-badge[data-size='#{$size}'] {
|
|
91
|
+
font-size: map.get(shared.$control-font-sizes, $size);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.ui-badge[data-size='sm'] {
|
|
96
|
+
padding-block: var(--space-xs);
|
|
97
|
+
padding-inline: var(--space-xs);
|
|
98
|
+
gap: var(--space-xs);
|
|
99
|
+
letter-spacing: shared.$label-letter-spacing;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.ui-badge[data-size='md'] {
|
|
103
|
+
padding-block: var(--space-xs);
|
|
104
|
+
padding-inline: var(--space-sm);
|
|
105
|
+
gap: var(--space-xs);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.ui-badge[data-size='lg'] {
|
|
109
|
+
padding-block: var(--space-xs);
|
|
110
|
+
padding-inline: var(--space-md);
|
|
111
|
+
gap: var(--space-sm);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ============================================
|
|
115
|
+
// Variants
|
|
116
|
+
// ============================================
|
|
117
|
+
|
|
118
|
+
// --- Filled ---
|
|
119
|
+
.ui-badge[data-variant='filled'] {
|
|
120
|
+
background-color: var(--_badge-color);
|
|
121
|
+
color: var(--_badge-on-color);
|
|
122
|
+
// Depth + inner glass highlight (same technique as Button solid)
|
|
123
|
+
@include glass.glass-highlight(var(--_badge-on-color), 15%, var(--shadow-xs));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// --- Outline ---
|
|
127
|
+
.ui-badge[data-variant='outline'] {
|
|
128
|
+
background-color: transparent;
|
|
129
|
+
color: var(--_badge-color);
|
|
130
|
+
// Visible border — thin width with partial opacity for subtlety
|
|
131
|
+
box-shadow: inset 0 0 0 var(--border-width-thin)
|
|
132
|
+
color-mix(in oklch, var(--_badge-color) 40%, transparent);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// --- Subtle ---
|
|
136
|
+
.ui-badge[data-variant='subtle'] {
|
|
137
|
+
// 18% tint (bumped from 12% for better contrast on light backgrounds)
|
|
138
|
+
background-color: color-mix(in oklch, var(--_badge-color) 18%, transparent);
|
|
139
|
+
color: var(--_badge-color);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// ============================================
|
|
143
|
+
// Dot mode
|
|
144
|
+
// ============================================
|
|
145
|
+
|
|
146
|
+
.ui-badge.ui-badge-dot {
|
|
147
|
+
// Fixed small circle — no text content, size prop ignored
|
|
148
|
+
padding: 0;
|
|
149
|
+
border-radius: 50%;
|
|
150
|
+
min-inline-size: auto;
|
|
151
|
+
max-inline-size: none;
|
|
152
|
+
margin-inline-start: 0;
|
|
153
|
+
overflow: visible;
|
|
154
|
+
inline-size: var(--space-sm);
|
|
155
|
+
block-size: var(--space-sm);
|
|
156
|
+
// Dots align center with adjacent text, not superscript.
|
|
157
|
+
vertical-align: middle;
|
|
158
|
+
|
|
159
|
+
// Dot is always filled — override outline/subtle to solid
|
|
160
|
+
background-color: var(--_badge-color);
|
|
161
|
+
color: var(--_badge-on-color);
|
|
162
|
+
box-shadow: none;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Pulsing dot — "live" indicator animation
|
|
166
|
+
.ui-badge.ui-badge-pulse {
|
|
167
|
+
@include a11y.motion-safe {
|
|
168
|
+
animation: pithy-badge-pulse var(--motion-duration-deliberate)
|
|
169
|
+
var(--motion-easing-standard) infinite;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Static fallback for reduced-motion — dimmed opacity hints "live" status
|
|
173
|
+
// without animation (component-specific; no global token for this)
|
|
174
|
+
@include a11y.motion-reduced {
|
|
175
|
+
opacity: 0.7;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ============================================
|
|
180
|
+
// High Contrast (forced-colors)
|
|
181
|
+
// ============================================
|
|
182
|
+
|
|
183
|
+
@include a11y.forced-colors {
|
|
184
|
+
.ui-badge {
|
|
185
|
+
border: var(--border-width-hairline) solid ButtonText;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.ui-badge[data-variant='filled'] {
|
|
189
|
+
forced-color-adjust: none;
|
|
190
|
+
background-color: ButtonText;
|
|
191
|
+
color: ButtonFace;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.ui-badge.ui-badge-dot {
|
|
195
|
+
forced-color-adjust: none;
|
|
196
|
+
background-color: ButtonText;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** @codex
|
|
2
|
+
{
|
|
3
|
+
"id": "pithy.ui-kit.heading",
|
|
4
|
+
"title": "<Heading> Content Component",
|
|
5
|
+
"category": "feature"
|
|
6
|
+
}
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactiveText } from '../../../shared/clickable';
|
|
9
|
+
import { type FontSize, type FontWeight } from '@pithyjs/design-system/typography';
|
|
10
|
+
import { type TextColor, type TextAlign } from '../../../shared/text';
|
|
11
|
+
/** @codexApi {"parent":"pithy.ui-kit.heading","name":"HeadingProps","stability":"stable","signature":"interface HeadingProps"} */
|
|
12
|
+
export interface HeadingProps {
|
|
13
|
+
/** Heading level — determines the HTML tag <h1>–<h6> (default: 2). All numeric values are rounded to the nearest integer and clamped to 1–6; non-numeric values fall back to 2. */
|
|
14
|
+
level?: number;
|
|
15
|
+
/** Font size override — maps to u-text-* utilities. When omitted, uses native heading level size. */
|
|
16
|
+
size?: FontSize;
|
|
17
|
+
/** Font weight override — sets data-weight attribute, styled via SCSS weight-scheme mixin. When omitted, uses native heading weight (semibold). */
|
|
18
|
+
weight?: FontWeight;
|
|
19
|
+
/** Text color — maps to --color-* design tokens (default: "text") */
|
|
20
|
+
color?: TextColor;
|
|
21
|
+
/** Text alignment — uses logical values for RTL support (default: none) */
|
|
22
|
+
align?: TextAlign;
|
|
23
|
+
/** Truncation: true = single-line ellipsis, number = line-clamp (default: false) */
|
|
24
|
+
truncate?: boolean | number;
|
|
25
|
+
/** Inline style string — forwarded to the rendered element */
|
|
26
|
+
style?: string;
|
|
27
|
+
/** Additional CSS class(es) — appended to the rendered element */
|
|
28
|
+
class?: string;
|
|
29
|
+
/** Visible heading text — static string or signal/computed accessor. When set,
|
|
30
|
+
* the text is used as the heading content and slot children are ignored.
|
|
31
|
+
* Omit to fall back to slot content. */
|
|
32
|
+
text?: ReactiveText;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Semantic heading component for page titles and section headers.
|
|
36
|
+
*
|
|
37
|
+
* Renders the correct <h1>–<h6> tag based on the `level` prop.
|
|
38
|
+
* Uses fluid typography tokens from the design system by default.
|
|
39
|
+
* Size and weight can be overridden independently of the heading level.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```html
|
|
43
|
+
* <Heading level="1">Page Title</Heading>
|
|
44
|
+
* <Heading level="3" size="'xl'" color="'primary'">Section</Heading>
|
|
45
|
+
* <Heading level="2" weight="'bold'" align="'center'">Centered</Heading>
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
/** @codexApi {"parent":"pithy.ui-kit.heading","name":"Heading","stability":"stable","signature":"(props?: HeadingProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
|
|
49
|
+
export declare function Heading({ level: rawLevel, size: rawSize, weight: rawWeight, color: rawColor, align: rawAlign, truncate, style, class: className, text, }?: HeadingProps): {
|
|
50
|
+
el: HTMLElement | DocumentFragment;
|
|
51
|
+
destroy: () => void;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=Heading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Heading.d.ts","sourceRoot":"","sources":["../../../../src/atoms/content/heading/Heading.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAIF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,UAAU,EAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAE9B,kIAAkI;AAClI,MAAM,WAAW,YAAY;IAC3B,mLAAmL;IACnL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,mJAAmJ;IACnJ,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;6CAEyC;IACzC,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH,4LAA4L;AAC5L,wBAAgB,OAAO,CAAC,EACtB,KAAK,EAAE,QAAY,EACnB,IAAI,EAAE,OAAmB,EACzB,MAAM,EAAE,SAAqB,EAC7B,KAAK,EAAE,QAAiB,EACxB,KAAK,EAAE,QAAoB,EAC3B,QAAgB,EAChB,KAAiB,EACjB,KAAK,EAAE,SAAqB,EAC5B,IAAgB,GACjB,GAAE,YAAiB,GAAG;IACrB,EAAE,EAAE,WAAW,GAAG,gBAAgB,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAyIA"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/** @codex
|
|
2
|
+
{
|
|
3
|
+
"id": "pithy.ui-kit.heading",
|
|
4
|
+
"title": "<Heading> Content Component",
|
|
5
|
+
"category": "feature"
|
|
6
|
+
}
|
|
7
|
+
*/
|
|
8
|
+
import { renderChildren } from '@pithyjs/core';
|
|
9
|
+
import { effect } from '@pithyjs/signals';
|
|
10
|
+
import { FONT_SIZES, FONT_WEIGHTS, } from '@pithyjs/design-system/typography';
|
|
11
|
+
import { TEXT_COLORS, TEXT_ALIGNS, SIZE_CLASS, } from '../../../shared/text';
|
|
12
|
+
/**
|
|
13
|
+
* Semantic heading component for page titles and section headers.
|
|
14
|
+
*
|
|
15
|
+
* Renders the correct <h1>–<h6> tag based on the `level` prop.
|
|
16
|
+
* Uses fluid typography tokens from the design system by default.
|
|
17
|
+
* Size and weight can be overridden independently of the heading level.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```html
|
|
21
|
+
* <Heading level="1">Page Title</Heading>
|
|
22
|
+
* <Heading level="3" size="'xl'" color="'primary'">Section</Heading>
|
|
23
|
+
* <Heading level="2" weight="'bold'" align="'center'">Centered</Heading>
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
/** @codexApi {"parent":"pithy.ui-kit.heading","name":"Heading","stability":"stable","signature":"(props?: HeadingProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
|
|
27
|
+
export function Heading({ level: rawLevel = 2, size: rawSize = undefined, weight: rawWeight = undefined, color: rawColor = 'text', align: rawAlign = undefined, truncate = false, style = undefined, class: className = undefined, text = undefined, } = {}) {
|
|
28
|
+
const validLevel = typeof rawLevel === 'number' &&
|
|
29
|
+
Number.isInteger(rawLevel) &&
|
|
30
|
+
rawLevel >= 1 &&
|
|
31
|
+
rawLevel <= 6;
|
|
32
|
+
const validSize = rawSize === undefined ||
|
|
33
|
+
FONT_SIZES.includes(rawSize);
|
|
34
|
+
const validWeight = rawWeight === undefined ||
|
|
35
|
+
FONT_WEIGHTS.includes(rawWeight);
|
|
36
|
+
const validColor = TEXT_COLORS.includes(rawColor);
|
|
37
|
+
const validAlign = rawAlign === undefined ||
|
|
38
|
+
TEXT_ALIGNS.includes(rawAlign);
|
|
39
|
+
if (import.meta.env?.DEV) {
|
|
40
|
+
if (!validLevel) {
|
|
41
|
+
console.warn(`[<Heading>] Invalid level: "${rawLevel}". Expected an integer between 1 and 6. ${typeof rawLevel === 'number' ? 'Rounding and clamping to nearest valid level.' : 'Falling back to 2.'}`);
|
|
42
|
+
}
|
|
43
|
+
if (!validSize) {
|
|
44
|
+
const valid = FONT_SIZES.join(', ');
|
|
45
|
+
console.warn(`[<Heading>] Invalid size: "${rawSize}". Expected one of: ${valid}. Ignoring.`);
|
|
46
|
+
}
|
|
47
|
+
if (!validWeight) {
|
|
48
|
+
const valid = FONT_WEIGHTS.join(', ');
|
|
49
|
+
console.warn(`[<Heading>] Invalid weight: "${rawWeight}". Expected one of: ${valid}. Ignoring.`);
|
|
50
|
+
}
|
|
51
|
+
if (!validColor) {
|
|
52
|
+
const valid = TEXT_COLORS.join(', ');
|
|
53
|
+
console.warn(`[<Heading>] Invalid color: "${rawColor}". Expected one of: ${valid}. Falling back to "text".`);
|
|
54
|
+
}
|
|
55
|
+
if (!validAlign) {
|
|
56
|
+
const valid = TEXT_ALIGNS.join(', ');
|
|
57
|
+
console.warn(`[<Heading>] Invalid align: "${rawAlign}". Expected one of: ${valid}. Ignoring.`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Clamp level to 1–6, falling back to a safe default when non-numeric
|
|
61
|
+
const numericRawLevel = Number(rawLevel);
|
|
62
|
+
const clampedLevel = Number.isNaN(numericRawLevel)
|
|
63
|
+
? 2
|
|
64
|
+
: Math.min(Math.max(Math.round(numericRawLevel), 1), 6);
|
|
65
|
+
const level = validLevel ? rawLevel : clampedLevel;
|
|
66
|
+
const size = validSize ? rawSize : undefined;
|
|
67
|
+
const weight = validWeight ? rawWeight : undefined;
|
|
68
|
+
const color = validColor ? rawColor : 'text';
|
|
69
|
+
const align = validAlign ? rawAlign : undefined;
|
|
70
|
+
// Create element
|
|
71
|
+
const tag = `h${level}`;
|
|
72
|
+
const el = document.createElement(tag);
|
|
73
|
+
// Base class
|
|
74
|
+
el.classList.add('ui-heading');
|
|
75
|
+
// Size override — when provided, overrides native heading level size
|
|
76
|
+
if (size) {
|
|
77
|
+
el.classList.add(SIZE_CLASS[size]);
|
|
78
|
+
}
|
|
79
|
+
// Weight override — when provided, overrides native heading weight (semibold)
|
|
80
|
+
if (weight) {
|
|
81
|
+
el.setAttribute('data-weight', weight);
|
|
82
|
+
}
|
|
83
|
+
// Color via data attribute (styled in heading.scss)
|
|
84
|
+
el.setAttribute('data-color', color);
|
|
85
|
+
// Alignment via data attribute (styled in heading.scss with logical properties)
|
|
86
|
+
if (align) {
|
|
87
|
+
el.setAttribute('data-align', align);
|
|
88
|
+
}
|
|
89
|
+
// Truncation
|
|
90
|
+
if (truncate === true) {
|
|
91
|
+
el.classList.add('u-truncate');
|
|
92
|
+
}
|
|
93
|
+
else if (typeof truncate === 'number' && truncate > 0) {
|
|
94
|
+
const clampValue = Math.min(Math.max(Math.round(truncate), 1), 4);
|
|
95
|
+
el.classList.add(`u-line-clamp-${clampValue}`);
|
|
96
|
+
}
|
|
97
|
+
// Pass-through HTML attributes
|
|
98
|
+
if (style) {
|
|
99
|
+
el.setAttribute('style', style);
|
|
100
|
+
}
|
|
101
|
+
if (className) {
|
|
102
|
+
el.classList.add(...className.split(/\s+/).filter(Boolean));
|
|
103
|
+
}
|
|
104
|
+
// `text` prop wins over slot content — they're alternate ways to set the
|
|
105
|
+
// heading, not concatenated. Skip renderChildren() when text is set.
|
|
106
|
+
const isTextFn = typeof text === 'function';
|
|
107
|
+
const readText = () => isTextFn
|
|
108
|
+
? text()
|
|
109
|
+
: text;
|
|
110
|
+
let textNode;
|
|
111
|
+
let destroyChildren;
|
|
112
|
+
const staticText = isTextFn ? undefined : readText();
|
|
113
|
+
if (isTextFn) {
|
|
114
|
+
textNode = document.createTextNode('');
|
|
115
|
+
el.appendChild(textNode);
|
|
116
|
+
}
|
|
117
|
+
else if (typeof staticText === 'string') {
|
|
118
|
+
textNode = document.createTextNode(staticText);
|
|
119
|
+
el.appendChild(textNode);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const { el: childFragment, destroy } = renderChildren();
|
|
123
|
+
destroyChildren = destroy;
|
|
124
|
+
el.appendChild(childFragment);
|
|
125
|
+
}
|
|
126
|
+
const cleanupTextEffect = isTextFn
|
|
127
|
+
? effect(() => {
|
|
128
|
+
const v = readText();
|
|
129
|
+
if (textNode)
|
|
130
|
+
textNode.nodeValue = typeof v === 'string' ? v : '';
|
|
131
|
+
})
|
|
132
|
+
: undefined;
|
|
133
|
+
return {
|
|
134
|
+
el,
|
|
135
|
+
destroy: () => {
|
|
136
|
+
cleanupTextEffect?.();
|
|
137
|
+
destroyChildren?.();
|
|
138
|
+
el.replaceChildren();
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=Heading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Heading.js","sourceRoot":"","sources":["../../../../src/atoms/content/heading/Heading.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/// Heading component styles
|
|
2
|
+
/// Uses design system color tokens — zero raw values.
|
|
3
|
+
/// Color is driven by data-color attribute, alignment by data-align with logical properties.
|
|
4
|
+
///
|
|
5
|
+
/// @group atoms/content
|
|
6
|
+
|
|
7
|
+
@use '../mixins' as content;
|
|
8
|
+
|
|
9
|
+
// ============================================
|
|
10
|
+
// Base styles
|
|
11
|
+
// ============================================
|
|
12
|
+
|
|
13
|
+
.ui-heading {
|
|
14
|
+
// Default: use the "text" design token (matches HeadingProps color default)
|
|
15
|
+
color: var(--color-text);
|
|
16
|
+
// Reset margins -- external spacing controlled by parent layout
|
|
17
|
+
margin: 0;
|
|
18
|
+
// Prevent long words/URLs from overflowing on small screens.
|
|
19
|
+
// Use break-word (not anywhere) — anywhere affects min-content sizing
|
|
20
|
+
// in flex/grid containers, potentially collapsing layout.
|
|
21
|
+
overflow-wrap: break-word;
|
|
22
|
+
// Suppress browser default focus outline — headings are not interactive.
|
|
23
|
+
// They may receive programmatic focus via aria-labelledby or skip-links,
|
|
24
|
+
// but the thick default outline is visually disruptive and unnecessary.
|
|
25
|
+
&:focus:not(:focus-visible) {
|
|
26
|
+
outline: none;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ============================================
|
|
31
|
+
// Color scheme + Alignment (shared)
|
|
32
|
+
// ============================================
|
|
33
|
+
|
|
34
|
+
@include content.color-scheme('.ui-heading');
|
|
35
|
+
@include content.weight-scheme('.ui-heading');
|
|
36
|
+
@include content.alignment('.ui-heading');
|
|
37
|
+
|
|
38
|
+
// ============================================
|
|
39
|
+
// Accessibility (shared)
|
|
40
|
+
// ============================================
|
|
41
|
+
|
|
42
|
+
@include content.forced-colors('.ui-heading');
|
|
43
|
+
@include content.high-contrast('.ui-heading');
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** @codex
|
|
2
|
+
{
|
|
3
|
+
"id": "pithy.ui-kit.icon",
|
|
4
|
+
"title": "<Icon> Content Component",
|
|
5
|
+
"category": "feature"
|
|
6
|
+
}
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactiveText } from '../../../shared/clickable';
|
|
9
|
+
import { type IconSizeLevel } from '@pithyjs/design-system/iconography';
|
|
10
|
+
import { type TextColor } from '../../../shared/text';
|
|
11
|
+
interface IconPropsBase {
|
|
12
|
+
/**
|
|
13
|
+
* Icon identifier — sets `data-icon` attribute for styling/registry lookup.
|
|
14
|
+
* Pass a function (e.g. `() => signal()`) to make the icon swap reactively.
|
|
15
|
+
*/
|
|
16
|
+
name?: ReactiveText;
|
|
17
|
+
/** Icon size — maps to --icon-size-* design tokens (default: "md") */
|
|
18
|
+
size?: IconSizeLevel;
|
|
19
|
+
/**
|
|
20
|
+
* Icon color — maps to --color-* design tokens.
|
|
21
|
+
*
|
|
22
|
+
* Defaults to `undefined` (inherits via `currentColor` from the parent element).
|
|
23
|
+
* This differs from Text/Heading which default to `"text"` because icons are
|
|
24
|
+
* most commonly used inline alongside text and should match the surrounding
|
|
25
|
+
* text color automatically without an explicit token.
|
|
26
|
+
*/
|
|
27
|
+
color?: TextColor;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Props for the Icon component.
|
|
31
|
+
*
|
|
32
|
+
* TypeScript enforces `label` when `decorative` is false (default).
|
|
33
|
+
*/
|
|
34
|
+
/** @codexApi {"parent":"pithy.ui-kit.icon","name":"IconProps","stability":"stable","signature":"type IconProps = (SemanticIconProps | DecorativeIconProps)"} */
|
|
35
|
+
export type IconProps = (IconPropsBase & {
|
|
36
|
+
/** Whether the icon is purely decorative (default: false) */
|
|
37
|
+
decorative?: false;
|
|
38
|
+
/** Accessible label — required for semantic icons */
|
|
39
|
+
label: string;
|
|
40
|
+
}) | (IconPropsBase & {
|
|
41
|
+
/** Whether the icon is purely decorative */
|
|
42
|
+
decorative: true;
|
|
43
|
+
/** Accessible label — optional for decorative icons */
|
|
44
|
+
label?: string;
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Inline icon wrapper with accessible sizing and labelling.
|
|
48
|
+
*
|
|
49
|
+
* Renders children (inline SVG or icon markup) inside a `<span>` with
|
|
50
|
+
* design-system icon size tokens and proper ARIA attributes.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```html
|
|
54
|
+
* <Icon label="'Search'" size="'lg'">
|
|
55
|
+
* <svg>...</svg>
|
|
56
|
+
* </Icon>
|
|
57
|
+
* <Icon decorative="true" size="'sm'">
|
|
58
|
+
* <svg>...</svg>
|
|
59
|
+
* </Icon>
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
/** @codexApi {"parent":"pithy.ui-kit.icon","name":"Icon","stability":"stable","signature":"(props: IconProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
|
|
63
|
+
export declare function Icon({ name, size: rawSize, color: rawColor, decorative, label, }: IconProps): {
|
|
64
|
+
el: HTMLElement | DocumentFragment;
|
|
65
|
+
destroy: () => void;
|
|
66
|
+
};
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=Icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icon.d.ts","sourceRoot":"","sources":["../../../../src/atoms/content/icon/Icon.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAKF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAInE,UAAU,aAAa;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,sEAAsE;IACtE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;;;GAIG;AACH,gKAAgK;AAChK,MAAM,MAAM,SAAS,GACjB,CAAC,aAAa,GAAG;IACf,6DAA6D;IAC7D,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,GACF,CAAC,aAAa,GAAG;IACf,4CAA4C;IAC5C,UAAU,EAAE,IAAI,CAAC;IACjB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEP;;;;;;;;;;;;;;;GAeG;AACH,kLAAkL;AAClL,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,IAAI,EAAE,OAAc,EACpB,KAAK,EAAE,QAAQ,EACf,UAAkB,EAClB,KAAK,GACN,EAAE,SAAS,GAAG;IACb,EAAE,EAAE,WAAW,GAAG,gBAAgB,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAyHA"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/** @codex
|
|
2
|
+
{
|
|
3
|
+
"id": "pithy.ui-kit.icon",
|
|
4
|
+
"title": "<Icon> Content Component",
|
|
5
|
+
"category": "feature"
|
|
6
|
+
}
|
|
7
|
+
*/
|
|
8
|
+
import { renderChildren } from '@pithyjs/core';
|
|
9
|
+
import { captureSlot } from '../../../shared/slots';
|
|
10
|
+
import { effect } from '@pithyjs/signals';
|
|
11
|
+
import { ICON_SIZE_LEVELS, } from '@pithyjs/design-system/iconography';
|
|
12
|
+
import { TEXT_COLORS } from '../../../shared/text';
|
|
13
|
+
import { ICON_SIZE_CLASS } from '../../../shared/icon';
|
|
14
|
+
import { resolveIconSvg } from './resolveIconSvg';
|
|
15
|
+
/**
|
|
16
|
+
* Inline icon wrapper with accessible sizing and labelling.
|
|
17
|
+
*
|
|
18
|
+
* Renders children (inline SVG or icon markup) inside a `<span>` with
|
|
19
|
+
* design-system icon size tokens and proper ARIA attributes.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```html
|
|
23
|
+
* <Icon label="'Search'" size="'lg'">
|
|
24
|
+
* <svg>...</svg>
|
|
25
|
+
* </Icon>
|
|
26
|
+
* <Icon decorative="true" size="'sm'">
|
|
27
|
+
* <svg>...</svg>
|
|
28
|
+
* </Icon>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
/** @codexApi {"parent":"pithy.ui-kit.icon","name":"Icon","stability":"stable","signature":"(props: IconProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
|
|
32
|
+
export function Icon({ name, size: rawSize = 'md', color: rawColor, decorative = false, label, }) {
|
|
33
|
+
const validSize = ICON_SIZE_LEVELS.includes(rawSize);
|
|
34
|
+
const validColor = rawColor === undefined ||
|
|
35
|
+
TEXT_COLORS.includes(rawColor);
|
|
36
|
+
if (import.meta.env?.DEV) {
|
|
37
|
+
if (!validSize) {
|
|
38
|
+
const valid = ICON_SIZE_LEVELS.join(', ');
|
|
39
|
+
console.warn(`[<Icon>] Invalid size: "${rawSize}". Expected one of: ${valid}. Falling back to "md".`);
|
|
40
|
+
}
|
|
41
|
+
if (!validColor) {
|
|
42
|
+
const valid = TEXT_COLORS.join(', ');
|
|
43
|
+
console.warn(`[<Icon>] Invalid color: "${rawColor}". Expected one of: ${valid}. Ignoring.`);
|
|
44
|
+
}
|
|
45
|
+
if (!decorative && !label?.trim()) {
|
|
46
|
+
console.warn(`[<Icon>] Semantic icon (decorative=false) requires a label for accessibility. Pass label="..." or set decorative="true".`);
|
|
47
|
+
}
|
|
48
|
+
if (decorative && label) {
|
|
49
|
+
console.warn(`[<Icon>] Decorative icon has a label="${label}". The label will be ignored because aria-hidden="true" takes precedence.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const size = validSize ? rawSize : 'md';
|
|
53
|
+
const color = validColor ? rawColor : undefined;
|
|
54
|
+
// Create element
|
|
55
|
+
const el = document.createElement('span');
|
|
56
|
+
el.classList.add('ui-icon', ICON_SIZE_CLASS[size]);
|
|
57
|
+
// Color via data attribute (styled in icon.scss)
|
|
58
|
+
if (color) {
|
|
59
|
+
el.setAttribute('data-color', color);
|
|
60
|
+
}
|
|
61
|
+
// Accessibility
|
|
62
|
+
if (decorative) {
|
|
63
|
+
el.setAttribute('aria-hidden', 'true');
|
|
64
|
+
el.setAttribute('role', 'none');
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const trimmedLabel = label?.trim();
|
|
68
|
+
if (trimmedLabel) {
|
|
69
|
+
// Valid semantic icon: role="img" with aria-label
|
|
70
|
+
el.setAttribute('role', 'img');
|
|
71
|
+
el.setAttribute('aria-label', trimmedLabel);
|
|
72
|
+
}
|
|
73
|
+
// If label is empty/whitespace, we intentionally skip role="img"
|
|
74
|
+
// to avoid a broken ARIA state (role="img" without aria-label).
|
|
75
|
+
// The DEV warning above already alerts developers to provide a label.
|
|
76
|
+
}
|
|
77
|
+
// Content projection (inline SVG or icon markup)
|
|
78
|
+
// Children always take precedence over registry resolution.
|
|
79
|
+
const { el: childFragment, destroy } = renderChildren();
|
|
80
|
+
const hasChildren = childFragment.children.length > 0 || !!childFragment.textContent?.trim();
|
|
81
|
+
// Resolve `name` once for static strings, or reactively for getter functions.
|
|
82
|
+
// Reactive name only drives sprite resolution — children, when present, win.
|
|
83
|
+
const readName = () => (typeof name === 'function' ? name() : name)?.trim() || undefined;
|
|
84
|
+
const mountSprite = (next, previousSvg) => {
|
|
85
|
+
if (next)
|
|
86
|
+
el.setAttribute('data-icon', next);
|
|
87
|
+
else
|
|
88
|
+
el.removeAttribute('data-icon');
|
|
89
|
+
const resolved = resolveIconSvg(next);
|
|
90
|
+
if (previousSvg)
|
|
91
|
+
previousSvg.remove();
|
|
92
|
+
el.removeAttribute('data-icon-missing');
|
|
93
|
+
if (!resolved)
|
|
94
|
+
return null;
|
|
95
|
+
el.appendChild(resolved.svg);
|
|
96
|
+
if (resolved.missing && next)
|
|
97
|
+
el.setAttribute('data-icon-missing', next);
|
|
98
|
+
return resolved.svg;
|
|
99
|
+
};
|
|
100
|
+
let disposeNameEffect;
|
|
101
|
+
captureSlot(el, 'default');
|
|
102
|
+
if (hasChildren) {
|
|
103
|
+
// Children win — sprite resolution skipped; data-icon set from raw value.
|
|
104
|
+
el.appendChild(childFragment);
|
|
105
|
+
const initial = readName();
|
|
106
|
+
if (initial)
|
|
107
|
+
el.setAttribute('data-icon', initial);
|
|
108
|
+
}
|
|
109
|
+
else if (typeof name === 'function') {
|
|
110
|
+
// Reactive: track the getter, diff against previous name to avoid
|
|
111
|
+
// tearing down and rebuilding the SVG on no-op effect runs.
|
|
112
|
+
let currentSvg = null;
|
|
113
|
+
let lastName;
|
|
114
|
+
let initialized = false;
|
|
115
|
+
disposeNameEffect = effect(() => {
|
|
116
|
+
const next = readName();
|
|
117
|
+
if (initialized && next === lastName)
|
|
118
|
+
return;
|
|
119
|
+
initialized = true;
|
|
120
|
+
lastName = next;
|
|
121
|
+
currentSvg = mountSprite(next, currentSvg);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Static string — single sync mount, no effect overhead.
|
|
126
|
+
mountSprite(readName(), null);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
el,
|
|
130
|
+
destroy: () => {
|
|
131
|
+
disposeNameEffect?.();
|
|
132
|
+
destroy();
|
|
133
|
+
el.replaceChildren();
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=Icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icon.js","sourceRoot":"","sources":["../../../../src/atoms/content/icon/Icon.ts"],"names":[],"mappings":"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"}
|