@innspel/react-native 0.5.0 → 0.6.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.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;
@@ -258,7 +268,7 @@ import { initialWindowMetrics, SafeAreaInsetsContext } from "react-native-safe-a
258
268
 
259
269
  // src/widget/Felt.tsx
260
270
  import { useMemo, useState } from "react";
261
- import { Pressable as Pressable2, Text as Text2, TextInput, View as View2 } from "react-native";
271
+ import { Pressable as Pressable2, ScrollView, Text as Text2, TextInput, View as View2 } from "react-native";
262
272
 
263
273
  // src/widget/primitiver.tsx
264
274
  import "react";
@@ -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",
@@ -655,6 +669,8 @@ function Felt({
655
669
  onSend,
656
670
  sender,
657
671
  onSkjermbilde,
672
+ onVelgBilde,
673
+ bildeNotat,
658
674
  harVedlegg,
659
675
  onFjernVedlegg
660
676
  }) {
@@ -680,229 +696,254 @@ function Felt({
680
696
  return verdi2 && !fjernedeFelter.includes(felt) ? { felt, etikett, verdi: verdi2 } : null;
681
697
  }).filter((x) => x !== null);
682
698
  }, [kontekst, fjernedeFelter]);
683
- return /* @__PURE__ */ jsxs2(View2, { style: { flex: 1, gap: tema.space.md }, children: [
684
- lenketTil ? /* @__PURE__ */ jsxs2(
685
- View2,
699
+ return /* @__PURE__ */ jsxs2(View2, { testID: "skjema", style: { flexGrow: 1, flexShrink: 1, gap: tema.space.md }, children: [
700
+ /* @__PURE__ */ jsxs2(
701
+ ScrollView,
686
702
  {
687
- style: {
688
- flexDirection: "row",
689
- alignItems: "center",
690
- gap: tema.space.sm,
691
- minHeight: tema.touch,
692
- borderWidth: tema.hairline,
693
- borderColor: tema.color.borderInteractive,
694
- borderRadius: tema.radius.pill,
695
- paddingLeft: tema.space.md,
696
- paddingRight: tema.space.xs
697
- },
703
+ testID: "skjema-kropp",
704
+ style: { flexGrow: 0, flexShrink: 1 },
705
+ contentContainerStyle: { gap: tema.space.md },
706
+ keyboardShouldPersistTaps: "handled",
698
707
  children: [
699
- /* @__PURE__ */ jsx2(Text2, { style: { flex: 1, color: tema.color.textPrimary, fontSize: tema.font.small }, children: tekst.lenketTil(lenketTil.title) }),
700
- /* @__PURE__ */ jsx2(
701
- Pressable2,
708
+ lenketTil ? /* @__PURE__ */ jsxs2(
709
+ View2,
702
710
  {
703
- testID: "fjern-lenke",
704
- accessibilityRole: "button",
705
- accessibilityLabel: tekst.fjernLenke,
706
- onPress: onFjernLenke,
707
- style: { minWidth: tema.touch, minHeight: tema.touch, alignItems: "center", justifyContent: "center" },
708
- children: /* @__PURE__ */ jsx2(Text2, { style: { color: tema.color.textSecondary, fontSize: tema.font.small }, children: "\u2715" })
711
+ style: {
712
+ flexDirection: "row",
713
+ alignItems: "center",
714
+ gap: tema.space.sm,
715
+ minHeight: tema.touch,
716
+ borderWidth: tema.hairline,
717
+ borderColor: tema.color.borderInteractive,
718
+ borderRadius: tema.radius.pill,
719
+ paddingLeft: tema.space.md,
720
+ paddingRight: tema.space.xs
721
+ },
722
+ children: [
723
+ /* @__PURE__ */ jsx2(Text2, { style: { flex: 1, color: tema.color.textPrimary, fontSize: tema.font.small }, children: tekst.lenketTil(lenketTil.title) }),
724
+ /* @__PURE__ */ jsx2(
725
+ Pressable2,
726
+ {
727
+ testID: "fjern-lenke",
728
+ accessibilityRole: "button",
729
+ accessibilityLabel: tekst.fjernLenke,
730
+ onPress: onFjernLenke,
731
+ style: { minWidth: tema.touch, minHeight: tema.touch, alignItems: "center", justifyContent: "center" },
732
+ children: /* @__PURE__ */ jsx2(Text2, { style: { color: tema.color.textSecondary, fontSize: tema.font.small }, children: "\u2715" })
733
+ }
734
+ )
735
+ ]
709
736
  }
710
- )
711
- ]
712
- }
713
- ) : null,
714
- uavklart ? /* @__PURE__ */ jsxs2(
715
- View2,
716
- {
717
- style: {
718
- gap: tema.space.sm,
719
- backgroundColor: tema.color.warningBg,
720
- borderRadius: tema.radius.md,
721
- padding: tema.space.md
722
- },
723
- children: [
737
+ ) : null,
738
+ uavklart ? /* @__PURE__ */ jsxs2(
739
+ View2,
740
+ {
741
+ style: {
742
+ gap: tema.space.sm,
743
+ backgroundColor: tema.color.warningBg,
744
+ borderRadius: tema.radius.md,
745
+ padding: tema.space.md
746
+ },
747
+ children: [
748
+ /* @__PURE__ */ jsx2(
749
+ Text2,
750
+ {
751
+ accessibilityRole: "alert",
752
+ accessibilityLiveRegion: "polite",
753
+ style: {
754
+ color: tema.color.warning,
755
+ fontSize: tema.font.small,
756
+ lineHeight: tema.lineHeight.small,
757
+ fontWeight: tema.weight.medium
758
+ },
759
+ children: tekst.monsterSpm[uavklart.kind]
760
+ }
761
+ ),
762
+ /* @__PURE__ */ jsxs2(View2, { style: { flexDirection: "row", gap: tema.space.sm }, children: [
763
+ /* @__PURE__ */ jsx2(
764
+ Btn,
765
+ {
766
+ grow: true,
767
+ variant: "secondary",
768
+ testID: "monster-fjern",
769
+ label: tekst.monsterFjern,
770
+ onPress: () => onEndre(verdi.slice(0, uavklart.start) + verdi.slice(uavklart.end))
771
+ }
772
+ ),
773
+ /* @__PURE__ */ jsx2(
774
+ Btn,
775
+ {
776
+ grow: true,
777
+ variant: "ghost",
778
+ testID: "monster-behold",
779
+ label: tekst.monsterBehold,
780
+ onPress: () => setBeholdt((b) => [...b, uavklart.match])
781
+ }
782
+ )
783
+ ] }),
784
+ /* @__PURE__ */ jsx2(Hint, { children: tekst.monsterForklaring })
785
+ ]
786
+ }
787
+ ) : null,
788
+ /* @__PURE__ */ jsx2(H, { children: spor === "onske" ? tekst.feltLabelOnske : tekst.feltLabelFeil }),
724
789
  /* @__PURE__ */ jsx2(
790
+ TextInput,
791
+ {
792
+ testID: "innspill-tekst",
793
+ accessibilityLabel: spor === "onske" ? tekst.feltLabelOnske : tekst.feltLabelFeil,
794
+ value: verdi,
795
+ onChangeText: onEndre,
796
+ maxLength: textMaxLength,
797
+ multiline: true,
798
+ numberOfLines: 4,
799
+ placeholder: spor === "onske" ? tekst.placeholderOnske : tekst.placeholderFeil,
800
+ placeholderTextColor: tema.color.textMuted,
801
+ style: {
802
+ backgroundColor: tema.color.surfaceRaised,
803
+ borderWidth: tema.hairline,
804
+ borderColor: full ? tema.color.warning : tema.color.borderStrong,
805
+ borderRadius: tema.radius.md,
806
+ padding: tema.space.md,
807
+ color: tema.color.textPrimary,
808
+ fontSize: tema.font.body,
809
+ lineHeight: tema.lineHeight.body,
810
+ minHeight: tema.touch * 2,
811
+ textAlignVertical: "top"
812
+ }
813
+ }
814
+ ),
815
+ visTeller ? /* @__PURE__ */ jsxs2(
725
816
  Text2,
726
817
  {
727
- accessibilityRole: "alert",
728
- accessibilityLiveRegion: "polite",
818
+ testID: "teller",
819
+ accessibilityLiveRegion: full ? "assertive" : "polite",
729
820
  style: {
730
- color: tema.color.warning,
731
- fontSize: tema.font.small,
732
- lineHeight: tema.lineHeight.small,
733
- fontWeight: tema.weight.medium
821
+ alignSelf: "flex-end",
822
+ color: full ? tema.color.warning : tema.color.textMuted,
823
+ fontSize: tema.font.small
734
824
  },
735
- children: tekst.monsterSpm[uavklart.kind]
825
+ children: [
826
+ brukt,
827
+ " / ",
828
+ textMaxLength,
829
+ full ? tekst.tellerFull : ""
830
+ ]
736
831
  }
737
- ),
738
- /* @__PURE__ */ jsxs2(View2, { style: { flexDirection: "row", gap: tema.space.sm }, children: [
739
- /* @__PURE__ */ jsx2(
832
+ ) : null,
833
+ harVedlegg ? /* @__PURE__ */ jsxs2(
834
+ View2,
835
+ {
836
+ testID: "vedlegg-chip",
837
+ style: {
838
+ flexDirection: "row",
839
+ alignItems: "center",
840
+ gap: tema.space.sm,
841
+ minHeight: tema.touch,
842
+ borderWidth: tema.hairline,
843
+ borderColor: tema.color.borderInteractive,
844
+ borderRadius: tema.radius.pill,
845
+ paddingLeft: tema.space.md,
846
+ paddingRight: tema.space.xs
847
+ },
848
+ children: [
849
+ /* @__PURE__ */ jsx2(Text2, { accessibilityElementsHidden: true, importantForAccessibility: "no", style: { fontSize: tema.font.small }, children: "\u{1F4F7}" }),
850
+ /* @__PURE__ */ jsx2(Text2, { style: { flex: 1, color: tema.color.textPrimary, fontSize: tema.font.small }, children: tekst.skjermbildeLagtVed }),
851
+ /* @__PURE__ */ jsx2(
852
+ Pressable2,
853
+ {
854
+ testID: "fjern-vedlegg",
855
+ accessibilityRole: "button",
856
+ accessibilityLabel: tekst.fjernSkjermbilde,
857
+ onPress: onFjernVedlegg,
858
+ style: { minWidth: tema.touch, minHeight: tema.touch, alignItems: "center", justifyContent: "center" },
859
+ children: /* @__PURE__ */ jsx2(Text2, { style: { color: tema.color.textSecondary, fontSize: tema.font.small }, children: "\u2715" })
860
+ }
861
+ )
862
+ ]
863
+ }
864
+ ) : onSkjermbilde || onVelgBilde ? /* @__PURE__ */ jsxs2(View2, { style: { gap: tema.space.sm }, children: [
865
+ onSkjermbilde ? /* @__PURE__ */ jsx2(
740
866
  Btn,
741
867
  {
742
- grow: true,
743
868
  variant: "secondary",
744
- testID: "monster-fjern",
745
- label: tekst.monsterFjern,
746
- onPress: () => onEndre(verdi.slice(0, uavklart.start) + verdi.slice(uavklart.end))
869
+ testID: "legg-ved-skjermbilde",
870
+ ikon: "\u{1F4F7}",
871
+ label: tekst.leggVedSkjermbilde,
872
+ hint: tekst.leggVedHint,
873
+ onPress: onSkjermbilde
747
874
  }
748
- ),
749
- /* @__PURE__ */ jsx2(
875
+ ) : null,
876
+ onVelgBilde ? /* @__PURE__ */ jsx2(
750
877
  Btn,
751
878
  {
752
- grow: true,
753
- variant: "ghost",
754
- testID: "monster-behold",
755
- label: tekst.monsterBehold,
756
- onPress: () => setBeholdt((b) => [...b, uavklart.match])
879
+ variant: "secondary",
880
+ testID: "velg-bilde",
881
+ ikon: "\u{1F5BC}",
882
+ label: tekst.velgBilde,
883
+ hint: tekst.velgBildeHint,
884
+ onPress: onVelgBilde
757
885
  }
758
- )
759
- ] }),
760
- /* @__PURE__ */ jsx2(Hint, { children: tekst.monsterForklaring })
886
+ ) : null,
887
+ bildeNotat ? /* @__PURE__ */ jsx2(View2, { testID: "bilde-notat", children: /* @__PURE__ */ jsx2(Hint, { children: bildeNotat }) }) : null
888
+ ] }) : null,
889
+ /* @__PURE__ */ jsxs2(View2, { style: { borderTopWidth: tema.hairline, borderTopColor: tema.color.border, paddingTop: tema.space.sm }, children: [
890
+ /* @__PURE__ */ jsx2(
891
+ Pressable2,
892
+ {
893
+ testID: "kontekst-bryter",
894
+ accessibilityRole: "button",
895
+ accessibilityState: { expanded: apen },
896
+ accessibilityLabel: `${tekst.kontekstLinje}${apen ? "" : tekst.kontekstVis}`,
897
+ onPress: () => setApen((a) => !a),
898
+ style: { minHeight: tema.touch, justifyContent: "center" },
899
+ children: /* @__PURE__ */ jsxs2(Text2, { style: { color: tema.color.textSecondary, fontSize: tema.font.small }, children: [
900
+ apen ? "\u25B4" : "\u25BE",
901
+ " ",
902
+ tekst.kontekstLinje,
903
+ apen ? "" : tekst.kontekstVis
904
+ ] })
905
+ }
906
+ ),
907
+ apen ? /* @__PURE__ */ jsxs2(View2, { children: [
908
+ linjer.map((l) => /* @__PURE__ */ jsxs2(
909
+ View2,
910
+ {
911
+ style: {
912
+ flexDirection: "row",
913
+ alignItems: "center",
914
+ gap: tema.space.sm,
915
+ minHeight: tema.touch,
916
+ borderBottomWidth: tema.hairline,
917
+ borderBottomColor: tema.color.border
918
+ },
919
+ children: [
920
+ /* @__PURE__ */ jsx2(Text2, { style: { color: tema.color.textMuted, fontSize: tema.font.small, minWidth: tema.touch * 2 }, children: l.etikett }),
921
+ /* @__PURE__ */ jsx2(Text2, { style: { flex: 1, color: tema.color.textPrimary, fontSize: tema.font.small }, children: l.verdi }),
922
+ /* @__PURE__ */ jsx2(
923
+ Pressable2,
924
+ {
925
+ testID: `fjern-${l.felt}`,
926
+ accessibilityRole: "button",
927
+ accessibilityLabel: `${tekst.kontekstFjern} ${l.etikett.toLowerCase()} fra innsendingen`,
928
+ onPress: () => onFjernKontekst(l.felt),
929
+ style: { minWidth: tema.touch, minHeight: tema.touch, alignItems: "center", justifyContent: "center" },
930
+ children: /* @__PURE__ */ jsxs2(Text2, { style: { color: tema.color.textSecondary, fontSize: tema.font.small }, children: [
931
+ "\u2715 ",
932
+ tekst.kontekstFjern
933
+ ] })
934
+ }
935
+ )
936
+ ]
937
+ },
938
+ l.felt
939
+ )),
940
+ /* @__PURE__ */ jsx2(View2, { style: { paddingTop: tema.space.sm }, children: /* @__PURE__ */ jsx2(Hint, { children: tekst.kontekstAldri }) })
941
+ ] }) : null
942
+ ] })
761
943
  ]
762
944
  }
763
- ) : null,
764
- /* @__PURE__ */ jsx2(H, { children: spor === "onske" ? tekst.feltLabelOnske : tekst.feltLabelFeil }),
765
- /* @__PURE__ */ jsx2(
766
- TextInput,
767
- {
768
- testID: "innspill-tekst",
769
- accessibilityLabel: spor === "onske" ? tekst.feltLabelOnske : tekst.feltLabelFeil,
770
- value: verdi,
771
- onChangeText: onEndre,
772
- maxLength: textMaxLength,
773
- multiline: true,
774
- numberOfLines: 4,
775
- placeholder: spor === "onske" ? tekst.placeholderOnske : tekst.placeholderFeil,
776
- placeholderTextColor: tema.color.textMuted,
777
- style: {
778
- backgroundColor: tema.color.surfaceRaised,
779
- borderWidth: tema.hairline,
780
- borderColor: full ? tema.color.warning : tema.color.borderStrong,
781
- borderRadius: tema.radius.md,
782
- padding: tema.space.md,
783
- color: tema.color.textPrimary,
784
- fontSize: tema.font.body,
785
- lineHeight: tema.lineHeight.body,
786
- minHeight: tema.touch * 2,
787
- textAlignVertical: "top"
788
- }
789
- }
790
945
  ),
791
- visTeller ? /* @__PURE__ */ jsxs2(
792
- Text2,
793
- {
794
- testID: "teller",
795
- accessibilityLiveRegion: full ? "assertive" : "polite",
796
- style: {
797
- alignSelf: "flex-end",
798
- color: full ? tema.color.warning : tema.color.textMuted,
799
- fontSize: tema.font.small
800
- },
801
- children: [
802
- brukt,
803
- " / ",
804
- textMaxLength,
805
- full ? tekst.tellerFull : ""
806
- ]
807
- }
808
- ) : null,
809
- harVedlegg ? /* @__PURE__ */ jsxs2(
810
- View2,
811
- {
812
- testID: "vedlegg-chip",
813
- style: {
814
- flexDirection: "row",
815
- alignItems: "center",
816
- gap: tema.space.sm,
817
- minHeight: tema.touch,
818
- borderWidth: tema.hairline,
819
- borderColor: tema.color.borderInteractive,
820
- borderRadius: tema.radius.pill,
821
- paddingLeft: tema.space.md,
822
- paddingRight: tema.space.xs
823
- },
824
- children: [
825
- /* @__PURE__ */ jsx2(Text2, { accessibilityElementsHidden: true, importantForAccessibility: "no", style: { fontSize: tema.font.small }, children: "\u{1F4F7}" }),
826
- /* @__PURE__ */ jsx2(Text2, { style: { flex: 1, color: tema.color.textPrimary, fontSize: tema.font.small }, children: tekst.skjermbildeLagtVed }),
827
- /* @__PURE__ */ jsx2(
828
- Pressable2,
829
- {
830
- testID: "fjern-vedlegg",
831
- accessibilityRole: "button",
832
- accessibilityLabel: tekst.fjernSkjermbilde,
833
- onPress: onFjernVedlegg,
834
- style: { minWidth: tema.touch, minHeight: tema.touch, alignItems: "center", justifyContent: "center" },
835
- children: /* @__PURE__ */ jsx2(Text2, { style: { color: tema.color.textSecondary, fontSize: tema.font.small }, children: "\u2715" })
836
- }
837
- )
838
- ]
839
- }
840
- ) : onSkjermbilde ? /* @__PURE__ */ jsx2(
841
- Btn,
842
- {
843
- variant: "secondary",
844
- testID: "legg-ved-skjermbilde",
845
- ikon: "\u{1F4F7}",
846
- label: tekst.leggVedSkjermbilde,
847
- hint: tekst.leggVedHint,
848
- onPress: onSkjermbilde
849
- }
850
- ) : null,
851
- /* @__PURE__ */ jsxs2(View2, { style: { borderTopWidth: tema.hairline, borderTopColor: tema.color.border, paddingTop: tema.space.sm }, children: [
852
- /* @__PURE__ */ jsx2(
853
- Pressable2,
854
- {
855
- testID: "kontekst-bryter",
856
- accessibilityRole: "button",
857
- accessibilityState: { expanded: apen },
858
- accessibilityLabel: `${tekst.kontekstLinje}${apen ? "" : tekst.kontekstVis}`,
859
- onPress: () => setApen((a) => !a),
860
- style: { minHeight: tema.touch, justifyContent: "center" },
861
- children: /* @__PURE__ */ jsxs2(Text2, { style: { color: tema.color.textSecondary, fontSize: tema.font.small }, children: [
862
- apen ? "\u25B4" : "\u25BE",
863
- " ",
864
- tekst.kontekstLinje,
865
- apen ? "" : tekst.kontekstVis
866
- ] })
867
- }
868
- ),
869
- apen ? /* @__PURE__ */ jsxs2(View2, { children: [
870
- linjer.map((l) => /* @__PURE__ */ jsxs2(
871
- View2,
872
- {
873
- style: {
874
- flexDirection: "row",
875
- alignItems: "center",
876
- gap: tema.space.sm,
877
- minHeight: tema.touch,
878
- borderBottomWidth: tema.hairline,
879
- borderBottomColor: tema.color.border
880
- },
881
- children: [
882
- /* @__PURE__ */ jsx2(Text2, { style: { color: tema.color.textMuted, fontSize: tema.font.small, minWidth: tema.touch * 2 }, children: l.etikett }),
883
- /* @__PURE__ */ jsx2(Text2, { style: { flex: 1, color: tema.color.textPrimary, fontSize: tema.font.small }, children: l.verdi }),
884
- /* @__PURE__ */ jsx2(
885
- Pressable2,
886
- {
887
- testID: `fjern-${l.felt}`,
888
- accessibilityRole: "button",
889
- accessibilityLabel: `${tekst.kontekstFjern} ${l.etikett.toLowerCase()} fra innsendingen`,
890
- onPress: () => onFjernKontekst(l.felt),
891
- style: { minWidth: tema.touch, minHeight: tema.touch, alignItems: "center", justifyContent: "center" },
892
- children: /* @__PURE__ */ jsxs2(Text2, { style: { color: tema.color.textSecondary, fontSize: tema.font.small }, children: [
893
- "\u2715 ",
894
- tekst.kontekstFjern
895
- ] })
896
- }
897
- )
898
- ]
899
- },
900
- l.felt
901
- )),
902
- /* @__PURE__ */ jsx2(View2, { style: { paddingTop: tema.space.sm }, children: /* @__PURE__ */ jsx2(Hint, { children: tekst.kontekstAldri }) })
903
- ] }) : null
904
- ] }),
905
- /* @__PURE__ */ jsx2(View2, { style: { flex: 1, justifyContent: "flex-end" }, children: /* @__PURE__ */ jsx2(
946
+ /* @__PURE__ */ jsx2(View2, { testID: "skjema-fot", style: { flexGrow: 1, flexShrink: 0, justifyContent: "flex-end" }, children: /* @__PURE__ */ jsx2(
906
947
  Btn,
907
948
  {
908
949
  testID: "send",
@@ -969,7 +1010,7 @@ function Valg({ onVelg }) {
969
1010
 
970
1011
  // src/widget/KjenteFeil.tsx
971
1012
  import "react";
972
- import { ActivityIndicator, Text as Text4, View as View4 } from "react-native";
1013
+ import { ActivityIndicator, ScrollView as ScrollView2, Text as Text4, View as View4 } from "react-native";
973
1014
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
974
1015
  function KjenteFeil({
975
1016
  kort,
@@ -986,73 +1027,82 @@ function KjenteFeil({
986
1027
  /* @__PURE__ */ jsx4(ActivityIndicator, { accessibilityLabel: "Sjekker kjente feil", color: tema.color.textSecondary })
987
1028
  ] });
988
1029
  }
989
- return /* @__PURE__ */ jsxs4(View4, { style: { flex: 1, gap: tema.space.md }, children: [
1030
+ return /* @__PURE__ */ jsxs4(View4, { testID: "kjente-feil", style: { flexGrow: 1, flexShrink: 1, gap: tema.space.md }, children: [
990
1031
  /* @__PURE__ */ jsx4(H, { sub: spor === "onske" ? tekst.kjenteFeilUnderOnske : tekst.kjenteFeilUnderFeil, children: spor === "onske" ? tekst.kjenteFeilTittelOnske : tekst.kjenteFeilTittelFeil }),
991
- kort.map((k) => {
992
- const versjon = k.fixedIn ? k.status === "fikset" ? tekst.rettetI(k.fixedIn) : tekst.rettesI(k.fixedIn) : void 0;
993
- const kontekst = versjon ? `${k.title}. ${versjon}` : k.title;
994
- return /* @__PURE__ */ jsxs4(Card, { children: [
995
- /* @__PURE__ */ jsx4(
996
- Text4,
997
- {
998
- style: {
999
- color: tema.color.textPrimary,
1000
- fontSize: tema.font.body,
1001
- lineHeight: tema.lineHeight.body,
1002
- fontWeight: tema.weight.medium
1003
- },
1004
- children: k.title
1005
- }
1006
- ),
1007
- k.workaround ? /* @__PURE__ */ jsxs4(
1008
- Text4,
1009
- {
1010
- style: {
1011
- color: tema.color.textSecondary,
1012
- fontSize: tema.font.small,
1013
- lineHeight: tema.lineHeight.small
1014
- },
1015
- children: [
1016
- tekst.omvei,
1017
- " ",
1018
- k.workaround
1019
- ]
1020
- }
1021
- ) : null,
1022
- versjon ? /* @__PURE__ */ jsx4(
1023
- StatusPill,
1024
- {
1025
- ikon: k.status === "fikset" ? "\u2713" : "\u{1F527}",
1026
- etikett: versjon,
1027
- farge: k.status === "fikset" ? "success" : "info"
1028
- }
1029
- ) : null,
1030
- /* @__PURE__ */ jsxs4(View4, { style: { flexDirection: "row", gap: tema.space.sm }, children: [
1031
- /* @__PURE__ */ jsx4(
1032
- Btn,
1033
- {
1034
- grow: true,
1035
- testID: `ja-ogsa-${k.id}`,
1036
- label: tekst.svarJa,
1037
- accessibilityLabel: `${tekst.svarJa}. ${kontekst}`,
1038
- onPress: () => onJaOgsa(k)
1039
- }
1040
- ),
1041
- /* @__PURE__ */ jsx4(
1042
- Btn,
1043
- {
1044
- grow: true,
1045
- variant: "secondary",
1046
- testID: `ligner-${k.id}`,
1047
- label: tekst.svarLigner,
1048
- accessibilityLabel: `${tekst.svarLigner}. ${kontekst}`,
1049
- onPress: () => onLigner(k)
1050
- }
1051
- )
1052
- ] })
1053
- ] }, k.id);
1054
- }),
1055
- /* @__PURE__ */ jsx4(Btn, { variant: "secondary", testID: "nei-noe-annet", label: tekst.svarNei, onPress: onNei })
1032
+ /* @__PURE__ */ jsx4(
1033
+ ScrollView2,
1034
+ {
1035
+ testID: "kjente-feil-liste",
1036
+ style: { flexGrow: 0, flexShrink: 1 },
1037
+ contentContainerStyle: { gap: tema.space.md },
1038
+ keyboardShouldPersistTaps: "handled",
1039
+ children: kort.map((k) => {
1040
+ const versjon = k.fixedIn ? k.status === "fikset" ? tekst.rettetI(k.fixedIn) : tekst.rettesI(k.fixedIn) : void 0;
1041
+ const kontekst = versjon ? `${k.title}. ${versjon}` : k.title;
1042
+ return /* @__PURE__ */ jsxs4(Card, { children: [
1043
+ /* @__PURE__ */ jsx4(
1044
+ Text4,
1045
+ {
1046
+ style: {
1047
+ color: tema.color.textPrimary,
1048
+ fontSize: tema.font.body,
1049
+ lineHeight: tema.lineHeight.body,
1050
+ fontWeight: tema.weight.medium
1051
+ },
1052
+ children: k.title
1053
+ }
1054
+ ),
1055
+ k.workaround ? /* @__PURE__ */ jsxs4(
1056
+ Text4,
1057
+ {
1058
+ style: {
1059
+ color: tema.color.textSecondary,
1060
+ fontSize: tema.font.small,
1061
+ lineHeight: tema.lineHeight.small
1062
+ },
1063
+ children: [
1064
+ tekst.omvei,
1065
+ " ",
1066
+ k.workaround
1067
+ ]
1068
+ }
1069
+ ) : null,
1070
+ versjon ? /* @__PURE__ */ jsx4(
1071
+ StatusPill,
1072
+ {
1073
+ ikon: k.status === "fikset" ? "\u2713" : "\u{1F527}",
1074
+ etikett: versjon,
1075
+ farge: k.status === "fikset" ? "success" : "info"
1076
+ }
1077
+ ) : null,
1078
+ /* @__PURE__ */ jsxs4(View4, { style: { flexDirection: "row", gap: tema.space.sm }, children: [
1079
+ /* @__PURE__ */ jsx4(
1080
+ Btn,
1081
+ {
1082
+ grow: true,
1083
+ testID: `ja-ogsa-${k.id}`,
1084
+ label: tekst.svarJa,
1085
+ accessibilityLabel: `${tekst.svarJa}. ${kontekst}`,
1086
+ onPress: () => onJaOgsa(k)
1087
+ }
1088
+ ),
1089
+ /* @__PURE__ */ jsx4(
1090
+ Btn,
1091
+ {
1092
+ grow: true,
1093
+ variant: "secondary",
1094
+ testID: `ligner-${k.id}`,
1095
+ label: tekst.svarLigner,
1096
+ accessibilityLabel: `${tekst.svarLigner}. ${kontekst}`,
1097
+ onPress: () => onLigner(k)
1098
+ }
1099
+ )
1100
+ ] })
1101
+ ] }, k.id);
1102
+ })
1103
+ }
1104
+ ),
1105
+ /* @__PURE__ */ jsx4(View4, { testID: "kjente-feil-fot", style: { flexShrink: 0 }, children: /* @__PURE__ */ jsx4(Btn, { variant: "secondary", testID: "nei-noe-annet", label: tekst.svarNei, onPress: onNei }) })
1056
1106
  ] });
1057
1107
  }
1058
1108
 
@@ -1114,7 +1164,7 @@ function Kvittering({
1114
1164
 
1115
1165
  // src/widget/MineInnspill.tsx
1116
1166
  import "react";
1117
- import { ActivityIndicator as ActivityIndicator2, ScrollView, Text as Text6, View as View6 } from "react-native";
1167
+ import { ActivityIndicator as ActivityIndicator2, ScrollView as ScrollView3, Text as Text6, View as View6 } from "react-native";
1118
1168
 
1119
1169
  // src/widget/status.ts
1120
1170
  var IKON = {
@@ -1181,7 +1231,7 @@ function MineInnspill({
1181
1231
  const tema = useTema();
1182
1232
  return /* @__PURE__ */ jsxs6(View6, { style: { flex: 1, gap: tema.space.md }, children: [
1183
1233
  /* @__PURE__ */ jsx6(H, { sub: tekst.mineUnder, children: tekst.mineTittel }),
1184
- laster ? /* @__PURE__ */ jsx6(ActivityIndicator2, { accessibilityLabel: "Henter innspillene dine", color: tema.color.textSecondary }) : rader.length === 0 ? /* @__PURE__ */ jsx6(Hint, { children: tekst.mineTom }) : /* @__PURE__ */ jsx6(ScrollView, { style: { flex: 1 }, contentContainerStyle: { gap: tema.space.sm }, children: rader.map((rad) => {
1234
+ laster ? /* @__PURE__ */ jsx6(ActivityIndicator2, { accessibilityLabel: "Henter innspillene dine", color: tema.color.textSecondary }) : rader.length === 0 ? /* @__PURE__ */ jsx6(Hint, { children: tekst.mineTom }) : /* @__PURE__ */ jsx6(ScrollView3, { style: { flex: 1 }, contentContainerStyle: { gap: tema.space.sm }, children: rader.map((rad) => {
1185
1235
  const venter = rad.pending === true;
1186
1236
  const v = venter ? venterVisning : statusVisning(rad.status, rad.type, rad.deadlineAt);
1187
1237
  const nokkel = venter ? rad.clientRef : rad.id;
@@ -1250,6 +1300,8 @@ function Skjermbilde({
1250
1300
  rotStorrelse,
1251
1301
  previewRef,
1252
1302
  komponerer,
1303
+ kilde = "skjerm",
1304
+ notat,
1253
1305
  onFjern,
1254
1306
  onLeggVed
1255
1307
  }) {
@@ -1342,7 +1394,8 @@ function Skjermbilde({
1342
1394
  };
1343
1395
  const a11y = tekst.skjermbildeA11y(automasker.length, egne.length, allTekst);
1344
1396
  return /* @__PURE__ */ jsxs7(View7, { style: { flex: 1, gap: tema.space.md }, children: [
1345
- /* @__PURE__ */ jsx7(H, { sub: tekst.skjermbildeUnder, children: tekst.skjermbildeTittel }),
1397
+ /* @__PURE__ */ jsx7(H, { sub: kilde === "galleri" ? tekst.skjermbildeUnderGalleri : tekst.skjermbildeUnder, children: tekst.skjermbildeTittel }),
1398
+ notat ? /* @__PURE__ */ jsx7(View7, { testID: "bilde-notat", children: /* @__PURE__ */ jsx7(Hint, { children: notat }) }) : null,
1346
1399
  /* @__PURE__ */ jsxs7(View7, { accessibilityRole: "toolbar", accessibilityLabel: tekst.maskering, style: { flexDirection: "row", gap: tema.space.sm }, children: [
1347
1400
  knapp("felt", "\u25A3", tekst.maskerFelt),
1348
1401
  knapp("pensel", "\u270E", tekst.tegnOver),
@@ -1447,7 +1500,8 @@ function Widget({
1447
1500
  synlig,
1448
1501
  apneOpsjoner,
1449
1502
  onLukk,
1450
- tenantName
1503
+ tenantName,
1504
+ imageStepNote
1451
1505
  }) {
1452
1506
  const tema = useTema();
1453
1507
  const insets = useContext3(SafeAreaInsetsContext) ?? initialWindowMetrics?.insets ?? { top: 0, bottom: 0, left: 0, right: 0 };
@@ -1470,9 +1524,13 @@ function Widget({
1470
1524
  const [automasker, setAutomasker] = useState3([]);
1471
1525
  const [rotStorrelse, setRotStorrelse] = useState3({ width: 1, height: 1 });
1472
1526
  const [komponerer, setKomponerer] = useState3(false);
1527
+ const [kilde, setKilde] = useState3("skjerm");
1473
1528
  const [vedlegg, setVedlegg] = useState3();
1474
1529
  const [innstillinger, setInnstillinger] = useState3({ ...client.settings });
1475
1530
  const skjermbildeMulig = innstillinger.screenshotsEnabled && skjermbilde?.adapter != null;
1531
+ const fangstMulig = skjermbildeMulig && skjermbilde?.adapter?.captureScreen !== false;
1532
+ const galleriMulig = skjermbildeMulig && typeof skjermbilde?.adapter?.pick === "function";
1533
+ const bildeNotat = typeof imageStepNote === "string" ? imageStepNote : imageStepNote?.[spor];
1476
1534
  const nullstill = useCallback2(() => {
1477
1535
  setSteg("valg");
1478
1536
  setSpor("feil");
@@ -1549,11 +1607,28 @@ function Widget({
1549
1607
  setAutomasker([]);
1550
1608
  }
1551
1609
  setBilde(fangst);
1610
+ setKilde("skjerm");
1552
1611
  setSteg("skjermbilde");
1553
1612
  } catch {
1554
1613
  setFeil(tekst.skjermbildeFeilet);
1555
1614
  }
1556
1615
  }, [skjermbilde]);
1616
+ const velgBilde = useCallback2(async () => {
1617
+ const pick = skjermbilde?.adapter?.pick;
1618
+ if (!pick) return;
1619
+ setFeil(void 0);
1620
+ try {
1621
+ const valgt = await pick.call(skjermbilde.adapter);
1622
+ if (!valgt) return;
1623
+ setRotStorrelse({ width: valgt.width, height: valgt.height });
1624
+ setAutomasker([]);
1625
+ setBilde(valgt);
1626
+ setKilde("galleri");
1627
+ setSteg("skjermbilde");
1628
+ } catch {
1629
+ setFeil(tekst.bildeFeilet);
1630
+ }
1631
+ }, [skjermbilde]);
1557
1632
  const leggVedBilde = useCallback2(async () => {
1558
1633
  if (!skjermbilde?.adapter) return;
1559
1634
  setKomponerer(true);
@@ -1717,7 +1792,9 @@ function Widget({
1717
1792
  funn,
1718
1793
  onSend: send,
1719
1794
  sender,
1720
- ...skjermbildeMulig ? { onSkjermbilde: taSkjermbilde } : {},
1795
+ ...fangstMulig ? { onSkjermbilde: taSkjermbilde } : {},
1796
+ ...galleriMulig ? { onVelgBilde: velgBilde } : {},
1797
+ ...bildeNotat ? { bildeNotat } : {},
1721
1798
  harVedlegg: vedlegg !== void 0,
1722
1799
  onFjernVedlegg: fjernBilde
1723
1800
  }
@@ -1730,6 +1807,8 @@ function Widget({
1730
1807
  rotStorrelse,
1731
1808
  previewRef,
1732
1809
  komponerer,
1810
+ kilde,
1811
+ ...bildeNotat ? { notat: bildeNotat } : {},
1733
1812
  onFjern: fjernBilde,
1734
1813
  onLeggVed: leggVedBilde
1735
1814
  }
@@ -1777,7 +1856,8 @@ function InnspelProvider({
1777
1856
  theme,
1778
1857
  colorScheme = "dark",
1779
1858
  tenantName,
1780
- screenshot
1859
+ screenshot,
1860
+ imageStepNote
1781
1861
  }) {
1782
1862
  const [synlig, setSynlig] = useState4(false);
1783
1863
  const [apneOpsjoner, setApneOpsjoner] = useState4();
@@ -1811,6 +1891,7 @@ function InnspelProvider({
1811
1891
  synlig,
1812
1892
  ...apneOpsjoner ? { apneOpsjoner } : {},
1813
1893
  ...tenantName ? { tenantName } : {},
1894
+ ...imageStepNote ? { imageStepNote } : {},
1814
1895
  onLukk: close
1815
1896
  }
1816
1897
  )
@@ -1850,7 +1931,7 @@ import { Modal as Modal4, Pressable as Pressable8, Text as Text13, View as View1
1850
1931
 
1851
1932
  // src/program/Aksept.tsx
1852
1933
  import "react";
1853
- import { Linking, Modal as Modal2, Pressable as Pressable6, ScrollView as ScrollView2, Text as Text9, View as View11 } from "react-native";
1934
+ import { Linking, Modal as Modal2, Pressable as Pressable6, ScrollView as ScrollView4, Text as Text9, View as View11 } from "react-native";
1854
1935
 
1855
1936
  // src/program/periode.ts
1856
1937
  var MANEDER = [
@@ -1916,7 +1997,7 @@ function Aksept({
1916
1997
  /* @__PURE__ */ jsx11(View11, {})
1917
1998
  ] }),
1918
1999
  feil ? /* @__PURE__ */ jsx11(Banner, { live: true, ikon: "\u26A0", tone: "danger", children: tekst.akseptFeil(feil) }) : null,
1919
- /* @__PURE__ */ jsxs10(ScrollView2, { contentContainerStyle: { gap: tema.space.md }, children: [
2000
+ /* @__PURE__ */ jsxs10(ScrollView4, { contentContainerStyle: { gap: tema.space.md }, children: [
1920
2001
  /* @__PURE__ */ jsx11(H, { sub: tekst.akseptHva, children: program.name }),
1921
2002
  /* @__PURE__ */ jsx11(
1922
2003
  Text9,