@innspel/react-native 0.5.1 → 0.7.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/dist/index.d.cts CHANGED
@@ -30,6 +30,18 @@ interface CaptureOptions {
30
30
  interface ScreenshotAdapter {
31
31
  /** Fanger viewen bak referansen til en fil. Kalles ved «Legg ved skjermbilde» (K4), og igjen på forhåndsvisningen for å rekomponere. */
32
32
  capture(ref: RefObject<ViewRef | null>, options: CaptureOptions): Promise<ScreenshotCapture>;
33
+ /**
34
+ * Velger et bilde fra enhetens bildebibliotek — «Velg bilde». `null` når innsenderen
35
+ * avbryter. Uten metoden finnes ikke valget. Bildet går gjennom samme forhåndsvisning
36
+ * og maskering, og det som lastes opp er komposittet fra `capture`, aldri fila.
37
+ */
38
+ pick?(): Promise<ScreenshotCapture | null>;
39
+ /**
40
+ * `false` fjerner «Legg ved skjermbilde» og lar bare «Velg bilde» stå — når skjermen
41
+ * widgeten åpnes fra sjelden er der feilen er. `capture` trengs likevel til å
42
+ * rekomponere forhåndsvisningen. Standard er `true`.
43
+ */
44
+ captureScreen?: boolean;
33
45
  /** Viewens rektangel i vinduskoordinater, i punkter. Null når den ikke er montert. */
34
46
  measure(ref: RefObject<ViewRef | null>): Promise<MaskRect | null>;
35
47
  /** Leser en fangst som Blob for opplasting. */
@@ -41,6 +53,38 @@ type CaptureRefFn = (ref: RefObject<ViewRef | null> | ViewRef, options: {
41
53
  quality: number;
42
54
  result: 'tmpfile';
43
55
  }) => Promise<string>;
56
+ /**
57
+ * Vertens bildevelger. Resultatet trenger bare `uri`; mangler størrelsen, måles den.
58
+ * Returner `null` når innsenderen avbryter.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * import * as ImagePicker from 'expo-image-picker';
63
+ * const pickImage: PickImageFn = async () => {
64
+ * const r = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ['images'], exif: false });
65
+ * return r.canceled ? null : { uri: r.assets[0]!.uri, width: r.assets[0]!.width, height: r.assets[0]!.height };
66
+ * };
67
+ * ```
68
+ */
69
+ type PickImageFn = () => Promise<{
70
+ uri: string;
71
+ width?: number;
72
+ height?: number;
73
+ } | null>;
74
+ /**
75
+ * Leietakerens setning ved bildesteget: én for begge spor, eller én per spor.
76
+ * Et spor uten setning viser ingen.
77
+ */
78
+ type ImageStepNote = string | {
79
+ feil?: string;
80
+ onske?: string;
81
+ };
82
+ interface ScreenshotAdapterOptions {
83
+ /** Gir «Velg bilde». Pakken tar ingen avhengighet på en velger (K19). */
84
+ pickImage?: PickImageFn;
85
+ /** `false` fjerner «Legg ved skjermbilde». Standard er `true`. */
86
+ captureScreen?: boolean;
87
+ }
44
88
  /**
45
89
  * Lager adapteren av vertens `captureRef`. Dimensjonene hentes med `Image.getSize`,
46
90
  * målingen med `measureInWindow`, og fila leses med `fetch(uri).blob()` — alt fra
@@ -50,9 +94,11 @@ type CaptureRefFn = (ref: RefObject<ViewRef | null> | ViewRef, options: {
50
94
  * ```tsx
51
95
  * import { captureRef } from 'react-native-view-shot';
52
96
  * <InnspelProvider client={innspel} screenshot={createScreenshotAdapter(captureRef)}>
97
+ * // Med bildevelger, og uten fangst av skjermen widgeten åpnes fra:
98
+ * <InnspelProvider client={innspel} screenshot={createScreenshotAdapter(captureRef, { pickImage, captureScreen: false })}>
53
99
  * ```
54
100
  */
55
- declare function createScreenshotAdapter(captureRef: CaptureRefFn): ScreenshotAdapter;
101
+ declare function createScreenshotAdapter(captureRef: CaptureRefFn, options?: ScreenshotAdapterOptions): ScreenshotAdapter;
56
102
 
57
103
  /**
58
104
  * tokens.ts — GENERERT fra theme/theme.ts (avtrykk 9c17bc0e5f8c).
@@ -334,7 +380,7 @@ interface InnspelKontekst {
334
380
  * }
335
381
  * ```
336
382
  */
337
- declare function InnspelProvider({ client, children, theme, colorScheme, tenantName, screenshot, }: {
383
+ declare function InnspelProvider({ client, children, theme, colorScheme, tenantName, screenshot, imageStepNote, }: {
338
384
  client: InnspelClient;
339
385
  children?: React.ReactNode;
340
386
  /** Vertens egne tokens. Alt som utelates faller tilbake på Innspels tema. */
@@ -348,6 +394,13 @@ declare function InnspelProvider({ client, children, theme, colorScheme, tenantN
348
394
  * og det finnes uansett ikke når `screenshotsEnabled` er av (K18).
349
395
  */
350
396
  screenshot?: ScreenshotAdapter;
397
+ /**
398
+ * Leietakerens egen setning ved bildesteget, f.eks. «Legg ved et skjermbilde av feilen.
399
+ * Ikke send bilder av andre personer.» Står ved knappene og i forhåndsvisningen. Én
400
+ * streng gjelder begge spor; `{ feil, onske }` gir hvert spor sin. Leietakeren kjenner
401
+ * brukerne sine; plattformen eier ikke den setningen.
402
+ */
403
+ imageStepNote?: ImageStepNote;
351
404
  }): React.JSX.Element;
352
405
  /**
353
406
  * Klienten og `open` fra nærmeste {@link InnspelProvider}.
@@ -519,6 +572,10 @@ declare const tekst: {
519
572
  readonly fjernLenke: "Fjern lenken til den kjente feilen";
520
573
  readonly leggVedSkjermbilde: "Legg ved skjermbilde";
521
574
  readonly leggVedHint: "Bildet tas først når du trykker — du ser det før det sendes.";
575
+ readonly velgBilde: "Velg bilde";
576
+ readonly velgBildeHint: "Fra bildene dine. Du ser det og kan maskere det før det sendes.";
577
+ readonly skjermbildeUnderGalleri: "Bildet er fra galleriet. Appen maskerer ingenting i det for deg — mal over det som ikke skal med.";
578
+ readonly bildeFeilet: "kunne ikke hente bildet. Du kan sende uten.";
522
579
  readonly skjermbildeTittel: "Se over bildet";
523
580
  readonly skjermbildeUnder: "Bildet ble tatt da du trykket. Det du maskerer, ser vi aldri.";
524
581
  readonly maskering: "Maskering";
@@ -571,6 +628,7 @@ declare const tekst: {
571
628
  readonly mineTom: "Du har ikke sendt noe ennå.";
572
629
  readonly mineIkkeSendt: "Ikke sendt ennå";
573
630
  readonly mineSak: (nr: string) => string;
631
+ readonly bildeFjernet: "Bildet er fjernet.";
574
632
  readonly svarFra: (leietaker: string) => string;
575
633
  readonly svarFraGenerisk: "Svar";
576
634
  readonly sendNytt: "Send nytt innspill";
@@ -652,4 +710,4 @@ declare const lofte: {
652
710
  readonly avvist: "Vi har svart på denne.";
653
711
  };
654
712
 
655
- export { type AsyncStorageLike, type CaptureOptions, type CaptureRefFn, type InnspelColors, InnspelPrivate, InnspelProgram, InnspelProvider, type InnspelTheme, type PartialTheme, type ScreenshotAdapter, type ScreenshotCapture, type StatusVisning, type Tema, byggTema, createMemoryStorage, createScreenshotAdapter, createStorage, t as darkTokens, light, lofte, screenRules, statusVisning, tekst, useInnspel, useTema, venterVisning };
713
+ export { type AsyncStorageLike, type CaptureOptions, type CaptureRefFn, type ImageStepNote, type InnspelColors, InnspelPrivate, InnspelProgram, InnspelProvider, type InnspelTheme, type PartialTheme, type PickImageFn, type ScreenshotAdapter, type ScreenshotAdapterOptions, type ScreenshotCapture, type StatusVisning, type Tema, byggTema, createMemoryStorage, createScreenshotAdapter, createStorage, t as darkTokens, light, lofte, screenRules, statusVisning, tekst, useInnspel, useTema, venterVisning };
package/dist/index.d.ts CHANGED
@@ -30,6 +30,18 @@ interface CaptureOptions {
30
30
  interface ScreenshotAdapter {
31
31
  /** Fanger viewen bak referansen til en fil. Kalles ved «Legg ved skjermbilde» (K4), og igjen på forhåndsvisningen for å rekomponere. */
32
32
  capture(ref: RefObject<ViewRef | null>, options: CaptureOptions): Promise<ScreenshotCapture>;
33
+ /**
34
+ * Velger et bilde fra enhetens bildebibliotek — «Velg bilde». `null` når innsenderen
35
+ * avbryter. Uten metoden finnes ikke valget. Bildet går gjennom samme forhåndsvisning
36
+ * og maskering, og det som lastes opp er komposittet fra `capture`, aldri fila.
37
+ */
38
+ pick?(): Promise<ScreenshotCapture | null>;
39
+ /**
40
+ * `false` fjerner «Legg ved skjermbilde» og lar bare «Velg bilde» stå — når skjermen
41
+ * widgeten åpnes fra sjelden er der feilen er. `capture` trengs likevel til å
42
+ * rekomponere forhåndsvisningen. Standard er `true`.
43
+ */
44
+ captureScreen?: boolean;
33
45
  /** Viewens rektangel i vinduskoordinater, i punkter. Null når den ikke er montert. */
34
46
  measure(ref: RefObject<ViewRef | null>): Promise<MaskRect | null>;
35
47
  /** Leser en fangst som Blob for opplasting. */
@@ -41,6 +53,38 @@ type CaptureRefFn = (ref: RefObject<ViewRef | null> | ViewRef, options: {
41
53
  quality: number;
42
54
  result: 'tmpfile';
43
55
  }) => Promise<string>;
56
+ /**
57
+ * Vertens bildevelger. Resultatet trenger bare `uri`; mangler størrelsen, måles den.
58
+ * Returner `null` når innsenderen avbryter.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * import * as ImagePicker from 'expo-image-picker';
63
+ * const pickImage: PickImageFn = async () => {
64
+ * const r = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ['images'], exif: false });
65
+ * return r.canceled ? null : { uri: r.assets[0]!.uri, width: r.assets[0]!.width, height: r.assets[0]!.height };
66
+ * };
67
+ * ```
68
+ */
69
+ type PickImageFn = () => Promise<{
70
+ uri: string;
71
+ width?: number;
72
+ height?: number;
73
+ } | null>;
74
+ /**
75
+ * Leietakerens setning ved bildesteget: én for begge spor, eller én per spor.
76
+ * Et spor uten setning viser ingen.
77
+ */
78
+ type ImageStepNote = string | {
79
+ feil?: string;
80
+ onske?: string;
81
+ };
82
+ interface ScreenshotAdapterOptions {
83
+ /** Gir «Velg bilde». Pakken tar ingen avhengighet på en velger (K19). */
84
+ pickImage?: PickImageFn;
85
+ /** `false` fjerner «Legg ved skjermbilde». Standard er `true`. */
86
+ captureScreen?: boolean;
87
+ }
44
88
  /**
45
89
  * Lager adapteren av vertens `captureRef`. Dimensjonene hentes med `Image.getSize`,
46
90
  * målingen med `measureInWindow`, og fila leses med `fetch(uri).blob()` — alt fra
@@ -50,9 +94,11 @@ type CaptureRefFn = (ref: RefObject<ViewRef | null> | ViewRef, options: {
50
94
  * ```tsx
51
95
  * import { captureRef } from 'react-native-view-shot';
52
96
  * <InnspelProvider client={innspel} screenshot={createScreenshotAdapter(captureRef)}>
97
+ * // Med bildevelger, og uten fangst av skjermen widgeten åpnes fra:
98
+ * <InnspelProvider client={innspel} screenshot={createScreenshotAdapter(captureRef, { pickImage, captureScreen: false })}>
53
99
  * ```
54
100
  */
55
- declare function createScreenshotAdapter(captureRef: CaptureRefFn): ScreenshotAdapter;
101
+ declare function createScreenshotAdapter(captureRef: CaptureRefFn, options?: ScreenshotAdapterOptions): ScreenshotAdapter;
56
102
 
57
103
  /**
58
104
  * tokens.ts — GENERERT fra theme/theme.ts (avtrykk 9c17bc0e5f8c).
@@ -334,7 +380,7 @@ interface InnspelKontekst {
334
380
  * }
335
381
  * ```
336
382
  */
337
- declare function InnspelProvider({ client, children, theme, colorScheme, tenantName, screenshot, }: {
383
+ declare function InnspelProvider({ client, children, theme, colorScheme, tenantName, screenshot, imageStepNote, }: {
338
384
  client: InnspelClient;
339
385
  children?: React.ReactNode;
340
386
  /** Vertens egne tokens. Alt som utelates faller tilbake på Innspels tema. */
@@ -348,6 +394,13 @@ declare function InnspelProvider({ client, children, theme, colorScheme, tenantN
348
394
  * og det finnes uansett ikke når `screenshotsEnabled` er av (K18).
349
395
  */
350
396
  screenshot?: ScreenshotAdapter;
397
+ /**
398
+ * Leietakerens egen setning ved bildesteget, f.eks. «Legg ved et skjermbilde av feilen.
399
+ * Ikke send bilder av andre personer.» Står ved knappene og i forhåndsvisningen. Én
400
+ * streng gjelder begge spor; `{ feil, onske }` gir hvert spor sin. Leietakeren kjenner
401
+ * brukerne sine; plattformen eier ikke den setningen.
402
+ */
403
+ imageStepNote?: ImageStepNote;
351
404
  }): React.JSX.Element;
352
405
  /**
353
406
  * Klienten og `open` fra nærmeste {@link InnspelProvider}.
@@ -519,6 +572,10 @@ declare const tekst: {
519
572
  readonly fjernLenke: "Fjern lenken til den kjente feilen";
520
573
  readonly leggVedSkjermbilde: "Legg ved skjermbilde";
521
574
  readonly leggVedHint: "Bildet tas først når du trykker — du ser det før det sendes.";
575
+ readonly velgBilde: "Velg bilde";
576
+ readonly velgBildeHint: "Fra bildene dine. Du ser det og kan maskere det før det sendes.";
577
+ readonly skjermbildeUnderGalleri: "Bildet er fra galleriet. Appen maskerer ingenting i det for deg — mal over det som ikke skal med.";
578
+ readonly bildeFeilet: "kunne ikke hente bildet. Du kan sende uten.";
522
579
  readonly skjermbildeTittel: "Se over bildet";
523
580
  readonly skjermbildeUnder: "Bildet ble tatt da du trykket. Det du maskerer, ser vi aldri.";
524
581
  readonly maskering: "Maskering";
@@ -571,6 +628,7 @@ declare const tekst: {
571
628
  readonly mineTom: "Du har ikke sendt noe ennå.";
572
629
  readonly mineIkkeSendt: "Ikke sendt ennå";
573
630
  readonly mineSak: (nr: string) => string;
631
+ readonly bildeFjernet: "Bildet er fjernet.";
574
632
  readonly svarFra: (leietaker: string) => string;
575
633
  readonly svarFraGenerisk: "Svar";
576
634
  readonly sendNytt: "Send nytt innspill";
@@ -652,4 +710,4 @@ declare const lofte: {
652
710
  readonly avvist: "Vi har svart på denne.";
653
711
  };
654
712
 
655
- export { type AsyncStorageLike, type CaptureOptions, type CaptureRefFn, type InnspelColors, InnspelPrivate, InnspelProgram, InnspelProvider, type InnspelTheme, type PartialTheme, type ScreenshotAdapter, type ScreenshotCapture, type StatusVisning, type Tema, byggTema, createMemoryStorage, createScreenshotAdapter, createStorage, t as darkTokens, light, lofte, screenRules, statusVisning, tekst, useInnspel, useTema, venterVisning };
713
+ export { type AsyncStorageLike, type CaptureOptions, type CaptureRefFn, type ImageStepNote, type InnspelColors, InnspelPrivate, InnspelProgram, InnspelProvider, type InnspelTheme, type PartialTheme, type PickImageFn, type ScreenshotAdapter, type ScreenshotAdapterOptions, type ScreenshotCapture, type StatusVisning, type Tema, byggTema, createMemoryStorage, createScreenshotAdapter, createStorage, t as darkTokens, light, lofte, screenRules, statusVisning, tekst, useInnspel, useTema, venterVisning };
package/dist/index.js CHANGED
@@ -5,15 +5,25 @@ import { View as View9 } from "react-native";
5
5
  // src/skjermbilde.ts
6
6
  import { createContext, useContext } from "react";
7
7
  import { Image } from "react-native";
8
- function createScreenshotAdapter(captureRef) {
8
+ function storrelse(uri) {
9
+ return new Promise((resolve, reject) => Image.getSize(uri, (w, h) => resolve({ width: w, height: h }), reject));
10
+ }
11
+ function createScreenshotAdapter(captureRef, options = {}) {
12
+ const { pickImage, captureScreen } = options;
9
13
  return {
10
- async capture(ref, options) {
11
- const uri = await captureRef(ref, { format: options.format, quality: options.quality, result: "tmpfile" });
12
- const { width, height } = await new Promise(
13
- (resolve, reject) => Image.getSize(uri, (w, h) => resolve({ width: w, height: h }), reject)
14
- );
15
- return { uri, width, height };
14
+ async capture(ref, opts) {
15
+ const uri = await captureRef(ref, { format: opts.format, quality: opts.quality, result: "tmpfile" });
16
+ return { uri, ...await storrelse(uri) };
16
17
  },
18
+ ...pickImage ? {
19
+ async pick() {
20
+ const valgt = await pickImage();
21
+ if (!valgt) return null;
22
+ const { width, height } = valgt.width && valgt.height ? { width: valgt.width, height: valgt.height } : await storrelse(valgt.uri);
23
+ return { uri: valgt.uri, width, height };
24
+ }
25
+ } : {},
26
+ ...captureScreen === false ? { captureScreen: false } : {},
17
27
  measure(ref) {
18
28
  return new Promise((resolve) => {
19
29
  const view = ref.current;
@@ -500,6 +510,10 @@ var tekst = {
500
510
  // 2f — skjermbilde (K4, DD-39, DD-40, DD-42)
501
511
  leggVedSkjermbilde: "Legg ved skjermbilde",
502
512
  leggVedHint: "Bildet tas f\xF8rst n\xE5r du trykker \u2014 du ser det f\xF8r det sendes.",
513
+ velgBilde: "Velg bilde",
514
+ velgBildeHint: "Fra bildene dine. Du ser det og kan maskere det f\xF8r det sendes.",
515
+ skjermbildeUnderGalleri: "Bildet er fra galleriet. Appen maskerer ingenting i det for deg \u2014 mal over det som ikke skal med.",
516
+ bildeFeilet: "kunne ikke hente bildet. Du kan sende uten.",
503
517
  skjermbildeTittel: "Se over bildet",
504
518
  skjermbildeUnder: "Bildet ble tatt da du trykket. Det du maskerer, ser vi aldri.",
505
519
  maskering: "Maskering",
@@ -556,6 +570,8 @@ var tekst = {
556
570
  mineTom: "Du har ikke sendt noe enn\xE5.",
557
571
  mineIkkeSendt: "Ikke sendt enn\xE5",
558
572
  mineSak: (nr) => `Sak ${nr}`,
573
+ // Leietakeren fjernet vedlegget. Bare AT — aldri hvorfor, av hvem eller når.
574
+ bildeFjernet: "Bildet er fjernet.",
559
575
  svarFra: (leietaker) => `Svar fra ${leietaker}`,
560
576
  svarFraGenerisk: "Svar",
561
577
  sendNytt: "Send nytt innspill",
@@ -655,6 +671,8 @@ function Felt({
655
671
  onSend,
656
672
  sender,
657
673
  onSkjermbilde,
674
+ onVelgBilde,
675
+ bildeNotat,
658
676
  harVedlegg,
659
677
  onFjernVedlegg
660
678
  }) {
@@ -845,17 +863,31 @@ function Felt({
845
863
  )
846
864
  ]
847
865
  }
848
- ) : onSkjermbilde ? /* @__PURE__ */ jsx2(
849
- Btn,
850
- {
851
- variant: "secondary",
852
- testID: "legg-ved-skjermbilde",
853
- ikon: "\u{1F4F7}",
854
- label: tekst.leggVedSkjermbilde,
855
- hint: tekst.leggVedHint,
856
- onPress: onSkjermbilde
857
- }
858
- ) : null,
866
+ ) : onSkjermbilde || onVelgBilde ? /* @__PURE__ */ jsxs2(View2, { style: { gap: tema.space.sm }, children: [
867
+ onSkjermbilde ? /* @__PURE__ */ jsx2(
868
+ Btn,
869
+ {
870
+ variant: "secondary",
871
+ testID: "legg-ved-skjermbilde",
872
+ ikon: "\u{1F4F7}",
873
+ label: tekst.leggVedSkjermbilde,
874
+ hint: tekst.leggVedHint,
875
+ onPress: onSkjermbilde
876
+ }
877
+ ) : null,
878
+ onVelgBilde ? /* @__PURE__ */ jsx2(
879
+ Btn,
880
+ {
881
+ variant: "secondary",
882
+ testID: "velg-bilde",
883
+ ikon: "\u{1F5BC}",
884
+ label: tekst.velgBilde,
885
+ hint: tekst.velgBildeHint,
886
+ onPress: onVelgBilde
887
+ }
888
+ ) : null,
889
+ bildeNotat ? /* @__PURE__ */ jsx2(View2, { testID: "bilde-notat", children: /* @__PURE__ */ jsx2(Hint, { children: bildeNotat }) }) : null
890
+ ] }) : null,
859
891
  /* @__PURE__ */ jsxs2(View2, { style: { borderTopWidth: tema.hairline, borderTopColor: tema.color.border, paddingTop: tema.space.sm }, children: [
860
892
  /* @__PURE__ */ jsx2(
861
893
  Pressable2,
@@ -1228,6 +1260,10 @@ function MineInnspill({
1228
1260
  /* @__PURE__ */ jsx6(StatusPill, { ikon: v.ikon, etikett: v.etikett, farge: v.farge }),
1229
1261
  /* @__PURE__ */ jsx6(Hint, { children: v.lofte })
1230
1262
  ] }),
1263
+ !venter && rad.attachmentRemoved ? /* @__PURE__ */ jsxs6(View6, { testID: `bilde-fjernet-${rad.id}`, style: { flexDirection: "row", gap: tema.space.xs, alignItems: "center" }, children: [
1264
+ /* @__PURE__ */ jsx6(Text6, { accessibilityElementsHidden: true, importantForAccessibility: "no", style: { fontSize: tema.font.small }, children: "\u{1F5D1}" }),
1265
+ /* @__PURE__ */ jsx6(Hint, { children: tekst.bildeFjernet })
1266
+ ] }) : null,
1231
1267
  svar ? /* @__PURE__ */ jsxs6(
1232
1268
  View6,
1233
1269
  {
@@ -1270,6 +1306,8 @@ function Skjermbilde({
1270
1306
  rotStorrelse,
1271
1307
  previewRef,
1272
1308
  komponerer,
1309
+ kilde = "skjerm",
1310
+ notat,
1273
1311
  onFjern,
1274
1312
  onLeggVed
1275
1313
  }) {
@@ -1362,7 +1400,8 @@ function Skjermbilde({
1362
1400
  };
1363
1401
  const a11y = tekst.skjermbildeA11y(automasker.length, egne.length, allTekst);
1364
1402
  return /* @__PURE__ */ jsxs7(View7, { style: { flex: 1, gap: tema.space.md }, children: [
1365
- /* @__PURE__ */ jsx7(H, { sub: tekst.skjermbildeUnder, children: tekst.skjermbildeTittel }),
1403
+ /* @__PURE__ */ jsx7(H, { sub: kilde === "galleri" ? tekst.skjermbildeUnderGalleri : tekst.skjermbildeUnder, children: tekst.skjermbildeTittel }),
1404
+ notat ? /* @__PURE__ */ jsx7(View7, { testID: "bilde-notat", children: /* @__PURE__ */ jsx7(Hint, { children: notat }) }) : null,
1366
1405
  /* @__PURE__ */ jsxs7(View7, { accessibilityRole: "toolbar", accessibilityLabel: tekst.maskering, style: { flexDirection: "row", gap: tema.space.sm }, children: [
1367
1406
  knapp("felt", "\u25A3", tekst.maskerFelt),
1368
1407
  knapp("pensel", "\u270E", tekst.tegnOver),
@@ -1467,7 +1506,8 @@ function Widget({
1467
1506
  synlig,
1468
1507
  apneOpsjoner,
1469
1508
  onLukk,
1470
- tenantName
1509
+ tenantName,
1510
+ imageStepNote
1471
1511
  }) {
1472
1512
  const tema = useTema();
1473
1513
  const insets = useContext3(SafeAreaInsetsContext) ?? initialWindowMetrics?.insets ?? { top: 0, bottom: 0, left: 0, right: 0 };
@@ -1490,9 +1530,13 @@ function Widget({
1490
1530
  const [automasker, setAutomasker] = useState3([]);
1491
1531
  const [rotStorrelse, setRotStorrelse] = useState3({ width: 1, height: 1 });
1492
1532
  const [komponerer, setKomponerer] = useState3(false);
1533
+ const [kilde, setKilde] = useState3("skjerm");
1493
1534
  const [vedlegg, setVedlegg] = useState3();
1494
1535
  const [innstillinger, setInnstillinger] = useState3({ ...client.settings });
1495
1536
  const skjermbildeMulig = innstillinger.screenshotsEnabled && skjermbilde?.adapter != null;
1537
+ const fangstMulig = skjermbildeMulig && skjermbilde?.adapter?.captureScreen !== false;
1538
+ const galleriMulig = skjermbildeMulig && typeof skjermbilde?.adapter?.pick === "function";
1539
+ const bildeNotat = typeof imageStepNote === "string" ? imageStepNote : imageStepNote?.[spor];
1496
1540
  const nullstill = useCallback2(() => {
1497
1541
  setSteg("valg");
1498
1542
  setSpor("feil");
@@ -1569,11 +1613,28 @@ function Widget({
1569
1613
  setAutomasker([]);
1570
1614
  }
1571
1615
  setBilde(fangst);
1616
+ setKilde("skjerm");
1572
1617
  setSteg("skjermbilde");
1573
1618
  } catch {
1574
1619
  setFeil(tekst.skjermbildeFeilet);
1575
1620
  }
1576
1621
  }, [skjermbilde]);
1622
+ const velgBilde = useCallback2(async () => {
1623
+ const pick = skjermbilde?.adapter?.pick;
1624
+ if (!pick) return;
1625
+ setFeil(void 0);
1626
+ try {
1627
+ const valgt = await pick.call(skjermbilde.adapter);
1628
+ if (!valgt) return;
1629
+ setRotStorrelse({ width: valgt.width, height: valgt.height });
1630
+ setAutomasker([]);
1631
+ setBilde(valgt);
1632
+ setKilde("galleri");
1633
+ setSteg("skjermbilde");
1634
+ } catch {
1635
+ setFeil(tekst.bildeFeilet);
1636
+ }
1637
+ }, [skjermbilde]);
1577
1638
  const leggVedBilde = useCallback2(async () => {
1578
1639
  if (!skjermbilde?.adapter) return;
1579
1640
  setKomponerer(true);
@@ -1737,7 +1798,9 @@ function Widget({
1737
1798
  funn,
1738
1799
  onSend: send,
1739
1800
  sender,
1740
- ...skjermbildeMulig ? { onSkjermbilde: taSkjermbilde } : {},
1801
+ ...fangstMulig ? { onSkjermbilde: taSkjermbilde } : {},
1802
+ ...galleriMulig ? { onVelgBilde: velgBilde } : {},
1803
+ ...bildeNotat ? { bildeNotat } : {},
1741
1804
  harVedlegg: vedlegg !== void 0,
1742
1805
  onFjernVedlegg: fjernBilde
1743
1806
  }
@@ -1750,6 +1813,8 @@ function Widget({
1750
1813
  rotStorrelse,
1751
1814
  previewRef,
1752
1815
  komponerer,
1816
+ kilde,
1817
+ ...bildeNotat ? { notat: bildeNotat } : {},
1753
1818
  onFjern: fjernBilde,
1754
1819
  onLeggVed: leggVedBilde
1755
1820
  }
@@ -1797,7 +1862,8 @@ function InnspelProvider({
1797
1862
  theme,
1798
1863
  colorScheme = "dark",
1799
1864
  tenantName,
1800
- screenshot
1865
+ screenshot,
1866
+ imageStepNote
1801
1867
  }) {
1802
1868
  const [synlig, setSynlig] = useState4(false);
1803
1869
  const [apneOpsjoner, setApneOpsjoner] = useState4();
@@ -1831,6 +1897,7 @@ function InnspelProvider({
1831
1897
  synlig,
1832
1898
  ...apneOpsjoner ? { apneOpsjoner } : {},
1833
1899
  ...tenantName ? { tenantName } : {},
1900
+ ...imageStepNote ? { imageStepNote } : {},
1834
1901
  onLukk: close
1835
1902
  }
1836
1903
  )