@fremtind/jokul 0.45.2 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/build/build-stats.html +1 -1
  2. package/build/cjs/components/card/stories/Card.stories.cjs +2 -0
  3. package/build/cjs/components/card/stories/Card.stories.cjs.map +1 -0
  4. package/build/cjs/components/card/stories/Card.stories.d.cts +24 -0
  5. package/build/cjs/components/cookie-consent/CookieConsent.cjs +1 -1
  6. package/build/cjs/components/cookie-consent/CookieConsent.cjs.map +1 -1
  7. package/build/cjs/components/cookie-consent/CookieConsentContext.cjs +1 -1
  8. package/build/cjs/components/cookie-consent/CookieConsentContext.cjs.map +1 -1
  9. package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs +1 -1
  10. package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs.map +1 -1
  11. package/build/cjs/components/cookie-consent/cookieConsentUtils.d.cts +2 -1
  12. package/build/cjs/components/cookie-consent/types.d.cts +2 -0
  13. package/build/es/components/card/stories/Card.stories.d.ts +24 -0
  14. package/build/es/components/card/stories/Card.stories.js +2 -0
  15. package/build/es/components/card/stories/Card.stories.js.map +1 -0
  16. package/build/es/components/cookie-consent/CookieConsent.js +1 -1
  17. package/build/es/components/cookie-consent/CookieConsent.js.map +1 -1
  18. package/build/es/components/cookie-consent/CookieConsentContext.js +1 -1
  19. package/build/es/components/cookie-consent/CookieConsentContext.js.map +1 -1
  20. package/build/es/components/cookie-consent/cookieConsentUtils.d.ts +2 -1
  21. package/build/es/components/cookie-consent/cookieConsentUtils.js +1 -1
  22. package/build/es/components/cookie-consent/cookieConsentUtils.js.map +1 -1
  23. package/build/es/components/cookie-consent/types.d.ts +2 -0
  24. package/build/style.css +1 -0
  25. package/package.json +2 -2
  26. package/styles/components/button/button.css +2 -2
  27. package/styles/components/button/button.min.css +1 -1
  28. package/styles/components/checkbox/checkbox.css +4 -4
  29. package/styles/components/checkbox/checkbox.min.css +1 -1
  30. package/styles/components/checkbox-panel/checkbox-panel.css +2 -2
  31. package/styles/components/checkbox-panel/checkbox-panel.min.css +1 -1
  32. package/styles/components/countdown/countdown.css +2 -2
  33. package/styles/components/countdown/countdown.min.css +1 -1
  34. package/styles/components/feedback/feedback.css +2 -2
  35. package/styles/components/feedback/feedback.min.css +1 -1
  36. package/styles/components/input-group/input-group.css +2 -2
  37. package/styles/components/input-group/input-group.min.css +1 -1
  38. package/styles/components/loader/loader.css +6 -6
  39. package/styles/components/loader/loader.min.css +1 -1
  40. package/styles/components/loader/skeleton-loader.css +5 -5
  41. package/styles/components/loader/skeleton-loader.min.css +1 -1
  42. package/styles/components/message/message.css +2 -2
  43. package/styles/components/message/message.min.css +1 -1
  44. package/styles/components/progress-bar/progress-bar.css +1 -1
  45. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  46. package/styles/components/radio-button/radio-button.css +2 -2
  47. package/styles/components/radio-button/radio-button.min.css +1 -1
  48. package/styles/components/radio-panel/radio-panel.css +2 -2
  49. package/styles/components/radio-panel/radio-panel.min.css +1 -1
  50. package/styles/components/system-message/system-message.css +2 -2
  51. package/styles/components/system-message/system-message.min.css +1 -1
  52. package/styles/components/toast/toast.css +4 -4
  53. package/styles/components/toast/toast.min.css +1 -1
  54. package/styles/styles.css +38 -38
  55. package/styles/styles.min.css +1 -1
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),r=require("../../../utilities/formatters/valuta/formatValuta.cjs"),a=require("../../flex/Flex.cjs"),s=require("../../tag/Tag.cjs"),t=require("../Card.cjs"),i={title:"Komponenter/Card",component:t.Card,parameters:{layout:"centered"},tags:["autodocs"],argTypes:{variant:{control:"select",options:t.CARD_VARIANTS},padding:{control:"select",options:t.CARD_PADDINGS}}},l={args:{padding:"m",variant:"outlined",children:"Hei, verden!"},render:r=>e.jsx(t.Card,{...r})},n={args:{padding:"m",clickable:!0,variant:"outlined",children:""},render:({asChild:i,as:l,...n})=>e.jsx(t.Card,{asChild:!0,...n,children:e.jsxs(a.Flex,{as:"a",href:"#test",colGap:40,children:[e.jsxs(a.Flex,{direction:"column",gap:4,children:[e.jsxs("p",{className:"jkl-heading-2",children:[r.formatValuta(18856),e.jsx("span",{"aria-hidden":!0,children:" →"})]}),e.jsx("p",{className:"jkl-body",children:"Frist 20.03.2023"})]}),e.jsxs(a.Flex,{direction:"column",gap:12,children:[e.jsx(s.ErrorTag,{children:"Ubetalt"}),e.jsx("p",{className:"jkl-body",children:"Purring"})]})]})})};exports.Fakturainformasjon=n,exports.Test=l,exports.default=i;
2
+ //# sourceMappingURL=Card.stories.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.stories.cjs","sources":["../../../../../src/components/card/stories/Card.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React from \"react\";\nimport { formatValuta } from \"../../../utilities/formatters/valuta/formatValuta.js\";\nimport { Flex } from \"../../flex/Flex.js\";\nimport { ErrorTag } from \"../../tag/Tag.js\";\nimport { Card, CARD_PADDINGS, CARD_VARIANTS } from \"../Card.js\";\nimport \"../styles/_index.scss\";\n\nconst meta = {\n title: \"Komponenter/Card\",\n component: Card,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n argTypes: {\n variant: { control: \"select\", options: CARD_VARIANTS },\n padding: { control: \"select\", options: CARD_PADDINGS },\n },\n} satisfies Meta<typeof Card>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Test: Story = {\n args: {\n padding: \"m\",\n variant: \"outlined\",\n children: \"Hei, verden!\",\n },\n render: (args) => <Card {...args}></Card>,\n};\nexport const Fakturainformasjon: Story = {\n args: {\n padding: \"m\",\n clickable: true,\n variant: \"outlined\",\n children: \"\",\n },\n render: ({ asChild, as, ...props }) => (\n <Card asChild {...props}>\n <Flex as=\"a\" href=\"#test\" colGap={40}>\n <Flex direction=\"column\" gap={4}>\n <p className=\"jkl-heading-2\">\n {formatValuta(18856)}\n <span aria-hidden> →</span>\n </p>\n <p className=\"jkl-body\">Frist 20.03.2023</p>\n </Flex>\n <Flex direction=\"column\" gap={12}>\n <ErrorTag>Ubetalt</ErrorTag>\n <p className=\"jkl-body\">Purring</p>\n </Flex>\n </Flex>\n </Card>\n ),\n};\n"],"names":["meta","title","component","Card","parameters","layout","tags","argTypes","variant","control","options","CARD_VARIANTS","padding","CARD_PADDINGS","Test","args","children","render","jsx","Fakturainformasjon","clickable","asChild","as","props","jsxs","Flex","href","colGap","direction","gap","className","formatValuta","ErrorTag"],"mappings":"6SAQMA,EAAO,CACTC,MAAO,mBACPC,UAAWC,EAAAA,KACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,QAAS,CAAEC,QAAS,SAAUC,QAASC,EAAAA,eACvCC,QAAS,CAAEH,QAAS,SAAUC,QAASG,EAAAA,iBAOlCC,EAAc,CACvBC,KAAM,CACFH,QAAS,IACTJ,QAAS,WACTQ,SAAU,gBAEdC,OAASF,GAAUG,EAAAA,IAAAf,EAAAA,KAAA,IAASY,KAEnBI,EAA4B,CACrCJ,KAAM,CACFH,QAAS,IACTQ,WAAW,EACXZ,QAAS,WACTQ,SAAU,IAEdC,OAAQ,EAAGI,QAAAA,EAASC,GAAAA,KAAOC,KACtBL,EAAAA,IAAAf,EAAAA,KAAA,CAAKkB,SAAO,KAAKE,EACdP,SAACQ,EAAAA,KAAAC,OAAA,CAAKH,GAAG,IAAII,KAAK,QAAQC,OAAQ,GAC9BX,SAAA,CAAAQ,EAAAA,KAACC,EAAKA,KAAA,CAAAG,UAAU,SAASC,IAAK,EAC1Bb,SAAA,CAACQ,EAAAA,KAAA,IAAA,CAAEM,UAAU,gBACRd,SAAA,CAAAe,EAAAA,aAAa,OACbb,EAAAA,IAAA,OAAA,CAAK,eAAW,EAACF,SAAE,UAEvBE,EAAAA,IAAA,IAAA,CAAEY,UAAU,WAAWd,SAAgB,wBAE3CQ,EAAAA,KAAAC,EAAAA,KAAA,CAAKG,UAAU,SAASC,IAAK,GAC1Bb,SAAA,CAAAE,EAAAA,IAACc,YAAShB,SAAO,YAChBE,EAAAA,IAAA,IAAA,CAAEY,UAAU,WAAWd,SAAO"}
@@ -0,0 +1,24 @@
1
+ import { StoryObj } from '@storybook/react';
2
+ import { default as React } from 'react';
3
+ declare const meta: {
4
+ title: string;
5
+ component: <ElementType extends React.ElementType = "div">(props: import('../Card.js').CardProps<ElementType> & import('../../../index.js').AsChildProps) => React.ReactElement | null;
6
+ parameters: {
7
+ layout: string;
8
+ };
9
+ tags: string[];
10
+ argTypes: {
11
+ variant: {
12
+ control: "select";
13
+ options: readonly ["outlined", "high", "low"];
14
+ };
15
+ padding: {
16
+ control: "select";
17
+ options: readonly ["s", "m", "l", "xl"];
18
+ };
19
+ };
20
+ };
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+ export declare const Test: Story;
24
+ export declare const Fakturainformasjon: Story;
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom"),o=require("../button/Button.cjs"),i=require("../modal/Modal.cjs"),s=require("../modal/useModal.cjs"),r=require("./CookieConsentContext.cjs"),a=require("./cookieConsentUtils.cjs"),l=require("./RequirementCheckbox.cjs");exports.CookieConsent=({blocking:c,onAccept:d,...u})=>{const{currentConsent:k,cookieName:m,cookieDomain:g,requirement:j,isOpen:f,setIsOpen:p,updateCurrentConsents:b}=r.useInternalState(),[h,C]=s.useModal({id:`jkl-cookie-modal-${t.useId()}`,role:c?"alertdialog":"dialog",title:"Informasjonskapsler"});if(t.useEffect((()=>{f?null==h||h.show():null==h||h.hide()}),[h,f]),t.useEffect((()=>{const e=()=>p(!1);return null==h||h.on("hide",e),()=>{null==h||h.off("hide",e)}}),[h,p]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return d&&d({functional:"denied",marketing:"denied",statistics:"denied"}),null;const x=(e=a.convertBooleanConsentObjectToConsentObject({functional:!0,statistics:!0,marketing:!0},j))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...k,...t};a.setConsentCookie({consent:n,name:m,domain:g}),b(),null==d||d(n),null==h||h.hide()};return n.createPortal(e.jsxs(i.ModalContainer,{...C.container,...u,"data-cookie-consent-open":f,children:[e.jsx(i.ModalOverlay,{...C.overlay}),e.jsxs(i.Modal,{component:"form",...C.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=a.convertBooleanConsentObjectToConsentObject({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},j);x(n)},children:[e.jsx(i.ModalHeader,{children:e.jsx(i.ModalTitle,{...C.title,children:"Velg informasjonskapsler"})}),e.jsxs(i.ModalBody,{children:[e.jsx("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),j.functional&&e.jsx(l.RequirementCheckbox,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===k.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${k.functional}`),j.statistics&&e.jsx(l.RequirementCheckbox,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===k.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${k.statistics}`),j.marketing&&e.jsx(l.RequirementCheckbox,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===k.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${k.marketing}`)]}),e.jsxs(i.ModalActions,{children:[e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>x(),children:"Godta alle"}),e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom"),o=require("../button/Button.cjs"),i=require("../modal/Modal.cjs"),s=require("../modal/useModal.cjs"),r=require("./CookieConsentContext.cjs"),a=require("./cookieConsentUtils.cjs"),l=require("./RequirementCheckbox.cjs");exports.CookieConsent=({blocking:c,onAccept:d,...u})=>{const{currentConsent:k,cookieName:m,cookieDomain:g,cookiePath:j,requirement:f,isOpen:p,setIsOpen:h,updateCurrentConsents:b}=r.useInternalState(),[C,x]=s.useModal({id:`jkl-cookie-modal-${t.useId()}`,role:c?"alertdialog":"dialog",title:"Informasjonskapsler"});if(t.useEffect((()=>{p?null==C||C.show():null==C||C.hide()}),[C,p]),t.useEffect((()=>{const e=()=>h(!1);return null==C||C.on("hide",e),()=>{null==C||C.off("hide",e)}}),[C,h]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return d&&d({functional:"denied",marketing:"denied",statistics:"denied"}),null;const v=(e=a.convertBooleanConsentObjectToConsentObject({functional:!0,statistics:!0,marketing:!0},f))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...k,...t};a.setConsentCookie({consent:n,name:m,domain:g,path:j}),b(),null==d||d(n),null==C||C.hide()};return n.createPortal(e.jsxs(i.ModalContainer,{...x.container,...u,"data-cookie-consent-open":p,children:[e.jsx(i.ModalOverlay,{...x.overlay}),e.jsxs(i.Modal,{component:"form",...x.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=a.convertBooleanConsentObjectToConsentObject({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},f);v(n)},children:[e.jsx(i.ModalHeader,{children:e.jsx(i.ModalTitle,{...x.title,children:"Velg informasjonskapsler"})}),e.jsxs(i.ModalBody,{children:[e.jsx("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),f.functional&&e.jsx(l.RequirementCheckbox,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===k.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${k.functional}`),f.statistics&&e.jsx(l.RequirementCheckbox,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===k.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${k.statistics}`),f.marketing&&e.jsx(l.RequirementCheckbox,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===k.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${k.marketing}`)]}),e.jsxs(i.ModalActions,{children:[e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>v(),children:"Godta alle"}),e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};
2
2
  //# sourceMappingURL=CookieConsent.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.cjs","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"+YA0B6B,EACzBA,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,EAAiBA,oBAEdC,EAAUC,GAAeC,WAAS,CACrCC,GAAI,oBAAoBC,EAAAA,UAIxBC,KAAMhB,EAAW,cAAgB,SAGjCiB,MAAO,wBAmBP,GAhBJC,EAAAA,WAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MACd,GACD,CAACT,EAAUJ,IAEdW,EAAAA,WAAU,KACA,MAAAG,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAAAA,CAAM,GAEjC,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAIzB,GACSA,EAAA,CACL0B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGL,MAAAC,EAAS,CACXC,EAAYC,EAAAA,2CACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,GAAIC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBpC,KACA8B,GAGUO,mBAAA,CACbC,QAASF,EACTG,KAAMtC,EACNuC,OAAQtC,IAGUI,IAEtB,MAAAR,GAAAA,EAAWsC,GAEX,MAAA5B,GAAAA,EAAUS,MAAK,EAoBnB,OAAOwB,EAASC,aACZC,EAAAA,KAACC,EAAAA,eAAA,IACOnC,EAAYoC,aACZ9C,EACJ,2BAA0BK,EAE1B0C,SAAA,CAACC,EAAAA,IAAAC,EAAAA,aAAA,IAAiBvC,EAAYwC,UAC9BN,EAAAA,KAACO,EAAMA,MAAA,CAAAC,UAAU,UAAW1C,EAAY2C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc9B,EAAAA,2CAChB,CACIL,WAA2C,SAA/BgC,EAASI,IAAI,cACzBlC,WAA2C,SAA/B8B,EAASI,IAAI,cACzBnC,UAAyC,SAA9B+B,EAASI,IAAI,cAE5BzD,GAGJwB,EAAOgC,EAAW,EAWVb,SAAA,CAAAC,EAAAA,IAACc,eACGf,SAACC,EAAAA,IAAAe,EAAAA,WAAA,IAAerD,EAAYK,MAAOgC,+CAItCiB,EAAAA,UACG,CAAAjB,SAAA,CAAAC,EAAAA,IAAC,KAAED,SAGH,gHACC3C,EAAYqB,YACTuB,EAAAA,IAACiB,EAAAA,oBAAA,CACGzB,KAAK,aACL0B,MAAM,sBACNC,eACkC,aAA9BlE,EAAewB,WAGtBsB,SAAA,wKADQ,cAAc9C,EAAewB,cAQzCrB,EAAYuB,YACTqB,EAAAA,IAACiB,EAAAA,oBAAA,CACGzB,KAAK,aACL0B,MAAM,oBACNC,eACkC,aAA9BlE,EAAe0B,WAGtBoB,SAAA,yJADQ,cAAc9C,EAAe0B,cAOzCvB,EAAYsB,WACTsB,EAAAA,IAACiB,EAAAA,oBAAA,CACGzB,KAAK,YACL0B,MAAM,iCACNC,eACiC,aAA7BlE,EAAeyB,UAGtBqB,SAAA,uKADQ,aAAa9C,EAAeyB,uBAS5C0C,EAAAA,aACG,CAAArB,SAAA,CAAAC,EAAAA,IAACqB,EAAAA,gBAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM3C,IAClBmB,SAAA,eAGDC,EAAAA,IAACqB,EAAAA,gBAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMbzB,SAASkD,KAAA"}
