@dsn-starter-kit/components-react 3.0.0 → 3.1.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/README.md +32 -4
- package/dist/ActionGroup/ActionGroup.d.mts +51 -0
- package/dist/ActionGroup/ActionGroup.d.mts.map +1 -0
- package/dist/ActionGroup/ActionGroup2.mjs +65 -0
- package/dist/ActionGroup/ActionGroup2.mjs.map +1 -0
- package/dist/ActionGroup/index.d.mts +2 -0
- package/dist/Alert/Alert.d.mts +85 -0
- package/dist/Alert/Alert.d.mts.map +1 -0
- package/dist/Alert/Alert2.mjs +102 -0
- package/dist/Alert/Alert2.mjs.map +1 -0
- package/dist/Alert/index.d.mts +2 -0
- package/dist/Backdrop/Backdrop.d.mts +28 -0
- package/dist/Backdrop/Backdrop.d.mts.map +1 -0
- package/dist/Backdrop/Backdrop2.mjs +32 -0
- package/dist/Backdrop/Backdrop2.mjs.map +1 -0
- package/dist/Backdrop/index.d.mts +2 -0
- package/dist/Body/Body.d.mts +29 -0
- package/dist/Body/Body.d.mts.map +1 -0
- package/dist/Body/Body2.mjs +36 -0
- package/dist/Body/Body2.mjs.map +1 -0
- package/dist/Body/index.d.mts +2 -0
- package/dist/BreadcrumbNavigation/BreadcrumbNavigation.d.mts +45 -0
- package/dist/BreadcrumbNavigation/BreadcrumbNavigation.d.mts.map +1 -0
- package/dist/BreadcrumbNavigation/BreadcrumbNavigation2.mjs +51 -0
- package/dist/BreadcrumbNavigation/BreadcrumbNavigation2.mjs.map +1 -0
- package/dist/BreadcrumbNavigation/BreadcrumbNavigationItem.d.mts +41 -0
- package/dist/BreadcrumbNavigation/BreadcrumbNavigationItem.d.mts.map +1 -0
- package/dist/BreadcrumbNavigation/BreadcrumbNavigationItem.mjs +48 -0
- package/dist/BreadcrumbNavigation/BreadcrumbNavigationItem.mjs.map +1 -0
- package/dist/BreadcrumbNavigation/index.d.mts +3 -0
- package/dist/BreakoutSection/BreakoutSection.d.mts +32 -0
- package/dist/BreakoutSection/BreakoutSection.d.mts.map +1 -0
- package/dist/BreakoutSection/BreakoutSection2.mjs +36 -0
- package/dist/BreakoutSection/BreakoutSection2.mjs.map +1 -0
- package/dist/BreakoutSection/index.d.mts +2 -0
- package/dist/Button/Button.d.mts +92 -0
- package/dist/Button/Button.d.mts.map +1 -0
- package/dist/Button/Button2.mjs +76 -0
- package/dist/Button/Button2.mjs.map +1 -0
- package/dist/Button/index.d.mts +2 -0
- package/dist/ButtonLink/ButtonLink.d.mts +94 -0
- package/dist/ButtonLink/ButtonLink.d.mts.map +1 -0
- package/dist/ButtonLink/ButtonLink2.mjs +70 -0
- package/dist/ButtonLink/ButtonLink2.mjs.map +1 -0
- package/dist/ButtonLink/index.d.mts +2 -0
- package/dist/Card/Card.d.mts +107 -0
- package/dist/Card/Card.d.mts.map +1 -0
- package/dist/Card/Card2.mjs +125 -0
- package/dist/Card/Card2.mjs.map +1 -0
- package/dist/Card/index.d.mts +2 -0
- package/dist/Checkbox/Checkbox.d.mts +20 -0
- package/dist/Checkbox/Checkbox.d.mts.map +1 -0
- package/dist/Checkbox/Checkbox2.mjs +43 -0
- package/dist/Checkbox/Checkbox2.mjs.map +1 -0
- package/dist/Checkbox/index.d.mts +2 -0
- package/dist/CheckboxGroup/CheckboxGroup.d.mts +39 -0
- package/dist/CheckboxGroup/CheckboxGroup.d.mts.map +1 -0
- package/dist/CheckboxGroup/CheckboxGroup2.mjs +46 -0
- package/dist/CheckboxGroup/CheckboxGroup2.mjs.map +1 -0
- package/dist/CheckboxGroup/index.d.mts +2 -0
- package/dist/CheckboxOption/CheckboxOption.d.mts +17 -0
- package/dist/CheckboxOption/CheckboxOption.d.mts.map +1 -0
- package/dist/CheckboxOption/CheckboxOption2.mjs +29 -0
- package/dist/CheckboxOption/CheckboxOption2.mjs.map +1 -0
- package/dist/CheckboxOption/index.d.mts +2 -0
- package/dist/Container/Container.d.mts +43 -0
- package/dist/Container/Container.d.mts.map +1 -0
- package/dist/Container/Container2.mjs +42 -0
- package/dist/Container/Container2.mjs.map +1 -0
- package/dist/Container/index.d.mts +2 -0
- package/dist/DateInput/DateInput.d.mts +38 -0
- package/dist/DateInput/DateInput.d.mts.map +1 -0
- package/dist/DateInput/DateInput2.mjs +69 -0
- package/dist/DateInput/DateInput2.mjs.map +1 -0
- package/dist/DateInput/index.d.mts +2 -0
- package/dist/DateInputGroup/DateInputGroup.d.mts +67 -0
- package/dist/DateInputGroup/DateInputGroup.d.mts.map +1 -0
- package/dist/DateInputGroup/DateInputGroup2.mjs +120 -0
- package/dist/DateInputGroup/DateInputGroup2.mjs.map +1 -0
- package/dist/DateInputGroup/index.d.mts +2 -0
- package/dist/Details/Details.d.mts +48 -0
- package/dist/Details/Details.d.mts.map +1 -0
- package/dist/Details/Details2.mjs +61 -0
- package/dist/Details/Details2.mjs.map +1 -0
- package/dist/Details/index.d.mts +2 -0
- package/dist/DotBadge/DotBadge.d.mts +44 -0
- package/dist/DotBadge/DotBadge.d.mts.map +1 -0
- package/dist/DotBadge/DotBadge2.mjs +42 -0
- package/dist/DotBadge/DotBadge2.mjs.map +1 -0
- package/dist/DotBadge/index.d.mts +2 -0
- package/dist/Drawer/Drawer.d.mts +111 -0
- package/dist/Drawer/Drawer.d.mts.map +1 -0
- package/dist/Drawer/Drawer2.mjs +156 -0
- package/dist/Drawer/Drawer2.mjs.map +1 -0
- package/dist/Drawer/index.d.mts +2 -0
- package/dist/EmailInput/EmailInput.d.mts +40 -0
- package/dist/EmailInput/EmailInput.d.mts.map +1 -0
- package/dist/EmailInput/EmailInput.mjs +39 -0
- package/dist/EmailInput/EmailInput.mjs.map +1 -0
- package/dist/EmailInput/index.d.mts +2 -0
- package/dist/File/File.d.mts +124 -0
- package/dist/File/File.d.mts.map +1 -0
- package/dist/File/File2.mjs +196 -0
- package/dist/File/File2.mjs.map +1 -0
- package/dist/File/index.d.mts +2 -0
- package/dist/FileInput/FileInput.d.mts +38 -0
- package/dist/FileInput/FileInput.d.mts.map +1 -0
- package/dist/FileInput/FileInput2.mjs +41 -0
- package/dist/FileInput/FileInput2.mjs.map +1 -0
- package/dist/FileInput/index.d.mts +2 -0
- package/dist/FormField/FormField.d.mts +103 -0
- package/dist/FormField/FormField.d.mts.map +1 -0
- package/dist/FormField/FormField2.mjs +101 -0
- package/dist/FormField/FormField2.mjs.map +1 -0
- package/dist/FormField/index.d.mts +2 -0
- package/dist/FormFieldDescription/FormFieldDescription.d.mts +53 -0
- package/dist/FormFieldDescription/FormFieldDescription.d.mts.map +1 -0
- package/dist/FormFieldDescription/FormFieldDescription2.mjs +49 -0
- package/dist/FormFieldDescription/FormFieldDescription2.mjs.map +1 -0
- package/dist/FormFieldDescription/index.d.mts +2 -0
- package/dist/FormFieldErrorMessage/FormFieldErrorMessage.d.mts +42 -0
- package/dist/FormFieldErrorMessage/FormFieldErrorMessage.d.mts.map +1 -0
- package/dist/FormFieldErrorMessage/FormFieldErrorMessage2.mjs +44 -0
- package/dist/FormFieldErrorMessage/FormFieldErrorMessage2.mjs.map +1 -0
- package/dist/FormFieldErrorMessage/index.d.mts +2 -0
- package/dist/FormFieldLabel/FormFieldLabel.d.mts +40 -0
- package/dist/FormFieldLabel/FormFieldLabel.d.mts.map +1 -0
- package/dist/FormFieldLabel/FormFieldLabel2.mjs +42 -0
- package/dist/FormFieldLabel/FormFieldLabel2.mjs.map +1 -0
- package/dist/FormFieldLabel/index.d.mts +2 -0
- package/dist/FormFieldLegend/FormFieldLegend.d.mts +41 -0
- package/dist/FormFieldLegend/FormFieldLegend.d.mts.map +1 -0
- package/dist/FormFieldLegend/FormFieldLegend2.mjs +43 -0
- package/dist/FormFieldLegend/FormFieldLegend2.mjs.map +1 -0
- package/dist/FormFieldLegend/index.d.mts +2 -0
- package/dist/FormFieldStatus/FormFieldStatus.d.mts +62 -0
- package/dist/FormFieldStatus/FormFieldStatus.d.mts.map +1 -0
- package/dist/FormFieldStatus/FormFieldStatus2.mjs +54 -0
- package/dist/FormFieldStatus/FormFieldStatus2.mjs.map +1 -0
- package/dist/FormFieldStatus/index.d.mts +2 -0
- package/dist/FormFieldset/FormFieldset.d.mts +100 -0
- package/dist/FormFieldset/FormFieldset.d.mts.map +1 -0
- package/dist/FormFieldset/FormFieldset2.mjs +100 -0
- package/dist/FormFieldset/FormFieldset2.mjs.map +1 -0
- package/dist/FormFieldset/index.d.mts +2 -0
- package/dist/Grid/Grid.d.mts +37 -0
- package/dist/Grid/Grid.d.mts.map +1 -0
- package/dist/Grid/Grid2.mjs +38 -0
- package/dist/Grid/Grid2.mjs.map +1 -0
- package/dist/Grid/GridItem.d.mts +87 -0
- package/dist/Grid/GridItem.d.mts.map +1 -0
- package/dist/Grid/GridItem.mjs +48 -0
- package/dist/Grid/GridItem.mjs.map +1 -0
- package/dist/Grid/index.d.mts +3 -0
- package/dist/Heading/Heading.d.mts +40 -0
- package/dist/Heading/Heading.d.mts.map +1 -0
- package/dist/Heading/Heading2.mjs +33 -0
- package/dist/Heading/Heading2.mjs.map +1 -0
- package/dist/Heading/index.d.mts +2 -0
- package/dist/HeadingGroup/HeadingGroup.d.mts +25 -0
- package/dist/HeadingGroup/HeadingGroup.d.mts.map +1 -0
- package/dist/HeadingGroup/HeadingGroup2.mjs +24 -0
- package/dist/HeadingGroup/HeadingGroup2.mjs.map +1 -0
- package/dist/HeadingGroup/index.d.mts +2 -0
- package/dist/Hero/Hero.d.mts +47 -0
- package/dist/Hero/Hero.d.mts.map +1 -0
- package/dist/Hero/Hero2.mjs +50 -0
- package/dist/Hero/Hero2.mjs.map +1 -0
- package/dist/Hero/index.d.mts +2 -0
- package/dist/Icon/Icon.d.mts +47 -0
- package/dist/Icon/Icon.d.mts.map +1 -0
- package/dist/Icon/Icon2.mjs +47 -0
- package/dist/Icon/Icon2.mjs.map +1 -0
- package/dist/Icon/icon-registry.generated.d.mts +8 -0
- package/dist/Icon/icon-registry.generated.d.mts.map +1 -0
- package/dist/Icon/icon-registry.generated.mjs +818 -0
- package/dist/Icon/icon-registry.generated.mjs.map +1 -0
- package/dist/Icon/index.d.mts +3 -0
- package/dist/IconList/IconList.d.mts +68 -0
- package/dist/IconList/IconList.d.mts.map +1 -0
- package/dist/IconList/IconList2.mjs +65 -0
- package/dist/IconList/IconList2.mjs.map +1 -0
- package/dist/IconList/index.d.mts +2 -0
- package/dist/Image/Image.d.mts +56 -0
- package/dist/Image/Image.d.mts.map +1 -0
- package/dist/Image/Image2.mjs +67 -0
- package/dist/Image/Image2.mjs.map +1 -0
- package/dist/Image/index.d.mts +2 -0
- package/dist/Link/Link.d.mts +82 -0
- package/dist/Link/Link.d.mts.map +1 -0
- package/dist/Link/Link2.mjs +73 -0
- package/dist/Link/Link2.mjs.map +1 -0
- package/dist/Link/index.d.mts +2 -0
- package/dist/LinkButton/LinkButton.d.mts +54 -0
- package/dist/LinkButton/LinkButton.d.mts.map +1 -0
- package/dist/LinkButton/LinkButton2.mjs +48 -0
- package/dist/LinkButton/LinkButton2.mjs.map +1 -0
- package/dist/LinkButton/index.d.mts +2 -0
- package/dist/Logo/Logo.d.mts +35 -0
- package/dist/Logo/Logo.d.mts.map +1 -0
- package/dist/Logo/Logo2.mjs +66 -0
- package/dist/Logo/Logo2.mjs.map +1 -0
- package/dist/Logo/index.d.mts +2 -0
- package/dist/Menu/Menu.d.mts +58 -0
- package/dist/Menu/Menu.d.mts.map +1 -0
- package/dist/Menu/Menu2.mjs +47 -0
- package/dist/Menu/Menu2.mjs.map +1 -0
- package/dist/Menu/index.d.mts +2 -0
- package/dist/MenuButton/MenuButton.d.mts +56 -0
- package/dist/MenuButton/MenuButton.d.mts.map +1 -0
- package/dist/MenuButton/MenuButton2.mjs +57 -0
- package/dist/MenuButton/MenuButton2.mjs.map +1 -0
- package/dist/MenuButton/index.d.mts +2 -0
- package/dist/MenuLink/MenuLink.d.mts +98 -0
- package/dist/MenuLink/MenuLink.d.mts.map +1 -0
- package/dist/MenuLink/MenuLink2.mjs +98 -0
- package/dist/MenuLink/MenuLink2.mjs.map +1 -0
- package/dist/MenuLink/index.d.mts +2 -0
- package/dist/ModalDialog/ModalDialog.d.mts +97 -0
- package/dist/ModalDialog/ModalDialog.d.mts.map +1 -0
- package/dist/ModalDialog/ModalDialog2.mjs +134 -0
- package/dist/ModalDialog/ModalDialog2.mjs.map +1 -0
- package/dist/ModalDialog/index.d.mts +2 -0
- package/dist/Note/Note.d.mts +95 -0
- package/dist/Note/Note.d.mts.map +1 -0
- package/dist/Note/Note2.mjs +116 -0
- package/dist/Note/Note2.mjs.map +1 -0
- package/dist/Note/index.d.mts +2 -0
- package/dist/NumberBadge/NumberBadge.d.mts +44 -0
- package/dist/NumberBadge/NumberBadge.d.mts.map +1 -0
- package/dist/NumberBadge/NumberBadge2.mjs +50 -0
- package/dist/NumberBadge/NumberBadge2.mjs.map +1 -0
- package/dist/NumberBadge/index.d.mts +2 -0
- package/dist/NumberInput/NumberInput.d.mts +47 -0
- package/dist/NumberInput/NumberInput.d.mts.map +1 -0
- package/dist/NumberInput/NumberInput.mjs +40 -0
- package/dist/NumberInput/NumberInput.mjs.map +1 -0
- package/dist/NumberInput/index.d.mts +2 -0
- package/dist/OptionLabel/OptionLabel.d.mts +15 -0
- package/dist/OptionLabel/OptionLabel.d.mts.map +1 -0
- package/dist/OptionLabel/OptionLabel2.mjs +22 -0
- package/dist/OptionLabel/OptionLabel2.mjs.map +1 -0
- package/dist/OptionLabel/index.d.mts +2 -0
- package/dist/OrderedList/OrderedList.d.mts +34 -0
- package/dist/OrderedList/OrderedList.d.mts.map +1 -0
- package/dist/OrderedList/OrderedList2.mjs +37 -0
- package/dist/OrderedList/OrderedList2.mjs.map +1 -0
- package/dist/OrderedList/index.d.mts +2 -0
- package/dist/PageBody/PageBody.d.mts +35 -0
- package/dist/PageBody/PageBody.d.mts.map +1 -0
- package/dist/PageBody/PageBody2.mjs +40 -0
- package/dist/PageBody/PageBody2.mjs.map +1 -0
- package/dist/PageBody/index.d.mts +2 -0
- package/dist/PageFooter/PageFooter.d.mts +57 -0
- package/dist/PageFooter/PageFooter.d.mts.map +1 -0
- package/dist/PageFooter/PageFooter2.mjs +78 -0
- package/dist/PageFooter/PageFooter2.mjs.map +1 -0
- package/dist/PageFooter/index.d.mts +2 -0
- package/dist/PageHeader/PageHeader.d.mts +192 -0
- package/dist/PageHeader/PageHeader.d.mts.map +1 -0
- package/dist/PageHeader/PageHeader2.mjs +275 -0
- package/dist/PageHeader/PageHeader2.mjs.map +1 -0
- package/dist/PageHeader/index.d.mts +2 -0
- package/dist/PageLayout/PageLayout.d.mts +40 -0
- package/dist/PageLayout/PageLayout.d.mts.map +1 -0
- package/dist/PageLayout/PageLayout2.mjs +42 -0
- package/dist/PageLayout/PageLayout2.mjs.map +1 -0
- package/dist/PageLayout/index.d.mts +2 -0
- package/dist/Paragraph/Paragraph.d.mts +37 -0
- package/dist/Paragraph/Paragraph.d.mts.map +1 -0
- package/dist/Paragraph/Paragraph2.mjs +34 -0
- package/dist/Paragraph/Paragraph2.mjs.map +1 -0
- package/dist/Paragraph/index.d.mts +2 -0
- package/dist/PasswordInput/PasswordInput.d.mts +54 -0
- package/dist/PasswordInput/PasswordInput.d.mts.map +1 -0
- package/dist/PasswordInput/PasswordInput.mjs +43 -0
- package/dist/PasswordInput/PasswordInput.mjs.map +1 -0
- package/dist/PasswordInput/index.d.mts +2 -0
- package/dist/Popover/Popover.d.mts +118 -0
- package/dist/Popover/Popover.d.mts.map +1 -0
- package/dist/Popover/Popover2.mjs +235 -0
- package/dist/Popover/Popover2.mjs.map +1 -0
- package/dist/Popover/index.d.mts +2 -0
- package/dist/PreHeading/PreHeading.d.mts +10 -0
- package/dist/PreHeading/PreHeading.d.mts.map +1 -0
- package/dist/PreHeading/PreHeading2.mjs +18 -0
- package/dist/PreHeading/PreHeading2.mjs.map +1 -0
- package/dist/PreHeading/index.d.mts +2 -0
- package/dist/ProgressBar/ProgressBar.d.mts +60 -0
- package/dist/ProgressBar/ProgressBar.d.mts.map +1 -0
- package/dist/ProgressBar/ProgressBar2.mjs +73 -0
- package/dist/ProgressBar/ProgressBar2.mjs.map +1 -0
- package/dist/ProgressBar/index.d.mts +2 -0
- package/dist/Radio/Radio.d.mts +16 -0
- package/dist/Radio/Radio.d.mts.map +1 -0
- package/dist/Radio/Radio2.mjs +31 -0
- package/dist/Radio/Radio2.mjs.map +1 -0
- package/dist/Radio/index.d.mts +2 -0
- package/dist/RadioGroup/RadioGroup.d.mts +39 -0
- package/dist/RadioGroup/RadioGroup.d.mts.map +1 -0
- package/dist/RadioGroup/RadioGroup2.mjs +46 -0
- package/dist/RadioGroup/RadioGroup2.mjs.map +1 -0
- package/dist/RadioGroup/index.d.mts +2 -0
- package/dist/RadioOption/RadioOption.d.mts +17 -0
- package/dist/RadioOption/RadioOption.d.mts.map +1 -0
- package/dist/RadioOption/RadioOption2.mjs +29 -0
- package/dist/RadioOption/RadioOption2.mjs.map +1 -0
- package/dist/RadioOption/index.d.mts +2 -0
- package/dist/SearchInput/SearchInput.d.mts +41 -0
- package/dist/SearchInput/SearchInput.d.mts.map +1 -0
- package/dist/SearchInput/SearchInput2.mjs +48 -0
- package/dist/SearchInput/SearchInput2.mjs.map +1 -0
- package/dist/SearchInput/index.d.mts +2 -0
- package/dist/Select/Select.d.mts +53 -0
- package/dist/Select/Select.d.mts.map +1 -0
- package/dist/Select/Select2.mjs +61 -0
- package/dist/Select/Select2.mjs.map +1 -0
- package/dist/Select/index.d.mts +2 -0
- package/dist/SkipLink/SkipLink.d.mts +37 -0
- package/dist/SkipLink/SkipLink.d.mts.map +1 -0
- package/dist/SkipLink/SkipLink2.mjs +33 -0
- package/dist/SkipLink/SkipLink2.mjs.map +1 -0
- package/dist/SkipLink/index.d.mts +2 -0
- package/dist/Spinner/Spinner.d.mts +45 -0
- package/dist/Spinner/Spinner.d.mts.map +1 -0
- package/dist/Spinner/Spinner2.mjs +58 -0
- package/dist/Spinner/Spinner2.mjs.map +1 -0
- package/dist/Spinner/index.d.mts +2 -0
- package/dist/Stack/Stack.d.mts +37 -0
- package/dist/Stack/Stack.d.mts.map +1 -0
- package/dist/Stack/Stack2.mjs +38 -0
- package/dist/Stack/Stack2.mjs.map +1 -0
- package/dist/Stack/index.d.mts +2 -0
- package/dist/StatusBadge/StatusBadge.d.mts +52 -0
- package/dist/StatusBadge/StatusBadge.d.mts.map +1 -0
- package/dist/StatusBadge/StatusBadge2.mjs +49 -0
- package/dist/StatusBadge/StatusBadge2.mjs.map +1 -0
- package/dist/StatusBadge/index.d.mts +2 -0
- package/dist/SummaryList/SummaryList.d.mts +51 -0
- package/dist/SummaryList/SummaryList.d.mts.map +1 -0
- package/dist/SummaryList/SummaryList2.mjs +66 -0
- package/dist/SummaryList/SummaryList2.mjs.map +1 -0
- package/dist/SummaryList/index.d.mts +2 -0
- package/dist/Table/Table.d.mts +63 -0
- package/dist/Table/Table.d.mts.map +1 -0
- package/dist/Table/Table2.mjs +54 -0
- package/dist/Table/Table2.mjs.map +1 -0
- package/dist/Table/index.d.mts +2 -0
- package/dist/TableOfContents/TableOfContents.d.mts +64 -0
- package/dist/TableOfContents/TableOfContents.d.mts.map +1 -0
- package/dist/TableOfContents/TableOfContents2.mjs +51 -0
- package/dist/TableOfContents/TableOfContents2.mjs.map +1 -0
- package/dist/TableOfContents/index.d.mts +2 -0
- package/dist/TelephoneInput/TelephoneInput.d.mts +40 -0
- package/dist/TelephoneInput/TelephoneInput.d.mts.map +1 -0
- package/dist/TelephoneInput/TelephoneInput.mjs +39 -0
- package/dist/TelephoneInput/TelephoneInput.mjs.map +1 -0
- package/dist/TelephoneInput/index.d.mts +2 -0
- package/dist/TextArea/TextArea.d.mts +46 -0
- package/dist/TextArea/TextArea.d.mts.map +1 -0
- package/dist/TextArea/TextArea2.mjs +43 -0
- package/dist/TextArea/TextArea2.mjs.map +1 -0
- package/dist/TextArea/index.d.mts +2 -0
- package/dist/TextInput/TextInput.d.mts +46 -0
- package/dist/TextInput/TextInput.d.mts.map +1 -0
- package/dist/TextInput/TextInput2.mjs +43 -0
- package/dist/TextInput/TextInput2.mjs.map +1 -0
- package/dist/TextInput/index.d.mts +2 -0
- package/dist/TimeInput/TimeInput.d.mts +38 -0
- package/dist/TimeInput/TimeInput.d.mts.map +1 -0
- package/dist/TimeInput/TimeInput2.mjs +69 -0
- package/dist/TimeInput/TimeInput2.mjs.map +1 -0
- package/dist/TimeInput/index.d.mts +2 -0
- package/dist/UnorderedList/UnorderedList.d.mts +28 -0
- package/dist/UnorderedList/UnorderedList.d.mts.map +1 -0
- package/dist/UnorderedList/UnorderedList2.mjs +31 -0
- package/dist/UnorderedList/UnorderedList2.mjs.map +1 -0
- package/dist/UnorderedList/index.d.mts +2 -0
- package/dist/index.css +3470 -3470
- package/dist/index.d.mts +150 -3874
- package/dist/index.mjs +76 -5006
- package/dist/utils/describeControl.mjs +25 -0
- package/dist/utils/describeControl.mjs.map +1 -0
- package/package.json +4 -3
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { Icon } from "../Icon/Icon2.mjs";
|
|
2
|
+
import { Button } from "../Button/Button2.mjs";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { classNames } from "@dsn-starter-kit/core";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/Drawer/Drawer.tsx
|
|
8
|
+
const DrawerContext = React.createContext({ headingId: "" });
|
|
9
|
+
/**
|
|
10
|
+
* Drawer component
|
|
11
|
+
* Zijpaneel dat vanuit links of rechts de viewport inschuift.
|
|
12
|
+
*
|
|
13
|
+
* Gebruik `modal={true}` (standaard) voor gefocuste taken waarbij de achtergrond
|
|
14
|
+
* geblokkeerd moet worden. Gebruik `modal={false}` als de gebruiker de achtergrondpagina
|
|
15
|
+
* nodig heeft voor context.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <Drawer isOpen={isOpen} onClose={() => setIsOpen(false)}>
|
|
20
|
+
* <DrawerHeader>
|
|
21
|
+
* <DrawerHeading>Filteropties</DrawerHeading>
|
|
22
|
+
* </DrawerHeader>
|
|
23
|
+
* <DrawerBody>
|
|
24
|
+
* <Paragraph>Inhoud van het zijpaneel</Paragraph>
|
|
25
|
+
* </DrawerBody>
|
|
26
|
+
* <DrawerFooter>
|
|
27
|
+
* <ActionGroup>
|
|
28
|
+
* <Button variant="strong" onClick={() => setIsOpen(false)}>Toepassen</Button>
|
|
29
|
+
* <Button variant="default" onClick={() => setIsOpen(false)}>Annuleren</Button>
|
|
30
|
+
* </ActionGroup>
|
|
31
|
+
* </DrawerFooter>
|
|
32
|
+
* </Drawer>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
const Drawer = React.forwardRef(({ className, isOpen, onClose, modal = true, side = "right", children, ...props }, ref) => {
|
|
36
|
+
const internalRef = React.useRef(null);
|
|
37
|
+
const dialogRef = ref ?? internalRef;
|
|
38
|
+
const headingId = React.useId();
|
|
39
|
+
React.useEffect(() => {
|
|
40
|
+
const dialog = dialogRef.current;
|
|
41
|
+
if (!dialog) return;
|
|
42
|
+
if (isOpen && !dialog.open) {
|
|
43
|
+
if (modal) dialog.showModal();
|
|
44
|
+
else dialog.show();
|
|
45
|
+
} else if (!isOpen && dialog.open) dialog.close();
|
|
46
|
+
}, [
|
|
47
|
+
isOpen,
|
|
48
|
+
modal,
|
|
49
|
+
dialogRef
|
|
50
|
+
]);
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
if (modal) return;
|
|
53
|
+
const dialog = dialogRef.current;
|
|
54
|
+
if (!dialog || !isOpen) return;
|
|
55
|
+
const handleKeyDown = (event) => {
|
|
56
|
+
if (event.key === "Escape") onClose?.();
|
|
57
|
+
};
|
|
58
|
+
dialog.addEventListener("keydown", handleKeyDown);
|
|
59
|
+
return () => dialog.removeEventListener("keydown", handleKeyDown);
|
|
60
|
+
}, [
|
|
61
|
+
modal,
|
|
62
|
+
isOpen,
|
|
63
|
+
onClose,
|
|
64
|
+
dialogRef
|
|
65
|
+
]);
|
|
66
|
+
const handleCancel = (event) => {
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
onClose?.();
|
|
69
|
+
};
|
|
70
|
+
const classes = classNames("dsn-drawer", side === "left" ? "dsn-drawer--side-left" : "dsn-drawer--side-right", className);
|
|
71
|
+
return /* @__PURE__ */ jsx(DrawerContext.Provider, {
|
|
72
|
+
value: {
|
|
73
|
+
headingId,
|
|
74
|
+
onClose
|
|
75
|
+
},
|
|
76
|
+
children: /* @__PURE__ */ jsx("dialog", {
|
|
77
|
+
ref: dialogRef,
|
|
78
|
+
className: classes,
|
|
79
|
+
"aria-labelledby": headingId,
|
|
80
|
+
onCancel: handleCancel,
|
|
81
|
+
...props,
|
|
82
|
+
children
|
|
83
|
+
})
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
Drawer.displayName = "Drawer";
|
|
87
|
+
/**
|
|
88
|
+
* DrawerHeader
|
|
89
|
+
* De headerstrook van het zijpaneel met heading en sluitknop.
|
|
90
|
+
*/
|
|
91
|
+
const DrawerHeader = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
92
|
+
const { onClose } = React.useContext(DrawerContext);
|
|
93
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
94
|
+
ref,
|
|
95
|
+
className: classNames("dsn-drawer__header", className),
|
|
96
|
+
...props,
|
|
97
|
+
children: [children, /* @__PURE__ */ jsx(Button, {
|
|
98
|
+
variant: "subtle",
|
|
99
|
+
size: "small",
|
|
100
|
+
iconOnly: true,
|
|
101
|
+
onClick: onClose,
|
|
102
|
+
iconStart: /* @__PURE__ */ jsx(Icon, {
|
|
103
|
+
name: "x",
|
|
104
|
+
"aria-hidden": true
|
|
105
|
+
}),
|
|
106
|
+
children: "Sluiten"
|
|
107
|
+
})]
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
DrawerHeader.displayName = "DrawerHeader";
|
|
111
|
+
/**
|
|
112
|
+
* DrawerHeading
|
|
113
|
+
* De heading van het zijpaneel. ID wordt automatisch gegenereerd voor aria-labelledby.
|
|
114
|
+
*/
|
|
115
|
+
const DrawerHeading = React.forwardRef(({ className, level = 2, children, ...props }, ref) => {
|
|
116
|
+
const { headingId } = React.useContext(DrawerContext);
|
|
117
|
+
const Tag = `h${level}`;
|
|
118
|
+
return /* @__PURE__ */ jsx(Tag, {
|
|
119
|
+
ref,
|
|
120
|
+
id: headingId,
|
|
121
|
+
className: classNames("dsn-drawer-heading", className),
|
|
122
|
+
...props,
|
|
123
|
+
children
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
DrawerHeading.displayName = "DrawerHeading";
|
|
127
|
+
/**
|
|
128
|
+
* DrawerBody
|
|
129
|
+
* De scrollbare inhoudssectie van het zijpaneel met scroll-affordance schaduw.
|
|
130
|
+
*/
|
|
131
|
+
const DrawerBody = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
132
|
+
return /* @__PURE__ */ jsx("div", {
|
|
133
|
+
ref,
|
|
134
|
+
className: classNames("dsn-drawer__body", className),
|
|
135
|
+
...props,
|
|
136
|
+
children
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
DrawerBody.displayName = "DrawerBody";
|
|
140
|
+
/**
|
|
141
|
+
* DrawerFooter
|
|
142
|
+
* De voettekst van het zijpaneel met actieknoppen.
|
|
143
|
+
*/
|
|
144
|
+
const DrawerFooter = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
145
|
+
return /* @__PURE__ */ jsx("div", {
|
|
146
|
+
ref,
|
|
147
|
+
className: classNames("dsn-drawer__footer", className),
|
|
148
|
+
...props,
|
|
149
|
+
children
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
DrawerFooter.displayName = "DrawerFooter";
|
|
153
|
+
//#endregion
|
|
154
|
+
export { Drawer, DrawerBody, DrawerFooter, DrawerHeader, DrawerHeading };
|
|
155
|
+
|
|
156
|
+
//# sourceMappingURL=Drawer2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer2.mjs","names":[],"sources":["../../src/Drawer/Drawer.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames } from '@dsn-starter-kit/core';\nimport { Button } from '../Button';\nimport { Icon } from '../Icon';\nimport './Drawer.css';\n\n// =============================================================================\n// Context\n// =============================================================================\n\ninterface DrawerContextValue {\n headingId: string;\n onClose?: () => void;\n}\n\nconst DrawerContext = React.createContext<DrawerContextValue>({\n headingId: '',\n});\n\n// =============================================================================\n// Drawer (root)\n// =============================================================================\n\nexport interface DrawerProps extends Omit<\n React.HTMLAttributes<HTMLDialogElement>,\n 'children'\n> {\n /**\n * Bepaalt of het zijpaneel getoond wordt.\n */\n isOpen: boolean;\n\n /**\n * Callback die wordt aangeroepen wanneer het zijpaneel sluit\n * (sluitknop, Escape-toets).\n */\n onClose?: () => void;\n\n /**\n * Modaal of non-modaal gedrag.\n * - `true` (standaard): opent via `.showModal()` — achtergrond geblokkeerd,\n * natieve focus-trap, Escape sluit via `cancel`-event.\n * - `false`: opent via `.show()` — achtergrond blijft interactief,\n * Escape sluit via `keydown`-listener.\n * @default true\n */\n modal?: boolean;\n\n /**\n * De kant van de viewport vanwaar het zijpaneel inschuift.\n * @default \"right\"\n */\n side?: 'right' | 'left';\n\n /**\n * De subcomponenten van het zijpaneel:\n * `DrawerHeader`, `DrawerBody`, `DrawerFooter`\n */\n children?: React.ReactNode;\n}\n\n/**\n * Drawer component\n * Zijpaneel dat vanuit links of rechts de viewport inschuift.\n *\n * Gebruik `modal={true}` (standaard) voor gefocuste taken waarbij de achtergrond\n * geblokkeerd moet worden. Gebruik `modal={false}` als de gebruiker de achtergrondpagina\n * nodig heeft voor context.\n *\n * @example\n * ```tsx\n * <Drawer isOpen={isOpen} onClose={() => setIsOpen(false)}>\n * <DrawerHeader>\n * <DrawerHeading>Filteropties</DrawerHeading>\n * </DrawerHeader>\n * <DrawerBody>\n * <Paragraph>Inhoud van het zijpaneel</Paragraph>\n * </DrawerBody>\n * <DrawerFooter>\n * <ActionGroup>\n * <Button variant=\"strong\" onClick={() => setIsOpen(false)}>Toepassen</Button>\n * <Button variant=\"default\" onClick={() => setIsOpen(false)}>Annuleren</Button>\n * </ActionGroup>\n * </DrawerFooter>\n * </Drawer>\n * ```\n */\nexport const Drawer = React.forwardRef<HTMLDialogElement, DrawerProps>(\n (\n {\n className,\n isOpen,\n onClose,\n modal = true,\n side = 'right',\n children,\n ...props\n },\n ref\n ) => {\n const internalRef = React.useRef<HTMLDialogElement>(null);\n const dialogRef =\n (ref as React.RefObject<HTMLDialogElement>) ?? internalRef;\n const headingId = React.useId();\n\n React.useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (isOpen && !dialog.open) {\n if (modal) {\n dialog.showModal();\n } else {\n dialog.show();\n }\n } else if (!isOpen && dialog.open) {\n dialog.close();\n }\n }, [isOpen, modal, dialogRef]);\n\n // Non-modaal: handmatige Escape-afhandeling via keydown\n React.useEffect(() => {\n if (modal) return;\n const dialog = dialogRef.current;\n if (!dialog || !isOpen) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose?.();\n }\n };\n\n dialog.addEventListener('keydown', handleKeyDown);\n return () => dialog.removeEventListener('keydown', handleKeyDown);\n }, [modal, isOpen, onClose, dialogRef]);\n\n // Modaal: native cancel-event (Escape via browser)\n const handleCancel = (event: React.SyntheticEvent<HTMLDialogElement>) => {\n event.preventDefault();\n onClose?.();\n };\n\n const classes = classNames(\n 'dsn-drawer',\n side === 'left' ? 'dsn-drawer--side-left' : 'dsn-drawer--side-right',\n className\n );\n\n return (\n <DrawerContext.Provider value={{ headingId, onClose }}>\n <dialog\n ref={dialogRef}\n className={classes}\n aria-labelledby={headingId}\n onCancel={handleCancel}\n {...props}\n >\n {children}\n </dialog>\n </DrawerContext.Provider>\n );\n }\n);\n\nDrawer.displayName = 'Drawer';\n\n// =============================================================================\n// DrawerHeader\n// =============================================================================\n\nexport interface DrawerHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Inhoud van de header — doorgaans een `DrawerHeading`\n */\n children?: React.ReactNode;\n}\n\n/**\n * DrawerHeader\n * De headerstrook van het zijpaneel met heading en sluitknop.\n */\nexport const DrawerHeader = React.forwardRef<HTMLDivElement, DrawerHeaderProps>(\n ({ className, children, ...props }, ref) => {\n const { onClose } = React.useContext(DrawerContext);\n\n return (\n <div\n ref={ref}\n className={classNames('dsn-drawer__header', className)}\n {...props}\n >\n {children}\n <Button\n variant=\"subtle\"\n size=\"small\"\n iconOnly\n onClick={onClose}\n iconStart={<Icon name=\"x\" aria-hidden />}\n >\n Sluiten\n </Button>\n </div>\n );\n }\n);\n\nDrawerHeader.displayName = 'DrawerHeader';\n\n// =============================================================================\n// DrawerHeading\n// =============================================================================\n\nexport interface DrawerHeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n /**\n * Semantisch heading-niveau. Kies op basis van documenthiërarchie, niet visuele grootte.\n * @default 2\n */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n\n /**\n * De zichtbare heading-tekst\n */\n children?: React.ReactNode;\n}\n\n/**\n * DrawerHeading\n * De heading van het zijpaneel. ID wordt automatisch gegenereerd voor aria-labelledby.\n */\nexport const DrawerHeading = React.forwardRef<\n HTMLHeadingElement,\n DrawerHeadingProps\n>(({ className, level = 2, children, ...props }, ref) => {\n const { headingId } = React.useContext(DrawerContext);\n const Tag = `h${level}` as React.ElementType;\n\n return (\n <Tag\n ref={ref}\n id={headingId}\n className={classNames('dsn-drawer-heading', className)}\n {...props}\n >\n {children}\n </Tag>\n );\n});\n\nDrawerHeading.displayName = 'DrawerHeading';\n\n// =============================================================================\n// DrawerBody\n// =============================================================================\n\nexport interface DrawerBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * De hoofdinhoud van het zijpaneel\n */\n children?: React.ReactNode;\n}\n\n/**\n * DrawerBody\n * De scrollbare inhoudssectie van het zijpaneel met scroll-affordance schaduw.\n */\nexport const DrawerBody = React.forwardRef<HTMLDivElement, DrawerBodyProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={classNames('dsn-drawer__body', className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nDrawerBody.displayName = 'DrawerBody';\n\n// =============================================================================\n// DrawerFooter\n// =============================================================================\n\nexport interface DrawerFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * De acties van het zijpaneel — doorgaans een `ActionGroup` met knoppen\n */\n children?: React.ReactNode;\n}\n\n/**\n * DrawerFooter\n * De voettekst van het zijpaneel met actieknoppen.\n */\nexport const DrawerFooter = React.forwardRef<HTMLDivElement, DrawerFooterProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={classNames('dsn-drawer__footer', className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nDrawerFooter.displayName = 'DrawerFooter';\n"],"mappings":";;;;;;;AAeA,MAAM,gBAAgB,MAAM,cAAkC,EAC5D,WAAW,GACb,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsED,MAAa,SAAS,MAAM,YAExB,EACE,WACA,QACA,SACA,QAAQ,MACR,OAAO,SACP,UACA,GAAG,SAEL,QACG;CACH,MAAM,cAAc,MAAM,OAA0B,IAAI;CACxD,MAAM,YACH,OAA8C;CACjD,MAAM,YAAY,MAAM,MAAM;CAE9B,MAAM,gBAAgB;EACpB,MAAM,SAAS,UAAU;EACzB,IAAI,CAAC,QAAQ;EAEb,IAAI,UAAU,CAAC,OAAO,MAAM;GAC1B,IAAI,OACF,OAAO,UAAU;QAEjB,OAAO,KAAK;EAEhB,OAAO,IAAI,CAAC,UAAU,OAAO,MAC3B,OAAO,MAAM;CAEjB,GAAG;EAAC;EAAQ;EAAO;CAAS,CAAC;CAG7B,MAAM,gBAAgB;EACpB,IAAI,OAAO;EACX,MAAM,SAAS,UAAU;EACzB,IAAI,CAAC,UAAU,CAAC,QAAQ;EAExB,MAAM,iBAAiB,UAAyB;GAC9C,IAAI,MAAM,QAAQ,UAChB,UAAU;EAEd;EAEA,OAAO,iBAAiB,WAAW,aAAa;EAChD,aAAa,OAAO,oBAAoB,WAAW,aAAa;CAClE,GAAG;EAAC;EAAO;EAAQ;EAAS;CAAS,CAAC;CAGtC,MAAM,gBAAgB,UAAmD;EACvE,MAAM,eAAe;EACrB,UAAU;CACZ;CAEA,MAAM,UAAU,WACd,cACA,SAAS,SAAS,0BAA0B,0BAC5C,SACF;CAEA,OACE,oBAAC,cAAc,UAAf;EAAwB,OAAO;GAAE;GAAW;EAAQ;EAClD,UAAA,oBAAC,UAAD;GACE,KAAK;GACL,WAAW;GACX,mBAAiB;GACjB,UAAU;GACV,GAAI;GAEH;EACK,CAAA;CACc,CAAA;AAE5B,CACF;AAEA,OAAO,cAAc;;;;;AAiBrB,MAAa,eAAe,MAAM,YAC/B,EAAE,WAAW,UAAU,GAAG,SAAS,QAAQ;CAC1C,MAAM,EAAE,YAAY,MAAM,WAAW,aAAa;CAElD,OACE,qBAAC,OAAD;EACO;EACL,WAAW,WAAW,sBAAsB,SAAS;EACrD,GAAI;EAHN,UAAA,CAKG,UACD,oBAAC,QAAD;GACE,SAAQ;GACR,MAAK;GACL,UAAA;GACA,SAAS;GACT,WAAW,oBAAC,MAAD;IAAM,MAAK;IAAI,eAAA;GAAa,CAAA;GACxC,UAAA;EAEO,CAAA,CACL;;AAET,CACF;AAEA,aAAa,cAAc;;;;;AAuB3B,MAAa,gBAAgB,MAAM,YAGhC,EAAE,WAAW,QAAQ,GAAG,UAAU,GAAG,SAAS,QAAQ;CACvD,MAAM,EAAE,cAAc,MAAM,WAAW,aAAa;CACpD,MAAM,MAAM,IAAI;CAEhB,OACE,oBAAC,KAAD;EACO;EACL,IAAI;EACJ,WAAW,WAAW,sBAAsB,SAAS;EACrD,GAAI;EAEH;CACE,CAAA;AAET,CAAC;AAED,cAAc,cAAc;;;;;AAiB5B,MAAa,aAAa,MAAM,YAC7B,EAAE,WAAW,UAAU,GAAG,SAAS,QAAQ;CAC1C,OACE,oBAAC,OAAD;EACO;EACL,WAAW,WAAW,oBAAoB,SAAS;EACnD,GAAI;EAEH;CACE,CAAA;AAET,CACF;AAEA,WAAW,cAAc;;;;;AAiBzB,MAAa,eAAe,MAAM,YAC/B,EAAE,WAAW,UAAU,GAAG,SAAS,QAAQ;CAC1C,OACE,oBAAC,OAAD;EACO;EACL,WAAW,WAAW,sBAAsB,SAAS;EACrD,GAAI;EAEH;CACE,CAAA;AAET,CACF;AAEA,aAAa,cAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Drawer, DrawerBody, DrawerBodyProps, DrawerFooter, DrawerFooterProps, DrawerHeader, DrawerHeaderProps, DrawerHeading, DrawerHeadingProps, DrawerProps } from "./Drawer.mjs";
|
|
2
|
+
export { Drawer, DrawerBody, type DrawerBodyProps, DrawerFooter, type DrawerFooterProps, DrawerHeader, type DrawerHeaderProps, DrawerHeading, type DrawerHeadingProps, type DrawerProps };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { FormControlWidth } from "@dsn-starter-kit/core";
|
|
3
|
+
//#region src/EmailInput/EmailInput.d.ts
|
|
4
|
+
interface EmailInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
|
|
5
|
+
/**
|
|
6
|
+
* Whether the input is in an invalid state
|
|
7
|
+
* @default false
|
|
8
|
+
*/
|
|
9
|
+
invalid?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Width variant for the input
|
|
12
|
+
* @default undefined (uses default max-width from form-control)
|
|
13
|
+
*/
|
|
14
|
+
width?: FormControlWidth;
|
|
15
|
+
/**
|
|
16
|
+
* Additional CSS class names
|
|
17
|
+
*/
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Email Input component
|
|
22
|
+
* Email input with appropriate inputmode and autocomplete
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* // Basic usage
|
|
27
|
+
* <EmailInput placeholder="naam@voorbeeld.nl" />
|
|
28
|
+
*
|
|
29
|
+
* // With label
|
|
30
|
+
* <FormFieldLabel htmlFor="email">E-mailadres</FormFieldLabel>
|
|
31
|
+
* <EmailInput id="email" />
|
|
32
|
+
*
|
|
33
|
+
* // Invalid state
|
|
34
|
+
* <EmailInput invalid aria-invalid="true" aria-describedby="error" />
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
declare const EmailInput: React.ForwardRefExoticComponent<EmailInputProps & React.RefAttributes<HTMLInputElement>>;
|
|
38
|
+
//#endregion
|
|
39
|
+
export { EmailInput, EmailInputProps };
|
|
40
|
+
//# sourceMappingURL=EmailInput.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailInput.d.mts","names":[],"sources":["../../src/EmailInput/EmailInput.tsx"],"mappings":";;;UAIiB,wBAAwB,KACvC,MAAM,oBAAoB;;;;;EAO1B;;;;;EAMA,QAAQ;;;;EAKR;;;;;;;;;;;;;;;;;;;cAoBW,YAAU,MAAA,0BAAA,kBAAA,MAAA,cAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* empty css */
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { classNames } from "@dsn-starter-kit/core";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/EmailInput/EmailInput.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Email Input component
|
|
8
|
+
* Email input with appropriate inputmode and autocomplete
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* // Basic usage
|
|
13
|
+
* <EmailInput placeholder="naam@voorbeeld.nl" />
|
|
14
|
+
*
|
|
15
|
+
* // With label
|
|
16
|
+
* <FormFieldLabel htmlFor="email">E-mailadres</FormFieldLabel>
|
|
17
|
+
* <EmailInput id="email" />
|
|
18
|
+
*
|
|
19
|
+
* // Invalid state
|
|
20
|
+
* <EmailInput invalid aria-invalid="true" aria-describedby="error" />
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
const EmailInput = React.forwardRef(({ className, invalid, width, autoComplete, ...props }, ref) => {
|
|
24
|
+
const classes = classNames("dsn-text-input", width && `dsn-text-input--width-${width}`, className);
|
|
25
|
+
return /* @__PURE__ */ jsx("input", {
|
|
26
|
+
ref,
|
|
27
|
+
type: "email",
|
|
28
|
+
inputMode: "email",
|
|
29
|
+
className: classes,
|
|
30
|
+
autoComplete: autoComplete || "email",
|
|
31
|
+
"aria-invalid": invalid || void 0,
|
|
32
|
+
...props
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
EmailInput.displayName = "EmailInput";
|
|
36
|
+
//#endregion
|
|
37
|
+
export { EmailInput };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=EmailInput.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailInput.mjs","names":[],"sources":["../../src/EmailInput/EmailInput.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, FormControlWidth } from '@dsn-starter-kit/core';\nimport '../TextInput/TextInput.css';\n\nexport interface EmailInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> {\n /**\n * Whether the input is in an invalid state\n * @default false\n */\n invalid?: boolean;\n\n /**\n * Width variant for the input\n * @default undefined (uses default max-width from form-control)\n */\n width?: FormControlWidth;\n\n /**\n * Additional CSS class names\n */\n className?: string;\n}\n\n/**\n * Email Input component\n * Email input with appropriate inputmode and autocomplete\n *\n * @example\n * ```tsx\n * // Basic usage\n * <EmailInput placeholder=\"naam@voorbeeld.nl\" />\n *\n * // With label\n * <FormFieldLabel htmlFor=\"email\">E-mailadres</FormFieldLabel>\n * <EmailInput id=\"email\" />\n *\n * // Invalid state\n * <EmailInput invalid aria-invalid=\"true\" aria-describedby=\"error\" />\n * ```\n */\nexport const EmailInput = React.forwardRef<HTMLInputElement, EmailInputProps>(\n ({ className, invalid, width, autoComplete, ...props }, ref) => {\n const classes = classNames(\n 'dsn-text-input',\n width && `dsn-text-input--width-${width}`,\n className\n );\n\n return (\n <input\n ref={ref}\n type=\"email\"\n inputMode=\"email\"\n className={classes}\n autoComplete={autoComplete || 'email'}\n aria-invalid={invalid || undefined}\n {...props}\n />\n );\n }\n);\n\nEmailInput.displayName = 'EmailInput';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAa,aAAa,MAAM,YAC7B,EAAE,WAAW,SAAS,OAAO,cAAc,GAAG,SAAS,QAAQ;CAC9D,MAAM,UAAU,WACd,kBACA,SAAS,yBAAyB,SAClC,SACF;CAEA,OACE,oBAAC,SAAD;EACO;EACL,MAAK;EACL,WAAU;EACV,WAAW;EACX,cAAc,gBAAgB;EAC9B,gBAAc,WAAW,KAAA;EACzB,GAAI;CACL,CAAA;AAEL,CACF;AAEA,WAAW,cAAc"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
//#region src/File/File.d.ts
|
|
3
|
+
type FileStatus = 'default' | 'loading' | 'uploaded' | 'error';
|
|
4
|
+
type FileCtaVariant = 'view' | 'download';
|
|
5
|
+
type FileMediaType = 'document' | 'image';
|
|
6
|
+
interface FileProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
7
|
+
/** Bestandsnaam inclusief extensie (vereist). Extensie wordt visueel afgekapt. */
|
|
8
|
+
fileName: string;
|
|
9
|
+
/** Bestandstype als afkorting: "PDF", "JPG". Getoond in dsn-file__meta. */
|
|
10
|
+
fileType?: string;
|
|
11
|
+
/** Bestandsgrootte als geformatteerde string: "1,2 MB". */
|
|
12
|
+
fileSize?: string;
|
|
13
|
+
/**
|
|
14
|
+
* State van het bestand.
|
|
15
|
+
* Bij 'uploaded' keert het component na 2 seconden automatisch terug naar 'default'.
|
|
16
|
+
* @default 'default'
|
|
17
|
+
*/
|
|
18
|
+
status?: FileStatus;
|
|
19
|
+
/** Foutmelding, getoond bij status="error". */
|
|
20
|
+
errorMessage?: string;
|
|
21
|
+
/** URL naar het bestand. Maakt de naam een <a> en schakelt de interactieve variant in. */
|
|
22
|
+
href?: string;
|
|
23
|
+
/** Callback voor de verwijderactie. Toont de "Verwijder"-knop. */
|
|
24
|
+
onDelete?: () => void;
|
|
25
|
+
/**
|
|
26
|
+
* Zichtbare tekst op de verwijder-knop.
|
|
27
|
+
* @default "Verwijder"
|
|
28
|
+
*/
|
|
29
|
+
deleteLabel?: string;
|
|
30
|
+
/**
|
|
31
|
+
* CTA-type in de interactieve variant.
|
|
32
|
+
* 'view' toont geen aparte CTA; de bestandsnaam opent als stretched link in een nieuw tabblad.
|
|
33
|
+
* 'download' toont een aparte download-knop; de bestandsnaam opent in een nieuw tabblad.
|
|
34
|
+
* @default 'view'
|
|
35
|
+
*/
|
|
36
|
+
ctaVariant?: FileCtaVariant;
|
|
37
|
+
/**
|
|
38
|
+
* Overschrijft het standaard CTA-label voor de download-variant.
|
|
39
|
+
* Standaard: "Download".
|
|
40
|
+
*/
|
|
41
|
+
ctaLabel?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Bepaalt het icoon: file-description.svg of photo.svg.
|
|
44
|
+
* Genegeerd wanneer previewSrc aanwezig is.
|
|
45
|
+
* @default 'document'
|
|
46
|
+
*/
|
|
47
|
+
mediaType?: FileMediaType;
|
|
48
|
+
/** URL van de afbeeldingspreview. Vervangt het icoon in het media-vlak. */
|
|
49
|
+
previewSrc?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Visueel verborgen label voor de Spinner.
|
|
52
|
+
* @default "Bezig met uploaden"
|
|
53
|
+
*/
|
|
54
|
+
loadingLabel?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Tekst voor de aria-live regio bij de uploaded state.
|
|
57
|
+
* @default "{fileName} succesvol geüpload"
|
|
58
|
+
*/
|
|
59
|
+
uploadedLabel?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Tekst voor de aria-live regio bij de error state.
|
|
62
|
+
* Standaard "{fileName}: {errorMessage}", of "{fileName} uploaden mislukt"
|
|
63
|
+
* wanneer er geen errorMessage is.
|
|
64
|
+
*/
|
|
65
|
+
errorLabel?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* File component
|
|
69
|
+
* Toont meta-informatie over een bestand (naam, type, grootte) samen met acties.
|
|
70
|
+
* Ondersteunt vier upload-states (default, loading, uploaded, error) en een
|
|
71
|
+
* interactieve variant voor controle- of detailpagina's.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```tsx
|
|
75
|
+
* // Default — eerder geüpload bestand, met verwijder-optie
|
|
76
|
+
* <File
|
|
77
|
+
* fileName="document.pdf"
|
|
78
|
+
* fileType="PDF"
|
|
79
|
+
* fileSize="1,2 MB"
|
|
80
|
+
* href="/bestanden/document.pdf"
|
|
81
|
+
* onDelete={() => handleDelete()}
|
|
82
|
+
* />
|
|
83
|
+
*
|
|
84
|
+
* // Interactief — bestandsnaam als link (nieuw tabblad)
|
|
85
|
+
* <File
|
|
86
|
+
* fileName="rapport-2024.pdf"
|
|
87
|
+
* fileType="PDF"
|
|
88
|
+
* fileSize="2,1 MB"
|
|
89
|
+
* href="/bestanden/rapport-2024.pdf"
|
|
90
|
+
* />
|
|
91
|
+
*
|
|
92
|
+
* // Interactief — download CTA
|
|
93
|
+
* <File
|
|
94
|
+
* fileName="rapport-2024.pdf"
|
|
95
|
+
* fileType="PDF"
|
|
96
|
+
* fileSize="2,1 MB"
|
|
97
|
+
* href="/bestanden/rapport-2024.pdf"
|
|
98
|
+
* ctaVariant="download"
|
|
99
|
+
* />
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
declare const File: React.ForwardRefExoticComponent<FileProps & React.RefAttributes<HTMLDivElement>>;
|
|
103
|
+
interface FileListProps extends React.HTMLAttributes<HTMLUListElement> {
|
|
104
|
+
/** File componenten */
|
|
105
|
+
children?: React.ReactNode;
|
|
106
|
+
className?: string;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* FileList component
|
|
110
|
+
* Wrapper voor meerdere File componenten.
|
|
111
|
+
* Rendert een <ul role="list"> met <li> wrappers — nodig omdat CSS-resets lijstsemantiek verwijderen.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```tsx
|
|
115
|
+
* <FileList>
|
|
116
|
+
* <File fileName="document.pdf" fileType="PDF" fileSize="1,2 MB" href="..." onDelete={() => {}} />
|
|
117
|
+
* <File fileName="foto.jpg" fileType="JPG" fileSize="3,4 MB" href="..." onDelete={() => {}} />
|
|
118
|
+
* </FileList>
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
declare const FileList: React.ForwardRefExoticComponent<FileListProps & React.RefAttributes<HTMLUListElement>>;
|
|
122
|
+
//#endregion
|
|
123
|
+
export { File, FileCtaVariant, FileList, FileListProps, FileMediaType, FileProps, FileStatus };
|
|
124
|
+
//# sourceMappingURL=File.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"File.d.mts","names":[],"sources":["../../src/File/File.tsx"],"mappings":";;KAOY;KACA;KACA;UAEK,kBAAkB,MAAM,eAAe;;EAEtD;;EAGA;;EAGA;;;;;;EAOA,SAAS;;EAGT;;EAGA;;EAGA;;;;;EAMA;;;;;;;EAQA,aAAa;;;;;EAMb;;;;;;EAOA,YAAY;;EAGZ;;;;;EAMA;;;;;EAMA;;;;;;EAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAsCW,MAAI,MAAA,0BAAA,YAAA,MAAA,cAAA;UAuLA,sBAAsB,MAAM,eAAe;;EAE1D,WAAW,MAAM;EACjB;;;;;;;;;;;;;;;cAgBW,UAAQ,MAAA,0BAAA,gBAAA,MAAA,cAAA"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { Icon } from "../Icon/Icon2.mjs";
|
|
2
|
+
import { Spinner } from "../Spinner/Spinner2.mjs";
|
|
3
|
+
import { FormFieldErrorMessage } from "../FormFieldErrorMessage/FormFieldErrorMessage2.mjs";
|
|
4
|
+
/* empty css */
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { classNames } from "@dsn-starter-kit/core";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
//#region src/File/File.tsx
|
|
9
|
+
/**
|
|
10
|
+
* File component
|
|
11
|
+
* Toont meta-informatie over een bestand (naam, type, grootte) samen met acties.
|
|
12
|
+
* Ondersteunt vier upload-states (default, loading, uploaded, error) en een
|
|
13
|
+
* interactieve variant voor controle- of detailpagina's.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* // Default — eerder geüpload bestand, met verwijder-optie
|
|
18
|
+
* <File
|
|
19
|
+
* fileName="document.pdf"
|
|
20
|
+
* fileType="PDF"
|
|
21
|
+
* fileSize="1,2 MB"
|
|
22
|
+
* href="/bestanden/document.pdf"
|
|
23
|
+
* onDelete={() => handleDelete()}
|
|
24
|
+
* />
|
|
25
|
+
*
|
|
26
|
+
* // Interactief — bestandsnaam als link (nieuw tabblad)
|
|
27
|
+
* <File
|
|
28
|
+
* fileName="rapport-2024.pdf"
|
|
29
|
+
* fileType="PDF"
|
|
30
|
+
* fileSize="2,1 MB"
|
|
31
|
+
* href="/bestanden/rapport-2024.pdf"
|
|
32
|
+
* />
|
|
33
|
+
*
|
|
34
|
+
* // Interactief — download CTA
|
|
35
|
+
* <File
|
|
36
|
+
* fileName="rapport-2024.pdf"
|
|
37
|
+
* fileType="PDF"
|
|
38
|
+
* fileSize="2,1 MB"
|
|
39
|
+
* href="/bestanden/rapport-2024.pdf"
|
|
40
|
+
* ctaVariant="download"
|
|
41
|
+
* />
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
const File = React.forwardRef(({ className, fileName, fileType, fileSize, status = "default", errorMessage, href, onDelete, deleteLabel = "Verwijder", ctaVariant = "view", ctaLabel, mediaType = "document", previewSrc, loadingLabel = "Bezig met uploaden", uploadedLabel, errorLabel, ...props }, ref) => {
|
|
45
|
+
const [currentStatus, setCurrentStatus] = React.useState(status);
|
|
46
|
+
const [liveText, setLiveText] = React.useState("");
|
|
47
|
+
React.useEffect(() => {
|
|
48
|
+
setCurrentStatus(status);
|
|
49
|
+
}, [status]);
|
|
50
|
+
React.useEffect(() => {
|
|
51
|
+
if (currentStatus === "uploaded") {
|
|
52
|
+
setLiveText(uploadedLabel ?? `${fileName} succesvol geüpload`);
|
|
53
|
+
const timer = setTimeout(() => {
|
|
54
|
+
setCurrentStatus("default");
|
|
55
|
+
setLiveText("");
|
|
56
|
+
}, 2e3);
|
|
57
|
+
return () => clearTimeout(timer);
|
|
58
|
+
}
|
|
59
|
+
if (currentStatus === "error") {
|
|
60
|
+
setLiveText(errorLabel ?? (errorMessage ? `${fileName}: ${errorMessage}` : `${fileName} uploaden mislukt`));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
setLiveText("");
|
|
64
|
+
}, [
|
|
65
|
+
currentStatus,
|
|
66
|
+
fileName,
|
|
67
|
+
uploadedLabel,
|
|
68
|
+
errorLabel,
|
|
69
|
+
errorMessage
|
|
70
|
+
]);
|
|
71
|
+
const fileNameWithoutExt = React.useMemo(() => {
|
|
72
|
+
const lastDot = fileName.lastIndexOf(".");
|
|
73
|
+
return lastDot > 0 ? fileName.slice(0, lastDot) : fileName;
|
|
74
|
+
}, [fileName]);
|
|
75
|
+
const metaText = [fileType, fileSize].filter(Boolean).join(" · ");
|
|
76
|
+
const isInteractive = Boolean(href) && !onDelete;
|
|
77
|
+
const isStretchedLink = isInteractive && ctaVariant !== "download";
|
|
78
|
+
const rootClasses = classNames("dsn-file", currentStatus === "loading" && "dsn-file--loading", currentStatus === "uploaded" && "dsn-file--uploaded", currentStatus === "error" && "dsn-file--error", isStretchedLink && "dsn-file--interactive", className);
|
|
79
|
+
const nameClasses = classNames("dsn-file__name", href && "dsn-link", isStretchedLink && "dsn-file__name--stretched");
|
|
80
|
+
const iconName = mediaType === "image" ? "photo" : "file-description";
|
|
81
|
+
const resolvedCtaLabel = ctaLabel ?? "Download";
|
|
82
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
83
|
+
ref,
|
|
84
|
+
className: rootClasses,
|
|
85
|
+
...props,
|
|
86
|
+
children: [
|
|
87
|
+
/* @__PURE__ */ jsx("div", {
|
|
88
|
+
className: "dsn-file__media",
|
|
89
|
+
"aria-hidden": "true",
|
|
90
|
+
children: previewSrc ? /* @__PURE__ */ jsx("img", {
|
|
91
|
+
className: "dsn-file__preview",
|
|
92
|
+
src: previewSrc,
|
|
93
|
+
alt: ""
|
|
94
|
+
}) : /* @__PURE__ */ jsx(Icon, {
|
|
95
|
+
name: iconName,
|
|
96
|
+
"aria-hidden": true
|
|
97
|
+
})
|
|
98
|
+
}),
|
|
99
|
+
/* @__PURE__ */ jsxs("div", {
|
|
100
|
+
className: "dsn-file__content",
|
|
101
|
+
children: [
|
|
102
|
+
href ? /* @__PURE__ */ jsx("a", {
|
|
103
|
+
className: nameClasses,
|
|
104
|
+
href,
|
|
105
|
+
target: "_blank",
|
|
106
|
+
rel: "noopener noreferrer",
|
|
107
|
+
children: fileNameWithoutExt
|
|
108
|
+
}) : /* @__PURE__ */ jsx("span", {
|
|
109
|
+
className: nameClasses,
|
|
110
|
+
children: fileNameWithoutExt
|
|
111
|
+
}),
|
|
112
|
+
metaText && /* @__PURE__ */ jsx("span", {
|
|
113
|
+
className: "dsn-file__meta",
|
|
114
|
+
children: metaText
|
|
115
|
+
}),
|
|
116
|
+
currentStatus === "error" && errorMessage && /* @__PURE__ */ jsx(FormFieldErrorMessage, { children: errorMessage })
|
|
117
|
+
]
|
|
118
|
+
}),
|
|
119
|
+
/* @__PURE__ */ jsxs("div", {
|
|
120
|
+
className: "dsn-file__actions",
|
|
121
|
+
children: [
|
|
122
|
+
!isInteractive && currentStatus === "loading" && /* @__PURE__ */ jsx(Spinner, {
|
|
123
|
+
label: loadingLabel,
|
|
124
|
+
hideLabel: true
|
|
125
|
+
}),
|
|
126
|
+
!isInteractive && currentStatus === "uploaded" && /* @__PURE__ */ jsx(Icon, {
|
|
127
|
+
className: "dsn-file__status-icon",
|
|
128
|
+
name: "check",
|
|
129
|
+
"aria-hidden": true
|
|
130
|
+
}),
|
|
131
|
+
!isInteractive && (currentStatus === "default" || currentStatus === "error") && onDelete && /* @__PURE__ */ jsxs("button", {
|
|
132
|
+
type: "button",
|
|
133
|
+
className: "dsn-link dsn-link-button dsn-link--size-default",
|
|
134
|
+
onClick: onDelete,
|
|
135
|
+
children: [
|
|
136
|
+
/* @__PURE__ */ jsx(Icon, {
|
|
137
|
+
name: "trash",
|
|
138
|
+
"aria-hidden": true
|
|
139
|
+
}),
|
|
140
|
+
deleteLabel,
|
|
141
|
+
/* @__PURE__ */ jsxs("span", {
|
|
142
|
+
className: "dsn-visually-hidden",
|
|
143
|
+
children: [" ", fileName]
|
|
144
|
+
})
|
|
145
|
+
]
|
|
146
|
+
}),
|
|
147
|
+
isInteractive && ctaVariant === "download" && /* @__PURE__ */ jsxs("a", {
|
|
148
|
+
className: "dsn-link",
|
|
149
|
+
href,
|
|
150
|
+
"aria-hidden": "true",
|
|
151
|
+
tabIndex: -1,
|
|
152
|
+
download: true,
|
|
153
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
154
|
+
name: "download",
|
|
155
|
+
"aria-hidden": true
|
|
156
|
+
}), resolvedCtaLabel]
|
|
157
|
+
})
|
|
158
|
+
]
|
|
159
|
+
}),
|
|
160
|
+
/* @__PURE__ */ jsx("span", {
|
|
161
|
+
className: "dsn-visually-hidden",
|
|
162
|
+
"aria-live": "polite",
|
|
163
|
+
"aria-atomic": "true",
|
|
164
|
+
children: liveText
|
|
165
|
+
})
|
|
166
|
+
]
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
File.displayName = "File";
|
|
170
|
+
/**
|
|
171
|
+
* FileList component
|
|
172
|
+
* Wrapper voor meerdere File componenten.
|
|
173
|
+
* Rendert een <ul role="list"> met <li> wrappers — nodig omdat CSS-resets lijstsemantiek verwijderen.
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```tsx
|
|
177
|
+
* <FileList>
|
|
178
|
+
* <File fileName="document.pdf" fileType="PDF" fileSize="1,2 MB" href="..." onDelete={() => {}} />
|
|
179
|
+
* <File fileName="foto.jpg" fileType="JPG" fileSize="3,4 MB" href="..." onDelete={() => {}} />
|
|
180
|
+
* </FileList>
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
const FileList = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
184
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
185
|
+
ref,
|
|
186
|
+
className: classNames("dsn-file-list", className),
|
|
187
|
+
role: "list",
|
|
188
|
+
...props,
|
|
189
|
+
children: React.Children.map(children, (child, index) => /* @__PURE__ */ jsx("li", { children: child }, index))
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
FileList.displayName = "FileList";
|
|
193
|
+
//#endregion
|
|
194
|
+
export { File, FileList };
|
|
195
|
+
|
|
196
|
+
//# sourceMappingURL=File2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"File2.mjs","names":[],"sources":["../../src/File/File.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames } from '@dsn-starter-kit/core';\nimport { Icon } from '../Icon';\nimport { Spinner } from '../Spinner';\nimport { FormFieldErrorMessage } from '../FormFieldErrorMessage';\nimport './File.css';\n\nexport type FileStatus = 'default' | 'loading' | 'uploaded' | 'error';\nexport type FileCtaVariant = 'view' | 'download';\nexport type FileMediaType = 'document' | 'image';\n\nexport interface FileProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Bestandsnaam inclusief extensie (vereist). Extensie wordt visueel afgekapt. */\n fileName: string;\n\n /** Bestandstype als afkorting: \"PDF\", \"JPG\". Getoond in dsn-file__meta. */\n fileType?: string;\n\n /** Bestandsgrootte als geformatteerde string: \"1,2 MB\". */\n fileSize?: string;\n\n /**\n * State van het bestand.\n * Bij 'uploaded' keert het component na 2 seconden automatisch terug naar 'default'.\n * @default 'default'\n */\n status?: FileStatus;\n\n /** Foutmelding, getoond bij status=\"error\". */\n errorMessage?: string;\n\n /** URL naar het bestand. Maakt de naam een <a> en schakelt de interactieve variant in. */\n href?: string;\n\n /** Callback voor de verwijderactie. Toont de \"Verwijder\"-knop. */\n onDelete?: () => void;\n\n /**\n * Zichtbare tekst op de verwijder-knop.\n * @default \"Verwijder\"\n */\n deleteLabel?: string;\n\n /**\n * CTA-type in de interactieve variant.\n * 'view' toont geen aparte CTA; de bestandsnaam opent als stretched link in een nieuw tabblad.\n * 'download' toont een aparte download-knop; de bestandsnaam opent in een nieuw tabblad.\n * @default 'view'\n */\n ctaVariant?: FileCtaVariant;\n\n /**\n * Overschrijft het standaard CTA-label voor de download-variant.\n * Standaard: \"Download\".\n */\n ctaLabel?: string;\n\n /**\n * Bepaalt het icoon: file-description.svg of photo.svg.\n * Genegeerd wanneer previewSrc aanwezig is.\n * @default 'document'\n */\n mediaType?: FileMediaType;\n\n /** URL van de afbeeldingspreview. Vervangt het icoon in het media-vlak. */\n previewSrc?: string;\n\n /**\n * Visueel verborgen label voor de Spinner.\n * @default \"Bezig met uploaden\"\n */\n loadingLabel?: string;\n\n /**\n * Tekst voor de aria-live regio bij de uploaded state.\n * @default \"{fileName} succesvol geüpload\"\n */\n uploadedLabel?: string;\n\n /**\n * Tekst voor de aria-live regio bij de error state.\n * Standaard \"{fileName}: {errorMessage}\", of \"{fileName} uploaden mislukt\"\n * wanneer er geen errorMessage is.\n */\n errorLabel?: string;\n}\n\n/**\n * File component\n * Toont meta-informatie over een bestand (naam, type, grootte) samen met acties.\n * Ondersteunt vier upload-states (default, loading, uploaded, error) en een\n * interactieve variant voor controle- of detailpagina's.\n *\n * @example\n * ```tsx\n * // Default — eerder geüpload bestand, met verwijder-optie\n * <File\n * fileName=\"document.pdf\"\n * fileType=\"PDF\"\n * fileSize=\"1,2 MB\"\n * href=\"/bestanden/document.pdf\"\n * onDelete={() => handleDelete()}\n * />\n *\n * // Interactief — bestandsnaam als link (nieuw tabblad)\n * <File\n * fileName=\"rapport-2024.pdf\"\n * fileType=\"PDF\"\n * fileSize=\"2,1 MB\"\n * href=\"/bestanden/rapport-2024.pdf\"\n * />\n *\n * // Interactief — download CTA\n * <File\n * fileName=\"rapport-2024.pdf\"\n * fileType=\"PDF\"\n * fileSize=\"2,1 MB\"\n * href=\"/bestanden/rapport-2024.pdf\"\n * ctaVariant=\"download\"\n * />\n * ```\n */\nexport const File = React.forwardRef<HTMLDivElement, FileProps>(\n (\n {\n className,\n fileName,\n fileType,\n fileSize,\n status = 'default',\n errorMessage,\n href,\n onDelete,\n deleteLabel = 'Verwijder',\n ctaVariant = 'view',\n ctaLabel,\n mediaType = 'document',\n previewSrc,\n loadingLabel = 'Bezig met uploaden',\n uploadedLabel,\n errorLabel,\n ...props\n },\n ref\n ) => {\n const [currentStatus, setCurrentStatus] =\n React.useState<FileStatus>(status);\n const [liveText, setLiveText] = React.useState('');\n\n // Synchroniseer externe status-prop met interne state\n React.useEffect(() => {\n setCurrentStatus(status);\n }, [status]);\n\n // Vul de aria-live regio bij een eindstatus van de upload.\n // De tekst wordt pas ná de eerste render gezet, zodat screenreaders de\n // wijziging in de regio waarnemen en aankondigen.\n React.useEffect(() => {\n // Uploaded: kondig succes aan en keer na 2s terug naar default\n if (currentStatus === 'uploaded') {\n setLiveText(uploadedLabel ?? `${fileName} succesvol geüpload`);\n\n const timer = setTimeout(() => {\n setCurrentStatus('default');\n setLiveText('');\n }, 2000);\n\n return () => clearTimeout(timer);\n }\n\n // Error: kondig de mislukking aan, inclusief de reden wanneer bekend.\n // De tekst blijft staan zolang de error-state actief is.\n if (currentStatus === 'error') {\n setLiveText(\n errorLabel ??\n (errorMessage\n ? `${fileName}: ${errorMessage}`\n : `${fileName} uploaden mislukt`)\n );\n return undefined;\n }\n\n // Default en loading: geen aankondiging\n setLiveText('');\n return undefined;\n }, [currentStatus, fileName, uploadedLabel, errorLabel, errorMessage]);\n\n // Bestandsnaam zonder extensie voor visuele weergave\n const fileNameWithoutExt = React.useMemo(() => {\n const lastDot = fileName.lastIndexOf('.');\n return lastDot > 0 ? fileName.slice(0, lastDot) : fileName;\n }, [fileName]);\n\n // Meta-tekst: \"PDF · 1,2 MB\" of alleen type of grootte\n const metaParts = [fileType, fileSize].filter(Boolean);\n const metaText = metaParts.join(' · ');\n\n // Interactieve modus: href aanwezig en geen onDelete\n const isInteractive = Boolean(href) && !onDelete;\n // Stretched link: interactief zonder aparte download-CTA\n const isStretchedLink = isInteractive && ctaVariant !== 'download';\n\n const rootClasses = classNames(\n 'dsn-file',\n currentStatus === 'loading' && 'dsn-file--loading',\n currentStatus === 'uploaded' && 'dsn-file--uploaded',\n currentStatus === 'error' && 'dsn-file--error',\n isStretchedLink && 'dsn-file--interactive',\n className\n );\n\n const nameClasses = classNames(\n 'dsn-file__name',\n href && 'dsn-link',\n isStretchedLink && 'dsn-file__name--stretched'\n );\n\n const iconName = mediaType === 'image' ? 'photo' : 'file-description';\n const resolvedCtaLabel = ctaLabel ?? 'Download';\n\n return (\n <div ref={ref} className={rootClasses} {...props}>\n {/* Media-vlak: icoon of preview */}\n <div className=\"dsn-file__media\" aria-hidden=\"true\">\n {previewSrc ? (\n <img className=\"dsn-file__preview\" src={previewSrc} alt=\"\" />\n ) : (\n <Icon name={iconName} aria-hidden />\n )}\n </div>\n\n {/* Content: naam, meta en optionele ErrorMessage */}\n <div className=\"dsn-file__content\">\n {href ? (\n <a\n className={nameClasses}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {fileNameWithoutExt}\n </a>\n ) : (\n <span className={nameClasses}>{fileNameWithoutExt}</span>\n )}\n {metaText && <span className=\"dsn-file__meta\">{metaText}</span>}\n {currentStatus === 'error' && errorMessage && (\n <FormFieldErrorMessage>{errorMessage}</FormFieldErrorMessage>\n )}\n </div>\n\n {/* Actions: Spinner, status-icoon, verwijder-knop of CTA-link */}\n <div className=\"dsn-file__actions\">\n {!isInteractive && currentStatus === 'loading' && (\n <Spinner label={loadingLabel} hideLabel />\n )}\n {!isInteractive && currentStatus === 'uploaded' && (\n <Icon className=\"dsn-file__status-icon\" name=\"check\" aria-hidden />\n )}\n {!isInteractive &&\n (currentStatus === 'default' || currentStatus === 'error') &&\n onDelete && (\n <button\n type=\"button\"\n className=\"dsn-link dsn-link-button dsn-link--size-default\"\n onClick={onDelete}\n >\n <Icon name=\"trash\" aria-hidden />\n {deleteLabel}\n <span className=\"dsn-visually-hidden\"> {fileName}</span>\n </button>\n )}\n {isInteractive && ctaVariant === 'download' && (\n <a\n className=\"dsn-link\"\n href={href}\n aria-hidden=\"true\"\n tabIndex={-1}\n download\n >\n <Icon name=\"download\" aria-hidden />\n {resolvedCtaLabel}\n </a>\n )}\n </div>\n\n {/* aria-live regio: kondigt statuswijzigingen aan voor screenreaders */}\n <span\n className=\"dsn-visually-hidden\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {liveText}\n </span>\n </div>\n );\n }\n);\n\nFile.displayName = 'File';\n\n// =============================================================================\n// FileList — ul wrapper voor meerdere File items\n// =============================================================================\n\nexport interface FileListProps extends React.HTMLAttributes<HTMLUListElement> {\n /** File componenten */\n children?: React.ReactNode;\n className?: string;\n}\n\n/**\n * FileList component\n * Wrapper voor meerdere File componenten.\n * Rendert een <ul role=\"list\"> met <li> wrappers — nodig omdat CSS-resets lijstsemantiek verwijderen.\n *\n * @example\n * ```tsx\n * <FileList>\n * <File fileName=\"document.pdf\" fileType=\"PDF\" fileSize=\"1,2 MB\" href=\"...\" onDelete={() => {}} />\n * <File fileName=\"foto.jpg\" fileType=\"JPG\" fileSize=\"3,4 MB\" href=\"...\" onDelete={() => {}} />\n * </FileList>\n * ```\n */\nexport const FileList = React.forwardRef<HTMLUListElement, FileListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <ul\n ref={ref}\n className={classNames('dsn-file-list', className)}\n role=\"list\"\n {...props}\n >\n {React.Children.map(children, (child, index) => (\n <li key={index}>{child}</li>\n ))}\n </ul>\n );\n }\n);\n\nFileList.displayName = 'FileList';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0HA,MAAa,OAAO,MAAM,YAEtB,EACE,WACA,UACA,UACA,UACA,SAAS,WACT,cACA,MACA,UACA,cAAc,aACd,aAAa,QACb,UACA,YAAY,YACZ,YACA,eAAe,sBACf,eACA,YACA,GAAG,SAEL,QACG;CACH,MAAM,CAAC,eAAe,oBACpB,MAAM,SAAqB,MAAM;CACnC,MAAM,CAAC,UAAU,eAAe,MAAM,SAAS,EAAE;CAGjD,MAAM,gBAAgB;EACpB,iBAAiB,MAAM;CACzB,GAAG,CAAC,MAAM,CAAC;CAKX,MAAM,gBAAgB;EAEpB,IAAI,kBAAkB,YAAY;GAChC,YAAY,iBAAiB,GAAG,SAAS,oBAAoB;GAE7D,MAAM,QAAQ,iBAAiB;IAC7B,iBAAiB,SAAS;IAC1B,YAAY,EAAE;GAChB,GAAG,GAAI;GAEP,aAAa,aAAa,KAAK;EACjC;EAIA,IAAI,kBAAkB,SAAS;GAC7B,YACE,eACG,eACG,GAAG,SAAS,IAAI,iBAChB,GAAG,SAAS,mBACpB;GACA;EACF;EAGA,YAAY,EAAE;CAEhB,GAAG;EAAC;EAAe;EAAU;EAAe;EAAY;CAAY,CAAC;CAGrE,MAAM,qBAAqB,MAAM,cAAc;EAC7C,MAAM,UAAU,SAAS,YAAY,GAAG;EACxC,OAAO,UAAU,IAAI,SAAS,MAAM,GAAG,OAAO,IAAI;CACpD,GAAG,CAAC,QAAQ,CAAC;CAIb,MAAM,WADY,CAAC,UAAU,QAAQ,CAAC,CAAC,OAAO,OACrB,CAAC,CAAC,KAAK,KAAK;CAGrC,MAAM,gBAAgB,QAAQ,IAAI,KAAK,CAAC;CAExC,MAAM,kBAAkB,iBAAiB,eAAe;CAExD,MAAM,cAAc,WAClB,YACA,kBAAkB,aAAa,qBAC/B,kBAAkB,cAAc,sBAChC,kBAAkB,WAAW,mBAC7B,mBAAmB,yBACnB,SACF;CAEA,MAAM,cAAc,WAClB,kBACA,QAAQ,YACR,mBAAmB,2BACrB;CAEA,MAAM,WAAW,cAAc,UAAU,UAAU;CACnD,MAAM,mBAAmB,YAAY;CAErC,OACE,qBAAC,OAAD;EAAU;EAAK,WAAW;EAAa,GAAI;EAA3C,UAAA;GAEE,oBAAC,OAAD;IAAK,WAAU;IAAkB,eAAY;IAC1C,UAAA,aACC,oBAAC,OAAD;KAAK,WAAU;KAAoB,KAAK;KAAY,KAAI;IAAI,CAAA,IAE5D,oBAAC,MAAD;KAAM,MAAM;KAAU,eAAA;IAAa,CAAA;GAElC,CAAA;GAGL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,OACC,oBAAC,KAAD;MACE,WAAW;MACL;MACN,QAAO;MACP,KAAI;MAEH,UAAA;KACA,CAAA,IAEH,oBAAC,QAAD;MAAM,WAAW;MAAc,UAAA;KAAyB,CAAA;KAEzD,YAAY,oBAAC,QAAD;MAAM,WAAU;MAAkB,UAAA;KAAe,CAAA;KAC7D,kBAAkB,WAAW,gBAC5B,oBAAC,uBAAD,EAAA,UAAwB,aAAoC,CAAA;IAE3D;;GAGL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,CAAC,iBAAiB,kBAAkB,aACnC,oBAAC,SAAD;MAAS,OAAO;MAAc,WAAA;KAAW,CAAA;KAE1C,CAAC,iBAAiB,kBAAkB,cACnC,oBAAC,MAAD;MAAM,WAAU;MAAwB,MAAK;MAAQ,eAAA;KAAa,CAAA;KAEnE,CAAC,kBACC,kBAAkB,aAAa,kBAAkB,YAClD,YACE,qBAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,SAAS;MAHX,UAAA;OAKE,oBAAC,MAAD;QAAM,MAAK;QAAQ,eAAA;OAAa,CAAA;OAC/B;OACD,qBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CAAsC,KAAE,QAAe;;MACjD;;KAEX,iBAAiB,eAAe,cAC/B,qBAAC,KAAD;MACE,WAAU;MACJ;MACN,eAAY;MACZ,UAAU;MACV,UAAA;MALF,UAAA,CAOE,oBAAC,MAAD;OAAM,MAAK;OAAW,eAAA;MAAa,CAAA,GAClC,gBACA;;IAEF;;GAGL,oBAAC,QAAD;IACE,WAAU;IACV,aAAU;IACV,eAAY;IAEX,UAAA;GACG,CAAA;EACH;;AAET,CACF;AAEA,KAAK,cAAc;;;;;;;;;;;;;;AAyBnB,MAAa,WAAW,MAAM,YAC3B,EAAE,WAAW,UAAU,GAAG,SAAS,QAAQ;CAC1C,OACE,oBAAC,MAAD;EACO;EACL,WAAW,WAAW,iBAAiB,SAAS;EAChD,MAAK;EACL,GAAI;EAEH,UAAA,MAAM,SAAS,IAAI,WAAW,OAAO,UACpC,oBAAC,MAAD,EAAA,UAAiB,MAAU,GAAlB,KAAkB,CAC5B;CACC,CAAA;AAER,CACF;AAEA,SAAS,cAAc"}
|