@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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../node_modules/@innspel/core/dist/chunk-5QZNM2ZX.js","../../node_modules/@innspel/core/dist/telemetri.js","../../src/lib/skjermbilde/typer.ts","../../src/lib/skjermbilde/renderer.ts","../../src/lib/tema.ts","../../src/lib/kontekst.ts","../../src/lib/skjermbilde/fil.ts","../../src/lib/skjermbilde/komposisjon.ts","../../src/lib/widget/tekster.ts","../../src/lib/widget/Dialog.tsx","../../src/lib/widget/primitiver.tsx","../../src/lib/widget/Felt.tsx","../../src/lib/widget/KjenteFeil.tsx","../../src/lib/widget/Kvittering.tsx","../../src/lib/widget/status.ts","../../src/lib/widget/MineInnspill.tsx","../../src/lib/widget/Skjermbilde.tsx","../../src/lib/widget/Valg.tsx","../../src/lib/widget/Widget.tsx","../../src/lib/InnspelProvider.tsx","../../src/lib/lagring.ts","../../src/lib/mount.tsx","../../src/lib/InnspelPrivate.tsx"],"sourcesContent":["// src/generated/api/core/auth.gen.ts\nvar getAuthToken = async (auth, callback) => {\n const token = typeof callback === \"function\" ? await callback(auth) : callback;\n if (!token) {\n return;\n }\n if (auth.scheme === \"bearer\") {\n return `Bearer ${token}`;\n }\n if (auth.scheme === \"basic\") {\n return `Basic ${btoa(token)}`;\n }\n return token;\n};\n\n// src/generated/api/core/bodySerializer.gen.ts\nvar jsonBodySerializer = {\n bodySerializer: (body) => JSON.stringify(body, (_key, value) => typeof value === \"bigint\" ? value.toString() : value)\n};\n\n// src/generated/api/core/pathSerializer.gen.ts\nvar separatorArrayExplode = (style) => {\n switch (style) {\n case \"label\":\n return \".\";\n case \"matrix\":\n return \";\";\n case \"simple\":\n return \",\";\n default:\n return \"&\";\n }\n};\nvar separatorArrayNoExplode = (style) => {\n switch (style) {\n case \"form\":\n return \",\";\n case \"pipeDelimited\":\n return \"|\";\n case \"spaceDelimited\":\n return \"%20\";\n default:\n return \",\";\n }\n};\nvar separatorObjectExplode = (style) => {\n switch (style) {\n case \"label\":\n return \".\";\n case \"matrix\":\n return \";\";\n case \"simple\":\n return \",\";\n default:\n return \"&\";\n }\n};\nvar serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value\n}) => {\n if (!explode) {\n const joinedValues2 = (allowReserved ? value : value.map((v) => encodeURIComponent(v))).join(separatorArrayNoExplode(style));\n switch (style) {\n case \"label\":\n return `.${joinedValues2}`;\n case \"matrix\":\n return `;${name}=${joinedValues2}`;\n case \"simple\":\n return joinedValues2;\n default:\n return `${name}=${joinedValues2}`;\n }\n }\n const separator = separatorArrayExplode(style);\n const joinedValues = value.map((v) => {\n if (style === \"label\" || style === \"simple\") {\n return allowReserved ? v : encodeURIComponent(v);\n }\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v\n });\n }).join(separator);\n return style === \"label\" || style === \"matrix\" ? separator + joinedValues : joinedValues;\n};\nvar serializePrimitiveParam = ({\n allowReserved,\n name,\n value\n}) => {\n if (value === void 0 || value === null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren\\u2019t supported. Provide your own `querySerializer()` to handle these.\"\n );\n }\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\nvar serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly\n}) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n if (style !== \"deepObject\" && !explode) {\n let values = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [...values, key, allowReserved ? v : encodeURIComponent(v)];\n });\n const joinedValues2 = values.join(\",\");\n switch (style) {\n case \"form\":\n return `${name}=${joinedValues2}`;\n case \"label\":\n return `.${joinedValues2}`;\n case \"matrix\":\n return `;${name}=${joinedValues2}`;\n default:\n return joinedValues2;\n }\n }\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value).map(\n ([key, v]) => serializePrimitiveParam({\n allowReserved,\n name: style === \"deepObject\" ? `${name}[${key}]` : key,\n value: v\n })\n ).join(separator);\n return style === \"label\" || style === \"matrix\" ? separator + joinedValues : joinedValues;\n};\n\n// src/generated/api/core/utils.gen.ts\nvar PATH_PARAM_RE = /\\{[^{}]+\\}/g;\nvar defaultPathSerializer = ({ path, url: _url }) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style = \"simple\";\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith(\".\")) {\n name = name.substring(1);\n style = \"label\";\n } else if (name.startsWith(\";\")) {\n name = name.substring(1);\n style = \"matrix\";\n }\n const value = path[name];\n if (value === void 0 || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n url = url.replace(match, serializeArrayParam({ explode, name, style, value }));\n continue;\n }\n if (typeof value === \"object\") {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value,\n valueOnly: true\n })\n );\n continue;\n }\n if (style === \"matrix\") {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value\n })}`\n );\n continue;\n }\n const replaceValue = encodeURIComponent(\n style === \"label\" ? `.${value}` : value\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\nvar getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url\n}) => {\n const pathUrl = _url.startsWith(\"/\") ? _url : `/${_url}`;\n let url = (baseUrl ?? \"\") + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : \"\";\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\nfunction getValidRequestBody(options) {\n const hasBody = options.body !== void 0;\n const isSerializedBody = hasBody && options.bodySerializer;\n if (isSerializedBody) {\n if (\"serializedBody\" in options) {\n const hasSerializedBody = options.serializedBody !== void 0 && options.serializedBody !== \"\";\n return hasSerializedBody ? options.serializedBody : null;\n }\n return options.body !== \"\" ? options.body : null;\n }\n if (hasBody) {\n return options.body;\n }\n return void 0;\n}\n\n// src/generated/api/client/utils.gen.ts\nvar createQuerySerializer = ({\n parameters = {},\n ...args\n} = {}) => {\n const querySerializer = (queryParams) => {\n const search = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === void 0 || value === null) {\n continue;\n }\n const options = parameters[name] || args;\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: \"form\",\n value,\n ...options.array\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === \"object\") {\n const serializedObject = serializeObjectParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: \"deepObject\",\n value,\n ...options.object\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved: options.allowReserved,\n name,\n value\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join(\"&\");\n };\n return querySerializer;\n};\nvar getParseAs = (contentType) => {\n if (!contentType) {\n return \"stream\";\n }\n const cleanContent = contentType.split(\";\")[0]?.trim();\n if (!cleanContent) {\n return;\n }\n if (cleanContent.startsWith(\"application/json\") || cleanContent.endsWith(\"+json\")) {\n return \"json\";\n }\n if (cleanContent === \"multipart/form-data\") {\n return \"formData\";\n }\n if ([\"application/\", \"audio/\", \"image/\", \"video/\"].some((type) => cleanContent.startsWith(type))) {\n return \"blob\";\n }\n if (cleanContent.startsWith(\"text/\")) {\n return \"text\";\n }\n return;\n};\nvar checkForExistence = (options, name) => {\n if (!name) {\n return false;\n }\n if (options.headers.has(name) || options.query?.[name] || options.headers.get(\"Cookie\")?.includes(`${name}=`)) {\n return true;\n }\n return false;\n};\nasync function setAuthParams(options) {\n for (const auth of options.security ?? []) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n const token = await getAuthToken(auth, options.auth);\n if (!token) {\n continue;\n }\n const name = auth.name ?? \"Authorization\";\n switch (auth.in) {\n case \"query\":\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case \"cookie\":\n options.headers.append(\"Cookie\", `${name}=${token}`);\n break;\n case \"header\":\n default:\n options.headers.set(name, token);\n break;\n }\n }\n}\nvar buildUrl = (options) => getUrl({\n baseUrl: options.baseUrl,\n path: options.path,\n query: options.query,\n querySerializer: typeof options.querySerializer === \"function\" ? options.querySerializer : createQuerySerializer(options.querySerializer),\n url: options.url\n});\nvar mergeConfigs = (a, b) => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith(\"/\")) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\nvar headersEntries = (headers) => {\n const entries = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\nvar mergeHeaders = (...headers) => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header);\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v);\n }\n } else if (value !== void 0) {\n mergedHeaders.set(\n key,\n typeof value === \"object\" ? JSON.stringify(value) : value\n );\n }\n }\n }\n return mergedHeaders;\n};\nvar Interceptors = class {\n fns = [];\n clear() {\n this.fns = [];\n }\n eject(id) {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n exists(id) {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n getInterceptorIndex(id) {\n if (typeof id === \"number\") {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n update(id, fn) {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n use(fn) {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n};\nvar createInterceptors = () => ({\n error: new Interceptors(),\n request: new Interceptors(),\n response: new Interceptors()\n});\nvar defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: \"form\"\n },\n object: {\n explode: true,\n style: \"deepObject\"\n }\n});\nvar defaultHeaders = {\n \"Content-Type\": \"application/json\"\n};\nvar createConfig = (override = {}) => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: \"auto\",\n querySerializer: defaultQuerySerializer,\n ...override\n});\n\n// src/generated/api/core/serverSentEvents.gen.ts\nfunction createSseClient({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}) {\n let lastEventId;\n const sleep = sseSleepFn ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));\n const createStream = async function* () {\n let retryDelay = sseDefaultRetryDelay ?? 3e3;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n while (true) {\n if (signal.aborted) break;\n attempt++;\n const headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers);\n if (lastEventId !== void 0) {\n headers.set(\"Last-Event-ID\", lastEventId);\n }\n try {\n const requestInit = {\n redirect: \"follow\",\n ...options,\n body: options.serializedBody,\n headers,\n signal\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`);\n if (!response.body) throw new Error(\"No body in SSE response\");\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();\n let buffer = \"\";\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n }\n };\n signal.addEventListener(\"abort\", abortHandler);\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n buffer = buffer.replace(/\\r\\n?/g, \"\\n\");\n const chunks = buffer.split(\"\\n\\n\");\n buffer = chunks.pop() ?? \"\";\n for (const chunk of chunks) {\n const lines = chunk.split(\"\\n\");\n const dataLines = [];\n let eventName;\n for (const line of lines) {\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.replace(/^data:\\s*/, \"\"));\n } else if (line.startsWith(\"event:\")) {\n eventName = line.replace(/^event:\\s*/, \"\");\n } else if (line.startsWith(\"id:\")) {\n lastEventId = line.replace(/^id:\\s*/, \"\");\n } else if (line.startsWith(\"retry:\")) {\n const parsed = Number.parseInt(line.replace(/^retry:\\s*/, \"\"), 10);\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n let data;\n let parsedJson = false;\n if (dataLines.length) {\n const rawData = dataLines.join(\"\\n\");\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay\n });\n if (dataLines.length) {\n yield data;\n }\n }\n }\n } finally {\n signal.removeEventListener(\"abort\", abortHandler);\n reader.releaseLock();\n }\n break;\n } catch (error) {\n onSseError?.(error);\n if (sseMaxRetryAttempts !== void 0 && attempt >= sseMaxRetryAttempts) {\n break;\n }\n const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 3e4);\n await sleep(backoff);\n }\n }\n };\n const stream = createStream();\n return { stream };\n}\n\n// src/generated/api/client/client.gen.ts\nvar createClient = (config = {}) => {\n let _config = mergeConfigs(createConfig(), config);\n const getConfig = () => ({ ..._config });\n const setConfig = (config2) => {\n _config = mergeConfigs(_config, config2);\n return getConfig();\n };\n const interceptors = createInterceptors();\n const beforeRequest = async (options) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: void 0\n };\n if (opts.security) {\n await setAuthParams(opts);\n }\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n if (opts.body !== void 0 && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body);\n }\n if (opts.body === void 0 || opts.serializedBody === \"\") {\n opts.headers.delete(\"Content-Type\");\n }\n const resolvedOpts = opts;\n const url = buildUrl(resolvedOpts);\n return { opts: resolvedOpts, url };\n };\n const request = async (options) => {\n const throwOnError = options.throwOnError ?? _config.throwOnError;\n const responseStyle = options.responseStyle ?? _config.responseStyle;\n let request2;\n let response;\n try {\n const { opts, url } = await beforeRequest(options);\n const requestInit = {\n redirect: \"follow\",\n ...opts,\n body: getValidRequestBody(opts)\n };\n request2 = new Request(url, requestInit);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request2 = await fn(request2, opts);\n }\n }\n const _fetch = opts.fetch;\n response = await _fetch(request2);\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request2, opts);\n }\n }\n const result = {\n request: request2,\n response\n };\n if (response.ok) {\n const parseAs = (opts.parseAs === \"auto\" ? getParseAs(response.headers.get(\"Content-Type\")) : opts.parseAs) ?? \"json\";\n if (response.status === 204 || response.headers.get(\"Content-Length\") === \"0\") {\n let emptyData;\n switch (parseAs) {\n case \"arrayBuffer\":\n case \"blob\":\n case \"text\":\n emptyData = await response[parseAs]();\n break;\n case \"formData\":\n emptyData = new FormData();\n break;\n case \"stream\":\n emptyData = response.body;\n break;\n case \"json\":\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === \"data\" ? emptyData : {\n data: emptyData,\n ...result\n };\n }\n let data;\n switch (parseAs) {\n case \"arrayBuffer\":\n case \"blob\":\n case \"formData\":\n case \"text\":\n data = await response[parseAs]();\n break;\n case \"json\": {\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case \"stream\":\n return opts.responseStyle === \"data\" ? response.body : {\n data: response.body,\n ...result\n };\n }\n if (parseAs === \"json\") {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n return opts.responseStyle === \"data\" ? data : {\n data,\n ...result\n };\n }\n const textError = await response.text();\n let jsonError;\n try {\n jsonError = JSON.parse(textError);\n } catch {\n }\n throw jsonError ?? textError;\n } catch (error) {\n let finalError = error;\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = await fn(finalError, response, request2, options);\n }\n }\n finalError = finalError || {};\n if (throwOnError) {\n throw finalError;\n }\n return responseStyle === \"data\" ? void 0 : {\n error: finalError,\n request: request2,\n response\n };\n }\n };\n const makeMethodFn = (method) => (options) => request({ ...options, method });\n const makeSseFn = (method) => async (options) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body,\n method,\n onRequest: async (url2, init) => {\n let request2 = new Request(url2, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request2 = await fn(request2, opts);\n }\n }\n return request2;\n },\n serializedBody: getValidRequestBody(opts),\n url\n });\n };\n const _buildUrl = (options) => buildUrl({ ..._config, ...options });\n return {\n buildUrl: _buildUrl,\n connect: makeMethodFn(\"CONNECT\"),\n delete: makeMethodFn(\"DELETE\"),\n get: makeMethodFn(\"GET\"),\n getConfig,\n head: makeMethodFn(\"HEAD\"),\n interceptors,\n options: makeMethodFn(\"OPTIONS\"),\n patch: makeMethodFn(\"PATCH\"),\n post: makeMethodFn(\"POST\"),\n put: makeMethodFn(\"PUT\"),\n request,\n setConfig,\n sse: {\n connect: makeSseFn(\"CONNECT\"),\n delete: makeSseFn(\"DELETE\"),\n get: makeSseFn(\"GET\"),\n head: makeSseFn(\"HEAD\"),\n options: makeSseFn(\"OPTIONS\"),\n patch: makeSseFn(\"PATCH\"),\n post: makeSseFn(\"POST\"),\n put: makeSseFn(\"PUT\"),\n trace: makeSseFn(\"TRACE\")\n },\n trace: makeMethodFn(\"TRACE\")\n };\n};\n\n// src/generated/api/client.gen.ts\nvar client = createClient(createConfig());\n\n// src/generated/api/sdk.gen.ts\nvar attachmentsPresign = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/attachments/presign\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers\n }\n});\nvar attachmentsComplete = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/attachments/{id}/complete\",\n ...options\n});\nvar configGet = (options) => (options?.client ?? client).get({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/config\",\n ...options\n});\nvar eventsSend = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/events\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers\n }\n});\nvar programsRespond = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/follow-ups/{id}/respond\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers\n }\n});\nvar programsAccept = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/invitations/{token}/accept\",\n ...options\n});\nvar programsDecline = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/invitations/{token}/decline\",\n ...options\n});\nvar knownIssuesList2 = (options) => (options?.client ?? client).get({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/known-issues\",\n ...options\n});\nvar knownIssuesConfirm = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/known-issues/{id}/confirm\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers\n }\n});\nvar programsWithdraw = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/participations/{id}/withdraw\",\n ...options\n});\nvar programsListMine = (options) => (options?.client ?? client).get({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/programs\",\n ...options\n});\nvar submissionsListMine = (options) => (options?.client ?? client).get({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/submissions\",\n ...options\n});\nvar submissionsCreate = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/submissions\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers\n }\n});\nvar submissionsStatus = (options) => (options.client ?? client).get({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/submissions/{id}/status\",\n ...options\n});\nvar programsCompleteTask = (options) => (options.client ?? client).post({\n security: [{ name: \"X-Innspel-Tenant-Key\", type: \"apiKey\" }, {\n key: \"FeedbackTokenAuth\",\n scheme: \"bearer\",\n type: \"http\"\n }],\n url: \"/v1/ingest/tasks/{id}/complete\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers\n }\n});\n\n// src/versjon.ts\nvar VERSJON = \"0.6.0\";\n\nexport { VERSJON, attachmentsComplete, attachmentsPresign, configGet, createClient, createConfig, eventsSend, knownIssuesConfirm, knownIssuesList2, programsAccept, programsCompleteTask, programsDecline, programsListMine, programsRespond, programsWithdraw, submissionsCreate, submissionsListMine, submissionsStatus };\n//# sourceMappingURL=chunk-5QZNM2ZX.js.map\n//# sourceMappingURL=chunk-5QZNM2ZX.js.map","import { createClient, createConfig, eventsSend, VERSJON } from './chunk-5QZNM2ZX.js';\n\n// src/telemetri.ts\nvar MAKS_BUNT = 100;\nvar STRAKS = /* @__PURE__ */ new Set([\"submission_sent\", \"submission_failed\", \"followup_answered\", \"task_completed\"]);\nfunction createIngestTelemetry(options) {\n if (typeof options?.baseUrl !== \"string\" || options.baseUrl.length === 0) {\n throw new TypeError(\"[innspel] createIngestTelemetry: baseUrl mangler. Se README.md.\");\n }\n if (typeof options.tenantKey !== \"string\" || options.tenantKey.length === 0) {\n throw new TypeError(\"[innspel] createIngestTelemetry: tenantKey mangler. Se README.md.\");\n }\n if (typeof options.platform !== \"string\" || options.platform.length === 0) {\n throw new TypeError(\"[innspel] createIngestTelemetry: platform mangler (ios \\xB7 android \\xB7 web \\xB7 \\u2026).\");\n }\n const klient = createClient(createConfig({ baseUrl: options.baseUrl, ...options.fetch ? { fetch: options.fetch } : {} }));\n const ventetid = options.flushAfterMs ?? 2e3;\n const maks = Math.min(options.maxBatch ?? 25, MAKS_BUNT);\n let buffer = [];\n let timer;\n async function send() {\n if (timer !== void 0) {\n clearTimeout(timer);\n timer = void 0;\n }\n if (buffer.length === 0) return;\n const events = buffer.slice(0, MAKS_BUNT);\n buffer = buffer.slice(MAKS_BUNT);\n try {\n await eventsSend({\n client: klient,\n headers: { \"X-Innspel-Tenant-Key\": options.tenantKey },\n body: { events, platform: options.platform, sdkVersion: VERSJON, ...options.appVersion ? { appVersion: options.appVersion } : {} }\n });\n } catch {\n }\n if (buffer.length > 0) await send();\n }\n return {\n emit(event) {\n buffer.push(tilLedning(event));\n if (buffer.length >= maks || STRAKS.has(event.name) || ventetid === 0) {\n void send();\n return;\n }\n timer ??= setTimeout(() => void send(), ventetid);\n },\n flush: send\n };\n}\nfunction tilLedning(event) {\n const at = (/* @__PURE__ */ new Date()).toISOString();\n switch (event.name) {\n case \"track_selected\":\n return { name: event.name, at, type: event.type };\n case \"known_issue_shown\":\n return { name: event.name, at, count: Math.max(0, Math.min(3, event.count)) };\n case \"submission_sent\":\n return { name: event.name, at, type: event.type, hasAttachment: event.hasAttachment, offlineQueued: event.offlineQueued };\n case \"submission_failed\":\n return { name: event.name, at, reason: aarsak(event.reason) };\n case \"task_completed\":\n return { name: event.name, at, outcome: event.outcome };\n default:\n return { name: event.name, at };\n }\n}\nfunction aarsak(reason) {\n const r = reason.toLowerCase();\n if (r.includes(\"network\") || r.includes(\"offline\") || r.includes(\"fetch\")) return \"network\";\n if (r.includes(\"rate\") || r.includes(\"429\")) return \"rate_limited\";\n if (r.includes(\"unauth\") || r.includes(\"token\") || r.includes(\"401\")) return \"unauthorized\";\n if (r.includes(\"valid\") || r.includes(\"text_\") || r.includes(\"field\") || r.includes(\"correlation\") || r.includes(\"attachment\") || r.includes(\"screenshot\")) return \"validation\";\n if (r.includes(\"server\") || r.includes(\"internal\") || r.includes(\"50\")) return \"server\";\n return \"unknown\";\n}\n\nexport { createIngestTelemetry };\n//# sourceMappingURL=telemetri.js.map\n//# sourceMappingURL=telemetri.js.map","import type { MaskRect } from '@innspel/core';\n\n/** Attributtet verten setter på det som aldri skal med på et bilde (DD-39). */\nexport const PRIVAT_ATTRIBUTT = 'data-innspel-private';\n\n/** Attributtet widgeten setter på seg selv, så den aldri kommer med på bildet. */\nexport const WIDGET_ATTRIBUTT = 'data-innspel-widget';\n\n/**\n * Et bilde klart til forhåndsvisning: en bitmap og de private feltenes\n * rektangler i bildets piksler. Rå-bitmapen forlater aldri widgeten — det som\n * lastes opp er komposittet med maskene (K4).\n */\nexport interface Fangst {\n bilde: CanvasImageSource;\n width: number;\n height: number;\n /** Private felter (DD-39), alt i bildets piksler. Tomt for en opplastet fil. */\n automasker: MaskRect[];\n /**\n * Tekstlinjene på siden i bildets piksler — det «Masker all tekst» dekker\n * (DD-40). Utelatt for en opplastet fil; da pikseleres hele bildet i stedet.\n */\n tekstRekter?: MaskRect[];\n kilde: 'side' | 'fil';\n}\n\n/**\n * Fangst av siden. Pakken har sin egen (`renderPage` i renderer.ts, SVG\n * foreignObject, null avhengigheter — K19), og verten kan bytte den ut med\n * f.eks. html-to-image gjennom denne adapteren (tech-decisions.md, «M1.5»),\n * samme mønster som `createScreenshotAdapter` i React Native.\n */\nexport interface ScreenshotAdapter {\n /**\n * Fanger `rot` (typisk `document.body`) uten elementer merket\n * `data-innspel-widget`. Private felter returneres som rektangler i BILDETS\n * piksler, så widgeten kan maskere dem uansett hvem som rendret.\n */\n capture(rot: HTMLElement): Promise<Fangst>;\n}\n","import type { MaskRect } from '@innspel/core';\nimport { PRIVAT_ATTRIBUTT, WIDGET_ATTRIBUTT, type Fangst, type ScreenshotAdapter } from './typer.ts';\n\n/**\n * Pakkens egen klientside-renderer: «Ta bilde av siden» uten at én byte av DOM-en\n * forlater nettleseren (K4), og uten en tredjepartsavhengighet (K19). Valget og\n * de forkastede alternativene står i tech-decisions.md, «M1.5».\n *\n * Mekanikken er SVG `foreignObject`: DOM-en klones, beregnede stiler skrives\n * inn som inline-stil på hver node, klonen legges i en `<foreignObject>` i en\n * SVG med viewportens mål, SVG-en lastes som et bilde og tegnes til en canvas.\n * Tre ting skjer FØR serialisering, og det er de som gjør rendreren trygg:\n *\n * - Widgeten selv (`data-innspel-widget`) fjernes fra klonen.\n * - Private felter (`data-innspel-private`, DD-39) tømmes i klonen OG måles i\n * originalen, så de er maskert i bitmapen selv om geometrien skulle sprike.\n * - Bilder erstattes: same-origin tegnes inn som data-URL, alt annet blir en\n * nøytral flate. Et bilde fra en annen origin forgifter canvasen — og er\n * uansett ikke vertens eget innhold.\n *\n * Webfonter lastes ikke inn i SVG-bildet; teksten faller tilbake på systemfont.\n * Layouten er den samme, og det er layouten som er verdien i et skjermbilde.\n */\n\nexport interface Klon {\n klon: HTMLElement;\n /** Private felter i CSS-piksler relativt til viewporten. */\n automasker: MaskRect[];\n /** Tekstlinjer i CSS-piksler relativt til viewporten. */\n tekstRekter: MaskRect[];\n}\n\nconst UTELATT = new Set(['SCRIPT', 'NOSCRIPT', 'STYLE', 'LINK', 'META', 'TEMPLATE', 'IFRAME', 'OBJECT', 'EMBED', 'VIDEO', 'AUDIO']);\n\n/**\n * Lager klonen som skal rendres. Ren DOM, ingen canvas — så den kan testes i\n * jsdom: widgeten er borte, private felter er tomme, og geometrien deres er målt.\n */\nexport function klonForBilde(rot: HTMLElement, viewport: { width: number; height: number }): Klon {\n const automasker: MaskRect[] = [];\n const tekstRekter: MaskRect[] = [];\n const klon = klonNode(rot, rot, automasker, viewport, tekstRekter) as HTMLElement;\n return { klon, automasker, tekstRekter };\n}\n\nfunction klonNode(orig: Node, rot: HTMLElement, automasker: MaskRect[], viewport: { width: number; height: number }, tekstRekter: MaskRect[]): Node | null {\n if (orig.nodeType === Node.TEXT_NODE) {\n for (const r of tekstlinjer(orig as Text, viewport)) tekstRekter.push(r);\n return orig.cloneNode(false);\n }\n if (orig.nodeType !== Node.ELEMENT_NODE) return null;\n const el = orig as HTMLElement;\n\n if (UTELATT.has(el.tagName) || el.hasAttribute(WIDGET_ATTRIBUTT)) return null;\n\n const klon = el.cloneNode(false) as HTMLElement;\n inlineStil(el, klon);\n // id-er og skjemanavn skal ikke duplisere originalens — klonen lever bare i en SVG.\n klon.removeAttribute('id');\n\n if (el.hasAttribute(PRIVAT_ATTRIBUTT)) {\n // DD-39: innholdet er BORTE fra klonen, ikke bare dekket, og feltet måles i\n // originalen så bitmapen maskeres uansett.\n const r = synligRekt(el.getBoundingClientRect(), viewport);\n if (r) automasker.push(r);\n klon.textContent = '';\n klon.style.setProperty('color', 'transparent');\n klon.style.setProperty('background', 'var(--innspel-screen-auto-mask-fill, #101114)');\n return klon;\n }\n\n if (el instanceof HTMLImageElement) {\n return bildeSomFlate(el, klon);\n }\n if (el instanceof HTMLCanvasElement) {\n try {\n const data = el.toDataURL();\n const img = document.createElement('img');\n inlineStil(el, img);\n img.setAttribute('src', data);\n return img;\n } catch {\n return nøytralFlate(klon);\n }\n }\n if (el instanceof HTMLTextAreaElement) {\n klon.textContent = el.value;\n return klon;\n }\n if (el instanceof HTMLInputElement) {\n if (el.type === 'password') {\n klon.setAttribute('value', '•'.repeat(el.value.length));\n } else if (el.type === 'checkbox' || el.type === 'radio') {\n if (el.checked) klon.setAttribute('checked', '');\n else klon.removeAttribute('checked');\n } else {\n klon.setAttribute('value', el.value);\n }\n return klon;\n }\n if (el instanceof HTMLSelectElement) {\n for (const [i, opt] of Array.from(el.options).entries()) {\n const k = klon.children[i];\n if (k) {\n if (opt.selected) k.setAttribute('selected', '');\n else k.removeAttribute('selected');\n }\n }\n }\n\n for (const barn of Array.from(el.childNodes)) {\n const k = klonNode(barn, rot, automasker, viewport, tekstRekter);\n if (k) klon.appendChild(k);\n }\n return klon;\n}\n\n/** Same-origin bilde → data-URL. Alt annet → nøytral flate (forgifter canvasen). */\nfunction bildeSomFlate(img: HTMLImageElement, klon: HTMLElement): HTMLElement {\n try {\n if (!img.complete || img.naturalWidth === 0) return nøytralFlate(klon);\n const c = document.createElement('canvas');\n c.width = img.naturalWidth;\n c.height = img.naturalHeight;\n const ctx = c.getContext('2d');\n if (!ctx) return nøytralFlate(klon);\n ctx.drawImage(img, 0, 0);\n klon.setAttribute('src', c.toDataURL());\n klon.removeAttribute('srcset');\n klon.removeAttribute('loading');\n return klon;\n } catch {\n return nøytralFlate(klon);\n }\n}\n\nfunction nøytralFlate(klon: HTMLElement): HTMLElement {\n const flate = document.createElement('div');\n flate.setAttribute('style', klon.getAttribute('style') ?? '');\n flate.style.setProperty('background', 'var(--innspel-color-neutral-bg, #EEF0F3)');\n flate.style.setProperty('display', 'inline-block');\n return flate;\n}\n\n/**\n * Skriver de beregnede stilene inn på klonen. `cssText` fra `getComputedStyle`\n * er tom i de fleste nettlesere, så egenskapene kopieres én og én.\n */\nfunction inlineStil(orig: Element, klon: HTMLElement): void {\n const beregnet = getComputedStyle(orig);\n const deler: string[] = [];\n for (let i = 0; i < beregnet.length; i++) {\n const navn = beregnet[i]!;\n const verdi = beregnet.getPropertyValue(navn);\n if (verdi) deler.push(`${navn}:${verdi}`);\n }\n if (deler.length) klon.setAttribute('style', deler.join(';'));\n klon.removeAttribute('class');\n}\n\nfunction tekstlinjer(node: Text, viewport: { width: number; height: number }): MaskRect[] {\n if (!node.data.trim() || typeof document.createRange !== 'function') return [];\n const range = document.createRange();\n range.selectNodeContents(node);\n // jsdom har ingen layout og ingen getClientRects; da finnes ingen tekstlinjer å måle.\n if (typeof range.getClientRects !== 'function') return [];\n const ut: MaskRect[] = [];\n for (const r of Array.from(range.getClientRects())) {\n const s = synligRekt(r, viewport);\n if (s) ut.push(s);\n }\n return ut;\n}\n\nfunction synligRekt(r: DOMRect | DOMRectReadOnly, viewport: { width: number; height: number }): MaskRect | null {\n const x1 = Math.max(0, r.left);\n const y1 = Math.max(0, r.top);\n const x2 = Math.min(viewport.width, r.right);\n const y2 = Math.min(viewport.height, r.bottom);\n if (x2 <= x1 || y2 <= y1) return null;\n return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };\n}\n\n/** SVG-markupen med klonen i en foreignObject, forskjøvet så viewporten er det som vises. */\nexport function serialiserSvg(klon: HTMLElement, viewport: { width: number; height: number }, scroll: { x: number; y: number }, bakgrunn: string): string {\n klon.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');\n const xml = new XMLSerializer().serializeToString(klon);\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${viewport.width}\" height=\"${viewport.height}\">` +\n `<foreignObject width=\"100%\" height=\"100%\">` +\n `<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"width:${viewport.width}px;height:${viewport.height}px;overflow:hidden;background:${bakgrunn}\">` +\n `<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"transform:translate(${-scroll.x}px,${-scroll.y}px)\">${xml}</div>` +\n `</div></foreignObject></svg>`\n );\n}\n\n/** Største skala som holder bildet innenfor 4096² (K9) — og aldri over enhetens egen. */\nexport function velgSkala(viewport: { width: number; height: number }, dpr: number, tak = 4096): number {\n return Math.min(dpr, tak / Math.max(viewport.width, viewport.height, 1));\n}\n\nasync function tegnSvg(svg: string, viewport: { width: number; height: number }, skala: number): Promise<HTMLCanvasElement> {\n const img = new Image();\n img.decoding = 'sync';\n const lastet = new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error('kunne ikke rendre siden'));\n });\n img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n await lastet;\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(viewport.width * skala);\n canvas.height = Math.round(viewport.height * skala);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('canvas er ikke tilgjengelig');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\n\nconst skalerRekt = (r: MaskRect, s: number): MaskRect => ({\n x: Math.floor(r.x * s),\n y: Math.floor(r.y * s),\n width: Math.ceil(r.width * s),\n height: Math.ceil(r.height * s),\n});\n\n/**\n * «Ta bilde av siden»: viewporten slik innsenderen ser den, med widgeten\n * utelatt og private felter maskert (K4, DD-39).\n */\nexport async function renderPage(rot: HTMLElement = document.body): Promise<Fangst> {\n const viewport = { width: window.innerWidth, height: window.innerHeight };\n const scroll = { x: window.scrollX, y: window.scrollY };\n const { klon, automasker, tekstRekter } = klonForBilde(rot, viewport);\n const bakgrunn = getComputedStyle(document.body).backgroundColor || '#fff';\n const svg = serialiserSvg(klon, viewport, scroll, bakgrunn);\n const skala = velgSkala(viewport, window.devicePixelRatio || 1);\n const canvas = await tegnSvg(svg, viewport, skala);\n return {\n bilde: canvas,\n width: canvas.width,\n height: canvas.height,\n automasker: automasker.map((r) => skalerRekt(r, skala)),\n tekstRekter: tekstRekter.map((r) => skalerRekt(r, skala)),\n kilde: 'side',\n };\n}\n\n/** Adapteren pakken bruker når verten ikke gir sin egen. */\nexport const standardAdapter: ScreenshotAdapter = {\n capture: (rot) => renderPage(rot),\n};\n","import tokensCss from '../../../theme/generated/tokens.css?inline';\nimport stylesCss from './styles.css?inline';\n\nconst MERKE = 'data-innspel-style';\n\n/**\n * Legger tokens.css og pakkens stilark inn i `<head>` én gang. Verter med en\n * `style-src` uten `'unsafe-inline'` importerer CSS-en selv i stedet og setter\n * `injectStyles: false`. Tokens er GENERERT fra theme/theme.ts (M0.4) — dette\n * er den ene lovlige veien til en farge (CLAUDE.md, «Styling»).\n */\nexport function ensureStyles(doc: Document = document): void {\n if (doc.head.querySelector(`style[${MERKE}]`)) return;\n const s = doc.createElement('style');\n s.setAttribute(MERKE, '');\n s.textContent = `${tokensCss}\\n${stylesCss}`;\n doc.head.appendChild(s);\n}\n\n/** Stilarket som tekst, for verter som vil legge det inn selv. */\nexport const css = `${tokensCss}\\n${stylesCss}`;\n","import type { ContextInput } from '@innspel/core';\n\n/**\n * Den tekniske konteksten på web — K5 er en lukket hviteliste, og på web er den\n * FEM linjer (tech-decisions.md, «M1.5»): `screen` er URL-stien uten query\n * string og hash (begge kan bære tokens), `os` er nettleseren med versjon\n * (kontrakten: «På web: nettleser»), `locale` fra nettleseren, `sdkVersion` fra\n * kjernen, og `appVersion`/`build` fra vertens konfig. Viewport finnes ikke.\n *\n * Aldri user-agent-strengen rå: den er et fingeravtrykk (K20). Bare familie og\n * hovedversjon, som «Chrome 129».\n */\nexport function nettleserNavn(ua: string): string | undefined {\n const treff =\n /Edg\\/(\\d+)/.exec(ua)?.[1] !== undefined\n ? `Edge ${/Edg\\/(\\d+)/.exec(ua)![1]}`\n : /OPR\\/(\\d+)/.exec(ua)\n ? `Opera ${/OPR\\/(\\d+)/.exec(ua)![1]}`\n : /Firefox\\/(\\d+)/.exec(ua)\n ? `Firefox ${/Firefox\\/(\\d+)/.exec(ua)![1]}`\n : /Chrome\\/(\\d+)/.exec(ua)\n ? `Chrome ${/Chrome\\/(\\d+)/.exec(ua)![1]}`\n : /Version\\/(\\d+).*Safari/.exec(ua)\n ? `Safari ${/Version\\/(\\d+).*Safari/.exec(ua)![1]}`\n : undefined;\n return treff;\n}\n\n/** Stien alene. Query string og hash strippes — de kan bære tokens. */\nexport function sideSti(url: string): string {\n try {\n return new URL(url, 'http://x').pathname || '/';\n } catch {\n return '/';\n }\n}\n\n/**\n * Konteksten slik `init()` skal ha den. `platform` er alltid `web`; verten legger\n * på `appVersion`/`build`. `screen` settes per åpning av widgeten\n * (`open({ screen })`) og ikke her — stien kan ha endret seg siden `init`.\n */\nexport function webKontekst(\n vert: { appVersion?: string; build?: string } = {},\n miljø: { userAgent?: string; language?: string } = typeof navigator === 'undefined' ? {} : navigator,\n): ContextInput {\n const ut: ContextInput = { platform: 'web' };\n const os = miljø.userAgent ? nettleserNavn(miljø.userAgent) : undefined;\n if (os) ut.os = os;\n if (miljø.language) ut.locale = miljø.language;\n if (vert.appVersion) ut.appVersion = vert.appVersion;\n if (vert.build) ut.build = vert.build;\n return ut;\n}\n","import { VEDLEGG_GRENSER } from '@innspel/core';\nimport type { Fangst } from './typer.ts';\n\n/**\n * «Last opp bilde»: PNG eller JPEG fra fil. Bildet dekodes til en bitmap her —\n * det er dekodingen som gjør at EXIF (posisjon, kamera, tidspunkt) er borte når\n * bildet re-enkodes ved komposisjon (K4). Plattformen stripper igjen (K9).\n *\n * Grensene sjekkes før dekoding, med feltnavn, slik kjernen gjør for vedlegget:\n * type mot PNG/JPEG og størrelse mot taket. Ingen private felter — bildet er\n * ikke fra siden, så DD-39 har ingenting å måle.\n */\nexport async function lesBildefil(fil: Blob & { type: string; name?: string }): Promise<Fangst> {\n if (fil.type !== 'image/png' && fil.type !== 'image/jpeg') {\n throw new Error('type: kun PNG eller JPEG');\n }\n if (fil.size > VEDLEGG_GRENSER.maxBytes) {\n throw new Error(`bytes: over ${VEDLEGG_GRENSER.maxBytes}`);\n }\n const bitmap = await dekod(fil);\n return { bilde: bitmap, width: bitmap.width, height: bitmap.height, automasker: [], kilde: 'fil' };\n}\n\nasync function dekod(fil: Blob): Promise<ImageBitmap | HTMLImageElement> {\n if (typeof createImageBitmap === 'function') {\n // `imageOrientation: 'from-image'` retter opp EXIF-rotasjon FØR taggen kastes,\n // så bildet ikke ender liggende når metadataene er borte.\n try {\n return await createImageBitmap(fil, { imageOrientation: 'from-image' });\n } catch {\n /* fall til Image under */\n }\n }\n const url = URL.createObjectURL(fil);\n try {\n const img = new Image();\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error('kunne ikke dekode bildet'));\n img.src = url;\n });\n return img;\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n","import { skaler, type AttachmentInput, type MaskRect } from '@innspel/core';\nimport type { Fangst } from './typer.ts';\n\n/** JPEG med denne kvaliteten holder en 2×-viewport godt under 5 MB (K9) og gjør maskene irreversible i praksis. */\nconst KVALITET = 0.85;\nconst TAK = 4096;\n\nexport interface Maskering {\n /** Private felter — kan ikke fjernes (DD-39). */\n automasker: MaskRect[];\n /** Innsenderens egne: «Masker felt» og «Tegn over» (DD-40). */\n egne: MaskRect[];\n /** «Masker all tekst» (DD-40). */\n allTekst: boolean;\n}\n\n/**\n * Komposisjonen er det som lastes opp (K4): bitmapen med alle maskene tegnet\n * INN i pikslene, re-enkodet som JPEG. Rå-bitmapen brukes bare til\n * forhåndsvisningen og forlater aldri widgeten.\n *\n * Fargene er `screenRules` fra temaet (theme/theme.ts) — det ene stedet\n * paletten ikke gjelder, fordi maskene skal være synlige uansett hva bildet\n * inneholder. De leses fra CSS-variablene så tallet bor ett sted.\n */\nexport async function komponer(fangst: Fangst, maskering: Maskering, farger = lesMaskefarger()): Promise<AttachmentInput> {\n // Alt innenfor 4096² (K9). Maskene skaleres med — de er i fangstens piksler.\n const s = Math.min(1, TAK / Math.max(fangst.width, fangst.height, 1));\n const ut = { width: Math.max(1, Math.round(fangst.width * s)), height: Math.max(1, Math.round(fangst.height * s)) };\n const inn = { width: fangst.width, height: fangst.height };\n\n const canvas = document.createElement('canvas');\n canvas.width = ut.width;\n canvas.height = ut.height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('canvas er ikke tilgjengelig');\n\n ctx.drawImage(fangst.bilde, 0, 0, ut.width, ut.height);\n\n if (maskering.allTekst) {\n if (fangst.tekstRekter && fangst.tekstRekter.length) {\n ctx.fillStyle = farger.auto;\n for (const r of fangst.tekstRekter) fyll(ctx, skaler(r, inn, ut));\n } else {\n // En opplastet fil har ingen tekstgeometri: hele bildet pikseleres, så\n // tekst blir uleselig mens layouten er synlig. Nedskalering er universell\n // — `ctx.filter` finnes ikke overalt.\n pikseler(ctx, canvas);\n }\n }\n\n ctx.fillStyle = farger.auto;\n for (const r of maskering.automasker) fyll(ctx, skaler(r, inn, ut));\n ctx.fillStyle = farger.egen;\n for (const r of maskering.egne) fyll(ctx, skaler(r, inn, ut));\n\n const body = await tilBlob(canvas);\n return { mime: 'image/jpeg', body, width: ut.width, height: ut.height };\n}\n\nfunction fyll(ctx: CanvasRenderingContext2D, r: MaskRect): void {\n ctx.fillRect(r.x, r.y, r.width, r.height);\n}\n\nfunction pikseler(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement): void {\n const faktor = 24;\n const liten = document.createElement('canvas');\n liten.width = Math.max(1, Math.round(canvas.width / faktor));\n liten.height = Math.max(1, Math.round(canvas.height / faktor));\n const lctx = liten.getContext('2d');\n if (!lctx) return;\n lctx.imageSmoothingEnabled = true;\n lctx.drawImage(canvas, 0, 0, liten.width, liten.height);\n ctx.imageSmoothingEnabled = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(liten, 0, 0, liten.width, liten.height, 0, 0, canvas.width, canvas.height);\n}\n\nfunction tilBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('kunne ikke enkode bildet'))), 'image/jpeg', KVALITET);\n });\n}\n\n/** Maskefargene fra tokens.css. Reserven er de samme tallene som i theme.ts, for et dokument uten stilarket. */\nexport function lesMaskefarger(): { auto: string; egen: string } {\n const les = (navn: string, reserve: string): string => {\n if (typeof getComputedStyle !== 'function') return reserve;\n const v = getComputedStyle(document.documentElement).getPropertyValue(navn).trim();\n return v || reserve;\n };\n return {\n auto: les('--innspel-screen-auto-mask-fill', '#101114'),\n egen: les('--innspel-screen-brush-fill', '#E5007D'),\n };\n}\n","/**\n * Hver streng innsenderen ser, ett sted.\n *\n * Ordlyden er ikke fri: den er tegnet i `design/wireframes/innsending-web.jsx`\n * og bundet av beslutninger. Løftene under er DD-08 og skal stå ORDRETT likt i\n * SDK-et, portalen og panelet — en innsender som får «Svar innen 3. desember» i\n * appen og noe annet i portalen har fått to løfter. Strengene som er felles med\n * `@innspel/react-native` er identiske med vilje; de web-spesifikke («Ta bilde\n * av siden», «Last opp bilde», «Lukk (Esc)») kommer fra web-wireframen.\n *\n * Norsk bokmål. Ingen leietakernavn: strengen som nevner avsenderen tar navnet\n * som parameter, siden pakken skal kunne brukes av hvem som helst.\n */\nexport const tekst = {\n // 2a — inngang. Vertens knapp får denne etiketten via `bindTrigger` (DD-47).\n inngangHint: 'Vi legger ved side, nettleser og versjon — aldri navn eller e-post.',\n\n // 2b — første valg\n valgTittel: 'Hva gjelder det?',\n valgUnder: 'Ett valg. Vi spør aldri om kategori eller alvorlighet.',\n sporFeil: 'Noe virker ikke',\n sporFeilUnder: 'Feilsporet — kontekst legges ved',\n sporOnske: 'Jeg ønsker meg noe',\n sporOnskeUnder: 'Ønskesporet — aldri spørsmål om reproduksjon',\n\n // 2c — kjente feil (DD-29, DD-30)\n kjenteFeilTittelFeil: 'Er det dette du ser?',\n kjenteFeilUnderFeil: '«Ja» registrerer deg på saken. «Ligner» sender ditt eget med lenke.',\n kjenteFeilTittelOnske: 'Har noen ønsket dette?',\n kjenteFeilUnderOnske: 'Ett klikk legger deg til på ønsket — ingen ny sak.',\n kjenteFeilLaster: 'Sjekker kjente feil',\n kjenteFeilTilbud: 'Treffene er et tilbud, aldri en sperre. «Nei» går rett til feltet.',\n svarJa: 'Ja, jeg også',\n svarLigner: 'Ligner, men ikke helt',\n svarNei: 'Nei, det er noe annet',\n omvei: 'Omvei:',\n rettesI: (versjon: string) => `Rettes i ${versjon}`,\n rettetI: (versjon: string) => `Rettet i ${versjon}`,\n\n // 2d + 2e — feltet og kontekstlinja\n /**\n * «Ditt innspill», ikke «Din feil» (DD-54). «Din» festet saken til personen, og\n * «feil» karakteriserte den før noen hadde lest den — innsenderen leste det som\n * skyld. Ønskesporet beholder «Ditt ønske»: et ønske er ingen feil, og der finnes\n * ikke problemet. De to står aldri ved siden av hverandre; sporet velges før dette.\n */\n feltLabelFeil: 'Ditt innspill',\n feltLabelOnske: 'Ditt ønske',\n /** DD-45: to spørsmål i feilsporet. */\n placeholderFeil: 'Hva skjedde? Hva forventet du?',\n placeholderOnske: 'Hva ønsker du deg?',\n send: 'Send',\n nesteOnske: 'Neste — sjekk om noen har ønsket dette',\n /** DD-44: minimum tegn er det ENESTE kravet. */\n forKort: (min: number) => `Minst ${min} tegn. Ingenting annet er obligatorisk.`,\n sendSnarvei: 'Ctrl+Enter sender',\n tellerFull: ' — kort og konkret holder',\n /** K5 på web: fem linjer. Nettleser er `os`; viewport finnes ikke (tech-decisions.md, «M1.5»). */\n kontekstLinje: 'Legges ved: side, nettleser, språk, versjon',\n kontekstVis: ' — Vis',\n kontekstFjern: 'Fjern',\n kontekstFjernA11y: (etikett: string) => `Fjern ${etikett.toLowerCase()} fra innsendingen`,\n kontekstAldri:\n 'Aldri: navn, e-post, cookies, query string, det som står på siden. Lista er lukket — ukjente nøkler avvises av tjeneren.',\n kontekstEtiketter: {\n screen: 'Side',\n os: 'Nettleser',\n locale: 'Språk',\n sdkVersion: 'SDK',\n appVersion: 'Appversjon',\n build: 'Bygg',\n platform: 'Plattform',\n } as Record<string, string>,\n lenketTil: (tittel: string) => `Lenket til: «${tittel}»`,\n fjernLenke: 'Fjern lenken til den kjente feilen',\n\n // 2f — skjermbilde (K4, DD-39, DD-40, DD-42). To veier på web.\n taBildeAvSiden: 'Ta bilde av siden',\n lastOppBilde: 'Last opp bilde',\n skjermbildeHint:\n 'Bildet lages i nettleseren din når du trykker — du ser det før noe sendes. Ingenting fra siden sendes ellers.',\n skjermbildeTittel: 'Se over bildet',\n skjermbildeUnder: 'Det du maskerer, ser vi aldri. Ingenting er sendt ennå.',\n skjermbildeUnderFil: 'PNG eller JPEG. Bildet renses for metadata i nettleseren. Det du maskerer, ser vi aldri.',\n maskering: 'Maskering',\n maskerFelt: 'Masker felt',\n tegnOver: 'Tegn over',\n maskerAllTekst: 'Masker all tekst',\n maskertAvAppen: 'Maskert av appen',\n maskertAvAppenHint: 'data-innspel-private. Penselen kan ikke oppheve den.',\n dittStrok: '▲ ditt strøk — maskert (klikk på det for å angre)',\n allTekstHint: 'All tekst på siden er dekket. Layouten er synlig.',\n fjernBildet: 'Fjern bildet',\n leggVedOgFortsett: 'Legg ved og fortsett',\n leggVedHintDD42: 'Teksten sendes først; bildet lastes opp for seg.',\n skjermbildeLagtVed: 'Skjermbilde lagt ved — maskert',\n fjernSkjermbilde: 'Fjern skjermbildet',\n sendHintMedBilde: 'Teksten sendes først; bildet lastes opp for seg.',\n skjermbildeFeilet: 'kunne ikke ta bilde av siden. Du kan laste opp et bilde, eller sende uten.',\n filFeilet: 'kunne ikke lese bildet. PNG eller JPEG, høyst 5 MB.',\n skjermbildeA11y: (auto: number, egne: number, allTekst: boolean, fraFil: boolean) =>\n `Forhåndsvisning av ${fraFil ? 'det opplastede bildet' : 'siden'}. ${auto ? `${auto} felt maskert av appen og kan ikke avmaskeres. ` : ''}${egne ? `${egne} felt maskert av deg. ` : ''}${allTekst ? 'All tekst er dekket. ' : ''}Klikk for å maskere et felt, dra for å tegne over.`,\n\n // DD-46 — mønstervarsel. Aldri stille redaksjon.\n monsterSpm: {\n email: 'Dette ser ut som en e-postadresse. Vil du fjerne den?',\n phone: 'Dette ser ut som et telefonnummer. Vil du fjerne det?',\n card: 'Dette ser ut som et kortnummer. Vil du fjerne det?',\n ip: 'Dette ser ut som en IP-adresse. Vil du fjerne den?',\n token: 'Dette ser ut som en tilgangsnøkkel. Vil du fjerne den?',\n },\n monsterFjern: 'Fjern',\n monsterBehold: 'Behold',\n monsterForklaring: 'Teksten endres bare hvis du trykker Fjern. Vi fjerner aldri noe stille.',\n\n // 2g — kvittering\n kvitteringSendt: 'Sendt',\n kvitteringSendtAnonymt: 'Sendt anonymt',\n kvitteringRegistrert: 'Registrert',\n kvitteringFeil: 'Du får beskjed når den er rettet, eller hvis vi trenger mer.',\n kvitteringOnske: 'Vurderes innen 90 dager. Du får et personlig svar — også hvis det er nei.',\n kvitteringAnonym: 'Vi kan ikke svare deg direkte, men saken teller.',\n kvitteringJaOgsa: 'Du får beskjed når den er rettet.',\n saksnummer: (nr: string) => `Saksnummer ${nr} — vis dette hvis du spør support.`,\n lukk: 'Lukk',\n lukkEsc: 'Lukk (Esc)',\n /** DD-42: saken er sendt, bildet kom ikke med — aldri en blokkert innsending. */\n kvitteringVedleggFeilet: 'Sendt — skjermbildet kunne ikke legges ved',\n tekstenErLagret: 'Teksten din er lagret.',\n vedleggFeiletBanner:\n 'Bildet ble ikke lastet opp. Saken er sendt uten det — vil du, kan du sende et nytt innspill med bilde.',\n saksnummerUtenVedlegg: (nr: string) => `Saksnummer ${nr} · uten vedlegg`,\n\n // 2i — tilstander\n offlineTittel: 'Ingen nett',\n offlineBanner:\n 'Ingen nett. Lagres i nettleseren og sendes automatisk — du ser det under «Mine innspill» til det er sendt.',\n /** DD-41: et skjermbilde køes aldri. */\n offlineUtenBilde: 'Bilde kan ikke legges ved uten nett. Teksten sendes; bildet ble ikke lagret.',\n sendefeilBanner: (arsak: string) => `Kunne ikke sende: ${arsak} Teksten din er beholdt.`,\n provIgjen: 'Prøv igjen',\n tjenerenSvarteIkke: 'tjeneren svarte ikke (tidsavbrudd etter 10 s).',\n /** Utløpt token under skriving (tech-decisions.md, «Portalen»): teksten står, bare innloggingen gjøres om. */\n utloptTittel: 'Innloggingen din gikk ut (15 min). Teksten din er beholdt.',\n loggInnPaaNytt: (leietaker: string) => `Logg inn på nytt hos ${leietaker}`,\n loggInnPaaNyttGenerisk: 'Logg inn på nytt',\n sendAnonymt: 'Send anonymt',\n sendAnonymtHint: 'Saken kobles ikke til nummeret ditt, og du kan ikke følge den etterpå.',\n\n // 2j — mine innspill\n mineTittel: 'Mine innspill',\n mineUnder: 'Status og hva du kan vente deg — samme løfte som i kvitteringen.',\n mineLaster: 'Henter innspillene dine',\n mineTom: 'Du har ikke sendt noe ennå.',\n mineTomHint: (leietaker: string) =>\n `Det første innspillet tar under et minutt. Feil eller ønske — ${leietaker} svarer på begge.`,\n mineIkkeSendt: 'Ikke sendt ennå',\n mineSak: (nr: string) => `Sak ${nr}`,\n svarFra: (leietaker: string) => `Svar fra ${leietaker}`,\n svarFraGenerisk: 'Svar',\n sendNytt: 'Send nytt innspill',\n venterIKo: (n: number) => `${n} ${n === 1 ? 'innspill' : 'innspill'} venter på nett — sendes automatisk`,\n\n // Felles\n tilbake: 'Tilbake',\n dialogEtikett: 'Send innspill',\n venterPaaNett: 'Venter på nett — sendes automatisk',\n feil: 'feil',\n onske: 'ønske',\n} as const;\n\n/**\n * Løftet per status (DD-08). Samme streng i SDK, portal og panel. Det eneste\n * tidsløftet er svarfristen som DATO (DD-28).\n */\nexport const lofte = {\n venterNett: 'Sendes automatisk når du er på nett — kvitteringen kommer da.',\n vurderes: (frist: string) => `Svar innen ${frist} — også hvis det er nei.`,\n vurderesUtenFrist: 'Du får svar — også hvis det er nei.',\n bygges: 'Du får beskjed når den er rettet.',\n planlagt: 'Du får beskjed når den er rettet.',\n rettet: 'Ferdig. Ser du feilen igjen, send et nytt innspill.',\n levert: 'Ferdig. Takk for ønsket.',\n ny: 'Vi har fått den. Du hører fra oss.',\n kjentFeil: 'Kjent feil. Du får beskjed når den er rettet.',\n duplikat: 'Slått sammen med et innspill som ligner.',\n avvist: 'Vi har svart på denne.',\n} as const;\n","import { useEffect, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport { WIDGET_ATTRIBUTT } from '../skjermbilde/typer.ts';\nimport { tekst } from './tekster.ts';\n\n/**\n * DD-47 — «Widgeten er en dialog og oppfører seg som en.» `role=\"dialog\"`,\n * `aria-modal`, fokus inn ved åpning og FANGET der, ESC og ✕ lukker, fokus\n * tilbake til vertens knapp ved lukking. Vertens innhold får `inert` bak\n * dialogen, så skjermlesere ikke ser det.\n *\n * Form: modal på desktop, bunnark på smal skjerm — målt med `matchMedia` mot\n * `--innspel-layout-breakpoint` fra tokens, aldri user-agent. Samme flyt, annen\n * form (wireframe 2b, mobilraden).\n *\n * `data-innspel-widget` på rota gjør at skjermbilde-rendreren utelater\n * dialogen fra bildet (K4).\n */\nexport function Dialog({\n open,\n onClose,\n children,\n footer,\n colorScheme,\n returnFocusTo,\n}: {\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n footer?: ReactNode;\n colorScheme?: 'dark' | 'light';\n /** Elementet fokus skal tilbake til ved lukking — vertens knapp (DD-47). */\n returnFocusTo?: HTMLElement | null;\n}) {\n const rot = useRef<HTMLDivElement | null>(null);\n const sisteFokus = useRef<HTMLElement | null>(null);\n const form = useForm();\n\n useLayoutEffect(() => {\n if (!open) return;\n sisteFokus.current = returnFocusTo ?? (document.activeElement as HTMLElement | null);\n const dialog = rot.current;\n // Fokus inn: første fokuserbare element — det er Lukk (fokus 1 i wireframen).\n const første = dialog ? fokuserbare(dialog)[0] : undefined;\n (første ?? dialog)?.focus();\n\n // Vertens innhold blir inert bak dialogen (DD-47). Søsknene til dialogens\n // portal-rot, ikke hele body — så widgeten selv består.\n const vertsnoder = Array.from(document.body.children).filter((n) => !n.contains(dialog));\n for (const n of vertsnoder) n.setAttribute('inert', '');\n\n return () => {\n for (const n of vertsnoder) n.removeAttribute('inert');\n // Fokus tilbake til vertens knapp, ikke til toppen av siden.\n const tilbake = sisteFokus.current;\n if (tilbake && document.contains(tilbake)) tilbake.focus();\n };\n }, [open, returnFocusTo]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n if (e.key !== 'Tab' || !rot.current) return;\n // Fokusfellen: Tab fra siste går til første, Shift+Tab fra første til siste.\n const liste = fokuserbare(rot.current);\n if (liste.length === 0) return;\n const første = liste[0]!;\n const siste = liste[liste.length - 1]!;\n const aktiv = document.activeElement;\n if (e.shiftKey && (aktiv === første || !rot.current.contains(aktiv))) {\n e.preventDefault();\n siste.focus();\n } else if (!e.shiftKey && aktiv === siste) {\n e.preventDefault();\n første.focus();\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <div\n className=\"innspel-rot innspel-scrim\"\n data-form={form}\n data-innspel-theme={colorScheme}\n {...{ [WIDGET_ATTRIBUTT]: 'true' }}\n onMouseDown={(e) => {\n // Klikk på scrimmen lukker — men ikke et klikk som startet inne i dialogen.\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div ref={rot} role=\"dialog\" aria-modal=\"true\" aria-label={tekst.dialogEtikett} className=\"innspel-dialog\" tabIndex={-1} data-testid=\"innspel-dialog\">\n <div className=\"innspel-dialog-hode\">\n {form === 'bunnark' ? <span className=\"innspel-handtak\" aria-hidden=\"true\" /> : <span className=\"innspel-dialog-tittel\">Innspill</span>}\n <button type=\"button\" className=\"innspel-ikonknapp\" aria-label={tekst.lukkEsc} data-testid=\"lukk\" onClick={onClose}>\n <span aria-hidden=\"true\">✕</span>\n </button>\n </div>\n <div className=\"innspel-dialog-kropp\">{children}</div>\n {footer ? <div className=\"innspel-dialog-fot\">{footer}</div> : null}\n </div>\n </div>\n );\n}\n\nconst FOKUSERBAR = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction fokuserbare(rot: HTMLElement): HTMLElement[] {\n return Array.from(rot.querySelectorAll<HTMLElement>(FOKUSERBAR)).filter((el) => !el.hidden && el.getAttribute('aria-hidden') !== 'true');\n}\n\n/**\n * Bunnark under bruddpunktet fra tokens, modal over. Tallet leses fra\n * `--innspel-layout-breakpoint` så det bor ett sted; finnes ikke variabelen\n * (tokens.css ikke lastet), er formen modal.\n */\nfunction useForm(): 'modal' | 'bunnark' {\n const [form, setForm] = useState<'modal' | 'bunnark'>('modal');\n useEffect(() => {\n if (typeof matchMedia !== 'function') return;\n const bp = getComputedStyle(document.documentElement).getPropertyValue('--innspel-layout-breakpoint').trim();\n if (!bp) return;\n const mq = matchMedia(`(max-width: calc(${bp} - 1px))`);\n const oppdater = () => setForm(mq.matches ? 'bunnark' : 'modal');\n oppdater();\n mq.addEventListener('change', oppdater);\n return () => mq.removeEventListener('change', oppdater);\n }, []);\n return form;\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Primitivene widgeten og portalen er bygget av. Alt visuelt ligger i\n * styles.css og kommer fra tokens — ingen hex, ingen px, ingen fontstørrelse\n * her (CLAUDE.md, «Styling»). Minste trykkflate er `--innspel-layout-touch`;\n * den gjelder også mus og tastatur på web.\n */\n\ntype Variant = 'primary' | 'secondary' | 'ghost' | 'danger';\n\nexport function Btn({\n label,\n onClick,\n variant = 'primary',\n ikon,\n hint,\n disabled,\n ariaLabel,\n grow,\n tall,\n type = 'button',\n testId,\n autoFocus,\n}: {\n label: string;\n onClick?: () => void;\n variant?: Variant;\n ikon?: string;\n hint?: string;\n disabled?: boolean;\n ariaLabel?: string;\n grow?: boolean;\n tall?: boolean;\n type?: 'button' | 'submit';\n testId?: string;\n autoFocus?: boolean;\n}) {\n const hintId = hint ? `innspel-hint-${slug(testId ?? label)}` : undefined;\n return (\n <div className=\"innspel-knapp-ramme\" data-grow={grow ? 'true' : undefined}>\n <button\n type={type}\n className=\"innspel-knapp\"\n data-variant={variant}\n data-tall={tall ? 'true' : undefined}\n data-testid={testId}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-describedby={hintId}\n onClick={onClick}\n autoFocus={autoFocus}\n >\n {ikon ? <span aria-hidden=\"true\">{ikon}</span> : null}\n {label}\n </button>\n {hint ? (\n <p className=\"innspel-hint\" id={hintId}>\n {hint}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction slug(s: string): string {\n return s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n}\n\nexport function H({ children, sub, id, nivaa = 2 }: { children: string; sub?: string; id?: string; nivaa?: 1 | 2 }) {\n return (\n <div className=\"innspel-h\">\n {nivaa === 1 ? <h1 id={id}>{children}</h1> : <h2 id={id}>{children}</h2>}\n {sub ? <p className=\"innspel-hint\">{sub}</p> : null}\n </div>\n );\n}\n\nexport function Hint({ children, id }: { children: ReactNode; id?: string }) {\n return (\n <p className=\"innspel-hint\" id={id}>\n {children}\n </p>\n );\n}\n\nexport function P({ children }: { children: ReactNode }) {\n return <p className=\"innspel-p\">{children}</p>;\n}\n\nexport function Card({\n children,\n dashed,\n testId,\n role,\n ariaLabel,\n}: {\n children: ReactNode;\n dashed?: boolean;\n testId?: string;\n role?: string;\n ariaLabel?: string;\n}) {\n return (\n <div className=\"innspel-kort\" data-stiplet={dashed ? 'true' : undefined} data-testid={testId} role={role} aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\n/**\n * Status som ikon + etikett. Fargen er et TILLEGG, aldri bæreren: to av\n * palettens statusfarger er målt til under 1,5 i innbyrdes kontrast (DD-08).\n */\nexport function StatusPill({\n ikon,\n etikett,\n farge,\n}: {\n ikon: string;\n etikett: string;\n farge: 'info' | 'success' | 'warning' | 'neutral' | 'danger';\n}) {\n return (\n <span className=\"innspel-pille\" data-farge={farge}>\n <span aria-hidden=\"true\">{ikon}</span>\n {etikett}\n </span>\n );\n}\n\n/** Varsel. `live` gjør den til en live-region; kvitteringen og feil bruker det (DD-47). */\nexport function Banner({\n ikon,\n tone,\n children,\n live,\n testId,\n}: {\n ikon: string;\n tone: 'info' | 'warning' | 'danger' | 'success';\n children: ReactNode;\n live?: boolean;\n testId?: string;\n}) {\n return (\n <div className=\"innspel-banner\" data-tone={tone} role={live ? 'status' : undefined} aria-live={live ? 'polite' : undefined} data-testid={testId}>\n <span aria-hidden=\"true\">{ikon}</span>\n <p>{children}</p>\n </div>\n );\n}\n\nexport function Skeleton({ hoy }: { hoy?: boolean }) {\n return <div className=\"innspel-skjelett\" data-hoy={hoy ? 'true' : undefined} aria-hidden=\"true\" />;\n}\n","import type { ContextInput, KnownIssueCard, PatternFinding } from '@innspel/core';\nimport { useId, useMemo, useState, type KeyboardEvent } from 'react';\nimport { Btn, Hint } from './primitiver.tsx';\nimport { tekst } from './tekster.ts';\n\n/**\n * 2d + 2e — feltet og kontekstlinja. Ett felt, ingenting annet.\n *\n * DD-44: send er inaktiv under `minTextLength`, og det er det ENESTE kravet.\n * DD-45: placeholderen stiller to spørsmål i feilsporet. DD-46: mønstervarselet\n * vises FØR sending og fjerner aldri noe selv. DD-05: konteksten er synlig og\n * fjernbar linje for linje — fem linjer på web (K5; tech-decisions.md, «M1.5»).\n * Ctrl+Enter sender (wireframe 2d).\n */\nexport function Felt({\n spor,\n verdi,\n onEndre,\n minTextLength,\n textMaxLength,\n kontekst,\n fjernedeFelter,\n onFjernKontekst,\n lenketTil,\n onFjernLenke,\n funn,\n onSend,\n sender,\n onTaBilde,\n onLastOppBilde,\n harVedlegg,\n onFjernVedlegg,\n}: {\n spor: 'feil' | 'onske';\n verdi: string;\n onEndre: (v: string) => void;\n minTextLength: number;\n textMaxLength: number;\n kontekst: ContextInput & { sdkVersion: string };\n fjernedeFelter: string[];\n onFjernKontekst: (felt: string) => void;\n lenketTil?: KnownIssueCard;\n onFjernLenke?: () => void;\n funn: PatternFinding[];\n onSend: () => void;\n sender?: boolean;\n /** Skjermbilde-steget (2f, K4). Utelatt = steget finnes ikke (DD-26). Aldri en deaktivert knapp. */\n onTaBilde?: () => void;\n onLastOppBilde?: (fil: File) => void;\n harVedlegg?: boolean;\n onFjernVedlegg?: () => void;\n}) {\n const [apen, setApen] = useState(false);\n const [beholdt, setBeholdt] = useState<string[]>([]);\n const feltId = useId();\n const filId = useId();\n\n const brukt = [...verdi].length;\n const forKort = brukt < minTextLength;\n const full = brukt >= textMaxLength;\n const visTeller = brukt >= textMaxLength * 0.8;\n const uavklart = funn.find((f) => !beholdt.includes(f.match));\n\n const linjer = useMemo(() => {\n const rekkefølge = ['screen', 'os', 'locale', 'sdkVersion', 'appVersion', 'build'];\n return rekkefølge\n .map((felt) => {\n const v = (kontekst as unknown as Record<string, string | undefined>)[felt];\n return v && !fjernedeFelter.includes(felt) ? { felt, etikett: tekst.kontekstEtiketter[felt] ?? felt, verdi: v } : null;\n })\n .filter((x): x is { felt: string; etikett: string; verdi: string } => x !== null);\n }, [kontekst, fjernedeFelter]);\n\n const onKey = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter' && !forKort && !sender) {\n e.preventDefault();\n onSend();\n }\n };\n\n const etikett = spor === 'onske' ? tekst.feltLabelOnske : tekst.feltLabelFeil;\n\n return (\n <div className=\"innspel-stabel\">\n {lenketTil ? (\n <div className=\"innspel-chip\" role=\"group\" aria-label=\"Lenket til kjent feil\">\n <span aria-hidden=\"true\">🔗</span>\n <span>{tekst.lenketTil(lenketTil.title)}</span>\n <button type=\"button\" className=\"innspel-ikonknapp\" data-testid=\"fjern-lenke\" aria-label={tekst.fjernLenke} onClick={onFjernLenke}>\n <span aria-hidden=\"true\">✕</span>\n </button>\n </div>\n ) : null}\n\n {uavklart ? (\n <div className=\"innspel-varsel\" role=\"status\" aria-live=\"polite\" data-testid=\"monstervarsel\">\n <p>\n <span aria-hidden=\"true\">⚠ </span>\n {tekst.monsterSpm[uavklart.kind]}\n </p>\n <div className=\"innspel-rad\">\n <Btn grow variant=\"secondary\" testId=\"monster-fjern\" label={tekst.monsterFjern} onClick={() => onEndre(verdi.slice(0, uavklart.start) + verdi.slice(uavklart.end))} />\n <Btn grow variant=\"ghost\" testId=\"monster-behold\" label={tekst.monsterBehold} onClick={() => setBeholdt((b) => [...b, uavklart.match])} />\n </div>\n <Hint>{tekst.monsterForklaring}</Hint>\n </div>\n ) : null}\n\n <div className=\"innspel-felt\">\n <label className=\"innspel-felt-etikett\" htmlFor={feltId}>\n {etikett}\n </label>\n <textarea\n id={feltId}\n className=\"innspel-tekstfelt\"\n data-testid=\"innspill-tekst\"\n data-full={full ? 'true' : undefined}\n value={verdi}\n onChange={(e) => onEndre(e.target.value)}\n onKeyDown={onKey}\n maxLength={textMaxLength}\n rows={4}\n placeholder={spor === 'onske' ? tekst.placeholderOnske : tekst.placeholderFeil}\n aria-describedby={forKort ? `${feltId}-hint` : undefined}\n />\n {visTeller ? (\n <span className=\"innspel-teller\" data-testid=\"teller\" data-full={full ? 'true' : undefined} role=\"status\" aria-live={full ? 'assertive' : 'polite'}>\n {full ? <span aria-hidden=\"true\">⚠ </span> : null}\n {brukt} / {textMaxLength}\n {full ? tekst.tellerFull : ''}\n </span>\n ) : null}\n </div>\n\n {/* 2f — opt-in per innsending, to veier på web. Bildet lages først ved trykk (K4). */}\n {harVedlegg ? (\n <div className=\"innspel-chip\" data-testid=\"vedlegg-chip\" role=\"group\" aria-label={tekst.skjermbildeLagtVed}>\n <span aria-hidden=\"true\">📷</span>\n <span>{tekst.skjermbildeLagtVed}</span>\n <button type=\"button\" className=\"innspel-ikonknapp\" data-testid=\"fjern-vedlegg\" aria-label={tekst.fjernSkjermbilde} onClick={onFjernVedlegg}>\n <span aria-hidden=\"true\">✕</span>\n </button>\n </div>\n ) : onTaBilde || onLastOppBilde ? (\n <div className=\"innspel-stabel\" data-gap=\"sm\">\n <div className=\"innspel-rad\">\n {onTaBilde ? <Btn grow variant=\"secondary\" testId=\"ta-bilde\" ikon=\"📷\" label={tekst.taBildeAvSiden} onClick={onTaBilde} /> : null}\n {onLastOppBilde ? (\n <div className=\"innspel-knapp-ramme\" data-grow=\"true\">\n <label className=\"innspel-knapp\" data-variant=\"secondary\" htmlFor={filId}>\n <span aria-hidden=\"true\">📁</span>\n {tekst.lastOppBilde}\n </label>\n <input\n id={filId}\n className=\"innspel-skjult-fil\"\n data-testid=\"last-opp\"\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n onChange={(e) => {\n const fil = e.target.files?.[0];\n if (fil) onLastOppBilde(fil);\n e.target.value = '';\n }}\n />\n </div>\n ) : null}\n </div>\n <Hint>{tekst.skjermbildeHint}</Hint>\n </div>\n ) : null}\n\n {/* 2e — synlig, ikke skjult (DD-05) */}\n <div className=\"innspel-kontekst\">\n <button type=\"button\" className=\"innspel-kontekst-bryter\" data-testid=\"kontekst-bryter\" aria-expanded={apen} onClick={() => setApen((a) => !a)}>\n <span aria-hidden=\"true\">{apen ? '▴' : '▾'}</span>\n {tekst.kontekstLinje}\n {apen ? '' : tekst.kontekstVis}\n </button>\n {apen ? (\n <ul className=\"innspel-liste\" style={{ gap: 0 }}>\n {linjer.map((l) => (\n <li key={l.felt} className=\"innspel-kontekst-linje\">\n <span className=\"innspel-kontekst-nokkel\">{l.etikett}</span>\n <span className=\"innspel-kontekst-verdi\">{l.verdi}</span>\n <button type=\"button\" className=\"innspel-ikonknapp\" data-testid={`fjern-${l.felt}`} aria-label={tekst.kontekstFjernA11y(l.etikett)} onClick={() => onFjernKontekst(l.felt)}>\n <span aria-hidden=\"true\">✕ </span>\n {tekst.kontekstFjern}\n </button>\n </li>\n ))}\n <li>\n <Hint>{tekst.kontekstAldri}</Hint>\n </li>\n </ul>\n ) : null}\n </div>\n\n <Btn\n testId=\"send\"\n label={spor === 'onske' && !forKort ? tekst.nesteOnske : tekst.send}\n disabled={forKort || sender}\n hint={forKort ? tekst.forKort(minTextLength) : harVedlegg ? tekst.sendHintMedBilde : tekst.sendSnarvei}\n onClick={onSend}\n />\n {forKort ? (\n <span id={`${feltId}-hint`} className=\"innspel-sr\">\n {tekst.forKort(minTextLength)}\n </span>\n ) : null}\n </div>\n );\n}\n","import type { KnownIssueCard } from '@innspel/core';\nimport { Btn, Card, H, Hint, Skeleton, StatusPill } from './primitiver.tsx';\nimport { tekst } from './tekster.ts';\n\n/**\n * 2c — kjente feil. Vises FØR feltet i feilsporet, ETTER i ønskesporet (DD-02).\n * Tre svar per kort (DD-29): «Ja, jeg også» · «Ligner, men ikke helt» · «Nei,\n * det er noe annet». Kortet er en `group`, ikke én knapp: tre svar må være tre\n * fokusstopp, og hver knapp bærer kortets tittel i etiketten.\n *\n * Treffene er et tilbud, aldri en sperre: tom liste og feilet oppslag hoppes\n * over uten melding (håndteres i Widget).\n */\nexport function KjenteFeil({\n kort,\n spor,\n laster,\n onJaOgsa,\n onLigner,\n onNei,\n}: {\n kort: KnownIssueCard[];\n spor: 'feil' | 'onske';\n laster?: boolean;\n onJaOgsa: (k: KnownIssueCard) => void;\n onLigner: (k: KnownIssueCard) => void;\n onNei: () => void;\n}) {\n const tittel = spor === 'onske' ? tekst.kjenteFeilTittelOnske : tekst.kjenteFeilTittelFeil;\n const under = spor === 'onske' ? tekst.kjenteFeilUnderOnske : tekst.kjenteFeilUnderFeil;\n\n return (\n <div className=\"innspel-stabel\">\n <H sub={under}>{tittel}</H>\n\n {laster ? (\n <div className=\"innspel-stabel\" data-gap=\"sm\" role=\"status\" aria-label={tekst.kjenteFeilLaster}>\n <Skeleton hoy />\n <Skeleton hoy />\n </div>\n ) : (\n kort.map((k) => {\n // DD-30: «Rettes i X» når aktiv, «Rettet i X» når fikset.\n const versjon = k.fixedIn ? (k.status === 'fikset' ? tekst.rettetI(k.fixedIn) : tekst.rettesI(k.fixedIn)) : undefined;\n const kontekst = versjon ? `${k.title}. ${versjon}` : k.title;\n return (\n <Card key={k.id} role=\"group\" ariaLabel={`Kjent feil: ${kontekst}`}>\n <p className=\"innspel-kjent-tittel\">{k.title}</p>\n {k.workaround ? (\n <p className=\"innspel-kjent-omvei\">\n <strong>{tekst.omvei}</strong> {k.workaround}\n </p>\n ) : null}\n {versjon ? <StatusPill ikon={k.status === 'fikset' ? '✓' : '🔧'} etikett={versjon} farge={k.status === 'fikset' ? 'success' : 'info'} /> : null}\n <div className=\"innspel-kjent-svar\">\n <Btn grow testId={`ja-ogsa-${k.id}`} label={tekst.svarJa} ariaLabel={`${tekst.svarJa}. ${kontekst}`} onClick={() => onJaOgsa(k)} />\n <Btn grow variant=\"secondary\" testId={`ligner-${k.id}`} label={tekst.svarLigner} ariaLabel={`${tekst.svarLigner}. ${kontekst}`} onClick={() => onLigner(k)} />\n </div>\n </Card>\n );\n })\n )}\n\n <Btn variant=\"secondary\" testId=\"nei-noe-annet\" label={tekst.svarNei} onClick={onNei} />\n <Hint>{tekst.kjenteFeilTilbud}</Hint>\n </div>\n );\n}\n","import { Banner, Btn, H, Hint } from './primitiver.tsx';\nimport { tekst } from './tekster.ts';\n\nexport type KvitteringArt = 'feil' | 'onske' | 'anonym' | 'jaOgsa' | 'kø';\n\n/**\n * 2g — kvitteringen. Den LOVER noe, per spor (DD-07), og saksnummeret er der så\n * innsenderen kan vise til det hos support. Anonym modus lover ikke svar, men\n * saken teller. Ingen «vurder appen», ingen oppfordring til å dele.\n *\n * DD-42: feilet vedlegget, er saken likevel sendt. DD-47: live-region, og fokus\n * lander på «Lukk» — Enter lukker.\n */\nexport function Kvittering({\n art,\n saksnummer,\n vedlegg,\n onLukk,\n}: {\n art: KvitteringArt;\n saksnummer?: string;\n /** `feilet`: teksten er lagret, bildet kom ikke med. `forkastet`: køet offline uten bilde. */\n vedlegg?: 'feilet' | 'forkastet';\n onLukk: () => void;\n}) {\n const innhold = {\n feil: { h: tekst.kvitteringSendt, p: tekst.kvitteringFeil },\n onske: { h: tekst.kvitteringSendt, p: tekst.kvitteringOnske },\n anonym: { h: tekst.kvitteringSendtAnonymt, p: tekst.kvitteringAnonym },\n jaOgsa: { h: tekst.kvitteringRegistrert, p: tekst.kvitteringJaOgsa },\n // Køet offline: kvitteringen kan IKKE love svar på noe som ikke er sendt (DD-41).\n kø: { h: tekst.offlineTittel, p: tekst.offlineBanner },\n }[art];\n\n const overskrift = vedlegg === 'feilet' ? tekst.kvitteringVedleggFeilet : innhold.h;\n const brodtekst = vedlegg === 'feilet' ? `${tekst.tekstenErLagret} ${innhold.p}` : innhold.p;\n\n return (\n <div className=\"innspel-stabel\">\n <div className=\"innspel-kvittering\" role=\"status\" aria-live=\"polite\" data-testid=\"kvittering\">\n <span className=\"innspel-kvittering-ikon\" data-tone={art === 'kø' ? 'neutral' : undefined} aria-hidden=\"true\">\n {art === 'kø' ? '⇅' : '✓'}\n </span>\n <H>{overskrift}</H>\n {vedlegg === 'feilet' ? (\n <Banner ikon=\"⚠\" tone=\"warning\">\n {tekst.vedleggFeiletBanner}\n </Banner>\n ) : null}\n {vedlegg === 'forkastet' ? (\n <Banner ikon=\"📷\" tone=\"info\">\n {tekst.offlineUtenBilde}\n </Banner>\n ) : null}\n <p className=\"innspel-p\" data-testid=\"kvittering-tekst\">\n {brodtekst}\n </p>\n {saksnummer ? <Hint>{vedlegg === 'feilet' ? tekst.saksnummerUtenVedlegg(saksnummer) : tekst.saksnummer(saksnummer)}</Hint> : null}\n </div>\n <Btn testId=\"kvittering-lukk\" label={tekst.lukk} onClick={onLukk} autoFocus />\n </div>\n );\n}\n","import type { SubmissionStatus, SubmissionStatusView, SubmissionType } from '@innspel/core';\nimport { lofte, tekst } from './tekster.ts';\n\n/**\n * DD-22: `levert` heter «Rettet» i feilsporet og «Levert» i ønskesporet —\n * samme maskinstatus, to navn. Klienten velger navnet; serveren gjør det ikke.\n *\n * DD-08 / «Styling» i CLAUDE.md: **farge bærer aldri mening alene.** Hver status\n * har ikon OG tekstetikett. `brand ↔ info` og `brand ↔ danger` er målt til under\n * 1,5 i kontrast mot hverandre av tema-generatoren, så etiketten er det som\n * faktisk bærer meningen. Speiler `@innspel/react-native`, med vilje ordrett.\n */\nexport interface StatusVisning {\n ikon: string;\n etikett: string;\n /** Tokennavn i den aktive paletten, ikke en farge. */\n farge: 'info' | 'success' | 'warning' | 'neutral' | 'danger';\n lofte: string;\n}\n\nconst IKON: Record<SubmissionStatus | 'venterNett', string> = {\n ny: '⏱',\n vurderes: '⏱',\n planlagt: '📅',\n bygges: '🔧',\n levert: '✓',\n kjent_feil: '👁',\n duplikat: '✕',\n avvist: '✕',\n venterNett: '⏳',\n};\n\n/** Norsk dato uten klokkeslett — fristen er en dato, ikke et tidspunkt (DD-28). */\nexport function formaterFrist(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return new Intl.DateTimeFormat('nb-NO', { day: 'numeric', month: 'long' }).format(d);\n}\n\nexport function statusVisning(status: SubmissionStatus, type: SubmissionType, deadlineAt?: string): StatusVisning {\n switch (status) {\n case 'ny':\n return { ikon: IKON.ny, etikett: 'Mottatt', farge: 'neutral', lofte: lofte.ny };\n case 'vurderes':\n return {\n ikon: IKON.vurderes,\n etikett: 'Vurderes',\n farge: 'warning',\n lofte: deadlineAt ? lofte.vurderes(formaterFrist(deadlineAt)) : lofte.vurderesUtenFrist,\n };\n case 'planlagt':\n return { ikon: IKON.planlagt, etikett: 'Planlagt', farge: 'success', lofte: lofte.planlagt };\n case 'bygges':\n return { ikon: IKON.bygges, etikett: 'Retter nå', farge: 'info', lofte: lofte.bygges };\n case 'levert':\n return type === 'onske'\n ? { ikon: IKON.levert, etikett: 'Levert', farge: 'success', lofte: lofte.levert }\n : { ikon: IKON.levert, etikett: 'Rettet', farge: 'success', lofte: lofte.rettet };\n case 'kjent_feil':\n return { ikon: IKON.kjent_feil, etikett: 'Kjent, ikke planlagt', farge: 'neutral', lofte: lofte.kjentFeil };\n case 'duplikat':\n return { ikon: IKON.duplikat, etikett: 'Slått sammen', farge: 'neutral', lofte: lofte.duplikat };\n case 'avvist':\n return { ikon: IKON.avvist, etikett: 'Avvist', farge: 'danger', lofte: lofte.avvist };\n }\n}\n\n/** Raden som venter på nett (DD-41). Den har ingen saksnummer og intet løfte om svar. */\nexport const venterVisning: StatusVisning = {\n ikon: IKON.venterNett,\n etikett: 'Venter på nett',\n farge: 'neutral',\n lofte: lofte.venterNett,\n};\n\n/** Etikett for en hel rad, som skjermleserens sammendrag. Ikonet er `aria-hidden`, så etiketten bærer alt. */\nexport function radEtikett(rad: SubmissionStatusView): string {\n const v = statusVisning(rad.status, rad.type, rad.deadlineAt);\n const spor = rad.type === 'onske' ? tekst.onske : tekst.feil;\n return `${tekst.mineSak(rad.id)}, ${spor}: ${rad.text}. Status ${v.etikett.toLowerCase()}. ${v.lofte}`;\n}\n","import type { MySubmission } from '@innspel/core';\nimport { Btn, Card, H, Hint, P, Skeleton, StatusPill } from './primitiver.tsx';\nimport { radEtikett, statusVisning, venterVisning } from './status.ts';\nimport { tekst } from './tekster.ts';\n\n/**\n * 2j — «Mine innspill» (DD-27). Offline-køen er synlig (DD-41): raden som\n * venter står øverst, uten saksnummer. Svaret står under saken, ordrett som i\n * panelet. Samme komponent i dialogen og i portalens fullskjerm — det er det\n * snapshot-testen beviser.\n *\n * Tilstander: laster (skjelett i radenes form) · tom (invitasjon, DD-19) ·\n * rader · feil (håndteres av den som kaller, med teksten beholdt).\n */\nexport function MineInnspill({\n rader,\n laster,\n tenantName,\n onNytt,\n overskriftNivaa = 2,\n}: {\n rader: MySubmission[];\n laster?: boolean;\n tenantName?: string;\n onNytt: () => void;\n overskriftNivaa?: 1 | 2;\n}) {\n return (\n <div className=\"innspel-stabel\">\n <H sub={tekst.mineUnder} nivaa={overskriftNivaa}>\n {tekst.mineTittel}\n </H>\n\n {laster ? (\n <div className=\"innspel-stabel\" data-gap=\"sm\" role=\"status\" aria-label={tekst.mineLaster}>\n <Skeleton hoy />\n <Skeleton hoy />\n <Skeleton hoy />\n </div>\n ) : rader.length === 0 ? (\n <Card dashed testId=\"mine-tom\">\n <span className=\"innspel-kvittering-ikon\" data-tone=\"neutral\" aria-hidden=\"true\">\n ✉\n </span>\n <P>{tekst.mineTom}</P>\n {tenantName ? <Hint>{tekst.mineTomHint(tenantName)}</Hint> : null}\n </Card>\n ) : (\n <ul className=\"innspel-liste\" data-testid=\"mine-liste\">\n {rader.map((rad) => {\n const venter = rad.pending === true;\n const v = venter ? venterVisning : statusVisning(rad.status, rad.type, rad.deadlineAt);\n const nokkel = venter ? rad.clientRef : rad.id;\n const svar = venter ? undefined : rad.reply;\n return (\n <li key={nokkel} aria-label={venter ? `${tekst.mineIkkeSendt}: ${rad.text}. ${v.lofte}` : radEtikett(rad)}>\n <Card dashed={venter}>\n <Hint>\n {venter ? tekst.mineIkkeSendt : tekst.mineSak(rad.id)} · {rad.type === 'onske' ? tekst.onske : tekst.feil}\n </Hint>\n <P>{rad.text}</P>\n <div className=\"innspel-rad\" style={{ flexWrap: 'wrap', alignItems: 'flex-start' }}>\n <StatusPill ikon={v.ikon} etikett={v.etikett} farge={v.farge} />\n <Hint>{v.lofte}</Hint>\n </div>\n {svar ? (\n <div className=\"innspel-svar\">\n <span className=\"innspel-svar-fra\">\n <span aria-hidden=\"true\">💬 </span>\n {tenantName ? tekst.svarFra(tenantName) : tekst.svarFraGenerisk}\n </span>\n <p className=\"innspel-svar-tekst\">{svar.text}</p>\n </div>\n ) : null}\n </Card>\n </li>\n );\n })}\n </ul>\n )}\n\n <Btn testId=\"send-nytt\" ikon=\"💬\" label={tekst.sendNytt} onClick={onNytt} />\n </div>\n );\n}\n","import { skaler, strokTilRekter, treffer, trykkTilRekt, type MaskPoint, type MaskRect } from '@innspel/core';\nimport { useEffect, useRef, useState, type PointerEvent } from 'react';\nimport type { Maskering } from '../skjermbilde/komposisjon.ts';\nimport type { Fangst } from '../skjermbilde/typer.ts';\nimport { Btn, H, Hint } from './primitiver.tsx';\nimport { tekst } from './tekster.ts';\n\ntype Verktoy = 'felt' | 'pensel';\n\n/**\n * 2f — skjermbildet, forhåndsvist FØR noe sendes (K4). Tre likestilte\n * maskeringsveier (DD-40): «Masker felt» (ett klikk legger en boks), «Tegn\n * over» (dra) og «Masker all tekst» (tekstlinjene dekkes; for en fil pikseleres\n * bildet). Private felter (DD-39) ligger der før innsenderen ser bildet, merket\n * «Maskert av appen», og kan ikke fjernes. Egne masker angres med ett klikk.\n *\n * Alle masker holdes i BILDETS piksler; lagene tegnes som prosent av flaten,\n * så de følger bildet uansett hvor stort det vises. Komposisjonen skjer i\n * `komponer` — det er komposittet som lastes opp, aldri rå-bitmapen.\n */\nexport function Skjermbilde({ fangst, komponerer, onFjern, onLeggVed }: { fangst: Fangst; komponerer: boolean; onFjern: () => void; onLeggVed: (m: Maskering) => void }) {\n const [verktoy, setVerktoy] = useState<Verktoy>('pensel');\n const [allTekst, setAllTekst] = useState(false);\n const [egne, setEgne] = useState<MaskRect[]>([]);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const flateRef = useRef<HTMLDivElement | null>(null);\n const strok = useRef<MaskPoint[]>([]);\n const mål = useRef(lesMål());\n\n // Rå-bitmapen tegnes til forhåndsvisningen. jsdom har ingen canvas-kontekst; da\n // står flaten tom, og det er alt som skjer.\n useEffect(() => {\n const c = canvasRef.current;\n if (!c) return;\n c.width = fangst.width;\n c.height = fangst.height;\n const ctx = c.getContext('2d');\n if (ctx) ctx.drawImage(fangst.bilde, 0, 0);\n }, [fangst]);\n\n const bilde = { width: fangst.width, height: fangst.height };\n\n /** Pekerens posisjon i bildets piksler. */\n const punkt = (e: PointerEvent): MaskPoint | null => {\n const el = flateRef.current;\n if (!el) return null;\n const r = el.getBoundingClientRect();\n if (r.width === 0 || r.height === 0) return null;\n return skaler({ x: e.clientX - r.left, y: e.clientY - r.top, width: 0, height: 0 }, { width: r.width, height: r.height }, bilde);\n };\n\n /** Forholdet bildepiksler per CSS-piksel — så boks og pensel får samme størrelse på skjermen uansett bilde. */\n const ratio = (): number => {\n const r = flateRef.current?.getBoundingClientRect();\n return r && r.width > 0 ? fangst.width / r.width : 1;\n };\n\n const onDown = (e: PointerEvent) => {\n if (komponerer) return;\n const p = punkt(e);\n if (!p) return;\n // Ett klikk på en egen maske angrer den (wireframe 2f). Private felter rører den aldri.\n const treff = egne.findIndex((r) => treffer(p, r));\n if (treff >= 0) {\n setEgne((x) => x.filter((_, i) => i !== treff));\n return;\n }\n if (verktoy === 'felt') {\n const k = ratio();\n const r = trykkTilRekt(p, { width: 4 * mål.current.touch * k, height: mål.current.touch * k }, bilde);\n if (r) setEgne((x) => [...x, r]);\n return;\n }\n strok.current = [p];\n flateRef.current?.setPointerCapture(e.pointerId);\n };\n\n const onMove = (e: PointerEvent) => {\n if (verktoy !== 'pensel' || strok.current.length === 0) return;\n const p = punkt(e);\n if (p) strok.current.push(p);\n };\n\n const onUp = () => {\n if (verktoy !== 'pensel' || strok.current.length === 0) return;\n const rekter = strokTilRekter(strok.current, mål.current.brush * ratio(), bilde);\n strok.current = [];\n if (rekter.length) setEgne((x) => [...x, ...rekter]);\n };\n\n const prosent = (r: MaskRect) => ({\n left: `${(r.x / bilde.width) * 100}%`,\n top: `${(r.y / bilde.height) * 100}%`,\n width: `${(r.width / bilde.width) * 100}%`,\n height: `${(r.height / bilde.height) * 100}%`,\n });\n\n const knapp = (id: Verktoy | 'allTekst', ikon: string, label: string) => {\n const valgt = id === 'allTekst' ? allTekst : verktoy === id;\n return (\n <button\n key={id}\n type=\"button\"\n className=\"innspel-verktoy\"\n data-testid={`verktoy-${id}`}\n aria-pressed={valgt}\n onClick={() => (id === 'allTekst' ? setAllTekst((a) => !a) : setVerktoy(id))}\n >\n <span aria-hidden=\"true\">{ikon}</span>\n {label}\n </button>\n );\n };\n\n const a11y = tekst.skjermbildeA11y(fangst.automasker.length, egne.length, allTekst, fangst.kilde === 'fil');\n\n return (\n <div className=\"innspel-stabel\">\n <H sub={fangst.kilde === 'fil' ? tekst.skjermbildeUnderFil : tekst.skjermbildeUnder}>{tekst.skjermbildeTittel}</H>\n\n <div role=\"toolbar\" aria-label={tekst.maskering} className=\"innspel-rad\">\n {knapp('felt', '▣', tekst.maskerFelt)}\n {knapp('pensel', '✎', tekst.tegnOver)}\n {knapp('allTekst', '▦', tekst.maskerAllTekst)}\n </div>\n\n <div className=\"innspel-forhandsvisning-ramme\" data-testid=\"skjermbilde-ramme\">\n <div\n ref={flateRef}\n className=\"innspel-forhandsvisning\"\n role=\"img\"\n aria-label={a11y}\n data-testid=\"forhandsvisning\"\n onPointerDown={onDown}\n onPointerMove={onMove}\n onPointerUp={onUp}\n onPointerCancel={onUp}\n >\n <canvas ref={canvasRef} data-testid=\"skjermbilde-bilde\" style={allTekst && !fangst.tekstRekter?.length ? { filter: 'blur(var(--innspel-space-md))' } : undefined} />\n {allTekst\n ? (fangst.tekstRekter ?? []).map((r, i) => <div key={`tekst-${i}`} className=\"innspel-maske\" data-art=\"auto\" style={prosent(r)} />)\n : null}\n {fangst.automasker.map((r, i) => (\n <div key={`auto-${i}`} className=\"innspel-maske\" data-art=\"auto\" data-testid={`automask-${i}`} style={prosent(r)}>\n {!komponerer ? <span>🔒 {tekst.maskertAvAppen}</span> : null}\n </div>\n ))}\n {egne.map((r, i) => (\n <div key={`egen-${i}`} className=\"innspel-maske\" data-art=\"egen\" data-testid={`maske-${i}`} style={prosent(r)} />\n ))}\n </div>\n </div>\n\n {fangst.automasker.length ? <Hint>🔒 {tekst.maskertAvAppenHint}</Hint> : null}\n {egne.length ? <Hint>{tekst.dittStrok}</Hint> : null}\n {allTekst ? <Hint>{tekst.allTekstHint}</Hint> : null}\n\n <div className=\"innspel-stabel\" data-gap=\"sm\">\n <Btn variant=\"danger\" testId=\"fjern-bildet\" ikon=\"🗑\" label={tekst.fjernBildet} onClick={onFjern} disabled={komponerer} />\n <Btn testId=\"legg-ved\" label={tekst.leggVedOgFortsett} hint={tekst.leggVedHintDD42} disabled={komponerer} onClick={() => onLeggVed({ automasker: fangst.automasker, egne, allTekst })} />\n </div>\n </div>\n );\n}\n\n/** Trykkflate og penselbredde fra tokens.css. Reserven er tallene i theme.ts, for et dokument uten stilarket. */\nfunction lesMål(): { touch: number; brush: number } {\n if (typeof getComputedStyle !== 'function') return { touch: 48, brush: 28 };\n const stil = getComputedStyle(document.documentElement);\n const tall = (navn: string, reserve: number) => {\n const v = parseFloat(stil.getPropertyValue(navn));\n return Number.isFinite(v) && v > 0 ? v : reserve;\n };\n return { touch: tall('--innspel-layout-touch', 48), brush: tall('--innspel-screen-brush-width', 28) };\n}\n","import { H } from './primitiver.tsx';\nimport { tekst } from './tekster.ts';\n\n/**\n * 2b — første valg. To flater, ikon og tekst. DD-02: ALDRI et tredje valg, og\n * aldri spørsmål om kategori eller alvorlighet. Fokus 3 i wireframen er venstre\n * flate, deretter høyre.\n */\nexport function Valg({ onVelg }: { onVelg: (spor: 'feil' | 'onske') => void }) {\n const flate = (spor: 'feil' | 'onske', ikon: string, label: string, under: string) => (\n <button type=\"button\" className=\"innspel-flate\" data-testid={`spor-${spor}`} aria-label={`${label}. ${under}`} onClick={() => onVelg(spor)}>\n <span className=\"innspel-flate-ikon\" aria-hidden=\"true\">\n {ikon}\n </span>\n <span className=\"innspel-flate-tittel\">{label}</span>\n <span className=\"innspel-flate-under\">{under}</span>\n </button>\n );\n\n return (\n <div className=\"innspel-stabel\">\n <H sub={tekst.valgUnder}>{tekst.valgTittel}</H>\n <div className=\"innspel-rad\" data-gap=\"md\">\n {flate('feil', '🐞', tekst.sporFeil, tekst.sporFeilUnder)}\n {flate('onske', '💡', tekst.sporOnske, tekst.sporOnskeUnder)}\n </div>\n </div>\n );\n}\n","import {\n InnspelApiError,\n InnspelQueueFullError,\n type AttachmentInput,\n type InnspelClient,\n type KnownIssueCard,\n type MySubmission,\n type OpenFeedbackOptions,\n type PatternFinding,\n} from '@innspel/core';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { sideSti } from '../kontekst.ts';\nimport { lesBildefil } from '../skjermbilde/fil.ts';\nimport { komponer, type Maskering } from '../skjermbilde/komposisjon.ts';\nimport type { Fangst, ScreenshotAdapter } from '../skjermbilde/typer.ts';\nimport { Dialog } from './Dialog.tsx';\nimport { Felt } from './Felt.tsx';\nimport { KjenteFeil } from './KjenteFeil.tsx';\nimport { Kvittering, type KvitteringArt } from './Kvittering.tsx';\nimport { MineInnspill } from './MineInnspill.tsx';\nimport { Banner, Btn, Hint } from './primitiver.tsx';\nimport { Skjermbilde } from './Skjermbilde.tsx';\nimport { tekst } from './tekster.ts';\nimport { Valg } from './Valg.tsx';\n\nexport type Steg = 'valg' | 'kjenteFeil' | 'felt' | 'skjermbilde' | 'kvittering' | 'mine';\n\n/** Det innsenderen har skrevet — det som skal overleve en ny innlogging (tech-decisions.md, «Portalen»). */\nexport interface Utkast {\n track: 'feil' | 'onske';\n text: string;\n}\n\nexport interface ÅpneOpsjoner extends OpenFeedbackOptions {\n /** Gjenopprettet utkast, typisk etter «Logg inn på nytt». */\n draft?: Utkast;\n}\n\nexport interface WidgetProps {\n client: InnspelClient;\n open: boolean;\n onClose: () => void;\n apneOpsjoner?: ÅpneOpsjoner;\n /** Leietakerens navn — på svaret i «Mine innspill» og i «Logg inn på nytt hos …». */\n tenantName?: string;\n /** Fangst av siden. `null` = «Ta bilde av siden» finnes ikke; «Last opp bilde» finnes likevel når leietakeren har skjermbilde på. */\n screenshot: ScreenshotAdapter | null;\n colorScheme?: 'dark' | 'light';\n returnFocusTo?: HTMLElement | null;\n /**\n * Tokenet utløp mens innsenderen skrev. Verten får utkastet og tar innsenderen\n * til ny innlogging; teksten går ikke tapt. Uten denne vises bare feilen.\n */\n onIdentityExpired?: (utkast: Utkast) => void;\n /**\n * «Send anonymt» etter utløpt token: verten gjør klienten anonym (portalen:\n * logger ut), og widgeten sender på nytt når `client.isAnonymous` er sann.\n */\n onSendAnonymously?: () => void;\n}\n\n/**\n * Widgeten — samme flyt som `@innspel/react-native`, i en dialog (DD-47).\n *\n * Flyten er ikke symmetrisk: feilsporet møter kjente feil FØR feltet,\n * ønskesporet ETTER. Skjermbildet lages først ved trykk, aldri ved åpning (K4),\n * og finnes bare når leietakeren har skjermbilde på (DD-26). Teksten sendes\n * først; bildet kan feile alene (DD-42). Køen tømmes når dialogen ÅPNES, aldri\n * ved oppstart (DD-41).\n *\n * Web-spesifikt: `screen` er URL-stien uten query og hash når verten ikke gir\n * et rutenavn; kvitteringen sier «Sendt anonymt» når klienten er anonym; og et\n * utløpt token under skriving beholder utkastet.\n */\nexport function Widget({ client, open, onClose, apneOpsjoner, tenantName, screenshot, colorScheme, returnFocusTo, onIdentityExpired, onSendAnonymously }: WidgetProps) {\n const [steg, setSteg] = useState<Steg>('valg');\n const [spor, setSpor] = useState<'feil' | 'onske'>('feil');\n const [verdi, setVerdi] = useState('');\n const [kort, setKort] = useState<KnownIssueCard[]>([]);\n const [lasterKort, setLasterKort] = useState(false);\n const [lenketTil, setLenketTil] = useState<KnownIssueCard | undefined>();\n const [funn, setFunn] = useState<PatternFinding[]>([]);\n const [fjernede, setFjernede] = useState<string[]>([]);\n const [sender, setSender] = useState(false);\n const [feil, setFeil] = useState<string | undefined>();\n const [utlopt, setUtlopt] = useState(false);\n const [sendNårAnonym, setSendNårAnonym] = useState(false);\n const [kvittering, setKvittering] = useState<{ art: KvitteringArt; nr?: string; vedlegg?: 'feilet' | 'forkastet' }>();\n const [mine, setMine] = useState<MySubmission[]>([]);\n const [lasterMine, setLasterMine] = useState(false);\n const [fangst, setFangst] = useState<Fangst | undefined>();\n const [komponerer, setKomponerer] = useState(false);\n const [vedlegg, setVedlegg] = useState<AttachmentInput | undefined>();\n const åpnetMed = useRef<ÅpneOpsjoner | undefined>(undefined);\n\n const skjerm = apneOpsjoner?.screen ?? (typeof location === 'undefined' ? undefined : sideSti(location.href));\n // Leietakerens grenser: startverdiene fra init(), oppdatert fra plattformen ved åpning (M2.5).\n const [innstillinger, setInnstillinger] = useState({ ...client.settings });\n const skjermbildePå = innstillinger.screenshotsEnabled;\n\n const nullstill = useCallback(() => {\n setSteg('valg');\n setSpor('feil');\n setVerdi('');\n setKort([]);\n setLenketTil(undefined);\n setFunn([]);\n setFjernede([]);\n setFeil(undefined);\n setUtlopt(false);\n setSendNårAnonym(false);\n setKvittering(undefined);\n setFangst(undefined);\n setVedlegg(undefined);\n setKomponerer(false);\n }, []);\n\n const lukk = useCallback(() => {\n onClose();\n nullstill();\n }, [onClose, nullstill]);\n\n const hentKort = useCallback(async () => {\n setLasterKort(true);\n try {\n setKort(await client.knownIssues.for(skjerm ? { screen: skjerm } : {}));\n } finally {\n setLasterKort(false);\n }\n }, [client, skjerm]);\n\n const velgSpor = useCallback(\n async (valgt: 'feil' | 'onske') => {\n setSpor(valgt);\n client.track({ name: 'track_selected', type: valgt });\n if (valgt === 'onske') {\n setSteg('felt');\n return;\n }\n setSteg('kjenteFeil');\n await hentKort();\n },\n [client, hentKort],\n );\n\n // Køen tømmes når dialogen ÅPNES — aldri ved oppstart (DD-41). Et gjenopprettet\n // utkast (etter ny innlogging) legges rett i feltet.\n useEffect(() => {\n if (!open) return;\n åpnetMed.current = apneOpsjoner;\n client.track({ name: 'widget_opened' });\n void client.queue.flush().catch(() => undefined);\n // Konfigurasjonen er et tilbud: svarer den, oppdateres grensene; ellers står de.\n void client.loadSettings().then((s) => setInnstillinger({ ...s })).catch(() => undefined);\n if (apneOpsjoner?.draft) {\n setSpor(apneOpsjoner.draft.track);\n setVerdi(apneOpsjoner.draft.text);\n setFunn(client.scanText(apneOpsjoner.draft.text));\n setSteg('felt');\n } else if (apneOpsjoner?.track) {\n void velgSpor(apneOpsjoner.track);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Treffene er et tilbud, aldri en sperre: tom liste hopper skjermen over.\n useEffect(() => {\n if (steg === 'kjenteFeil' && !lasterKort && kort.length === 0) setSteg('felt');\n }, [steg, lasterKort, kort.length]);\n\n const endreTekst = useCallback(\n (v: string) => {\n setVerdi(v);\n setFunn(client.scanText(v));\n },\n [client],\n );\n\n const taBilde = useCallback(async () => {\n if (!screenshot) return;\n setFeil(undefined);\n try {\n setFangst(await screenshot.capture(document.body));\n setSteg('skjermbilde');\n } catch {\n setFeil(tekst.skjermbildeFeilet);\n }\n }, [screenshot]);\n\n const lastOpp = useCallback(async (fil: File) => {\n setFeil(undefined);\n try {\n setFangst(await lesBildefil(fil));\n setSteg('skjermbilde');\n } catch {\n setFeil(tekst.filFeilet);\n }\n }, []);\n\n const leggVed = useCallback(\n async (m: Maskering) => {\n if (!fangst) return;\n setKomponerer(true);\n try {\n setVedlegg(await komponer(fangst, m));\n } catch {\n setFeil(tekst.skjermbildeFeilet);\n } finally {\n setKomponerer(false);\n setFangst(undefined);\n setSteg('felt');\n }\n },\n [fangst],\n );\n\n const fjernBilde = useCallback(() => {\n setFangst(undefined);\n setVedlegg(undefined);\n setSteg('felt');\n }, []);\n\n const send = useCallback(async () => {\n if (spor === 'onske' && steg === 'felt' && kort.length === 0 && !lasterKort) {\n setSteg('kjenteFeil');\n await hentKort();\n return;\n }\n setSender(true);\n setFeil(undefined);\n setUtlopt(false);\n try {\n const res = await client.capture({\n type: spor,\n text: verdi,\n ...(vedlegg ? { attachment: vedlegg } : {}),\n ...(spor === 'feil' && lenketTil ? { relatedKnownIssueId: lenketTil.id } : {}),\n context: fjernetKontekst(client, fjernede, skjerm),\n } as never);\n\n if (res.status === 'queued') {\n setKvittering({ art: 'kø', ...(res.attachment ? { vedlegg: 'forkastet' as const } : {}) });\n } else {\n setKvittering({\n art: client.isAnonymous ? 'anonym' : spor,\n nr: res.submission.id,\n ...(res.attachment?.status === 'failed' ? { vedlegg: 'feilet' as const } : {}),\n });\n }\n setSteg('kvittering');\n } catch (e) {\n // Teksten mistes ALDRI: den står i feltet, og årsaken er i klartekst.\n if (e instanceof InnspelApiError && e.code === 'feedback_token_expired') {\n setUtlopt(true);\n } else if (e instanceof InnspelQueueFullError) setFeil(e.userMessage);\n else if (e instanceof InnspelApiError) setFeil(e.message);\n else setFeil(tekst.tjenerenSvarteIkke);\n } finally {\n setSender(false);\n }\n }, [client, spor, steg, verdi, vedlegg, lenketTil, fjernede, kort.length, lasterKort, hentKort, skjerm]);\n\n // «Send anonymt» etter utløpt token: verten har gjort klienten anonym; da sendes det.\n useEffect(() => {\n if (sendNårAnonym && client.isAnonymous) {\n setSendNårAnonym(false);\n void send();\n }\n }, [sendNårAnonym, client.isAnonymous, send]);\n\n const jaOgsa = useCallback(\n async (k: KnownIssueCard) => {\n setSender(true);\n try {\n const res = await client.knownIssues.confirm(k.id);\n setKvittering({ art: 'jaOgsa', nr: res.id });\n setSteg('kvittering');\n } catch (e) {\n if (e instanceof InnspelApiError && e.code === 'feedback_token_expired') setUtlopt(true);\n else setFeil(e instanceof InnspelApiError ? e.message : tekst.tjenerenSvarteIkke);\n } finally {\n setSender(false);\n }\n },\n [client],\n );\n\n const visMine = useCallback(async () => {\n setSteg('mine');\n setLasterMine(true);\n try {\n setMine(await client.subjects.submissions());\n } catch (e) {\n setMine([]);\n if (e instanceof InnspelApiError && e.code === 'feedback_token_expired') setUtlopt(true);\n } finally {\n setLasterMine(false);\n }\n }, [client]);\n\n const tilbake = steg === 'skjermbilde' ? fjernBilde : steg !== 'valg' && steg !== 'kvittering' ? nullstill : undefined;\n\n return (\n <Dialog open={open} onClose={lukk} colorScheme={colorScheme} returnFocusTo={returnFocusTo}>\n {tilbake ? <Btn variant=\"ghost\" testId=\"tilbake\" ikon=\"←\" label={tekst.tilbake} onClick={tilbake} /> : null}\n\n {feil ? (\n <Banner live ikon=\"⚠\" tone=\"danger\" testId=\"sendefeil\">\n {tekst.sendefeilBanner(feil)}\n </Banner>\n ) : null}\n\n {utlopt ? (\n <div className=\"innspel-stabel\" data-gap=\"sm\" data-testid=\"utlopt\">\n <Banner live ikon=\"⏱\" tone=\"warning\">\n {tekst.utloptTittel}\n </Banner>\n {onIdentityExpired ? (\n <Btn ikon=\"🔑\" testId=\"logg-inn-paa-nytt\" label={tenantName ? tekst.loggInnPaaNytt(tenantName) : tekst.loggInnPaaNyttGenerisk} onClick={() => onIdentityExpired({ track: spor, text: verdi })} />\n ) : null}\n {onSendAnonymously ? (\n <Btn\n variant=\"secondary\"\n testId=\"send-anonymt\"\n label={tekst.sendAnonymt}\n hint={tekst.sendAnonymtHint}\n onClick={() => {\n setUtlopt(false);\n setSendNårAnonym(true);\n onSendAnonymously();\n }}\n />\n ) : (\n <Hint>{tekst.sendAnonymtHint}</Hint>\n )}\n </div>\n ) : null}\n\n {steg === 'valg' ? (\n <>\n <Valg onVelg={velgSpor} />\n {!client.isAnonymous ? <Btn variant=\"ghost\" testId=\"mine-innspill\" ikon=\"📋\" label={tekst.mineTittel} onClick={visMine} /> : null}\n </>\n ) : null}\n\n {steg === 'kjenteFeil' ? (\n <KjenteFeil\n kort={kort}\n spor={spor}\n laster={lasterKort}\n onJaOgsa={jaOgsa}\n onLigner={(k) => {\n setLenketTil(k);\n setSteg('felt');\n }}\n onNei={() => (spor === 'onske' ? void send() : setSteg('felt'))}\n />\n ) : null}\n\n {steg === 'felt' ? (\n <Felt\n spor={spor}\n verdi={verdi}\n onEndre={endreTekst}\n minTextLength={innstillinger.minTextLength}\n textMaxLength={innstillinger.textMaxLength}\n kontekst={{ ...client.context, ...(skjerm ? { screen: skjerm } : {}) }}\n fjernedeFelter={fjernede}\n onFjernKontekst={(f) => setFjernede((x) => [...x, f])}\n {...(lenketTil ? { lenketTil, onFjernLenke: () => setLenketTil(undefined) } : {})}\n funn={funn}\n onSend={send}\n sender={sender}\n {...(skjermbildePå && screenshot ? { onTaBilde: taBilde } : {})}\n {...(skjermbildePå ? { onLastOppBilde: lastOpp } : {})}\n harVedlegg={vedlegg !== undefined}\n onFjernVedlegg={fjernBilde}\n />\n ) : null}\n\n {steg === 'skjermbilde' && fangst ? <Skjermbilde fangst={fangst} komponerer={komponerer} onFjern={fjernBilde} onLeggVed={leggVed} /> : null}\n\n {steg === 'kvittering' && kvittering ? (\n <Kvittering art={kvittering.art} {...(kvittering.nr ? { saksnummer: kvittering.nr } : {})} {...(kvittering.vedlegg ? { vedlegg: kvittering.vedlegg } : {})} onLukk={lukk} />\n ) : null}\n\n {steg === 'mine' ? <MineInnspill rader={mine} laster={lasterMine} {...(tenantName ? { tenantName } : {})} onNytt={nullstill} /> : null}\n </Dialog>\n );\n}\n\n/**\n * Kallets kontekst: `screen` for denne åpningen, og linjene innsenderen har\n * fjernet satt til `undefined` (DD-05). Det er slik kjernen (0.2.1) skiller\n * «fjern» fra «behold fra init» — å utelate nøkkelen ville fylt feltet igjen.\n * Feltene er en lukket hviteliste, så det som ikke står i `client.context`\n * finnes ikke å fjerne.\n */\nfunction fjernetKontekst(client: InnspelClient, fjernede: string[], skjerm: string | undefined): Record<string, unknown> {\n const ut: Record<string, unknown> = {};\n if (skjerm) ut['screen'] = skjerm;\n for (const k of [...Object.keys(client.context), 'screen']) {\n if (k !== 'sdkVersion' && fjernede.includes(k)) ut[k] = undefined;\n }\n return ut;\n}\n","import type { InnspelClient } from '@innspel/core';\nimport { createContext, useCallback, useContext, useEffect, useInsertionEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { standardAdapter } from './skjermbilde/renderer.ts';\nimport type { ScreenshotAdapter } from './skjermbilde/typer.ts';\nimport { ensureStyles } from './tema.ts';\nimport { Widget, type Utkast, type ÅpneOpsjoner } from './widget/Widget.tsx';\n\ninterface InnspelKontekst {\n client: InnspelClient;\n /** Åpner dialogen. Samme som `client.openFeedback()`. */\n open: (options?: ÅpneOpsjoner) => Promise<void>;\n close: () => void;\n isOpen: boolean;\n}\n\nconst Kontekst = createContext<InnspelKontekst | null>(null);\n\nexport interface InnspelProviderProps {\n client: InnspelClient;\n children?: ReactNode;\n /** Navnet som står på svaret i «Mine innspill» og i «Logg inn på nytt hos …» — leietakerens, ikke Innspels. */\n tenantName?: string;\n /** Palett for dialogen. Standard er lys; `dark` setter `data-innspel-theme=\"dark\"` på dialogen. */\n colorScheme?: 'dark' | 'light';\n /**\n * Fangst av siden for «Ta bilde av siden». Standard er pakkens egen renderer\n * (SVG foreignObject, null avhengigheter). `false` fjerner knappen; «Last opp\n * bilde» finnes likevel når leietakeren har skjermbilde på. Steget finnes ikke\n * i det hele tatt når `screenshotsEnabled` er av (DD-26, K18).\n */\n screenshot?: ScreenshotAdapter | false;\n /** Stilarket legges inn i `<head>` én gang. `false` når verten importerer CSS-en selv. */\n injectStyles?: boolean;\n onIdentityExpired?: (utkast: Utkast) => void;\n onSendAnonymously?: () => void;\n}\n\n/**\n * Pakk siden i denne, og dialogen finnes. Provideren registrerer visningen hos\n * kjernen (så `client.openFeedback()` virker også utenfor React), holder åpen/\n * lukket, og rendrer dialogen sist i treet. Vertens knapp er vertens (DD-21) —\n * pakken tegner aldri en flytende knapp.\n *\n * @example\n * ```tsx\n * const innspel = init({ …, context: webKontekst({ appVersion: '2.4.1' }), storage: createStorage() });\n * <InnspelProvider client={innspel}><App /></InnspelProvider>\n * ```\n */\nexport function InnspelProvider({ client, children, tenantName, colorScheme, screenshot, injectStyles = true, onIdentityExpired, onSendAnonymously }: InnspelProviderProps) {\n const [isOpen, setOpen] = useState(false);\n const [opsjoner, setOpsjoner] = useState<ÅpneOpsjoner | undefined>();\n const utløser = useRef<HTMLElement | null>(null);\n\n useInsertionEffect(() => {\n if (injectStyles) ensureStyles();\n }, [injectStyles]);\n\n const open = useCallback(async (options?: ÅpneOpsjoner) => {\n // Fokus skal tilbake til det som åpnet dialogen (DD-47) — vertens knapp.\n utløser.current = (document.activeElement as HTMLElement | null) ?? null;\n setOpsjoner(options);\n setOpen(true);\n }, []);\n\n const close = useCallback(() => setOpen(false), []);\n\n // Registreres på nytt når klienten byttes (portalen bytter ved innlogging).\n useEffect(() => {\n client.registerPresenter({ open });\n }, [client, open]);\n\n const verdi = useMemo<InnspelKontekst>(() => ({ client, open, close, isOpen }), [client, open, close, isOpen]);\n const adapter = screenshot === false ? null : (screenshot ?? standardAdapter);\n\n return (\n <Kontekst.Provider value={verdi}>\n {children}\n <Widget\n client={client}\n open={isOpen}\n onClose={close}\n {...(opsjoner ? { apneOpsjoner: opsjoner } : {})}\n {...(tenantName ? { tenantName } : {})}\n screenshot={adapter}\n {...(colorScheme ? { colorScheme } : {})}\n returnFocusTo={utløser.current}\n {...(onIdentityExpired ? { onIdentityExpired } : {})}\n {...(onSendAnonymously ? { onSendAnonymously } : {})}\n />\n </Kontekst.Provider>\n );\n}\n\n/**\n * Klienten og `open` fra nærmeste {@link InnspelProvider}. Kaster utenfor\n * provideren: en knapp som stille ikke gjør noe er verre enn en feil under\n * utvikling (tech-decisions.md, «Feil bruk feiler høyt og tidlig»).\n */\nexport function useInnspel(): InnspelKontekst {\n const k = useContext(Kontekst);\n if (!k) {\n throw new Error('[innspel] useInnspel() ble kalt utenfor <InnspelProvider>. Pakk siden din i den — se README.md.');\n }\n return k;\n}\n","import type { InnspelStorage } from '@innspel/core';\n\n/**\n * Offline-køen på web bor i `localStorage` (tech-decisions.md, «M1.5»). Det\n * eneste som lagres er køen (DD-41): maks 30 tekster, aldri et skjermbilde,\n * aldri feedback-tokenet og aldri en install- eller enhets-ID (K20). Tokenet\n * ligger i `sessionStorage` i portalen og bare i minne i pakken.\n *\n * Denne filen er den ENE som får røre `localStorage` — lint-vakten i\n * eslint.config.js håndhever det for resten av `src/`.\n *\n * `localStorage` kan kaste (privat modus i eldre Safari, blokkert lagring,\n * kvote). Da faller adapteren tilbake til minne for resten av økten: teksten\n * mistes aldri stille, den venter bare kortere.\n */\nexport function createStorage(lagring: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null = nettleserLagring()): InnspelStorage {\n const minne = new Map<string, string>();\n const trygg = <T>(f: () => T, ellers: () => T): T => {\n try {\n return f();\n } catch {\n return ellers();\n }\n };\n return {\n get: async (key) => trygg(() => lagring?.getItem(key) ?? minne.get(key) ?? null, () => minne.get(key) ?? null),\n set: async (key, value) => {\n minne.set(key, value);\n trygg(() => lagring?.setItem(key, value), () => undefined);\n },\n remove: async (key) => {\n minne.delete(key);\n trygg(() => lagring?.removeItem(key), () => undefined);\n },\n };\n}\n\n/** Lagring i minne — til test og til verter som ikke vil at køen skal overleve fanen. */\nexport function createMemoryStorage(): InnspelStorage {\n return createStorage(null);\n}\n\nfunction nettleserLagring(): Storage | null {\n try {\n return typeof localStorage === 'undefined' ? null : localStorage;\n } catch {\n return null;\n }\n}\n","import { init, type InnspelClient, type InnspelOptions } from '@innspel/core';\nimport { createIngestTelemetry } from '@innspel/core/telemetri';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { InnspelProvider, type InnspelProviderProps } from './InnspelProvider.tsx';\nimport { webKontekst } from './kontekst.ts';\nimport { createStorage } from './lagring.ts';\nimport { tekst } from './widget/tekster.ts';\nimport type { ÅpneOpsjoner } from './widget/Widget.tsx';\n\nexport interface MountOptions extends Omit<InnspelProviderProps, 'client' | 'children'> {\n /** En ferdig klient fra `init()` — eller opsjonene under, så lager `mount` den. */\n client?: InnspelClient;\n baseUrl?: string;\n tenantKey?: string;\n identityProvider?: InnspelOptions['identityProvider'];\n /** Standard er offline-køen i `localStorage` (DD-41). */\n storage?: InnspelOptions['storage'];\n /** Vertens bygg — legges på konteksten. Plattform, nettleser og språk settes av pakken. */\n appVersion?: string;\n build?: string;\n textMaxLength?: InnspelOptions['textMaxLength'];\n minTextLength?: number;\n screenshotsEnabled?: boolean;\n /**\n * Standard er plattformens eget mottak for målemodellen (M4.2): anonymt, aldri tekst,\n * aldri en tredjepart. `false` skrur det av; et eget objekt med `emit(e)` erstatter det.\n */\n telemetry?: InnspelOptions['telemetry'] | false;\n /** Injiseres i test. Standard er `fetch` i nettleseren. */\n fetch?: InnspelOptions['fetch'];\n}\n\nexport interface Mounted {\n client: InnspelClient;\n open: (options?: ÅpneOpsjoner) => Promise<void>;\n close: () => void;\n /**\n * Gjør vertens egen knapp til inngangen (DD-21): klikk åpner, knappen får\n * `aria-haspopup=\"dialog\"` og en beskrivelse (DD-47), og fokus kommer tilbake\n * til den når dialogen lukkes. Returnerer en funksjon som løsner koblingen.\n */\n bindTrigger: (knapp: HTMLElement, options?: ÅpneOpsjoner) => () => void;\n unmount: () => void;\n}\n\n/**\n * Vanilla-inngangen: monter dialogen i et element, og bind vertens knapp.\n *\n * @example\n * ```ts\n * const innspel = mount(document.getElementById('innspel')!, {\n * baseUrl: 'https://api.innspel.example',\n * tenantKey: 'ik_pub_xxxxxxxx',\n * identityProvider: hentFeedbackToken, // eller null = anonym modus\n * appVersion: '2.4.1',\n * });\n * innspel.bindTrigger(document.getElementById('send-innspill')!);\n * ```\n */\nexport function mount(el: HTMLElement, options: MountOptions): Mounted {\n if (!(el instanceof HTMLElement)) {\n throw new Error('[innspel] mount(el, …): el må være et HTML-element i dokumentet. Se README.md.');\n }\n const { client: gitt, baseUrl, tenantKey, identityProvider, storage, appVersion, build, textMaxLength, minTextLength, screenshotsEnabled, telemetry, fetch: hentFn, ...provider } = options;\n\n // Målemodellen (M4.2): plattformens eget mottak som standard — verten slipper å vite om\n // understien. Aldri en tredjepart, aldri tekst, aldri pseudonym. `false` skrur det av.\n const maaling =\n telemetry === false\n ? undefined\n : (telemetry ?? (baseUrl && tenantKey ? createIngestTelemetry({ baseUrl, tenantKey, platform: 'web', ...(appVersion ? { appVersion } : {}), ...(hentFn ? { fetch: hentFn } : {}) }) : undefined));\n\n const client =\n gitt ??\n init({\n baseUrl: baseUrl!,\n tenantKey: tenantKey!,\n identityProvider: identityProvider === undefined ? (undefined as never) : identityProvider,\n storage: storage ?? createStorage(),\n context: webKontekst({ ...(appVersion ? { appVersion } : {}), ...(build ? { build } : {}) }),\n ...(textMaxLength !== undefined ? { textMaxLength } : {}),\n ...(minTextLength !== undefined ? { minTextLength } : {}),\n ...(screenshotsEnabled !== undefined ? { screenshotsEnabled } : {}),\n ...(maaling ? { telemetry: maaling } : {}),\n ...(hentFn ? { fetch: hentFn } : {}),\n });\n\n const root: Root = createRoot(el);\n root.render(<InnspelProvider client={client} {...provider} />);\n\n return {\n client,\n open: (o) => client.openFeedback(o),\n close: () => {\n // Presenteren har ingen close; ESC-hendelsen er den samme veien brukeren tar.\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));\n },\n bindTrigger(knapp, o) {\n const onClick = () => void client.openFeedback(o);\n knapp.addEventListener('click', onClick);\n knapp.setAttribute('aria-haspopup', 'dialog');\n if (!knapp.getAttribute('aria-description') && !knapp.getAttribute('aria-describedby')) {\n knapp.setAttribute('aria-description', tekst.inngangHint);\n }\n return () => {\n knapp.removeEventListener('click', onClick);\n knapp.removeAttribute('aria-haspopup');\n };\n },\n unmount: () => root.unmount(),\n };\n}\n","import type { ReactNode } from 'react';\nimport { PRIVAT_ATTRIBUTT } from './skjermbilde/typer.ts';\n\n/**\n * Merk det som aldri skal være med på et skjermbilde (DD-39): et navn, et\n * kontonummer, en samtale. Innholdet fjernes fra klonen FØR rendring og feltet\n * maskeres i bitmapen — merket «Maskert av appen», og penselen kan ikke oppheve\n * det. Din kode er sannheten, ikke brukerens presisjon.\n *\n * Utenfor React er det bare attributtet: `<div data-innspel-private>…</div>`.\n *\n * Elementet må ha en boks (ingen `display: contents`), ellers er det ingenting å\n * måle. Standard er en `div`; `inline` gir en `span`.\n */\nexport function InnspelPrivate({ children, inline, className }: { children?: ReactNode; inline?: boolean; className?: string }) {\n const attr = { [PRIVAT_ATTRIBUTT]: 'true', className, 'data-testid': 'innspel-privat' };\n return inline ? <span {...attr}>{children}</span> : <div {...attr}>{children}</div>;\n}\n"],"names":["getAuthToken","auth","callback","token","jsonBodySerializer","body","_key","value","separatorArrayExplode","style","separatorArrayNoExplode","separatorObjectExplode","serializeArrayParam","allowReserved","explode","name","joinedValues2","v","separator","joinedValues","serializePrimitiveParam","serializeObjectParam","valueOnly","values","key","PATH_PARAM_RE","defaultPathSerializer","path","_url","url","matches","match","replaceValue","getUrl","baseUrl","query","querySerializer","pathUrl","search","getValidRequestBody","options","hasBody","createQuerySerializer","parameters","args","queryParams","serializedArray","serializedObject","serializedPrimitive","getParseAs","contentType","cleanContent","type","checkForExistence","setAuthParams","buildUrl","mergeConfigs","a","b","config","mergeHeaders","headersEntries","headers","entries","mergedHeaders","header","iterator","Interceptors","id","index","fn","createInterceptors","defaultQuerySerializer","defaultHeaders","createConfig","override","createSseClient","onRequest","onSseError","onSseEvent","responseTransformer","responseValidator","sseDefaultRetryDelay","sseMaxRetryAttempts","sseMaxRetryDelay","sseSleepFn","lastEventId","sleep","ms","resolve","retryDelay","attempt","signal","requestInit","request","response","reader","buffer","abortHandler","done","chunks","chunk","lines","dataLines","eventName","line","parsed","data","parsedJson","rawData","error","backoff","createClient","_config","getConfig","setConfig","config2","interceptors","beforeRequest","opts","resolvedOpts","throwOnError","responseStyle","request2","_fetch","result","parseAs","emptyData","text","textError","jsonError","finalError","makeMethodFn","method","makeSseFn","url2","init","client","eventsSend","VERSJON","MAKS_BUNT","STRAKS","createIngestTelemetry","klient","ventetid","maks","timer","send","events","event","tilLedning","at","aarsak","reason","r","PRIVAT_ATTRIBUTT","WIDGET_ATTRIBUTT","UTELATT","klonForBilde","rot","viewport","automasker","tekstRekter","klonNode","orig","tekstlinjer","el","klon","inlineStil","synligRekt","bildeSomFlate","img","nøytralFlate","i","opt","k","barn","c","ctx","flate","beregnet","deler","navn","verdi","node","range","ut","x1","y1","x2","y2","serialiserSvg","scroll","bakgrunn","xml","velgSkala","dpr","tak","tegnSvg","svg","skala","lastet","reject","canvas","skalerRekt","s","renderPage","standardAdapter","MERKE","ensureStyles","doc","tokensCss","stylesCss","css","nettleserNavn","ua","sideSti","webKontekst","vert","miljø","os","lesBildefil","fil","VEDLEGG_GRENSER","bitmap","dekod","KVALITET","TAK","komponer","fangst","maskering","farger","lesMaskefarger","inn","fyll","skaler","pikseler","tilBlob","liten","lctx","les","reserve","tekst","versjon","min","etikett","tittel","auto","egne","allTekst","fraFil","nr","arsak","leietaker","n","lofte","frist","Dialog","open","onClose","children","footer","colorScheme","returnFocusTo","useRef","sisteFokus","form","useForm","useLayoutEffect","dialog","fokuserbare","vertsnoder","tilbake","useEffect","onKey","e","liste","første","siste","aktiv","jsx","jsxs","FOKUSERBAR","setForm","useState","bp","mq","oppdater","Btn","label","onClick","variant","ikon","hint","disabled","ariaLabel","grow","tall","testId","autoFocus","hintId","slug","H","sub","nivaa","Hint","P","Card","dashed","role","StatusPill","farge","Banner","tone","live","Skeleton","hoy","Felt","spor","onEndre","minTextLength","textMaxLength","kontekst","fjernedeFelter","onFjernKontekst","lenketTil","onFjernLenke","funn","onSend","sender","onTaBilde","onLastOppBilde","harVedlegg","onFjernVedlegg","apen","setApen","beholdt","setBeholdt","feltId","useId","filId","brukt","forKort","full","visTeller","uavklart","f","linjer","useMemo","felt","x","l","KjenteFeil","kort","laster","onJaOgsa","onLigner","onNei","under","Kvittering","art","saksnummer","vedlegg","onLukk","innhold","overskrift","brodtekst","IKON","formaterFrist","iso","d","statusVisning","status","deadlineAt","venterVisning","radEtikett","rad","MineInnspill","rader","tenantName","onNytt","overskriftNivaa","venter","nokkel","svar","Skjermbilde","komponerer","onFjern","onLeggVed","verktoy","setVerktoy","setAllTekst","setEgne","canvasRef","flateRef","strok","mål","lesMål","bilde","punkt","ratio","onDown","p","treff","treffer","_","trykkTilRekt","onMove","onUp","rekter","strokTilRekter","prosent","knapp","valgt","a11y","stil","Valg","onVelg","Widget","apneOpsjoner","screenshot","onIdentityExpired","onSendAnonymously","steg","setSteg","setSpor","setVerdi","setKort","lasterKort","setLasterKort","setLenketTil","setFunn","fjernede","setFjernede","setSender","feil","setFeil","utlopt","setUtlopt","sendNårAnonym","setSendNårAnonym","kvittering","setKvittering","mine","setMine","lasterMine","setLasterMine","setFangst","setKomponerer","setVedlegg","åpnetMed","skjerm","innstillinger","setInnstillinger","skjermbildePå","nullstill","useCallback","lukk","hentKort","velgSpor","endreTekst","taBilde","lastOpp","leggVed","m","fjernBilde","res","fjernetKontekst","InnspelApiError","InnspelQueueFullError","jaOgsa","visMine","Fragment","Kontekst","createContext","InnspelProvider","injectStyles","isOpen","setOpen","opsjoner","setOpsjoner","utløser","useInsertionEffect","close","adapter","useInnspel","useContext","createStorage","lagring","nettleserLagring","minne","trygg","ellers","createMemoryStorage","mount","gitt","tenantKey","identityProvider","storage","appVersion","build","screenshotsEnabled","telemetry","hentFn","provider","maaling","root","createRoot","o","InnspelPrivate","inline","className","attr"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -0,0 +1,26 @@
1
+ import type { ContextInput } from '@innspel/core';
2
+ /**
3
+ * Den tekniske konteksten på web — K5 er en lukket hviteliste, og på web er den
4
+ * FEM linjer (tech-decisions.md, «M1.5»): `screen` er URL-stien uten query
5
+ * string og hash (begge kan bære tokens), `os` er nettleseren med versjon
6
+ * (kontrakten: «På web: nettleser»), `locale` fra nettleseren, `sdkVersion` fra
7
+ * kjernen, og `appVersion`/`build` fra vertens konfig. Viewport finnes ikke.
8
+ *
9
+ * Aldri user-agent-strengen rå: den er et fingeravtrykk (K20). Bare familie og
10
+ * hovedversjon, som «Chrome 129».
11
+ */
12
+ export declare function nettleserNavn(ua: string): string | undefined;
13
+ /** Stien alene. Query string og hash strippes — de kan bære tokens. */
14
+ export declare function sideSti(url: string): string;
15
+ /**
16
+ * Konteksten slik `init()` skal ha den. `platform` er alltid `web`; verten legger
17
+ * på `appVersion`/`build`. `screen` settes per åpning av widgeten
18
+ * (`open({ screen })`) og ikke her — stien kan ha endret seg siden `init`.
19
+ */
20
+ export declare function webKontekst(vert?: {
21
+ appVersion?: string;
22
+ build?: string;
23
+ }, miljø?: {
24
+ userAgent?: string;
25
+ language?: string;
26
+ }): ContextInput;
@@ -0,0 +1,17 @@
1
+ import type { InnspelStorage } from '@innspel/core';
2
+ /**
3
+ * Offline-køen på web bor i `localStorage` (tech-decisions.md, «M1.5»). Det
4
+ * eneste som lagres er køen (DD-41): maks 30 tekster, aldri et skjermbilde,
5
+ * aldri feedback-tokenet og aldri en install- eller enhets-ID (K20). Tokenet
6
+ * ligger i `sessionStorage` i portalen og bare i minne i pakken.
7
+ *
8
+ * Denne filen er den ENE som får røre `localStorage` — lint-vakten i
9
+ * eslint.config.js håndhever det for resten av `src/`.
10
+ *
11
+ * `localStorage` kan kaste (privat modus i eldre Safari, blokkert lagring,
12
+ * kvote). Da faller adapteren tilbake til minne for resten av økten: teksten
13
+ * mistes aldri stille, den venter bare kortere.
14
+ */
15
+ export declare function createStorage(lagring?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'> | null): InnspelStorage;
16
+ /** Lagring i minne — til test og til verter som ikke vil at køen skal overleve fanen. */
17
+ export declare function createMemoryStorage(): InnspelStorage;