1
+ {"version":3,"file":"CookieConsent.cjs","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n cookiePath,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n path: cookiePath,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","cookiePath","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","path","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"+YA0B6B,EACzBA,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,WAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,EAAiBA,oBAEdC,EAAUC,GAAeC,WAAS,CACrCC,GAAI,oBAAoBC,EAAAA,UAIxBC,KAAMjB,EAAW,cAAgB,SAGjCkB,MAAO,wBAmBP,GAhBJC,EAAAA,WAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,EAAAA,WAAU,KACA,MAAAG,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAAM,CAAA,GAEjC,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAI1B,GACSA,EAAA,CACL2B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGL,MAAAC,EAAS,CACXC,EAAYC,EAAAA,2CACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,GAAIC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBrC,KACA+B,GAGUO,mBAAA,CACbC,QAASF,EACTG,KAAMvC,EACNwC,OAAQvC,EACRwC,KAAMvC,IAGYI,IAEtB,MAAAT,GAAAA,EAAWuC,GAEX,MAAA5B,GAAAA,EAAUS,QAoBd,OAAOyB,EAASC,aACZC,EAAAA,KAACC,EAAAA,eAAA,IACOpC,EAAYqC,aACZhD,EACJ,2BAA0BM,EAE1B2C,SAAA,CAACC,EAAAA,IAAAC,EAAAA,aAAA,IAAiBxC,EAAYyC,UAC9BN,EAAAA,KAACO,EAAMA,MAAA,CAAAC,UAAU,UAAW3C,EAAY4C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc/B,EAAAA,2CAChB,CACIL,WAA2C,SAA/BiC,EAASI,IAAI,cACzBnC,WAA2C,SAA/B+B,EAASI,IAAI,cACzBpC,UAAyC,SAA9BgC,EAASI,IAAI,cAE5B1D,GAGJwB,EAAOiC,EAAW,EAWVb,SAAA,CAAAC,EAAAA,IAACc,eACGf,SAACC,EAAAA,IAAAe,EAAAA,WAAA,IAAetD,EAAYK,MAAOiC,+CAItCiB,EAAAA,UACG,CAAAjB,SAAA,CAAAC,EAAAA,IAAC,KAAED,SAGH,gHACC5C,EAAYqB,YACTwB,EAAAA,IAACiB,EAAAA,oBAAA,CACG1B,KAAK,aACL2B,MAAM,sBACNC,eACkC,aAA9BpE,EAAeyB,WAGtBuB,SAAA,wKADQ,cAAchD,EAAeyB,cAQzCrB,EAAYuB,YACTsB,EAAAA,IAACiB,EAAAA,oBAAA,CACG1B,KAAK,aACL2B,MAAM,oBACNC,eACkC,aAA9BpE,EAAe2B,WAGtBqB,SAAA,yJADQ,cAAchD,EAAe2B,cAOzCvB,EAAYsB,WACTuB,EAAAA,IAACiB,EAAAA,oBAAA,CACG1B,KAAK,YACL2B,MAAM,iCACNC,eACiC,aAA7BpE,EAAe0B,UAGtBsB,SAAA,uKADQ,aAAahD,EAAe0B,uBAS5C2C,EAAAA,aACG,CAAArB,SAAA,CAAAC,EAAAA,IAACqB,EAAAA,gBAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM5C,IAClBoB,SAAA,eAGDC,EAAAA,IAACqB,EAAAA,gBAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMb1B,SAASmD,KAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),o=require("./cookieConsentUtils.cjs"),n="fremtind-cookie-consent",s=t.createContext(void 0);exports.CookieConsentProvider=({children:r,cookieAdapter:i,marketing:u,functional:a,statistics:c,cookieName:C=n,cookieDomain:l})=>{const[d,k]=t.useState((()=>Date.now())),m=t.useMemo((()=>o.buildRequirementsObject({marketing:u,functional:a,statistics:c})),[u,a,c]),p=t.useMemo((()=>o.getConsentCookie({adapter:i,name:C})??{marketing:null,functional:null,statistics:null}),[i,C,d]),[x,v]=t.useState((()=>o.shouldShowConsentDialog(m,p)));return e.jsx(s.Provider,{value:{isOpen:x,setIsOpen:v,updateCurrentConsents:()=>k(Date.now()),requirement:m,currentConsent:p,cookieName:C,cookieDomain:l},children:r})},exports.DEFAULT_COOKIE_NAME=n,exports.useCookieConsent=()=>{const e=t.useContext(s);if(void 0===e)throw new Error("useCookieConsent must be used within a CookieConsentProvider");return{openConsentModal:()=>{e.setIsOpen(!0)},consents:e.currentConsent}},exports.useInternalState=()=>{const e=t.useContext(s);if(void 0===e)throw new Error("CookieConsent must be used within a CookieConsentProvider");return e};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),o=require("./cookieConsentUtils.cjs"),n="fremtind-cookie-consent",s=t.createContext(void 0);exports.CookieConsentProvider=({children:i,cookieAdapter:r,marketing:u,functional:a,statistics:c,cookieName:C=n,cookieDomain:l,cookiePath:d})=>{const[k,m]=t.useState((()=>Date.now())),p=t.useMemo((()=>o.buildRequirementsObject({marketing:u,functional:a,statistics:c})),[u,a,c]),h=t.useMemo((()=>o.getConsentCookie({adapter:r,name:C})??{marketing:null,functional:null,statistics:null}),[r,C,k]),[x,v]=t.useState((()=>o.shouldShowConsentDialog(p,h)));return e.jsx(s.Provider,{value:{isOpen:x,setIsOpen:v,updateCurrentConsents:()=>m(Date.now()),requirement:p,currentConsent:h,cookieName:C,cookieDomain:l,cookiePath:d},children:i})},exports.DEFAULT_COOKIE_NAME=n,exports.useCookieConsent=()=>{const e=t.useContext(s);if(void 0===e)throw new Error("useCookieConsent must be used within a CookieConsentProvider");return{openConsentModal:()=>{e.setIsOpen(!0)},consents:e.currentConsent}},exports.useInternalState=()=>{const e=t.useContext(s);if(void 0===e)throw new Error("CookieConsent must be used within a CookieConsentProvider");return e};
2
2
  //# sourceMappingURL=CookieConsentContext.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsentContext.cjs","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n /* Use timestamp as a dependency to be ablet to force re-reading of cookie */\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","context","useContext","Error","openConsentModal","consents"],"mappings":"8KAYaA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,iCAEU,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaT,EACbU,aAAAA,MAEM,MAACC,EAAWC,GAAgBC,YAAS,IAAMC,KAAKC,QAEhDC,EAAcC,EAAAA,SAChB,IAAMC,EAAwBA,wBAAA,CAAEZ,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAGtBW,EAAgBF,EAAAA,SAAQ,IAEtBG,EAAAA,iBAAiB,CAAEC,QAAShB,EAAeiB,KAAMb,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAKrB,CAACH,EAAeI,EAAYE,KAExBY,EAAQC,GAAaX,YAAS,IAC1BY,EAAAA,wBAAwBT,EAAaG,KAI5C,OAAAO,EAAAA,IAACzB,EAAQ0B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBV,WAAAA,EACAC,aAAAA,GAGHN,SAAAA,GAAA,yDAqBmB,KACtB,MAAA2B,EAAUC,aAAW/B,GAE3B,QAAgB,IAAZ8B,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEC,iBANgB,KACrBH,EAAQP,WAAU,EAAI,EAKCW,SAFVJ,EAAQD,0CA7BG,KACtB,MAAAC,EAAU7B,EAAM8B,WAAW/B,GACjC,QAAgB,IAAZ8B,EACA,MAAM,IAAIE,MACN,6DAID,OAAAF"}
