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