@innspel/web 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Niclas Amundsen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,144 @@
1
+ # @innspel/web
2
+
3
+ Innsendingsflyten på web, som dialog i din egen side. Samme komponenter driver
4
+ portalen på leietakerens subdomene — én kodebase, to utganger.
5
+
6
+ ```bash
7
+ npm install @innspel/web @innspel/core react react-dom
8
+ ```
9
+
10
+ `react` og `react-dom` er peer-avhengigheter. Ingen andre.
11
+
12
+ ## Quickstart
13
+
14
+ ```ts
15
+ import { mount } from '@innspel/web';
16
+
17
+ const innspel = mount(document.getElementById('innspel')!, {
18
+ baseUrl: 'https://api.innspel.example',
19
+ tenantKey: 'ik_pub_xxxxxxxx', // offentlig SDK-nøkkel fra panelet
20
+ identityProvider: hentFeedbackToken, // eller null = anonym modus
21
+ appVersion: '2.4.1',
22
+ });
23
+ innspel.bindTrigger(document.getElementById('send-innspill')!);
24
+ ```
25
+
26
+ Det er hele veien til første innsending. Målemodellens hendelser (åpnet → spor valgt
27
+ → sendt) går til plattformens eget mottak som standard — anonymt, aldri tekst, aldri
28
+ en tredjepart. `telemetry: false` skrur det av; et eget objekt med `emit(e)` erstatter
29
+ det. Knappen er din (aldri en flytende), og
30
+ `bindTrigger` gir den `aria-haspopup="dialog"` og fører fokus tilbake når
31
+ dialogen lukkes.
32
+
33
+ ### Med React
34
+
35
+ ```tsx
36
+ import { init } from '@innspel/core';
37
+ import { createStorage, InnspelProvider, useInnspel, webKontekst } from '@innspel/web';
38
+
39
+ const innspel = init({
40
+ baseUrl: 'https://api.innspel.example',
41
+ tenantKey: 'ik_pub_xxxxxxxx',
42
+ identityProvider: hentFeedbackToken,
43
+ storage: createStorage(), // offline-køen i localStorage
44
+ context: webKontekst({ appVersion: '2.4.1' }), // web, nettleser, språk — aldri mer
45
+ });
46
+
47
+ export default () => (
48
+ <InnspelProvider client={innspel} tenantName="Leietakeren">
49
+ <MinApp />
50
+ </InnspelProvider>
51
+ );
52
+
53
+ // Hvor som helst under provideren:
54
+ const { open } = useInnspel();
55
+ <button onClick={() => open({ screen: '/dorlista' })}>Send innspill</button>;
56
+ ```
57
+
58
+ `screen` er URL-stien uten query string og hash. Utelater du den, brukes den
59
+ gjeldende stien. Origins registreres på produktet i panelet (K3) — se
60
+ [integrasjonsguiden](../docs/sdk/README.md).
61
+
62
+ ## Hva innsenderen møter
63
+
64
+ | Skjerm | Hva |
65
+ |---|---|
66
+ | Første valg | «Noe virker ikke» eller «Jeg ønsker meg noe». Aldri et tredje. |
67
+ | Kjente feil | I feilsporet **før** feltet, filtrert på stien. Tre svar: «Ja, jeg også», «Ligner, men ikke helt», «Nei, det er noe annet». |
68
+ | Feltet | Ett tekstfelt. Send fra N tegn, Ctrl+Enter sender. Konteksten som legges ved — side, nettleser, språk, SDK, appversjon — er synlig og kan fjernes linje for linje. |
69
+ | Mønstervarsel | E-post, telefon, kortnummer, IP, nøkler: dialogen spør, og fjerner **aldri** noe selv. |
70
+ | Skjermbilde | Valgfritt, to veier: «Ta bilde av siden» (rendret i nettleseren, se under) eller «Last opp bilde». Maskeres før noe sendes. |
71
+ | Kvittering | Lover noe konkret, per spor, med saksnummer. «Sendt anonymt» uten innlogging. |
72
+ | Mine innspill | Status, løfte og svaret ditt under saken. Det som venter på nett står øverst. |
73
+
74
+ ## Skjermbilde
75
+
76
+ «Ta bilde av siden» rendres på klienten med pakkens egen renderer (SVG
77
+ `foreignObject`, ingen avhengigheter): DOM-en klones, dialogen selv utelates,
78
+ og ingenting fra siden sendes noe sted før innsenderen har sett og godkjent
79
+ bildet. Eksterne bilder blir nøytrale flater; webfonter faller tilbake på
80
+ systemfont.
81
+
82
+ **Merk det som aldri skal med:**
83
+
84
+ ```html
85
+ <div data-innspel-private>Kari Nordmann · konto 1234</div>
86
+ ```
87
+
88
+ ```tsx
89
+ <InnspelPrivate><span>{bruker.navn}</span></InnspelPrivate>
90
+ ```
91
+
92
+ Innholdet fjernes fra klonen FØR rendring og feltet maskeres i bitmapen —
93
+ «Maskert av appen», og penselen kan ikke oppheve det.
94
+
95
+ Vil du bruke en annen renderer (f.eks. html-to-image), gi en adapter:
96
+ `<InnspelProvider screenshot={{ capture: (rot) => … }}>` eller `mount(el, { screenshot })`.
97
+ `screenshot: false` fjerner «Ta bilde av siden»; «Last opp bilde» finnes likevel.
98
+ Steget finnes ikke i det hele tatt når leietakeren har skjermbilde av.
99
+
100
+ En opplastet fil dekodes og re-enkodes i nettleseren, så EXIF er borte før
101
+ opplasting. Plattformen re-enkoder igjen og fjerner EXIF på nytt.
102
+
103
+ ## Tema
104
+
105
+ Alt visuelt er CSS-variabler med prefiks `--innspel-`, målt mot WCAG AA i begge
106
+ paletter. Stilarket legges inn i `<head>` én gang; har siden en `style-src` uten
107
+ `'unsafe-inline'`, importer CSS-en selv og sett `injectStyles: false`:
108
+
109
+ ```ts
110
+ import '@innspel/web/style.css'; // stilarket som fil, via bundleren din
111
+ import { css } from '@innspel/web'; // eller det samme stilarket som tekst
112
+ ```
113
+
114
+ Overstyr en farge ved å sette variabelen på din egen rot:
115
+
116
+ ```css
117
+ :root { --innspel-color-action-primary: #0A6673; }
118
+ ```
119
+
120
+ `colorScheme="dark"` gir den mørke paletten. Under bruddpunktet
121
+ (`--innspel-layout-breakpoint`) er dialogen et bunnark, over er den en modal.
122
+
123
+ ## Utløpt innlogging
124
+
125
+ Tokenet lever 15 minutter. Går det ut mens innsenderen skriver, sier dialogen
126
+ det og beholder teksten. Gi `onIdentityExpired(utkast)` for å ta innsenderen til
127
+ ny innlogging og `open({ draft })` etterpå; gi `onSendAnonymously` for å la henne
128
+ sende anonymt i stedet (bytt klienten til `identityProvider: null`).
129
+
130
+ ## Tilgjengelighet
131
+
132
+ `role="dialog"`, fokusfelle, ESC lukker, vertens innhold er `inert` bak
133
+ dialogen, kvitteringen annonseres, og hver trykkflate er minst 48 CSS-piksler.
134
+ axe-core kjøres mot hvert steg i testene; kontrasten måles i tema-generatoren.
135
+
136
+ ## Versjoner
137
+
138
+ Semver fra `0.1.0`. **Før `1.0.0` kan en minor bryte** — pin en eksakt versjon
139
+ om du trenger ro.
140
+
141
+ ## Lisens
142
+
143
+ MIT. Klientpakkene er permissivt lisensiert fordi koden kjører hos deg og må
144
+ kunne leses og granskes der. Plattformen bak — API, panel og drift — er det ikke.
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * Merk det som aldri skal være med på et skjermbilde (DD-39): et navn, et
4
+ * kontonummer, en samtale. Innholdet fjernes fra klonen FØR rendring og feltet
5
+ * maskeres i bitmapen — merket «Maskert av appen», og penselen kan ikke oppheve
6
+ * det. Din kode er sannheten, ikke brukerens presisjon.
7
+ *
8
+ * Utenfor React er det bare attributtet: `<div data-innspel-private>…</div>`.
9
+ *
10
+ * Elementet må ha en boks (ingen `display: contents`), ellers er det ingenting å
11
+ * måle. Standard er en `div`; `inline` gir en `span`.
12
+ */
13
+ export declare function InnspelPrivate({ children, inline, className }: {
14
+ children?: ReactNode;
15
+ inline?: boolean;
16
+ className?: string;
17
+ }): import("react").JSX.Element;
@@ -0,0 +1,50 @@
1
+ import type { InnspelClient } from '@innspel/core';
2
+ import { type ReactNode } from 'react';
3
+ import type { ScreenshotAdapter } from './skjermbilde/typer.js';
4
+ import { type Utkast, type ÅpneOpsjoner } from './widget/Widget.js';
5
+ interface InnspelKontekst {
6
+ client: InnspelClient;
7
+ /** Åpner dialogen. Samme som `client.openFeedback()`. */
8
+ open: (options?: ÅpneOpsjoner) => Promise<void>;
9
+ close: () => void;
10
+ isOpen: boolean;
11
+ }
12
+ export interface InnspelProviderProps {
13
+ client: InnspelClient;
14
+ children?: ReactNode;
15
+ /** Navnet som står på svaret i «Mine innspill» og i «Logg inn på nytt hos …» — leietakerens, ikke Innspels. */
16
+ tenantName?: string;
17
+ /** Palett for dialogen. Standard er lys; `dark` setter `data-innspel-theme="dark"` på dialogen. */
18
+ colorScheme?: 'dark' | 'light';
19
+ /**
20
+ * Fangst av siden for «Ta bilde av siden». Standard er pakkens egen renderer
21
+ * (SVG foreignObject, null avhengigheter). `false` fjerner knappen; «Last opp
22
+ * bilde» finnes likevel når leietakeren har skjermbilde på. Steget finnes ikke
23
+ * i det hele tatt når `screenshotsEnabled` er av (DD-26, K18).
24
+ */
25
+ screenshot?: ScreenshotAdapter | false;
26
+ /** Stilarket legges inn i `<head>` én gang. `false` når verten importerer CSS-en selv. */
27
+ injectStyles?: boolean;
28
+ onIdentityExpired?: (utkast: Utkast) => void;
29
+ onSendAnonymously?: () => void;
30
+ }
31
+ /**
32
+ * Pakk siden i denne, og dialogen finnes. Provideren registrerer visningen hos
33
+ * kjernen (så `client.openFeedback()` virker også utenfor React), holder åpen/
34
+ * lukket, og rendrer dialogen sist i treet. Vertens knapp er vertens (DD-21) —
35
+ * pakken tegner aldri en flytende knapp.
36
+ *
37
+ * @example
38
+ * ```tsx
39
+ * const innspel = init({ …, context: webKontekst({ appVersion: '2.4.1' }), storage: createStorage() });
40
+ * <InnspelProvider client={innspel}><App /></InnspelProvider>
41
+ * ```
42
+ */
43
+ export declare function InnspelProvider({ client, children, tenantName, colorScheme, screenshot, injectStyles, onIdentityExpired, onSendAnonymously }: InnspelProviderProps): import("react").JSX.Element;
44
+ /**
45
+ * Klienten og `open` fra nærmeste {@link InnspelProvider}. Kaster utenfor
46
+ * provideren: en knapp som stille ikke gjør noe er verre enn en feil under
47
+ * utvikling (tech-decisions.md, «Feil bruk feiler høyt og tidlig»).
48
+ */
49
+ export declare function useInnspel(): InnspelKontekst;
50
+ export {};
@@ -0,0 +1,9 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),L=require("@innspel/core"),gn=require("react-dom/client"),f=require("react");var mn=async(e,n)=>{const t=typeof n=="function"?await n(e):n;if(t)return e.scheme==="bearer"?`Bearer ${t}`:e.scheme==="basic"?`Basic ${btoa(t)}`:t},kn={bodySerializer:e=>JSON.stringify(e,(n,t)=>typeof t=="bigint"?t.toString():t)},vn=e=>{switch(e){case"label":return".";case"matrix":return";";case"simple":return",";default:return"&"}},bn=e=>{switch(e){case"form":return",";case"pipeDelimited":return"|";case"spaceDelimited":return"%20";default:return","}},yn=e=>{switch(e){case"label":return".";case"matrix":return";";case"simple":return",";default:return"&"}},Re=({allowReserved:e,explode:n,name:t,style:s,value:i})=>{if(!n){const d=(e?i:i.map(c=>encodeURIComponent(c))).join(bn(s));switch(s){case"label":return`.${d}`;case"matrix":return`;${t}=${d}`;case"simple":return d;default:return`${t}=${d}`}}const a=vn(s),l=i.map(d=>s==="label"||s==="simple"?e?d:encodeURIComponent(d):ie({allowReserved:e,name:t,value:d})).join(a);return s==="label"||s==="matrix"?a+l:l},ie=({allowReserved:e,name:n,value:t})=>{if(t==null)return"";if(typeof t=="object")throw new Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${n}=${e?t:encodeURIComponent(t)}`},Le=({allowReserved:e,explode:n,name:t,style:s,value:i,valueOnly:a})=>{if(i instanceof Date)return a?i.toISOString():`${t}=${i.toISOString()}`;if(s!=="deepObject"&&!n){let c=[];Object.entries(i).forEach(([p,u])=>{c=[...c,p,e?u:encodeURIComponent(u)]});const h=c.join(",");switch(s){case"form":return`${t}=${h}`;case"label":return`.${h}`;case"matrix":return`;${t}=${h}`;default:return h}}const l=yn(s),d=Object.entries(i).map(([c,h])=>ie({allowReserved:e,name:s==="deepObject"?`${t}[${c}]`:c,value:h})).join(l);return s==="label"||s==="matrix"?l+d:d},xn=/\{[^{}]+\}/g,jn=({path:e,url:n})=>{let t=n;const s=n.match(xn);if(s)for(const i of s){let a=!1,l=i.substring(1,i.length-1),d="simple";l.endsWith("*")&&(a=!0,l=l.substring(0,l.length-1)),l.startsWith(".")?(l=l.substring(1),d="label"):l.startsWith(";")&&(l=l.substring(1),d="matrix");const c=e[l];if(c==null)continue;if(Array.isArray(c)){t=t.replace(i,Re({explode:a,name:l,style:d,value:c}));continue}if(typeof c=="object"){t=t.replace(i,Le({explode:a,name:l,style:d,value:c,valueOnly:!0}));continue}if(d==="matrix"){t=t.replace(i,`;${ie({name:l,value:c})}`);continue}const h=encodeURIComponent(d==="label"?`.${c}`:c);t=t.replace(i,h)}return t},wn=({baseUrl:e,path:n,query:t,querySerializer:s,url:i})=>{const a=i.startsWith("/")?i:`/${i}`;let l=(e??"")+a;n&&(l=jn({path:n,url:l}));let d=t?s(t):"";return d.startsWith("?")&&(d=d.substring(1)),d&&(l+=`?${d}`),l};function Ee(e){const n=e.body!==void 0;if(n&&e.bodySerializer)return"serializedBody"in e?e.serializedBody!==void 0&&e.serializedBody!==""?e.serializedBody:null:e.body!==""?e.body:null;if(n)return e.body}var Be=({parameters:e={},...n}={})=>s=>{const i=[];if(s&&typeof s=="object")for(const a in s){const l=s[a];if(l==null)continue;const d=e[a]||n;if(Array.isArray(l)){const c=Re({allowReserved:d.allowReserved,explode:!0,name:a,style:"form",value:l,...d.array});c&&i.push(c)}else if(typeof l=="object"){const c=Le({allowReserved:d.allowReserved,explode:!0,name:a,style:"deepObject",value:l,...d.object});c&&i.push(c)}else{const c=ie({allowReserved:d.allowReserved,name:a,value:l});c&&i.push(c)}}return i.join("&")},Fn=e=>{if(!e)return"stream";const n=e.split(";")[0]?.trim();if(n){if(n.startsWith("application/json")||n.endsWith("+json"))return"json";if(n==="multipart/form-data")return"formData";if(["application/","audio/","image/","video/"].some(t=>n.startsWith(t)))return"blob";if(n.startsWith("text/"))return"text"}},Sn=(e,n)=>n?!!(e.headers.has(n)||e.query?.[n]||e.headers.get("Cookie")?.includes(`${n}=`)):!1;async function En(e){for(const n of e.security??[]){if(Sn(e,n.name))continue;const t=await mn(n,e.auth);if(!t)continue;const s=n.name??"Authorization";switch(n.in){case"query":e.query||(e.query={}),e.query[s]=t;break;case"cookie":e.headers.append("Cookie",`${s}=${t}`);break;default:e.headers.set(s,t);break}}}var Ae=e=>wn({baseUrl:e.baseUrl,path:e.path,query:e.query,querySerializer:typeof e.querySerializer=="function"?e.querySerializer:Be(e.querySerializer),url:e.url}),Te=(e,n)=>{const t={...e,...n};return t.baseUrl?.endsWith("/")&&(t.baseUrl=t.baseUrl.substring(0,t.baseUrl.length-1)),t.headers=De(e.headers,n.headers),t},An=e=>{const n=[];return e.forEach((t,s)=>{n.push([s,t])}),n},De=(...e)=>{const n=new Headers;for(const t of e){if(!t)continue;const s=t instanceof Headers?An(t):Object.entries(t);for(const[i,a]of s)if(a===null)n.delete(i);else if(Array.isArray(a))for(const l of a)n.append(i,l);else a!==void 0&&n.set(i,typeof a=="object"?JSON.stringify(a):a)}return n},ce=class{fns=[];clear(){this.fns=[]}eject(e){const n=this.getInterceptorIndex(e);this.fns[n]&&(this.fns[n]=null)}exists(e){const n=this.getInterceptorIndex(e);return!!this.fns[n]}getInterceptorIndex(e){return typeof e=="number"?this.fns[e]?e:-1:this.fns.indexOf(e)}update(e,n){const t=this.getInterceptorIndex(e);return this.fns[t]?(this.fns[t]=n,e):!1}use(e){return this.fns.push(e),this.fns.length-1}},Tn=()=>({error:new ce,request:new ce,response:new ce}),In=Be({allowReserved:!1,array:{explode:!0,style:"form"},object:{explode:!0,style:"deepObject"}}),Nn={"Content-Type":"application/json"},he=(e={})=>({...kn,headers:Nn,parseAs:"auto",querySerializer:In,...e});function Cn({onRequest:e,onSseError:n,onSseEvent:t,responseTransformer:s,responseValidator:i,sseDefaultRetryDelay:a,sseMaxRetryAttempts:l,sseMaxRetryDelay:d,sseSleepFn:c,url:h,...p}){let u;const k=c??(y=>new Promise(x=>setTimeout(x,y)));return{stream:async function*(){let y=a??3e3,x=0;const F=p.signal??new AbortController().signal;for(;!F.aborted;){x++;const S=p.headers instanceof Headers?p.headers:new Headers(p.headers);u!==void 0&&S.set("Last-Event-ID",u);try{const I={redirect:"follow",...p,body:p.serializedBody,headers:S,signal:F};let T=new Request(h,I);e&&(T=await e(h,I));const E=await(p.fetch??globalThis.fetch)(T);if(!E.ok)throw new Error(`SSE failed: ${E.status} ${E.statusText}`);if(!E.body)throw new Error("No body in SSE response");const g=E.body.pipeThrough(new TextDecoderStream).getReader();let m="";const A=()=>{try{g.cancel()}catch{}};F.addEventListener("abort",A);try{for(;;){const{done:M,value:N}=await g.read();if(M)break;m+=N,m=m.replace(/\r\n?/g,`
2
+ `);const z=m.split(`
3
+
4
+ `);m=z.pop()??"";for(const D of z){const G=D.split(`
5
+ `),j=[];let $;for(const R of G)if(R.startsWith("data:"))j.push(R.replace(/^data:\s*/,""));else if(R.startsWith("event:"))$=R.replace(/^event:\s*/,"");else if(R.startsWith("id:"))u=R.replace(/^id:\s*/,"");else if(R.startsWith("retry:")){const Y=Number.parseInt(R.replace(/^retry:\s*/,""),10);Number.isNaN(Y)||(y=Y)}let O,H=!1;if(j.length){const R=j.join(`
6
+ `);try{O=JSON.parse(R),H=!0}catch{O=R}}H&&(i&&await i(O),s&&(O=await s(O))),t?.({data:O,event:$,id:u,retry:y}),j.length&&(yield O)}}}finally{F.removeEventListener("abort",A),g.releaseLock()}break}catch(I){if(n?.(I),l!==void 0&&x>=l)break;const T=Math.min(y*2**(x-1),d??3e4);await k(T)}}}()}}var Me=(e={})=>{let n=Te(he(),e);const t=()=>({...n}),s=p=>(n=Te(n,p),t()),i=Tn(),a=async p=>{const u={...n,...p,fetch:p.fetch??n.fetch??globalThis.fetch,headers:De(n.headers,p.headers),serializedBody:void 0};u.security&&await En(u),u.requestValidator&&await u.requestValidator(u),u.body!==void 0&&u.bodySerializer&&(u.serializedBody=u.bodySerializer(u.body)),(u.body===void 0||u.serializedBody==="")&&u.headers.delete("Content-Type");const k=u,b=Ae(k);return{opts:k,url:b}},l=async p=>{const u=p.throwOnError??n.throwOnError,k=p.responseStyle??n.responseStyle;let b,v;try{const{opts:y,url:x}=await a(p),F={redirect:"follow",...y,body:Ee(y)};b=new Request(x,F);for(const E of i.request.fns)E&&(b=await E(b,y));const S=y.fetch;v=await S(b);for(const E of i.response.fns)E&&(v=await E(v,b,y));const I={request:b,response:v};if(v.ok){const E=(y.parseAs==="auto"?Fn(v.headers.get("Content-Type")):y.parseAs)??"json";if(v.status===204||v.headers.get("Content-Length")==="0"){let m;switch(E){case"arrayBuffer":case"blob":case"text":m=await v[E]();break;case"formData":m=new FormData;break;case"stream":m=v.body;break;default:m={};break}return y.responseStyle==="data"?m:{data:m,...I}}let g;switch(E){case"arrayBuffer":case"blob":case"formData":case"text":g=await v[E]();break;case"json":{const m=await v.text();g=m?JSON.parse(m):{};break}case"stream":return y.responseStyle==="data"?v.body:{data:v.body,...I}}return E==="json"&&(y.responseValidator&&await y.responseValidator(g),y.responseTransformer&&(g=await y.responseTransformer(g))),y.responseStyle==="data"?g:{data:g,...I}}const T=await v.text();let C;try{C=JSON.parse(T)}catch{}throw C??T}catch(y){let x=y;for(const F of i.error.fns)F&&(x=await F(x,v,b,p));if(x=x||{},u)throw x;return k==="data"?void 0:{error:x,request:b,response:v}}},d=p=>u=>l({...u,method:p}),c=p=>async u=>{const{opts:k,url:b}=await a(u);return Cn({...k,body:k.body,method:p,onRequest:async(v,y)=>{let x=new Request(v,y);for(const F of i.request.fns)F&&(x=await F(x,k));return x},serializedBody:Ee(k),url:b})};return{buildUrl:p=>Ae({...n,...p}),connect:d("CONNECT"),delete:d("DELETE"),get:d("GET"),getConfig:t,head:d("HEAD"),interceptors:i,options:d("OPTIONS"),patch:d("PATCH"),post:d("POST"),put:d("PUT"),request:l,setConfig:s,sse:{connect:c("CONNECT"),delete:c("DELETE"),get:c("GET"),head:c("HEAD"),options:c("OPTIONS"),patch:c("PATCH"),post:c("POST"),put:c("PUT"),trace:c("TRACE")},trace:d("TRACE")}},$n=Me(he()),Rn=e=>(e.client??$n).post({security:[{name:"X-Innspel-Tenant-Key",type:"apiKey"},{key:"FeedbackTokenAuth",scheme:"bearer",type:"http"}],url:"/v1/ingest/events",...e,headers:{"Content-Type":"application/json",...e.headers}}),Ln="0.6.0",pe=100,Bn=new Set(["submission_sent","submission_failed","followup_answered","task_completed"]);function Dn(e){if(typeof e?.baseUrl!="string"||e.baseUrl.length===0)throw new TypeError("[innspel] createIngestTelemetry: baseUrl mangler. Se README.md.");if(typeof e.tenantKey!="string"||e.tenantKey.length===0)throw new TypeError("[innspel] createIngestTelemetry: tenantKey mangler. Se README.md.");if(typeof e.platform!="string"||e.platform.length===0)throw new TypeError("[innspel] createIngestTelemetry: platform mangler (ios · android · web · …).");const n=Me(he({baseUrl:e.baseUrl,...e.fetch?{fetch:e.fetch}:{}})),t=e.flushAfterMs??2e3,s=Math.min(e.maxBatch??25,pe);let i=[],a;async function l(){if(a!==void 0&&(clearTimeout(a),a=void 0),i.length===0)return;const d=i.slice(0,pe);i=i.slice(pe);try{await Rn({client:n,headers:{"X-Innspel-Tenant-Key":e.tenantKey},body:{events:d,platform:e.platform,sdkVersion:Ln,...e.appVersion?{appVersion:e.appVersion}:{}}})}catch{}i.length>0&&await l()}return{emit(d){if(i.push(Mn(d)),i.length>=s||Bn.has(d.name)||t===0){l();return}a??=setTimeout(()=>{l()},t)},flush:l}}function Mn(e){const n=new Date().toISOString();switch(e.name){case"track_selected":return{name:e.name,at:n,type:e.type};case"known_issue_shown":return{name:e.name,at:n,count:Math.max(0,Math.min(3,e.count))};case"submission_sent":return{name:e.name,at:n,type:e.type,hasAttachment:e.hasAttachment,offlineQueued:e.offlineQueued};case"submission_failed":return{name:e.name,at:n,reason:On(e.reason)};case"task_completed":return{name:e.name,at:n,outcome:e.outcome};default:return{name:e.name,at:n}}}function On(e){const n=e.toLowerCase();return n.includes("network")||n.includes("offline")||n.includes("fetch")?"network":n.includes("rate")||n.includes("429")?"rate_limited":n.includes("unauth")||n.includes("token")||n.includes("401")?"unauthorized":n.includes("valid")||n.includes("text_")||n.includes("field")||n.includes("correlation")||n.includes("attachment")||n.includes("screenshot")?"validation":n.includes("server")||n.includes("internal")||n.includes("50")?"server":"unknown"}const ge="data-innspel-private",me="data-innspel-widget",Vn=new Set(["SCRIPT","NOSCRIPT","STYLE","LINK","META","TEMPLATE","IFRAME","OBJECT","EMBED","VIDEO","AUDIO"]);function Oe(e,n){const t=[],s=[];return{klon:Ve(e,e,t,n,s),automasker:t,tekstRekter:s}}function Ve(e,n,t,s,i){if(e.nodeType===Node.TEXT_NODE){for(const d of zn(e,s))i.push(d);return e.cloneNode(!1)}if(e.nodeType!==Node.ELEMENT_NODE)return null;const a=e;if(Vn.has(a.tagName)||a.hasAttribute(me))return null;const l=a.cloneNode(!1);if(Ie(a,l),l.removeAttribute("id"),a.hasAttribute(ge)){const d=Pe(a.getBoundingClientRect(),s);return d&&t.push(d),l.textContent="",l.style.setProperty("color","transparent"),l.style.setProperty("background","var(--innspel-screen-auto-mask-fill, #101114)"),l}if(a instanceof HTMLImageElement)return Pn(a,l);if(a instanceof HTMLCanvasElement)try{const d=a.toDataURL(),c=document.createElement("img");return Ie(a,c),c.setAttribute("src",d),c}catch{return re(l)}if(a instanceof HTMLTextAreaElement)return l.textContent=a.value,l;if(a instanceof HTMLInputElement)return a.type==="password"?l.setAttribute("value","•".repeat(a.value.length)):a.type==="checkbox"||a.type==="radio"?a.checked?l.setAttribute("checked",""):l.removeAttribute("checked"):l.setAttribute("value",a.value),l;if(a instanceof HTMLSelectElement)for(const[d,c]of Array.from(a.options).entries()){const h=l.children[d];h&&(c.selected?h.setAttribute("selected",""):h.removeAttribute("selected"))}for(const d of Array.from(a.childNodes)){const c=Ve(d,n,t,s,i);c&&l.appendChild(c)}return l}function Pn(e,n){try{if(!e.complete||e.naturalWidth===0)return re(n);const t=document.createElement("canvas");t.width=e.naturalWidth,t.height=e.naturalHeight;const s=t.getContext("2d");return s?(s.drawImage(e,0,0),n.setAttribute("src",t.toDataURL()),n.removeAttribute("srcset"),n.removeAttribute("loading"),n):re(n)}catch{return re(n)}}function re(e){const n=document.createElement("div");return n.setAttribute("style",e.getAttribute("style")??""),n.style.setProperty("background","var(--innspel-color-neutral-bg, #EEF0F3)"),n.style.setProperty("display","inline-block"),n}function Ie(e,n){const t=getComputedStyle(e),s=[];for(let i=0;i<t.length;i++){const a=t[i],l=t.getPropertyValue(a);l&&s.push(`${a}:${l}`)}s.length&&n.setAttribute("style",s.join(";")),n.removeAttribute("class")}function zn(e,n){if(!e.data.trim()||typeof document.createRange!="function")return[];const t=document.createRange();if(t.selectNodeContents(e),typeof t.getClientRects!="function")return[];const s=[];for(const i of Array.from(t.getClientRects())){const a=Pe(i,n);a&&s.push(a)}return s}function Pe(e,n){const t=Math.max(0,e.left),s=Math.max(0,e.top),i=Math.min(n.width,e.right),a=Math.min(n.height,e.bottom);return i<=t||a<=s?null:{x:t,y:s,width:i-t,height:a-s}}function Un(e,n,t,s){e.setAttribute("xmlns","http://www.w3.org/1999/xhtml");const i=new XMLSerializer().serializeToString(e);return`<svg xmlns="http://www.w3.org/2000/svg" width="${n.width}" height="${n.height}"><foreignObject width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="width:${n.width}px;height:${n.height}px;overflow:hidden;background:${s}"><div xmlns="http://www.w3.org/1999/xhtml" style="transform:translate(${-t.x}px,${-t.y}px)">${i}</div></div></foreignObject></svg>`}function Hn(e,n,t=4096){return Math.min(n,t/Math.max(e.width,e.height,1))}async function Kn(e,n,t){const s=new Image;s.decoding="sync";const i=new Promise((d,c)=>{s.onload=()=>d(),s.onerror=()=>c(new Error("kunne ikke rendre siden"))});s.src=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`,await i;const a=document.createElement("canvas");a.width=Math.round(n.width*t),a.height=Math.round(n.height*t);const l=a.getContext("2d");if(!l)throw new Error("canvas er ikke tilgjengelig");return l.drawImage(s,0,0,a.width,a.height),a}const Ne=(e,n)=>({x:Math.floor(e.x*n),y:Math.floor(e.y*n),width:Math.ceil(e.width*n),height:Math.ceil(e.height*n)});async function ze(e=document.body){const n={width:window.innerWidth,height:window.innerHeight},t={x:window.scrollX,y:window.scrollY},{klon:s,automasker:i,tekstRekter:a}=Oe(e,n),l=getComputedStyle(document.body).backgroundColor||"#fff",d=Un(s,n,t,l),c=Hn(n,window.devicePixelRatio||1),h=await Kn(d,n,c);return{bilde:h,width:h.width,height:h.height,automasker:i.map(p=>Ne(p,c)),tekstRekter:a.map(p=>Ne(p,c)),kilde:"side"}}const Ue={capture:e=>ze(e)},He=':root{--innspel-color-bg: #F6F7F9;--innspel-color-surface: #FFFFFF;--innspel-color-surface-raised: #EDEFF3;--innspel-color-border: #D2D7DE;--innspel-color-border-strong: #B9C0C9;--innspel-color-border-interactive: #6F7883;--innspel-color-text-primary: #14181D;--innspel-color-text-secondary: #454D57;--innspel-color-text-muted: #5C6470;--innspel-color-text-disabled: #9AA2AD;--innspel-color-action-primary: #0A6673;--innspel-color-on-action-primary: #FFFFFF;--innspel-color-action-secondary-border: #6F7883;--innspel-color-action-secondary-text: #14181D;--innspel-color-brand: #0A6673;--innspel-color-on-brand: #FFFFFF;--innspel-color-brand-fill: #0A6673;--innspel-color-on-brand-fill: #FFFFFF;--innspel-color-brand-bg: #E0F0F2;--innspel-color-danger: #B3001B;--innspel-color-danger-fill: #B3001B;--innspel-color-on-danger-fill: #FFFFFF;--innspel-color-danger-bg: #FCE8EA;--innspel-color-success: #04693C;--innspel-color-on-success: #FFFFFF;--innspel-color-success-bg: #E4F4EC;--innspel-color-warning: #7A5200;--innspel-color-on-warning: #FFFFFF;--innspel-color-warning-bg: #FBF1DE;--innspel-color-info: #00588F;--innspel-color-on-info: #FFFFFF;--innspel-color-info-bg: #E4F0F8;--innspel-color-neutral: #5C6470;--innspel-color-on-neutral: #FFFFFF;--innspel-color-neutral-bg: #EEF0F3;--innspel-color-scrim: rgba(10, 14, 18, .45);--innspel-space-xs: 4px;--innspel-space-sm: 8px;--innspel-space-md: 16px;--innspel-space-lg: 24px;--innspel-space-xl: 32px;--innspel-space-xxl: 48px;--innspel-radius-sm: 6px;--innspel-radius-md: 8px;--innspel-radius-lg: 12px;--innspel-radius-pill: 999px;--innspel-font-display: 40px;--innspel-font-h1: 24px;--innspel-font-h2: 21px;--innspel-font-h3: 18px;--innspel-font-body: 16px;--innspel-font-small: 13px;--innspel-font-tiny: 11px;--innspel-line-height-display: 48px;--innspel-line-height-h1: 30px;--innspel-line-height-h2: 27px;--innspel-line-height-h3: 24px;--innspel-line-height-body: 24px;--innspel-line-height-small: 18px;--innspel-line-height-tiny: 16px;--innspel-weight-regular: 400;--innspel-weight-medium: 500;--innspel-weight-semibold: 600;--innspel-weight-bold: 700;--innspel-family-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, system-ui, sans-serif;--innspel-motion-fast: .12s;--innspel-motion-base: .2s;--innspel-motion-slow: .32s;--innspel-icon-inline: 20px;--innspel-icon-minste: 16px;--innspel-layout-touch: 48px;--innspel-layout-screen-padding: 24px;--innspel-layout-hairline: 1px;--innspel-layout-breakpoint: 768px;--innspel-layout-breakpoint-smal: 900px;--innspel-layout-content-width: 1120px;--innspel-layout-reading-width: 720px;--innspel-screen-brush-fill: #E5007D;--innspel-screen-auto-mask-fill: #101114;--innspel-screen-auto-mask-stroke: #E5007D;--innspel-screen-preview-backdrop: #000000;--innspel-screen-brush-width: 28;--innspel-screen-text-blur-radius: 24}[data-innspel-theme=dark]{--innspel-color-bg: #111417;--innspel-color-surface: #1A1E22;--innspel-color-surface-raised: #232830;--innspel-color-border: #2E343B;--innspel-color-border-strong: #3D444D;--innspel-color-border-interactive: #7C8894;--innspel-color-text-primary: #F2F4F6;--innspel-color-text-secondary: #B4BCC5;--innspel-color-text-muted: #8D96A1;--innspel-color-text-disabled: #5A626B;--innspel-color-action-primary: #5AD3E2;--innspel-color-on-action-primary: #04252A;--innspel-color-action-secondary-border: #7C8894;--innspel-color-action-secondary-text: #F2F4F6;--innspel-color-brand: #5AD3E2;--innspel-color-on-brand: #04252A;--innspel-color-brand-fill: #0E7C8C;--innspel-color-on-brand-fill: #FFFFFF;--innspel-color-brand-bg: #0C2A30;--innspel-color-danger: #FF7A8C;--innspel-color-danger-fill: #C4001F;--innspel-color-on-danger-fill: #FFFFFF;--innspel-color-danger-bg: #2C1116;--innspel-color-success: #3ED88A;--innspel-color-on-success: #062015;--innspel-color-success-bg: #0E2A1E;--innspel-color-warning: #FFC24D;--innspel-color-on-warning: #2A1C02;--innspel-color-warning-bg: #2C2107;--innspel-color-info: #5CC0FF;--innspel-color-on-info: #04222F;--innspel-color-info-bg: #0E2531;--innspel-color-neutral: #A3ACB6;--innspel-color-on-neutral: #111417;--innspel-color-neutral-bg: #242A31;--innspel-color-scrim: rgba(0, 0, 0, .72)}',Ke=".innspel-rot{font-family:var(--innspel-family-base);font-size:var(--innspel-font-body);line-height:var(--innspel-line-height-body);color:var(--innspel-color-text-primary);box-sizing:border-box}.innspel-rot *,.innspel-rot *:before,.innspel-rot *:after{box-sizing:inherit}.innspel-rot button,.innspel-rot textarea,.innspel-rot input{font:inherit;color:inherit}.innspel-rot :focus-visible{outline:calc(2 * var(--innspel-layout-hairline)) solid var(--innspel-color-text-primary);outline-offset:var(--innspel-space-xs)}.innspel-scrim{position:fixed;inset:0;background:var(--innspel-color-scrim);z-index:2147483000;display:flex;align-items:flex-start;justify-content:center;padding:var(--innspel-space-xl) var(--innspel-space-md)}.innspel-scrim[data-form=bunnark]{align-items:flex-end;padding:0}.innspel-dialog{background:var(--innspel-color-bg);color:var(--innspel-color-text-primary);border:var(--innspel-layout-hairline) solid var(--innspel-color-border-strong);border-radius:var(--innspel-radius-lg);width:100%;max-width:calc(9 * var(--innspel-layout-touch) + 2 * var(--innspel-space-md));max-height:100%;display:flex;flex-direction:column;overflow:hidden}.innspel-scrim[data-form=bunnark] .innspel-dialog{max-width:none;max-height:88%;border-radius:calc(2 * var(--innspel-radius-lg)) calc(2 * var(--innspel-radius-lg)) 0 0;border-bottom:none}.innspel-dialog-hode{display:flex;align-items:center;justify-content:space-between;padding:var(--innspel-space-sm) var(--innspel-space-sm) var(--innspel-space-sm) var(--innspel-space-md);border-bottom:var(--innspel-layout-hairline) solid var(--innspel-color-border);min-height:var(--innspel-layout-touch)}.innspel-dialog-tittel{font-size:var(--innspel-font-small);color:var(--innspel-color-text-secondary)}.innspel-handtak{width:var(--innspel-layout-touch);height:var(--innspel-space-xs);border-radius:var(--innspel-radius-pill);background:var(--innspel-color-border-interactive);margin:0 auto}.innspel-dialog-kropp{flex:1;overflow-y:auto;padding:var(--innspel-space-md);display:flex;flex-direction:column;gap:var(--innspel-space-md);min-height:0}.innspel-dialog-fot{padding:var(--innspel-space-md);border-top:var(--innspel-layout-hairline) solid var(--innspel-color-border);background:var(--innspel-color-surface);display:flex;flex-direction:column;gap:var(--innspel-space-sm)}.innspel-knapp-ramme{display:flex;flex-direction:column;gap:var(--innspel-space-xs)}.innspel-knapp-ramme[data-grow=true]{flex:1}.innspel-knapp{width:100%;min-height:var(--innspel-layout-touch);padding:0 var(--innspel-space-md);border-radius:var(--innspel-radius-md);border:var(--innspel-layout-hairline) solid transparent;font-weight:var(--innspel-weight-semibold);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:var(--innspel-space-sm);background:transparent;text-align:center}.innspel-knapp[data-variant=primary]{background:var(--innspel-color-action-primary);color:var(--innspel-color-on-action-primary);border-color:var(--innspel-color-action-primary)}.innspel-knapp[data-variant=secondary]{color:var(--innspel-color-action-secondary-text);border-color:var(--innspel-color-action-secondary-border)}.innspel-knapp[data-variant=ghost]{color:var(--innspel-color-text-secondary)}.innspel-knapp[data-variant=danger]{color:var(--innspel-color-danger);border-color:var(--innspel-color-danger)}.innspel-knapp[data-tall=true]{min-height:calc(1.5 * var(--innspel-layout-touch))}.innspel-knapp:disabled{background:var(--innspel-color-surface-raised);color:var(--innspel-color-text-disabled);border-color:var(--innspel-color-border);cursor:not-allowed}.innspel-ikonknapp{min-width:var(--innspel-layout-touch);min-height:var(--innspel-layout-touch);background:transparent;border:none;color:var(--innspel-color-text-secondary);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:var(--innspel-space-xs);font-size:var(--innspel-font-small);border-radius:var(--innspel-radius-md)}.innspel-h{display:flex;flex-direction:column;gap:var(--innspel-space-xs)}.innspel-h>h2,.innspel-h>h1{margin:0;font-size:var(--innspel-font-h2);line-height:var(--innspel-line-height-h2);font-weight:var(--innspel-weight-semibold);color:var(--innspel-color-text-primary)}.innspel-hint{margin:0;font-size:var(--innspel-font-small);line-height:var(--innspel-line-height-small);color:var(--innspel-color-text-muted)}.innspel-p{margin:0;font-size:var(--innspel-font-body);line-height:var(--innspel-line-height-body);color:var(--innspel-color-text-primary)}.innspel-kort{background:var(--innspel-color-surface);border:var(--innspel-layout-hairline) solid var(--innspel-color-border);border-radius:var(--innspel-radius-lg);padding:var(--innspel-space-md);display:flex;flex-direction:column;gap:var(--innspel-space-sm)}.innspel-kort[data-stiplet=true]{border-style:dashed}.innspel-pille{display:inline-flex;align-items:center;align-self:flex-start;gap:var(--innspel-space-xs);padding:var(--innspel-space-xs) var(--innspel-space-sm);border-radius:var(--innspel-radius-pill);font-size:var(--innspel-font-small);font-weight:var(--innspel-weight-medium)}.innspel-pille[data-farge=info]{color:var(--innspel-color-info);background:var(--innspel-color-info-bg)}.innspel-pille[data-farge=success]{color:var(--innspel-color-success);background:var(--innspel-color-success-bg)}.innspel-pille[data-farge=warning]{color:var(--innspel-color-warning);background:var(--innspel-color-warning-bg)}.innspel-pille[data-farge=neutral]{color:var(--innspel-color-neutral);background:var(--innspel-color-neutral-bg)}.innspel-pille[data-farge=danger]{color:var(--innspel-color-danger);background:var(--innspel-color-danger-bg)}.innspel-banner{display:flex;gap:var(--innspel-space-sm);align-items:flex-start;border-radius:var(--innspel-radius-md);padding:var(--innspel-space-sm) var(--innspel-space-md);font-size:var(--innspel-font-small);line-height:var(--innspel-line-height-small);font-weight:var(--innspel-weight-medium)}.innspel-banner>p{margin:0;flex:1}.innspel-banner[data-tone=info]{color:var(--innspel-color-info);background:var(--innspel-color-info-bg)}.innspel-banner[data-tone=success]{color:var(--innspel-color-success);background:var(--innspel-color-success-bg)}.innspel-banner[data-tone=warning]{color:var(--innspel-color-warning);background:var(--innspel-color-warning-bg)}.innspel-banner[data-tone=danger]{color:var(--innspel-color-danger);background:var(--innspel-color-danger-bg)}.innspel-skjelett{height:var(--innspel-space-lg);width:100%;border-radius:var(--innspel-radius-sm);background:var(--innspel-color-surface-raised)}.innspel-skjelett[data-hoy=true]{height:calc(2 * var(--innspel-layout-touch))}.innspel-rad{display:flex;gap:var(--innspel-space-sm)}.innspel-rad[data-gap=md]{gap:var(--innspel-space-md)}.innspel-stabel{display:flex;flex-direction:column;gap:var(--innspel-space-md)}.innspel-stabel[data-gap=sm]{gap:var(--innspel-space-sm)}.innspel-liste{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--innspel-space-sm)}.innspel-flate{flex:1;min-height:calc(2.5 * var(--innspel-layout-touch));background:var(--innspel-color-surface);border:var(--innspel-layout-hairline) solid var(--innspel-color-border-strong);border-radius:var(--innspel-radius-lg);color:var(--innspel-color-text-primary);cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--innspel-space-sm);padding:var(--innspel-space-md)}.innspel-flate-ikon{font-size:var(--innspel-font-h1)}.innspel-flate-tittel{font-size:var(--innspel-font-h3);font-weight:var(--innspel-weight-semibold)}.innspel-flate-under{font-size:var(--innspel-font-small);color:var(--innspel-color-text-muted);text-align:center}.innspel-kjent-tittel{margin:0;font-weight:var(--innspel-weight-medium)}.innspel-kjent-omvei{margin:0;font-size:var(--innspel-font-small);line-height:var(--innspel-line-height-small);color:var(--innspel-color-text-secondary)}.innspel-kjent-svar{display:flex;gap:var(--innspel-space-sm);flex-wrap:wrap}.innspel-felt{display:flex;flex-direction:column;gap:var(--innspel-space-sm)}.innspel-felt-etikett{font-size:var(--innspel-font-h3);font-weight:var(--innspel-weight-semibold)}.innspel-tekstfelt{width:100%;min-height:calc(2 * var(--innspel-layout-touch));background:var(--innspel-color-surface-raised);border:var(--innspel-layout-hairline) solid var(--innspel-color-border-strong);border-radius:var(--innspel-radius-md);padding:var(--innspel-space-md);color:var(--innspel-color-text-primary);resize:vertical}.innspel-tekstfelt::placeholder{color:var(--innspel-color-text-muted)}.innspel-tekstfelt[data-full=true]{border-color:var(--innspel-color-warning)}.innspel-utfall{flex:1;min-height:var(--innspel-layout-touch);padding:var(--innspel-space-sm);font:inherit;font-size:var(--innspel-font-small);color:var(--innspel-color-text-primary);background:var(--innspel-color-surface-raised);border:var(--innspel-layout-hairline) solid var(--innspel-color-border-strong);border-radius:var(--innspel-radius-md);cursor:pointer}.innspel-utfall[data-aktiv=true]{font-weight:var(--innspel-weight-semibold);background:var(--innspel-color-brand-bg);border-color:var(--innspel-color-brand)}.innspel-teller{align-self:flex-end;font-size:var(--innspel-font-small);color:var(--innspel-color-text-muted)}.innspel-teller[data-full=true]{color:var(--innspel-color-warning)}.innspel-chip{display:flex;align-items:center;gap:var(--innspel-space-sm);min-height:var(--innspel-layout-touch);border:var(--innspel-layout-hairline) solid var(--innspel-color-border-interactive);border-radius:var(--innspel-radius-pill);padding:0 var(--innspel-space-xs) 0 var(--innspel-space-md);font-size:var(--innspel-font-small)}.innspel-chip>span{flex:1}.innspel-kontekst{border-top:var(--innspel-layout-hairline) solid var(--innspel-color-border);padding-top:var(--innspel-space-sm)}.innspel-kontekst-bryter{width:100%;min-height:calc(var(--innspel-layout-touch) - var(--innspel-space-sm));background:transparent;border:none;color:var(--innspel-color-text-secondary);font-size:var(--innspel-font-small);display:flex;align-items:center;gap:var(--innspel-space-sm);cursor:pointer;padding:0;text-align:left;border-radius:var(--innspel-radius-sm)}.innspel-kontekst-linje{display:flex;align-items:center;gap:var(--innspel-space-sm);min-height:calc(var(--innspel-layout-touch) - var(--innspel-space-sm));border-bottom:var(--innspel-layout-hairline) solid var(--innspel-color-border);font-size:var(--innspel-font-small)}.innspel-kontekst-nokkel{color:var(--innspel-color-text-muted);min-width:calc(2 * var(--innspel-layout-touch))}.innspel-kontekst-verdi{flex:1;color:var(--innspel-color-text-primary);overflow-wrap:anywhere}.innspel-varsel{display:flex;flex-direction:column;gap:var(--innspel-space-sm);background:var(--innspel-color-warning-bg);color:var(--innspel-color-warning);border-radius:var(--innspel-radius-md);padding:var(--innspel-space-sm) var(--innspel-space-md);font-size:var(--innspel-font-small);line-height:var(--innspel-line-height-small);font-weight:var(--innspel-weight-medium)}.innspel-varsel>p{margin:0}.innspel-verktoy{flex:1;min-height:var(--innspel-layout-touch);background:transparent;border:var(--innspel-layout-hairline) solid var(--innspel-color-action-secondary-border);border-bottom-width:calc(2 * var(--innspel-layout-hairline));border-radius:var(--innspel-radius-md);color:var(--innspel-color-text-primary);font-size:var(--innspel-font-small);cursor:pointer;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--innspel-space-xs);padding:var(--innspel-space-xs)}.innspel-verktoy[aria-pressed=true]{background:var(--innspel-color-surface-raised);border-bottom-color:var(--innspel-color-text-primary);font-weight:var(--innspel-weight-semibold)}.innspel-forhandsvisning-ramme{background:var(--innspel-screen-preview-backdrop);border-radius:var(--innspel-radius-md);overflow:hidden;display:flex;align-items:center;justify-content:center;min-height:calc(4 * var(--innspel-layout-touch))}.innspel-forhandsvisning{position:relative;display:block;max-width:100%;touch-action:none;cursor:crosshair}.innspel-forhandsvisning>canvas{display:block;max-width:100%;height:auto}.innspel-maske{position:absolute;pointer-events:none}.innspel-maske[data-art=auto]{background:var(--innspel-screen-auto-mask-fill);border:calc(2 * var(--innspel-layout-hairline)) solid var(--innspel-screen-auto-mask-stroke);color:var(--innspel-color-text-secondary);font-size:var(--innspel-font-small);display:flex;align-items:center;justify-content:center;overflow:hidden;white-space:nowrap}.innspel-maske[data-art=egen]{background:var(--innspel-screen-brush-fill)}.innspel-skjult-fil{position:absolute;width:var(--innspel-layout-hairline);height:var(--innspel-layout-hairline);opacity:0;overflow:hidden}.innspel-kvittering{margin:auto 0;text-align:center;display:flex;flex-direction:column;gap:var(--innspel-space-md);align-items:center}.innspel-kvittering-ikon{font-size:calc(2 * var(--innspel-font-h1));color:var(--innspel-color-success)}.innspel-kvittering-ikon[data-tone=neutral]{color:var(--innspel-color-neutral)}.innspel-svar{border-left:calc(2 * var(--innspel-layout-hairline)) solid var(--innspel-color-brand);padding-left:var(--innspel-space-sm);display:flex;flex-direction:column;gap:var(--innspel-space-xs)}.innspel-svar-fra{font-size:var(--innspel-font-small);color:var(--innspel-color-text-secondary)}.innspel-svar-tekst{margin:0;font-size:var(--innspel-font-small);line-height:var(--innspel-line-height-small);color:var(--innspel-color-text-primary)}.innspel-sr{position:absolute;width:var(--innspel-layout-hairline);height:var(--innspel-layout-hairline);padding:0;margin:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}@media(prefers-reduced-motion:no-preference){.innspel-dialog{animation:innspel-inn var(--innspel-motion-base) ease-out}@keyframes innspel-inn{0%{opacity:0;transform:translateY(var(--innspel-space-md))}to{opacity:1;transform:none}}}",Ce="data-innspel-style";function qe(e=document){if(e.head.querySelector(`style[${Ce}]`))return;const n=e.createElement("style");n.setAttribute(Ce,""),n.textContent=`${He}
7
+ ${Ke}`,e.head.appendChild(n)}const qn=`${He}
8
+ ${Ke}`;function _e(e){return/Edg\/(\d+)/.exec(e)?.[1]!==void 0?`Edge ${/Edg\/(\d+)/.exec(e)[1]}`:/OPR\/(\d+)/.exec(e)?`Opera ${/OPR\/(\d+)/.exec(e)[1]}`:/Firefox\/(\d+)/.exec(e)?`Firefox ${/Firefox\/(\d+)/.exec(e)[1]}`:/Chrome\/(\d+)/.exec(e)?`Chrome ${/Chrome\/(\d+)/.exec(e)[1]}`:/Version\/(\d+).*Safari/.exec(e)?`Safari ${/Version\/(\d+).*Safari/.exec(e)[1]}`:void 0}function We(e){try{return new URL(e,"http://x").pathname||"/"}catch{return"/"}}function Ge(e={},n=typeof navigator>"u"?{}:navigator){const t={platform:"web"},s=n.userAgent?_e(n.userAgent):void 0;return s&&(t.os=s),n.language&&(t.locale=n.language),e.appVersion&&(t.appVersion=e.appVersion),e.build&&(t.build=e.build),t}async function Je(e){if(e.type!=="image/png"&&e.type!=="image/jpeg")throw new Error("type: kun PNG eller JPEG");if(e.size>L.VEDLEGG_GRENSER.maxBytes)throw new Error(`bytes: over ${L.VEDLEGG_GRENSER.maxBytes}`);const n=await _n(e);return{bilde:n,width:n.width,height:n.height,automasker:[],kilde:"fil"}}async function _n(e){if(typeof createImageBitmap=="function")try{return await createImageBitmap(e,{imageOrientation:"from-image"})}catch{}const n=URL.createObjectURL(e);try{const t=new Image;return await new Promise((s,i)=>{t.onload=()=>s(),t.onerror=()=>i(new Error("kunne ikke dekode bildet")),t.src=n}),t}finally{URL.revokeObjectURL(n)}}const Wn=.85,Gn=4096;async function Xe(e,n,t=Qn()){const s=Math.min(1,Gn/Math.max(e.width,e.height,1)),i={width:Math.max(1,Math.round(e.width*s)),height:Math.max(1,Math.round(e.height*s))},a={width:e.width,height:e.height},l=document.createElement("canvas");l.width=i.width,l.height=i.height;const d=l.getContext("2d");if(!d)throw new Error("canvas er ikke tilgjengelig");if(d.drawImage(e.bilde,0,0,i.width,i.height),n.allTekst)if(e.tekstRekter&&e.tekstRekter.length){d.fillStyle=t.auto;for(const h of e.tekstRekter)ue(d,L.skaler(h,a,i))}else Jn(d,l);d.fillStyle=t.auto;for(const h of n.automasker)ue(d,L.skaler(h,a,i));d.fillStyle=t.egen;for(const h of n.egne)ue(d,L.skaler(h,a,i));return{mime:"image/jpeg",body:await Xn(l),width:i.width,height:i.height}}function ue(e,n){e.fillRect(n.x,n.y,n.width,n.height)}function Jn(e,n){const s=document.createElement("canvas");s.width=Math.max(1,Math.round(n.width/24)),s.height=Math.max(1,Math.round(n.height/24));const i=s.getContext("2d");i&&(i.imageSmoothingEnabled=!0,i.drawImage(n,0,0,s.width,s.height),e.imageSmoothingEnabled=!1,e.clearRect(0,0,n.width,n.height),e.drawImage(s,0,0,s.width,s.height,0,0,n.width,n.height))}function Xn(e){return new Promise((n,t)=>{e.toBlob(s=>s?n(s):t(new Error("kunne ikke enkode bildet")),"image/jpeg",Wn)})}function Qn(){const e=(n,t)=>typeof getComputedStyle!="function"?t:getComputedStyle(document.documentElement).getPropertyValue(n).trim()||t;return{auto:e("--innspel-screen-auto-mask-fill","#101114"),egen:e("--innspel-screen-brush-fill","#E5007D")}}const o={inngangHint:"Vi legger ved side, nettleser og versjon — aldri navn eller e-post.",valgTittel:"Hva gjelder det?",valgUnder:"Ett valg. Vi spør aldri om kategori eller alvorlighet.",sporFeil:"Noe virker ikke",sporFeilUnder:"Feilsporet — kontekst legges ved",sporOnske:"Jeg ønsker meg noe",sporOnskeUnder:"Ønskesporet — aldri spørsmål om reproduksjon",kjenteFeilTittelFeil:"Er det dette du ser?",kjenteFeilUnderFeil:"«Ja» registrerer deg på saken. «Ligner» sender ditt eget med lenke.",kjenteFeilTittelOnske:"Har noen ønsket dette?",kjenteFeilUnderOnske:"Ett klikk legger deg til på ønsket — ingen ny sak.",kjenteFeilLaster:"Sjekker kjente feil",kjenteFeilTilbud:"Treffene er et tilbud, aldri en sperre. «Nei» går rett til feltet.",svarJa:"Ja, jeg også",svarLigner:"Ligner, men ikke helt",svarNei:"Nei, det er noe annet",omvei:"Omvei:",rettesI:e=>`Rettes i ${e}`,rettetI:e=>`Rettet i ${e}`,feltLabelFeil:"Ditt innspill",feltLabelOnske:"Ditt ønske",placeholderFeil:"Hva skjedde? Hva forventet du?",placeholderOnske:"Hva ønsker du deg?",send:"Send",nesteOnske:"Neste — sjekk om noen har ønsket dette",forKort:e=>`Minst ${e} tegn. Ingenting annet er obligatorisk.`,sendSnarvei:"Ctrl+Enter sender",tellerFull:" — kort og konkret holder",kontekstLinje:"Legges ved: side, nettleser, språk, versjon",kontekstVis:" — Vis",kontekstFjern:"Fjern",kontekstFjernA11y:e=>`Fjern ${e.toLowerCase()} fra innsendingen`,kontekstAldri:"Aldri: navn, e-post, cookies, query string, det som står på siden. Lista er lukket — ukjente nøkler avvises av tjeneren.",kontekstEtiketter:{screen:"Side",os:"Nettleser",locale:"Språk",sdkVersion:"SDK",appVersion:"Appversjon",build:"Bygg",platform:"Plattform"},lenketTil:e=>`Lenket til: «${e}»`,fjernLenke:"Fjern lenken til den kjente feilen",taBildeAvSiden:"Ta bilde av siden",lastOppBilde:"Last opp bilde",skjermbildeHint:"Bildet lages i nettleseren din når du trykker — du ser det før noe sendes. Ingenting fra siden sendes ellers.",skjermbildeTittel:"Se over bildet",skjermbildeUnder:"Det du maskerer, ser vi aldri. Ingenting er sendt ennå.",skjermbildeUnderFil:"PNG eller JPEG. Bildet renses for metadata i nettleseren. Det du maskerer, ser vi aldri.",maskering:"Maskering",maskerFelt:"Masker felt",tegnOver:"Tegn over",maskerAllTekst:"Masker all tekst",maskertAvAppen:"Maskert av appen",maskertAvAppenHint:"data-innspel-private. Penselen kan ikke oppheve den.",dittStrok:"▲ ditt strøk — maskert (klikk på det for å angre)",allTekstHint:"All tekst på siden er dekket. Layouten er synlig.",fjernBildet:"Fjern bildet",leggVedOgFortsett:"Legg ved og fortsett",leggVedHintDD42:"Teksten sendes først; bildet lastes opp for seg.",skjermbildeLagtVed:"Skjermbilde lagt ved — maskert",fjernSkjermbilde:"Fjern skjermbildet",sendHintMedBilde:"Teksten sendes først; bildet lastes opp for seg.",skjermbildeFeilet:"kunne ikke ta bilde av siden. Du kan laste opp et bilde, eller sende uten.",filFeilet:"kunne ikke lese bildet. PNG eller JPEG, høyst 5 MB.",skjermbildeA11y:(e,n,t,s)=>`Forhåndsvisning av ${s?"det opplastede bildet":"siden"}. ${e?`${e} felt maskert av appen og kan ikke avmaskeres. `:""}${n?`${n} felt maskert av deg. `:""}${t?"All tekst er dekket. ":""}Klikk for å maskere et felt, dra for å tegne over.`,monsterSpm:{email:"Dette ser ut som en e-postadresse. Vil du fjerne den?",phone:"Dette ser ut som et telefonnummer. Vil du fjerne det?",card:"Dette ser ut som et kortnummer. Vil du fjerne det?",ip:"Dette ser ut som en IP-adresse. Vil du fjerne den?",token:"Dette ser ut som en tilgangsnøkkel. Vil du fjerne den?"},monsterFjern:"Fjern",monsterBehold:"Behold",monsterForklaring:"Teksten endres bare hvis du trykker Fjern. Vi fjerner aldri noe stille.",kvitteringSendt:"Sendt",kvitteringSendtAnonymt:"Sendt anonymt",kvitteringRegistrert:"Registrert",kvitteringFeil:"Du får beskjed når den er rettet, eller hvis vi trenger mer.",kvitteringOnske:"Vurderes innen 90 dager. Du får et personlig svar — også hvis det er nei.",kvitteringAnonym:"Vi kan ikke svare deg direkte, men saken teller.",kvitteringJaOgsa:"Du får beskjed når den er rettet.",saksnummer:e=>`Saksnummer ${e} — vis dette hvis du spør support.`,lukk:"Lukk",lukkEsc:"Lukk (Esc)",kvitteringVedleggFeilet:"Sendt — skjermbildet kunne ikke legges ved",tekstenErLagret:"Teksten din er lagret.",vedleggFeiletBanner:"Bildet ble ikke lastet opp. Saken er sendt uten det — vil du, kan du sende et nytt innspill med bilde.",saksnummerUtenVedlegg:e=>`Saksnummer ${e} · uten vedlegg`,offlineTittel:"Ingen nett",offlineBanner:"Ingen nett. Lagres i nettleseren og sendes automatisk — du ser det under «Mine innspill» til det er sendt.",offlineUtenBilde:"Bilde kan ikke legges ved uten nett. Teksten sendes; bildet ble ikke lagret.",sendefeilBanner:e=>`Kunne ikke sende: ${e} Teksten din er beholdt.`,provIgjen:"Prøv igjen",tjenerenSvarteIkke:"tjeneren svarte ikke (tidsavbrudd etter 10 s).",utloptTittel:"Innloggingen din gikk ut (15 min). Teksten din er beholdt.",loggInnPaaNytt:e=>`Logg inn på nytt hos ${e}`,loggInnPaaNyttGenerisk:"Logg inn på nytt",sendAnonymt:"Send anonymt",sendAnonymtHint:"Saken kobles ikke til nummeret ditt, og du kan ikke følge den etterpå.",mineTittel:"Mine innspill",mineUnder:"Status og hva du kan vente deg — samme løfte som i kvitteringen.",mineLaster:"Henter innspillene dine",mineTom:"Du har ikke sendt noe ennå.",mineTomHint:e=>`Det første innspillet tar under et minutt. Feil eller ønske — ${e} svarer på begge.`,mineIkkeSendt:"Ikke sendt ennå",mineSak:e=>`Sak ${e}`,svarFra:e=>`Svar fra ${e}`,svarFraGenerisk:"Svar",sendNytt:"Send nytt innspill",venterIKo:e=>`${e} innspill venter på nett — sendes automatisk`,tilbake:"Tilbake",dialogEtikett:"Send innspill",venterPaaNett:"Venter på nett — sendes automatisk",feil:"feil",onske:"ønske"},P={venterNett:"Sendes automatisk når du er på nett — kvitteringen kommer da.",vurderes:e=>`Svar innen ${e} — også hvis det er nei.`,vurderesUtenFrist:"Du får svar — også hvis det er nei.",bygges:"Du får beskjed når den er rettet.",planlagt:"Du får beskjed når den er rettet.",rettet:"Ferdig. Ser du feilen igjen, send et nytt innspill.",levert:"Ferdig. Takk for ønsket.",ny:"Vi har fått den. Du hører fra oss.",kjentFeil:"Kjent feil. Du får beskjed når den er rettet.",duplikat:"Slått sammen med et innspill som ligner.",avvist:"Vi har svart på denne."};function Yn({open:e,onClose:n,children:t,footer:s,colorScheme:i,returnFocusTo:a}){const l=f.useRef(null),d=f.useRef(null),c=et();return f.useLayoutEffect(()=>{if(!e)return;d.current=a??document.activeElement;const h=l.current;((h?$e(h)[0]:void 0)??h)?.focus();const u=Array.from(document.body.children).filter(k=>!k.contains(h));for(const k of u)k.setAttribute("inert","");return()=>{for(const b of u)b.removeAttribute("inert");const k=d.current;k&&document.contains(k)&&k.focus()}},[e,a]),f.useEffect(()=>{if(!e)return;const h=p=>{if(p.key==="Escape"){p.preventDefault(),n();return}if(p.key!=="Tab"||!l.current)return;const u=$e(l.current);if(u.length===0)return;const k=u[0],b=u[u.length-1],v=document.activeElement;p.shiftKey&&(v===k||!l.current.contains(v))?(p.preventDefault(),b.focus()):!p.shiftKey&&v===b&&(p.preventDefault(),k.focus())};return document.addEventListener("keydown",h),()=>document.removeEventListener("keydown",h)},[e,n]),e?r.jsx("div",{className:"innspel-rot innspel-scrim","data-form":c,"data-innspel-theme":i,[me]:"true",onMouseDown:h=>{h.target===h.currentTarget&&n()},children:r.jsxs("div",{ref:l,role:"dialog","aria-modal":"true","aria-label":o.dialogEtikett,className:"innspel-dialog",tabIndex:-1,"data-testid":"innspel-dialog",children:[r.jsxs("div",{className:"innspel-dialog-hode",children:[c==="bunnark"?r.jsx("span",{className:"innspel-handtak","aria-hidden":"true"}):r.jsx("span",{className:"innspel-dialog-tittel",children:"Innspill"}),r.jsx("button",{type:"button",className:"innspel-ikonknapp","aria-label":o.lukkEsc,"data-testid":"lukk",onClick:n,children:r.jsx("span",{"aria-hidden":"true",children:"✕"})})]}),r.jsx("div",{className:"innspel-dialog-kropp",children:t}),s?r.jsx("div",{className:"innspel-dialog-fot",children:s}):null]})}):null}const Zn='a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function $e(e){return Array.from(e.querySelectorAll(Zn)).filter(n=>!n.hidden&&n.getAttribute("aria-hidden")!=="true")}function et(){const[e,n]=f.useState("modal");return f.useEffect(()=>{if(typeof matchMedia!="function")return;const t=getComputedStyle(document.documentElement).getPropertyValue("--innspel-layout-breakpoint").trim();if(!t)return;const s=matchMedia(`(max-width: calc(${t} - 1px))`),i=()=>n(s.matches?"bunnark":"modal");return i(),s.addEventListener("change",i),()=>s.removeEventListener("change",i)},[]),e}function B({label:e,onClick:n,variant:t="primary",ikon:s,hint:i,disabled:a,ariaLabel:l,grow:d,tall:c,type:h="button",testId:p,autoFocus:u}){const k=i?`innspel-hint-${nt(p??e)}`:void 0;return r.jsxs("div",{className:"innspel-knapp-ramme","data-grow":d?"true":void 0,children:[r.jsxs("button",{type:h,className:"innspel-knapp","data-variant":t,"data-tall":c?"true":void 0,"data-testid":p,disabled:a,"aria-label":l,"aria-describedby":k,onClick:n,autoFocus:u,children:[s?r.jsx("span",{"aria-hidden":"true",children:s}):null,e]}),i?r.jsx("p",{className:"innspel-hint",id:k,children:i}):null]})}function nt(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function W({children:e,sub:n,id:t,nivaa:s=2}){return r.jsxs("div",{className:"innspel-h",children:[s===1?r.jsx("h1",{id:t,children:e}):r.jsx("h2",{id:t,children:e}),n?r.jsx("p",{className:"innspel-hint",children:n}):null]})}function V({children:e,id:n}){return r.jsx("p",{className:"innspel-hint",id:n,children:e})}function fe({children:e}){return r.jsx("p",{className:"innspel-p",children:e})}function se({children:e,dashed:n,testId:t,role:s,ariaLabel:i}){return r.jsx("div",{className:"innspel-kort","data-stiplet":n?"true":void 0,"data-testid":t,role:s,"aria-label":i,children:e})}function ke({ikon:e,etikett:n,farge:t}){return r.jsxs("span",{className:"innspel-pille","data-farge":t,children:[r.jsx("span",{"aria-hidden":"true",children:e}),n]})}function Q({ikon:e,tone:n,children:t,live:s,testId:i}){return r.jsxs("div",{className:"innspel-banner","data-tone":n,role:s?"status":void 0,"aria-live":s?"polite":void 0,"data-testid":i,children:[r.jsx("span",{"aria-hidden":"true",children:e}),r.jsx("p",{children:t})]})}function _({hoy:e}){return r.jsx("div",{className:"innspel-skjelett","data-hoy":e?"true":void 0,"aria-hidden":"true"})}function tt({spor:e,verdi:n,onEndre:t,minTextLength:s,textMaxLength:i,kontekst:a,fjernedeFelter:l,onFjernKontekst:d,lenketTil:c,onFjernLenke:h,funn:p,onSend:u,sender:k,onTaBilde:b,onLastOppBilde:v,harVedlegg:y,onFjernVedlegg:x}){const[F,S]=f.useState(!1),[I,T]=f.useState([]),C=f.useId(),E=f.useId(),g=[...n].length,m=g<s,A=g>=i,M=g>=i*.8,N=p.find(j=>!I.includes(j.match)),z=f.useMemo(()=>["screen","os","locale","sdkVersion","appVersion","build"].map($=>{const O=a[$];return O&&!l.includes($)?{felt:$,etikett:o.kontekstEtiketter[$]??$,verdi:O}:null}).filter($=>$!==null),[a,l]),D=j=>{(j.ctrlKey||j.metaKey)&&j.key==="Enter"&&!m&&!k&&(j.preventDefault(),u())},G=e==="onske"?o.feltLabelOnske:o.feltLabelFeil;return r.jsxs("div",{className:"innspel-stabel",children:[c?r.jsxs("div",{className:"innspel-chip",role:"group","aria-label":"Lenket til kjent feil",children:[r.jsx("span",{"aria-hidden":"true",children:"🔗"}),r.jsx("span",{children:o.lenketTil(c.title)}),r.jsx("button",{type:"button",className:"innspel-ikonknapp","data-testid":"fjern-lenke","aria-label":o.fjernLenke,onClick:h,children:r.jsx("span",{"aria-hidden":"true",children:"✕"})})]}):null,N?r.jsxs("div",{className:"innspel-varsel",role:"status","aria-live":"polite","data-testid":"monstervarsel",children:[r.jsxs("p",{children:[r.jsx("span",{"aria-hidden":"true",children:"⚠ "}),o.monsterSpm[N.kind]]}),r.jsxs("div",{className:"innspel-rad",children:[r.jsx(B,{grow:!0,variant:"secondary",testId:"monster-fjern",label:o.monsterFjern,onClick:()=>t(n.slice(0,N.start)+n.slice(N.end))}),r.jsx(B,{grow:!0,variant:"ghost",testId:"monster-behold",label:o.monsterBehold,onClick:()=>T(j=>[...j,N.match])})]}),r.jsx(V,{children:o.monsterForklaring})]}):null,r.jsxs("div",{className:"innspel-felt",children:[r.jsx("label",{className:"innspel-felt-etikett",htmlFor:C,children:G}),r.jsx("textarea",{id:C,className:"innspel-tekstfelt","data-testid":"innspill-tekst","data-full":A?"true":void 0,value:n,onChange:j=>t(j.target.value),onKeyDown:D,maxLength:i,rows:4,placeholder:e==="onske"?o.placeholderOnske:o.placeholderFeil,"aria-describedby":m?`${C}-hint`:void 0}),M?r.jsxs("span",{className:"innspel-teller","data-testid":"teller","data-full":A?"true":void 0,role:"status","aria-live":A?"assertive":"polite",children:[A?r.jsx("span",{"aria-hidden":"true",children:"⚠ "}):null,g," / ",i,A?o.tellerFull:""]}):null]}),y?r.jsxs("div",{className:"innspel-chip","data-testid":"vedlegg-chip",role:"group","aria-label":o.skjermbildeLagtVed,children:[r.jsx("span",{"aria-hidden":"true",children:"📷"}),r.jsx("span",{children:o.skjermbildeLagtVed}),r.jsx("button",{type:"button",className:"innspel-ikonknapp","data-testid":"fjern-vedlegg","aria-label":o.fjernSkjermbilde,onClick:x,children:r.jsx("span",{"aria-hidden":"true",children:"✕"})})]}):b||v?r.jsxs("div",{className:"innspel-stabel","data-gap":"sm",children:[r.jsxs("div",{className:"innspel-rad",children:[b?r.jsx(B,{grow:!0,variant:"secondary",testId:"ta-bilde",ikon:"📷",label:o.taBildeAvSiden,onClick:b}):null,v?r.jsxs("div",{className:"innspel-knapp-ramme","data-grow":"true",children:[r.jsxs("label",{className:"innspel-knapp","data-variant":"secondary",htmlFor:E,children:[r.jsx("span",{"aria-hidden":"true",children:"📁"}),o.lastOppBilde]}),r.jsx("input",{id:E,className:"innspel-skjult-fil","data-testid":"last-opp",type:"file",accept:"image/png,image/jpeg",onChange:j=>{const $=j.target.files?.[0];$&&v($),j.target.value=""}})]}):null]}),r.jsx(V,{children:o.skjermbildeHint})]}):null,r.jsxs("div",{className:"innspel-kontekst",children:[r.jsxs("button",{type:"button",className:"innspel-kontekst-bryter","data-testid":"kontekst-bryter","aria-expanded":F,onClick:()=>S(j=>!j),children:[r.jsx("span",{"aria-hidden":"true",children:F?"▴":"▾"}),o.kontekstLinje,F?"":o.kontekstVis]}),F?r.jsxs("ul",{className:"innspel-liste",style:{gap:0},children:[z.map(j=>r.jsxs("li",{className:"innspel-kontekst-linje",children:[r.jsx("span",{className:"innspel-kontekst-nokkel",children:j.etikett}),r.jsx("span",{className:"innspel-kontekst-verdi",children:j.verdi}),r.jsxs("button",{type:"button",className:"innspel-ikonknapp","data-testid":`fjern-${j.felt}`,"aria-label":o.kontekstFjernA11y(j.etikett),onClick:()=>d(j.felt),children:[r.jsx("span",{"aria-hidden":"true",children:"✕ "}),o.kontekstFjern]})]},j.felt)),r.jsx("li",{children:r.jsx(V,{children:o.kontekstAldri})})]}):null]}),r.jsx(B,{testId:"send",label:e==="onske"&&!m?o.nesteOnske:o.send,disabled:m||k,hint:m?o.forKort(s):y?o.sendHintMedBilde:o.sendSnarvei,onClick:u}),m?r.jsx("span",{id:`${C}-hint`,className:"innspel-sr",children:o.forKort(s)}):null]})}function rt({kort:e,spor:n,laster:t,onJaOgsa:s,onLigner:i,onNei:a}){const l=n==="onske"?o.kjenteFeilTittelOnske:o.kjenteFeilTittelFeil,d=n==="onske"?o.kjenteFeilUnderOnske:o.kjenteFeilUnderFeil;return r.jsxs("div",{className:"innspel-stabel",children:[r.jsx(W,{sub:d,children:l}),t?r.jsxs("div",{className:"innspel-stabel","data-gap":"sm",role:"status","aria-label":o.kjenteFeilLaster,children:[r.jsx(_,{hoy:!0}),r.jsx(_,{hoy:!0})]}):e.map(c=>{const h=c.fixedIn?c.status==="fikset"?o.rettetI(c.fixedIn):o.rettesI(c.fixedIn):void 0,p=h?`${c.title}. ${h}`:c.title;return r.jsxs(se,{role:"group",ariaLabel:`Kjent feil: ${p}`,children:[r.jsx("p",{className:"innspel-kjent-tittel",children:c.title}),c.workaround?r.jsxs("p",{className:"innspel-kjent-omvei",children:[r.jsx("strong",{children:o.omvei})," ",c.workaround]}):null,h?r.jsx(ke,{ikon:c.status==="fikset"?"✓":"🔧",etikett:h,farge:c.status==="fikset"?"success":"info"}):null,r.jsxs("div",{className:"innspel-kjent-svar",children:[r.jsx(B,{grow:!0,testId:`ja-ogsa-${c.id}`,label:o.svarJa,ariaLabel:`${o.svarJa}. ${p}`,onClick:()=>s(c)}),r.jsx(B,{grow:!0,variant:"secondary",testId:`ligner-${c.id}`,label:o.svarLigner,ariaLabel:`${o.svarLigner}. ${p}`,onClick:()=>i(c)})]})]},c.id)}),r.jsx(B,{variant:"secondary",testId:"nei-noe-annet",label:o.svarNei,onClick:a}),r.jsx(V,{children:o.kjenteFeilTilbud})]})}function st({art:e,saksnummer:n,vedlegg:t,onLukk:s}){const i={feil:{h:o.kvitteringSendt,p:o.kvitteringFeil},onske:{h:o.kvitteringSendt,p:o.kvitteringOnske},anonym:{h:o.kvitteringSendtAnonymt,p:o.kvitteringAnonym},jaOgsa:{h:o.kvitteringRegistrert,p:o.kvitteringJaOgsa},kø:{h:o.offlineTittel,p:o.offlineBanner}}[e],a=t==="feilet"?o.kvitteringVedleggFeilet:i.h,l=t==="feilet"?`${o.tekstenErLagret} ${i.p}`:i.p;return r.jsxs("div",{className:"innspel-stabel",children:[r.jsxs("div",{className:"innspel-kvittering",role:"status","aria-live":"polite","data-testid":"kvittering",children:[r.jsx("span",{className:"innspel-kvittering-ikon","data-tone":e==="kø"?"neutral":void 0,"aria-hidden":"true",children:e==="kø"?"⇅":"✓"}),r.jsx(W,{children:a}),t==="feilet"?r.jsx(Q,{ikon:"⚠",tone:"warning",children:o.vedleggFeiletBanner}):null,t==="forkastet"?r.jsx(Q,{ikon:"📷",tone:"info",children:o.offlineUtenBilde}):null,r.jsx("p",{className:"innspel-p","data-testid":"kvittering-tekst",children:l}),n?r.jsx(V,{children:t==="feilet"?o.saksnummerUtenVedlegg(n):o.saksnummer(n)}):null]}),r.jsx(B,{testId:"kvittering-lukk",label:o.lukk,onClick:s,autoFocus:!0})]})}const U={ny:"⏱",vurderes:"⏱",planlagt:"📅",bygges:"🔧",levert:"✓",kjent_feil:"👁",duplikat:"✕",avvist:"✕",venterNett:"⏳"};function Qe(e){const n=new Date(e);return Number.isNaN(n.getTime())?e:new Intl.DateTimeFormat("nb-NO",{day:"numeric",month:"long"}).format(n)}function ve(e,n,t){switch(e){case"ny":return{ikon:U.ny,etikett:"Mottatt",farge:"neutral",lofte:P.ny};case"vurderes":return{ikon:U.vurderes,etikett:"Vurderes",farge:"warning",lofte:t?P.vurderes(Qe(t)):P.vurderesUtenFrist};case"planlagt":return{ikon:U.planlagt,etikett:"Planlagt",farge:"success",lofte:P.planlagt};case"bygges":return{ikon:U.bygges,etikett:"Retter nå",farge:"info",lofte:P.bygges};case"levert":return n==="onske"?{ikon:U.levert,etikett:"Levert",farge:"success",lofte:P.levert}:{ikon:U.levert,etikett:"Rettet",farge:"success",lofte:P.rettet};case"kjent_feil":return{ikon:U.kjent_feil,etikett:"Kjent, ikke planlagt",farge:"neutral",lofte:P.kjentFeil};case"duplikat":return{ikon:U.duplikat,etikett:"Slått sammen",farge:"neutral",lofte:P.duplikat};case"avvist":return{ikon:U.avvist,etikett:"Avvist",farge:"danger",lofte:P.avvist}}}const Ye={ikon:U.venterNett,etikett:"Venter på nett",farge:"neutral",lofte:P.venterNett};function Ze(e){const n=ve(e.status,e.type,e.deadlineAt),t=e.type==="onske"?o.onske:o.feil;return`${o.mineSak(e.id)}, ${t}: ${e.text}. Status ${n.etikett.toLowerCase()}. ${n.lofte}`}function en({rader:e,laster:n,tenantName:t,onNytt:s,overskriftNivaa:i=2}){return r.jsxs("div",{className:"innspel-stabel",children:[r.jsx(W,{sub:o.mineUnder,nivaa:i,children:o.mineTittel}),n?r.jsxs("div",{className:"innspel-stabel","data-gap":"sm",role:"status","aria-label":o.mineLaster,children:[r.jsx(_,{hoy:!0}),r.jsx(_,{hoy:!0}),r.jsx(_,{hoy:!0})]}):e.length===0?r.jsxs(se,{dashed:!0,testId:"mine-tom",children:[r.jsx("span",{className:"innspel-kvittering-ikon","data-tone":"neutral","aria-hidden":"true",children:"✉"}),r.jsx(fe,{children:o.mineTom}),t?r.jsx(V,{children:o.mineTomHint(t)}):null]}):r.jsx("ul",{className:"innspel-liste","data-testid":"mine-liste",children:e.map(a=>{const l=a.pending===!0,d=l?Ye:ve(a.status,a.type,a.deadlineAt),c=l?a.clientRef:a.id,h=l?void 0:a.reply;return r.jsx("li",{"aria-label":l?`${o.mineIkkeSendt}: ${a.text}. ${d.lofte}`:Ze(a),children:r.jsxs(se,{dashed:l,children:[r.jsxs(V,{children:[l?o.mineIkkeSendt:o.mineSak(a.id)," · ",a.type==="onske"?o.onske:o.feil]}),r.jsx(fe,{children:a.text}),r.jsxs("div",{className:"innspel-rad",style:{flexWrap:"wrap",alignItems:"flex-start"},children:[r.jsx(ke,{ikon:d.ikon,etikett:d.etikett,farge:d.farge}),r.jsx(V,{children:d.lofte})]}),h?r.jsxs("div",{className:"innspel-svar",children:[r.jsxs("span",{className:"innspel-svar-fra",children:[r.jsx("span",{"aria-hidden":"true",children:"💬 "}),t?o.svarFra(t):o.svarFraGenerisk]}),r.jsx("p",{className:"innspel-svar-tekst",children:h.text})]}):null]})},c)})}),r.jsx(B,{testId:"send-nytt",ikon:"💬",label:o.sendNytt,onClick:s})]})}function it({fangst:e,komponerer:n,onFjern:t,onLeggVed:s}){const[i,a]=f.useState("pensel"),[l,d]=f.useState(!1),[c,h]=f.useState([]),p=f.useRef(null),u=f.useRef(null),k=f.useRef([]),b=f.useRef(at());f.useEffect(()=>{const g=p.current;if(!g)return;g.width=e.width,g.height=e.height;const m=g.getContext("2d");m&&m.drawImage(e.bilde,0,0)},[e]);const v={width:e.width,height:e.height},y=g=>{const m=u.current;if(!m)return null;const A=m.getBoundingClientRect();return A.width===0||A.height===0?null:L.skaler({x:g.clientX-A.left,y:g.clientY-A.top,width:0,height:0},{width:A.width,height:A.height},v)},x=()=>{const g=u.current?.getBoundingClientRect();return g&&g.width>0?e.width/g.width:1},F=g=>{if(n)return;const m=y(g);if(!m)return;const A=c.findIndex(M=>L.treffer(m,M));if(A>=0){h(M=>M.filter((N,z)=>z!==A));return}if(i==="felt"){const M=x(),N=L.trykkTilRekt(m,{width:4*b.current.touch*M,height:b.current.touch*M},v);N&&h(z=>[...z,N]);return}k.current=[m],u.current?.setPointerCapture(g.pointerId)},S=g=>{if(i!=="pensel"||k.current.length===0)return;const m=y(g);m&&k.current.push(m)},I=()=>{if(i!=="pensel"||k.current.length===0)return;const g=L.strokTilRekter(k.current,b.current.brush*x(),v);k.current=[],g.length&&h(m=>[...m,...g])},T=g=>({left:`${g.x/v.width*100}%`,top:`${g.y/v.height*100}%`,width:`${g.width/v.width*100}%`,height:`${g.height/v.height*100}%`}),C=(g,m,A)=>{const M=g==="allTekst"?l:i===g;return r.jsxs("button",{type:"button",className:"innspel-verktoy","data-testid":`verktoy-${g}`,"aria-pressed":M,onClick:()=>g==="allTekst"?d(N=>!N):a(g),children:[r.jsx("span",{"aria-hidden":"true",children:m}),A]},g)},E=o.skjermbildeA11y(e.automasker.length,c.length,l,e.kilde==="fil");return r.jsxs("div",{className:"innspel-stabel",children:[r.jsx(W,{sub:e.kilde==="fil"?o.skjermbildeUnderFil:o.skjermbildeUnder,children:o.skjermbildeTittel}),r.jsxs("div",{role:"toolbar","aria-label":o.maskering,className:"innspel-rad",children:[C("felt","▣",o.maskerFelt),C("pensel","✎",o.tegnOver),C("allTekst","▦",o.maskerAllTekst)]}),r.jsx("div",{className:"innspel-forhandsvisning-ramme","data-testid":"skjermbilde-ramme",children:r.jsxs("div",{ref:u,className:"innspel-forhandsvisning",role:"img","aria-label":E,"data-testid":"forhandsvisning",onPointerDown:F,onPointerMove:S,onPointerUp:I,onPointerCancel:I,children:[r.jsx("canvas",{ref:p,"data-testid":"skjermbilde-bilde",style:l&&!e.tekstRekter?.length?{filter:"blur(var(--innspel-space-md))"}:void 0}),l?(e.tekstRekter??[]).map((g,m)=>r.jsx("div",{className:"innspel-maske","data-art":"auto",style:T(g)},`tekst-${m}`)):null,e.automasker.map((g,m)=>r.jsx("div",{className:"innspel-maske","data-art":"auto","data-testid":`automask-${m}`,style:T(g),children:n?null:r.jsxs("span",{children:["🔒 ",o.maskertAvAppen]})},`auto-${m}`)),c.map((g,m)=>r.jsx("div",{className:"innspel-maske","data-art":"egen","data-testid":`maske-${m}`,style:T(g)},`egen-${m}`))]})}),e.automasker.length?r.jsxs(V,{children:["🔒 ",o.maskertAvAppenHint]}):null,c.length?r.jsx(V,{children:o.dittStrok}):null,l?r.jsx(V,{children:o.allTekstHint}):null,r.jsxs("div",{className:"innspel-stabel","data-gap":"sm",children:[r.jsx(B,{variant:"danger",testId:"fjern-bildet",ikon:"🗑",label:o.fjernBildet,onClick:t,disabled:n}),r.jsx(B,{testId:"legg-ved",label:o.leggVedOgFortsett,hint:o.leggVedHintDD42,disabled:n,onClick:()=>s({automasker:e.automasker,egne:c,allTekst:l})})]})]})}function at(){if(typeof getComputedStyle!="function")return{touch:48,brush:28};const e=getComputedStyle(document.documentElement),n=(t,s)=>{const i=parseFloat(e.getPropertyValue(t));return Number.isFinite(i)&&i>0?i:s};return{touch:n("--innspel-layout-touch",48),brush:n("--innspel-screen-brush-width",28)}}function lt({onVelg:e}){const n=(t,s,i,a)=>r.jsxs("button",{type:"button",className:"innspel-flate","data-testid":`spor-${t}`,"aria-label":`${i}. ${a}`,onClick:()=>e(t),children:[r.jsx("span",{className:"innspel-flate-ikon","aria-hidden":"true",children:s}),r.jsx("span",{className:"innspel-flate-tittel",children:i}),r.jsx("span",{className:"innspel-flate-under",children:a})]});return r.jsxs("div",{className:"innspel-stabel",children:[r.jsx(W,{sub:o.valgUnder,children:o.valgTittel}),r.jsxs("div",{className:"innspel-rad","data-gap":"md",children:[n("feil","🐞",o.sporFeil,o.sporFeilUnder),n("onske","💡",o.sporOnske,o.sporOnskeUnder)]})]})}function nn({client:e,open:n,onClose:t,apneOpsjoner:s,tenantName:i,screenshot:a,colorScheme:l,returnFocusTo:d,onIdentityExpired:c,onSendAnonymously:h}){const[p,u]=f.useState("valg"),[k,b]=f.useState("feil"),[v,y]=f.useState(""),[x,F]=f.useState([]),[S,I]=f.useState(!1),[T,C]=f.useState(),[E,g]=f.useState([]),[m,A]=f.useState([]),[M,N]=f.useState(!1),[z,D]=f.useState(),[G,j]=f.useState(!1),[$,O]=f.useState(!1),[H,R]=f.useState(),[Y,ye]=f.useState([]),[sn,xe]=f.useState(!1),[J,X]=f.useState(),[an,ae]=f.useState(!1),[Z,le]=f.useState(),ln=f.useRef(void 0),q=s?.screen??(typeof location>"u"?void 0:We(location.href)),[oe,on]=f.useState({...e.settings}),je=oe.screenshotsEnabled,ee=f.useCallback(()=>{u("valg"),b("feil"),y(""),F([]),C(void 0),g([]),A([]),D(void 0),j(!1),O(!1),R(void 0),X(void 0),le(void 0),ae(!1)},[]),we=f.useCallback(()=>{t(),ee()},[t,ee]),ne=f.useCallback(async()=>{I(!0);try{F(await e.knownIssues.for(q?{screen:q}:{}))}finally{I(!1)}},[e,q]),Fe=f.useCallback(async w=>{if(b(w),e.track({name:"track_selected",type:w}),w==="onske"){u("felt");return}u("kjenteFeil"),await ne()},[e,ne]);f.useEffect(()=>{n&&(ln.current=s,e.track({name:"widget_opened"}),e.queue.flush().catch(()=>{}),e.loadSettings().then(w=>on({...w})).catch(()=>{}),s?.draft?(b(s.draft.track),y(s.draft.text),g(e.scanText(s.draft.text)),u("felt")):s?.track&&Fe(s.track))},[n]),f.useEffect(()=>{p==="kjenteFeil"&&!S&&x.length===0&&u("felt")},[p,S,x.length]);const dn=f.useCallback(w=>{y(w),g(e.scanText(w))},[e]),cn=f.useCallback(async()=>{if(a){D(void 0);try{X(await a.capture(document.body)),u("skjermbilde")}catch{D(o.skjermbildeFeilet)}}},[a]),pn=f.useCallback(async w=>{D(void 0);try{X(await Je(w)),u("skjermbilde")}catch{D(o.filFeilet)}},[]),un=f.useCallback(async w=>{if(J){ae(!0);try{le(await Xe(J,w))}catch{D(o.skjermbildeFeilet)}finally{ae(!1),X(void 0),u("felt")}}},[J]),de=f.useCallback(()=>{X(void 0),le(void 0),u("felt")},[]),te=f.useCallback(async()=>{if(k==="onske"&&p==="felt"&&x.length===0&&!S){u("kjenteFeil"),await ne();return}N(!0),D(void 0),j(!1);try{const w=await e.capture({type:k,text:v,...Z?{attachment:Z}:{},...k==="feil"&&T?{relatedKnownIssueId:T.id}:{},context:ot(e,m,q)});w.status==="queued"?R({art:"kø",...w.attachment?{vedlegg:"forkastet"}:{}}):R({art:e.isAnonymous?"anonym":k,nr:w.submission.id,...w.attachment?.status==="failed"?{vedlegg:"feilet"}:{}}),u("kvittering")}catch(w){w instanceof L.InnspelApiError&&w.code==="feedback_token_expired"?j(!0):w instanceof L.InnspelQueueFullError?D(w.userMessage):w instanceof L.InnspelApiError?D(w.message):D(o.tjenerenSvarteIkke)}finally{N(!1)}},[e,k,p,v,Z,T,m,x.length,S,ne,q]);f.useEffect(()=>{$&&e.isAnonymous&&(O(!1),te())},[$,e.isAnonymous,te]);const fn=f.useCallback(async w=>{N(!0);try{const K=await e.knownIssues.confirm(w.id);R({art:"jaOgsa",nr:K.id}),u("kvittering")}catch(K){K instanceof L.InnspelApiError&&K.code==="feedback_token_expired"?j(!0):D(K instanceof L.InnspelApiError?K.message:o.tjenerenSvarteIkke)}finally{N(!1)}},[e]),hn=f.useCallback(async()=>{u("mine"),xe(!0);try{ye(await e.subjects.submissions())}catch(w){ye([]),w instanceof L.InnspelApiError&&w.code==="feedback_token_expired"&&j(!0)}finally{xe(!1)}},[e]),Se=p==="skjermbilde"?de:p!=="valg"&&p!=="kvittering"?ee:void 0;return r.jsxs(Yn,{open:n,onClose:we,colorScheme:l,returnFocusTo:d,children:[Se?r.jsx(B,{variant:"ghost",testId:"tilbake",ikon:"←",label:o.tilbake,onClick:Se}):null,z?r.jsx(Q,{live:!0,ikon:"⚠",tone:"danger",testId:"sendefeil",children:o.sendefeilBanner(z)}):null,G?r.jsxs("div",{className:"innspel-stabel","data-gap":"sm","data-testid":"utlopt",children:[r.jsx(Q,{live:!0,ikon:"⏱",tone:"warning",children:o.utloptTittel}),c?r.jsx(B,{ikon:"🔑",testId:"logg-inn-paa-nytt",label:i?o.loggInnPaaNytt(i):o.loggInnPaaNyttGenerisk,onClick:()=>c({track:k,text:v})}):null,h?r.jsx(B,{variant:"secondary",testId:"send-anonymt",label:o.sendAnonymt,hint:o.sendAnonymtHint,onClick:()=>{j(!1),O(!0),h()}}):r.jsx(V,{children:o.sendAnonymtHint})]}):null,p==="valg"?r.jsxs(r.Fragment,{children:[r.jsx(lt,{onVelg:Fe}),e.isAnonymous?null:r.jsx(B,{variant:"ghost",testId:"mine-innspill",ikon:"📋",label:o.mineTittel,onClick:hn})]}):null,p==="kjenteFeil"?r.jsx(rt,{kort:x,spor:k,laster:S,onJaOgsa:fn,onLigner:w=>{C(w),u("felt")},onNei:()=>k==="onske"?void te():u("felt")}):null,p==="felt"?r.jsx(tt,{spor:k,verdi:v,onEndre:dn,minTextLength:oe.minTextLength,textMaxLength:oe.textMaxLength,kontekst:{...e.context,...q?{screen:q}:{}},fjernedeFelter:m,onFjernKontekst:w=>A(K=>[...K,w]),...T?{lenketTil:T,onFjernLenke:()=>C(void 0)}:{},funn:E,onSend:te,sender:M,...je&&a?{onTaBilde:cn}:{},...je?{onLastOppBilde:pn}:{},harVedlegg:Z!==void 0,onFjernVedlegg:de}):null,p==="skjermbilde"&&J?r.jsx(it,{fangst:J,komponerer:an,onFjern:de,onLeggVed:un}):null,p==="kvittering"&&H?r.jsx(st,{art:H.art,...H.nr?{saksnummer:H.nr}:{},...H.vedlegg?{vedlegg:H.vedlegg}:{},onLukk:we}):null,p==="mine"?r.jsx(en,{rader:Y,laster:sn,...i?{tenantName:i}:{},onNytt:ee}):null]})}function ot(e,n,t){const s={};t&&(s.screen=t);for(const i of[...Object.keys(e.context),"screen"])i!=="sdkVersion"&&n.includes(i)&&(s[i]=void 0);return s}const tn=f.createContext(null);function rn({client:e,children:n,tenantName:t,colorScheme:s,screenshot:i,injectStyles:a=!0,onIdentityExpired:l,onSendAnonymously:d}){const[c,h]=f.useState(!1),[p,u]=f.useState(),k=f.useRef(null);f.useInsertionEffect(()=>{a&&qe()},[a]);const b=f.useCallback(async F=>{k.current=document.activeElement??null,u(F),h(!0)},[]),v=f.useCallback(()=>h(!1),[]);f.useEffect(()=>{e.registerPresenter({open:b})},[e,b]);const y=f.useMemo(()=>({client:e,open:b,close:v,isOpen:c}),[e,b,v,c]),x=i===!1?null:i??Ue;return r.jsxs(tn.Provider,{value:y,children:[n,r.jsx(nn,{client:e,open:c,onClose:v,...p?{apneOpsjoner:p}:{},...t?{tenantName:t}:{},screenshot:x,...s?{colorScheme:s}:{},returnFocusTo:k.current,...l?{onIdentityExpired:l}:{},...d?{onSendAnonymously:d}:{}})]})}function dt(){const e=f.useContext(tn);if(!e)throw new Error("[innspel] useInnspel() ble kalt utenfor <InnspelProvider>. Pakk siden din i den — se README.md.");return e}function be(e=pt()){const n=new Map,t=(s,i)=>{try{return s()}catch{return i()}};return{get:async s=>t(()=>e?.getItem(s)??n.get(s)??null,()=>n.get(s)??null),set:async(s,i)=>{n.set(s,i),t(()=>e?.setItem(s,i),()=>{})},remove:async s=>{n.delete(s),t(()=>e?.removeItem(s),()=>{})}}}function ct(){return be(null)}function pt(){try{return typeof localStorage>"u"?null:localStorage}catch{return null}}function ut(e,n){if(!(e instanceof HTMLElement))throw new Error("[innspel] mount(el, …): el må være et HTML-element i dokumentet. Se README.md.");const{client:t,baseUrl:s,tenantKey:i,identityProvider:a,storage:l,appVersion:d,build:c,textMaxLength:h,minTextLength:p,screenshotsEnabled:u,telemetry:k,fetch:b,...v}=n,y=k===!1?void 0:k??(s&&i?Dn({baseUrl:s,tenantKey:i,platform:"web",...d?{appVersion:d}:{},...b?{fetch:b}:{}}):void 0),x=t??L.init({baseUrl:s,tenantKey:i,identityProvider:a===void 0?void 0:a,storage:l??be(),context:Ge({...d?{appVersion:d}:{},...c?{build:c}:{}}),...h!==void 0?{textMaxLength:h}:{},...p!==void 0?{minTextLength:p}:{},...u!==void 0?{screenshotsEnabled:u}:{},...y?{telemetry:y}:{},...b?{fetch:b}:{}}),F=gn.createRoot(e);return F.render(r.jsx(rn,{client:x,...v})),{client:x,open:S=>x.openFeedback(S),close:()=>{document.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape",bubbles:!0}))},bindTrigger(S,I){const T=()=>{x.openFeedback(I)};return S.addEventListener("click",T),S.setAttribute("aria-haspopup","dialog"),!S.getAttribute("aria-description")&&!S.getAttribute("aria-describedby")&&S.setAttribute("aria-description",o.inngangHint),()=>{S.removeEventListener("click",T),S.removeAttribute("aria-haspopup")}},unmount:()=>F.unmount()}}function ft({children:e,inline:n,className:t}){const s={[ge]:"true",className:t,"data-testid":"innspel-privat"};return n?r.jsx("span",{...s,children:e}):r.jsx("div",{...s,children:e})}exports.Banner=Q;exports.Btn=B;exports.Card=se;exports.H=W;exports.Hint=V;exports.InnspelPrivate=ft;exports.InnspelProvider=rn;exports.MineInnspill=en;exports.P=fe;exports.PRIVAT_ATTRIBUTT=ge;exports.Skeleton=_;exports.StatusPill=ke;exports.WIDGET_ATTRIBUTT=me;exports.Widget=nn;exports.createMemoryStorage=ct;exports.createStorage=be;exports.css=qn;exports.ensureStyles=qe;exports.formaterFrist=Qe;exports.klonForBilde=Oe;exports.komponer=Xe;exports.lesBildefil=Je;exports.lofte=P;exports.mount=ut;exports.nettleserNavn=_e;exports.radEtikett=Ze;exports.renderPage=ze;exports.sideSti=We;exports.standardAdapter=Ue;exports.statusVisning=ve;exports.tekst=o;exports.useInnspel=dt;exports.venterVisning=Ye;exports.webKontekst=Ge;
9
+ //# sourceMappingURL=index.cjs.map