@erst-vg/dkfds-vite 8.0.1
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.md +42 -0
- package/README.md +55 -0
- package/dist/README.md +55 -0
- package/dist/css/dkfds-borgerdk.css +12066 -0
- package/dist/css/dkfds-borgerdk.min.css +4 -0
- package/dist/css/dkfds-borgerdk.min.css.map +1 -0
- package/dist/css/dkfds-virkdk.css +12066 -0
- package/dist/css/dkfds-virkdk.min.css +4 -0
- package/dist/css/dkfds-virkdk.min.css.map +1 -0
- package/dist/css/dkfds.css +12066 -0
- package/dist/css/dkfds.min.css +4 -0
- package/dist/css/dkfds.min.css.map +1 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Bold.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-BoldItalic.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-ExtraLight.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-ExtraLightItalic.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Italic.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Light.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-LightItalic.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Medium.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-MediumItalic.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Regular.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-SemiBold.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-SemiBoldItalic.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Text.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-TextItalic.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Thin.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/IBMPlexSans-ThinItalic.eot +0 -0
- package/dist/fonts/IBMPlexSans/complete/eot/license.txt +92 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Bold.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-BoldItalic.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-ExtraLight.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-ExtraLightItalic.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Italic.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Light.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-LightItalic.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Medium.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-MediumItalic.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Regular.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-SemiBold.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-SemiBoldItalic.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Text.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-TextItalic.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Thin.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/IBMPlexSans-ThinItalic.otf +0 -0
- package/dist/fonts/IBMPlexSans/complete/otf/license.txt +92 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Bold.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-BoldItalic.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-ExtraLight.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-ExtraLightItalic.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Italic.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Light.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-LightItalic.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Medium.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-MediumItalic.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Regular.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-SemiBold.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-SemiBoldItalic.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Text.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-TextItalic.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Thin.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-ThinItalic.ttf +0 -0
- package/dist/fonts/IBMPlexSans/complete/ttf/license.txt +92 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Bold.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-BoldItalic.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-ExtraLight.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-ExtraLightItalic.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Italic.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Light.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-LightItalic.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Medium.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-MediumItalic.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Regular.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-SemiBold.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-SemiBoldItalic.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Text.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-TextItalic.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Thin.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/IBMPlexSans-ThinItalic.woff +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff/license.txt +92 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Bold.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-BoldItalic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-ExtraLight.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-ExtraLightItalic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Italic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Light.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-LightItalic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Medium.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-MediumItalic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Regular.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-SemiBold.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-SemiBoldItalic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Text.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-TextItalic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Thin.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-ThinItalic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/complete/woff2/license.txt +92 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Cyrillic.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Greek.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Latin1.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Latin2.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Latin3.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Pi.woff +0 -0
- package/dist/fonts/IBMPlexSans/split/woff/license.txt +92 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Cyrillic.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Greek.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Latin1.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Latin2.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Latin3.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Pi.woff2 +0 -0
- package/dist/fonts/IBMPlexSans/split/woff2/license.txt +92 -0
- package/dist/img/all-svg-icons.svg +1 -0
- package/dist/img/favicons/favicon-erst.png +0 -0
- package/dist/img/favicons/favicon2-erst.png +0 -0
- package/dist/img/logo-borgerdk.svg +1 -0
- package/dist/img/logo-header-placeholder.png +0 -0
- package/dist/img/logo-placeholder.png +0 -0
- package/dist/img/logo_virk.svg +52 -0
- package/dist/img/svg-icons/accessibility-new.svg +1 -0
- package/dist/img/svg-icons/account-circle.svg +1 -0
- package/dist/img/svg-icons/add-a-photo.svg +1 -0
- package/dist/img/svg-icons/add.svg +1 -0
- package/dist/img/svg-icons/agriculture.svg +1 -0
- package/dist/img/svg-icons/apps.svg +1 -0
- package/dist/img/svg-icons/arrow-back.svg +1 -0
- package/dist/img/svg-icons/arrow-downward.svg +1 -0
- package/dist/img/svg-icons/arrow-drop-down.svg +1 -0
- package/dist/img/svg-icons/arrow-drop-up.svg +1 -0
- package/dist/img/svg-icons/arrow-forward.svg +1 -0
- package/dist/img/svg-icons/arrow-left.svg +1 -0
- package/dist/img/svg-icons/arrow-right.svg +1 -0
- package/dist/img/svg-icons/arrow-upward.svg +1 -0
- package/dist/img/svg-icons/assessment.svg +1 -0
- package/dist/img/svg-icons/assignment.svg +1 -0
- package/dist/img/svg-icons/attach-file.svg +1 -0
- package/dist/img/svg-icons/bookmark-border.svg +1 -0
- package/dist/img/svg-icons/bookmarks.svg +1 -0
- package/dist/img/svg-icons/cached.svg +1 -0
- package/dist/img/svg-icons/calculator.svg +1 -0
- package/dist/img/svg-icons/card-account-details.svg +1 -0
- package/dist/img/svg-icons/card-text.svg +1 -0
- package/dist/img/svg-icons/chat.svg +1 -0
- package/dist/img/svg-icons/check-circle-white.svg +1 -0
- package/dist/img/svg-icons/check-circle.svg +1 -0
- package/dist/img/svg-icons/chevron-double-left.svg +1 -0
- package/dist/img/svg-icons/chevron-double-right.svg +1 -0
- package/dist/img/svg-icons/chevron-left.svg +1 -0
- package/dist/img/svg-icons/chevron-right.svg +1 -0
- package/dist/img/svg-icons/close.svg +1 -0
- package/dist/img/svg-icons/construction.svg +1 -0
- package/dist/img/svg-icons/contact-support.svg +1 -0
- package/dist/img/svg-icons/content-copy.svg +1 -0
- package/dist/img/svg-icons/coronavirus.svg +1 -0
- package/dist/img/svg-icons/create-new-folder.svg +1 -0
- package/dist/img/svg-icons/credit-card.svg +1 -0
- package/dist/img/svg-icons/database.svg +1 -0
- package/dist/img/svg-icons/delete.svg +1 -0
- package/dist/img/svg-icons/desktop-windows.svg +1 -0
- package/dist/img/svg-icons/domain.svg +1 -0
- package/dist/img/svg-icons/done.svg +1 -0
- package/dist/img/svg-icons/download-done.svg +1 -0
- package/dist/img/svg-icons/drive-eta.svg +1 -0
- package/dist/img/svg-icons/email.svg +1 -0
- package/dist/img/svg-icons/engineering.svg +1 -0
- package/dist/img/svg-icons/expand-less.svg +1 -0
- package/dist/img/svg-icons/expand-more-white.svg +1 -0
- package/dist/img/svg-icons/expand-more.svg +1 -0
- package/dist/img/svg-icons/face.svg +1 -0
- package/dist/img/svg-icons/feedback.svg +1 -0
- package/dist/img/svg-icons/file-download.svg +1 -0
- package/dist/img/svg-icons/file-excel.svg +1 -0
- package/dist/img/svg-icons/file-image.svg +1 -0
- package/dist/img/svg-icons/file-pdf.svg +1 -0
- package/dist/img/svg-icons/file-upload.svg +1 -0
- package/dist/img/svg-icons/file-word.svg +1 -0
- package/dist/img/svg-icons/first-page.svg +1 -0
- package/dist/img/svg-icons/flag.svg +1 -0
- package/dist/img/svg-icons/folder-open.svg +1 -0
- package/dist/img/svg-icons/folder.svg +1 -0
- package/dist/img/svg-icons/format-align-center.svg +1 -0
- package/dist/img/svg-icons/format-align-justify.svg +1 -0
- package/dist/img/svg-icons/format-align-left.svg +1 -0
- package/dist/img/svg-icons/format-align-right.svg +1 -0
- package/dist/img/svg-icons/format-bold.svg +1 -0
- package/dist/img/svg-icons/format-clear.svg +1 -0
- package/dist/img/svg-icons/format-color-fill.svg +1 -0
- package/dist/img/svg-icons/format-color-text.svg +1 -0
- package/dist/img/svg-icons/format-indent-decrease.svg +1 -0
- package/dist/img/svg-icons/format-indent-increase.svg +1 -0
- package/dist/img/svg-icons/format-italic.svg +1 -0
- package/dist/img/svg-icons/format-list-bulleted.svg +1 -0
- package/dist/img/svg-icons/format-list-checks.svg +1 -0
- package/dist/img/svg-icons/format-list-numbered.svg +1 -0
- package/dist/img/svg-icons/format-size.svg +1 -0
- package/dist/img/svg-icons/format-underlined.svg +1 -0
- package/dist/img/svg-icons/forum.svg +1 -0
- package/dist/img/svg-icons/forward.svg +1 -0
- package/dist/img/svg-icons/fullscreen-exit.svg +1 -0
- package/dist/img/svg-icons/fullscreen.svg +1 -0
- package/dist/img/svg-icons/grade-outline.svg +1 -0
- package/dist/img/svg-icons/grade.svg +1 -0
- package/dist/img/svg-icons/groups.svg +1 -0
- package/dist/img/svg-icons/headphones.svg +1 -0
- package/dist/img/svg-icons/help.svg +1 -0
- package/dist/img/svg-icons/highlight-off-white.svg +1 -0
- package/dist/img/svg-icons/highlight-off.svg +1 -0
- package/dist/img/svg-icons/home.svg +1 -0
- package/dist/img/svg-icons/hourglass-empty.svg +1 -0
- package/dist/img/svg-icons/how-to-reg.svg +1 -0
- package/dist/img/svg-icons/info-white.svg +56 -0
- package/dist/img/svg-icons/info.svg +1 -0
- package/dist/img/svg-icons/insert-drive-file.svg +1 -0
- package/dist/img/svg-icons/insert-invitation.svg +1 -0
- package/dist/img/svg-icons/language.svg +1 -0
- package/dist/img/svg-icons/laptop.svg +1 -0
- package/dist/img/svg-icons/last-page.svg +1 -0
- package/dist/img/svg-icons/link.svg +1 -0
- package/dist/img/svg-icons/list-alt.svg +1 -0
- package/dist/img/svg-icons/local-shipping.svg +1 -0
- package/dist/img/svg-icons/location-on.svg +1 -0
- package/dist/img/svg-icons/lock-open.svg +1 -0
- package/dist/img/svg-icons/lock.svg +1 -0
- package/dist/img/svg-icons/map.svg +1 -0
- package/dist/img/svg-icons/menu.svg +1 -0
- package/dist/img/svg-icons/mode.svg +1 -0
- package/dist/img/svg-icons/more-horiz.svg +1 -0
- package/dist/img/svg-icons/more-vert.svg +1 -0
- package/dist/img/svg-icons/mouse.svg +1 -0
- package/dist/img/svg-icons/note-add.svg +1 -0
- package/dist/img/svg-icons/notifications.svg +1 -0
- package/dist/img/svg-icons/open-in-new.svg +1 -0
- package/dist/img/svg-icons/open-with.svg +1 -0
- package/dist/img/svg-icons/outlined-flag.svg +1 -0
- package/dist/img/svg-icons/palette.svg +1 -0
- package/dist/img/svg-icons/payments.svg +1 -0
- package/dist/img/svg-icons/people-alt.svg +1 -0
- package/dist/img/svg-icons/person-add-alt-1.svg +1 -0
- package/dist/img/svg-icons/person-remove.svg +1 -0
- package/dist/img/svg-icons/person.svg +1 -0
- package/dist/img/svg-icons/phone-iphone.svg +1 -0
- package/dist/img/svg-icons/photo-camera.svg +1 -0
- package/dist/img/svg-icons/playlist-add-check.svg +1 -0
- package/dist/img/svg-icons/playlist-add.svg +1 -0
- package/dist/img/svg-icons/print.svg +1 -0
- package/dist/img/svg-icons/query-builder.svg +1 -0
- package/dist/img/svg-icons/refresh.svg +1 -0
- package/dist/img/svg-icons/remove.svg +1 -0
- package/dist/img/svg-icons/reply.svg +1 -0
- package/dist/img/svg-icons/report-problem.svg +1 -0
- package/dist/img/svg-icons/save.svg +1 -0
- package/dist/img/svg-icons/school.svg +1 -0
- package/dist/img/svg-icons/science.svg +1 -0
- package/dist/img/svg-icons/search.svg +1 -0
- package/dist/img/svg-icons/send.svg +1 -0
- package/dist/img/svg-icons/settings.svg +1 -0
- package/dist/img/svg-icons/share.svg +1 -0
- package/dist/img/svg-icons/shopping-cart.svg +1 -0
- package/dist/img/svg-icons/sort-ascending.svg +2 -0
- package/dist/img/svg-icons/sort-by-alpha.svg +1 -0
- package/dist/img/svg-icons/sort-default.svg +1 -0
- package/dist/img/svg-icons/sort-descending.svg +1 -0
- package/dist/img/svg-icons/sort-table-ascending.svg +1 -0
- package/dist/img/svg-icons/sort-table-descending.svg +1 -0
- package/dist/img/svg-icons/sort-table-none.svg +1 -0
- package/dist/img/svg-icons/sort.svg +1 -0
- package/dist/img/svg-icons/subdirectory-arrow-left.svg +1 -0
- package/dist/img/svg-icons/subdirectory-arrow-right.svg +1 -0
- package/dist/img/svg-icons/support-agent.svg +1 -0
- package/dist/img/svg-icons/text-format.svg +1 -0
- package/dist/img/svg-icons/trash-can.svg +1 -0
- package/dist/img/svg-icons/tune.svg +1 -0
- package/dist/img/svg-icons/vertical-split.svg +1 -0
- package/dist/img/svg-icons/videocam.svg +1 -0
- package/dist/img/svg-icons/view-headline.svg +1 -0
- package/dist/img/svg-icons/visibility-off.svg +1 -0
- package/dist/img/svg-icons/visibility.svg +1 -0
- package/dist/img/svg-icons/zoom-in.svg +1 -0
- package/dist/img/svg-icons/zoom-out.svg +1 -0
- package/dist/js/dkfds.js +7050 -0
- package/dist/js/dkfds.min.js +2 -0
- package/dist/js/dkfds.min.js.map +1 -0
- package/dist/scss/_dkfds-base.scss +76 -0
- package/dist/scss/components/_accordions.scss +162 -0
- package/dist/scss/components/_alerts.scss +113 -0
- package/dist/scss/components/_breadcrumbs.scss +62 -0
- package/dist/scss/components/_cards.scss +235 -0
- package/dist/scss/components/_cookie-message.scss +41 -0
- package/dist/scss/components/_date-picker.scss +391 -0
- package/dist/scss/components/_details.scss +61 -0
- package/dist/scss/components/_footer.scss +83 -0
- package/dist/scss/components/_header.scss +339 -0
- package/dist/scss/components/_language-switcher.scss +63 -0
- package/dist/scss/components/_modal.scss +155 -0
- package/dist/scss/components/_navigation.scss +544 -0
- package/dist/scss/components/_overflow-menu.scss +234 -0
- package/dist/scss/components/_page-navigation.scss +12 -0
- package/dist/scss/components/_pagination.scss +136 -0
- package/dist/scss/components/_search.scss +33 -0
- package/dist/scss/components/_sidenav.scss +205 -0
- package/dist/scss/components/_skipnav.scss +31 -0
- package/dist/scss/components/_tabnav.scss +122 -0
- package/dist/scss/components/_toast.scss +105 -0
- package/dist/scss/components/_tooltip.scss +72 -0
- package/dist/scss/core/_base.scss +28 -0
- package/dist/scss/core/_fonts.scss +139 -0
- package/dist/scss/core/_functions.scss +593 -0
- package/dist/scss/core/_grid.scss +118 -0
- package/dist/scss/core/_print.scss +187 -0
- package/dist/scss/core/_properties.scss +145 -0
- package/dist/scss/core/_system-tokens.scss +403 -0
- package/dist/scss/core/_typography.scss +500 -0
- package/dist/scss/core/_variables.scss +18 -0
- package/dist/scss/core/colors/_blue.scss +8 -0
- package/dist/scss/core/colors/_data-blue.scss +13 -0
- package/dist/scss/core/colors/_data-green-blue.scss +13 -0
- package/dist/scss/core/colors/_data-green.scss +13 -0
- package/dist/scss/core/colors/_data-orange.scss +13 -0
- package/dist/scss/core/colors/_data-pink-violet.scss +13 -0
- package/dist/scss/core/colors/_data-violet.scss +13 -0
- package/dist/scss/core/colors/_data-yellow-red.scss +13 -0
- package/dist/scss/core/colors/_gray.scss +11 -0
- package/dist/scss/core/colors/_green.scss +6 -0
- package/dist/scss/core/colors/_orange.scss +7 -0
- package/dist/scss/core/colors/_purple.scss +6 -0
- package/dist/scss/core/colors/_red.scss +6 -0
- package/dist/scss/core/mixins/_add-background-svg.scss +7 -0
- package/dist/scss/core/mixins/_breakpoints.scss +119 -0
- package/dist/scss/core/mixins/_grid-mixins.scss +42 -0
- package/dist/scss/core/mixins/_mixins.scss +126 -0
- package/dist/scss/core/utilities/_background.scss +15 -0
- package/dist/scss/core/utilities/_display.scss +26 -0
- package/dist/scss/core/utilities/_flex.scss +43 -0
- package/dist/scss/core/utilities/_position.scss +35 -0
- package/dist/scss/core/utilities/_spacing.scss +50 -0
- package/dist/scss/core/utilities/_text-color.scss +5 -0
- package/dist/scss/core/utilities/_textalign.scss +13 -0
- package/dist/scss/core/utilities/_width.scss +26 -0
- package/dist/scss/dkfds-borgerdk.scss +4 -0
- package/dist/scss/dkfds-virkdk.scss +4 -0
- package/dist/scss/dkfds.scss +4 -0
- package/dist/scss/elements/_badge.scss +36 -0
- package/dist/scss/elements/_buttons.scss +280 -0
- package/dist/scss/elements/_collapse.scss +17 -0
- package/dist/scss/elements/_embed.scss +27 -0
- package/dist/scss/elements/_figure.scss +7 -0
- package/dist/scss/elements/_forms.scss +93 -0
- package/dist/scss/elements/_hr.scss +5 -0
- package/dist/scss/elements/_icons.scss +204 -0
- package/dist/scss/elements/_inputs.scss +589 -0
- package/dist/scss/elements/_list.scss +83 -0
- package/dist/scss/elements/_page.scss +34 -0
- package/dist/scss/elements/_section.scss +3 -0
- package/dist/scss/elements/_spinner.scss +76 -0
- package/dist/scss/elements/_table.scss +283 -0
- package/dist/scss/elements/_tags.scss +64 -0
- package/dist/scss/elements/_toggle.scss +113 -0
- package/dist/scss/lib/_normalize.scss +349 -0
- package/dist/scss/settings/_settings-color.scss +46 -0
- package/dist/scss/settings/_settings-components.scss +415 -0
- package/dist/scss/settings/_settings-general.scss +43 -0
- package/dist/scss/settings/_settings-typography.scss +212 -0
- package/dist/scss/themes/_borgerdk.scss +23 -0
- package/dist/scss/themes/_virkdk.scss +21 -0
- package/package.json +58 -0
- package/src/components/accordion/accordion.njk +43 -0
- package/src/components/accordion/accordion.yaml +62 -0
- package/src/components/alerts/alerts.njk +19 -0
- package/src/components/alerts/alerts.yaml +41 -0
- package/src/components/badge/badges.njk +3 -0
- package/src/components/badge/badges.yaml +9 -0
- package/src/components/breadcrumbs/breadcrumbs.njk +15 -0
- package/src/components/breadcrumbs/breadcrumbs.yaml +45 -0
- package/src/components/buttons/buttons.njk +11 -0
- package/src/components/buttons/buttons.yaml +25 -0
- package/src/components/cards/cards.njk +56 -0
- package/src/components/cards/cards.yaml +39 -0
- package/src/components/cookie-message/cookie-message.njk +20 -0
- package/src/components/cookie-message/cookie-message.yaml +17 -0
- package/src/components/details/details.njk +8 -0
- package/src/components/details/details.yaml +9 -0
- package/src/components/footers/footer.njk +40 -0
- package/src/components/footers/footer.yaml +66 -0
- package/src/components/form/controls/checkbox.njk +4 -0
- package/src/components/form/controls/checkbox.yaml +41 -0
- package/src/components/form/controls/date-input.njk +30 -0
- package/src/components/form/controls/date-input.yaml +81 -0
- package/src/components/form/controls/date-picker.njk +13 -0
- package/src/components/form/controls/date-picker.yaml +62 -0
- package/src/components/form/controls/errormessage.njk +5 -0
- package/src/components/form/controls/errormessage.yaml +9 -0
- package/src/components/form/controls/helptext.njk +7 -0
- package/src/components/form/controls/helptext.yaml +9 -0
- package/src/components/form/controls/label.njk +8 -0
- package/src/components/form/controls/label.yaml +28 -0
- package/src/components/form/controls/radiobutton.njk +7 -0
- package/src/components/form/controls/radiobutton.yaml +54 -0
- package/src/components/form/controls/select.njk +19 -0
- package/src/components/form/controls/select.yaml +73 -0
- package/src/components/form/controls/text-area.njk +16 -0
- package/src/components/form/controls/text-area.yaml +74 -0
- package/src/components/form/controls/text-input.njk +29 -0
- package/src/components/form/controls/text-input.yaml +89 -0
- package/src/components/header/header.njk +46 -0
- package/src/components/header/header.yaml +101 -0
- package/src/components/icons/base-svg.njk +163 -0
- package/src/components/icons/icons--svg.njk +1 -0
- package/src/components/icons/icons--svg.yaml +25 -0
- package/src/components/icons/icons.njk +3 -0
- package/src/components/icons/icons.yaml +13 -0
- package/src/components/labels/labels.njk +3 -0
- package/src/components/labels/labels.yaml +9 -0
- package/src/components/language-switcher/language-switcher.njk +11 -0
- package/src/components/language-switcher/language-switcher.yaml +30 -0
- package/src/components/modal/modal.njk +21 -0
- package/src/components/modal/modal.yaml +25 -0
- package/src/components/overflow-menu/overflow-menu-sort.njk +15 -0
- package/src/components/overflow-menu/overflow-menu-sort.yaml +37 -0
- package/src/components/overflow-menu/overflow-menu.njk +13 -0
- package/src/components/overflow-menu/overflow-menu.yaml +33 -0
- package/src/components/pagination/pagination.njk +78 -0
- package/src/components/pagination/pagination.yaml +25 -0
- package/src/components/side-navigation/sidenav.njk +11 -0
- package/src/components/side-navigation/sidenav.yaml +41 -0
- package/src/components/side-navigation/stepguide.njk +23 -0
- package/src/components/side-navigation/stepguide.yaml +37 -0
- package/src/components/spinner/spinner.njk +4 -0
- package/src/components/spinner/spinner.yaml +5 -0
- package/src/components/table/table.njk +56 -0
- package/src/components/table/table.yaml +42 -0
- package/src/components/tabnav/tabnav.njk +19 -0
- package/src/components/tabnav/tabnav.yaml +33 -0
- package/src/components/tags/tags.njk +4 -0
- package/src/components/tags/tags.yaml +18 -0
- package/src/components/toast/toast.njk +10 -0
- package/src/components/toast/toast.yaml +17 -0
- package/src/components/toggle/toggle.njk +4 -0
- package/src/components/toggle/toggle.yaml +38 -0
- package/src/components/type/links.njk +3 -0
- package/src/components/type/lists.njk +25 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Bold.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-BoldItalic.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-ExtraLight.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-ExtraLightItalic.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Italic.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Light.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-LightItalic.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Medium.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-MediumItalic.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Regular.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-SemiBold.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-SemiBoldItalic.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Text.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-TextItalic.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-Thin.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/IBMPlexSans-ThinItalic.eot +0 -0
- package/src/fonts/IBMPlexSans/complete/eot/license.txt +92 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Bold.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-BoldItalic.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-ExtraLight.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-ExtraLightItalic.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Italic.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Light.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-LightItalic.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Medium.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-MediumItalic.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Regular.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-SemiBold.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-SemiBoldItalic.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Text.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-TextItalic.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-Thin.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/IBMPlexSans-ThinItalic.otf +0 -0
- package/src/fonts/IBMPlexSans/complete/otf/license.txt +92 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Bold.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-BoldItalic.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-ExtraLight.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-ExtraLightItalic.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Italic.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Light.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-LightItalic.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Medium.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-MediumItalic.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Regular.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-SemiBold.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-SemiBoldItalic.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Text.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-TextItalic.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-Thin.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/IBMPlexSans-ThinItalic.ttf +0 -0
- package/src/fonts/IBMPlexSans/complete/ttf/license.txt +92 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Bold.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-BoldItalic.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-ExtraLight.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-ExtraLightItalic.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Italic.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Light.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-LightItalic.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Medium.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-MediumItalic.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Regular.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-SemiBold.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-SemiBoldItalic.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Text.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-TextItalic.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-Thin.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/IBMPlexSans-ThinItalic.woff +0 -0
- package/src/fonts/IBMPlexSans/complete/woff/license.txt +92 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Bold.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-BoldItalic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-ExtraLight.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-ExtraLightItalic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Italic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Light.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-LightItalic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Medium.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-MediumItalic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Regular.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-SemiBold.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-SemiBoldItalic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Text.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-TextItalic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-Thin.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/IBMPlexSans-ThinItalic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/complete/woff2/license.txt +92 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Bold-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-BoldItalic-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLight-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ExtraLightItalic-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Italic-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Light-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-LightItalic-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Medium-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-MediumItalic-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Regular-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBold-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-SemiBoldItalic-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Text-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-TextItalic-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-Thin-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Cyrillic.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Greek.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Latin1.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Latin2.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Latin3.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/IBMPlexSans-ThinItalic-Pi.woff +0 -0
- package/src/fonts/IBMPlexSans/split/woff/license.txt +92 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Bold-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-BoldItalic-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLight-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ExtraLightItalic-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Italic-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Light-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-LightItalic-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Medium-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-MediumItalic-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Regular-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBold-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-SemiBoldItalic-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Text-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-TextItalic-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-Thin-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Cyrillic.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Greek.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Latin1.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Latin2.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Latin3.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/IBMPlexSans-ThinItalic-Pi.woff2 +0 -0
- package/src/fonts/IBMPlexSans/split/woff2/license.txt +92 -0
- package/src/img/all-svg-icons.svg +1 -0
- package/src/img/favicons/favicon-erst.png +0 -0
- package/src/img/favicons/favicon2-erst.png +0 -0
- package/src/img/logo-borgerdk.svg +1 -0
- package/src/img/logo-header-placeholder.png +0 -0
- package/src/img/logo-placeholder.png +0 -0
- package/src/img/logo_virk.svg +52 -0
- package/src/img/svg-icons/accessibility-new.svg +1 -0
- package/src/img/svg-icons/account-circle.svg +1 -0
- package/src/img/svg-icons/add-a-photo.svg +1 -0
- package/src/img/svg-icons/add.svg +1 -0
- package/src/img/svg-icons/agriculture.svg +1 -0
- package/src/img/svg-icons/apps.svg +1 -0
- package/src/img/svg-icons/arrow-back.svg +1 -0
- package/src/img/svg-icons/arrow-downward.svg +1 -0
- package/src/img/svg-icons/arrow-drop-down.svg +1 -0
- package/src/img/svg-icons/arrow-drop-up.svg +1 -0
- package/src/img/svg-icons/arrow-forward.svg +1 -0
- package/src/img/svg-icons/arrow-left.svg +1 -0
- package/src/img/svg-icons/arrow-right.svg +1 -0
- package/src/img/svg-icons/arrow-upward.svg +1 -0
- package/src/img/svg-icons/assessment.svg +1 -0
- package/src/img/svg-icons/assignment.svg +1 -0
- package/src/img/svg-icons/attach-file.svg +1 -0
- package/src/img/svg-icons/bookmark-border.svg +1 -0
- package/src/img/svg-icons/bookmarks.svg +1 -0
- package/src/img/svg-icons/cached.svg +1 -0
- package/src/img/svg-icons/calculator.svg +1 -0
- package/src/img/svg-icons/card-account-details.svg +1 -0
- package/src/img/svg-icons/card-text.svg +1 -0
- package/src/img/svg-icons/chat.svg +1 -0
- package/src/img/svg-icons/check-circle-white.svg +1 -0
- package/src/img/svg-icons/check-circle.svg +1 -0
- package/src/img/svg-icons/chevron-double-left.svg +1 -0
- package/src/img/svg-icons/chevron-double-right.svg +1 -0
- package/src/img/svg-icons/chevron-left.svg +1 -0
- package/src/img/svg-icons/chevron-right.svg +1 -0
- package/src/img/svg-icons/close.svg +1 -0
- package/src/img/svg-icons/construction.svg +1 -0
- package/src/img/svg-icons/contact-support.svg +1 -0
- package/src/img/svg-icons/content-copy.svg +1 -0
- package/src/img/svg-icons/coronavirus.svg +1 -0
- package/src/img/svg-icons/create-new-folder.svg +1 -0
- package/src/img/svg-icons/credit-card.svg +1 -0
- package/src/img/svg-icons/database.svg +1 -0
- package/src/img/svg-icons/delete.svg +1 -0
- package/src/img/svg-icons/desktop-windows.svg +1 -0
- package/src/img/svg-icons/domain.svg +1 -0
- package/src/img/svg-icons/done.svg +1 -0
- package/src/img/svg-icons/download-done.svg +1 -0
- package/src/img/svg-icons/drive-eta.svg +1 -0
- package/src/img/svg-icons/email.svg +1 -0
- package/src/img/svg-icons/engineering.svg +1 -0
- package/src/img/svg-icons/expand-less.svg +1 -0
- package/src/img/svg-icons/expand-more-white.svg +1 -0
- package/src/img/svg-icons/expand-more.svg +1 -0
- package/src/img/svg-icons/face.svg +1 -0
- package/src/img/svg-icons/feedback.svg +1 -0
- package/src/img/svg-icons/file-download.svg +1 -0
- package/src/img/svg-icons/file-excel.svg +1 -0
- package/src/img/svg-icons/file-image.svg +1 -0
- package/src/img/svg-icons/file-pdf.svg +1 -0
- package/src/img/svg-icons/file-upload.svg +1 -0
- package/src/img/svg-icons/file-word.svg +1 -0
- package/src/img/svg-icons/first-page.svg +1 -0
- package/src/img/svg-icons/flag.svg +1 -0
- package/src/img/svg-icons/folder-open.svg +1 -0
- package/src/img/svg-icons/folder.svg +1 -0
- package/src/img/svg-icons/format-align-center.svg +1 -0
- package/src/img/svg-icons/format-align-justify.svg +1 -0
- package/src/img/svg-icons/format-align-left.svg +1 -0
- package/src/img/svg-icons/format-align-right.svg +1 -0
- package/src/img/svg-icons/format-bold.svg +1 -0
- package/src/img/svg-icons/format-clear.svg +1 -0
- package/src/img/svg-icons/format-color-fill.svg +1 -0
- package/src/img/svg-icons/format-color-text.svg +1 -0
- package/src/img/svg-icons/format-indent-decrease.svg +1 -0
- package/src/img/svg-icons/format-indent-increase.svg +1 -0
- package/src/img/svg-icons/format-italic.svg +1 -0
- package/src/img/svg-icons/format-list-bulleted.svg +1 -0
- package/src/img/svg-icons/format-list-checks.svg +1 -0
- package/src/img/svg-icons/format-list-numbered.svg +1 -0
- package/src/img/svg-icons/format-size.svg +1 -0
- package/src/img/svg-icons/format-underlined.svg +1 -0
- package/src/img/svg-icons/forum.svg +1 -0
- package/src/img/svg-icons/forward.svg +1 -0
- package/src/img/svg-icons/fullscreen-exit.svg +1 -0
- package/src/img/svg-icons/fullscreen.svg +1 -0
- package/src/img/svg-icons/grade-outline.svg +1 -0
- package/src/img/svg-icons/grade.svg +1 -0
- package/src/img/svg-icons/groups.svg +1 -0
- package/src/img/svg-icons/headphones.svg +1 -0
- package/src/img/svg-icons/help.svg +1 -0
- package/src/img/svg-icons/highlight-off-white.svg +1 -0
- package/src/img/svg-icons/highlight-off.svg +1 -0
- package/src/img/svg-icons/home.svg +1 -0
- package/src/img/svg-icons/hourglass-empty.svg +1 -0
- package/src/img/svg-icons/how-to-reg.svg +1 -0
- package/src/img/svg-icons/info-white.svg +56 -0
- package/src/img/svg-icons/info.svg +1 -0
- package/src/img/svg-icons/insert-drive-file.svg +1 -0
- package/src/img/svg-icons/insert-invitation.svg +1 -0
- package/src/img/svg-icons/language.svg +1 -0
- package/src/img/svg-icons/laptop.svg +1 -0
- package/src/img/svg-icons/last-page.svg +1 -0
- package/src/img/svg-icons/link.svg +1 -0
- package/src/img/svg-icons/list-alt.svg +1 -0
- package/src/img/svg-icons/local-shipping.svg +1 -0
- package/src/img/svg-icons/location-on.svg +1 -0
- package/src/img/svg-icons/lock-open.svg +1 -0
- package/src/img/svg-icons/lock.svg +1 -0
- package/src/img/svg-icons/map.svg +1 -0
- package/src/img/svg-icons/menu.svg +1 -0
- package/src/img/svg-icons/mode.svg +1 -0
- package/src/img/svg-icons/more-horiz.svg +1 -0
- package/src/img/svg-icons/more-vert.svg +1 -0
- package/src/img/svg-icons/mouse.svg +1 -0
- package/src/img/svg-icons/note-add.svg +1 -0
- package/src/img/svg-icons/notifications.svg +1 -0
- package/src/img/svg-icons/open-in-new.svg +1 -0
- package/src/img/svg-icons/open-with.svg +1 -0
- package/src/img/svg-icons/outlined-flag.svg +1 -0
- package/src/img/svg-icons/palette.svg +1 -0
- package/src/img/svg-icons/payments.svg +1 -0
- package/src/img/svg-icons/people-alt.svg +1 -0
- package/src/img/svg-icons/person-add-alt-1.svg +1 -0
- package/src/img/svg-icons/person-remove.svg +1 -0
- package/src/img/svg-icons/person.svg +1 -0
- package/src/img/svg-icons/phone-iphone.svg +1 -0
- package/src/img/svg-icons/photo-camera.svg +1 -0
- package/src/img/svg-icons/playlist-add-check.svg +1 -0
- package/src/img/svg-icons/playlist-add.svg +1 -0
- package/src/img/svg-icons/print.svg +1 -0
- package/src/img/svg-icons/query-builder.svg +1 -0
- package/src/img/svg-icons/refresh.svg +1 -0
- package/src/img/svg-icons/remove.svg +1 -0
- package/src/img/svg-icons/reply.svg +1 -0
- package/src/img/svg-icons/report-problem.svg +1 -0
- package/src/img/svg-icons/save.svg +1 -0
- package/src/img/svg-icons/school.svg +1 -0
- package/src/img/svg-icons/science.svg +1 -0
- package/src/img/svg-icons/search.svg +1 -0
- package/src/img/svg-icons/send.svg +1 -0
- package/src/img/svg-icons/settings.svg +1 -0
- package/src/img/svg-icons/share.svg +1 -0
- package/src/img/svg-icons/shopping-cart.svg +1 -0
- package/src/img/svg-icons/sort-ascending.svg +2 -0
- package/src/img/svg-icons/sort-by-alpha.svg +1 -0
- package/src/img/svg-icons/sort-default.svg +1 -0
- package/src/img/svg-icons/sort-descending.svg +1 -0
- package/src/img/svg-icons/sort-table-ascending.svg +1 -0
- package/src/img/svg-icons/sort-table-descending.svg +1 -0
- package/src/img/svg-icons/sort-table-none.svg +1 -0
- package/src/img/svg-icons/sort.svg +1 -0
- package/src/img/svg-icons/subdirectory-arrow-left.svg +1 -0
- package/src/img/svg-icons/subdirectory-arrow-right.svg +1 -0
- package/src/img/svg-icons/support-agent.svg +1 -0
- package/src/img/svg-icons/text-format.svg +1 -0
- package/src/img/svg-icons/trash-can.svg +1 -0
- package/src/img/svg-icons/tune.svg +1 -0
- package/src/img/svg-icons/vertical-split.svg +1 -0
- package/src/img/svg-icons/videocam.svg +1 -0
- package/src/img/svg-icons/view-headline.svg +1 -0
- package/src/img/svg-icons/visibility-off.svg +1 -0
- package/src/img/svg-icons/visibility.svg +1 -0
- package/src/img/svg-icons/zoom-in.svg +1 -0
- package/src/img/svg-icons/zoom-out.svg +1 -0
- package/src/js/components/accordion.js +164 -0
- package/src/js/components/alert.js +26 -0
- package/src/js/components/checkbox-toggle-content.js +71 -0
- package/src/js/components/date-picker.js +2163 -0
- package/src/js/components/dropdown-sort.js +62 -0
- package/src/js/components/dropdown.js +311 -0
- package/src/js/components/error-summary.js +150 -0
- package/src/js/components/modal.js +160 -0
- package/src/js/components/navigation.js +198 -0
- package/src/js/components/radio-toggle-content.js +82 -0
- package/src/js/components/regex-input-mask.js +68 -0
- package/src/js/components/selectable-table.js +144 -0
- package/src/js/components/table.js +43 -0
- package/src/js/components/tabnav.js +300 -0
- package/src/js/components/toast.js +43 -0
- package/src/js/components/tooltip.js +249 -0
- package/src/js/config.js +3 -0
- package/src/js/dkfds.js +186 -0
- package/src/js/events.js +15 -0
- package/src/js/polyfills/Function/prototype/bind.js +159 -0
- package/src/js/polyfills/Object/defineProperty.js +86 -0
- package/src/js/polyfills/custom-event.js +23 -0
- package/src/js/polyfills/element-hidden.js +18 -0
- package/src/js/polyfills/index.js +14 -0
- package/src/js/polyfills/number-is-nan.js +6 -0
- package/src/js/utils/active-element.js +1 -0
- package/src/js/utils/behavior.js +36 -0
- package/src/js/utils/breakpoints.js +10 -0
- package/src/js/utils/closest.js +20 -0
- package/src/js/utils/dispatch.js +30 -0
- package/src/js/utils/generate-unique-id.js +14 -0
- package/src/js/utils/is-in-viewport.js +14 -0
- package/src/js/utils/is-ios-device.js +11 -0
- package/src/js/utils/select.js +29 -0
- package/src/js/utils/toggle.js +22 -0
- package/src/stylesheets/_dkfds-base.scss +76 -0
- package/src/stylesheets/components/_accordions.scss +162 -0
- package/src/stylesheets/components/_alerts.scss +113 -0
- package/src/stylesheets/components/_breadcrumbs.scss +62 -0
- package/src/stylesheets/components/_cards.scss +235 -0
- package/src/stylesheets/components/_cookie-message.scss +41 -0
- package/src/stylesheets/components/_date-picker.scss +391 -0
- package/src/stylesheets/components/_details.scss +61 -0
- package/src/stylesheets/components/_footer.scss +83 -0
- package/src/stylesheets/components/_header.scss +339 -0
- package/src/stylesheets/components/_language-switcher.scss +63 -0
- package/src/stylesheets/components/_modal.scss +155 -0
- package/src/stylesheets/components/_navigation.scss +544 -0
- package/src/stylesheets/components/_overflow-menu.scss +234 -0
- package/src/stylesheets/components/_page-navigation.scss +12 -0
- package/src/stylesheets/components/_pagination.scss +136 -0
- package/src/stylesheets/components/_search.scss +33 -0
- package/src/stylesheets/components/_sidenav.scss +205 -0
- package/src/stylesheets/components/_skipnav.scss +31 -0
- package/src/stylesheets/components/_tabnav.scss +122 -0
- package/src/stylesheets/components/_toast.scss +105 -0
- package/src/stylesheets/components/_tooltip.scss +72 -0
- package/src/stylesheets/core/_base.scss +28 -0
- package/src/stylesheets/core/_fonts.scss +139 -0
- package/src/stylesheets/core/_functions.scss +593 -0
- package/src/stylesheets/core/_grid.scss +118 -0
- package/src/stylesheets/core/_print.scss +187 -0
- package/src/stylesheets/core/_properties.scss +145 -0
- package/src/stylesheets/core/_system-tokens.scss +403 -0
- package/src/stylesheets/core/_typography.scss +500 -0
- package/src/stylesheets/core/_variables.scss +18 -0
- package/src/stylesheets/core/colors/_blue.scss +8 -0
- package/src/stylesheets/core/colors/_data-blue.scss +13 -0
- package/src/stylesheets/core/colors/_data-green-blue.scss +13 -0
- package/src/stylesheets/core/colors/_data-green.scss +13 -0
- package/src/stylesheets/core/colors/_data-orange.scss +13 -0
- package/src/stylesheets/core/colors/_data-pink-violet.scss +13 -0
- package/src/stylesheets/core/colors/_data-violet.scss +13 -0
- package/src/stylesheets/core/colors/_data-yellow-red.scss +13 -0
- package/src/stylesheets/core/colors/_gray.scss +11 -0
- package/src/stylesheets/core/colors/_green.scss +6 -0
- package/src/stylesheets/core/colors/_orange.scss +7 -0
- package/src/stylesheets/core/colors/_purple.scss +6 -0
- package/src/stylesheets/core/colors/_red.scss +6 -0
- package/src/stylesheets/core/mixins/_add-background-svg.scss +7 -0
- package/src/stylesheets/core/mixins/_breakpoints.scss +119 -0
- package/src/stylesheets/core/mixins/_grid-mixins.scss +42 -0
- package/src/stylesheets/core/mixins/_mixins.scss +126 -0
- package/src/stylesheets/core/utilities/_background.scss +15 -0
- package/src/stylesheets/core/utilities/_display.scss +26 -0
- package/src/stylesheets/core/utilities/_flex.scss +43 -0
- package/src/stylesheets/core/utilities/_position.scss +35 -0
- package/src/stylesheets/core/utilities/_spacing.scss +50 -0
- package/src/stylesheets/core/utilities/_text-color.scss +5 -0
- package/src/stylesheets/core/utilities/_textalign.scss +13 -0
- package/src/stylesheets/core/utilities/_width.scss +26 -0
- package/src/stylesheets/dkfds-borgerdk.scss +4 -0
- package/src/stylesheets/dkfds-virkdk.scss +4 -0
- package/src/stylesheets/dkfds.scss +4 -0
- package/src/stylesheets/elements/_badge.scss +36 -0
- package/src/stylesheets/elements/_buttons.scss +280 -0
- package/src/stylesheets/elements/_collapse.scss +17 -0
- package/src/stylesheets/elements/_embed.scss +27 -0
- package/src/stylesheets/elements/_figure.scss +7 -0
- package/src/stylesheets/elements/_forms.scss +93 -0
- package/src/stylesheets/elements/_hr.scss +5 -0
- package/src/stylesheets/elements/_icons.scss +204 -0
- package/src/stylesheets/elements/_inputs.scss +589 -0
- package/src/stylesheets/elements/_list.scss +83 -0
- package/src/stylesheets/elements/_page.scss +34 -0
- package/src/stylesheets/elements/_section.scss +3 -0
- package/src/stylesheets/elements/_spinner.scss +76 -0
- package/src/stylesheets/elements/_table.scss +283 -0
- package/src/stylesheets/elements/_tags.scss +64 -0
- package/src/stylesheets/elements/_toggle.scss +113 -0
- package/src/stylesheets/lib/_normalize.scss +349 -0
- package/src/stylesheets/settings/_settings-color.scss +46 -0
- package/src/stylesheets/settings/_settings-components.scss +415 -0
- package/src/stylesheets/settings/_settings-general.scss +43 -0
- package/src/stylesheets/settings/_settings-typography.scss +212 -0
- package/src/stylesheets/themes/_borgerdk.scss +23 -0
- package/src/stylesheets/themes/_virkdk.scss +21 -0
- package/src/vendor/highlight.pack.js +2 -0
@@ -0,0 +1,2163 @@
|
|
1
|
+
import {keymap} from 'receptor';
|
2
|
+
const behavior = require("../utils/behavior");
|
3
|
+
const select = require("../utils/select");
|
4
|
+
const { prefix: PREFIX } = require("../config");
|
5
|
+
const { CLICK } = require("../events");
|
6
|
+
const activeElement = require("../utils/active-element");
|
7
|
+
const isIosDevice = require("../utils/is-ios-device");
|
8
|
+
|
9
|
+
const DATE_PICKER_CLASS = `date-picker`;
|
10
|
+
const DATE_PICKER_WRAPPER_CLASS = `${DATE_PICKER_CLASS}__wrapper`;
|
11
|
+
const DATE_PICKER_INITIALIZED_CLASS = `${DATE_PICKER_CLASS}--initialized`;
|
12
|
+
const DATE_PICKER_ACTIVE_CLASS = `${DATE_PICKER_CLASS}--active`;
|
13
|
+
const DATE_PICKER_INTERNAL_INPUT_CLASS = `${DATE_PICKER_CLASS}__internal-input`;
|
14
|
+
const DATE_PICKER_EXTERNAL_INPUT_CLASS = `${DATE_PICKER_CLASS}__external-input`;
|
15
|
+
const DATE_PICKER_BUTTON_CLASS = `${DATE_PICKER_CLASS}__button`;
|
16
|
+
const DATE_PICKER_CALENDAR_CLASS = `${DATE_PICKER_CLASS}__calendar`;
|
17
|
+
const DATE_PICKER_STATUS_CLASS = `${DATE_PICKER_CLASS}__status`;
|
18
|
+
const CALENDAR_DATE_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__date`;
|
19
|
+
|
20
|
+
const CALENDAR_DATE_FOCUSED_CLASS = `${CALENDAR_DATE_CLASS}--focused`;
|
21
|
+
const CALENDAR_DATE_SELECTED_CLASS = `${CALENDAR_DATE_CLASS}--selected`;
|
22
|
+
const CALENDAR_DATE_PREVIOUS_MONTH_CLASS = `${CALENDAR_DATE_CLASS}--previous-month`;
|
23
|
+
const CALENDAR_DATE_CURRENT_MONTH_CLASS = `${CALENDAR_DATE_CLASS}--current-month`;
|
24
|
+
const CALENDAR_DATE_NEXT_MONTH_CLASS = `${CALENDAR_DATE_CLASS}--next-month`;
|
25
|
+
const CALENDAR_DATE_RANGE_DATE_CLASS = `${CALENDAR_DATE_CLASS}--range-date`;
|
26
|
+
const CALENDAR_DATE_TODAY_CLASS = `${CALENDAR_DATE_CLASS}--today`;
|
27
|
+
const CALENDAR_DATE_RANGE_DATE_START_CLASS = `${CALENDAR_DATE_CLASS}--range-date-start`;
|
28
|
+
const CALENDAR_DATE_RANGE_DATE_END_CLASS = `${CALENDAR_DATE_CLASS}--range-date-end`;
|
29
|
+
const CALENDAR_DATE_WITHIN_RANGE_CLASS = `${CALENDAR_DATE_CLASS}--within-range`;
|
30
|
+
const CALENDAR_PREVIOUS_YEAR_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__previous-year`;
|
31
|
+
const CALENDAR_PREVIOUS_MONTH_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__previous-month`;
|
32
|
+
const CALENDAR_NEXT_YEAR_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__next-year`;
|
33
|
+
const CALENDAR_NEXT_MONTH_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__next-month`;
|
34
|
+
const CALENDAR_MONTH_SELECTION_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__month-selection`;
|
35
|
+
const CALENDAR_YEAR_SELECTION_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__year-selection`;
|
36
|
+
const CALENDAR_MONTH_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__month`;
|
37
|
+
const CALENDAR_MONTH_FOCUSED_CLASS = `${CALENDAR_MONTH_CLASS}--focused`;
|
38
|
+
const CALENDAR_MONTH_SELECTED_CLASS = `${CALENDAR_MONTH_CLASS}--selected`;
|
39
|
+
const CALENDAR_YEAR_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__year`;
|
40
|
+
const CALENDAR_YEAR_FOCUSED_CLASS = `${CALENDAR_YEAR_CLASS}--focused`;
|
41
|
+
const CALENDAR_YEAR_SELECTED_CLASS = `${CALENDAR_YEAR_CLASS}--selected`;
|
42
|
+
const CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__previous-year-chunk`;
|
43
|
+
const CALENDAR_NEXT_YEAR_CHUNK_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__next-year-chunk`;
|
44
|
+
const CALENDAR_DATE_PICKER_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__date-picker`;
|
45
|
+
const CALENDAR_MONTH_PICKER_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__month-picker`;
|
46
|
+
const CALENDAR_YEAR_PICKER_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__year-picker`;
|
47
|
+
const CALENDAR_TABLE_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__table`;
|
48
|
+
const CALENDAR_ROW_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__row`;
|
49
|
+
const CALENDAR_CELL_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__cell`;
|
50
|
+
const CALENDAR_CELL_CENTER_ITEMS_CLASS = `${CALENDAR_CELL_CLASS}--center-items`;
|
51
|
+
const CALENDAR_MONTH_LABEL_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__month-label`;
|
52
|
+
const CALENDAR_DAY_OF_WEEK_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__day-of-week`;
|
53
|
+
|
54
|
+
const DATE_PICKER = `.${DATE_PICKER_CLASS}`;
|
55
|
+
const DATE_PICKER_BUTTON = `.${DATE_PICKER_BUTTON_CLASS}`;
|
56
|
+
const DATE_PICKER_INTERNAL_INPUT = `.${DATE_PICKER_INTERNAL_INPUT_CLASS}`;
|
57
|
+
const DATE_PICKER_EXTERNAL_INPUT = `.${DATE_PICKER_EXTERNAL_INPUT_CLASS}`;
|
58
|
+
const DATE_PICKER_CALENDAR = `.${DATE_PICKER_CALENDAR_CLASS}`;
|
59
|
+
const DATE_PICKER_STATUS = `.${DATE_PICKER_STATUS_CLASS}`;
|
60
|
+
const CALENDAR_DATE = `.${CALENDAR_DATE_CLASS}`;
|
61
|
+
const CALENDAR_DATE_FOCUSED = `.${CALENDAR_DATE_FOCUSED_CLASS}`;
|
62
|
+
const CALENDAR_DATE_CURRENT_MONTH = `.${CALENDAR_DATE_CURRENT_MONTH_CLASS}`;
|
63
|
+
const CALENDAR_PREVIOUS_YEAR = `.${CALENDAR_PREVIOUS_YEAR_CLASS}`;
|
64
|
+
const CALENDAR_PREVIOUS_MONTH = `.${CALENDAR_PREVIOUS_MONTH_CLASS}`;
|
65
|
+
const CALENDAR_NEXT_YEAR = `.${CALENDAR_NEXT_YEAR_CLASS}`;
|
66
|
+
const CALENDAR_NEXT_MONTH = `.${CALENDAR_NEXT_MONTH_CLASS}`;
|
67
|
+
const CALENDAR_YEAR_SELECTION = `.${CALENDAR_YEAR_SELECTION_CLASS}`;
|
68
|
+
const CALENDAR_MONTH_SELECTION = `.${CALENDAR_MONTH_SELECTION_CLASS}`;
|
69
|
+
const CALENDAR_MONTH = `.${CALENDAR_MONTH_CLASS}`;
|
70
|
+
const CALENDAR_YEAR = `.${CALENDAR_YEAR_CLASS}`;
|
71
|
+
const CALENDAR_PREVIOUS_YEAR_CHUNK = `.${CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS}`;
|
72
|
+
const CALENDAR_NEXT_YEAR_CHUNK = `.${CALENDAR_NEXT_YEAR_CHUNK_CLASS}`;
|
73
|
+
const CALENDAR_DATE_PICKER = `.${CALENDAR_DATE_PICKER_CLASS}`;
|
74
|
+
const CALENDAR_MONTH_PICKER = `.${CALENDAR_MONTH_PICKER_CLASS}`;
|
75
|
+
const CALENDAR_YEAR_PICKER = `.${CALENDAR_YEAR_PICKER_CLASS}`;
|
76
|
+
const CALENDAR_MONTH_FOCUSED = `.${CALENDAR_MONTH_FOCUSED_CLASS}`;
|
77
|
+
const CALENDAR_YEAR_FOCUSED = `.${CALENDAR_YEAR_FOCUSED_CLASS}`;
|
78
|
+
|
79
|
+
const VALIDATION_MESSAGE = "Indtast venligst en gyldig dato";
|
80
|
+
|
81
|
+
const MONTH_LABELS = [
|
82
|
+
"Januar",
|
83
|
+
"Februar",
|
84
|
+
"Marts",
|
85
|
+
"April",
|
86
|
+
"Maj",
|
87
|
+
"Juni",
|
88
|
+
"Juli",
|
89
|
+
"August",
|
90
|
+
"September",
|
91
|
+
"Oktober",
|
92
|
+
"November",
|
93
|
+
"December",
|
94
|
+
];
|
95
|
+
|
96
|
+
const DAY_OF_WEEK_LABELS = [
|
97
|
+
"Mandag",
|
98
|
+
"Tirsdag",
|
99
|
+
"Onsdag",
|
100
|
+
"Torsdag",
|
101
|
+
"Fredag",
|
102
|
+
"Lørdag",
|
103
|
+
"Søndag",
|
104
|
+
];
|
105
|
+
|
106
|
+
const ENTER_KEYCODE = 13;
|
107
|
+
|
108
|
+
const YEAR_CHUNK = 12;
|
109
|
+
|
110
|
+
const DEFAULT_MIN_DATE = "0000-01-01";
|
111
|
+
const DEFAULT_EXTERNAL_DATE_FORMAT = "DD/MM/YYYY";
|
112
|
+
const INTERNAL_DATE_FORMAT = "YYYY-MM-DD";
|
113
|
+
|
114
|
+
const NOT_DISABLED_SELECTOR = ":not([disabled])";
|
115
|
+
|
116
|
+
const processFocusableSelectors = (...selectors) =>
|
117
|
+
selectors.map((query) => query + NOT_DISABLED_SELECTOR).join(", ");
|
118
|
+
|
119
|
+
const DATE_PICKER_FOCUSABLE = processFocusableSelectors(
|
120
|
+
CALENDAR_PREVIOUS_YEAR,
|
121
|
+
CALENDAR_PREVIOUS_MONTH,
|
122
|
+
CALENDAR_YEAR_SELECTION,
|
123
|
+
CALENDAR_MONTH_SELECTION,
|
124
|
+
CALENDAR_NEXT_YEAR,
|
125
|
+
CALENDAR_NEXT_MONTH,
|
126
|
+
CALENDAR_DATE_FOCUSED
|
127
|
+
);
|
128
|
+
|
129
|
+
const MONTH_PICKER_FOCUSABLE = processFocusableSelectors(
|
130
|
+
CALENDAR_MONTH_FOCUSED
|
131
|
+
);
|
132
|
+
|
133
|
+
const YEAR_PICKER_FOCUSABLE = processFocusableSelectors(
|
134
|
+
CALENDAR_PREVIOUS_YEAR_CHUNK,
|
135
|
+
CALENDAR_NEXT_YEAR_CHUNK,
|
136
|
+
CALENDAR_YEAR_FOCUSED
|
137
|
+
);
|
138
|
+
|
139
|
+
// #region Date Manipulation Functions
|
140
|
+
|
141
|
+
/**
|
142
|
+
* Keep date within month. Month would only be over by 1 to 3 days
|
143
|
+
*
|
144
|
+
* @param {Date} dateToCheck the date object to check
|
145
|
+
* @param {number} month the correct month
|
146
|
+
* @returns {Date} the date, corrected if needed
|
147
|
+
*/
|
148
|
+
const keepDateWithinMonth = (dateToCheck, month) => {
|
149
|
+
if (month !== dateToCheck.getMonth()) {
|
150
|
+
dateToCheck.setDate(0);
|
151
|
+
}
|
152
|
+
|
153
|
+
return dateToCheck;
|
154
|
+
};
|
155
|
+
|
156
|
+
/**
|
157
|
+
* Set date from month day year
|
158
|
+
*
|
159
|
+
* @param {number} year the year to set
|
160
|
+
* @param {number} month the month to set (zero-indexed)
|
161
|
+
* @param {number} date the date to set
|
162
|
+
* @returns {Date} the set date
|
163
|
+
*/
|
164
|
+
const setDate = (year, month, date) => {
|
165
|
+
const newDate = new Date(0);
|
166
|
+
newDate.setFullYear(year, month, date);
|
167
|
+
return newDate;
|
168
|
+
};
|
169
|
+
|
170
|
+
/**
|
171
|
+
* todays date
|
172
|
+
*
|
173
|
+
* @returns {Date} todays date
|
174
|
+
*/
|
175
|
+
const today = () => {
|
176
|
+
const newDate = new Date();
|
177
|
+
const day = newDate.getDate();
|
178
|
+
const month = newDate.getMonth();
|
179
|
+
const year = newDate.getFullYear();
|
180
|
+
return setDate(year, month, day);
|
181
|
+
};
|
182
|
+
|
183
|
+
/**
|
184
|
+
* Set date to first day of the month
|
185
|
+
*
|
186
|
+
* @param {number} date the date to adjust
|
187
|
+
* @returns {Date} the adjusted date
|
188
|
+
*/
|
189
|
+
const startOfMonth = (date) => {
|
190
|
+
const newDate = new Date(0);
|
191
|
+
newDate.setFullYear(date.getFullYear(), date.getMonth(), 1);
|
192
|
+
return newDate;
|
193
|
+
};
|
194
|
+
|
195
|
+
/**
|
196
|
+
* Set date to last day of the month
|
197
|
+
*
|
198
|
+
* @param {number} date the date to adjust
|
199
|
+
* @returns {Date} the adjusted date
|
200
|
+
*/
|
201
|
+
const lastDayOfMonth = (date) => {
|
202
|
+
const newDate = new Date(0);
|
203
|
+
newDate.setFullYear(date.getFullYear(), date.getMonth() + 1, 0);
|
204
|
+
return newDate;
|
205
|
+
};
|
206
|
+
|
207
|
+
/**
|
208
|
+
* Add days to date
|
209
|
+
*
|
210
|
+
* @param {Date} _date the date to adjust
|
211
|
+
* @param {number} numDays the difference in days
|
212
|
+
* @returns {Date} the adjusted date
|
213
|
+
*/
|
214
|
+
const addDays = (_date, numDays) => {
|
215
|
+
const newDate = new Date(_date.getTime());
|
216
|
+
newDate.setDate(newDate.getDate() + numDays);
|
217
|
+
return newDate;
|
218
|
+
};
|
219
|
+
|
220
|
+
/**
|
221
|
+
* Subtract days from date
|
222
|
+
*
|
223
|
+
* @param {Date} _date the date to adjust
|
224
|
+
* @param {number} numDays the difference in days
|
225
|
+
* @returns {Date} the adjusted date
|
226
|
+
*/
|
227
|
+
const subDays = (_date, numDays) => addDays(_date, -numDays);
|
228
|
+
|
229
|
+
/**
|
230
|
+
* Add weeks to date
|
231
|
+
*
|
232
|
+
* @param {Date} _date the date to adjust
|
233
|
+
* @param {number} numWeeks the difference in weeks
|
234
|
+
* @returns {Date} the adjusted date
|
235
|
+
*/
|
236
|
+
const addWeeks = (_date, numWeeks) => addDays(_date, numWeeks * 7);
|
237
|
+
|
238
|
+
/**
|
239
|
+
* Subtract weeks from date
|
240
|
+
*
|
241
|
+
* @param {Date} _date the date to adjust
|
242
|
+
* @param {number} numWeeks the difference in weeks
|
243
|
+
* @returns {Date} the adjusted date
|
244
|
+
*/
|
245
|
+
const subWeeks = (_date, numWeeks) => addWeeks(_date, -numWeeks);
|
246
|
+
|
247
|
+
/**
|
248
|
+
* Set date to the start of the week (Monday)
|
249
|
+
*
|
250
|
+
* @param {Date} _date the date to adjust
|
251
|
+
* @returns {Date} the adjusted date
|
252
|
+
*/
|
253
|
+
const startOfWeek = (_date) => {
|
254
|
+
let dayOfWeek = _date.getDay()-1;
|
255
|
+
if(dayOfWeek === -1){
|
256
|
+
dayOfWeek = 6;
|
257
|
+
}
|
258
|
+
return subDays(_date, dayOfWeek);
|
259
|
+
};
|
260
|
+
|
261
|
+
/**
|
262
|
+
* Set date to the end of the week (Sunday)
|
263
|
+
*
|
264
|
+
* @param {Date} _date the date to adjust
|
265
|
+
* @param {number} numWeeks the difference in weeks
|
266
|
+
* @returns {Date} the adjusted date
|
267
|
+
*/
|
268
|
+
const endOfWeek = (_date) => {
|
269
|
+
const dayOfWeek = _date.getDay();
|
270
|
+
return addDays(_date, 7 - dayOfWeek);
|
271
|
+
};
|
272
|
+
|
273
|
+
/**
|
274
|
+
* Add months to date and keep date within month
|
275
|
+
*
|
276
|
+
* @param {Date} _date the date to adjust
|
277
|
+
* @param {number} numMonths the difference in months
|
278
|
+
* @returns {Date} the adjusted date
|
279
|
+
*/
|
280
|
+
const addMonths = (_date, numMonths) => {
|
281
|
+
const newDate = new Date(_date.getTime());
|
282
|
+
|
283
|
+
const dateMonth = (newDate.getMonth() + 12 + numMonths) % 12;
|
284
|
+
newDate.setMonth(newDate.getMonth() + numMonths);
|
285
|
+
keepDateWithinMonth(newDate, dateMonth);
|
286
|
+
|
287
|
+
return newDate;
|
288
|
+
};
|
289
|
+
|
290
|
+
/**
|
291
|
+
* Subtract months from date
|
292
|
+
*
|
293
|
+
* @param {Date} _date the date to adjust
|
294
|
+
* @param {number} numMonths the difference in months
|
295
|
+
* @returns {Date} the adjusted date
|
296
|
+
*/
|
297
|
+
const subMonths = (_date, numMonths) => addMonths(_date, -numMonths);
|
298
|
+
|
299
|
+
/**
|
300
|
+
* Add years to date and keep date within month
|
301
|
+
*
|
302
|
+
* @param {Date} _date the date to adjust
|
303
|
+
* @param {number} numYears the difference in years
|
304
|
+
* @returns {Date} the adjusted date
|
305
|
+
*/
|
306
|
+
const addYears = (_date, numYears) => addMonths(_date, numYears * 12);
|
307
|
+
|
308
|
+
/**
|
309
|
+
* Subtract years from date
|
310
|
+
*
|
311
|
+
* @param {Date} _date the date to adjust
|
312
|
+
* @param {number} numYears the difference in years
|
313
|
+
* @returns {Date} the adjusted date
|
314
|
+
*/
|
315
|
+
const subYears = (_date, numYears) => addYears(_date, -numYears);
|
316
|
+
|
317
|
+
/**
|
318
|
+
* Set months of date
|
319
|
+
*
|
320
|
+
* @param {Date} _date the date to adjust
|
321
|
+
* @param {number} month zero-indexed month to set
|
322
|
+
* @returns {Date} the adjusted date
|
323
|
+
*/
|
324
|
+
const setMonth = (_date, month) => {
|
325
|
+
const newDate = new Date(_date.getTime());
|
326
|
+
|
327
|
+
newDate.setMonth(month);
|
328
|
+
keepDateWithinMonth(newDate, month);
|
329
|
+
|
330
|
+
return newDate;
|
331
|
+
};
|
332
|
+
|
333
|
+
/**
|
334
|
+
* Set year of date
|
335
|
+
*
|
336
|
+
* @param {Date} _date the date to adjust
|
337
|
+
* @param {number} year the year to set
|
338
|
+
* @returns {Date} the adjusted date
|
339
|
+
*/
|
340
|
+
const setYear = (_date, year) => {
|
341
|
+
const newDate = new Date(_date.getTime());
|
342
|
+
|
343
|
+
const month = newDate.getMonth();
|
344
|
+
newDate.setFullYear(year);
|
345
|
+
keepDateWithinMonth(newDate, month);
|
346
|
+
|
347
|
+
return newDate;
|
348
|
+
};
|
349
|
+
|
350
|
+
/**
|
351
|
+
* Return the earliest date
|
352
|
+
*
|
353
|
+
* @param {Date} dateA date to compare
|
354
|
+
* @param {Date} dateB date to compare
|
355
|
+
* @returns {Date} the earliest date
|
356
|
+
*/
|
357
|
+
const min = (dateA, dateB) => {
|
358
|
+
let newDate = dateA;
|
359
|
+
|
360
|
+
if (dateB < dateA) {
|
361
|
+
newDate = dateB;
|
362
|
+
}
|
363
|
+
|
364
|
+
return new Date(newDate.getTime());
|
365
|
+
};
|
366
|
+
|
367
|
+
/**
|
368
|
+
* Return the latest date
|
369
|
+
*
|
370
|
+
* @param {Date} dateA date to compare
|
371
|
+
* @param {Date} dateB date to compare
|
372
|
+
* @returns {Date} the latest date
|
373
|
+
*/
|
374
|
+
const max = (dateA, dateB) => {
|
375
|
+
let newDate = dateA;
|
376
|
+
|
377
|
+
if (dateB > dateA) {
|
378
|
+
newDate = dateB;
|
379
|
+
}
|
380
|
+
|
381
|
+
return new Date(newDate.getTime());
|
382
|
+
};
|
383
|
+
|
384
|
+
/**
|
385
|
+
* Check if dates are the in the same year
|
386
|
+
*
|
387
|
+
* @param {Date} dateA date to compare
|
388
|
+
* @param {Date} dateB date to compare
|
389
|
+
* @returns {boolean} are dates in the same year
|
390
|
+
*/
|
391
|
+
const isSameYear = (dateA, dateB) => {
|
392
|
+
return dateA && dateB && dateA.getFullYear() === dateB.getFullYear();
|
393
|
+
};
|
394
|
+
|
395
|
+
/**
|
396
|
+
* Check if dates are the in the same month
|
397
|
+
*
|
398
|
+
* @param {Date} dateA date to compare
|
399
|
+
* @param {Date} dateB date to compare
|
400
|
+
* @returns {boolean} are dates in the same month
|
401
|
+
*/
|
402
|
+
const isSameMonth = (dateA, dateB) => {
|
403
|
+
return isSameYear(dateA, dateB) && dateA.getMonth() === dateB.getMonth();
|
404
|
+
};
|
405
|
+
|
406
|
+
/**
|
407
|
+
* Check if dates are the same date
|
408
|
+
*
|
409
|
+
* @param {Date} dateA the date to compare
|
410
|
+
* @param {Date} dateA the date to compare
|
411
|
+
* @returns {boolean} are dates the same date
|
412
|
+
*/
|
413
|
+
const isSameDay = (dateA, dateB) => {
|
414
|
+
return isSameMonth(dateA, dateB) && dateA.getDate() === dateB.getDate();
|
415
|
+
};
|
416
|
+
|
417
|
+
/**
|
418
|
+
* return a new date within minimum and maximum date
|
419
|
+
*
|
420
|
+
* @param {Date} date date to check
|
421
|
+
* @param {Date} minDate minimum date to allow
|
422
|
+
* @param {Date} maxDate maximum date to allow
|
423
|
+
* @returns {Date} the date between min and max
|
424
|
+
*/
|
425
|
+
const keepDateBetweenMinAndMax = (date, minDate, maxDate) => {
|
426
|
+
let newDate = date;
|
427
|
+
|
428
|
+
if (date < minDate) {
|
429
|
+
newDate = minDate;
|
430
|
+
} else if (maxDate && date > maxDate) {
|
431
|
+
newDate = maxDate;
|
432
|
+
}
|
433
|
+
|
434
|
+
return new Date(newDate.getTime());
|
435
|
+
};
|
436
|
+
|
437
|
+
/**
|
438
|
+
* Check if dates is valid.
|
439
|
+
*
|
440
|
+
* @param {Date} date date to check
|
441
|
+
* @param {Date} minDate minimum date to allow
|
442
|
+
* @param {Date} maxDate maximum date to allow
|
443
|
+
* @return {boolean} is there a day within the month within min and max dates
|
444
|
+
*/
|
445
|
+
const isDateWithinMinAndMax = (date, minDate, maxDate) =>
|
446
|
+
date >= minDate && (!maxDate || date <= maxDate);
|
447
|
+
|
448
|
+
/**
|
449
|
+
* Check if dates month is invalid.
|
450
|
+
*
|
451
|
+
* @param {Date} date date to check
|
452
|
+
* @param {Date} minDate minimum date to allow
|
453
|
+
* @param {Date} maxDate maximum date to allow
|
454
|
+
* @return {boolean} is the month outside min or max dates
|
455
|
+
*/
|
456
|
+
const isDatesMonthOutsideMinOrMax = (date, minDate, maxDate) => {
|
457
|
+
return (
|
458
|
+
lastDayOfMonth(date) < minDate || (maxDate && startOfMonth(date) > maxDate)
|
459
|
+
);
|
460
|
+
};
|
461
|
+
|
462
|
+
/**
|
463
|
+
* Check if dates year is invalid.
|
464
|
+
*
|
465
|
+
* @param {Date} date date to check
|
466
|
+
* @param {Date} minDate minimum date to allow
|
467
|
+
* @param {Date} maxDate maximum date to allow
|
468
|
+
* @return {boolean} is the month outside min or max dates
|
469
|
+
*/
|
470
|
+
const isDatesYearOutsideMinOrMax = (date, minDate, maxDate) => {
|
471
|
+
return (
|
472
|
+
lastDayOfMonth(setMonth(date, 11)) < minDate ||
|
473
|
+
(maxDate && startOfMonth(setMonth(date, 0)) > maxDate)
|
474
|
+
);
|
475
|
+
};
|
476
|
+
|
477
|
+
/**
|
478
|
+
* Parse a date with format D-M-YY
|
479
|
+
*
|
480
|
+
* @param {string} dateString the date string to parse
|
481
|
+
* @param {string} dateFormat the format of the date string
|
482
|
+
* @param {boolean} adjustDate should the date be adjusted
|
483
|
+
* @returns {Date} the parsed date
|
484
|
+
*/
|
485
|
+
const parseDateString = (
|
486
|
+
dateString,
|
487
|
+
dateFormat = INTERNAL_DATE_FORMAT,
|
488
|
+
adjustDate = false
|
489
|
+
) => {
|
490
|
+
let date;
|
491
|
+
let month;
|
492
|
+
let day;
|
493
|
+
let year;
|
494
|
+
let parsed;
|
495
|
+
|
496
|
+
if (dateString) {
|
497
|
+
let monthStr, dayStr, yearStr;
|
498
|
+
if (dateFormat === DEFAULT_EXTERNAL_DATE_FORMAT) {
|
499
|
+
[dayStr, monthStr, yearStr] = dateString.split("/");
|
500
|
+
} else {
|
501
|
+
[yearStr, monthStr, dayStr] = dateString.split("-");
|
502
|
+
}
|
503
|
+
|
504
|
+
if (yearStr) {
|
505
|
+
parsed = parseInt(yearStr, 10);
|
506
|
+
if (!Number.isNaN(parsed)) {
|
507
|
+
year = parsed;
|
508
|
+
if (adjustDate) {
|
509
|
+
year = Math.max(0, year);
|
510
|
+
if (yearStr.length < 3) {
|
511
|
+
const currentYear = today().getFullYear();
|
512
|
+
const currentYearStub =
|
513
|
+
currentYear - (currentYear % 10 ** yearStr.length);
|
514
|
+
year = currentYearStub + parsed;
|
515
|
+
}
|
516
|
+
}
|
517
|
+
}
|
518
|
+
}
|
519
|
+
|
520
|
+
if (monthStr) {
|
521
|
+
parsed = parseInt(monthStr, 10);
|
522
|
+
if (!Number.isNaN(parsed)) {
|
523
|
+
month = parsed;
|
524
|
+
if (adjustDate) {
|
525
|
+
month = Math.max(1, month);
|
526
|
+
month = Math.min(12, month);
|
527
|
+
}
|
528
|
+
}
|
529
|
+
}
|
530
|
+
|
531
|
+
if (month && dayStr && year != null) {
|
532
|
+
parsed = parseInt(dayStr, 10);
|
533
|
+
if (!Number.isNaN(parsed)) {
|
534
|
+
day = parsed;
|
535
|
+
if (adjustDate) {
|
536
|
+
const lastDayOfTheMonth = setDate(year, month, 0).getDate();
|
537
|
+
day = Math.max(1, day);
|
538
|
+
day = Math.min(lastDayOfTheMonth, day);
|
539
|
+
}
|
540
|
+
}
|
541
|
+
}
|
542
|
+
|
543
|
+
if (month && day && year != null) {
|
544
|
+
date = setDate(year, month - 1, day);
|
545
|
+
}
|
546
|
+
}
|
547
|
+
|
548
|
+
return date;
|
549
|
+
};
|
550
|
+
|
551
|
+
/**
|
552
|
+
* Format a date to format MM-DD-YYYY
|
553
|
+
*
|
554
|
+
* @param {Date} date the date to format
|
555
|
+
* @param {string} dateFormat the format of the date string
|
556
|
+
* @returns {string} the formatted date string
|
557
|
+
*/
|
558
|
+
const formatDate = (date, dateFormat = INTERNAL_DATE_FORMAT) => {
|
559
|
+
const padZeros = (value, length) => {
|
560
|
+
return `0000${value}`.slice(-length);
|
561
|
+
};
|
562
|
+
|
563
|
+
const month = date.getMonth() + 1;
|
564
|
+
const day = date.getDate();
|
565
|
+
const year = date.getFullYear();
|
566
|
+
|
567
|
+
if (dateFormat === DEFAULT_EXTERNAL_DATE_FORMAT) {
|
568
|
+
return [padZeros(day, 2), padZeros(month, 2), padZeros(year, 4)].join("/");
|
569
|
+
}
|
570
|
+
|
571
|
+
return [padZeros(year, 4), padZeros(month, 2), padZeros(day, 2)].join("-");
|
572
|
+
};
|
573
|
+
|
574
|
+
// #endregion Date Manipulation Functions
|
575
|
+
|
576
|
+
/**
|
577
|
+
* Create a grid string from an array of html strings
|
578
|
+
*
|
579
|
+
* @param {string[]} htmlArray the array of html items
|
580
|
+
* @param {number} rowSize the length of a row
|
581
|
+
* @returns {string} the grid string
|
582
|
+
*/
|
583
|
+
const listToGridHtml = (htmlArray, rowSize) => {
|
584
|
+
const grid = [];
|
585
|
+
let row = [];
|
586
|
+
|
587
|
+
let i = 0;
|
588
|
+
while (i < htmlArray.length) {
|
589
|
+
row = [];
|
590
|
+
while (i < htmlArray.length && row.length < rowSize) {
|
591
|
+
row.push(`<td>${htmlArray[i]}</td>`);
|
592
|
+
i += 1;
|
593
|
+
}
|
594
|
+
grid.push(`<tr>${row.join("")}</tr>`);
|
595
|
+
}
|
596
|
+
|
597
|
+
return grid.join("");
|
598
|
+
};
|
599
|
+
|
600
|
+
/**
|
601
|
+
* set the value of the element and dispatch a change event
|
602
|
+
*
|
603
|
+
* @param {HTMLInputElement} el The element to update
|
604
|
+
* @param {string} value The new value of the element
|
605
|
+
*/
|
606
|
+
const changeElementValue = (el, value = "") => {
|
607
|
+
const elementToChange = el;
|
608
|
+
elementToChange.value = value;
|
609
|
+
|
610
|
+
|
611
|
+
var event = new Event('change');
|
612
|
+
elementToChange.dispatchEvent(event);
|
613
|
+
};
|
614
|
+
|
615
|
+
/**
|
616
|
+
* The properties and elements within the date picker.
|
617
|
+
* @typedef {Object} DatePickerContext
|
618
|
+
* @property {HTMLDivElement} calendarEl
|
619
|
+
* @property {HTMLElement} datePickerEl
|
620
|
+
* @property {HTMLInputElement} internalInputEl
|
621
|
+
* @property {HTMLInputElement} externalInputEl
|
622
|
+
* @property {HTMLDivElement} statusEl
|
623
|
+
* @property {HTMLDivElement} firstYearChunkEl
|
624
|
+
* @property {Date} calendarDate
|
625
|
+
* @property {Date} minDate
|
626
|
+
* @property {Date} maxDate
|
627
|
+
* @property {Date} selectedDate
|
628
|
+
* @property {Date} rangeDate
|
629
|
+
* @property {Date} defaultDate
|
630
|
+
*/
|
631
|
+
|
632
|
+
/**
|
633
|
+
* Get an object of the properties and elements belonging directly to the given
|
634
|
+
* date picker component.
|
635
|
+
*
|
636
|
+
* @param {HTMLElement} el the element within the date picker
|
637
|
+
* @returns {DatePickerContext} elements
|
638
|
+
*/
|
639
|
+
const getDatePickerContext = (el) => {
|
640
|
+
const datePickerEl = el.closest(DATE_PICKER);
|
641
|
+
|
642
|
+
if (!datePickerEl) {
|
643
|
+
throw new Error(`Element is missing outer ${DATE_PICKER}`);
|
644
|
+
}
|
645
|
+
|
646
|
+
const internalInputEl = datePickerEl.querySelector(
|
647
|
+
DATE_PICKER_INTERNAL_INPUT
|
648
|
+
);
|
649
|
+
const externalInputEl = datePickerEl.querySelector(
|
650
|
+
DATE_PICKER_EXTERNAL_INPUT
|
651
|
+
);
|
652
|
+
const calendarEl = datePickerEl.querySelector(DATE_PICKER_CALENDAR);
|
653
|
+
const toggleBtnEl = datePickerEl.querySelector(DATE_PICKER_BUTTON);
|
654
|
+
const statusEl = datePickerEl.querySelector(DATE_PICKER_STATUS);
|
655
|
+
const firstYearChunkEl = datePickerEl.querySelector(CALENDAR_YEAR);
|
656
|
+
|
657
|
+
const inputDate = parseDateString(
|
658
|
+
externalInputEl.value,
|
659
|
+
DEFAULT_EXTERNAL_DATE_FORMAT,
|
660
|
+
true
|
661
|
+
);
|
662
|
+
const selectedDate = parseDateString(internalInputEl.value);
|
663
|
+
|
664
|
+
const calendarDate = parseDateString(calendarEl.dataset.value);
|
665
|
+
const minDate = parseDateString(datePickerEl.dataset.minDate);
|
666
|
+
const maxDate = parseDateString(datePickerEl.dataset.maxDate);
|
667
|
+
const rangeDate = parseDateString(datePickerEl.dataset.rangeDate);
|
668
|
+
const defaultDate = parseDateString(datePickerEl.dataset.defaultDate);
|
669
|
+
|
670
|
+
if (minDate && maxDate && minDate > maxDate) {
|
671
|
+
throw new Error("Minimum date cannot be after maximum date");
|
672
|
+
}
|
673
|
+
|
674
|
+
return {
|
675
|
+
calendarDate,
|
676
|
+
minDate,
|
677
|
+
toggleBtnEl,
|
678
|
+
selectedDate,
|
679
|
+
maxDate,
|
680
|
+
firstYearChunkEl,
|
681
|
+
datePickerEl,
|
682
|
+
inputDate,
|
683
|
+
internalInputEl,
|
684
|
+
externalInputEl,
|
685
|
+
calendarEl,
|
686
|
+
rangeDate,
|
687
|
+
defaultDate,
|
688
|
+
statusEl,
|
689
|
+
};
|
690
|
+
};
|
691
|
+
|
692
|
+
/**
|
693
|
+
* Disable the date picker component
|
694
|
+
*
|
695
|
+
* @param {HTMLElement} el An element within the date picker component
|
696
|
+
*/
|
697
|
+
const disable = (el) => {
|
698
|
+
const { externalInputEl, toggleBtnEl } = getDatePickerContext(el);
|
699
|
+
|
700
|
+
toggleBtnEl.disabled = true;
|
701
|
+
externalInputEl.disabled = true;
|
702
|
+
};
|
703
|
+
|
704
|
+
/**
|
705
|
+
* Enable the date picker component
|
706
|
+
*
|
707
|
+
* @param {HTMLElement} el An element within the date picker component
|
708
|
+
*/
|
709
|
+
const enable = (el) => {
|
710
|
+
const { externalInputEl, toggleBtnEl } = getDatePickerContext(el);
|
711
|
+
|
712
|
+
toggleBtnEl.disabled = false;
|
713
|
+
externalInputEl.disabled = false;
|
714
|
+
};
|
715
|
+
|
716
|
+
// #region Validation
|
717
|
+
|
718
|
+
/**
|
719
|
+
* Validate the value in the input as a valid date of format D/M/YYYY
|
720
|
+
*
|
721
|
+
* @param {HTMLElement} el An element within the date picker component
|
722
|
+
*/
|
723
|
+
const isDateInputInvalid = (el) => {
|
724
|
+
const { externalInputEl, minDate, maxDate } = getDatePickerContext(el);
|
725
|
+
|
726
|
+
const dateString = externalInputEl.value;
|
727
|
+
let isInvalid = false;
|
728
|
+
|
729
|
+
if (dateString) {
|
730
|
+
isInvalid = true;
|
731
|
+
|
732
|
+
const dateStringParts = dateString.split("/");
|
733
|
+
const [day, month, year] = dateStringParts.map((str) => {
|
734
|
+
let value;
|
735
|
+
const parsed = parseInt(str, 10);
|
736
|
+
if (!Number.isNaN(parsed)) value = parsed;
|
737
|
+
return value;
|
738
|
+
});
|
739
|
+
|
740
|
+
if (month && day && year != null) {
|
741
|
+
const checkDate = setDate(year, month - 1, day);
|
742
|
+
|
743
|
+
if (
|
744
|
+
checkDate.getMonth() === month - 1 &&
|
745
|
+
checkDate.getDate() === day &&
|
746
|
+
checkDate.getFullYear() === year &&
|
747
|
+
dateStringParts[2].length === 4 &&
|
748
|
+
isDateWithinMinAndMax(checkDate, minDate, maxDate)
|
749
|
+
) {
|
750
|
+
isInvalid = false;
|
751
|
+
}
|
752
|
+
}
|
753
|
+
}
|
754
|
+
|
755
|
+
return isInvalid;
|
756
|
+
};
|
757
|
+
|
758
|
+
/**
|
759
|
+
* Validate the value in the input as a valid date of format M/D/YYYY
|
760
|
+
*
|
761
|
+
* @param {HTMLElement} el An element within the date picker component
|
762
|
+
*/
|
763
|
+
const validateDateInput = (el) => {
|
764
|
+
const { externalInputEl } = getDatePickerContext(el);
|
765
|
+
const isInvalid = isDateInputInvalid(externalInputEl);
|
766
|
+
|
767
|
+
if (isInvalid && !externalInputEl.validationMessage) {
|
768
|
+
externalInputEl.setCustomValidity(VALIDATION_MESSAGE);
|
769
|
+
}
|
770
|
+
|
771
|
+
if (!isInvalid && externalInputEl.validationMessage === VALIDATION_MESSAGE) {
|
772
|
+
externalInputEl.setCustomValidity("");
|
773
|
+
}
|
774
|
+
};
|
775
|
+
|
776
|
+
// #endregion Validation
|
777
|
+
|
778
|
+
/**
|
779
|
+
* Enable the date picker component
|
780
|
+
*
|
781
|
+
* @param {HTMLElement} el An element within the date picker component
|
782
|
+
*/
|
783
|
+
const reconcileInputValues = (el) => {
|
784
|
+
const { internalInputEl, inputDate } = getDatePickerContext(el);
|
785
|
+
let newValue = "";
|
786
|
+
|
787
|
+
if (inputDate && !isDateInputInvalid(el)) {
|
788
|
+
newValue = formatDate(inputDate);
|
789
|
+
}
|
790
|
+
|
791
|
+
if (internalInputEl.value !== newValue) {
|
792
|
+
changeElementValue(internalInputEl, newValue);
|
793
|
+
}
|
794
|
+
};
|
795
|
+
|
796
|
+
/**
|
797
|
+
* Select the value of the date picker inputs.
|
798
|
+
*
|
799
|
+
* @param {HTMLButtonElement} el An element within the date picker component
|
800
|
+
* @param {string} dateString The date string to update in YYYY-MM-DD format
|
801
|
+
*/
|
802
|
+
const setCalendarValue = (el, dateString) => {
|
803
|
+
const parsedDate = parseDateString(dateString);
|
804
|
+
|
805
|
+
if (parsedDate) {
|
806
|
+
const formattedDate = formatDate(parsedDate, DEFAULT_EXTERNAL_DATE_FORMAT);
|
807
|
+
|
808
|
+
const {
|
809
|
+
datePickerEl,
|
810
|
+
internalInputEl,
|
811
|
+
externalInputEl,
|
812
|
+
} = getDatePickerContext(el);
|
813
|
+
|
814
|
+
changeElementValue(internalInputEl, dateString);
|
815
|
+
changeElementValue(externalInputEl, formattedDate);
|
816
|
+
|
817
|
+
validateDateInput(datePickerEl);
|
818
|
+
}
|
819
|
+
};
|
820
|
+
|
821
|
+
/**
|
822
|
+
* Enhance an input with the date picker elements
|
823
|
+
*
|
824
|
+
* @param {HTMLElement} el The initial wrapping element of the date picker component
|
825
|
+
*/
|
826
|
+
const enhanceDatePicker = (el) => {
|
827
|
+
const datePickerEl = el.closest(DATE_PICKER);
|
828
|
+
const defaultValue = datePickerEl.dataset.defaultValue;
|
829
|
+
|
830
|
+
const internalInputEl = datePickerEl.querySelector(`input`);
|
831
|
+
|
832
|
+
if (!internalInputEl) {
|
833
|
+
throw new Error(`${DATE_PICKER} is missing inner input`);
|
834
|
+
}
|
835
|
+
|
836
|
+
|
837
|
+
const minDate = parseDateString(
|
838
|
+
datePickerEl.dataset.minDate || internalInputEl.getAttribute("min")
|
839
|
+
);
|
840
|
+
datePickerEl.dataset.minDate = minDate
|
841
|
+
? formatDate(minDate)
|
842
|
+
: DEFAULT_MIN_DATE;
|
843
|
+
|
844
|
+
const maxDate = parseDateString(
|
845
|
+
datePickerEl.dataset.maxDate || internalInputEl.getAttribute("max")
|
846
|
+
);
|
847
|
+
if (maxDate) {
|
848
|
+
datePickerEl.dataset.maxDate = formatDate(maxDate);
|
849
|
+
}
|
850
|
+
|
851
|
+
const calendarWrapper = document.createElement("div");
|
852
|
+
calendarWrapper.classList.add(DATE_PICKER_WRAPPER_CLASS);
|
853
|
+
calendarWrapper.tabIndex = "-1";
|
854
|
+
|
855
|
+
const externalInputEl = internalInputEl.cloneNode();
|
856
|
+
externalInputEl.classList.add(DATE_PICKER_EXTERNAL_INPUT_CLASS);
|
857
|
+
externalInputEl.type = "text";
|
858
|
+
externalInputEl.name = "";
|
859
|
+
|
860
|
+
calendarWrapper.appendChild(externalInputEl);
|
861
|
+
calendarWrapper.insertAdjacentHTML(
|
862
|
+
"beforeend",
|
863
|
+
[
|
864
|
+
`<button type="button" class="${DATE_PICKER_BUTTON_CLASS}" aria-haspopup="true" aria-label="Åbn kalender"> </button>`,
|
865
|
+
`<div class="${DATE_PICKER_CALENDAR_CLASS}" role="dialog" aria-modal="true" hidden></div>`,
|
866
|
+
`<div class="sr-only ${DATE_PICKER_STATUS_CLASS}" role="status" aria-live="polite"></div>`,
|
867
|
+
].join("")
|
868
|
+
);
|
869
|
+
|
870
|
+
internalInputEl.setAttribute("aria-hidden", "true");
|
871
|
+
internalInputEl.setAttribute("tabindex", "-1");
|
872
|
+
internalInputEl.classList.add(
|
873
|
+
"sr-only",
|
874
|
+
DATE_PICKER_INTERNAL_INPUT_CLASS
|
875
|
+
);
|
876
|
+
internalInputEl.removeAttribute('id');
|
877
|
+
internalInputEl.required = false;
|
878
|
+
|
879
|
+
datePickerEl.appendChild(calendarWrapper);
|
880
|
+
datePickerEl.classList.add(DATE_PICKER_INITIALIZED_CLASS);
|
881
|
+
|
882
|
+
if (defaultValue) {
|
883
|
+
setCalendarValue(datePickerEl, defaultValue);
|
884
|
+
}
|
885
|
+
|
886
|
+
if (internalInputEl.disabled) {
|
887
|
+
disable(datePickerEl);
|
888
|
+
internalInputEl.disabled = false;
|
889
|
+
}
|
890
|
+
|
891
|
+
if (externalInputEl.value) {
|
892
|
+
validateDateInput(externalInputEl);
|
893
|
+
}
|
894
|
+
};
|
895
|
+
|
896
|
+
// #region Calendar - Date Selection View
|
897
|
+
|
898
|
+
/**
|
899
|
+
* render the calendar.
|
900
|
+
*
|
901
|
+
* @param {HTMLElement} el An element within the date picker component
|
902
|
+
* @param {Date} _dateToDisplay a date to render on the calendar
|
903
|
+
* @returns {HTMLElement} a reference to the new calendar element
|
904
|
+
*/
|
905
|
+
const renderCalendar = (el, _dateToDisplay) => {
|
906
|
+
const {
|
907
|
+
datePickerEl,
|
908
|
+
calendarEl,
|
909
|
+
statusEl,
|
910
|
+
selectedDate,
|
911
|
+
maxDate,
|
912
|
+
minDate,
|
913
|
+
rangeDate,
|
914
|
+
} = getDatePickerContext(el);
|
915
|
+
const todaysDate = today();
|
916
|
+
let dateToDisplay = _dateToDisplay || todaysDate;
|
917
|
+
|
918
|
+
const calendarWasHidden = calendarEl.hidden;
|
919
|
+
|
920
|
+
const focusedDate = addDays(dateToDisplay, 0);
|
921
|
+
const focusedMonth = dateToDisplay.getMonth();
|
922
|
+
const focusedYear = dateToDisplay.getFullYear();
|
923
|
+
|
924
|
+
const prevMonth = subMonths(dateToDisplay, 1);
|
925
|
+
const nextMonth = addMonths(dateToDisplay, 1);
|
926
|
+
|
927
|
+
const currentFormattedDate = formatDate(dateToDisplay);
|
928
|
+
|
929
|
+
const firstOfMonth = startOfMonth(dateToDisplay);
|
930
|
+
const prevButtonsDisabled = isSameMonth(dateToDisplay, minDate);
|
931
|
+
const nextButtonsDisabled = isSameMonth(dateToDisplay, maxDate);
|
932
|
+
|
933
|
+
const rangeConclusionDate = selectedDate || dateToDisplay;
|
934
|
+
const rangeStartDate = rangeDate && min(rangeConclusionDate, rangeDate);
|
935
|
+
const rangeEndDate = rangeDate && max(rangeConclusionDate, rangeDate);
|
936
|
+
|
937
|
+
const withinRangeStartDate = rangeDate && addDays(rangeStartDate, 1);
|
938
|
+
const withinRangeEndDate = rangeDate && subDays(rangeEndDate, 1);
|
939
|
+
|
940
|
+
const monthLabel = MONTH_LABELS[focusedMonth];
|
941
|
+
|
942
|
+
const generateDateHtml = (dateToRender) => {
|
943
|
+
const classes = [CALENDAR_DATE_CLASS];
|
944
|
+
const day = dateToRender.getDate();
|
945
|
+
const month = dateToRender.getMonth();
|
946
|
+
const year = dateToRender.getFullYear();
|
947
|
+
const dayOfWeek = dateToRender.getDay();
|
948
|
+
|
949
|
+
const formattedDate = formatDate(dateToRender);
|
950
|
+
|
951
|
+
let tabindex = "-1";
|
952
|
+
|
953
|
+
const isDisabled = !isDateWithinMinAndMax(dateToRender, minDate, maxDate);
|
954
|
+
const isSelected = isSameDay(dateToRender, selectedDate);
|
955
|
+
|
956
|
+
if (isSameMonth(dateToRender, prevMonth)) {
|
957
|
+
classes.push(CALENDAR_DATE_PREVIOUS_MONTH_CLASS);
|
958
|
+
}
|
959
|
+
|
960
|
+
if (isSameMonth(dateToRender, focusedDate)) {
|
961
|
+
classes.push(CALENDAR_DATE_CURRENT_MONTH_CLASS);
|
962
|
+
}
|
963
|
+
|
964
|
+
if (isSameMonth(dateToRender, nextMonth)) {
|
965
|
+
classes.push(CALENDAR_DATE_NEXT_MONTH_CLASS);
|
966
|
+
}
|
967
|
+
|
968
|
+
if (isSelected) {
|
969
|
+
classes.push(CALENDAR_DATE_SELECTED_CLASS);
|
970
|
+
}
|
971
|
+
|
972
|
+
if (isSameDay(dateToRender, todaysDate)) {
|
973
|
+
classes.push(CALENDAR_DATE_TODAY_CLASS);
|
974
|
+
}
|
975
|
+
|
976
|
+
if (rangeDate) {
|
977
|
+
if (isSameDay(dateToRender, rangeDate)) {
|
978
|
+
classes.push(CALENDAR_DATE_RANGE_DATE_CLASS);
|
979
|
+
}
|
980
|
+
|
981
|
+
if (isSameDay(dateToRender, rangeStartDate)) {
|
982
|
+
classes.push(CALENDAR_DATE_RANGE_DATE_START_CLASS);
|
983
|
+
}
|
984
|
+
|
985
|
+
if (isSameDay(dateToRender, rangeEndDate)) {
|
986
|
+
classes.push(CALENDAR_DATE_RANGE_DATE_END_CLASS);
|
987
|
+
}
|
988
|
+
|
989
|
+
if (
|
990
|
+
isDateWithinMinAndMax(
|
991
|
+
dateToRender,
|
992
|
+
withinRangeStartDate,
|
993
|
+
withinRangeEndDate
|
994
|
+
)
|
995
|
+
) {
|
996
|
+
classes.push(CALENDAR_DATE_WITHIN_RANGE_CLASS);
|
997
|
+
}
|
998
|
+
}
|
999
|
+
|
1000
|
+
if (isSameDay(dateToRender, focusedDate)) {
|
1001
|
+
tabindex = "0";
|
1002
|
+
classes.push(CALENDAR_DATE_FOCUSED_CLASS);
|
1003
|
+
}
|
1004
|
+
|
1005
|
+
const monthStr = MONTH_LABELS[month];
|
1006
|
+
const dayStr = DAY_OF_WEEK_LABELS[dayOfWeek];
|
1007
|
+
|
1008
|
+
return `<button
|
1009
|
+
type="button"
|
1010
|
+
tabindex="${tabindex}"
|
1011
|
+
class="${classes.join(" ")}"
|
1012
|
+
data-day="${day}"
|
1013
|
+
data-month="${month + 1}"
|
1014
|
+
data-year="${year}"
|
1015
|
+
data-value="${formattedDate}"
|
1016
|
+
aria-label="${dayStr} den ${day} ${monthStr} ${year} "
|
1017
|
+
aria-selected="${isSelected ? "true" : "false"}"
|
1018
|
+
${isDisabled ? `disabled="disabled"` : ""}
|
1019
|
+
>${day}</button>`;
|
1020
|
+
};
|
1021
|
+
// set date to first rendered day
|
1022
|
+
dateToDisplay = startOfWeek(firstOfMonth);
|
1023
|
+
|
1024
|
+
const days = [];
|
1025
|
+
|
1026
|
+
while (
|
1027
|
+
days.length < 28 ||
|
1028
|
+
dateToDisplay.getMonth() === focusedMonth ||
|
1029
|
+
days.length % 7 !== 0
|
1030
|
+
) {
|
1031
|
+
days.push(generateDateHtml(dateToDisplay));
|
1032
|
+
dateToDisplay = addDays(dateToDisplay, 1);
|
1033
|
+
}
|
1034
|
+
const datesHtml = listToGridHtml(days, 7);
|
1035
|
+
|
1036
|
+
const newCalendar = calendarEl.cloneNode();
|
1037
|
+
newCalendar.dataset.value = currentFormattedDate;
|
1038
|
+
newCalendar.style.top = `${datePickerEl.offsetHeight}px`;
|
1039
|
+
newCalendar.hidden = false;
|
1040
|
+
let content = `<div tabindex="-1" class="${CALENDAR_DATE_PICKER_CLASS}">
|
1041
|
+
<div class="${CALENDAR_ROW_CLASS}">
|
1042
|
+
<div class="${CALENDAR_CELL_CLASS} ${CALENDAR_CELL_CENTER_ITEMS_CLASS}">
|
1043
|
+
<button
|
1044
|
+
type="button"
|
1045
|
+
class="${CALENDAR_PREVIOUS_YEAR_CLASS}"
|
1046
|
+
aria-label="Navigér ét år tilbage"
|
1047
|
+
${prevButtonsDisabled ? `disabled="disabled"` : ""}
|
1048
|
+
> </button>
|
1049
|
+
</div>
|
1050
|
+
<div class="${CALENDAR_CELL_CLASS} ${CALENDAR_CELL_CENTER_ITEMS_CLASS}">
|
1051
|
+
<button
|
1052
|
+
type="button"
|
1053
|
+
class="${CALENDAR_PREVIOUS_MONTH_CLASS}"
|
1054
|
+
aria-label="Navigér én måned tilbage"
|
1055
|
+
${prevButtonsDisabled ? `disabled="disabled"` : ""}
|
1056
|
+
> </button>
|
1057
|
+
</div>
|
1058
|
+
<div class="${CALENDAR_CELL_CLASS} ${CALENDAR_MONTH_LABEL_CLASS}">
|
1059
|
+
<button
|
1060
|
+
type="button"
|
1061
|
+
class="${CALENDAR_MONTH_SELECTION_CLASS}" aria-label="${monthLabel}. Vælg måned."
|
1062
|
+
>${monthLabel}</button>
|
1063
|
+
<button
|
1064
|
+
type="button"
|
1065
|
+
class="${CALENDAR_YEAR_SELECTION_CLASS}" aria-label="${focusedYear}. Vælg år."
|
1066
|
+
>${focusedYear}</button>
|
1067
|
+
</div>
|
1068
|
+
<div class="${CALENDAR_CELL_CLASS} ${CALENDAR_CELL_CENTER_ITEMS_CLASS}">
|
1069
|
+
<button
|
1070
|
+
type="button"
|
1071
|
+
class="${CALENDAR_NEXT_MONTH_CLASS}"
|
1072
|
+
aria-label="Navigér én måned frem"
|
1073
|
+
${nextButtonsDisabled ? `disabled="disabled"` : ""}
|
1074
|
+
> </button>
|
1075
|
+
</div>
|
1076
|
+
<div class="${CALENDAR_CELL_CLASS} ${CALENDAR_CELL_CENTER_ITEMS_CLASS}">
|
1077
|
+
<button
|
1078
|
+
type="button"
|
1079
|
+
class="${CALENDAR_NEXT_YEAR_CLASS}"
|
1080
|
+
aria-label="Navigér ét år frem"
|
1081
|
+
${nextButtonsDisabled ? `disabled="disabled"` : ""}
|
1082
|
+
> </button>
|
1083
|
+
</div>
|
1084
|
+
</div>
|
1085
|
+
<table class="${CALENDAR_TABLE_CLASS}" role="presentation">
|
1086
|
+
<thead>
|
1087
|
+
<tr>`;
|
1088
|
+
for(let d in DAY_OF_WEEK_LABELS){
|
1089
|
+
content += `<th class="${CALENDAR_DAY_OF_WEEK_CLASS}" scope="col" aria-label="${DAY_OF_WEEK_LABELS[d]}">${DAY_OF_WEEK_LABELS[d].charAt(0)}</th>`;
|
1090
|
+
}
|
1091
|
+
content += `</tr>
|
1092
|
+
</thead>
|
1093
|
+
<tbody>
|
1094
|
+
${datesHtml}
|
1095
|
+
</tbody>
|
1096
|
+
</table>
|
1097
|
+
</div>`;
|
1098
|
+
newCalendar.innerHTML = content;
|
1099
|
+
calendarEl.parentNode.replaceChild(newCalendar, calendarEl);
|
1100
|
+
|
1101
|
+
datePickerEl.classList.add(DATE_PICKER_ACTIVE_CLASS);
|
1102
|
+
|
1103
|
+
const statuses = [];
|
1104
|
+
|
1105
|
+
if (isSameDay(selectedDate, focusedDate)) {
|
1106
|
+
statuses.push("Selected date");
|
1107
|
+
}
|
1108
|
+
|
1109
|
+
if (calendarWasHidden) {
|
1110
|
+
statuses.push(
|
1111
|
+
"Du kan navigere mellem dage ved at bruge højre og venstre piltaster, ",
|
1112
|
+
"uger ved at bruge op og ned piltaster, ",
|
1113
|
+
"måneder ved ta bruge page up og page down tasterne ",
|
1114
|
+
"og år ved at at taste shift og page up eller ned.",
|
1115
|
+
"Home og end tasten navigerer til start eller slutning af en uge."
|
1116
|
+
);
|
1117
|
+
statusEl.textContent = "";
|
1118
|
+
} else {
|
1119
|
+
statuses.push(`${monthLabel} ${focusedYear}`);
|
1120
|
+
}
|
1121
|
+
statusEl.textContent = statuses.join(". ");
|
1122
|
+
|
1123
|
+
return newCalendar;
|
1124
|
+
};
|
1125
|
+
|
1126
|
+
/**
|
1127
|
+
* Navigate back one year and display the calendar.
|
1128
|
+
*
|
1129
|
+
* @param {HTMLButtonElement} _buttonEl An element within the date picker component
|
1130
|
+
*/
|
1131
|
+
const displayPreviousYear = (_buttonEl) => {
|
1132
|
+
if (_buttonEl.disabled) return;
|
1133
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1134
|
+
_buttonEl
|
1135
|
+
);
|
1136
|
+
let date = subYears(calendarDate, 1);
|
1137
|
+
date = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1138
|
+
const newCalendar = renderCalendar(calendarEl, date);
|
1139
|
+
|
1140
|
+
let nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_YEAR);
|
1141
|
+
if (nextToFocus.disabled) {
|
1142
|
+
nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER);
|
1143
|
+
}
|
1144
|
+
nextToFocus.focus();
|
1145
|
+
};
|
1146
|
+
|
1147
|
+
/**
|
1148
|
+
* Navigate back one month and display the calendar.
|
1149
|
+
*
|
1150
|
+
* @param {HTMLButtonElement} _buttonEl An element within the date picker component
|
1151
|
+
*/
|
1152
|
+
const displayPreviousMonth = (_buttonEl) => {
|
1153
|
+
if (_buttonEl.disabled) return;
|
1154
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1155
|
+
_buttonEl
|
1156
|
+
);
|
1157
|
+
let date = subMonths(calendarDate, 1);
|
1158
|
+
date = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1159
|
+
const newCalendar = renderCalendar(calendarEl, date);
|
1160
|
+
|
1161
|
+
let nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_MONTH);
|
1162
|
+
if (nextToFocus.disabled) {
|
1163
|
+
nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER);
|
1164
|
+
}
|
1165
|
+
nextToFocus.focus();
|
1166
|
+
};
|
1167
|
+
|
1168
|
+
/**
|
1169
|
+
* Navigate forward one month and display the calendar.
|
1170
|
+
*
|
1171
|
+
* @param {HTMLButtonElement} _buttonEl An element within the date picker component
|
1172
|
+
*/
|
1173
|
+
const displayNextMonth = (_buttonEl) => {
|
1174
|
+
if (_buttonEl.disabled) return;
|
1175
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1176
|
+
_buttonEl
|
1177
|
+
);
|
1178
|
+
let date = addMonths(calendarDate, 1);
|
1179
|
+
date = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1180
|
+
const newCalendar = renderCalendar(calendarEl, date);
|
1181
|
+
|
1182
|
+
let nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_MONTH);
|
1183
|
+
if (nextToFocus.disabled) {
|
1184
|
+
nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER);
|
1185
|
+
}
|
1186
|
+
nextToFocus.focus();
|
1187
|
+
};
|
1188
|
+
|
1189
|
+
/**
|
1190
|
+
* Navigate forward one year and display the calendar.
|
1191
|
+
*
|
1192
|
+
* @param {HTMLButtonElement} _buttonEl An element within the date picker component
|
1193
|
+
*/
|
1194
|
+
const displayNextYear = (_buttonEl) => {
|
1195
|
+
if (_buttonEl.disabled) return;
|
1196
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1197
|
+
_buttonEl
|
1198
|
+
);
|
1199
|
+
let date = addYears(calendarDate, 1);
|
1200
|
+
date = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1201
|
+
const newCalendar = renderCalendar(calendarEl, date);
|
1202
|
+
|
1203
|
+
let nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_YEAR);
|
1204
|
+
if (nextToFocus.disabled) {
|
1205
|
+
nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER);
|
1206
|
+
}
|
1207
|
+
nextToFocus.focus();
|
1208
|
+
};
|
1209
|
+
|
1210
|
+
/**
|
1211
|
+
* Hide the calendar of a date picker component.
|
1212
|
+
*
|
1213
|
+
* @param {HTMLElement} el An element within the date picker component
|
1214
|
+
*/
|
1215
|
+
const hideCalendar = (el) => {
|
1216
|
+
const { datePickerEl, calendarEl, statusEl } = getDatePickerContext(el);
|
1217
|
+
|
1218
|
+
datePickerEl.classList.remove(DATE_PICKER_ACTIVE_CLASS);
|
1219
|
+
calendarEl.hidden = true;
|
1220
|
+
statusEl.textContent = "";
|
1221
|
+
};
|
1222
|
+
|
1223
|
+
/**
|
1224
|
+
* Select a date within the date picker component.
|
1225
|
+
*
|
1226
|
+
* @param {HTMLButtonElement} calendarDateEl A date element within the date picker component
|
1227
|
+
*/
|
1228
|
+
const selectDate = (calendarDateEl) => {
|
1229
|
+
if (calendarDateEl.disabled) return;
|
1230
|
+
|
1231
|
+
const { datePickerEl, externalInputEl } = getDatePickerContext(
|
1232
|
+
calendarDateEl
|
1233
|
+
);
|
1234
|
+
setCalendarValue(calendarDateEl, calendarDateEl.dataset.value);
|
1235
|
+
hideCalendar(datePickerEl);
|
1236
|
+
|
1237
|
+
externalInputEl.focus();
|
1238
|
+
};
|
1239
|
+
|
1240
|
+
/**
|
1241
|
+
* Toggle the calendar.
|
1242
|
+
*
|
1243
|
+
* @param {HTMLButtonElement} el An element within the date picker component
|
1244
|
+
*/
|
1245
|
+
const toggleCalendar = (el) => {
|
1246
|
+
if (el.disabled) return;
|
1247
|
+
const {
|
1248
|
+
calendarEl,
|
1249
|
+
inputDate,
|
1250
|
+
minDate,
|
1251
|
+
maxDate,
|
1252
|
+
defaultDate,
|
1253
|
+
} = getDatePickerContext(el);
|
1254
|
+
|
1255
|
+
if (calendarEl.hidden) {
|
1256
|
+
const dateToDisplay = keepDateBetweenMinAndMax(
|
1257
|
+
inputDate || defaultDate || today(),
|
1258
|
+
minDate,
|
1259
|
+
maxDate
|
1260
|
+
);
|
1261
|
+
const newCalendar = renderCalendar(calendarEl, dateToDisplay);
|
1262
|
+
newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();
|
1263
|
+
} else {
|
1264
|
+
hideCalendar(el);
|
1265
|
+
}
|
1266
|
+
};
|
1267
|
+
|
1268
|
+
/**
|
1269
|
+
* Update the calendar when visible.
|
1270
|
+
*
|
1271
|
+
* @param {HTMLElement} el an element within the date picker
|
1272
|
+
*/
|
1273
|
+
const updateCalendarIfVisible = (el) => {
|
1274
|
+
const { calendarEl, inputDate, minDate, maxDate } = getDatePickerContext(el);
|
1275
|
+
const calendarShown = !calendarEl.hidden;
|
1276
|
+
|
1277
|
+
if (calendarShown && inputDate) {
|
1278
|
+
const dateToDisplay = keepDateBetweenMinAndMax(inputDate, minDate, maxDate);
|
1279
|
+
renderCalendar(calendarEl, dateToDisplay);
|
1280
|
+
}
|
1281
|
+
};
|
1282
|
+
|
1283
|
+
// #endregion Calendar - Date Selection View
|
1284
|
+
|
1285
|
+
// #region Calendar - Month Selection View
|
1286
|
+
/**
|
1287
|
+
* Display the month selection screen in the date picker.
|
1288
|
+
*
|
1289
|
+
* @param {HTMLButtonElement} el An element within the date picker component
|
1290
|
+
* @returns {HTMLElement} a reference to the new calendar element
|
1291
|
+
*/
|
1292
|
+
const displayMonthSelection = (el, monthToDisplay) => {
|
1293
|
+
const {
|
1294
|
+
calendarEl,
|
1295
|
+
statusEl,
|
1296
|
+
calendarDate,
|
1297
|
+
minDate,
|
1298
|
+
maxDate,
|
1299
|
+
} = getDatePickerContext(el);
|
1300
|
+
|
1301
|
+
const selectedMonth = calendarDate.getMonth();
|
1302
|
+
const focusedMonth = monthToDisplay == null ? selectedMonth : monthToDisplay;
|
1303
|
+
|
1304
|
+
const months = MONTH_LABELS.map((month, index) => {
|
1305
|
+
const monthToCheck = setMonth(calendarDate, index);
|
1306
|
+
|
1307
|
+
const isDisabled = isDatesMonthOutsideMinOrMax(
|
1308
|
+
monthToCheck,
|
1309
|
+
minDate,
|
1310
|
+
maxDate
|
1311
|
+
);
|
1312
|
+
|
1313
|
+
let tabindex = "-1";
|
1314
|
+
|
1315
|
+
const classes = [CALENDAR_MONTH_CLASS];
|
1316
|
+
const isSelected = index === selectedMonth;
|
1317
|
+
|
1318
|
+
if (index === focusedMonth) {
|
1319
|
+
tabindex = "0";
|
1320
|
+
classes.push(CALENDAR_MONTH_FOCUSED_CLASS);
|
1321
|
+
}
|
1322
|
+
|
1323
|
+
if (isSelected) {
|
1324
|
+
classes.push(CALENDAR_MONTH_SELECTED_CLASS);
|
1325
|
+
}
|
1326
|
+
|
1327
|
+
return `<button
|
1328
|
+
type="button"
|
1329
|
+
tabindex="${tabindex}"
|
1330
|
+
class="${classes.join(" ")}"
|
1331
|
+
data-value="${index}"
|
1332
|
+
data-label="${month}"
|
1333
|
+
aria-selected="${isSelected ? "true" : "false"}"
|
1334
|
+
${isDisabled ? `disabled="disabled"` : ""}
|
1335
|
+
>${month}</button>`;
|
1336
|
+
});
|
1337
|
+
|
1338
|
+
const monthsHtml = `<div tabindex="-1" class="${CALENDAR_MONTH_PICKER_CLASS}">
|
1339
|
+
<table class="${CALENDAR_TABLE_CLASS}" role="presentation">
|
1340
|
+
<tbody>
|
1341
|
+
${listToGridHtml(months, 3)}
|
1342
|
+
</tbody>
|
1343
|
+
</table>
|
1344
|
+
</div>`;
|
1345
|
+
|
1346
|
+
const newCalendar = calendarEl.cloneNode();
|
1347
|
+
newCalendar.innerHTML = monthsHtml;
|
1348
|
+
calendarEl.parentNode.replaceChild(newCalendar, calendarEl);
|
1349
|
+
|
1350
|
+
statusEl.textContent = "Select a month.";
|
1351
|
+
|
1352
|
+
return newCalendar;
|
1353
|
+
};
|
1354
|
+
|
1355
|
+
/**
|
1356
|
+
* Select a month in the date picker component.
|
1357
|
+
*
|
1358
|
+
* @param {HTMLButtonElement} monthEl An month element within the date picker component
|
1359
|
+
*/
|
1360
|
+
const selectMonth = (monthEl) => {
|
1361
|
+
if (monthEl.disabled) return;
|
1362
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1363
|
+
monthEl
|
1364
|
+
);
|
1365
|
+
const selectedMonth = parseInt(monthEl.dataset.value, 10);
|
1366
|
+
let date = setMonth(calendarDate, selectedMonth);
|
1367
|
+
date = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1368
|
+
const newCalendar = renderCalendar(calendarEl, date);
|
1369
|
+
newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();
|
1370
|
+
};
|
1371
|
+
|
1372
|
+
// #endregion Calendar - Month Selection View
|
1373
|
+
|
1374
|
+
// #region Calendar - Year Selection View
|
1375
|
+
|
1376
|
+
/**
|
1377
|
+
* Display the year selection screen in the date picker.
|
1378
|
+
*
|
1379
|
+
* @param {HTMLButtonElement} el An element within the date picker component
|
1380
|
+
* @param {number} yearToDisplay year to display in year selection
|
1381
|
+
* @returns {HTMLElement} a reference to the new calendar element
|
1382
|
+
*/
|
1383
|
+
const displayYearSelection = (el, yearToDisplay) => {
|
1384
|
+
const {
|
1385
|
+
calendarEl,
|
1386
|
+
statusEl,
|
1387
|
+
calendarDate,
|
1388
|
+
minDate,
|
1389
|
+
maxDate,
|
1390
|
+
} = getDatePickerContext(el);
|
1391
|
+
|
1392
|
+
const selectedYear = calendarDate.getFullYear();
|
1393
|
+
const focusedYear = yearToDisplay == null ? selectedYear : yearToDisplay;
|
1394
|
+
|
1395
|
+
let yearToChunk = focusedYear;
|
1396
|
+
yearToChunk -= yearToChunk % YEAR_CHUNK;
|
1397
|
+
yearToChunk = Math.max(0, yearToChunk);
|
1398
|
+
|
1399
|
+
const prevYearChunkDisabled = isDatesYearOutsideMinOrMax(
|
1400
|
+
setYear(calendarDate, yearToChunk - 1),
|
1401
|
+
minDate,
|
1402
|
+
maxDate
|
1403
|
+
);
|
1404
|
+
|
1405
|
+
const nextYearChunkDisabled = isDatesYearOutsideMinOrMax(
|
1406
|
+
setYear(calendarDate, yearToChunk + YEAR_CHUNK),
|
1407
|
+
minDate,
|
1408
|
+
maxDate
|
1409
|
+
);
|
1410
|
+
|
1411
|
+
const years = [];
|
1412
|
+
let yearIndex = yearToChunk;
|
1413
|
+
while (years.length < YEAR_CHUNK) {
|
1414
|
+
const isDisabled = isDatesYearOutsideMinOrMax(
|
1415
|
+
setYear(calendarDate, yearIndex),
|
1416
|
+
minDate,
|
1417
|
+
maxDate
|
1418
|
+
);
|
1419
|
+
|
1420
|
+
let tabindex = "-1";
|
1421
|
+
|
1422
|
+
const classes = [CALENDAR_YEAR_CLASS];
|
1423
|
+
const isSelected = yearIndex === selectedYear;
|
1424
|
+
|
1425
|
+
if (yearIndex === focusedYear) {
|
1426
|
+
tabindex = "0";
|
1427
|
+
classes.push(CALENDAR_YEAR_FOCUSED_CLASS);
|
1428
|
+
}
|
1429
|
+
|
1430
|
+
if (isSelected) {
|
1431
|
+
classes.push(CALENDAR_YEAR_SELECTED_CLASS);
|
1432
|
+
}
|
1433
|
+
|
1434
|
+
years.push(
|
1435
|
+
`<button
|
1436
|
+
type="button"
|
1437
|
+
tabindex="${tabindex}"
|
1438
|
+
class="${classes.join(" ")}"
|
1439
|
+
data-value="${yearIndex}"
|
1440
|
+
aria-selected="${isSelected ? "true" : "false"}"
|
1441
|
+
${isDisabled ? `disabled="disabled"` : ""}
|
1442
|
+
>${yearIndex}</button>`
|
1443
|
+
);
|
1444
|
+
yearIndex += 1;
|
1445
|
+
}
|
1446
|
+
|
1447
|
+
const yearsHtml = listToGridHtml(years, 3);
|
1448
|
+
|
1449
|
+
const newCalendar = calendarEl.cloneNode();
|
1450
|
+
newCalendar.innerHTML = `<div tabindex="-1" class="${CALENDAR_YEAR_PICKER_CLASS}">
|
1451
|
+
<table class="${CALENDAR_TABLE_CLASS}" role="presentation">
|
1452
|
+
<tbody>
|
1453
|
+
<tr>
|
1454
|
+
<td>
|
1455
|
+
<button
|
1456
|
+
type="button"
|
1457
|
+
class="${CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS}"
|
1458
|
+
aria-label="Navigér ${YEAR_CHUNK} år tilbage"
|
1459
|
+
${prevYearChunkDisabled ? `disabled="disabled"` : ""}
|
1460
|
+
> </button>
|
1461
|
+
</td>
|
1462
|
+
<td colspan="3">
|
1463
|
+
<table class="${CALENDAR_TABLE_CLASS}" role="presentation">
|
1464
|
+
<tbody>
|
1465
|
+
${yearsHtml}
|
1466
|
+
</tbody>
|
1467
|
+
</table>
|
1468
|
+
</td>
|
1469
|
+
<td>
|
1470
|
+
<button
|
1471
|
+
type="button"
|
1472
|
+
class="${CALENDAR_NEXT_YEAR_CHUNK_CLASS}"
|
1473
|
+
aria-label="Navigér ${YEAR_CHUNK} år frem"
|
1474
|
+
${nextYearChunkDisabled ? `disabled="disabled"` : ""}
|
1475
|
+
> </button>
|
1476
|
+
</td>
|
1477
|
+
</tr>
|
1478
|
+
</tbody>
|
1479
|
+
</table>
|
1480
|
+
</div>`;
|
1481
|
+
calendarEl.parentNode.replaceChild(newCalendar, calendarEl);
|
1482
|
+
|
1483
|
+
statusEl.textContent = `Showing years ${yearToChunk} to ${
|
1484
|
+
yearToChunk + YEAR_CHUNK - 1
|
1485
|
+
}. Select a year.`;
|
1486
|
+
|
1487
|
+
return newCalendar;
|
1488
|
+
};
|
1489
|
+
|
1490
|
+
/**
|
1491
|
+
* Navigate back by years and display the year selection screen.
|
1492
|
+
*
|
1493
|
+
* @param {HTMLButtonElement} el An element within the date picker component
|
1494
|
+
*/
|
1495
|
+
const displayPreviousYearChunk = (el) => {
|
1496
|
+
if (el.disabled) return;
|
1497
|
+
|
1498
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1499
|
+
el
|
1500
|
+
);
|
1501
|
+
const yearEl = calendarEl.querySelector(CALENDAR_YEAR_FOCUSED);
|
1502
|
+
const selectedYear = parseInt(yearEl.textContent, 10);
|
1503
|
+
|
1504
|
+
let adjustedYear = selectedYear - YEAR_CHUNK;
|
1505
|
+
adjustedYear = Math.max(0, adjustedYear);
|
1506
|
+
|
1507
|
+
const date = setYear(calendarDate, adjustedYear);
|
1508
|
+
const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1509
|
+
const newCalendar = displayYearSelection(
|
1510
|
+
calendarEl,
|
1511
|
+
cappedDate.getFullYear()
|
1512
|
+
);
|
1513
|
+
|
1514
|
+
let nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_YEAR_CHUNK);
|
1515
|
+
if (nextToFocus.disabled) {
|
1516
|
+
nextToFocus = newCalendar.querySelector(CALENDAR_YEAR_PICKER);
|
1517
|
+
}
|
1518
|
+
nextToFocus.focus();
|
1519
|
+
};
|
1520
|
+
|
1521
|
+
/**
|
1522
|
+
* Navigate forward by years and display the year selection screen.
|
1523
|
+
*
|
1524
|
+
* @param {HTMLButtonElement} el An element within the date picker component
|
1525
|
+
*/
|
1526
|
+
const displayNextYearChunk = (el) => {
|
1527
|
+
if (el.disabled) return;
|
1528
|
+
|
1529
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1530
|
+
el
|
1531
|
+
);
|
1532
|
+
const yearEl = calendarEl.querySelector(CALENDAR_YEAR_FOCUSED);
|
1533
|
+
const selectedYear = parseInt(yearEl.textContent, 10);
|
1534
|
+
|
1535
|
+
let adjustedYear = selectedYear + YEAR_CHUNK;
|
1536
|
+
adjustedYear = Math.max(0, adjustedYear);
|
1537
|
+
|
1538
|
+
const date = setYear(calendarDate, adjustedYear);
|
1539
|
+
const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1540
|
+
const newCalendar = displayYearSelection(
|
1541
|
+
calendarEl,
|
1542
|
+
cappedDate.getFullYear()
|
1543
|
+
);
|
1544
|
+
|
1545
|
+
let nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_YEAR_CHUNK);
|
1546
|
+
if (nextToFocus.disabled) {
|
1547
|
+
nextToFocus = newCalendar.querySelector(CALENDAR_YEAR_PICKER);
|
1548
|
+
}
|
1549
|
+
nextToFocus.focus();
|
1550
|
+
};
|
1551
|
+
|
1552
|
+
/**
|
1553
|
+
* Select a year in the date picker component.
|
1554
|
+
*
|
1555
|
+
* @param {HTMLButtonElement} yearEl A year element within the date picker component
|
1556
|
+
*/
|
1557
|
+
const selectYear = (yearEl) => {
|
1558
|
+
if (yearEl.disabled) return;
|
1559
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1560
|
+
yearEl
|
1561
|
+
);
|
1562
|
+
const selectedYear = parseInt(yearEl.innerHTML, 10);
|
1563
|
+
let date = setYear(calendarDate, selectedYear);
|
1564
|
+
date = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1565
|
+
const newCalendar = renderCalendar(calendarEl, date);
|
1566
|
+
newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();
|
1567
|
+
};
|
1568
|
+
|
1569
|
+
// #endregion Calendar - Year Selection View
|
1570
|
+
|
1571
|
+
// #region Calendar Event Handling
|
1572
|
+
|
1573
|
+
/**
|
1574
|
+
* Hide the calendar.
|
1575
|
+
*
|
1576
|
+
* @param {KeyboardEvent} event the keydown event
|
1577
|
+
*/
|
1578
|
+
const handleEscapeFromCalendar = (event) => {
|
1579
|
+
const { datePickerEl, externalInputEl } = getDatePickerContext(event.target);
|
1580
|
+
|
1581
|
+
hideCalendar(datePickerEl);
|
1582
|
+
externalInputEl.focus();
|
1583
|
+
|
1584
|
+
event.preventDefault();
|
1585
|
+
};
|
1586
|
+
|
1587
|
+
// #endregion Calendar Event Handling
|
1588
|
+
|
1589
|
+
// #region Calendar Date Event Handling
|
1590
|
+
|
1591
|
+
/**
|
1592
|
+
* Adjust the date and display the calendar if needed.
|
1593
|
+
*
|
1594
|
+
* @param {function} adjustDateFn function that returns the adjusted date
|
1595
|
+
*/
|
1596
|
+
const adjustCalendar = (adjustDateFn) => {
|
1597
|
+
return (event) => {
|
1598
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1599
|
+
event.target
|
1600
|
+
);
|
1601
|
+
|
1602
|
+
const date = adjustDateFn(calendarDate);
|
1603
|
+
|
1604
|
+
const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1605
|
+
if (!isSameDay(calendarDate, cappedDate)) {
|
1606
|
+
const newCalendar = renderCalendar(calendarEl, cappedDate);
|
1607
|
+
newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();
|
1608
|
+
}
|
1609
|
+
event.preventDefault();
|
1610
|
+
};
|
1611
|
+
};
|
1612
|
+
|
1613
|
+
/**
|
1614
|
+
* Navigate back one week and display the calendar.
|
1615
|
+
*
|
1616
|
+
* @param {KeyboardEvent} event the keydown event
|
1617
|
+
*/
|
1618
|
+
const handleUpFromDate = adjustCalendar((date) => subWeeks(date, 1));
|
1619
|
+
|
1620
|
+
/**
|
1621
|
+
* Navigate forward one week and display the calendar.
|
1622
|
+
*
|
1623
|
+
* @param {KeyboardEvent} event the keydown event
|
1624
|
+
*/
|
1625
|
+
const handleDownFromDate = adjustCalendar((date) => addWeeks(date, 1));
|
1626
|
+
|
1627
|
+
/**
|
1628
|
+
* Navigate back one day and display the calendar.
|
1629
|
+
*
|
1630
|
+
* @param {KeyboardEvent} event the keydown event
|
1631
|
+
*/
|
1632
|
+
const handleLeftFromDate = adjustCalendar((date) => subDays(date, 1));
|
1633
|
+
|
1634
|
+
/**
|
1635
|
+
* Navigate forward one day and display the calendar.
|
1636
|
+
*
|
1637
|
+
* @param {KeyboardEvent} event the keydown event
|
1638
|
+
*/
|
1639
|
+
const handleRightFromDate = adjustCalendar((date) => addDays(date, 1));
|
1640
|
+
|
1641
|
+
/**
|
1642
|
+
* Navigate to the start of the week and display the calendar.
|
1643
|
+
*
|
1644
|
+
* @param {KeyboardEvent} event the keydown event
|
1645
|
+
*/
|
1646
|
+
const handleHomeFromDate = adjustCalendar((date) => startOfWeek(date));
|
1647
|
+
|
1648
|
+
/**
|
1649
|
+
* Navigate to the end of the week and display the calendar.
|
1650
|
+
*
|
1651
|
+
* @param {KeyboardEvent} event the keydown event
|
1652
|
+
*/
|
1653
|
+
const handleEndFromDate = adjustCalendar((date) => endOfWeek(date));
|
1654
|
+
|
1655
|
+
/**
|
1656
|
+
* Navigate forward one month and display the calendar.
|
1657
|
+
*
|
1658
|
+
* @param {KeyboardEvent} event the keydown event
|
1659
|
+
*/
|
1660
|
+
const handlePageDownFromDate = adjustCalendar((date) => addMonths(date, 1));
|
1661
|
+
|
1662
|
+
/**
|
1663
|
+
* Navigate back one month and display the calendar.
|
1664
|
+
*
|
1665
|
+
* @param {KeyboardEvent} event the keydown event
|
1666
|
+
*/
|
1667
|
+
const handlePageUpFromDate = adjustCalendar((date) => subMonths(date, 1));
|
1668
|
+
|
1669
|
+
/**
|
1670
|
+
* Navigate forward one year and display the calendar.
|
1671
|
+
*
|
1672
|
+
* @param {KeyboardEvent} event the keydown event
|
1673
|
+
*/
|
1674
|
+
const handleShiftPageDownFromDate = adjustCalendar((date) => addYears(date, 1));
|
1675
|
+
|
1676
|
+
/**
|
1677
|
+
* Navigate back one year and display the calendar.
|
1678
|
+
*
|
1679
|
+
* @param {KeyboardEvent} event the keydown event
|
1680
|
+
*/
|
1681
|
+
const handleShiftPageUpFromDate = adjustCalendar((date) => subYears(date, 1));
|
1682
|
+
|
1683
|
+
/**
|
1684
|
+
* display the calendar for the mousemove date.
|
1685
|
+
*
|
1686
|
+
* @param {MouseEvent} event The mousemove event
|
1687
|
+
* @param {HTMLButtonElement} dateEl A date element within the date picker component
|
1688
|
+
*/
|
1689
|
+
const handleMousemoveFromDate = (dateEl) => {
|
1690
|
+
if (dateEl.disabled) return;
|
1691
|
+
|
1692
|
+
const calendarEl = dateEl.closest(DATE_PICKER_CALENDAR);
|
1693
|
+
|
1694
|
+
const currentCalendarDate = calendarEl.dataset.value;
|
1695
|
+
const hoverDate = dateEl.dataset.value;
|
1696
|
+
|
1697
|
+
if (hoverDate === currentCalendarDate) return;
|
1698
|
+
|
1699
|
+
const dateToDisplay = parseDateString(hoverDate);
|
1700
|
+
const newCalendar = renderCalendar(calendarEl, dateToDisplay);
|
1701
|
+
newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();
|
1702
|
+
};
|
1703
|
+
|
1704
|
+
// #endregion Calendar Date Event Handling
|
1705
|
+
|
1706
|
+
// #region Calendar Month Event Handling
|
1707
|
+
|
1708
|
+
/**
|
1709
|
+
* Adjust the month and display the month selection screen if needed.
|
1710
|
+
*
|
1711
|
+
* @param {function} adjustMonthFn function that returns the adjusted month
|
1712
|
+
*/
|
1713
|
+
const adjustMonthSelectionScreen = (adjustMonthFn) => {
|
1714
|
+
return (event) => {
|
1715
|
+
const monthEl = event.target;
|
1716
|
+
const selectedMonth = parseInt(monthEl.dataset.value, 10);
|
1717
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1718
|
+
monthEl
|
1719
|
+
);
|
1720
|
+
const currentDate = setMonth(calendarDate, selectedMonth);
|
1721
|
+
|
1722
|
+
let adjustedMonth = adjustMonthFn(selectedMonth);
|
1723
|
+
adjustedMonth = Math.max(0, Math.min(11, adjustedMonth));
|
1724
|
+
|
1725
|
+
const date = setMonth(calendarDate, adjustedMonth);
|
1726
|
+
const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1727
|
+
if (!isSameMonth(currentDate, cappedDate)) {
|
1728
|
+
const newCalendar = displayMonthSelection(
|
1729
|
+
calendarEl,
|
1730
|
+
cappedDate.getMonth()
|
1731
|
+
);
|
1732
|
+
newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus();
|
1733
|
+
}
|
1734
|
+
event.preventDefault();
|
1735
|
+
};
|
1736
|
+
};
|
1737
|
+
|
1738
|
+
/**
|
1739
|
+
* Navigate back three months and display the month selection screen.
|
1740
|
+
*
|
1741
|
+
* @param {KeyboardEvent} event the keydown event
|
1742
|
+
*/
|
1743
|
+
const handleUpFromMonth = adjustMonthSelectionScreen((month) => month - 3);
|
1744
|
+
|
1745
|
+
/**
|
1746
|
+
* Navigate forward three months and display the month selection screen.
|
1747
|
+
*
|
1748
|
+
* @param {KeyboardEvent} event the keydown event
|
1749
|
+
*/
|
1750
|
+
const handleDownFromMonth = adjustMonthSelectionScreen((month) => month + 3);
|
1751
|
+
|
1752
|
+
/**
|
1753
|
+
* Navigate back one month and display the month selection screen.
|
1754
|
+
*
|
1755
|
+
* @param {KeyboardEvent} event the keydown event
|
1756
|
+
*/
|
1757
|
+
const handleLeftFromMonth = adjustMonthSelectionScreen((month) => month - 1);
|
1758
|
+
|
1759
|
+
/**
|
1760
|
+
* Navigate forward one month and display the month selection screen.
|
1761
|
+
*
|
1762
|
+
* @param {KeyboardEvent} event the keydown event
|
1763
|
+
*/
|
1764
|
+
const handleRightFromMonth = adjustMonthSelectionScreen((month) => month + 1);
|
1765
|
+
|
1766
|
+
/**
|
1767
|
+
* Navigate to the start of the row of months and display the month selection screen.
|
1768
|
+
*
|
1769
|
+
* @param {KeyboardEvent} event the keydown event
|
1770
|
+
*/
|
1771
|
+
const handleHomeFromMonth = adjustMonthSelectionScreen(
|
1772
|
+
(month) => month - (month % 3)
|
1773
|
+
);
|
1774
|
+
|
1775
|
+
/**
|
1776
|
+
* Navigate to the end of the row of months and display the month selection screen.
|
1777
|
+
*
|
1778
|
+
* @param {KeyboardEvent} event the keydown event
|
1779
|
+
*/
|
1780
|
+
const handleEndFromMonth = adjustMonthSelectionScreen(
|
1781
|
+
(month) => month + 2 - (month % 3)
|
1782
|
+
);
|
1783
|
+
|
1784
|
+
/**
|
1785
|
+
* Navigate to the last month (December) and display the month selection screen.
|
1786
|
+
*
|
1787
|
+
* @param {KeyboardEvent} event the keydown event
|
1788
|
+
*/
|
1789
|
+
const handlePageDownFromMonth = adjustMonthSelectionScreen(() => 11);
|
1790
|
+
|
1791
|
+
/**
|
1792
|
+
* Navigate to the first month (January) and display the month selection screen.
|
1793
|
+
*
|
1794
|
+
* @param {KeyboardEvent} event the keydown event
|
1795
|
+
*/
|
1796
|
+
const handlePageUpFromMonth = adjustMonthSelectionScreen(() => 0);
|
1797
|
+
|
1798
|
+
/**
|
1799
|
+
* update the focus on a month when the mouse moves.
|
1800
|
+
*
|
1801
|
+
* @param {MouseEvent} event The mousemove event
|
1802
|
+
* @param {HTMLButtonElement} monthEl A month element within the date picker component
|
1803
|
+
*/
|
1804
|
+
const handleMousemoveFromMonth = (monthEl) => {
|
1805
|
+
if (monthEl.disabled) return;
|
1806
|
+
if (monthEl.classList.contains(CALENDAR_MONTH_FOCUSED_CLASS)) return;
|
1807
|
+
|
1808
|
+
const focusMonth = parseInt(monthEl.dataset.value, 10);
|
1809
|
+
|
1810
|
+
const newCalendar = displayMonthSelection(monthEl, focusMonth);
|
1811
|
+
newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus();
|
1812
|
+
};
|
1813
|
+
|
1814
|
+
// #endregion Calendar Month Event Handling
|
1815
|
+
|
1816
|
+
// #region Calendar Year Event Handling
|
1817
|
+
|
1818
|
+
/**
|
1819
|
+
* Adjust the year and display the year selection screen if needed.
|
1820
|
+
*
|
1821
|
+
* @param {function} adjustYearFn function that returns the adjusted year
|
1822
|
+
*/
|
1823
|
+
const adjustYearSelectionScreen = (adjustYearFn) => {
|
1824
|
+
return (event) => {
|
1825
|
+
const yearEl = event.target;
|
1826
|
+
const selectedYear = parseInt(yearEl.dataset.value, 10);
|
1827
|
+
const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(
|
1828
|
+
yearEl
|
1829
|
+
);
|
1830
|
+
const currentDate = setYear(calendarDate, selectedYear);
|
1831
|
+
|
1832
|
+
let adjustedYear = adjustYearFn(selectedYear);
|
1833
|
+
adjustedYear = Math.max(0, adjustedYear);
|
1834
|
+
|
1835
|
+
const date = setYear(calendarDate, adjustedYear);
|
1836
|
+
const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);
|
1837
|
+
if (!isSameYear(currentDate, cappedDate)) {
|
1838
|
+
const newCalendar = displayYearSelection(
|
1839
|
+
calendarEl,
|
1840
|
+
cappedDate.getFullYear()
|
1841
|
+
);
|
1842
|
+
newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus();
|
1843
|
+
}
|
1844
|
+
event.preventDefault();
|
1845
|
+
};
|
1846
|
+
};
|
1847
|
+
|
1848
|
+
/**
|
1849
|
+
* Navigate back three years and display the year selection screen.
|
1850
|
+
*
|
1851
|
+
* @param {KeyboardEvent} event the keydown event
|
1852
|
+
*/
|
1853
|
+
const handleUpFromYear = adjustYearSelectionScreen((year) => year - 3);
|
1854
|
+
|
1855
|
+
/**
|
1856
|
+
* Navigate forward three years and display the year selection screen.
|
1857
|
+
*
|
1858
|
+
* @param {KeyboardEvent} event the keydown event
|
1859
|
+
*/
|
1860
|
+
const handleDownFromYear = adjustYearSelectionScreen((year) => year + 3);
|
1861
|
+
|
1862
|
+
/**
|
1863
|
+
* Navigate back one year and display the year selection screen.
|
1864
|
+
*
|
1865
|
+
* @param {KeyboardEvent} event the keydown event
|
1866
|
+
*/
|
1867
|
+
const handleLeftFromYear = adjustYearSelectionScreen((year) => year - 1);
|
1868
|
+
|
1869
|
+
/**
|
1870
|
+
* Navigate forward one year and display the year selection screen.
|
1871
|
+
*
|
1872
|
+
* @param {KeyboardEvent} event the keydown event
|
1873
|
+
*/
|
1874
|
+
const handleRightFromYear = adjustYearSelectionScreen((year) => year + 1);
|
1875
|
+
|
1876
|
+
/**
|
1877
|
+
* Navigate to the start of the row of years and display the year selection screen.
|
1878
|
+
*
|
1879
|
+
* @param {KeyboardEvent} event the keydown event
|
1880
|
+
*/
|
1881
|
+
const handleHomeFromYear = adjustYearSelectionScreen(
|
1882
|
+
(year) => year - (year % 3)
|
1883
|
+
);
|
1884
|
+
|
1885
|
+
/**
|
1886
|
+
* Navigate to the end of the row of years and display the year selection screen.
|
1887
|
+
*
|
1888
|
+
* @param {KeyboardEvent} event the keydown event
|
1889
|
+
*/
|
1890
|
+
const handleEndFromYear = adjustYearSelectionScreen(
|
1891
|
+
(year) => year + 2 - (year % 3)
|
1892
|
+
);
|
1893
|
+
|
1894
|
+
/**
|
1895
|
+
* Navigate to back 12 years and display the year selection screen.
|
1896
|
+
*
|
1897
|
+
* @param {KeyboardEvent} event the keydown event
|
1898
|
+
*/
|
1899
|
+
const handlePageUpFromYear = adjustYearSelectionScreen(
|
1900
|
+
(year) => year - YEAR_CHUNK
|
1901
|
+
);
|
1902
|
+
|
1903
|
+
/**
|
1904
|
+
* Navigate forward 12 years and display the year selection screen.
|
1905
|
+
*
|
1906
|
+
* @param {KeyboardEvent} event the keydown event
|
1907
|
+
*/
|
1908
|
+
const handlePageDownFromYear = adjustYearSelectionScreen(
|
1909
|
+
(year) => year + YEAR_CHUNK
|
1910
|
+
);
|
1911
|
+
|
1912
|
+
/**
|
1913
|
+
* update the focus on a year when the mouse moves.
|
1914
|
+
*
|
1915
|
+
* @param {MouseEvent} event The mousemove event
|
1916
|
+
* @param {HTMLButtonElement} dateEl A year element within the date picker component
|
1917
|
+
*/
|
1918
|
+
const handleMousemoveFromYear = (yearEl) => {
|
1919
|
+
if (yearEl.disabled) return;
|
1920
|
+
if (yearEl.classList.contains(CALENDAR_YEAR_FOCUSED_CLASS)) return;
|
1921
|
+
|
1922
|
+
const focusYear = parseInt(yearEl.dataset.value, 10);
|
1923
|
+
|
1924
|
+
const newCalendar = displayYearSelection(yearEl, focusYear);
|
1925
|
+
newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus();
|
1926
|
+
};
|
1927
|
+
|
1928
|
+
// #endregion Calendar Year Event Handling
|
1929
|
+
|
1930
|
+
// #region Focus Handling Event Handling
|
1931
|
+
|
1932
|
+
const tabHandler = (focusable) => {
|
1933
|
+
const getFocusableContext = (el) => {
|
1934
|
+
const { calendarEl } = getDatePickerContext(el);
|
1935
|
+
const focusableElements = select(focusable, calendarEl);
|
1936
|
+
|
1937
|
+
const firstTabIndex = 0;
|
1938
|
+
const lastTabIndex = focusableElements.length - 1;
|
1939
|
+
const firstTabStop = focusableElements[firstTabIndex];
|
1940
|
+
const lastTabStop = focusableElements[lastTabIndex];
|
1941
|
+
const focusIndex = focusableElements.indexOf(activeElement());
|
1942
|
+
|
1943
|
+
const isLastTab = focusIndex === lastTabIndex;
|
1944
|
+
const isFirstTab = focusIndex === firstTabIndex;
|
1945
|
+
const isNotFound = focusIndex === -1;
|
1946
|
+
|
1947
|
+
return {
|
1948
|
+
focusableElements,
|
1949
|
+
isNotFound,
|
1950
|
+
firstTabStop,
|
1951
|
+
isFirstTab,
|
1952
|
+
lastTabStop,
|
1953
|
+
isLastTab,
|
1954
|
+
};
|
1955
|
+
};
|
1956
|
+
|
1957
|
+
return {
|
1958
|
+
tabAhead(event) {
|
1959
|
+
const { firstTabStop, isLastTab, isNotFound } = getFocusableContext(
|
1960
|
+
event.target
|
1961
|
+
);
|
1962
|
+
|
1963
|
+
if (isLastTab || isNotFound) {
|
1964
|
+
event.preventDefault();
|
1965
|
+
firstTabStop.focus();
|
1966
|
+
}
|
1967
|
+
},
|
1968
|
+
tabBack(event) {
|
1969
|
+
const { lastTabStop, isFirstTab, isNotFound } = getFocusableContext(
|
1970
|
+
event.target
|
1971
|
+
);
|
1972
|
+
|
1973
|
+
if (isFirstTab || isNotFound) {
|
1974
|
+
event.preventDefault();
|
1975
|
+
lastTabStop.focus();
|
1976
|
+
}
|
1977
|
+
},
|
1978
|
+
};
|
1979
|
+
};
|
1980
|
+
|
1981
|
+
const datePickerTabEventHandler = tabHandler(DATE_PICKER_FOCUSABLE);
|
1982
|
+
const monthPickerTabEventHandler = tabHandler(MONTH_PICKER_FOCUSABLE);
|
1983
|
+
const yearPickerTabEventHandler = tabHandler(YEAR_PICKER_FOCUSABLE);
|
1984
|
+
|
1985
|
+
// #endregion Focus Handling Event Handling
|
1986
|
+
|
1987
|
+
// #region Date Picker Event Delegation Registration / Component
|
1988
|
+
|
1989
|
+
const datePickerEvents = {
|
1990
|
+
[CLICK]: {
|
1991
|
+
[DATE_PICKER_BUTTON]() {
|
1992
|
+
toggleCalendar(this);
|
1993
|
+
},
|
1994
|
+
[CALENDAR_DATE]() {
|
1995
|
+
selectDate(this);
|
1996
|
+
},
|
1997
|
+
[CALENDAR_MONTH]() {
|
1998
|
+
selectMonth(this);
|
1999
|
+
},
|
2000
|
+
[CALENDAR_YEAR]() {
|
2001
|
+
selectYear(this);
|
2002
|
+
},
|
2003
|
+
[CALENDAR_PREVIOUS_MONTH]() {
|
2004
|
+
displayPreviousMonth(this);
|
2005
|
+
},
|
2006
|
+
[CALENDAR_NEXT_MONTH]() {
|
2007
|
+
displayNextMonth(this);
|
2008
|
+
},
|
2009
|
+
[CALENDAR_PREVIOUS_YEAR]() {
|
2010
|
+
displayPreviousYear(this);
|
2011
|
+
},
|
2012
|
+
[CALENDAR_NEXT_YEAR]() {
|
2013
|
+
displayNextYear(this);
|
2014
|
+
},
|
2015
|
+
[CALENDAR_PREVIOUS_YEAR_CHUNK]() {
|
2016
|
+
displayPreviousYearChunk(this);
|
2017
|
+
},
|
2018
|
+
[CALENDAR_NEXT_YEAR_CHUNK]() {
|
2019
|
+
displayNextYearChunk(this);
|
2020
|
+
},
|
2021
|
+
[CALENDAR_MONTH_SELECTION]() {
|
2022
|
+
const newCalendar = displayMonthSelection(this);
|
2023
|
+
newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus();
|
2024
|
+
},
|
2025
|
+
[CALENDAR_YEAR_SELECTION]() {
|
2026
|
+
const newCalendar = displayYearSelection(this);
|
2027
|
+
newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus();
|
2028
|
+
},
|
2029
|
+
},
|
2030
|
+
keyup: {
|
2031
|
+
[DATE_PICKER_CALENDAR](event) {
|
2032
|
+
const keydown = this.dataset.keydownKeyCode;
|
2033
|
+
if (`${event.keyCode}` !== keydown) {
|
2034
|
+
event.preventDefault();
|
2035
|
+
}
|
2036
|
+
},
|
2037
|
+
},
|
2038
|
+
keydown: {
|
2039
|
+
[DATE_PICKER_EXTERNAL_INPUT](event) {
|
2040
|
+
if (event.keyCode === ENTER_KEYCODE) {
|
2041
|
+
validateDateInput(this);
|
2042
|
+
}
|
2043
|
+
},
|
2044
|
+
[CALENDAR_DATE]: keymap({
|
2045
|
+
Up: handleUpFromDate,
|
2046
|
+
ArrowUp: handleUpFromDate,
|
2047
|
+
Down: handleDownFromDate,
|
2048
|
+
ArrowDown: handleDownFromDate,
|
2049
|
+
Left: handleLeftFromDate,
|
2050
|
+
ArrowLeft: handleLeftFromDate,
|
2051
|
+
Right: handleRightFromDate,
|
2052
|
+
ArrowRight: handleRightFromDate,
|
2053
|
+
Home: handleHomeFromDate,
|
2054
|
+
End: handleEndFromDate,
|
2055
|
+
PageDown: handlePageDownFromDate,
|
2056
|
+
PageUp: handlePageUpFromDate,
|
2057
|
+
"Shift+PageDown": handleShiftPageDownFromDate,
|
2058
|
+
"Shift+PageUp": handleShiftPageUpFromDate,
|
2059
|
+
}),
|
2060
|
+
[CALENDAR_DATE_PICKER]: keymap({
|
2061
|
+
Tab: datePickerTabEventHandler.tabAhead,
|
2062
|
+
"Shift+Tab": datePickerTabEventHandler.tabBack,
|
2063
|
+
}),
|
2064
|
+
[CALENDAR_MONTH]: keymap({
|
2065
|
+
Up: handleUpFromMonth,
|
2066
|
+
ArrowUp: handleUpFromMonth,
|
2067
|
+
Down: handleDownFromMonth,
|
2068
|
+
ArrowDown: handleDownFromMonth,
|
2069
|
+
Left: handleLeftFromMonth,
|
2070
|
+
ArrowLeft: handleLeftFromMonth,
|
2071
|
+
Right: handleRightFromMonth,
|
2072
|
+
ArrowRight: handleRightFromMonth,
|
2073
|
+
Home: handleHomeFromMonth,
|
2074
|
+
End: handleEndFromMonth,
|
2075
|
+
PageDown: handlePageDownFromMonth,
|
2076
|
+
PageUp: handlePageUpFromMonth,
|
2077
|
+
}),
|
2078
|
+
[CALENDAR_MONTH_PICKER]: keymap({
|
2079
|
+
Tab: monthPickerTabEventHandler.tabAhead,
|
2080
|
+
"Shift+Tab": monthPickerTabEventHandler.tabBack,
|
2081
|
+
}),
|
2082
|
+
[CALENDAR_YEAR]: keymap({
|
2083
|
+
Up: handleUpFromYear,
|
2084
|
+
ArrowUp: handleUpFromYear,
|
2085
|
+
Down: handleDownFromYear,
|
2086
|
+
ArrowDown: handleDownFromYear,
|
2087
|
+
Left: handleLeftFromYear,
|
2088
|
+
ArrowLeft: handleLeftFromYear,
|
2089
|
+
Right: handleRightFromYear,
|
2090
|
+
ArrowRight: handleRightFromYear,
|
2091
|
+
Home: handleHomeFromYear,
|
2092
|
+
End: handleEndFromYear,
|
2093
|
+
PageDown: handlePageDownFromYear,
|
2094
|
+
PageUp: handlePageUpFromYear,
|
2095
|
+
}),
|
2096
|
+
[CALENDAR_YEAR_PICKER]: keymap({
|
2097
|
+
Tab: yearPickerTabEventHandler.tabAhead,
|
2098
|
+
"Shift+Tab": yearPickerTabEventHandler.tabBack,
|
2099
|
+
}),
|
2100
|
+
[DATE_PICKER_CALENDAR](event) {
|
2101
|
+
this.dataset.keydownKeyCode = event.keyCode;
|
2102
|
+
},
|
2103
|
+
[DATE_PICKER](event) {
|
2104
|
+
const keyMap = keymap({
|
2105
|
+
Escape: handleEscapeFromCalendar,
|
2106
|
+
});
|
2107
|
+
|
2108
|
+
keyMap(event);
|
2109
|
+
},
|
2110
|
+
},
|
2111
|
+
focusout: {
|
2112
|
+
[DATE_PICKER_EXTERNAL_INPUT]() {
|
2113
|
+
validateDateInput(this);
|
2114
|
+
},
|
2115
|
+
[DATE_PICKER](event) {
|
2116
|
+
if (!this.contains(event.relatedTarget)) {
|
2117
|
+
hideCalendar(this);
|
2118
|
+
}
|
2119
|
+
},
|
2120
|
+
},
|
2121
|
+
input: {
|
2122
|
+
[DATE_PICKER_EXTERNAL_INPUT]() {
|
2123
|
+
reconcileInputValues(this);
|
2124
|
+
updateCalendarIfVisible(this);
|
2125
|
+
},
|
2126
|
+
},
|
2127
|
+
};
|
2128
|
+
|
2129
|
+
if (!isIosDevice()) {
|
2130
|
+
datePickerEvents.mousemove = {
|
2131
|
+
[CALENDAR_DATE_CURRENT_MONTH]() {
|
2132
|
+
handleMousemoveFromDate(this);
|
2133
|
+
},
|
2134
|
+
[CALENDAR_MONTH]() {
|
2135
|
+
handleMousemoveFromMonth(this);
|
2136
|
+
},
|
2137
|
+
[CALENDAR_YEAR]() {
|
2138
|
+
handleMousemoveFromYear(this);
|
2139
|
+
},
|
2140
|
+
};
|
2141
|
+
}
|
2142
|
+
|
2143
|
+
const datePicker = behavior(datePickerEvents, {
|
2144
|
+
init(root) {
|
2145
|
+
select(DATE_PICKER, root).forEach((datePickerEl) => {
|
2146
|
+
if(!datePickerEl.classList.contains(DATE_PICKER_INITIALIZED_CLASS)){
|
2147
|
+
enhanceDatePicker(datePickerEl);
|
2148
|
+
}
|
2149
|
+
});
|
2150
|
+
},
|
2151
|
+
getDatePickerContext,
|
2152
|
+
disable,
|
2153
|
+
enable,
|
2154
|
+
isDateInputInvalid,
|
2155
|
+
setCalendarValue,
|
2156
|
+
validateDateInput,
|
2157
|
+
renderCalendar,
|
2158
|
+
updateCalendarIfVisible,
|
2159
|
+
});
|
2160
|
+
|
2161
|
+
// #endregion Date Picker Event Delegation Registration / Component
|
2162
|
+
|
2163
|
+
module.exports = datePicker;
|