1
+ {"version":3,"file":"CookieConsentContext.cjs","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n cookiePath,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n /* Use timestamp as a dependency to be ablet to force re-reading of cookie */\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n cookiePath,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","cookiePath","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","context","useContext","Error","openConsentModal","consents"],"mappings":"8KAYaA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,iCAEU,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaT,EACbU,aAAAA,EACAC,WAAAA,MAEM,MAACC,EAAWC,GAAgBC,YAAS,IAAMC,KAAKC,QAEhDC,EAAcC,EAAAA,SAChB,IAAMC,EAAwBA,wBAAA,CAAEb,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAGtBY,EAAgBF,EAAAA,SAAQ,IAEtBG,EAAAA,iBAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAKrB,CAACH,EAAeI,EAAYG,KAExBY,EAAQC,GAAaX,YAAS,IAC1BY,EAAAA,wBAAwBT,EAAaG,KAI5C,OAAAO,EAAAA,IAAC1B,EAAQ2B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBX,WAAAA,EACAC,aAAAA,EACAC,WAAAA,GAGHP,SAAAA,GAAA,yDAqBmB,KACtB,MAAA4B,EAAUC,aAAWhC,GAE3B,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEC,iBANgB,KACrBH,EAAQP,WAAU,EAAI,EAKCW,SAFVJ,EAAQD,0CA7BG,KACtB,MAAAC,EAAU9B,EAAM+B,WAAWhC,GACjC,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,6DAID,OAAAF"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted";exports.buildRequirementsObject=({marketing:t,functional:e,statistics:o})=>({...t&&{marketing:t},...e&&{functional:e},...o&&{statistics:o}}),exports.convertBooleanConsentObjectToConsentObject=(e,o)=>({functional:o.functional?t(e.functional):void 0,statistics:o.statistics?t(e.statistics):void 0,marketing:o.marketing?t(e.marketing):void 0}),exports.convertBooleanToConsentValue=t,exports.getConsentCookie=({adapter:t,name:e})=>{const o=(t=>{if(typeof document>"u")return;const e=document.cookie.split(";").map((t=>t.trim().split("="))).find((e=>e[0]===t));return e||void 0})(e);return o?JSON.parse(o[1]):t?t():void 0},exports.setConsentCookie=({consent:t,maxAge:e=10368e3,name:o,domain:n})=>{document.cookie=[`${o}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!n&&`domain=${n}`].filter((t=>t)).join(";")},exports.shouldShowConsentDialog=(t,e)=>{if(e){const o=new Map(Object.entries(e)),n=Object.entries(t);for(const[t,e]of n)if(e&&null===o.get(t))return!0;return!1}return Object.values(t).some((t=>t))};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted";exports.buildRequirementsObject=({marketing:t,functional:e,statistics:o})=>({...t&&{marketing:t},...e&&{functional:e},...o&&{statistics:o}}),exports.convertBooleanConsentObjectToConsentObject=(e,o)=>({functional:o.functional?t(e.functional):void 0,statistics:o.statistics?t(e.statistics):void 0,marketing:o.marketing?t(e.marketing):void 0}),exports.convertBooleanToConsentValue=t,exports.getConsentCookie=({adapter:t,name:e})=>{const o=(t=>{if(typeof document>"u")return;const e=document.cookie.split(";").map((t=>t.trim().split("="))).find((e=>e[0]===t));return e||void 0})(e);return o?JSON.parse(o[1]):t?t():void 0},exports.setConsentCookie=({consent:t,maxAge:e=10368e3,name:o,domain:n,path:i})=>{document.cookie=[`${o}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!n&&`domain=${n}`,!!i&&`path=${i}`].filter((t=>t)).join(";")},exports.shouldShowConsentDialog=(t,e)=>{if(e){const o=new Map(Object.entries(e)),n=Object.entries(t);for(const[t,e]of n)if(e&&null===o.get(t))return!0;return!1}return Object.values(t).some((t=>t))};
2
2
  //# sourceMappingURL=cookieConsentUtils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookieConsentUtils.cjs","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const convertBooleanToConsentValue = (\n formValue: boolean | undefined,\n): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n requirement: ConsentRequirement,\n): Consent => {\n return {\n functional: requirement.functional\n ? convertBooleanToConsentValue(consent.functional)\n : undefined,\n statistics: requirement.statistics\n ? convertBooleanToConsentValue(consent.statistics)\n : undefined,\n marketing: requirement.marketing\n ? convertBooleanToConsentValue(consent.marketing)\n : undefined,\n };\n};\n\nexport const buildRequirementsObject = ({\n marketing,\n functional,\n statistics,\n}: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["convertBooleanToConsentValue","formValue","String","toLowerCase","marketing","functional","statistics","consent","requirement","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","maxAge","domain","stringify","filter","f","join","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue"],"mappings":"gFAEA,MAkGaA,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,2CAoB4B,EACnCC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,MAEO,IACCF,GAAa,CAAEA,UAAAA,MACfC,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA,wDAzB8B,CACtDC,EACAC,KAAAA,CAGIH,WAAYG,EAAYH,WAClBL,EAA6BO,EAAQF,iBACrC,EACNC,WAAYE,EAAYF,WAClBN,EAA6BO,EAAQD,iBACrC,EACNF,UAAWI,EAAYJ,UACjBJ,EAA6BO,EAAQH,gBACrC,oEAzGkB,EAC5BK,QAAAA,EACAC,KAAAA,MAKM,MAAAC,EA3BSD,KACX,UAAOE,SAAa,IACb,OAGL,MAAAD,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAE1B,OAAKC,QAAL,CAIOA,EAUQQ,CAAUT,GAEzB,OAAIC,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADX,CACmB,2BASS,EAC5BF,QAAAA,EACAe,OAAAA,EAJoB,QAKpBZ,KAAAA,EACAa,OAAAA,MAOAX,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKI,UAAUjB,KAC1B,WAAWe,IACX,iBACEC,GAAU,UAAUA,KAErBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,kCAGsB,CACnCnB,EACAD,KAEA,GAAKA,EAKE,CAEH,MAAMqB,EAAa,IAAIC,IAAIC,OAAOC,QAAQxB,IAGpCyB,EAAqBF,OAAOC,QAAQvB,GAE1C,IAAW,MAACE,EAAMuB,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAIxB,GACR,OAAA,EAIR,OAAA,CACX,QAvBWoB,OAAOK,OAAO3B,GAAa4B,MAC7BC,GAAqBA,GAAA"}
1
+ {"version":3,"file":"cookieConsentUtils.cjs","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n path,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n path?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n !!path && `path=${path}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const convertBooleanToConsentValue = (\n formValue: boolean | undefined,\n): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n requirement: ConsentRequirement,\n): Consent => {\n return {\n functional: requirement.functional\n ? convertBooleanToConsentValue(consent.functional)\n : undefined,\n statistics: requirement.statistics\n ? convertBooleanToConsentValue(consent.statistics)\n : undefined,\n marketing: requirement.marketing\n ? convertBooleanToConsentValue(consent.marketing)\n : undefined,\n };\n};\n\nexport const buildRequirementsObject = ({\n marketing,\n functional,\n statistics,\n}: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["convertBooleanToConsentValue","formValue","String","toLowerCase","marketing","functional","statistics","consent","requirement","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","maxAge","domain","path","stringify","filter","f","join","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue"],"mappings":"gFAEA,MAqGaA,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,2CAoB4B,EACnCC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,MACJ,IAEYF,GAAa,CAAEA,UAAAA,MACfC,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA,wDAzB8B,CACtDC,EACAC,KAAAA,CAGIH,WAAYG,EAAYH,WAClBL,EAA6BO,EAAQF,iBACrC,EACNC,WAAYE,EAAYF,WAClBN,EAA6BO,EAAQD,iBACrC,EACNF,UAAWI,EAAYJ,UACjBJ,EAA6BO,EAAQH,gBACrC,oEA5GkB,EAC5BK,QAAAA,EACAC,KAAAA,MAKM,MAAAC,EA3BSD,KACX,UAAOE,SAAa,IACb,OAGL,MAAAD,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAE1B,OAAKC,QAAL,CAIOA,EAUQQ,CAAUT,GAEzB,OAAIC,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADX,CACmB,2BASS,EAC5BF,QAAAA,EACAe,OAAAA,EAJoB,QAKpBZ,KAAAA,EACAa,OAAAA,EACAC,KAAAA,MAQAZ,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKK,UAAUlB,KAC1B,WAAWe,IACX,iBACEC,GAAU,UAAUA,MACpBC,GAAQ,QAAQA,KAEjBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,kCAGsB,CACnCpB,EACAD,KAEA,GAAKA,EAKE,CAEH,MAAMsB,EAAa,IAAIC,IAAIC,OAAOC,QAAQzB,IAGpC0B,EAAqBF,OAAOC,QAAQxB,GAE1C,IAAA,MAAYE,EAAMwB,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAIzB,GACR,OAAA,EAIR,OAAA,CACX,CAvBW,OAAAqB,OAAOK,OAAO5B,GAAa6B,MAC7BC,GAAqBA,GAAA"}
@@ -3,11 +3,12 @@ export declare const getConsentCookie: ({ adapter, name, }: {
3
3
  adapter?: () => Consent | undefined;
4
4
  name: string;
5
5
  }) => Consent | undefined;
6
- export declare const setConsentCookie: ({ consent, maxAge, name, domain, }: {
6
+ export declare const setConsentCookie: ({ consent, maxAge, name, domain, path, }: {
7
7
  consent: Consent;
8
8
  maxAge?: number;
9
9
  name: string;
10
10
  domain?: string;
11
+ path?: string;
11
12
  }) => void;
12
13
  export declare const shouldShowConsentDialog: (requirement: ConsentRequirement, consent: Consent | undefined) => boolean;
13
14
  export declare const convertBooleanToConsentValue: (formValue: boolean | undefined) => ConsentState;
@@ -19,9 +19,11 @@ export type InternalContext = {
19
19
  currentConsent: Consent;
20
20
  cookieName: string;
21
21
  cookieDomain?: string;
22
+ cookiePath?: string;
22
23
  };
23
24
  export type CookieConsentProviderProps = Partial<ConsentRequirement> & WithChildren & {
24
25
  cookieAdapter?: () => Consent | undefined;
25
26
  cookieName?: string;
26
27
  cookieDomain?: string;
28
+ cookiePath?: string;
27
29
  };
@@ -0,0 +1,24 @@
1
+ import { StoryObj } from '@storybook/react';
2
+ import { default as React } from 'react';
3
+ declare const meta: {
4
+ title: string;
5
+ component: <ElementType extends React.ElementType = "div">(props: import('../Card.js').CardProps<ElementType> & import('../../../index.js').AsChildProps) => React.ReactElement | null;
6
+ parameters: {
7
+ layout: string;
8
+ };
9
+ tags: string[];
10
+ argTypes: {
11
+ variant: {
12
+ control: "select";
13
+ options: readonly ["outlined", "high", "low"];
14
+ };
15
+ padding: {
16
+ control: "select";
17
+ options: readonly ["s", "m", "l", "xl"];
18
+ };
19
+ };
20
+ };
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+ export declare const Test: Story;
24
+ export declare const Fakturainformasjon: Story;
@@ -0,0 +1,2 @@
1
+ import{jsx as a,jsxs as r}from"react/jsx-runtime";import{formatValuta as e}from"../../../utilities/formatters/valuta/formatValuta.js";import{Flex as t}from"../../flex/Flex.js";import{ErrorTag as s}from"../../tag/Tag.js";import{Card as i,CARD_VARIANTS as n,CARD_PADDINGS as o}from"../Card.js";const l={title:"Komponenter/Card",component:i,parameters:{layout:"centered"},tags:["autodocs"],argTypes:{variant:{control:"select",options:n},padding:{control:"select",options:o}}},d={args:{padding:"m",variant:"outlined",children:"Hei, verden!"},render:r=>a(i,{...r})},c={args:{padding:"m",clickable:!0,variant:"outlined",children:""},render:({asChild:n,as:o,...l})=>a(i,{asChild:!0,...l,children:r(t,{as:"a",href:"#test",colGap:40,children:[r(t,{direction:"column",gap:4,children:[r("p",{className:"jkl-heading-2",children:[e(18856),a("span",{"aria-hidden":!0,children:" →"})]}),a("p",{className:"jkl-body",children:"Frist 20.03.2023"})]}),r(t,{direction:"column",gap:12,children:[a(s,{children:"Ubetalt"}),a("p",{className:"jkl-body",children:"Purring"})]})]})})};export{c as Fakturainformasjon,d as Test,l as default};
2
+ //# sourceMappingURL=Card.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.stories.js","sources":["../../../../../src/components/card/stories/Card.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React from \"react\";\nimport { formatValuta } from \"../../../utilities/formatters/valuta/formatValuta.js\";\nimport { Flex } from \"../../flex/Flex.js\";\nimport { ErrorTag } from \"../../tag/Tag.js\";\nimport { Card, CARD_PADDINGS, CARD_VARIANTS } from \"../Card.js\";\nimport \"../styles/_index.scss\";\n\nconst meta = {\n title: \"Komponenter/Card\",\n component: Card,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n argTypes: {\n variant: { control: \"select\", options: CARD_VARIANTS },\n padding: { control: \"select\", options: CARD_PADDINGS },\n },\n} satisfies Meta<typeof Card>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Test: Story = {\n args: {\n padding: \"m\",\n variant: \"outlined\",\n children: \"Hei, verden!\",\n },\n render: (args) => <Card {...args}></Card>,\n};\nexport const Fakturainformasjon: Story = {\n args: {\n padding: \"m\",\n clickable: true,\n variant: \"outlined\",\n children: \"\",\n },\n render: ({ asChild, as, ...props }) => (\n <Card asChild {...props}>\n <Flex as=\"a\" href=\"#test\" colGap={40}>\n <Flex direction=\"column\" gap={4}>\n <p className=\"jkl-heading-2\">\n {formatValuta(18856)}\n <span aria-hidden> →</span>\n </p>\n <p className=\"jkl-body\">Frist 20.03.2023</p>\n </Flex>\n <Flex direction=\"column\" gap={12}>\n <ErrorTag>Ubetalt</ErrorTag>\n <p className=\"jkl-body\">Purring</p>\n </Flex>\n </Flex>\n </Card>\n ),\n};\n"],"names":["meta","title","component","Card","parameters","layout","tags","argTypes","variant","control","options","CARD_VARIANTS","padding","CARD_PADDINGS","Test","args","children","render","jsx","Fakturainformasjon","clickable","asChild","as","props","jsxs","Flex","href","colGap","direction","gap","className","formatValuta","ErrorTag"],"mappings":"oSAQA,MAAMA,EAAO,CACTC,MAAO,mBACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,QAAS,CAAEC,QAAS,SAAUC,QAASC,GACvCC,QAAS,CAAEH,QAAS,SAAUC,QAASG,KAOlCC,EAAc,CACvBC,KAAM,CACFH,QAAS,IACTJ,QAAS,WACTQ,SAAU,gBAEdC,OAASF,GAAUG,EAAAf,EAAA,IAASY,KAEnBI,EAA4B,CACrCJ,KAAM,CACFH,QAAS,IACTQ,WAAW,EACXZ,QAAS,WACTQ,SAAU,IAEdC,OAAQ,EAAGI,QAAAA,EAASC,GAAAA,KAAOC,KACtBL,EAAAf,EAAA,CAAKkB,SAAO,KAAKE,EACdP,SAACQ,EAAAC,EAAA,CAAKH,GAAG,IAAII,KAAK,QAAQC,OAAQ,GAC9BX,SAAA,CAAAQ,EAACC,EAAK,CAAAG,UAAU,SAASC,IAAK,EAC1Bb,SAAA,CAACQ,EAAA,IAAA,CAAEM,UAAU,gBACRd,SAAA,CAAAe,EAAa,OACbb,EAAA,OAAA,CAAK,eAAW,EAACF,SAAE,UAEvBE,EAAA,IAAA,CAAEY,UAAU,WAAWd,SAAgB,wBAE3CQ,EAAAC,EAAA,CAAKG,UAAU,SAASC,IAAK,GAC1Bb,SAAA,CAAAE,EAACc,GAAShB,SAAO,YAChBE,EAAA,IAAA,CAAEY,UAAU,WAAWd,SAAO"}
@@ -1,2 +1,2 @@
1
- import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useId as n,useEffect as o}from"react";import a from"react-dom";import{SecondaryButton as i}from"../button/Button.js";import{ModalContainer as s,ModalOverlay as r,Modal as l,ModalHeader as d,ModalTitle as c,ModalBody as m,ModalActions as u}from"../modal/Modal.js";import{useModal as k}from"../modal/useModal.js";import{useInternalState as f}from"./CookieConsentContext.js";import{setConsentCookie as g,convertBooleanConsentObjectToConsentObject as p}from"./cookieConsentUtils.js";import{RequirementCheckbox as j}from"./RequirementCheckbox.js";const h=({blocking:h,onAccept:b,...C})=>{const{currentConsent:v,cookieName:y,cookieDomain:M,requirement:x,isOpen:O,setIsOpen:T,updateCurrentConsents:D}=f(),[I,B]=k({id:`jkl-cookie-modal-${n()}`,role:h?"alertdialog":"dialog",title:"Informasjonskapsler"});if(o((()=>{O?null==I||I.show():null==I||I.hide()}),[I,O]),o((()=>{const e=()=>T(!1);return null==I||I.on("hide",e),()=>{null==I||I.off("hide",e)}}),[I,T]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return b&&b({functional:"denied",marketing:"denied",statistics:"denied"}),null;const $=(e=p({functional:!0,statistics:!0,marketing:!0},x))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...v,...t};g({consent:n,name:y,domain:M}),D(),null==b||b(n),null==I||I.hide()};return a.createPortal(e(s,{...B.container,...C,"data-cookie-consent-open":O,children:[t(r,{...B.overlay}),e(l,{component:"form",...B.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=p({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},x);$(n)},children:[t(d,{children:t(c,{...B.title,children:"Velg informasjonskapsler"})}),e(m,{children:[t("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),x.functional&&t(j,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===v.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${v.functional}`),x.statistics&&t(j,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===v.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${v.statistics}`),x.marketing&&t(j,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===v.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${v.marketing}`)]}),e(u,{children:[t(i,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>$(),children:"Godta alle"}),t(i,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};export{h as CookieConsent};
1
+ import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useId as n,useEffect as o}from"react";import a from"react-dom";import{SecondaryButton as i}from"../button/Button.js";import{ModalContainer as s,ModalOverlay as r,Modal as l,ModalHeader as d,ModalTitle as c,ModalBody as m,ModalActions as u}from"../modal/Modal.js";import{useModal as k}from"../modal/useModal.js";import{useInternalState as f}from"./CookieConsentContext.js";import{setConsentCookie as g,convertBooleanConsentObjectToConsentObject as p}from"./cookieConsentUtils.js";import{RequirementCheckbox as j}from"./RequirementCheckbox.js";const h=({blocking:h,onAccept:b,...C})=>{const{currentConsent:v,cookieName:y,cookieDomain:M,cookiePath:x,requirement:O,isOpen:T,setIsOpen:D,updateCurrentConsents:I}=f(),[B,$]=k({id:`jkl-cookie-modal-${n()}`,role:h?"alertdialog":"dialog",title:"Informasjonskapsler"});if(o((()=>{T?null==B||B.show():null==B||B.hide()}),[B,T]),o((()=>{const e=()=>D(!1);return null==B||B.on("hide",e),()=>{null==B||B.off("hide",e)}}),[B,D]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return b&&b({functional:"denied",marketing:"denied",statistics:"denied"}),null;const q=(e=p({functional:!0,statistics:!0,marketing:!0},O))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...v,...t};g({consent:n,name:y,domain:M,path:x}),I(),null==b||b(n),null==B||B.hide()};return a.createPortal(e(s,{...$.container,...C,"data-cookie-consent-open":T,children:[t(r,{...$.overlay}),e(l,{component:"form",...$.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=p({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},O);q(n)},children:[t(d,{children:t(c,{...$.title,children:"Velg informasjonskapsler"})}),e(m,{children:[t("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),O.functional&&t(j,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===v.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${v.functional}`),O.statistics&&t(j,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===v.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${v.statistics}`),O.marketing&&t(j,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===v.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${v.marketing}`)]}),e(u,{children:[t(i,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>q(),children:"Godta alle"}),t(i,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};export{h as CookieConsent};
2
2
  //# sourceMappingURL=CookieConsent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.js","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["CookieConsent","blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"ulBA0BO,MAAMA,EAAgB,EACzBC,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,KAEGC,EAAUC,GAAeC,EAAS,CACrCC,GAAI,oBAAoBC,MAIxBC,KAAMhB,EAAW,cAAgB,SAGjCiB,MAAO,wBAmBP,GAhBJC,GAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,GAAU,KACAG,MAAAA,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAAAA,CAAM,GAEjC,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAIzB,GACSA,EAAA,CACL0B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGLC,MAAAA,EAAS,CACXC,EAAYC,EACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,GAAIC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBpC,KACA8B,GAGUO,EAAA,CACbC,QAASF,EACTG,KAAMtC,EACNuC,OAAQtC,IAGUI,IAEtB,MAAAR,GAAAA,EAAWsC,GAEX,MAAA5B,GAAAA,EAAUS,MAAA,EAoBd,OAAOwB,EAASC,aACZC,EAACC,EAAA,IACOnC,EAAYoC,aACZ9C,EACJ,2BAA0BK,EAE1B0C,SAAA,CAACC,EAAAC,EAAA,IAAiBvC,EAAYwC,UAC9BN,EAACO,EAAM,CAAAC,UAAU,UAAW1C,EAAY2C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc9B,EAChB,CACIL,WAA2C,SAA/BgC,EAASI,IAAI,cACzBlC,WAA2C,SAA/B8B,EAASI,IAAI,cACzBnC,UAAyC,SAA9B+B,EAASI,IAAI,cAE5BzD,GAGJwB,EAAOgC,EAAW,EAWVb,SAAA,CAAAC,EAACc,GACGf,SAACC,EAAAe,EAAA,IAAerD,EAAYK,MAAOgC,0CAItCiB,EACG,CAAAjB,SAAA,CAAAC,EAAC,KAAED,SAGH,gHACC3C,EAAYqB,YACTuB,EAACiB,EAAA,CACGzB,KAAK,aACL0B,MAAM,sBACNC,eACkC,aAA9BlE,EAAewB,WAGtBsB,SAAA,wKADQ,cAAc9C,EAAewB,cAQzCrB,EAAYuB,YACTqB,EAACiB,EAAA,CACGzB,KAAK,aACL0B,MAAM,oBACNC,eACkC,aAA9BlE,EAAe0B,WAGtBoB,SAAA,yJADQ,cAAc9C,EAAe0B,cAOzCvB,EAAYsB,WACTsB,EAACiB,EAAA,CACGzB,KAAK,YACL0B,MAAM,iCACNC,eACiC,aAA7BlE,EAAeyB,UAGtBqB,SAAA,uKADQ,aAAa9C,EAAeyB,kBAS5C0C,EACG,CAAArB,SAAA,CAAAC,EAACqB,EAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM3C,IAClBmB,SAAA,eAGDC,EAACqB,EAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMbzB,SAASkD,KAAA"}
1
+ {"version":3,"file":"CookieConsent.js","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n cookiePath,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n path: cookiePath,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["CookieConsent","blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","cookiePath","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","path","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"ulBA0BO,MAAMA,EAAgB,EACzBC,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,WAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,KAEGC,EAAUC,GAAeC,EAAS,CACrCC,GAAI,oBAAoBC,MAIxBC,KAAMjB,EAAW,cAAgB,SAGjCkB,MAAO,wBAmBP,GAhBJC,GAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,GAAU,KACAG,MAAAA,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAAAA,CAAM,GAEjC,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAI1B,GACSA,EAAA,CACL2B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGLC,MAAAA,EAAS,CACXC,EAAYC,EACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,GAAIC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBrC,KACA+B,GAGUO,EAAA,CACbC,QAASF,EACTG,KAAMvC,EACNwC,OAAQvC,EACRwC,KAAMvC,IAGYI,IAEtB,MAAAT,GAAAA,EAAWuC,GAEX,MAAA5B,GAAAA,EAAUS,MAAA,EAoBd,OAAOyB,EAASC,aACZC,EAACC,EAAA,IACOpC,EAAYqC,aACZhD,EACJ,2BAA0BM,EAE1B2C,SAAA,CAACC,EAAAC,EAAA,IAAiBxC,EAAYyC,UAC9BN,EAACO,EAAM,CAAAC,UAAU,UAAW3C,EAAY4C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc/B,EAChB,CACIL,WAA2C,SAA/BiC,EAASI,IAAI,cACzBnC,WAA2C,SAA/B+B,EAASI,IAAI,cACzBpC,UAAyC,SAA9BgC,EAASI,IAAI,cAE5B1D,GAGJwB,EAAOiC,EAAW,EAWVb,SAAA,CAAAC,EAACc,GACGf,SAACC,EAAAe,EAAA,IAAetD,EAAYK,MAAOiC,0CAItCiB,EACG,CAAAjB,SAAA,CAAAC,EAAC,KAAED,SAGH,gHACC5C,EAAYqB,YACTwB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,sBACNC,eACkC,aAA9BpE,EAAeyB,WAGtBuB,SAAA,wKADQ,cAAchD,EAAeyB,cAQzCrB,EAAYuB,YACTsB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,oBACNC,eACkC,aAA9BpE,EAAe2B,WAGtBqB,SAAA,yJADQ,cAAchD,EAAe2B,cAOzCvB,EAAYsB,WACTuB,EAACiB,EAAA,CACG1B,KAAK,YACL2B,MAAM,iCACNC,eACiC,aAA7BpE,EAAe0B,UAGtBsB,SAAA,uKADQ,aAAahD,EAAe0B,kBAS5C2C,EACG,CAAArB,SAAA,CAAAC,EAACqB,EAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM5C,IAClBoB,SAAA,eAGDC,EAACqB,EAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMb1B,SAASmD,KAAA"}
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import o,{useState as t,useMemo as n,useContext as s}from"react";import{buildRequirementsObject as i,getConsentCookie as r,shouldShowConsentDialog as a}from"./cookieConsentUtils.js";const u="fremtind-cookie-consent",c=o.createContext(void 0),C=({children:o,cookieAdapter:s,marketing:C,functional:m,statistics:d,cookieName:l=u,cookieDomain:k})=>{const[p,f]=t((()=>Date.now())),w=n((()=>i({marketing:C,functional:m,statistics:d})),[C,m,d]),h=n((()=>r({adapter:s,name:l})??{marketing:null,functional:null,statistics:null}),[s,l,p]),[v,x]=t((()=>a(w,h)));return e(c.Provider,{value:{isOpen:v,setIsOpen:x,updateCurrentConsents:()=>f(Date.now()),requirement:w,currentConsent:h,cookieName:l,cookieDomain:k},children:o})},m=()=>{const e=o.useContext(c);if(void 0===e)throw new Error("CookieConsent must be used within a CookieConsentProvider");return e},d=()=>{const e=s(c);if(void 0===e)throw new Error("useCookieConsent must be used within a CookieConsentProvider");return{openConsentModal:()=>{e.setIsOpen(!0)},consents:e.currentConsent}};export{C as CookieConsentProvider,u as DEFAULT_COOKIE_NAME,d as useCookieConsent,m as useInternalState};
1
+ import{jsx as e}from"react/jsx-runtime";import o,{useState as t,useMemo as n,useContext as s}from"react";import{buildRequirementsObject as i,getConsentCookie as r,shouldShowConsentDialog as a}from"./cookieConsentUtils.js";const u="fremtind-cookie-consent",c=o.createContext(void 0),C=({children:o,cookieAdapter:s,marketing:C,functional:m,statistics:k,cookieName:d=u,cookieDomain:l,cookiePath:p})=>{const[h,f]=t((()=>Date.now())),w=n((()=>i({marketing:C,functional:m,statistics:k})),[C,m,k]),v=n((()=>r({adapter:s,name:d})??{marketing:null,functional:null,statistics:null}),[s,d,h]),[x,D]=t((()=>a(w,v)));return e(c.Provider,{value:{isOpen:x,setIsOpen:D,updateCurrentConsents:()=>f(Date.now()),requirement:w,currentConsent:v,cookieName:d,cookieDomain:l,cookiePath:p},children:o})},m=()=>{const e=o.useContext(c);if(void 0===e)throw new Error("CookieConsent must be used within a CookieConsentProvider");return e},k=()=>{const e=s(c);if(void 0===e)throw new Error("useCookieConsent must be used within a CookieConsentProvider");return{openConsentModal:()=>{e.setIsOpen(!0)},consents:e.currentConsent}};export{C as CookieConsentProvider,u as DEFAULT_COOKIE_NAME,k as useCookieConsent,m as useInternalState};
2
2
  //# sourceMappingURL=CookieConsentContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsentContext.js","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n /* Use timestamp as a dependency to be ablet to force re-reading of cookie */\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","CookieConsentProvider","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","useInternalState","context","useContext","Error","useCookieConsent","openConsentModal","consents"],"mappings":"8NAYO,MAAMA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,GAEpDC,EAA8D,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaV,EACbW,aAAAA,MAEM,MAACC,EAAWC,GAAgBC,GAAS,IAAMC,KAAKC,QAEhDC,EAAcC,GAChB,IAAMC,EAAwB,CAAEZ,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAGtBW,EAAgBF,GAAQ,IAEtBG,EAAiB,CAAEC,QAAShB,EAAeiB,KAAMb,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAKrB,CAACH,EAAeI,EAAYE,KAExBY,EAAQC,GAAaX,GAAS,IAC1BY,EAAwBT,EAAaG,KAI5C,OAAAO,EAAC1B,EAAQ2B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBV,WAAAA,EACAC,aAAAA,GAGHN,SAAAA,GAAA,EAKA2B,EAAmB,KACtBC,MAAAA,EAAU/B,EAAMgC,WAAWjC,GACjC,QAAgB,IAAZgC,EACA,MAAM,IAAIE,MACN,6DAIDF,OAAAA,CAAAA,EAQEG,EAAmB,KACtBH,MAAAA,EAAUC,EAAWjC,GAE3B,QAAgB,IAAZgC,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEE,iBANgB,KACrBJ,EAAQR,WAAU,EAAI,EAKCa,SAFVL,EAAQF"}
1
+ {"version":3,"file":"CookieConsentContext.js","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n cookiePath,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n /* Use timestamp as a dependency to be ablet to force re-reading of cookie */\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n cookiePath,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","CookieConsentProvider","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","cookiePath","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","useInternalState","context","useContext","Error","useCookieConsent","openConsentModal","consents"],"mappings":"8NAYO,MAAMA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,GAEpDC,EAA8D,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaV,EACbW,aAAAA,EACAC,WAAAA,MAEM,MAACC,EAAWC,GAAgBC,GAAS,IAAMC,KAAKC,QAEhDC,EAAcC,GAChB,IAAMC,EAAwB,CAAEb,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAGtBY,EAAgBF,GAAQ,IAEtBG,EAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAKrB,CAACH,EAAeI,EAAYG,KAExBY,EAAQC,GAAaX,GAAS,IAC1BY,EAAwBT,EAAaG,KAI5C,OAAAO,EAAC3B,EAAQ4B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBX,WAAAA,EACAC,aAAAA,EACAC,WAAAA,GAGHP,SAAAA,GAAA,EAKA4B,EAAmB,KACtBC,MAAAA,EAAUhC,EAAMiC,WAAWlC,GACjC,QAAgB,IAAZiC,EACA,MAAM,IAAIE,MACN,6DAIDF,OAAAA,CAAAA,EAQEG,EAAmB,KACtBH,MAAAA,EAAUC,EAAWlC,GAE3B,QAAgB,IAAZiC,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEE,iBANgB,KACrBJ,EAAQR,WAAU,EAAI,EAKCa,SAFVL,EAAQF"}
@@ -3,11 +3,12 @@ export declare const getConsentCookie: ({ adapter, name, }: {
3
3
  adapter?: () => Consent | undefined;
4
4
  name: string;
5
5
  }) => Consent | undefined;
6
- export declare const setConsentCookie: ({ consent, maxAge, name, domain, }: {
6
+ export declare const setConsentCookie: ({ consent, maxAge, name, domain, path, }: {
7
7
  consent: Consent;
8
8
  maxAge?: number;
9
9
  name: string;
10
10
  domain?: string;
11
+ path?: string;
11
12
  }) => void;
12
13
  export declare const shouldShowConsentDialog: (requirement: ConsentRequirement, consent: Consent | undefined) => boolean;
13
14
  export declare const convertBooleanToConsentValue: (formValue: boolean | undefined) => ConsentState;
@@ -1,2 +1,2 @@
1
- const t=({adapter:t,name:e})=>{const n=(t=>{if(typeof document>"u")return;const e=document.cookie.split(";").map((t=>t.trim().split("="))).find((e=>e[0]===t));return e||void 0})(e);return n?JSON.parse(n[1]):t?t():void 0},e=({consent:t,maxAge:e=10368e3,name:n,domain:o})=>{document.cookie=[`${n}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!o&&`domain=${o}`].filter((t=>t)).join(";")},n=(t,e)=>{if(e){const n=new Map(Object.entries(e)),o=Object.entries(t);for(const[t,e]of o)if(e&&null===n.get(t))return!0;return!1}return Object.values(t).some((t=>t))},o=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted",i=(t,e)=>({functional:e.functional?o(t.functional):void 0,statistics:e.statistics?o(t.statistics):void 0,marketing:e.marketing?o(t.marketing):void 0}),s=({marketing:t,functional:e,statistics:n})=>({...t&&{marketing:t},...e&&{functional:e},...n&&{statistics:n}});export{s as buildRequirementsObject,i as convertBooleanConsentObjectToConsentObject,o as convertBooleanToConsentValue,t as getConsentCookie,e as setConsentCookie,n as shouldShowConsentDialog};
1
+ const t=({adapter:t,name:e})=>{const n=(t=>{if(typeof document>"u")return;const e=document.cookie.split(";").map((t=>t.trim().split("="))).find((e=>e[0]===t));return e||void 0})(e);return n?JSON.parse(n[1]):t?t():void 0},e=({consent:t,maxAge:e=10368e3,name:n,domain:o,path:i})=>{document.cookie=[`${n}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!o&&`domain=${o}`,!!i&&`path=${i}`].filter((t=>t)).join(";")},n=(t,e)=>{if(e){const n=new Map(Object.entries(e)),o=Object.entries(t);for(const[t,e]of o)if(e&&null===n.get(t))return!0;return!1}return Object.values(t).some((t=>t))},o=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted",i=(t,e)=>({functional:e.functional?o(t.functional):void 0,statistics:e.statistics?o(t.statistics):void 0,marketing:e.marketing?o(t.marketing):void 0}),s=({marketing:t,functional:e,statistics:n})=>({...t&&{marketing:t},...e&&{functional:e},...n&&{statistics:n}});export{s as buildRequirementsObject,i as convertBooleanConsentObjectToConsentObject,o as convertBooleanToConsentValue,t as getConsentCookie,e as setConsentCookie,n as shouldShowConsentDialog};
2
2
  //# sourceMappingURL=cookieConsentUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookieConsentUtils.js","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const convertBooleanToConsentValue = (\n formValue: boolean | undefined,\n): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n requirement: ConsentRequirement,\n): Consent => {\n return {\n functional: requirement.functional\n ? convertBooleanToConsentValue(consent.functional)\n : undefined,\n statistics: requirement.statistics\n ? convertBooleanToConsentValue(consent.statistics)\n : undefined,\n marketing: requirement.marketing\n ? convertBooleanToConsentValue(consent.marketing)\n : undefined,\n };\n};\n\nexport const buildRequirementsObject = ({\n marketing,\n functional,\n statistics,\n}: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["getConsentCookie","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","setConsentCookie","consent","maxAge","domain","stringify","filter","f","join","shouldShowConsentDialog","requirement","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue","convertBooleanToConsentValue","formValue","String","toLowerCase","convertBooleanConsentObjectToConsentObject","functional","statistics","marketing","buildRequirementsObject"],"mappings":"AAEA,MAoBaA,EAAmB,EAC5BC,QAAAA,EACAC,KAAAA,MAKMC,MAAAA,EA3BQ,CAACD,IACX,UAAOE,SAAa,IACb,OAGLD,MAAAA,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAErBC,OAAAA,QAAAA,CAIEA,EAUQQ,CAAUT,GAErBC,OAAAA,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADPA,CACe,EASVa,EAAmB,EAC5BC,QAAAA,EACAC,OAAAA,EAAS,QACTd,KAAAA,EACAe,OAAAA,MAOAb,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKM,UAAUH,KAC1B,WAAWC,IACX,iBACEC,GAAU,UAAUA,KAErBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,EAGJC,EAA0B,CACnCC,EACAR,KAEA,GAAKA,EAKE,CAEGS,MAAAA,EAAa,IAAIC,IAAIC,OAAOC,QAAQZ,IAGpCa,EAAqBF,OAAOC,QAAQJ,GAE/B,IAAA,MAACrB,EAAM2B,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAI5B,GACR,OAAA,EAIR,OAAA,CACX,CAvBW,OAAAwB,OAAOK,OAAOR,GAAaS,MAC7BC,GAAqBA,GAAA,EAyBrBC,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,WAGEC,EAA6C,CACtDvB,EACAQ,KAEO,CACHgB,WAAYhB,EAAYgB,WAClBL,EAA6BnB,EAAQwB,iBACrC,EACNC,WAAYjB,EAAYiB,WAClBN,EAA6BnB,EAAQyB,iBACrC,EACNC,UAAWlB,EAAYkB,UACjBP,EAA6BnB,EAAQ0B,gBACrC,IAIDC,EAA0B,EACnCD,UAAAA,EACAF,WAAAA,EACAC,WAAAA,MAEO,IACCC,GAAa,CAAEA,UAAAA,MACfF,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA"}
1
+ {"version":3,"file":"cookieConsentUtils.js","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n path,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n path?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n !!path && `path=${path}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const convertBooleanToConsentValue = (\n formValue: boolean | undefined,\n): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n requirement: ConsentRequirement,\n): Consent => {\n return {\n functional: requirement.functional\n ? convertBooleanToConsentValue(consent.functional)\n : undefined,\n statistics: requirement.statistics\n ? convertBooleanToConsentValue(consent.statistics)\n : undefined,\n marketing: requirement.marketing\n ? convertBooleanToConsentValue(consent.marketing)\n : undefined,\n };\n};\n\nexport const buildRequirementsObject = ({\n marketing,\n functional,\n statistics,\n}: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["getConsentCookie","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","setConsentCookie","consent","maxAge","domain","path","stringify","filter","f","join","shouldShowConsentDialog","requirement","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue","convertBooleanToConsentValue","formValue","String","toLowerCase","convertBooleanConsentObjectToConsentObject","functional","statistics","marketing","buildRequirementsObject"],"mappings":"AAEA,MAoBaA,EAAmB,EAC5BC,QAAAA,EACAC,KAAAA,MAKMC,MAAAA,EA3BQ,CAACD,IACX,UAAOE,SAAa,IACb,OAGLD,MAAAA,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAErBC,OAAAA,QAAAA,CAIEA,EAUQQ,CAAUT,GAErBC,OAAAA,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADPA,CACe,EASVa,EAAmB,EAC5BC,QAAAA,EACAC,OAAAA,EAAS,QACTd,KAAAA,EACAe,OAAAA,EACAC,KAAAA,MAQAd,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKO,UAAUJ,KAC1B,WAAWC,IACX,iBACEC,GAAU,UAAUA,MACpBC,GAAQ,QAAQA,KAEjBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,EAGJC,EAA0B,CACnCC,EACAT,KAEA,GAAKA,EAKE,CAEGU,MAAAA,EAAa,IAAIC,IAAIC,OAAOC,QAAQb,IAGpCc,EAAqBF,OAAOC,QAAQJ,GAE/B,IAAA,MAACtB,EAAM4B,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAI7B,GACR,OAAA,EAIR,OAAA,CACX,CAvBW,OAAAyB,OAAOK,OAAOR,GAAaS,MAC7BC,GAAqBA,GAAA,EAyBrBC,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,WAGEC,EAA6C,CACtDxB,EACAS,KAEO,CACHgB,WAAYhB,EAAYgB,WAClBL,EAA6BpB,EAAQyB,iBACrC,EACNC,WAAYjB,EAAYiB,WAClBN,EAA6BpB,EAAQ0B,iBACrC,EACNC,UAAWlB,EAAYkB,UACjBP,EAA6BpB,EAAQ2B,gBACrC,IAIDC,EAA0B,EACnCD,UAAAA,EACAF,WAAAA,EACAC,WAAAA,MAEO,IACCC,GAAa,CAAEA,UAAAA,MACfF,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA"}
@@ -19,9 +19,11 @@ export type InternalContext = {
19
19
  currentConsent: Consent;
20
20
  cookieName: string;
21
21
  cookieDomain?: string;
22
+ cookiePath?: string;
22
23
  };
23
24
  export type CookieConsentProviderProps = Partial<ConsentRequirement> & WithChildren & {
24
25
  cookieAdapter?: () => Consent | undefined;
25
26
  cookieName?: string;
26
27
  cookieDomain?: string;
28
+ cookiePath?: string;
27
29
  };
@@ -0,0 +1 @@
1
+ @charset "UTF-8";:root,[data-layout-density=comfortable],[data-density=comfortable]{--jkl-info-card-content-wrapper-gap: 1rem;--jkl-info-card-title-font-size: var(--jkl-heading-2-font-size);--jkl-info-card-title-line-height: var(--jkl-heading-2-line-height);--jkl-info-card-title-font-weight: var(--jkl-heading-2-font-weight);--jkl-info-card-content-font-size: var(--jkl-body-font-size);--jkl-info-card-content-line-height: var(--jkl-body-line-height);--jkl-info-card-content-font-weight: var(--jkl-body-font-weight)}[data-layout-density=compact],[data-density=compact]{--jkl-info-card-content-wrapper-gap: .75rem;--jkl-info-card-title-font-size: var(--jkl-heading-4-font-size);--jkl-info-card-title-line-height: var(--jkl-heading-4-line-height);--jkl-info-card-title-font-weight: 400;--jkl-info-card-content-font-size: var(--jkl-small-font-size);--jkl-info-card-content-line-height: var(--jkl-small-line-height);--jkl-info-card-content-font-weight: var(--jkl-small-font-weight)}.jkl-info-card{box-sizing:border-box}.jkl-info-card__image{width:100%;aspect-ratio:3/2}.jkl-info-card__title{font-size:var(--jkl-info-card-title-font-size);line-height:var(--jkl-info-card-title-line-height);font-weight:var(--jkl-info-card-title-font-weight)}.jkl-info-card__content-wrapper{font-size:var(--jkl-info-card-content-font-size);line-height:var(--jkl-info-card-content-line-height);font-weight:var(--jkl-info-card-content-font-weight);gap:var(--jkl-info-card-content-wrapper-gap);display:flex;flex-direction:column;align-items:flex-start}@media screen and (forced-colors: active){.jkl-info-card{border:.125rem solid CanvasText}}@media screen and (prefers-color-scheme: light){:root{--jkl-nav-card-background: #ffffff;--jkl-nav-card-shadow: 0 .25rem .9375rem rgba(37, 42, 49, .1);--jkl-nav-card-shadow--hover: 0 .375rem 1.5625rem rgba(37, 42, 49, .12);--jkl-nav-card-info-border-color: #c8c5c3}}[data-theme=light]{--jkl-nav-card-background: #ffffff;--jkl-nav-card-shadow: 0 .25rem .9375rem rgba(37, 42, 49, .1);--jkl-nav-card-shadow--hover: 0 .375rem 1.5625rem rgba(37, 42, 49, .12);--jkl-nav-card-info-border-color: #c8c5c3}@media screen and (prefers-color-scheme: dark){:root{--jkl-nav-card-background: #313030;--jkl-nav-card-shadow: none;--jkl-nav-card-shadow--hover: none;--jkl-nav-card-info-border-color: #636060}}[data-theme=dark]{--jkl-nav-card-background: #313030;--jkl-nav-card-shadow: none;--jkl-nav-card-shadow--hover: none;--jkl-nav-card-info-border-color: #636060}:root,[data-layout-density=comfortable],[data-density=comfortable]{--jkl-nav-card-content-wrapper-gap: 1rem;--jkl-nav-card-info-padding: 1.5rem 0 0 0;--jkl-nav-card-link-font-size: var(--jkl-heading-2-font-size);--jkl-nav-card-link-line-height: var(--jkl-heading-2-line-height);--jkl-nav-card-link-font-weight: var(--jkl-heading-2-font-weight);--jkl-nav-card-content-font-size: var(--jkl-body-font-size);--jkl-nav-card-content-line-height: var(--jkl-body-line-height);--jkl-nav-card-content-font-weight: var(--jkl-body-font-weight)}[data-layout-density=compact],[data-density=compact]{--jkl-nav-card-info-padding: .75rem 0 0 0;--jkl-nav-card-content-font-size: var(--jkl-small-font-size);--jkl-nav-card-content-line-height: var(--jkl-small-line-height);--jkl-nav-card-content-font-weight: var(--jkl-small-font-weight)}.jkl-nav-card{display:block;box-sizing:border-box;transform:translateZ(0);text-decoration:none;color:var(--jkl-color);outline:0;border-radius:.25rem;overflow:hidden;box-shadow:var(--jkl-nav-card-shadow);background-color:var(--jkl-nav-card-background);transition-timing-function:ease;transition-duration:.15s;transition-property:box-shadow,transform}.jkl-nav-card__image{width:100%;aspect-ratio:3/2}.jkl-nav-card__content{display:flex;flex-direction:column;align-items:flex-start;gap:var(--jkl-nav-card-content-wrapper-gap);font-size:var(--jkl-nav-card-content-font-size);line-height:var(--jkl-nav-card-content-line-height);font-weight:var(--jkl-nav-card-content-font-weight)}.jkl-nav-card__link{font-size:var(--jkl-nav-card-link-font-size);line-height:var(--jkl-nav-card-link-line-height);font-weight:var(--jkl-nav-card-link-font-weight);box-sizing:border-box;position:relative}.jkl-nav-card__link:after{content:"→";content:"→"/"";alt:" ";display:inline;margin-left:-.2em;padding-left:.35em;padding-right:.35em}.jkl-nav-card__link[target=_blank]:after,.jkl-nav-card__link--external:after{content:"↗";content:"↗"/"";alt:" "}.jkl-nav-card__description{font-size:var(--jkl-nav-card-content-font-size);line-height:var(--jkl-nav-card-content-line-height);font-weight:var(--jkl-nav-card-content-font-weight)}.jkl-nav-card__info{border-top:.0625rem solid var(--jkl-nav-card-info-border-color);padding:var(--jkl-nav-card-info-padding);font-size:1rem;line-height:1.5rem;font-weight:400;--jkl-icon-weight: 300;--jkl-icon-size: 1.25rem;--jkl-icon-opsz: 20;width:100%}.jkl-nav-card__tag-wrapper{display:flex;gap:calc(var(--jkl-unit-10) * 1.5) calc(var(--jkl-unit-10) * 3);flex-wrap:wrap}.jkl-nav-card:hover{box-shadow:var(--jkl-nav-card-shadow--hover);transform:translate3d(0,-.25rem,0)}html:not([data-mousenavigation]):not([data-touchnavigation]) .jkl-nav-card:focus{outline:.125rem solid var(--jkl-color)}@media screen and (forced-colors: active){.jkl-nav-card{outline:revert;border:.125rem solid LinkText}}@media screen and (prefers-color-scheme: light){:root{--jkl-task-card-background--highlighted: #ffffff;--jkl-task-card-background--normal: #f9f9f9;--jkl-task-card-background--subdued: #ece9e5;--jkl-task-card-shadow: 0 .25rem .75rem rgba(37, 42, 49, .03)}}[data-theme=light]{--jkl-task-card-background--highlighted: #ffffff;--jkl-task-card-background--normal: #f9f9f9;--jkl-task-card-background--subdued: #ece9e5;--jkl-task-card-shadow: 0 .25rem .75rem rgba(37, 42, 49, .03)}@media screen and (prefers-color-scheme: dark){:root{--jkl-task-card-background--highlighted: #313030;--jkl-task-card-background--normal: #313030;--jkl-task-card-background--subdued: #000000;--jkl-task-card-shadow: none}}[data-theme=dark]{--jkl-task-card-background--highlighted: #313030;--jkl-task-card-background--normal: #313030;--jkl-task-card-background--subdued: #000000;--jkl-task-card-shadow: none}.jkl-task-card{box-sizing:border-box;border-radius:.25rem;transition-timing-function:ease;transition-duration:.15s;transition-property:background-color}.jkl-task-card__content-wrapper{display:block}.jkl-task-card--hvit,.jkl-task-card--highlighted{background-color:var(--jkl-task-card-background--highlighted)}.jkl-task-card--snohvit,.jkl-task-card--normal{background-color:var(--jkl-task-card-background--normal)}.jkl-task-card--sand,.jkl-task-card--subdued{background-color:var(--jkl-task-card-background--subdued)}.jkl-task-card--dis,.jkl-task-card--very-subdued{background-color:var(--jkl-task-card-background--very-subdued)}.jkl-task-card--with-shadow{box-shadow:var(--jkl-task-card-shadow)}@media screen and (forced-colors: active){.jkl-task-card{border:.125rem solid CanvasText}}.jkl-card{--padding-s: var(--jkl-unit-05);--padding-m: var(--jkl-unit-15);--padding-l: var(--jkl-unit-20);--padding-xl: var(--jkl-unit-30);--border-radius: .25rem;--border-color: transparent;--border-width: .0625rem;--background-color: transparent;position:relative;overflow:hidden;display:block;background-color:var(--background-color);border-radius:var(--border-radius);box-sizing:border-box;padding:var(--padding, var(--padding-s));text-decoration:none;color:var(--jkl-color-text-default)}.jkl-card:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;border-radius:var(--border-radius);border:var(--border-width) solid var(--border-color);transition-timing-function:ease;transition-duration:.1s;transition-property:border-color,border-size}@media (min-width: 680px){.jkl-card{--padding-s: var(--jkl-unit-10);--padding-m: var(--jkl-unit-20);--padding-l: var(--jkl-unit-30);--padding-xl: var(--jkl-unit-40)}}.jkl-card[data-padding=s]{--padding: var(--padding-s)}.jkl-card[data-padding=m]{--padding: var(--padding-m)}.jkl-card[data-padding=l]{--padding: var(--padding-l)}.jkl-card[data-padding=xl]{--padding: var(--padding-xl)}.jkl-card--high{--background-color: var(--jkl-color-background-container-high)}.jkl-card--low{--background-color: var(--jkl-color-background-container-low)}.jkl-card--outlined{--border-color: var(--jkl-color-border-separator)}.jkl-card[data-clickable=true]{cursor:pointer}.jkl-card[data-clickable=true]:hover{--border-color: var(--jkl-color-border-separator-hover);--border-width: .125rem}.jkl-card[data-clickable=true]:focus-visible{outline:3px solid var(--jkl-color-border-action);outline-offset:3px}.jkl-card-image{--margin: calc( var(--padding, 0) * -1 );width:calc(100% + 2 * var(--padding, 0));aspect-ratio:var(--image-aspect-ratio, 3/2);margin-inline:var(--margin, 0)}.jkl-card-image--top{margin-top:var(--margin, 0)}.jkl-card-image--bottom{margin-bottom:var(--margin, 0)}.jkl-image{display:block;overflow:hidden;position:relative}.jkl-image__placeholder{filter:blur(20px)}.jkl-image__image{transition-timing-function:ease;transition-duration:.4s;transition-property:opacity;opacity:1}.jkl-image__image,.jkl-image__placeholder{width:100%;height:100%;position:absolute;top:50%;left:50%;transform:translate3d(-50%,-50%,0);object-fit:cover}.jkl-image--loading .jkl-image__image{opacity:0}:root,[data-layout-density=comfortable],[data-density=comfortable]{--jkl-tag-padding: var(--jkl-unit-05) var(--jkl-unit-10);--jkl-tag-gap: var(--jkl-unit-05)}[data-layout-density=compact],[data-density=compact]{--jkl-tag-padding: 0 var(--jkl-unit-05);--jkl-tag-gap: var(--jkl-unit-02)}.jkl-tag{--background-color: var(--jkl-color-background-alert-neutral);--text-color: var(--jkl-color-text-on-alert);font-size:1rem;line-height:1.5rem;font-weight:700;--jkl-icon-weight: 500;--jkl-icon-size: 1.25rem;--jkl-icon-opsz: 20;background-color:var(--background-color);color:var(--text-color);border-radius:.25rem;display:inline-flex;align-items:center;white-space:nowrap;padding:var(--jkl-tag-padding);gap:var(--jkl-tag-gap)}.jkl-tag--info{--background-color: var(--jkl-color-background-alert-info)}.jkl-tag--warning{--background-color: var(--jkl-color-background-alert-warning)}.jkl-tag--error{--background-color: var(--jkl-color-background-alert-error)}.jkl-tag--success{--background-color: var(--jkl-color-background-alert-success)}@media screen and (forced-colors: active){.jkl-tag{border:2px none CanvasText;border-bottom-style:dotted}.jkl-tag--info{border-style:dotted}.jkl-tag--warning{border-style:dashed}.jkl-tag--error{border-style:double;border-width:4px}.jkl-tag--success{border-style:solid}}@media screen and (prefers-color-scheme: light){:root{--jkl-icon-grade: 0}}[data-theme=light]{--jkl-icon-grade: 0}@media screen and (prefers-color-scheme: dark){:root{--jkl-icon-grade: -25}}[data-theme=dark]{--jkl-icon-grade: -25}.jkl-icon{--jkl-icon-fill: 0;font-family:Fremtind Material Symbols,Arial,Helvetica,sans-serif;font-variation-settings:"FILL" var(--jkl-icon-fill, 0),"GRAD" var(--jkl-icon-grade, 0),"opsz" var(--jkl-icon-opsz, 24);font-feature-settings:"liga";-webkit-font-feature-settings:"liga";font-size:var(--jkl-icon-size, 1.5rem);font-weight:var(--jkl-icon-weight, 300);line-height:1;display:inline-block;-webkit-font-smoothing:antialiased;transition-timing-function:ease;transition-duration:.15s;transition-property:font-variation-settings,transform}.jkl-icon--bold{--jkl-icon-weight: 500}.jkl-icon--filled{--jkl-icon-fill: 1}.jkl-icon--medium{--jkl-icon-opsz: 24;--jkl-icon-size: 1.5rem}.jkl-icon--small{--jkl-icon-opsz: 20;--jkl-icon-size: 1.25rem}.jkl-icon--inherit{--jkl-icon-opsz: 20;--jkl-icon-size: 1.2em}.jkl-icon--animated{display:block}.jkl-icon-red-cross{--red-cross-circle: var(--jkl-color-background-alert-error);--red-cross-path: #1b1917;width:1.5rem;height:1.5rem}.jkl-icon-red-cross path{fill:var(--red-cross-path)}.jkl-icon-red-cross circle{fill:var(--red-cross-circle)}.jkl-icon-green-check{--green-check-circle: var(--jkl-color-background-alert-success);--green-check-path: #1b1917;width:1.5rem;height:1.5rem}.jkl-icon-green-check path{fill:var(--green-check-path)}.jkl-icon-green-check circle{fill:var(--green-check-circle)}.jkl-animated-horizontal-arrows,.jkl-animated-vertical-arrows{overflow:hidden;width:var(--jkl-icon-size, 1.5rem);height:var(--jkl-icon-size, 1.5rem)}.jkl-animated-horizontal-arrows__slider,.jkl-animated-vertical-arrows__slider{display:flex;transition-timing-function:ease;transition-duration:.25s;transition-delay:calc(.25s * .3333333333);transition-property:transform}.jkl-animated-horizontal-arrows__arrow,.jkl-animated-vertical-arrows__arrow{flex-shrink:0}.jkl-animated-vertical-arrows__slider{flex-direction:column;height:calc(var(--jkl-icon-size, 1.5rem) * 2)}.jkl-animated-vertical-arrows__slider[data-show=up]{transform:translateZ(0)}.jkl-animated-vertical-arrows__slider[data-show=down]{transform:translate3d(0,-50%,0)}.jkl-animated-horizontal-arrows__slider{flex-direction:row;width:calc(var(--jkl-icon-size, 1.5rem) * 2)}.jkl-animated-horizontal-arrows__slider[data-show=left]{transform:translateZ(0)}.jkl-animated-horizontal-arrows__slider[data-show=right]{transform:translate3d(-50%,0,0)}.jkl-icons-animated__plus{transition-timing-function:cubic-bezier(0,0,.375,1.17);transition-duration:.25s;transition-property:transform;transform-origin:50% 50%}.jkl-icons-animated__plus--plus{transform:rotate(0)}.jkl-icons-animated__plus--close{transform:rotate(135deg)}.jkl-icon-button{background-color:transparent;cursor:pointer;color:inherit;position:relative;transition-property:box-shadow;padding:0;transition-timing-function:cubic-bezier(.6,.2,.35,1);transition-duration:.1s}.jkl-icon-button{outline:0;border-style:none;outline-style:none}.jkl-icon-button:active,.jkl-icon-button:hover,.jkl-icon-button:focus{outline:0;outline-style:none}@media screen and (forced-colors: active){.jkl-icon-button{outline:revert;border-style:revert;outline-style:revert}.jkl-icon-button:active,.jkl-icon-button:hover,.jkl-icon-button:focus{outline:revert;outline-style:revert}}.jkl-icon-button .jkl-icon{display:flex;align-items:center}.jkl-icon-button .jkl-icon--animated{display:revert}.jkl-icon-button:focus-visible{color:var(--jkl-color);outline:3px solid var(--jkl-color-border-action);outline-offset:3px}.jkl-icon-button:hover{color:var(--jkl-color-text-interactive-hover)}@media screen and (forced-colors: active){.jkl-icon-button{border:none;background:none}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fremtind/jokul",
3
- "version": "0.45.2",
3
+ "version": "0.46.0",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -647,5 +647,5 @@
647
647
  "@babel/preset-react"
648
648
  ]
649
649
  },
650
- "gitHead": "da97e56dd8f56136a20704b875f927b5d580e1a6"
650
+ "gitHead": "5456075ab2b4272590ab8ffc02d917f7611c8f98"
651
651
  }
@@ -148,7 +148,7 @@
148
148
  opacity: 0.15;
149
149
  }
150
150
  html[data-touchnavigation] .jkl-button.jkl-button--pressed::before {
151
- animation: cubic-bezier(0.6, 0.2, 0.35, 1) 250ms jkl-tertiary-flash-usqxaoy;
151
+ animation: cubic-bezier(0.6, 0.2, 0.35, 1) 250ms jkl-tertiary-flash-un76ry7;
152
152
  }
153
153
  .jkl-button--primary, .jkl-button--secondary, .jkl-button--ghost {
154
154
  --border-radius: 999px;
@@ -190,7 +190,7 @@ html[data-touchnavigation] .jkl-button.jkl-button--pressed::before {
190
190
  --background-color: var(--jkl-color-background-interactive-hover);
191
191
  }
192
192
 
193
- @keyframes jkl-tertiary-flash-usqxaoy {
193
+ @keyframes jkl-tertiary-flash-un76ry7 {
194
194
  0% {
195
195
  opacity: 0.5;
196
196
  scale: 1;
@@ -1 +1 @@
1
- :root,[data-density=comfortable],[data-layout-density=comfortable]{--jkl-button-padding-block:0.5rem;--jkl-button-padding-text:calc(var(--jkl-unit-10)*3);--jkl-button-padding-icon:calc(var(--jkl-unit-10)*2);--jkl-button-padding-icon-button:0.5rem;--jkl-button-teritary-padding-icon:calc(var(--jkl-unit-10)*0.5);--jkl-button-font-size:1.125rem;--jkl-button-line-height:1.75rem}@media (min-width:680px){:root,[data-density=comfortable],[data-layout-density=comfortable]{--jkl-button-font-size:1.25rem;--jkl-button-line-height:2rem}}[data-density=compact],[data-layout-density=compact]{--jkl-button-padding-block:calc(var(--jkl-unit-10)*0.5);--jkl-button-padding-text:calc(var(--jkl-unit-10)*1.5);--jkl-button-padding-icon:0.5rem;--jkl-button-padding-icon-button:calc(var(--jkl-unit-10)*0.5);--jkl-button-teritary-padding-icon:calc(var(--jkl-unit-10)*0.25);--jkl-button-padding-ghost-inline:calc(var(--jkl-unit-10)*0.5);--jkl-button-font-size:1rem;--jkl-button-line-height:1.5rem}@media (min-width:680px){[data-density=compact],[data-layout-density=compact]{--jkl-button-font-size:1rem;--jkl-button-line-height:1.5rem;--jkl-button-icon-weight:500}}.jkl-button{--jkl-icon-weight:var(--jkl-button-icon-weight,initial);--text-color:var(--jkl-color-text-default);--background-color:#0000;--border-radius:0;--border-width:0.0625rem;background-color:var(--background-color);border:unset;color:var(--text-color);cursor:pointer;display:inline-block;font-size:var(--jkl-button-font-size);font-weight:700;line-height:var(--jkl-button-line-height);text-decoration:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border-radius:var(--border-radius);max-width:100%;overflow:hidden;padding-block:var(--jkl-button-padding-block);padding-inline:var(--jkl-button-padding-text);position:relative;transition-duration:.15s;transition-property:scale;transition-timing-function:ease}.jkl-button:has(.jkl-icon:first-child){-webkit-padding-start:var(--jkl-button-padding-icon);padding-inline-start:var(--jkl-button-padding-icon)}.jkl-button:has(.jkl-icon:last-child){-webkit-padding-end:var(--jkl-button-padding-icon);padding-inline-end:var(--jkl-button-padding-icon)}.jkl-button:has(.jkl-icon:first-child):has(.jkl-icon:last-child){padding-inline:var(--jkl-button-padding-icon-button)}.jkl-button__label{align-items:center;display:flex;flex-direction:row;gap:calc(var(--jkl-unit-10)*.25);pointer-events:none;transition-duration:.25s;transition-property:translate;transition-timing-function:ease;width:100%}.jkl-button__loader{left:50%;opacity:0;pointer-events:none;position:absolute;top:50%;transition-duration:.25s;transition-property:opacity,translate;transition-timing-function:ease;translate:-50% 350%}.jkl-button__text{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.jkl-button[data-loading=true] .jkl-button__label{translate:0 -120%}.jkl-button[data-loading=true] .jkl-button__loader{opacity:1;translate:-50% -50%}.jkl-button:focus-visible{outline:3px solid var(--jkl-color-border-action);outline-offset:3px}.jkl-button:before{border-radius:9999px;display:block;height:1rem;left:var(--jkl-touch-xcoord,50%);pointer-events:none;top:var(--jkl-touch-ycoord,50%);transform-origin:center;translate:-100%,-100%;width:1rem}.jkl-button:after,.jkl-button:before{background-color:var(--text-color);content:"";opacity:0;position:absolute}.jkl-button:after{border-radius:inherit;inset:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:ease}.jkl-button:hover:after{opacity:.15}html[data-touchnavigation] .jkl-button.jkl-button--pressed:before{animation:jkl-tertiary-flash-usqxaoy .25s cubic-bezier(.6,.2,.35,1)}.jkl-button--ghost,.jkl-button--primary,.jkl-button--secondary{--border-radius:999px}.jkl-button--primary{--background-color:var(--jkl-color-background-action);--text-color:var(--jkl-color-text-on-action)}.jkl-button--secondary{border:var(--border-width) solid var(--text-color)}.jkl-button--secondary:after{content:"";inset:0;position:absolute}.jkl-button--tertiary{border-bottom:var(--border-width) solid var(--text-color);padding-inline:var(--jkl-button-teritary-padding-icon)}.jkl-button--tertiary:after{border-radius:var(--border-radius);content:"";inset:0;position:absolute}.jkl-button--tertiary:has(.jkl-icon:first-child){padding-inline:var(--jkl-button-teritary-padding-icon) calc(var(--jkl-button-teritary-padding-icon)*2)}.jkl-button--tertiary:has(.jkl-icon:last-child){padding-inline:calc(var(--jkl-button-teritary-padding-icon)*2) var(--jkl-button-teritary-padding-icon)}.jkl-button--ghost,.jkl-button--ghost:has(.jkl-icon:first-child),.jkl-button--ghost:has(.jkl-icon:last-child){transition-duration:.15s;transition-property:background-color;transition-timing-function:ease}.jkl-button--ghost:has(.jkl-icon:first-child):hover,.jkl-button--ghost:has(.jkl-icon:last-child):hover,.jkl-button--ghost:hover{--background-color:var(--jkl-color-background-interactive-hover)}@keyframes jkl-tertiary-flash-usqxaoy{0%{opacity:.5;scale:1}to{opacity:0;scale:8}}
1
+ :root,[data-density=comfortable],[data-layout-density=comfortable]{--jkl-button-padding-block:0.5rem;--jkl-button-padding-text:calc(var(--jkl-unit-10)*3);--jkl-button-padding-icon:calc(var(--jkl-unit-10)*2);--jkl-button-padding-icon-button:0.5rem;--jkl-button-teritary-padding-icon:calc(var(--jkl-unit-10)*0.5);--jkl-button-font-size:1.125rem;--jkl-button-line-height:1.75rem}@media (min-width:680px){:root,[data-density=comfortable],[data-layout-density=comfortable]{--jkl-button-font-size:1.25rem;--jkl-button-line-height:2rem}}[data-density=compact],[data-layout-density=compact]{--jkl-button-padding-block:calc(var(--jkl-unit-10)*0.5);--jkl-button-padding-text:calc(var(--jkl-unit-10)*1.5);--jkl-button-padding-icon:0.5rem;--jkl-button-padding-icon-button:calc(var(--jkl-unit-10)*0.5);--jkl-button-teritary-padding-icon:calc(var(--jkl-unit-10)*0.25);--jkl-button-padding-ghost-inline:calc(var(--jkl-unit-10)*0.5);--jkl-button-font-size:1rem;--jkl-button-line-height:1.5rem}@media (min-width:680px){[data-density=compact],[data-layout-density=compact]{--jkl-button-font-size:1rem;--jkl-button-line-height:1.5rem;--jkl-button-icon-weight:500}}.jkl-button{--jkl-icon-weight:var(--jkl-button-icon-weight,initial);--text-color:var(--jkl-color-text-default);--background-color:#0000;--border-radius:0;--border-width:0.0625rem;background-color:var(--background-color);border:unset;color:var(--text-color);cursor:pointer;display:inline-block;font-size:var(--jkl-button-font-size);font-weight:700;line-height:var(--jkl-button-line-height);text-decoration:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border-radius:var(--border-radius);max-width:100%;overflow:hidden;padding-block:var(--jkl-button-padding-block);padding-inline:var(--jkl-button-padding-text);position:relative;transition-duration:.15s;transition-property:scale;transition-timing-function:ease}.jkl-button:has(.jkl-icon:first-child){-webkit-padding-start:var(--jkl-button-padding-icon);padding-inline-start:var(--jkl-button-padding-icon)}.jkl-button:has(.jkl-icon:last-child){-webkit-padding-end:var(--jkl-button-padding-icon);padding-inline-end:var(--jkl-button-padding-icon)}.jkl-button:has(.jkl-icon:first-child):has(.jkl-icon:last-child){padding-inline:var(--jkl-button-padding-icon-button)}.jkl-button__label{align-items:center;display:flex;flex-direction:row;gap:calc(var(--jkl-unit-10)*.25);pointer-events:none;transition-duration:.25s;transition-property:translate;transition-timing-function:ease;width:100%}.jkl-button__loader{left:50%;opacity:0;pointer-events:none;position:absolute;top:50%;transition-duration:.25s;transition-property:opacity,translate;transition-timing-function:ease;translate:-50% 350%}.jkl-button__text{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.jkl-button[data-loading=true] .jkl-button__label{translate:0 -120%}.jkl-button[data-loading=true] .jkl-button__loader{opacity:1;translate:-50% -50%}.jkl-button:focus-visible{outline:3px solid var(--jkl-color-border-action);outline-offset:3px}.jkl-button:before{border-radius:9999px;display:block;height:1rem;left:var(--jkl-touch-xcoord,50%);pointer-events:none;top:var(--jkl-touch-ycoord,50%);transform-origin:center;translate:-100%,-100%;width:1rem}.jkl-button:after,.jkl-button:before{background-color:var(--text-color);content:"";opacity:0;position:absolute}.jkl-button:after{border-radius:inherit;inset:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:ease}.jkl-button:hover:after{opacity:.15}html[data-touchnavigation] .jkl-button.jkl-button--pressed:before{animation:jkl-tertiary-flash-un76ry7 .25s cubic-bezier(.6,.2,.35,1)}.jkl-button--ghost,.jkl-button--primary,.jkl-button--secondary{--border-radius:999px}.jkl-button--primary{--background-color:var(--jkl-color-background-action);--text-color:var(--jkl-color-text-on-action)}.jkl-button--secondary{border:var(--border-width) solid var(--text-color)}.jkl-button--secondary:after{content:"";inset:0;position:absolute}.jkl-button--tertiary{border-bottom:var(--border-width) solid var(--text-color);padding-inline:var(--jkl-button-teritary-padding-icon)}.jkl-button--tertiary:after{border-radius:var(--border-radius);content:"";inset:0;position:absolute}.jkl-button--tertiary:has(.jkl-icon:first-child){padding-inline:var(--jkl-button-teritary-padding-icon) calc(var(--jkl-button-teritary-padding-icon)*2)}.jkl-button--tertiary:has(.jkl-icon:last-child){padding-inline:calc(var(--jkl-button-teritary-padding-icon)*2) var(--jkl-button-teritary-padding-icon)}.jkl-button--ghost,.jkl-button--ghost:has(.jkl-icon:first-child),.jkl-button--ghost:has(.jkl-icon:last-child){transition-duration:.15s;transition-property:background-color;transition-timing-function:ease}.jkl-button--ghost:has(.jkl-icon:first-child):hover,.jkl-button--ghost:has(.jkl-icon:last-child):hover,.jkl-button--ghost:hover{--background-color:var(--jkl-color-background-interactive-hover)}@keyframes jkl-tertiary-flash-un76ry7{0%{opacity:.5;scale:1}to{opacity:0;scale:8}}