@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,194 @@
|
|
|
1
|
+
/** @codex
|
|
2
|
+
{
|
|
3
|
+
"id": "pithy.ui-kit.smart-container",
|
|
4
|
+
"title": "<SmartContainer> Layout Component",
|
|
5
|
+
"category": "feature"
|
|
6
|
+
}
|
|
7
|
+
*/
|
|
8
|
+
import { renderChildren } from '@pithyjs/core';
|
|
9
|
+
import { captureSlot } from '../shared/slots';
|
|
10
|
+
import { GAP_CLASS, ALIGN_CLASS, JUSTIFY_CLASS, CSS_LENGTH_PATTERN, } from '../shared/common';
|
|
11
|
+
import { GRID_COLS_CLASS, RESPONSIVE_GRID_COLS } from '../shared/grid';
|
|
12
|
+
import { RECIPE_ITEMS, DENSITY_ITEMS, DENSITY_RATIO, } from '../shared/smart-container';
|
|
13
|
+
import { applyElementDensity } from '@pithyjs/design-system';
|
|
14
|
+
function clampLanes(n) {
|
|
15
|
+
if (!Number.isFinite(n))
|
|
16
|
+
return 3;
|
|
17
|
+
return Math.max(2, Math.min(6, Math.round(n)));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build classes for the equal-cards recipe based on lanes count.
|
|
21
|
+
* Maps lane count to responsive grid column breakpoint classes.
|
|
22
|
+
*/
|
|
23
|
+
function buildLaneClasses(lanes) {
|
|
24
|
+
const classes = [GRID_COLS_CLASS[1]]; // base: 1 column
|
|
25
|
+
if (lanes >= 2)
|
|
26
|
+
classes.push(RESPONSIVE_GRID_COLS.sm[2]);
|
|
27
|
+
if (lanes >= 3)
|
|
28
|
+
classes.push(RESPONSIVE_GRID_COLS.md[3]);
|
|
29
|
+
// For lanes=6 use lg:5 to avoid a 4→6 jump at xl
|
|
30
|
+
if (lanes >= 4 && lanes <= 5)
|
|
31
|
+
classes.push(RESPONSIVE_GRID_COLS.lg[4]);
|
|
32
|
+
if (lanes === 6)
|
|
33
|
+
classes.push(RESPONSIVE_GRID_COLS.lg[5]);
|
|
34
|
+
if (lanes >= 5)
|
|
35
|
+
classes.push(RESPONSIVE_GRID_COLS.xl[Math.min(lanes, 6)]);
|
|
36
|
+
return classes;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Higher-level layout component providing 5 opinionated responsive
|
|
40
|
+
* layout recipes that adapt to container width via CSS container queries.
|
|
41
|
+
*
|
|
42
|
+
* Unlike Grid/Stack (low-level primitives), SmartContainer provides
|
|
43
|
+
* common layout patterns that "just work" responsively.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```html
|
|
47
|
+
* <!-- Auto-grid: items flow into columns based on minimum width -->
|
|
48
|
+
* <SmartContainer recipe="'auto-grid'" minItem="'14rem'" gap="'lg'">
|
|
49
|
+
* <div>Card 1</div>
|
|
50
|
+
* <div>Card 2</div>
|
|
51
|
+
* <div>Card 3</div>
|
|
52
|
+
* </SmartContainer>
|
|
53
|
+
*
|
|
54
|
+
* <!-- Stack-to-row: vertical on mobile, horizontal on wider containers -->
|
|
55
|
+
* <SmartContainer recipe="'stack-to-row'">
|
|
56
|
+
* <div>Left</div>
|
|
57
|
+
* <div>Right</div>
|
|
58
|
+
* </SmartContainer>
|
|
59
|
+
*
|
|
60
|
+
* <!-- Equal cards: responsive grid capped at N columns -->
|
|
61
|
+
* <SmartContainer recipe="'equal-cards'" lanes="4">
|
|
62
|
+
* <div>Card 1</div>
|
|
63
|
+
* <div>Card 2</div>
|
|
64
|
+
* <div>Card 3</div>
|
|
65
|
+
* <div>Card 4</div>
|
|
66
|
+
* </SmartContainer>
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
/** @codexApi {"parent":"pithy.ui-kit.smart-container","name":"SmartContainer","stability":"stable","signature":"(props?: SmartContainerProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
|
|
70
|
+
export function SmartContainer({ recipe: rawRecipe = 'auto-grid', minItem = undefined, gap: rawGap = 'md', density: rawDensity = 'normal', align: rawAlign = undefined, justify: rawJustify = undefined, lanes: rawLanes = 3, as = 'div', } = {}) {
|
|
71
|
+
// Validate and fall back unconditionally (not just DEV) to prevent undefined class names in production
|
|
72
|
+
const hasOwn = Object.prototype.hasOwnProperty;
|
|
73
|
+
const validRecipe = RECIPE_ITEMS.includes(rawRecipe);
|
|
74
|
+
const validGap = hasOwn.call(GAP_CLASS, rawGap);
|
|
75
|
+
const validDensity = DENSITY_ITEMS.includes(rawDensity);
|
|
76
|
+
const validAlign = rawAlign == null || hasOwn.call(ALIGN_CLASS, rawAlign);
|
|
77
|
+
const validJustify = rawJustify == null || hasOwn.call(JUSTIFY_CLASS, rawJustify);
|
|
78
|
+
if (import.meta.env?.DEV) {
|
|
79
|
+
if (!validRecipe) {
|
|
80
|
+
const valid = RECIPE_ITEMS.join(', ');
|
|
81
|
+
console.warn(`[<SmartContainer>] Invalid recipe value: "${rawRecipe}". Expected one of: ${valid}. Falling back to "auto-grid".`);
|
|
82
|
+
}
|
|
83
|
+
if (!validGap) {
|
|
84
|
+
const valid = Object.keys(GAP_CLASS).join(', ');
|
|
85
|
+
console.warn(`[<SmartContainer>] Invalid gap value: "${rawGap}". Expected one of: ${valid}. Falling back to "md".`);
|
|
86
|
+
}
|
|
87
|
+
if (!validDensity) {
|
|
88
|
+
const valid = DENSITY_ITEMS.join(', ');
|
|
89
|
+
console.warn(`[<SmartContainer>] Invalid density value: "${rawDensity}". Expected one of: ${valid}. Falling back to "normal".`);
|
|
90
|
+
}
|
|
91
|
+
if (!validAlign) {
|
|
92
|
+
const valid = Object.keys(ALIGN_CLASS).join(', ');
|
|
93
|
+
console.warn(`[<SmartContainer>] Invalid align value: "${rawAlign}". Expected one of: ${valid}. Ignoring.`);
|
|
94
|
+
}
|
|
95
|
+
if (!validJustify) {
|
|
96
|
+
const valid = Object.keys(JUSTIFY_CLASS).join(', ');
|
|
97
|
+
console.warn(`[<SmartContainer>] Invalid justify value: "${rawJustify}". Expected one of: ${valid}. Ignoring.`);
|
|
98
|
+
}
|
|
99
|
+
if (rawRecipe !== 'equal-cards' && rawLanes !== 3) {
|
|
100
|
+
console.warn(`[<SmartContainer>] lanes prop is only used with the "equal-cards" recipe. Ignoring.`);
|
|
101
|
+
}
|
|
102
|
+
if (rawRecipe !== 'auto-grid' && minItem != null) {
|
|
103
|
+
console.warn(`[<SmartContainer>] minItem prop is only used with the "auto-grid" recipe. Ignoring.`);
|
|
104
|
+
}
|
|
105
|
+
if ((rawRecipe === 'auto-grid' || !validRecipe) &&
|
|
106
|
+
minItem != null &&
|
|
107
|
+
!CSS_LENGTH_PATTERN.test(minItem)) {
|
|
108
|
+
console.warn(`[<SmartContainer>] Suspicious minItem value: "${minItem}". Expected a CSS length (e.g. "250px", "14rem"). Note: fr units are not valid inside minmax().`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const recipe = validRecipe ? rawRecipe : 'auto-grid';
|
|
112
|
+
const gap = validGap ? rawGap : 'md';
|
|
113
|
+
const density = validDensity ? rawDensity : 'normal';
|
|
114
|
+
const align = validAlign ? rawAlign : undefined;
|
|
115
|
+
const justify = validJustify ? rawJustify : undefined;
|
|
116
|
+
const lanes = clampLanes(rawLanes);
|
|
117
|
+
// Common classes for all recipes
|
|
118
|
+
const gapClass = GAP_CLASS[gap];
|
|
119
|
+
const alignClass = align ? ALIGN_CLASS[align] : '';
|
|
120
|
+
const justifyClass = justify ? JUSTIFY_CLASS[justify] : '';
|
|
121
|
+
// Build recipe-specific inner classes
|
|
122
|
+
let innerClasses;
|
|
123
|
+
switch (recipe) {
|
|
124
|
+
case 'auto-grid':
|
|
125
|
+
innerClasses = [
|
|
126
|
+
'u-grid',
|
|
127
|
+
'u-grid-auto-fit',
|
|
128
|
+
gapClass,
|
|
129
|
+
alignClass,
|
|
130
|
+
justifyClass,
|
|
131
|
+
];
|
|
132
|
+
break;
|
|
133
|
+
case 'stack-to-row':
|
|
134
|
+
innerClasses = ['u-sc-stack-to-row', gapClass, alignClass, justifyClass];
|
|
135
|
+
break;
|
|
136
|
+
case 'row-wrap':
|
|
137
|
+
innerClasses = [
|
|
138
|
+
'u-flex',
|
|
139
|
+
'u-flex-wrap',
|
|
140
|
+
gapClass,
|
|
141
|
+
alignClass,
|
|
142
|
+
justifyClass,
|
|
143
|
+
];
|
|
144
|
+
break;
|
|
145
|
+
case 'sidebar':
|
|
146
|
+
innerClasses = ['u-sc-sidebar', gapClass, alignClass, justifyClass];
|
|
147
|
+
break;
|
|
148
|
+
case 'equal-cards':
|
|
149
|
+
innerClasses = [
|
|
150
|
+
'u-grid',
|
|
151
|
+
...buildLaneClasses(lanes),
|
|
152
|
+
...(align ? [] : ['u-items-stretch']),
|
|
153
|
+
gapClass,
|
|
154
|
+
alignClass,
|
|
155
|
+
justifyClass,
|
|
156
|
+
];
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
// Add child control class for grid-based recipes
|
|
160
|
+
if (recipe === 'auto-grid' ||
|
|
161
|
+
recipe === 'sidebar' ||
|
|
162
|
+
recipe === 'equal-cards') {
|
|
163
|
+
innerClasses.push('u-sc-child-span');
|
|
164
|
+
}
|
|
165
|
+
// Add collapse control class for all recipes
|
|
166
|
+
innerClasses.push('u-sc-child-collapse');
|
|
167
|
+
// Filter empty strings
|
|
168
|
+
innerClasses = innerClasses.filter(Boolean);
|
|
169
|
+
// Compile children through full pipeline
|
|
170
|
+
const { el: childFragment, destroy } = renderChildren();
|
|
171
|
+
// Double-nesting: outer = container-type, inner = recipe layout
|
|
172
|
+
const outer = document.createElement(as);
|
|
173
|
+
outer.classList.add('u-container-inline');
|
|
174
|
+
const inner = document.createElement('div');
|
|
175
|
+
for (const cls of innerClasses)
|
|
176
|
+
inner.classList.add(cls);
|
|
177
|
+
// Set CSS variables
|
|
178
|
+
if (recipe === 'auto-grid' && minItem) {
|
|
179
|
+
inner.style.setProperty('--grid-auto-min', minItem);
|
|
180
|
+
}
|
|
181
|
+
applyElementDensity(outer, DENSITY_RATIO[density]);
|
|
182
|
+
captureSlot(inner, 'default');
|
|
183
|
+
inner.appendChild(childFragment);
|
|
184
|
+
outer.appendChild(inner);
|
|
185
|
+
return {
|
|
186
|
+
el: outer,
|
|
187
|
+
destroy: () => {
|
|
188
|
+
destroy();
|
|
189
|
+
inner.replaceChildren();
|
|
190
|
+
outer.replaceChildren();
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=SmartContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SmartContainer.js","sourceRoot":"","sources":["../../src/layout/SmartContainer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** @codex
|
|
2
|
+
{
|
|
3
|
+
"id": "pithy.ui-kit.stack",
|
|
4
|
+
"title": "<Stack> Layout Component",
|
|
5
|
+
"category": "feature"
|
|
6
|
+
}
|
|
7
|
+
*/
|
|
8
|
+
import { type AlignItems } from '../shared/common';
|
|
9
|
+
import { type Orientation } from '../shared/types';
|
|
10
|
+
import type { SpacingSize } from '@pithyjs/design-system';
|
|
11
|
+
/** @codexApi {"parent":"pithy.ui-kit.stack","name":"StackProps","stability":"stable","signature":"interface StackProps"} */
|
|
12
|
+
export interface StackProps {
|
|
13
|
+
/** Stack direction (default: "vertical") */
|
|
14
|
+
direction?: Orientation;
|
|
15
|
+
/** Gap between children — maps to u-gap-* utilities (default: "md") */
|
|
16
|
+
gap?: SpacingSize;
|
|
17
|
+
/** Cross-axis alignment — maps to u-items-* utilities (default: "stretch") */
|
|
18
|
+
align?: AlignItems;
|
|
19
|
+
/** Whether children wrap to next line (default: false) */
|
|
20
|
+
wrap?: boolean;
|
|
21
|
+
/** Reverse the stacking order (default: false) */
|
|
22
|
+
reverse?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Minimum child width before wrapping (CSS length, e.g. "200px", "15rem").
|
|
25
|
+
* When set on a horizontal stack, enables fluid responsive behavior:
|
|
26
|
+
* children will wrap to a new row when they can't maintain this minimum
|
|
27
|
+
* width. Automatically enables `wrap`. (default: undefined — no fluid behavior)
|
|
28
|
+
*/
|
|
29
|
+
minChildWidth?: string;
|
|
30
|
+
/** HTML tag to render (default: "div") */
|
|
31
|
+
as?: keyof HTMLElementTagNameMap;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Layout atom that arranges children in a vertical or horizontal stack.
|
|
35
|
+
*
|
|
36
|
+
* Maps props to design-system utility classes (u-vstack, u-hstack,
|
|
37
|
+
* u-gap-*, u-items-*, u-flex-wrap, u-flex-col-reverse, u-flex-row-reverse).
|
|
38
|
+
* No custom CSS required.
|
|
39
|
+
*
|
|
40
|
+
* For fluid responsive horizontal layouts, set `minChildWidth` — children
|
|
41
|
+
* will wrap to a new row when they can't maintain the minimum width.
|
|
42
|
+
* This uses pure CSS flex-wrap, no breakpoints or container queries.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```html
|
|
46
|
+
* <!-- Simple stack -->
|
|
47
|
+
* <Stack direction="'horizontal'" gap="'lg'" align="'center'">
|
|
48
|
+
* <div>Item 1</div>
|
|
49
|
+
* <div>Item 2</div>
|
|
50
|
+
* </Stack>
|
|
51
|
+
*
|
|
52
|
+
* <!-- Fluid responsive: wraps to vertical when children < 200px -->
|
|
53
|
+
* <Stack direction="'horizontal'" gap="'md'" minChildWidth="'200px'">
|
|
54
|
+
* <div>Item 1</div>
|
|
55
|
+
* <div>Item 2</div>
|
|
56
|
+
* <div>Item 3</div>
|
|
57
|
+
* </Stack>
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
/** @codexApi {"parent":"pithy.ui-kit.stack","name":"Stack","stability":"stable","signature":"(props?: StackProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
|
|
61
|
+
export declare function Stack({ direction: rawDirection, gap: rawGap, align: rawAlign, wrap, reverse, minChildWidth, as, }?: StackProps): {
|
|
62
|
+
el: HTMLElement | DocumentFragment;
|
|
63
|
+
destroy: () => void;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=Stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stack.d.ts","sourceRoot":"","sources":["../../src/layout/Stack.ts"],"names":[],"mappings":"AAAA;;;;;;EAME;AAGF,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,4HAA4H;AAC5H,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,uEAAuE;IACvE,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,sLAAsL;AACtL,wBAAgB,KAAK,CAAC,EACpB,SAAS,EAAE,YAAyB,EACpC,GAAG,EAAE,MAAa,EAClB,KAAK,EAAE,QAAoB,EAC3B,IAAY,EACZ,OAAe,EACf,aAAyB,EACzB,EAAU,GACX,GAAE,UAAe,GAAG;IACnB,EAAE,EAAE,WAAW,GAAG,gBAAgB,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA6FA"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/** @codex
|
|
2
|
+
{
|
|
3
|
+
"id": "pithy.ui-kit.stack",
|
|
4
|
+
"title": "<Stack> Layout Component",
|
|
5
|
+
"category": "feature"
|
|
6
|
+
}
|
|
7
|
+
*/
|
|
8
|
+
import { renderChildren } from '@pithyjs/core';
|
|
9
|
+
import { GAP_CLASS, ALIGN_CLASS, CSS_LENGTH_PATTERN, } from '../shared/common';
|
|
10
|
+
import { captureSlot } from '../shared/slots';
|
|
11
|
+
import { ORIENTATIONS } from '../shared/types';
|
|
12
|
+
let fluidStackUid = 0;
|
|
13
|
+
/**
|
|
14
|
+
* Layout atom that arranges children in a vertical or horizontal stack.
|
|
15
|
+
*
|
|
16
|
+
* Maps props to design-system utility classes (u-vstack, u-hstack,
|
|
17
|
+
* u-gap-*, u-items-*, u-flex-wrap, u-flex-col-reverse, u-flex-row-reverse).
|
|
18
|
+
* No custom CSS required.
|
|
19
|
+
*
|
|
20
|
+
* For fluid responsive horizontal layouts, set `minChildWidth` — children
|
|
21
|
+
* will wrap to a new row when they can't maintain the minimum width.
|
|
22
|
+
* This uses pure CSS flex-wrap, no breakpoints or container queries.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```html
|
|
26
|
+
* <!-- Simple stack -->
|
|
27
|
+
* <Stack direction="'horizontal'" gap="'lg'" align="'center'">
|
|
28
|
+
* <div>Item 1</div>
|
|
29
|
+
* <div>Item 2</div>
|
|
30
|
+
* </Stack>
|
|
31
|
+
*
|
|
32
|
+
* <!-- Fluid responsive: wraps to vertical when children < 200px -->
|
|
33
|
+
* <Stack direction="'horizontal'" gap="'md'" minChildWidth="'200px'">
|
|
34
|
+
* <div>Item 1</div>
|
|
35
|
+
* <div>Item 2</div>
|
|
36
|
+
* <div>Item 3</div>
|
|
37
|
+
* </Stack>
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
/** @codexApi {"parent":"pithy.ui-kit.stack","name":"Stack","stability":"stable","signature":"(props?: StackProps) => { el: HTMLElement | DocumentFragment; destroy: () => void }"} */
|
|
41
|
+
export function Stack({ direction: rawDirection = 'vertical', gap: rawGap = 'md', align: rawAlign = 'stretch', wrap = false, reverse = false, minChildWidth = undefined, as = 'div', } = {}) {
|
|
42
|
+
const hasOwn = Object.prototype.hasOwnProperty;
|
|
43
|
+
const validGap = hasOwn.call(GAP_CLASS, rawGap);
|
|
44
|
+
const validAlign = hasOwn.call(ALIGN_CLASS, rawAlign);
|
|
45
|
+
const validDirection = ORIENTATIONS.includes(rawDirection);
|
|
46
|
+
if (import.meta.env?.DEV) {
|
|
47
|
+
if (!validGap) {
|
|
48
|
+
const valid = Object.keys(GAP_CLASS).join(', ');
|
|
49
|
+
console.warn(`[<Stack>] Invalid gap value: "${rawGap}". Expected one of: ${valid}. Falling back to "md".`);
|
|
50
|
+
}
|
|
51
|
+
if (!validAlign) {
|
|
52
|
+
const valid = Object.keys(ALIGN_CLASS).join(', ');
|
|
53
|
+
console.warn(`[<Stack>] Invalid align value: "${rawAlign}". Expected one of: ${valid}. Falling back to "stretch".`);
|
|
54
|
+
}
|
|
55
|
+
if (!validDirection) {
|
|
56
|
+
const valid = ORIENTATIONS.join(', ');
|
|
57
|
+
console.warn(`[<Stack>] Invalid direction value: "${rawDirection}". Expected one of: ${valid}. Falling back to "vertical".`);
|
|
58
|
+
}
|
|
59
|
+
if (minChildWidth != null && !CSS_LENGTH_PATTERN.test(minChildWidth)) {
|
|
60
|
+
console.warn(`[<Stack>] Suspicious minChildWidth value: "${minChildWidth}". Expected a CSS length (e.g. "200px", "15rem").`);
|
|
61
|
+
}
|
|
62
|
+
if (minChildWidth != null && rawDirection !== 'horizontal') {
|
|
63
|
+
console.warn(`[<Stack>] minChildWidth is only supported on horizontal stacks and will be ignored.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const direction = validDirection ? rawDirection : 'vertical';
|
|
67
|
+
const gap = validGap ? rawGap : 'md';
|
|
68
|
+
const align = validAlign ? rawAlign : 'stretch';
|
|
69
|
+
// minChildWidth implies wrap for horizontal stacks
|
|
70
|
+
const shouldWrap = wrap || (minChildWidth != null && direction === 'horizontal');
|
|
71
|
+
const classes = [
|
|
72
|
+
'u-flex',
|
|
73
|
+
reverse
|
|
74
|
+
? direction === 'horizontal'
|
|
75
|
+
? 'u-flex-row-reverse'
|
|
76
|
+
: 'u-flex-col-reverse'
|
|
77
|
+
: direction === 'horizontal'
|
|
78
|
+
? 'u-hstack'
|
|
79
|
+
: 'u-vstack',
|
|
80
|
+
GAP_CLASS[gap],
|
|
81
|
+
ALIGN_CLASS[align],
|
|
82
|
+
shouldWrap ? 'u-flex-wrap' : '',
|
|
83
|
+
].filter(Boolean);
|
|
84
|
+
// Create wrapper element with utility classes
|
|
85
|
+
const wrapper = document.createElement(as);
|
|
86
|
+
for (const cls of classes)
|
|
87
|
+
wrapper.classList.add(cls);
|
|
88
|
+
// Fluid mode: use a scoped <style> with `> *` rule so ALL direct children
|
|
89
|
+
// (including those added later by structural directives) get the flex sizing.
|
|
90
|
+
// flex: 1 0 <min> ensures children won't shrink below minChildWidth and will
|
|
91
|
+
// wrap to a new row instead (matching the prop's documented contract).
|
|
92
|
+
if (minChildWidth != null && direction === 'horizontal') {
|
|
93
|
+
// Validate against CSS injection — reject values that don't match a safe CSS length pattern
|
|
94
|
+
const trimmed = minChildWidth.trim();
|
|
95
|
+
const safeValue = CSS_LENGTH_PATTERN.test(trimmed) ? trimmed : '0px';
|
|
96
|
+
const scopeAttr = `data-stack-fluid-${fluidStackUid++}`;
|
|
97
|
+
wrapper.setAttribute(scopeAttr, '');
|
|
98
|
+
const styleEl = document.createElement('style');
|
|
99
|
+
styleEl.textContent = `[${scopeAttr}] > :not(style) { flex: 1 0 ${safeValue}; min-inline-size: ${safeValue}; }`;
|
|
100
|
+
wrapper.appendChild(styleEl);
|
|
101
|
+
}
|
|
102
|
+
captureSlot(wrapper, 'default');
|
|
103
|
+
// Compile children through full pipeline (enables nested <Stack>)
|
|
104
|
+
const { el: childFragment, destroy } = renderChildren();
|
|
105
|
+
wrapper.appendChild(childFragment);
|
|
106
|
+
return {
|
|
107
|
+
el: wrapper,
|
|
108
|
+
destroy: () => {
|
|
109
|
+
destroy();
|
|
110
|
+
wrapper.replaceChildren();
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=Stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stack.js","sourceRoot":"","sources":["../../src/layout/Stack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/** @codex
|
|
2
|
+
{
|
|
3
|
+
"id": "pithy.ui-kit.card",
|
|
4
|
+
"title": "<Card> Organism",
|
|
5
|
+
"category": "feature",
|
|
6
|
+
"risk": "medium"
|
|
7
|
+
}
|
|
8
|
+
*/
|
|
9
|
+
import { type Orientation } from '../../shared/types';
|
|
10
|
+
import { type CardVariant, type CardPadding, type CardRadius, type CardMediaAspect } from '../../shared/card';
|
|
11
|
+
/** @codexApi {"parent":"pithy.ui-kit.card","name":"CardProps","stability":"stable","signature":"interface CardProps"} */
|
|
12
|
+
export interface CardProps {
|
|
13
|
+
/** Visual variant (default: "default") */
|
|
14
|
+
variant?: CardVariant;
|
|
15
|
+
/** Inset padding (default: "md"). "none" bleeds media to the card edges. */
|
|
16
|
+
padding?: CardPadding;
|
|
17
|
+
/** Corner radius (default: "md") */
|
|
18
|
+
radius?: CardRadius;
|
|
19
|
+
/** Layout direction (default: "vertical"). "horizontal" places media at the inline-start. */
|
|
20
|
+
orientation?: Orientation;
|
|
21
|
+
/**
|
|
22
|
+
* Aspect ratio for the `media` slot. Optional in vertical mode (defaults to
|
|
23
|
+
* the media's intrinsic ratio). In horizontal mode it defaults to "16/9" so
|
|
24
|
+
* thumbnails stay rhythmically consistent across list layouts.
|
|
25
|
+
*/
|
|
26
|
+
mediaAspect?: CardMediaAspect;
|
|
27
|
+
/**
|
|
28
|
+
* Full-bleed media overlay mode. The media slot fills the whole card
|
|
29
|
+
* (ignoring `padding`) and the header / body / footer stack at the
|
|
30
|
+
* block-end on top of a gradient scrim with inverse text colors. Canonical
|
|
31
|
+
* pattern for hero tiles, gallery cards, and marketing listings where the
|
|
32
|
+
* image carries the eye and the caption is secondary.
|
|
33
|
+
*/
|
|
34
|
+
mediaOverlay?: boolean;
|
|
35
|
+
/** Make the whole card a navigation target via a stretched pseudo-link overlay. */
|
|
36
|
+
clickable?: boolean;
|
|
37
|
+
/** Href for the clickable overlay (validated via isSafeHref). Required when `clickable`. */
|
|
38
|
+
href?: string;
|
|
39
|
+
/** Screen-reader label for the clickable overlay. Defaults to `ariaLabel` or the card's heading. */
|
|
40
|
+
linkLabel?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Disable interactivity. Applies `aria-disabled` + `inert` + dimmed chrome.
|
|
43
|
+
* Accepts a boolean or a reactive getter (`() => boolean`) — when a getter
|
|
44
|
+
* is passed, Card wires an internal effect that tracks it.
|
|
45
|
+
*/
|
|
46
|
+
disabled?: boolean | (() => boolean);
|
|
47
|
+
/**
|
|
48
|
+
* Mark the card as selected. Sets `aria-current="true"` (when clickable) +
|
|
49
|
+
* primary-tinted chrome. Accepts a boolean or a reactive getter
|
|
50
|
+
* (`() => boolean`) — when a getter is passed, Card wires an internal effect
|
|
51
|
+
* so the card repaints without remounting.
|
|
52
|
+
*/
|
|
53
|
+
selected?: boolean | (() => boolean);
|
|
54
|
+
/**
|
|
55
|
+
* Short uppercase label rendered above the heading in the header slot —
|
|
56
|
+
* primary-colored, letter-spaced, semibold. Mirrors the `eyebrow` prop on
|
|
57
|
+
* Hero / CTA sections. Used for category tags ("Engineering", "Product")
|
|
58
|
+
* and editorial kickers. Auto-injected into the header slot when set.
|
|
59
|
+
*/
|
|
60
|
+
eyebrow?: string;
|
|
61
|
+
/** Fallback accessible name for the article (used when no heading is present in the header slot). */
|
|
62
|
+
ariaLabel?: string;
|
|
63
|
+
/** Explicit id of an element labeling this card (takes precedence over auto-detection). */
|
|
64
|
+
ariaLabelledBy?: string;
|
|
65
|
+
/** Anchor id on the `<article>` root. */
|
|
66
|
+
id?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Content container with named slots (`media`, `header`, default = body,
|
|
70
|
+
* `footer`), five variants, orientation, and a pseudo-link pattern that
|
|
71
|
+
* lets the whole card act as a navigation target without sacrificing
|
|
72
|
+
* interactive children.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```html
|
|
76
|
+
* <Card variant="'elevated'" clickable="true" href="'/post/hello'">
|
|
77
|
+
* <img data-slot="media" src="/hero.jpg" alt="">
|
|
78
|
+
* <header data-slot="header">
|
|
79
|
+
* <Heading level="3">Hello world</Heading>
|
|
80
|
+
* </header>
|
|
81
|
+
* <Text>A short excerpt…</Text>
|
|
82
|
+
* <footer data-slot="footer">
|
|
83
|
+
* <Text color="'text-muted'" size="'sm'">3 min read</Text>
|
|
84
|
+
* </footer>
|
|
85
|
+
* </Card>
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
/** @codexApi {"parent":"pithy.ui-kit.card","name":"Card","stability":"stable","signature":"(props?: CardProps) => { el: HTMLElement; destroy: () => void }"} */
|
|
89
|
+
export declare function Card(props?: CardProps): {
|
|
90
|
+
el: HTMLElement;
|
|
91
|
+
destroy: () => void;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=Card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../src/organisms/content/Card.ts"],"names":[],"mappings":"AAAA;;;;;;;EAOE;AAQF,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAI3B,yHAAyH;AACzH,MAAM,WAAW,SAAS;IACxB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,oCAAoC;IACpC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4FAA4F;IAC5F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACrC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qGAAqG;IACrG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AA2CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,gKAAgK;AAChK,wBAAgB,IAAI,CAAC,KAAK,GAAE,SAAc,GAAG;IAC3C,EAAE,EAAE,WAAW,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA0WA"}
|