{"version":3,"file":"DateInput.cjs","sources":["../../../../src/components/date-input/DateInput.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, { forwardRef, useId, useRef, useState } from \"react\";\nimport { useMergeRefs } from \"../../utilities/index.js\";\nimport { Button } from \"../button/index.js\";\nimport { CalendarIcon } from \"../icon/index.js\";\nimport { InputGroup } from \"../input-group/index.js\";\nimport { Calendar } from \"./calendar/Calendar.js\";\nimport type { DateInputProps } from \"./types.js\";\nimport { toValidBoundary } from \"./utils.js\";\n\nexport const DateInput = forwardRef<HTMLInputElement, DateInputProps>(\n    (props, forwardedInputRef) => {\n        const {\n            max,\n            min,\n            defaultValue,\n            value,\n            name,\n            onChange,\n            onBlur,\n            onClick,\n            onFocus,\n            id,\n            \"data-testautoid\": testAutoId,\n            className = \"\",\n            label,\n            labelProps,\n            helpLabel,\n            errorLabel,\n            supportLabelProps,\n            tooltip,\n            description,\n            required,\n            disabled,\n            readOnly,\n            autoComplete,\n            inputMode,\n            ...rest\n        } = props;\n\n        // Skiller InputGroup-spesifikke props fra native input-attributter, slik\n        // at vi ikke lekker f.eks. inline, data-size og style ned på <input>.\n        const {\n            inline,\n            style,\n            \"data-size\": dataSize,\n            ...inputAttributes\n        } = rest;\n\n        const generatedCalendarId = useId();\n        const calendarId = id\n            ? `${id}-calendar`\n            : `jkl-calendar-${generatedCalendarId}`;\n\n        const isControlled = value !== undefined;\n\n        // Intern state holder kalenderen i synk. I ukontrollert modus er selve\n        // <input> ukontrollert (defaultValue), slik at react-hook-form (register)\n        // kan skrive verdien via ref-en – f.eks. ved reset() og setValue().\n        const [internalValue, setInternalValue] = useState<string>(\n            defaultValue ?? \"\",\n        );\n        const currentValue = isControlled ? value : internalValue;\n\n        // min/max kan komme inn som number eller dd.mm.yyyy (bl.a. via\n        // react-hook-forms register). Både det native feltet og kalenderen\n        // forholder seg til ISO-strenger.\n        const minValue = toValidBoundary(min);\n        const maxValue = toValidBoundary(max);\n\n        // Samle-ref: forward til forbruker / react-hook-form, og behold internt\n        // slik at vi kan lese og skrive verdien fra kalenderen.\n        const inputRef = useRef<HTMLInputElement | null>(null);\n        const setInputRef = useMergeRefs(inputRef, forwardedInputRef);\n\n        const handleInputChange = (\n            event: React.ChangeEvent<HTMLInputElement>,\n        ) => {\n            if (!isControlled) {\n                setInternalValue(event.target.value);\n            }\n            onChange?.(event);\n        };\n\n        // Skriver en ny verdi inn i det native feltet og fyrer et ekte input-event.\n        // Da flyter kalendervalg gjennom samme onChange som tastaturinntasting,\n        // slik at også react-hook-form fanger endringen.\n        const commitFromCalendar = (next: string) => {\n            const input = inputRef.current;\n            if (!input) {\n                return;\n            }\n            const setNativeValue = Object.getOwnPropertyDescriptor(\n                window.HTMLInputElement.prototype,\n                \"value\",\n            )?.set;\n            if (setNativeValue) {\n                setNativeValue.call(input, next);\n            } else {\n                input.value = next;\n            }\n            input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        };\n\n        // Leser gjeldende verdi fra feltet når kalenderen åpnes, slik at den\n        // reflekterer eventuelle programmatiske skriv (reset/setValue) i\n        // ukontrollert modus.\n        const syncCalendarFromInput = () => {\n            if (!isControlled && inputRef.current) {\n                setInternalValue(inputRef.current.value);\n            }\n        };\n\n        return (\n            <InputGroup\n                id={id}\n                className={clsx(\"jkl-date-input\", className)}\n                inline={inline}\n                style={style}\n                data-size={dataSize}\n                label={label}\n                labelProps={labelProps}\n                helpLabel={helpLabel}\n                errorLabel={errorLabel}\n                supportLabelProps={supportLabelProps}\n                tooltip={tooltip}\n                description={description}\n                render={(inputProps) => (\n                    <div\n                        className=\"jkl-date-input__wrapper\"\n                        data-invalid={inputProps[\"aria-invalid\"]}\n                    >\n                        <input\n                            ref={setInputRef}\n                            data-testid=\"jkl-date-input__input\"\n                            data-testautoid={testAutoId}\n                            data-empty={currentValue ? undefined : \"true\"}\n                            className=\"jkl-date-input__input\"\n                            name={name}\n                            type=\"date\"\n                            {...(isControlled ? { value } : { defaultValue })}\n                            max={maxValue}\n                            min={minValue}\n                            required={required}\n                            disabled={disabled}\n                            readOnly={readOnly}\n                            autoComplete={autoComplete}\n                            inputMode={inputMode}\n                            onChange={handleInputChange}\n                            onFocus={onFocus}\n                            onBlur={onBlur}\n                            onClick={(e) => {\n                                e.preventDefault();\n                                onClick?.(e);\n                            }}\n                            {...inputAttributes}\n                            {...inputProps}\n                        />\n                        <Button\n                            type=\"button\"\n                            variant=\"ghost\"\n                            icon={<CalendarIcon />}\n                            aria-label=\"Åpne kalender\"\n                            data-testid=\"jkl-date-input__trigger\"\n                            className=\"jkl-date-input__calendar-trigger\"\n                            disabled={disabled || readOnly}\n                            onClick={syncCalendarFromInput}\n                            // @ts-expect-error vet ikke hvorfor vi får typefeil her? kanskje på grunn av hvordan vi behandler polymorfisme?\n                            popovertarget={calendarId}\n                        />\n                        <Calendar\n                            data-testid=\"jkl-calendar\"\n                            id={calendarId}\n                            value={currentValue}\n                            min={minValue}\n                            max={maxValue}\n                            onChange={(e) => commitFromCalendar(e.target.value)}\n                            label={label}\n                            description={description}\n                            popover=\"auto\"\n                        />\n                    </div>\n                )}\n            />\n        );\n    },\n);\n\nDateInput.displayName = \"DateInput\";\n"],"names":["DateInput","forwardRef","props","forwardedInputRef","max","min","defaultValue","value","name","onChange","onBlur","onClick","onFocus","id","testAutoId","className","label","labelProps","helpLabel","errorLabel","supportLabelProps","tooltip","description","required","disabled","readOnly","autoComplete","inputMode","rest","inline","style","dataSize","inputAttributes","generatedCalendarId","useId","calendarId","isControlled","internalValue","setInternalValue","useState","currentValue","minValue","toValidBoundary","maxValue","inputRef","useRef","setInputRef","useMergeRefs","handleInputChange","event","target","syncCalendarFromInput","current","jsx","InputGroup","clsx","render","inputProps","jsxs","children","ref","type","e","preventDefault","Button","variant","icon","CalendarIcon","popovertarget","Calendar","next","input","setNativeValue","Object","getOwnPropertyDescriptor","window","HTMLInputElement","prototype","set","call","dispatchEvent","Event","bubbles","commitFromCalendar","popover","displayName"],"mappings":"q9DAUaA,EAAYC,EAAAA,WACrB,CAACC,EAAOC,KACJ,MACIC,IAAAA,EACAC,IAAAA,EACAC,aAAAA,EACAC,MAAAA,EACAC,KAAAA,EACAC,SAAAA,EACAC,OAAAA,EACAC,QAAAA,EACAC,QAAAA,EACAC,GAAAA,EACA,kBAAmBC,EACnBC,UAAAA,EAAY,GACZC,MAAAA,EACAC,WAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,kBAAAA,EACAC,QAAAA,EACAC,YAAAA,EACAC,SAAAA,EACAC,SAAAA,EACAC,SAAAA,EACAC,aAAAA,EACAC,UAAAA,KACGC,GACH1B,GAKA2B,OAAAA,EACAC,MAAAA,EACA,YAAaC,KACVC,GACHJ,EAEEK,EAAsBC,EAAAA,QACtBC,EAAatB,EACb,GAAGA,aACH,gBAAgBoB,IAEhBG,OAAyB,IAAV7B,GAKd8B,EAAeC,GAAoBC,EAAAA,SACtCjC,GAAgB,IAEdkC,EAAeJ,EAAe7B,EAAQ8B,EAKtCI,EAAWC,EAAAA,gBAAgBrC,GAC3BsC,EAAWD,EAAAA,gBAAgBtC,GAI3BwC,EAAWC,EAAAA,OAAgC,MAC3CC,EAAcC,EAAAA,aAAaH,EAAUzC,GAErC6C,EACFC,IAEKb,GACDE,EAAiBW,EAAMC,OAAO3C,OAElCE,IAAWwC,IA0BTE,EAAwB,MACrBf,GAAgBQ,EAASQ,SAC1Bd,EAAiBM,EAASQ,QAAQ7C,QAI1C,OACI8C,EAAAA,IAACC,EAAAA,WAAA,CACGzC,GAAAA,EACAE,UAAWwC,EAAAA,KAAK,iBAAkBxC,GAClCc,OAAAA,EACAC,MAAAA,EACA,YAAWC,EACXf,MAAAA,EACAC,WAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,kBAAAA,EACAC,QAAAA,EACAC,YAAAA,EACAkC,OAASC,GACLC,EAAAA,KAAC,MAAA,CACG3C,UAAU,0BACV,eAAc0C,EAAW,gBAEzBE,SAAA,CAAAN,EAAAA,IAAC,QAAA,CACGO,IAAKd,EACL,cAAY,wBACZ,kBAAiBhC,EACjB,aAAY0B,OAAe,EAAY,OACvCzB,UAAU,wBACVP,KAAAA,EACAqD,KAAK,UACAzB,EAAe,CAAE7B,MAAAA,GAAU,CAAED,aAAAA,GAClCF,IAAKuC,EACLtC,IAAKoC,EACLlB,SAAAA,EACAC,SAAAA,EACAC,SAAAA,EACAC,aAAAA,EACAC,UAAAA,EACAlB,SAAUuC,EACVpC,QAAAA,EACAF,OAAAA,EACAC,QAAUmD,IACNA,EAAEC,iBACFpD,IAAUmD,OAEV9B,KACAyB,IAERJ,EAAAA,IAACW,EAAAA,OAAA,CACGH,KAAK,SACLI,QAAQ,QACRC,WAAOC,EAAAA,aAAA,IACP,aAAW,gBACX,cAAY,0BACZpD,UAAU,mCACVS,SAAUA,GAAYC,EACtBd,QAASwC,EAETiB,cAAejC,IAEnBkB,EAAAA,IAACgB,EAAAA,SAAA,CACG,cAAY,eACZxD,GAAIsB,EACJ5B,MAAOiC,EACPnC,IAAKoC,EACLrC,IAAKuC,EACLlC,SAAWqD,GAzFHQ,KACxB,MAAMC,EAAQ3B,EAASQ,QACvB,IAAKmB,EACD,OAEJ,MAAMC,EAAiBC,OAAOC,yBAC1BC,OAAOC,iBAAiBC,UACxB,UACDC,IACCN,EACAA,EAAeO,KAAKR,EAAOD,GAE3BC,EAAMhE,MAAQ+D,EAElBC,EAAMS,cAAc,IAAIC,MAAM,QAAS,CAAEC,SAAS,MA2EjBC,CAAmBrB,EAAEZ,OAAO3C,OAC7CS,MAAAA,EACAM,YAAAA,EACA8D,QAAQ,gBASpCpF,EAAUqF,YAAc"}