@innspel/react-native 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/dist/index.cjs +1397 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +444 -0
- package/dist/index.d.ts +444 -0
- package/dist/index.js +1361 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/InnspelProvider.tsx","../src/tema.ts","../src/generated/tokens.ts","../src/widget/Widget.tsx","../src/widget/Felt.tsx","../src/widget/primitiver.tsx","../src/widget/tekster.ts","../src/widget/Valg.tsx","../src/widget/KjenteFeil.tsx","../src/widget/Kvittering.tsx","../src/widget/MineInnspill.tsx","../src/widget/status.ts","../src/lagring.ts"],"sourcesContent":["import type { InnspelClient, OpenFeedbackOptions } from '@innspel/core';\nimport React, { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';\nimport { byggTema, TemaProvider, type PartialTheme } from './tema.js';\nimport { Widget } from './widget/Widget.js';\n\ninterface InnspelKontekst {\n client: InnspelClient;\n /** Åpner widgeten. Samme som `client.openFeedback()`. */\n open: (options?: OpenFeedbackOptions) => Promise<void>;\n close: () => void;\n}\n\nconst Kontekst = createContext<InnspelKontekst | null>(null);\n\n/**\n * Pakk appen i denne, og widgeten finnes.\n *\n * Provideren gjør tre ting: den registrerer visningen hos kjernen (så\n * `client.openFeedback()` virker hvor som helst i appen, også utenfor React),\n * den holder temaet, og den rendrer selve arket.\n *\n * @example\n * ```tsx\n * const innspel = init({ … });\n *\n * export default function App() {\n * return (\n * <InnspelProvider client={innspel}>\n * <MinApp />\n * </InnspelProvider>\n * );\n * }\n * ```\n */\nexport function InnspelProvider({\n client,\n children,\n theme,\n colorScheme = 'dark',\n tenantName,\n}: {\n client: InnspelClient;\n children?: React.ReactNode;\n /** Vertens egne tokens. Alt som utelates faller tilbake på Innspels tema. */\n theme?: PartialTheme;\n colorScheme?: 'dark' | 'light';\n /** Navnet som står på svaret i «Mine innspill» — leietakerens, ikke Innspels. */\n tenantName?: string;\n}) {\n const [synlig, setSynlig] = useState(false);\n const [apneOpsjoner, setApneOpsjoner] = useState<OpenFeedbackOptions | undefined>();\n const registrert = useRef(false);\n\n const open = useCallback(\n async (options?: OpenFeedbackOptions) => {\n setApneOpsjoner(options);\n setSynlig(true);\n },\n [],\n );\n\n const close = useCallback(() => setSynlig(false), []);\n\n // Registreres én gang. Kjernen kaller `presenter.open()` fra\n // `client.openFeedback()`, som er veien inn for kode som ikke er en\n // React-komponent — en navigasjonshandler, en krasjlytter hos verten.\n if (!registrert.current) {\n client.registerPresenter({ open });\n registrert.current = true;\n }\n\n const tema = useMemo(() => byggTema(theme, colorScheme), [theme, colorScheme]);\n const verdi = useMemo<InnspelKontekst>(() => ({ client, open, close }), [client, open, close]);\n\n return (\n <Kontekst.Provider value={verdi}>\n <TemaProvider value={tema}>\n {children}\n <Widget\n client={client}\n synlig={synlig}\n {...(apneOpsjoner ? { apneOpsjoner } : {})}\n {...(tenantName ? { tenantName } : {})}\n onLukk={close}\n />\n </TemaProvider>\n </Kontekst.Provider>\n );\n}\n\n/**\n * Klienten og `open` fra nærmeste {@link InnspelProvider}.\n *\n * Kaster utenfor provideren i stedet for å gi `null`: en knapp som stille ikke\n * gjør noe er verre enn en feil under utvikling (tech-decisions.md, «Feil bruk\n * feiler høyt og tidlig»).\n */\nexport function useInnspel(): InnspelKontekst {\n const k = useContext(Kontekst);\n if (!k) {\n throw new Error(\n '[innspel] useInnspel() ble kalt utenfor <InnspelProvider>. Pakk appen din i den — se README.md.',\n );\n }\n return k;\n}\n","import { createContext, useContext } from 'react';\nimport { light, t, type InnspelColors, type InnspelTheme } from './generated/tokens.js';\n\n/**\n * Widgeten lever INNE i vertsappen (DD-21) og skal arve dens flate. Verten\n * sender et delvis tema; alt den ikke sender faller tilbake på Innspels eget\n * (M0.4), som er generert fra `theme/theme.ts` og målt mot WCAG AA.\n *\n * Ingen hex-verdi, px-verdi eller fontstørrelse skrives i en komponent — alt\n * hentes herfra (CLAUDE.md, «Styling»). `fontFamily` finnes ikke: systemfonten\n * er standard i React Native, og å sette den ville brutt med vertsappen.\n */\n\n/**\n * De genererte tokenene er `as const`, så `t.touch` har typen `48` og ikke\n * `number`. Det er riktig for KILDEN — den skal ikke kunne endres ved et uhell\n * — men gjør temaet umulig å overstyre: verten ville måttet sende nøyaktig 48.\n * Denne typen åpner verdiene uten å åpne nøkkelsettet: en vert kan bytte en\n * farge, men ikke finne på en ny.\n */\nexport type Tema = Omit<\n InnspelTheme,\n 'color' | 'space' | 'radius' | 'font' | 'lineHeight' | 'motion' | 'touch' | 'screenPadding' | 'hairline'\n> & {\n color: Record<keyof InnspelColors, string>;\n space: Record<keyof InnspelTheme['space'], number>;\n radius: Record<keyof InnspelTheme['radius'], number>;\n font: Record<keyof InnspelTheme['font'], number>;\n lineHeight: Record<keyof InnspelTheme['lineHeight'], number>;\n motion: Record<keyof InnspelTheme['motion'], number>;\n touch: number;\n screenPadding: number;\n hairline: number;\n};\n\nexport type PartialTheme = {\n color?: Partial<Tema['color']>;\n} & Partial<Omit<Tema, 'color'>>;\n\n/**\n * Fletter vertens tokens over Innspels egne.\n *\n * @param vertens Delvis tema fra `<InnspelProvider theme={…}>`.\n * @param palett `dark` er standard: widgeten åpnes oftest over en app i mørk\n * modus, og et lyst ark over en mørk app blender.\n */\nexport function byggTema(vertens?: PartialTheme, palett: 'dark' | 'light' = 'dark'): Tema {\n const bunn = (palett === 'light' ? light : t) as unknown as Tema;\n if (!vertens) return bunn;\n\n return {\n ...bunn,\n ...vertens,\n color: { ...bunn.color, ...vertens.color },\n };\n}\n\nconst TemaContext = createContext<Tema>(t as unknown as Tema);\n\nexport const TemaProvider = TemaContext.Provider;\n\n/** Tokenene som gjelder her. Bruk ALDRI en literal farge eller avstand i stedet. */\nexport function useTema(): Tema {\n return useContext(TemaContext);\n}\n","/**\n * tokens.ts — GENERERT fra theme/theme.ts (avtrykk f03570c596e2).\n * Rediger aldri denne filen. Endre temaet i kilden og kjør\n * `node scripts/generate-tokens.ts`, som CI verifiserer med `--check`.\n *\n * Tokenene @innspel/react-native faller tilbake på når verten ikke sender egne.\n * Widgeten lever inne i vertsappen og skal arve dens flate (DD-21); dette er\n * bunnen, ikke fasiten.\n *\n * 72 kontrastpar er målt mot WCAG AA i begge paletter, og generatoren\n * nekter å skrive hvis ett faller under kravet. Farge bærer aldri mening alene\n * — hver status har ikon og tekstetikett (DD-08).\n *\n * fontFamily finnes ikke her med vilje: systemfonten er standard i React\n * Native, og å sette den ville brutt med vertsappen.\n */\n\n/** Mørk palett — fallback når verten ikke sender egne tokens. */\nexport const t = {\n color: {\n bg: \"#111417\",\n surface: \"#1A1E22\",\n surfaceRaised: \"#232830\",\n border: \"#2E343B\",\n borderStrong: \"#3D444D\",\n borderInteractive: \"#7C8894\",\n textPrimary: \"#F2F4F6\",\n textSecondary: \"#B4BCC5\",\n textMuted: \"#8D96A1\",\n textDisabled: \"#5A626B\",\n actionPrimary: \"#5AD3E2\",\n onActionPrimary: \"#04252A\",\n actionSecondaryBorder: \"#7C8894\",\n actionSecondaryText: \"#F2F4F6\",\n brand: \"#5AD3E2\",\n onBrand: \"#04252A\",\n brandFill: \"#0E7C8C\",\n onBrandFill: \"#FFFFFF\",\n brandBg: \"#0C2A30\",\n danger: \"#FF7A8C\",\n dangerFill: \"#C4001F\",\n onDangerFill: \"#FFFFFF\",\n dangerBg: \"#2C1116\",\n success: \"#3ED88A\",\n onSuccess: \"#062015\",\n successBg: \"#0E2A1E\",\n warning: \"#FFC24D\",\n onWarning: \"#2A1C02\",\n warningBg: \"#2C2107\",\n info: \"#5CC0FF\",\n onInfo: \"#04222F\",\n infoBg: \"#0E2531\",\n neutral: \"#A3ACB6\",\n onNeutral: \"#111417\",\n neutralBg: \"#242A31\",\n scrim: \"rgba(0, 0, 0, 0.72)\",\n },\n space: {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n xxl: 48,\n },\n radius: {\n sm: 6,\n md: 8,\n lg: 12,\n pill: 999,\n },\n font: {\n h1: 24,\n h2: 21,\n h3: 18,\n body: 16,\n small: 13,\n tiny: 11,\n },\n lineHeight: {\n h1: 30,\n h2: 27,\n h3: 24,\n body: 24,\n small: 18,\n tiny: 16,\n },\n weight: {\n regular: \"400\",\n medium: \"500\",\n semibold: \"600\",\n bold: \"700\",\n },\n motion: {\n fast: 120,\n base: 200,\n slow: 320,\n },\n touch: 48,\n screenPadding: 24,\n hairline: 1,\n} as const;\n\n/** Lys palett. */\nexport const light = {\n color: {\n bg: \"#F6F7F9\",\n surface: \"#FFFFFF\",\n surfaceRaised: \"#EDEFF3\",\n border: \"#D2D7DE\",\n borderStrong: \"#B9C0C9\",\n borderInteractive: \"#6F7883\",\n textPrimary: \"#14181D\",\n textSecondary: \"#454D57\",\n textMuted: \"#5C6470\",\n textDisabled: \"#9AA2AD\",\n actionPrimary: \"#0A6673\",\n onActionPrimary: \"#FFFFFF\",\n actionSecondaryBorder: \"#6F7883\",\n actionSecondaryText: \"#14181D\",\n brand: \"#0A6673\",\n onBrand: \"#FFFFFF\",\n brandFill: \"#0A6673\",\n onBrandFill: \"#FFFFFF\",\n brandBg: \"#E0F0F2\",\n danger: \"#B3001B\",\n dangerFill: \"#B3001B\",\n onDangerFill: \"#FFFFFF\",\n dangerBg: \"#FCE8EA\",\n success: \"#04693C\",\n onSuccess: \"#FFFFFF\",\n successBg: \"#E4F4EC\",\n warning: \"#7A5200\",\n onWarning: \"#FFFFFF\",\n warningBg: \"#FBF1DE\",\n info: \"#00588F\",\n onInfo: \"#FFFFFF\",\n infoBg: \"#E4F0F8\",\n neutral: \"#5C6470\",\n onNeutral: \"#FFFFFF\",\n neutralBg: \"#EEF0F3\",\n scrim: \"rgba(10, 14, 18, 0.45)\",\n },\n space: {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n xxl: 48,\n },\n radius: {\n sm: 6,\n md: 8,\n lg: 12,\n pill: 999,\n },\n font: {\n h1: 24,\n h2: 21,\n h3: 18,\n body: 16,\n small: 13,\n tiny: 11,\n },\n lineHeight: {\n h1: 30,\n h2: 27,\n h3: 24,\n body: 24,\n small: 18,\n tiny: 16,\n },\n weight: {\n regular: \"400\",\n medium: \"500\",\n semibold: \"600\",\n bold: \"700\",\n },\n motion: {\n fast: 120,\n base: 200,\n slow: 320,\n },\n touch: 48,\n screenPadding: 24,\n hairline: 1,\n} as const;\n\n/** Innspillets statuser. `fg`/`bg` er TOKENNAVN og slås opp i den aktive paletten. Nøklene er Submissions.SubmissionStatus i contracts/. */\nexport const submissionStatus = {\n ny: {\n statusType: \"reviewing\",\n ikon: \"ellipse-outline\",\n etikett: { feil: \"Mottatt\", onske: \"Mottatt\" },\n fg: \"textSecondary\",\n bg: \"neutralBg\",\n variant: \"outline\",\n },\n vurderes: {\n statusType: \"reviewing\",\n ikon: \"hourglass-outline\",\n etikett: { feil: \"Vurderes\", onske: \"Vurderes\" },\n fg: \"info\",\n bg: \"infoBg\",\n variant: \"outline\",\n },\n planlagt: {\n statusType: \"active\",\n ikon: \"calendar-outline\",\n etikett: { feil: \"Planlagt\", onske: \"Planlagt\" },\n fg: \"brand\",\n bg: \"brandBg\",\n variant: \"outline\",\n },\n bygges: {\n statusType: \"active\",\n ikon: \"construct-outline\",\n etikett: { feil: \"Retter nå\", onske: \"Bygger\" },\n fg: \"brand\",\n bg: \"brandBg\",\n variant: \"filled\",\n },\n kjent_feil: {\n statusType: \"active\",\n ikon: \"warning-outline\",\n etikett: { feil: \"Kjent feil\", onske: \"Kjent feil\" },\n fg: \"warning\",\n bg: \"warningBg\",\n variant: \"outline\",\n },\n levert: {\n statusType: \"complete\",\n ikon: \"checkmark-circle-outline\",\n etikett: { feil: \"Rettet\", onske: \"Levert\" },\n fg: \"success\",\n bg: \"successBg\",\n variant: \"outline\",\n },\n avvist: {\n statusType: \"closed\",\n ikon: \"close-circle-outline\",\n etikett: { feil: \"Avvist\", onske: \"Avvist\" },\n fg: \"danger\",\n bg: \"dangerBg\",\n variant: \"outline\",\n },\n duplikat: {\n statusType: \"closed\",\n ikon: \"git-merge-outline\",\n etikett: { feil: \"Slått sammen\", onske: \"Slått sammen\" },\n fg: \"neutral\",\n bg: \"neutralBg\",\n variant: \"outline\",\n },\n} as const;\n\n/** Programmets statuser. Nøklene er Programs.ProgramStatus i contracts/. */\nexport const programStatus = {\n utkast: {\n ikon: \"create-outline\",\n etikett: \"Utkast\",\n fg: \"textSecondary\",\n bg: \"neutralBg\",\n variant: \"dashed\",\n },\n aapen: {\n ikon: \"ellipse-outline\",\n etikett: \"Åpen — invitasjoner kan sendes\",\n fg: \"info\",\n bg: \"infoBg\",\n variant: \"outline\",\n },\n aktiv: {\n ikon: \"checkmark-circle-outline\",\n etikett: \"Aktiv\",\n fg: \"success\",\n bg: \"successBg\",\n variant: \"outline\",\n },\n avsluttes: {\n ikon: \"time-outline\",\n etikett: \"Avsluttes — oppfølginger går ut\",\n fg: \"warning\",\n bg: \"warningBg\",\n variant: \"outline\",\n },\n avsluttet: {\n ikon: \"checkmark-circle-outline\",\n etikett: \"Avsluttet — rapport fryst\",\n fg: \"neutral\",\n bg: \"neutralBg\",\n variant: \"outline\",\n },\n avbrutt: {\n ikon: \"close-circle\",\n etikett: \"Avbrutt\",\n fg: \"onDangerFill\",\n bg: \"dangerFill\",\n variant: \"filled\",\n },\n} as const;\n\n/** Skjermbilde-maskering. Faste signalfarger, uavhengig av palett (DD-39, DD-40). Vedlegg er M1.3. */\nexport const screenRules = {\n brushFill: \"#E5007D\",\n autoMaskFill: \"#101114\",\n autoMaskStroke: \"#E5007D\",\n previewBackdrop: \"#000000\",\n} as const;\n\n/** Formen widgeten tar imot. Verten sender et delvis tema; resten faller tilbake hit. */\nexport type InnspelTheme = typeof t;\nexport type InnspelColors = InnspelTheme['color'];\n","import {\n InnspelApiError,\n InnspelQueueFullError,\n type InnspelClient,\n type KnownIssueCard,\n type MySubmission,\n type OpenFeedbackOptions,\n type PatternFinding,\n} from '@innspel/core';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Modal, Pressable, Text, View } from 'react-native';\nimport { useTema } from '../tema.js';\nimport { Felt } from './Felt.js';\nimport { Valg } from './Valg.js';\nimport { KjenteFeil } from './KjenteFeil.js';\nimport { Kvittering } from './Kvittering.js';\nimport { MineInnspill } from './MineInnspill.js';\nimport { Banner, Btn } from './primitiver.js';\nimport { tekst } from './tekster.js';\n\nexport type Steg = 'valg' | 'kjenteFeil' | 'felt' | 'kvittering' | 'mine';\n\n/**\n * Widgeten. Ett ark over vertsappen — aldri en flytende knapp over innhold\n * (DD-21).\n *\n * **DD-47, og hvorfor det står her og ikke i en TODO:** arket er en dialog og\n * oppfører seg som en. `<Modal>` gir fokusfellen; `onRequestClose` er\n * Android-tilbake og ESC på tastatur; `accessibilityViewIsModal` skjuler\n * vertsappen for skjermlesere på iOS; kvitteringen er en live-region. Sentrys\n * crash-modal mangler alle fire (issue #23288, #9291) — den er leverandøren som\n * dokumenterer både løsningen og mangelen.\n *\n * **Flyten er ikke symmetrisk.** Feilsporet møter kjente feil FØR feltet: den\n * som står i en feil skal slippe å skrive noe hvis svaret allerede finnes.\n * Ønskesporet møter dem ETTER: et ønske må formuleres før det kan sammenlignes.\n */\nexport function Widget({\n client,\n synlig,\n apneOpsjoner,\n onLukk,\n tenantName,\n}: {\n client: InnspelClient;\n synlig: boolean;\n apneOpsjoner?: OpenFeedbackOptions;\n onLukk: () => void;\n tenantName?: string;\n}) {\n const tema = useTema();\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 [kvittering, setKvittering] = useState<{ art: 'feil' | 'onske' | 'jaOgsa' | 'kø'; nr?: string }>();\n const [mine, setMine] = useState<MySubmission[]>([]);\n const [lasterMine, setLasterMine] = useState(false);\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 setKvittering(undefined);\n }, []);\n\n const lukk = useCallback(() => {\n onLukk();\n nullstill();\n }, [onLukk, nullstill]);\n\n // Køen tømmes når widgeten ÅPNES — aldri ved oppstart (DD-41). Resultatet\n // vises ikke: en flush som lykkes er ikke en hendelse innsenderen ba om.\n useEffect(() => {\n if (!synlig) return;\n client.track({ name: 'widget_opened' });\n void client.queue.flush().catch(() => undefined);\n\n if (apneOpsjoner?.track) velgSpor(apneOpsjoner.track);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [synlig]);\n\n const hentKort = useCallback(async () => {\n setLasterKort(true);\n try {\n const q = apneOpsjoner?.screen ? { screen: apneOpsjoner.screen } : {};\n setKort(await client.knownIssues.for(q));\n } finally {\n setLasterKort(false);\n }\n }, [client, apneOpsjoner?.screen]);\n\n const velgSpor = useCallback(\n async (valgt: 'feil' | 'onske') => {\n setSpor(valgt);\n client.track({ name: 'track_selected', type: valgt });\n\n if (valgt === 'onske') {\n // Ønskesporet skriver først; sammenligningen kommer etterpå.\n setSteg('felt');\n return;\n }\n\n setSteg('kjenteFeil');\n await hentKort();\n },\n [client, hentKort],\n );\n\n // Treffene er et tilbud, aldri en sperre (wireframe 2c): er lista tom når\n // oppslaget er ferdig, hoppes skjermen over — rett til feltet, ingen melding.\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 send = useCallback(async () => {\n // Ønskesporet: feltet fører til kjente feil-sjekken, ikke rett til sending.\n if (spor === 'onske' && steg === 'felt' && kort.length === 0 && !lasterKort) {\n setSteg('kjenteFeil');\n await hentKort();\n return;\n }\n\n setSender(true);\n setFeil(undefined);\n try {\n const res = await client.capture({\n type: spor,\n text: verdi,\n ...(spor === 'feil' && lenketTil ? { relatedKnownIssueId: lenketTil.id } : {}),\n ...(fjernede.length ? { context: fjernetKontekst(client, fjernede) } : {}),\n } as never);\n\n if (res.status === 'queued') {\n setKvittering({ art: 'kø' });\n } else {\n setKvittering({ art: spor, nr: res.submission.id });\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 InnspelQueueFullError) setFeil(e.userMessage);\n else if (e instanceof InnspelApiError) setFeil(e.message);\n else setFeil('tjeneren svarte ikke.');\n } finally {\n setSender(false);\n }\n }, [client, spor, steg, verdi, lenketTil, fjernede, kort.length, lasterKort, hentKort]);\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 setFeil(e instanceof InnspelApiError ? e.message : 'tjeneren svarte ikke.');\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 {\n setMine([]);\n } finally {\n setLasterMine(false);\n }\n }, [client]);\n\n return (\n <Modal\n visible={synlig}\n transparent\n animationType=\"slide\"\n // Android-tilbake og ESC. Uten den er dialogen en felle (DD-47).\n onRequestClose={lukk}\n accessibilityViewIsModal\n >\n <View style={{ flex: 1, backgroundColor: tema.color.scrim, justifyContent: 'flex-end' }}>\n <View\n testID=\"innspel-widget\"\n accessibilityViewIsModal\n accessibilityRole=\"none\"\n style={{\n backgroundColor: tema.color.bg,\n borderTopLeftRadius: tema.radius.lg * 2,\n borderTopRightRadius: tema.radius.lg * 2,\n padding: tema.screenPadding,\n gap: tema.space.md,\n maxHeight: '92%',\n minHeight: '60%',\n }}\n >\n <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>\n {steg !== 'valg' && steg !== 'kvittering' ? (\n <Btn variant=\"ghost\" testID=\"tilbake\" ikon=\"←\" label={tekst.tilbake} onPress={nullstill} />\n ) : (\n <View />\n )}\n <Pressable\n testID=\"lukk\"\n accessibilityRole=\"button\"\n accessibilityLabel={tekst.lukk}\n onPress={lukk}\n style={{ minWidth: tema.touch, minHeight: tema.touch, alignItems: 'center', justifyContent: 'center' }}\n >\n <Text style={{ color: tema.color.textSecondary, fontSize: tema.font.body }}>✕</Text>\n </Pressable>\n </View>\n\n {feil ? <Banner live ikon=\"⚠\" tone=\"danger\" children={tekst.sendefeilBanner(feil)} /> : null}\n\n {steg === 'valg' ? (\n <>\n <Valg onVelg={velgSpor} />\n <Btn variant=\"ghost\" testID=\"mine-innspill\" ikon=\"📋\" label={tekst.mineTittel} onPress={visMine} />\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={client.settings.minTextLength}\n textMaxLength={client.settings.textMaxLength}\n kontekst={client.context}\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 />\n ) : null}\n\n {steg === 'kvittering' && kvittering ? (\n <Kvittering art={kvittering.art} {...(kvittering.nr ? { saksnummer: kvittering.nr } : {})} onLukk={lukk} />\n ) : null}\n\n {steg === 'mine' ? (\n <MineInnspill\n rader={mine}\n laster={lasterMine}\n {...(tenantName ? { tenantName } : {})}\n onNytt={nullstill}\n />\n ) : null}\n </View>\n </View>\n </Modal>\n );\n}\n\n/**\n * Konteksten uten linjene innsenderen har fjernet (DD-05). Feltene er en\n * lukket hviteliste, så det som ikke står i `client.context` finnes ikke å\n * fjerne — og et ukjent feltnavn her ville uansett blitt avvist av kjernen.\n */\nfunction fjernetKontekst(client: InnspelClient, fjernede: string[]) {\n const ut: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(client.context)) {\n if (k !== 'sdkVersion' && !fjernede.includes(k)) ut[k] = v;\n }\n return ut;\n}\n","import type { ContextInput, KnownIssueCard, PatternFinding } from '@innspel/core';\nimport React, { useMemo, useState } from 'react';\nimport { Pressable, Text, TextInput, View } from 'react-native';\nimport { useTema } from '../tema.js';\nimport { Btn, H, Hint } from './primitiver.js';\nimport { tekst } from './tekster.js';\n\n/**\n * 2d + 2e — feltet og kontekstlinja. Ett felt, ingenting annet.\n *\n * DD-44: send er inaktiv under `minTextLength` (standard 10), og det er det\n * ENESTE kravet. Ingen kategori, ingen alvorlighet, ingen reproduksjonsfelt.\n * 2h i wireframen er ikke en skjerm — den er fraværet av felter her.\n *\n * DD-45: placeholderen stiller to spørsmål i feilsporet.\n *\n * DD-46: mønstervarselet vises FØR sending og fjerner aldri noe selv.\n * «Fjern» og «Behold» er innsenderens valg; teksten endres bare ved «Fjern».\n *\n * DD-05: konteksten er synlig og kan fjernes linje for linje. Den er en lukket\n * hviteliste (K5) — det som ikke står der, finnes ikke å fjerne.\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}: {\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}) {\n const tema = useTema();\n const [apen, setApen] = useState(false);\n const [beholdt, setBeholdt] = useState<string[]>([]);\n\n const brukt = verdi.length;\n const forKort = brukt < minTextLength;\n const full = brukt >= textMaxLength;\n // Telleren dukker opp ved 80 % — ikke før. En teller fra første tegn gjør\n // lengden til oppgaven i stedet for innholdet.\n const visTeller = brukt >= textMaxLength * 0.8;\n\n const uavklart = funn.find((f) => !beholdt.includes(f.match));\n\n const linjer = useMemo(() => {\n const etiketter: Record<string, string> = {\n screen: 'Skjerm',\n appVersion: 'Appversjon',\n platform: 'Plattform',\n os: 'OS',\n build: 'Bygg',\n locale: 'Språk',\n };\n return Object.entries(etiketter)\n .map(([felt, etikett]) => {\n const verdi = (kontekst as unknown as Record<string, string | undefined>)[felt];\n return verdi && !fjernedeFelter.includes(felt) ? { felt, etikett, verdi } : null;\n })\n .filter((x): x is { felt: string; etikett: string; verdi: string } => x !== null);\n }, [kontekst, fjernedeFelter]);\n\n return (\n <View style={{ flex: 1, gap: tema.space.md }}>\n {lenketTil ? (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: tema.space.sm,\n minHeight: tema.touch,\n borderWidth: tema.hairline,\n borderColor: tema.color.borderInteractive,\n borderRadius: tema.radius.pill,\n paddingLeft: tema.space.md,\n paddingRight: tema.space.xs,\n }}\n >\n <Text style={{ flex: 1, color: tema.color.textPrimary, fontSize: tema.font.small }}>\n {tekst.lenketTil(lenketTil.title)}\n </Text>\n <Pressable\n testID=\"fjern-lenke\"\n accessibilityRole=\"button\"\n accessibilityLabel={tekst.fjernLenke}\n onPress={onFjernLenke}\n style={{ minWidth: tema.touch, minHeight: tema.touch, alignItems: 'center', justifyContent: 'center' }}\n >\n <Text style={{ color: tema.color.textSecondary, fontSize: tema.font.small }}>✕</Text>\n </Pressable>\n </View>\n ) : null}\n\n {uavklart ? (\n <View\n style={{\n gap: tema.space.sm,\n backgroundColor: tema.color.warningBg,\n borderRadius: tema.radius.md,\n padding: tema.space.md,\n }}\n >\n <Text\n accessibilityRole=\"alert\"\n accessibilityLiveRegion=\"polite\"\n style={{\n color: tema.color.warning,\n fontSize: tema.font.small,\n lineHeight: tema.lineHeight.small,\n fontWeight: tema.weight.medium,\n }}\n >\n {tekst.monsterSpm[uavklart.kind]}\n </Text>\n <View style={{ flexDirection: 'row', gap: tema.space.sm }}>\n <Btn\n grow\n variant=\"secondary\"\n testID=\"monster-fjern\"\n label={tekst.monsterFjern}\n onPress={() => onEndre(verdi.slice(0, uavklart.start) + verdi.slice(uavklart.end))}\n />\n <Btn\n grow\n variant=\"ghost\"\n testID=\"monster-behold\"\n label={tekst.monsterBehold}\n onPress={() => setBeholdt((b) => [...b, uavklart.match])}\n />\n </View>\n <Hint>{tekst.monsterForklaring}</Hint>\n </View>\n ) : null}\n\n <H>{spor === 'onske' ? tekst.feltLabelOnske : tekst.feltLabelFeil}</H>\n\n <TextInput\n testID=\"innspill-tekst\"\n accessibilityLabel={spor === 'onske' ? tekst.feltLabelOnske : tekst.feltLabelFeil}\n value={verdi}\n onChangeText={onEndre}\n maxLength={textMaxLength}\n multiline\n numberOfLines={4}\n placeholder={spor === 'onske' ? tekst.placeholderOnske : tekst.placeholderFeil}\n placeholderTextColor={tema.color.textMuted}\n style={{\n backgroundColor: tema.color.surfaceRaised,\n borderWidth: tema.hairline,\n borderColor: full ? tema.color.warning : tema.color.borderStrong,\n borderRadius: tema.radius.md,\n padding: tema.space.md,\n color: tema.color.textPrimary,\n fontSize: tema.font.body,\n lineHeight: tema.lineHeight.body,\n minHeight: tema.touch * 2,\n textAlignVertical: 'top',\n }}\n />\n\n {visTeller ? (\n <Text\n testID=\"teller\"\n accessibilityLiveRegion={full ? 'assertive' : 'polite'}\n style={{\n alignSelf: 'flex-end',\n color: full ? tema.color.warning : tema.color.textMuted,\n fontSize: tema.font.small,\n }}\n >\n {brukt} / {textMaxLength}\n {full ? tekst.tellerFull : ''}\n </Text>\n ) : null}\n\n {/* 2e — synlig, ikke skjult (DD-05) */}\n <View style={{ borderTopWidth: tema.hairline, borderTopColor: tema.color.border, paddingTop: tema.space.sm }}>\n <Pressable\n testID=\"kontekst-bryter\"\n accessibilityRole=\"button\"\n accessibilityState={{ expanded: apen }}\n accessibilityLabel={`${tekst.kontekstLinje}${apen ? '' : tekst.kontekstVis}`}\n onPress={() => setApen((a) => !a)}\n style={{ minHeight: tema.touch, justifyContent: 'center' }}\n >\n <Text style={{ color: tema.color.textSecondary, fontSize: tema.font.small }}>\n {apen ? '▴' : '▾'} {tekst.kontekstLinje}\n {apen ? '' : tekst.kontekstVis}\n </Text>\n </Pressable>\n\n {apen ? (\n <View>\n {linjer.map((l) => (\n <View\n key={l.felt}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: tema.space.sm,\n minHeight: tema.touch,\n borderBottomWidth: tema.hairline,\n borderBottomColor: tema.color.border,\n }}\n >\n <Text style={{ color: tema.color.textMuted, fontSize: tema.font.small, minWidth: tema.touch * 2 }}>\n {l.etikett}\n </Text>\n <Text style={{ flex: 1, color: tema.color.textPrimary, fontSize: tema.font.small }}>{l.verdi}</Text>\n <Pressable\n testID={`fjern-${l.felt}`}\n accessibilityRole=\"button\"\n accessibilityLabel={`${tekst.kontekstFjern} ${l.etikett.toLowerCase()} fra innsendingen`}\n onPress={() => onFjernKontekst(l.felt)}\n style={{ minWidth: tema.touch, minHeight: tema.touch, alignItems: 'center', justifyContent: 'center' }}\n >\n <Text style={{ color: tema.color.textSecondary, fontSize: tema.font.small }}>\n ✕ {tekst.kontekstFjern}\n </Text>\n </Pressable>\n </View>\n ))}\n <View style={{ paddingTop: tema.space.sm }}>\n <Hint>{tekst.kontekstAldri}</Hint>\n </View>\n </View>\n ) : null}\n </View>\n\n <View style={{ flex: 1, justifyContent: 'flex-end' }}>\n <Btn\n testID=\"send\"\n label={spor === 'onske' && !forKort ? tekst.nesteOnske : tekst.send}\n disabled={forKort || sender}\n hint={forKort ? tekst.forKort(minTextLength) : undefined}\n onPress={onSend}\n />\n </View>\n </View>\n );\n}\n","import React from 'react';\nimport { Pressable, Text, View, type StyleProp, type ViewStyle } from 'react-native';\nimport { useTema } from '../tema.js';\n\n/**\n * Primitivene widgeten er bygget av. Alt visuelt kommer fra tema-tokens —\n * ingen hex, ingen px, ingen fontstørrelse skrives her (CLAUDE.md, «Styling»).\n *\n * Minste trykkflate er `skala.touch` (48). Den er ikke en anbefaling: den er\n * grønt-kriterium for widgeten, og en knapp under målet er en feil.\n */\n\ntype Variant = 'primary' | 'secondary' | 'ghost' | 'danger';\n\nexport function Btn({\n label,\n onPress,\n variant = 'primary',\n ikon,\n hint,\n disabled,\n accessibilityLabel,\n grow,\n testID,\n}: {\n label: string;\n onPress?: () => void;\n variant?: Variant;\n ikon?: string;\n hint?: string;\n disabled?: boolean;\n accessibilityLabel?: string;\n grow?: boolean;\n testID?: string;\n}) {\n const tema = useTema();\n const c = tema.color;\n\n const bakgrunn =\n variant === 'primary' ? c.actionPrimary : variant === 'secondary' ? c.surfaceRaised : 'transparent';\n const tekstfarge =\n variant === 'primary' ? c.onActionPrimary : variant === 'danger' ? c.danger : c.actionSecondaryText;\n const kant = variant === 'ghost' ? 'transparent' : variant === 'primary' ? c.actionPrimary : c.actionSecondaryBorder;\n\n return (\n <View style={grow ? { flex: 1 } : undefined}>\n <Pressable\n testID={testID}\n accessibilityRole=\"button\"\n // Hintet er synlig tekst OG del av etiketten: en skjermleserbruker skal\n // få vite hvorfor knappen er inaktiv uten å lete etter teksten under.\n accessibilityLabel={accessibilityLabel ?? (hint ? `${label}. ${hint}` : label)}\n accessibilityState={{ disabled: !!disabled }}\n disabled={disabled}\n onPress={onPress}\n style={{\n minHeight: tema.touch,\n borderRadius: tema.radius.md,\n borderWidth: tema.hairline,\n borderColor: kant,\n backgroundColor: disabled ? c.surface : bakgrunn,\n paddingHorizontal: tema.space.md,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'row',\n gap: tema.space.sm,\n opacity: disabled ? 0.6 : 1,\n }}\n >\n {ikon ? (\n <Text accessibilityElementsHidden importantForAccessibility=\"no\" style={{ fontSize: tema.font.body }}>\n {ikon}\n </Text>\n ) : null}\n <Text\n style={{\n color: disabled ? c.textDisabled : tekstfarge,\n fontSize: tema.font.body,\n fontWeight: tema.weight.semibold,\n }}\n >\n {label}\n </Text>\n </Pressable>\n {hint ? <Hint>{hint}</Hint> : null}\n </View>\n );\n}\n\nexport function H({ children, sub }: { children: string; sub?: string }) {\n const tema = useTema();\n return (\n <View style={{ gap: tema.space.xs }}>\n <Text\n accessibilityRole=\"header\"\n style={{\n color: tema.color.textPrimary,\n fontSize: tema.font.h2,\n lineHeight: tema.lineHeight.h2,\n fontWeight: tema.weight.semibold,\n }}\n >\n {children}\n </Text>\n {sub ? (\n <Text\n style={{\n color: tema.color.textSecondary,\n fontSize: tema.font.small,\n lineHeight: tema.lineHeight.small,\n }}\n >\n {sub}\n </Text>\n ) : null}\n </View>\n );\n}\n\nexport function Hint({ children }: { children: React.ReactNode }) {\n const tema = useTema();\n return (\n <Text\n style={{\n color: tema.color.textMuted,\n fontSize: tema.font.small,\n lineHeight: tema.lineHeight.small,\n }}\n >\n {children}\n </Text>\n );\n}\n\nexport function Card({\n children,\n dashed,\n style,\n}: {\n children: React.ReactNode;\n dashed?: boolean;\n style?: StyleProp<ViewStyle>;\n}) {\n const tema = useTema();\n return (\n <View\n style={[\n {\n backgroundColor: tema.color.surface,\n borderRadius: tema.radius.lg,\n borderWidth: tema.hairline,\n borderColor: tema.color.border,\n borderStyle: dashed ? 'dashed' : 'solid',\n padding: tema.space.md,\n gap: tema.space.sm,\n },\n style,\n ]}\n >\n {children}\n </View>\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, så\n * etiketten er det som faktisk skiller dem (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 const tema = useTema();\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: tema.space.xs,\n alignSelf: 'flex-start',\n paddingHorizontal: tema.space.sm,\n paddingVertical: tema.space.xs,\n borderRadius: tema.radius.pill,\n backgroundColor: tema.color[`${farge}Bg` as keyof typeof tema.color],\n }}\n >\n <Text accessibilityElementsHidden importantForAccessibility=\"no\" style={{ fontSize: tema.font.small }}>\n {ikon}\n </Text>\n <Text style={{ color: tema.color[farge], fontSize: tema.font.small, fontWeight: tema.weight.medium }}>\n {etikett}\n </Text>\n </View>\n );\n}\n\n/**\n * Varsel. Rollen ligger på `Text`, ikke på containeren: `accessible` på en\n * container sluker barna som egne fokusstopp (`tdd-contract-validation`).\n */\nexport function Banner({\n ikon,\n tone,\n children,\n live,\n}: {\n ikon: string;\n tone: 'info' | 'warning' | 'danger' | 'success';\n children: string;\n live?: boolean;\n}) {\n const tema = useTema();\n return (\n <View\n style={{\n flexDirection: 'row',\n gap: tema.space.sm,\n backgroundColor: tema.color[`${tone}Bg` as keyof typeof tema.color],\n borderRadius: tema.radius.md,\n padding: tema.space.md,\n }}\n >\n <Text accessibilityElementsHidden importantForAccessibility=\"no\" style={{ fontSize: tema.font.body }}>\n {ikon}\n </Text>\n <Text\n accessibilityRole=\"alert\"\n accessibilityLiveRegion={live ? 'polite' : 'none'}\n style={{\n flex: 1,\n color: tema.color[tone],\n fontSize: tema.font.small,\n lineHeight: tema.lineHeight.small,\n }}\n >\n {children}\n </Text>\n </View>\n );\n}\n","/**\n * Hver streng innsenderen ser, ett sted.\n *\n * Ordlyden er ikke fri: den er tegnet i `design/wireframes/innsending-widget.jsx`\n * og bundet av beslutninger. Løftene under er DD-08 og skal stå ORDRETT likt i\n * SDK-et og i panelet — en innsender som får «Svar innen 3. desember» i appen og\n * noe annet i portalen har fått to løfter.\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 // 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 trykk legger deg til på ønsket — ingen ny sak.',\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 feltLabelFeil: 'Din feil',\n feltLabelOnske: 'Ditt ønske',\n /** DD-45: to spørsmål i feilsporet. Kilde: Sentry «What's the bug? What did you expect?» */\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 tellerFull: ' — kort og konkret holder',\n kontekstLinje: 'Legges ved: skjerm, appversjon, plattform, OS',\n kontekstVis: ' — Vis',\n kontekstFjern: 'Fjern',\n kontekstAldri:\n 'Aldri: navn, e-post, telefon, posisjon eller det som står på skjermen.',\n lenketTil: (tittel: string) => `Lenket til: «${tittel}»`,\n fjernLenke: 'Fjern lenken til den kjente feilen',\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 kvitteringRegistrert: 'Registrert',\n kvitteringFeil: 'Du får beskjed når den er rettet, eller hvis vi trenger mer.',\n kvitteringOnske:\n 'Vurderes innen 90 dager. Du får et personlig svar — også hvis det er nei.',\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 tilbakeTilAppen: 'Tilbake til appen',\n\n // 2i — tilstander\n offlineTittel: 'Ingen nett',\n offlineBanner:\n 'Ingen nett. Lagres og sendes automatisk — du ser det under «Mine innspill» til det er sendt.',\n offlineLagre: 'Lagre — sendes automatisk',\n sendefeilBanner: (arsak: string) => `Kunne ikke sende: ${arsak} Teksten din er beholdt.`,\n provIgjen: 'Prøv igjen',\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 mineTom: 'Du har ikke sendt noe ennå.',\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\n // Felles\n tilbake: 'Tilbake',\n lukk: 'Lukk',\n venterPaaNett: 'Venter på nett — sendes automatisk',\n} as const;\n\n/**\n * Løftet per status (DD-08). Samme streng i SDK og panel. Det eneste tidsløftet\n * er svarfristen som DATO (DD-28) — aldri «innen X dager», som ville betydd noe\n * nytt hver gang innsenderen leser det.\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 React from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { useTema } from '../tema.js';\nimport { H } from './primitiver.js';\nimport { tekst } from './tekster.js';\n\n/**\n * 2b — første valg. To flater, hele nedre halvdel, ikon og tekst.\n *\n * DD-02: ALDRI et tredje valg, og aldri spørsmål om kategori eller\n * alvorlighet. Valget her styrer alt etterpå: feilsporet får kjente feil FØR\n * feltet og kan bære koblingsnøkler, ønskesporet får dem etter og kan ikke.\n */\nexport function Valg({ onVelg }: { onVelg: (spor: 'feil' | 'onske') => void }) {\n const tema = useTema();\n\n const flate = (spor: 'feil' | 'onske', ikon: string, label: string, under: string) => (\n <Pressable\n testID={`spor-${spor}`}\n accessibilityRole=\"button\"\n accessibilityLabel={`${label}. ${under}`}\n onPress={() => onVelg(spor)}\n style={{\n flex: 1,\n minHeight: tema.touch * 3,\n backgroundColor: tema.color.surface,\n borderWidth: tema.hairline,\n borderColor: tema.color.borderStrong,\n borderRadius: tema.radius.lg,\n alignItems: 'center',\n justifyContent: 'center',\n gap: tema.space.sm,\n padding: tema.space.md,\n }}\n >\n <Text accessibilityElementsHidden importantForAccessibility=\"no\" style={{ fontSize: tema.font.h1 }}>\n {ikon}\n </Text>\n <Text\n style={{\n color: tema.color.textPrimary,\n fontSize: tema.font.h3,\n fontWeight: tema.weight.semibold,\n textAlign: 'center',\n }}\n >\n {label}\n </Text>\n <Text style={{ color: tema.color.textMuted, fontSize: tema.font.small, textAlign: 'center' }}>\n {under}\n </Text>\n </Pressable>\n );\n\n return (\n <View style={{ flex: 1, gap: tema.space.lg }}>\n <H sub={tekst.valgUnder}>{tekst.valgTittel}</H>\n <View style={{ flex: 1, justifyContent: 'flex-end' }}>\n <View style={{ flexDirection: 'row', gap: tema.space.md }}>\n {flate('feil', '🐞', tekst.sporFeil, tekst.sporFeilUnder)}\n {flate('onske', '💡', tekst.sporOnske, tekst.sporOnskeUnder)}\n </View>\n </View>\n </View>\n );\n}\n","import type { KnownIssueCard } from '@innspel/core';\nimport React from 'react';\nimport { ActivityIndicator, Text, View } from 'react-native';\nimport { useTema } from '../tema.js';\nimport { Btn, Card, H, StatusPill } from './primitiver.js';\nimport { tekst } from './tekster.js';\n\n/**\n * 2c — kjente feil. Differensiatoren: vises FØR feltet i feilsporet, ETTER i\n * ønskesporet.\n *\n * DD-29 gir kortet TRE svar, ikke to: «Ja, jeg også» (Reach +1, ingen ny sak) ·\n * «Ligner, men ikke helt» (eget innspill med lenke, uten tvunget match) · «Nei,\n * det er noe annet» (vanlig innsending). Det midterste er hele poenget — uten\n * det tvinger man et valg mellom å bli talt feil og å ikke bli talt.\n *\n * Tilgjengelighet: kortet er IKKE én knapp. Tre svar må være tre fokusstopp,\n * og `accessible` på kortcontaineren ville slukt dem. I stedet bærer hver\n * knapp kortets tittel i etiketten, så en skjermleserbruker som lander på «Ja,\n * jeg også» vet hvilken feil svaret gjelder. Se `docs/sdk`-notatet i PR-en:\n * `tdd-contract-validation` sa «ett kort = én knapp», skrevet før DD-29.\n *\n * Treffene er et tilbud, aldri en sperre: feiler oppslaget eller er lista tom,\n * hoppes skjermen over uten melding. Det håndteres i Widget, ikke her.\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 tema = useTema();\n\n if (laster) {\n return (\n <View style={{ flex: 1, gap: tema.space.md }}>\n <H sub={spor === 'onske' ? tekst.kjenteFeilUnderOnske : tekst.kjenteFeilUnderFeil}>\n {spor === 'onske' ? tekst.kjenteFeilTittelOnske : tekst.kjenteFeilTittelFeil}\n </H>\n <ActivityIndicator accessibilityLabel=\"Sjekker kjente feil\" color={tema.color.textSecondary} />\n </View>\n );\n }\n\n return (\n <View style={{ flex: 1, gap: tema.space.md }}>\n <H sub={spor === 'onske' ? tekst.kjenteFeilUnderOnske : tekst.kjenteFeilUnderFeil}>\n {spor === 'onske' ? tekst.kjenteFeilTittelOnske : tekst.kjenteFeilTittelFeil}\n </H>\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\n ? k.status === 'fikset'\n ? tekst.rettetI(k.fixedIn)\n : tekst.rettesI(k.fixedIn)\n : undefined;\n const kontekst = versjon ? `${k.title}. ${versjon}` : k.title;\n\n return (\n <Card key={k.id}>\n <Text\n style={{\n color: tema.color.textPrimary,\n fontSize: tema.font.body,\n lineHeight: tema.lineHeight.body,\n fontWeight: tema.weight.medium,\n }}\n >\n {k.title}\n </Text>\n\n {k.workaround ? (\n <Text\n style={{\n color: tema.color.textSecondary,\n fontSize: tema.font.small,\n lineHeight: tema.lineHeight.small,\n }}\n >\n {tekst.omvei} {k.workaround}\n </Text>\n ) : null}\n\n {versjon ? (\n <StatusPill\n ikon={k.status === 'fikset' ? '✓' : '🔧'}\n etikett={versjon}\n farge={k.status === 'fikset' ? 'success' : 'info'}\n />\n ) : null}\n\n <View style={{ flexDirection: 'row', gap: tema.space.sm }}>\n <Btn\n grow\n testID={`ja-ogsa-${k.id}`}\n label={tekst.svarJa}\n accessibilityLabel={`${tekst.svarJa}. ${kontekst}`}\n onPress={() => onJaOgsa(k)}\n />\n <Btn\n grow\n variant=\"secondary\"\n testID={`ligner-${k.id}`}\n label={tekst.svarLigner}\n accessibilityLabel={`${tekst.svarLigner}. ${kontekst}`}\n onPress={() => onLigner(k)}\n />\n </View>\n </Card>\n );\n })}\n\n <Btn variant=\"secondary\" testID=\"nei-noe-annet\" label={tekst.svarNei} onPress={onNei} />\n </View>\n );\n}\n","import React from 'react';\nimport { Text, View } from 'react-native';\nimport { useTema } from '../tema.js';\nimport { Btn, H, Hint } from './primitiver.js';\nimport { tekst } from './tekster.js';\n\n/**\n * 2g — kvitteringen. Den LOVER noe, per spor (DD-07), og saksnummeret er der\n * så innsenderen kan vise til det hos support.\n *\n * Ingen «vurder appen». Ingen oppfordring til å dele. Innsenderen har nettopp\n * gjort oss en tjeneste — å be om en til er å ta betalt for den.\n *\n * DD-47: `accessibilityLiveRegion` og rolle `alert` på TEKSTEN, slik at en\n * skjermleser leser kvitteringen når den kommer, uten at brukeren må lete.\n */\nexport function Kvittering({\n art,\n saksnummer,\n onLukk,\n}: {\n art: 'feil' | 'onske' | 'jaOgsa' | 'kø';\n saksnummer?: string;\n onLukk: () => void;\n}) {\n const tema = useTema();\n\n const innhold = {\n feil: { h: tekst.kvitteringSendt, p: tekst.kvitteringFeil },\n onske: { h: tekst.kvitteringSendt, p: tekst.kvitteringOnske },\n jaOgsa: { h: tekst.kvitteringRegistrert, p: tekst.kvitteringJaOgsa },\n // Køet offline: kvitteringen kan IKKE love svar på noe som ikke er sendt\n // (DD-41 presiserer DD-07). Den lover bare at det sendes.\n kø: { h: tekst.offlineTittel, p: tekst.offlineBanner },\n }[art];\n\n return (\n <View style={{ flex: 1, justifyContent: 'center', gap: tema.space.lg }}>\n <View style={{ alignItems: 'center', gap: tema.space.md }}>\n <Text\n accessibilityElementsHidden\n importantForAccessibility=\"no\"\n style={{ fontSize: tema.font.h1 * 2, color: art === 'kø' ? tema.color.neutral : tema.color.success }}\n >\n {art === 'kø' ? '⇅' : '✓'}\n </Text>\n\n <H>{innhold.h}</H>\n\n <Text\n testID=\"kvittering-tekst\"\n accessibilityRole=\"alert\"\n accessibilityLiveRegion=\"polite\"\n style={{\n color: tema.color.textPrimary,\n fontSize: tema.font.body,\n lineHeight: tema.lineHeight.body,\n textAlign: 'center',\n }}\n >\n {innhold.p}\n </Text>\n\n {saksnummer ? <Hint>{tekst.saksnummer(saksnummer)}</Hint> : null}\n </View>\n\n <Btn testID=\"tilbake-til-appen\" label={tekst.tilbakeTilAppen} onPress={onLukk} />\n </View>\n );\n}\n","import type { MySubmission } from '@innspel/core';\nimport React from 'react';\nimport { ActivityIndicator, ScrollView, Text, View } from 'react-native';\nimport { useTema } from '../tema.js';\nimport { Btn, Card, H, Hint, StatusPill } from './primitiver.js';\nimport { statusVisning, venterVisning } from './status.js';\nimport { tekst } from './tekster.js';\n\n/**\n * 2j — «Mine innspill» (DD-27).\n *\n * To ting skjer her som ikke skjer noe annet sted:\n *\n * - **Offline-køen er synlig** (DD-41). Raden som venter på nett står øverst,\n * uten saksnummer, med «Venter på nett — sendes automatisk». Shake er den\n * eneste leverandøren som viser dette til brukeren; alle andre skjuler køen,\n * og en usynlig kø er ikke til å skille fra tapt tekst.\n * - **Svaret står under saken**, ordrett som i panelet. Innsenderen skal ikke\n * måtte lete etter svaret i en e-post som aldri kom — plattformen sender\n * ingen e-post (K14).\n */\nexport function MineInnspill({\n rader,\n laster,\n tenantName,\n onNytt,\n}: {\n rader: MySubmission[];\n laster?: boolean;\n tenantName?: string;\n onNytt: () => void;\n}) {\n const tema = useTema();\n\n return (\n <View style={{ flex: 1, gap: tema.space.md }}>\n <H sub={tekst.mineUnder}>{tekst.mineTittel}</H>\n\n {laster ? (\n <ActivityIndicator accessibilityLabel=\"Henter innspillene dine\" color={tema.color.textSecondary} />\n ) : rader.length === 0 ? (\n <Hint>{tekst.mineTom}</Hint>\n ) : (\n <ScrollView style={{ flex: 1 }} contentContainerStyle={{ gap: tema.space.sm }}>\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\n return (\n <Card key={nokkel} dashed={venter}>\n <Hint>\n {venter ? tekst.mineIkkeSendt : tekst.mineSak(rad.id)} ·{' '}\n {rad.type === 'onske' ? 'ønske' : 'feil'}\n </Hint>\n\n <Text\n style={{\n color: tema.color.textPrimary,\n fontSize: tema.font.body,\n lineHeight: tema.lineHeight.body,\n }}\n >\n {rad.text}\n </Text>\n\n <View style={{ gap: tema.space.xs }}>\n <StatusPill ikon={v.ikon} etikett={v.etikett} farge={v.farge} />\n <Hint>{v.lofte}</Hint>\n </View>\n\n {svar ? (\n <View\n style={{\n borderLeftWidth: tema.hairline * 2,\n borderLeftColor: tema.color.brand,\n paddingLeft: tema.space.sm,\n gap: tema.space.xs,\n }}\n >\n <Text style={{ color: tema.color.textSecondary, fontSize: tema.font.small }}>\n {tenantName ? tekst.svarFra(tenantName) : tekst.svarFraGenerisk}\n </Text>\n <Text\n style={{\n color: tema.color.textPrimary,\n fontSize: tema.font.small,\n lineHeight: tema.lineHeight.small,\n }}\n >\n {svar.text}\n </Text>\n </View>\n ) : null}\n </Card>\n );\n })}\n </ScrollView>\n )}\n\n <Btn testID=\"send-nytt\" label={tekst.sendNytt} onPress={onNytt} />\n </View>\n );\n}\n","import type { SubmissionStatus, SubmissionStatusView, SubmissionType } from '@innspel/core';\nimport { lofte, tekst } from './tekster.js';\n\n/**\n * DD-22: `complete` 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 — to statuser er altså ikke\n * skillbare på farge for alle, og etiketten er det som faktisk bærer meningen.\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\n/**\n * Oversetter en innsending til det innsenderen skal se.\n *\n * @param status Maskinens status fra kontrakten.\n * @param type Sporet — avgjør «Rettet» mot «Levert» (DD-22).\n * @param deadlineAt Svarfristen, satt kun i `vurderes`.\n */\nexport function statusVisning(\n status: SubmissionStatus,\n type: SubmissionType,\n deadlineAt?: string,\n): 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 {\n ikon: IKON.kjent_feil,\n etikett: 'Kjent, ikke planlagt',\n farge: 'neutral',\n lofte: lofte.kjentFeil,\n };\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/**\n * Etikett for en hel rad, brukt som skjermleserens sammendrag. Ikonet er\n * `aria-hidden` i UI-et, så etiketten må bære alt.\n */\nexport function radEtikett(rad: SubmissionStatusView): string {\n const v = statusVisning(rad.status, rad.type, rad.deadlineAt);\n const spor = rad.type === 'onske' ? 'ønske' : 'feil';\n return `${tekst.mineSak(rad.id)}, ${spor}: ${rad.text}. Status ${v.etikett.toLowerCase()}. ${v.lofte}`;\n}\n","import type { InnspelStorage } from '@innspel/core';\n\n/**\n * Formen på lagringspakkene i React Native-økosystemet: AsyncStorage, MMKV med\n * async-fasade, expo-secure-store. Alle tre har disse tre metodene.\n */\nexport interface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * Lager en {@link InnspelStorage} av vertens egen lagringspakke.\n *\n * Pakken tar ingen avhengighet på AsyncStorage eller MMKV med vilje: verten har\n * som regel én av dem allerede, og to kopier av samme lagring i én app er verre\n * enn litt oppsett. Send inn den du bruker:\n *\n * @example\n * ```ts\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * const storage = createStorage(AsyncStorage);\n * ```\n *\n * Det eneste som lagres er offline-køen (DD-41) — aldri feedback-tokenet, aldri\n * en install- eller enhets-ID (K20). Lagringen trenger derfor ikke være kryptert.\n */\nexport function createStorage(pakke: AsyncStorageLike): InnspelStorage {\n return {\n get: (key) => pakke.getItem(key),\n set: (key, value) => pakke.setItem(key, value),\n remove: (key) => pakke.removeItem(key),\n };\n}\n\n/**\n * Lagring i minne. Køen overlever da ikke at appen lukkes, så den er til\n * utvikling og test — ikke til produksjon. `InnspelProvider` sier fra i\n * konsollen hvis den brukes uten at det er sagt eksplisitt.\n */\nexport function createMemoryStorage(): InnspelStorage {\n const rader = new Map<string, string>();\n return {\n get: async (key) => rader.get(key) ?? null,\n set: async (key, value) => {\n rader.set(key, value);\n },\n remove: async (key) => {\n rader.delete(key);\n },\n };\n}\n"],"mappings":"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","names":["createContext","useCallback","useContext","useMemo","useState","useState","Pressable","Text","View","Pressable","Text","View","jsx","jsxs","verdi","View","Text","Pressable","Pressable","Text","View","jsx","jsxs","Pressable","Text","View","Text","View","jsx","jsxs","View","Text","Text","View","jsx","jsxs","View","Text","ActivityIndicator","Text","View","jsx","jsxs","View","ActivityIndicator","Text","jsx","jsxs","useState","View","Pressable","Text","jsx","jsxs","createContext","useState","useCallback","useMemo","useContext"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@innspel/react-native",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Innsendingswidgeten for React Native. Dialog med fokusfelle, kjente feil før feltet, offline-kø gjort synlig.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup",
|
|
25
|
+
"test": "jest"
|
|
26
|
+
},
|
|
27
|
+
"//dependencies": "Kun @innspel/core. Ingen tredjeparts-SDK (K19), og ingen lagringspakke: verten sender inn sin egen med createStorage().",
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@innspel/core": "0.1.0"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"react": ">=18",
|
|
33
|
+
"react-native": ">=0.74"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"innspel",
|
|
37
|
+
"feedback",
|
|
38
|
+
"react-native"
|
|
39
|
+
],
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
}
|
|
43
|
+
}
|