diff --git a/apps/mobile/app/components/header/index.tsx b/apps/mobile/app/components/header/index.tsx
index b07b206e2..6119adc9b 100644
--- a/apps/mobile/app/components/header/index.tsx
+++ b/apps/mobile/app/components/header/index.tsx
@@ -32,7 +32,6 @@ import { useSelectionStore } from "../../stores/use-selection-store";
import { useSettingStore } from "../../stores/use-setting-store";
import { eScrollEvent } from "../../utils/events";
import { fluidTabsRef } from "../../utils/global-refs";
-import { DefaultAppStyles } from "../../utils/styles";
import { IconButton, IconButtonProps } from "../ui/icon-button";
import Heading from "../ui/typography/heading";
@@ -106,7 +105,7 @@ export const Header = ({
return (
@@ -116,7 +115,6 @@ export const Header = ({
flexDirection: "row",
justifyContent: "space-between",
borderRadius: Radius.S,
- paddingHorizontal: Spacing.LEVEL_2,
paddingVertical: Spacing.LEVEL_3,
backgroundColor: colors.secondary.background,
alignItems: "center"
diff --git a/apps/mobile/app/components/list-items/note/index.tsx b/apps/mobile/app/components/list-items/note/index.tsx
index 01c432a41..3ebbfb8f7 100644
--- a/apps/mobile/app/components/list-items/note/index.tsx
+++ b/apps/mobile/app/components/list-items/note/index.tsx
@@ -162,9 +162,9 @@ const NoteItem = ({
);
const canShowTopStatusBar =
- attachmentsCount > 0 &&
- activeStatusIcons.length > 0 &&
- notebooks?.items?.length &&
+ attachmentsCount > 0 ||
+ activeStatusIcons.length > 0 ||
+ notebooks?.items?.length ||
tags?.items.length;
return (
@@ -369,7 +369,7 @@ const NoteItem = ({
gap: Spacing.LEVEL_1
}}
>
- {color ? (
+ {color && compactMode ? (
{
const { colors } = useThemeColors();
@@ -86,15 +84,17 @@ const ColorItem = ({ item, note }: { item: Color; note: Note }) => {
height: 40,
borderRadius: 100,
justifyContent: "center",
- alignItems: "center"
+ alignItems: "center",
+ borderWidth: 0
}}
>
{isLinked ? (
-
) : null}
diff --git a/apps/mobile/app/components/properties/date-meta.tsx b/apps/mobile/app/components/properties/date-meta.tsx
index 20191b69a..1091b0879 100644
--- a/apps/mobile/app/components/properties/date-meta.tsx
+++ b/apps/mobile/app/components/properties/date-meta.tsx
@@ -97,7 +97,7 @@ export const DateMeta = ({ item }: { item: Item }) => {
{key === "dateCreated" && item.type === "note" ? (
<>
-
+
>
) : null}
diff --git a/apps/mobile/app/components/properties/index.tsx b/apps/mobile/app/components/properties/index.tsx
index 6e4c91ca1..ca0316753 100644
--- a/apps/mobile/app/components/properties/index.tsx
+++ b/apps/mobile/app/components/properties/index.tsx
@@ -63,6 +63,7 @@ import {
Tag,
TrashItem
} from "@notesnook/core";
+import LineSeparator from "../ui/seperator/line-separator";
export type PropertiesItem =
| Note
@@ -131,7 +132,7 @@ export const Properties = ({
borderBottomRightRadius: DDS.isLargeTablet() ? 10 : 1,
borderBottomLeftRadius: DDS.isLargeTablet() ? 10 : 1,
maxHeight: "100%",
- paddingTop: Spacing.LEVEL_2
+ paddingTop: Spacing.LEVEL_3
}}
nestedScrollEnabled
bounces={false}
@@ -159,8 +160,7 @@ export const Properties = ({
>
{item.type === "note" && (noteNotebooks.length || tags.length) ? (
@@ -248,7 +248,7 @@ export const Properties = ({
/>
) : null}
- {item.title}
+ {item.title}
{editAction ? (
) : null}
-
-
-
- {item.type === "note" && colorNotes.length > 0 ? (
-
- ) : null}
-
{item.type === "note" ? (
- 0 ? 1 : 0,
- borderColor: colors.primary.border,
- paddingVertical: Spacing.LEVEL_2,
- paddingTop: colorNotes.length > 0 ? Spacing.LEVEL_2 : 0,
- gap: Spacing.LEVEL_2
- }}
- >
-
+ >
) : null}
-
-
-
+
{
diff --git a/apps/mobile/app/components/sheets/sort/index.tsx b/apps/mobile/app/components/sheets/sort/index.tsx
index b7408b977..cd2d45ed1 100644
--- a/apps/mobile/app/components/sheets/sort/index.tsx
+++ b/apps/mobile/app/components/sheets/sort/index.tsx
@@ -285,7 +285,16 @@ const Sort = ({
await updateGroupOptions(_groupOptions);
}}
>
-
+
{strings.sortByStrings[
item as keyof typeof strings.sortByStrings
]()}
diff --git a/apps/mobile/app/components/ui/pressable/use-button.ts b/apps/mobile/app/components/ui/pressable/use-button.ts
index 91b38ecad..164ca79c4 100644
--- a/apps/mobile/app/components/ui/pressable/use-button.ts
+++ b/apps/mobile/app/components/ui/pressable/use-button.ts
@@ -188,7 +188,7 @@ const buttonTypes = (
"accent-outline": {
primary: "transparent",
text: colors.primary.accent,
- selected: accent || colors.primary.accent,
+ selected: "transparent",
borderWidth: 1,
borderColor: accent || colors.primary.accent,
borderSelectedColor: accent || colors.primary.accent
@@ -217,9 +217,9 @@ const buttonTypes = (
text: colors.primary.heading,
selected: colors.primary.accent,
colorOpacity: 0.12,
- borderWidth: 0.8,
- borderColor: getColorLinearShade(colors.primary.shade, 0.3, isDark),
- borderSelectedColor: getColorLinearShade(colors.primary.shade, 0.3, isDark)
+ borderWidth: 0
+ // borderColor: getColorLinearShade(colors.primary.shade, 0.3, isDark),
+ // borderSelectedColor: getColorLinearShade(colors.primary.shade, 0.3, isDark)
},
error: {
primary: colors.error.background,
diff --git a/apps/mobile/app/screens/manage-tags/index.tsx b/apps/mobile/app/screens/manage-tags/index.tsx
index ea44e2f93..73e486ac6 100644
--- a/apps/mobile/app/screens/manage-tags/index.tsx
+++ b/apps/mobile/app/screens/manage-tags/index.tsx
@@ -25,17 +25,19 @@ import { useThemeColors } from "@notesnook/theme";
import React, { useCallback, useEffect, useRef, useState } from "react";
import { TextInput, View } from "react-native";
import { SafeAreaView } from "react-native-safe-area-context";
-import Icon from "react-native-vector-icons/MaterialCommunityIcons";
import { db } from "../../common/database";
+import { Radius, Spacing } from "../../common/design/spacing";
import { Header } from "../../components/header";
+import AppIcon from "../../components/ui/AppIcon";
+import { Button } from "../../components/ui/button";
import Input from "../../components/ui/input";
import { Pressable } from "../../components/ui/pressable";
import Heading from "../../components/ui/typography/heading";
import Paragraph from "../../components/ui/typography/paragraph";
import { useNavigationFocus } from "../../hooks/use-navigation-focus";
import {
- sendItemUpdateEvent,
- ToastManager
+ ToastManager,
+ sendItemUpdateEvent
} from "../../services/event-manager";
import Navigation, { NavigationProps } from "../../services/navigation";
import {
@@ -44,8 +46,7 @@ import {
} from "../../stores/item-selection-store";
import { useRelationStore } from "../../stores/use-relation-store";
import { useTagStore } from "../../stores/use-tag-store";
-import { AppFontSize, defaultBorderRadius } from "../../utils/size";
-import { DefaultAppStyles } from "../../utils/styles";
+import { AppFontSize } from "../../utils/size";
async function updateInitialSelectionState(items: string[]) {
const relations = await db.relations
@@ -90,18 +91,26 @@ const ManageTags = (props: NavigationProps<"ManageTags">) => {
const [tags, setTags] = useState();
const [query, setQuery] = useState();
const inputRef = useRef(null);
- useNavigationFocus(props.navigation, { focusOnInit: true });
+ useNavigationFocus(props.navigation, {
+ focusOnInit: true
+ });
const timerRef = useRef(undefined);
const [queryExists, setQueryExists] = useState(false);
const refreshSelection = useCallback(() => {
- updateInitialSelectionState(ids).then((selection) => {
+ updateInitialSelectionState(ids).then((initialState) => {
+ const prev = useTagItemSelection.getState();
+ const selection = { ...initialState };
+ for (const id in prev.selection) {
+ if (prev.selection[id] !== prev.initialState[id]) {
+ selection[id] = prev.selection[id];
+ }
+ }
useTagItemSelection.setState({
- initialState: selection,
- selection: { ...selection }
+ initialState,
+ selection
});
});
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [ids, tags]);
+ }, [ids]);
const sortAndSetTags = useCallback(
async (items: VirtualizedGrouping) => {
@@ -130,6 +139,12 @@ const ManageTags = (props: NavigationProps<"ManageTags">) => {
[ids]
);
+ useEffect(() => {
+ return () => {
+ useTagItemSelection.getState().reset();
+ };
+ }, []);
+
const refreshTags = useCallback(() => {
if (query && query.trim() !== "") {
db.lookup
@@ -190,109 +205,128 @@ const ManageTags = (props: NavigationProps<"ManageTags">) => {
}
if (id) {
- for (const noteId of ids) {
- await db.relations.add(
- {
- id: id,
- type: "tag"
- },
- {
- id: noteId,
- type: "note"
- }
- );
- }
+ const { selection } = useTagItemSelection.getState();
+ useTagItemSelection.setState({
+ selection: {
+ ...selection,
+ [id]: "selected"
+ }
+ });
}
- useRelationStore.getState().update();
- sendItemUpdateEvent(id, "tag");
useTagStore.getState().refresh();
setQuery(undefined);
} catch (e) {
ToastManager.error(e as Error);
}
-
- Navigation.queueRoutesForUpdate();
};
- const onPress = useCallback(
- async (id: string) => {
- for (const noteId of ids) {
- try {
- if (!id) return;
- const isSelected =
- useTagItemSelection.getState().initialState[id] === "selected";
- if (isSelected) {
- await db.relations.unlink(
- {
- id: id,
- type: "tag"
- },
- {
- id: noteId,
- type: "note"
- }
+ const onPress = useCallback((id: string) => {
+ if (!id) return;
+ const { selection } = useTagItemSelection.getState();
+ useTagItemSelection.setState({
+ selection: {
+ ...selection,
+ [id]: selection[id] === "selected" ? "deselected" : "selected"
+ }
+ });
+ }, []);
+
+ const onSave = useCallback(async () => {
+ const { selection, initialState } = useTagItemSelection.getState();
+ const changedIds = new Set([
+ ...Object.keys(selection),
+ ...Object.keys(initialState)
+ ]);
+
+ try {
+ for (const id of changedIds) {
+ if (selection[id] === initialState[id]) continue;
+
+ const shouldLink = selection[id] === "selected";
+ for (const noteId of ids) {
+ if (shouldLink) {
+ await db.relations.add(
+ { id, type: "tag" },
+ { id: noteId, type: "note" }
);
} else {
- await db.relations.add(
- {
- id: id,
- type: "tag"
- },
- {
- id: noteId,
- type: "note"
- }
+ await db.relations.unlink(
+ { id, type: "tag" },
+ { id: noteId, type: "note" }
);
}
- } catch (e) {
- console.error(e);
}
+ sendItemUpdateEvent(id, "tag");
}
- sendItemUpdateEvent(id, "tag");
+
useTagStore.getState().refresh();
useRelationStore.getState().update();
- refreshTags();
- setTimeout(() => {
- Navigation.queueRoutesForUpdate();
- }, 1);
- refreshSelection();
- },
- [ids, refreshSelection, refreshTags]
- );
+ Navigation.queueRoutesForUpdate();
+ Navigation.goBack();
+ } catch (e) {
+ ToastManager.error(e as Error);
+ }
+ }, [ids]);
const renderTag = useCallback(
- ({ index, item }: { item: Tag; index: number }) => (
+ ({ item }: { item: Tag; index: number }) => (
),
[onPress]
);
+ const hasChanges = useTagItemSelection((state) => {
+ const norm = (v?: string) =>
+ v === "selected" ? "s" : v === "intermediate" ? "i" : "n";
+ const changedIds = new Set([
+ ...Object.keys(state.selection),
+ ...Object.keys(state.initialState)
+ ]);
+ for (const id of changedIds) {
+ if (norm(state.selection[id]) !== norm(state.initialState[id])) {
+ return true;
+ }
+ }
+ return false;
+ });
+
return (
-
+
{}
}}
+ containerStyle={{
+ backgroundColor: colors.secondary.background,
+ borderWidth: 0
+ }}
testID="tag-input"
fwdRef={inputRef}
autoCapitalize="none"
@@ -309,28 +343,12 @@ const ManageTags = (props: NavigationProps<"ManageTags">) => {
placeholder={strings.searchForTags()}
/>
- {query && !queryExists ? (
-
-
- {strings.add()} {'"' + "#" + query + '"'}
-
-
-
- ) : null}
+
) => {
keyboardDismissMode="interactive"
estimatedItemSize={50}
renderItem={renderTag}
+ ListHeaderComponent={
+ query && !queryExists ? (
+
+
+ {strings.add()} {'"' + "#" + query + '"'}
+
+
+
+ ) : null
+ }
ListEmptyComponent={
) => {
/>
+
+
+
+
);
};
@@ -389,65 +455,49 @@ const TagItem = ({
}) => {
const { colors } = useThemeColors();
const selection = useTagItemSelection((state) =>
- tag?.id ? state.selection[tag?.id] : false
+ tag?.id ? state.selection[tag?.id] : undefined
);
+ const selected = selection === "selected" || selection === "intermediate";
return (
{
if (!tag) return;
onPress(tag.id);
}}
- type="plain"
+ type={selected ? "selected" : "transparent"}
>
- {!tag ? null : (
- {
- if (!tag) return;
- onPress(tag.id);
- }}
- color={
- selection === "selected" || selection === "intermediate"
- ? colors.selected.icon
- : colors.primary.icon
- }
- style={{
- marginRight: 6
- }}
- testID={
- selection === "selected"
- ? "check-circle-outline"
- : selection === "intermediate"
- ? "minus-circle-outline"
- : "checkbox-blank-circle-outline"
- }
- name={
- selection === "selected"
- ? "check-circle-outline"
- : selection === "intermediate"
- ? "minus-circle-outline"
- : "checkbox-blank-circle-outline"
- }
- />
- )}
- {tag ? (
- {"#" + tag?.title}
- ) : (
-
- )}
+
+
+ {"#" + tag?.title}
+
);
};
diff --git a/apps/mobile/fonts/MaterialCommunityIcons.ttf b/apps/mobile/fonts/MaterialCommunityIcons.ttf
index 0e07b8576..1c7858743 100644
Binary files a/apps/mobile/fonts/MaterialCommunityIcons.ttf and b/apps/mobile/fonts/MaterialCommunityIcons.ttf differ
diff --git a/apps/mobile/fonts/notesnook-icons.glyphmap.json b/apps/mobile/fonts/notesnook-icons.glyphmap.json
index 3c4f7621e..24637e420 100644
--- a/apps/mobile/fonts/notesnook-icons.glyphmap.json
+++ b/apps/mobile/fonts/notesnook-icons.glyphmap.json
@@ -1 +1 @@
-{"m":{"f":"notesnook-icons","u":1024,"z":1020,"s":59648,"h":"2dcedc1a0af01c1b9f5b41bda35fffed95197a1d2b1ad44fce393eaa995d4663"},"i":{"archive":[1024,[[59648,"#666666"]]],"arrow-back":[1024,[[59649,"rgba(255,255,255,0.7)"]]],"arrow-clockwise":[1024,[[59650,"#181818"]]],"arrow-counter-clockwise":[1024,[[59651,"#181818"]]],"arrow-fat-up":[1024,[[59652,"var(--fill-0, #181818)"]]],"arrow-right":[1024,[[59653,"#008836"]]],"arrow-square-out":[1024,[[59654,"#666666"]]],"arrow-u-up-left":[1024,[[59655,"var(--fill-0, #181818)"]]],"arrows-clockwise":[1024,[[59656,"var(--fill-0, #181818)"]]],"backspace":[1024,[[59657,"#181818"]]],"bag-simple":[1024,[[59658,"var(--fill-0, #181818)"]]],"bell-z":[1024,[[59659,"#181818"]]],"bell":[1024,[[59660,"#666666"]]],"bomb-off":[1024,[[59661,"currentColor"]]],"bomb":[1024,[[59662,"#666666"]]],"book-open":[1024,[[59663,"#666666"]]],"bookmark":[1024,[[59664,"#666666"]]],"box-empty":[1024,[[59665,"#B0B0B1"]]],"bug-droid":[1024,[[59666,"var(--fill-0, #181818)"]]],"calendar-check":[946,[[59667,"var(--fill-0, #181818)"]]],"calendar-day":[1024,[[59668,"#181818"]]],"calendar-dots":[946,[[59669,"var(--fill-0, #181818)"]]],"calendar":[1024,[[59670,"rgba(102,102,102,0.8)"]]],"chart-donut":[1024,[[59671,"#181818"]]],"chart-line-up":[1024,[[59672,"var(--fill-0, #181818)"]]],"chat":[1024,[[59673,"white"]]],"check-small":[951,[[59674,"#008836"]]],"check-square":[1024,[[59675,"#181818"]]],"check":[1024,[[59676,"#008836"]]],"checkbox":[1024,[[59677,"#008836"],[59678,"white"]]],"checks":[1024,[[59679,"#181818"]]],"chevron-down":[1024,[[59680,"#181818"]]],"chevron-right":[1024,[[59681,"#181818"]]],"chevron-up":[1024,[[59682,"#181818"]]],"clock-counter-clockwise":[1024,[[59683,"var(--fill-0, #181818)"]]],"clock":[1024,[[59684,"#181818"]]],"close":[1024,[[59685,"#666666"]]],"cloud-check":[1024,[[59686,"var(--fill-0, #181818)"]]],"cloud":[1024,[[59687,"white"]]],"copy":[1024,[[59688,"#008836"]]],"crown-simple":[1024,[[59689,"#E0B637"]]],"dark-mode-outline":[1024,[[59690,"currentColor"]]],"delete-restore":[1024,[[59691,"currentColor"]]],"device-mobile-camera":[1024,[[59692,"var(--fill-0, #181818)"]]],"discord-logo":[1024,[[59693,"var(--fill-0, #181818)"]]],"dots-three":[1024,[[59694,"#202020"]]],"download-simple":[1024,[[59695,"var(--fill-0, #181818)"]]],"drive-file-move":[1088,[[59696,"#666666"]]],"duplicate":[1024,[[59697,"currentColor"]]],"edit-pencil":[1024,[[59698,"#181818"]]],"ellipse":[1024,[[59699,"#A6A6A6"]]],"envelope-simple":[1024,[[59700,"white"]]],"export":[1024,[[59701,"var(--fill-0, #181818)"]]],"eye-closed":[1024,[[59702,"white"]]],"eye-filled":[1024,[[59703,"#666666"]]],"eye-open":[1024,[[59704,"currentColor"]]],"eye-slash":[1024,[[59705,"var(--fill-0, #181818)"]]],"file-cloud":[1024,[[59706,"#181818"]]],"file-dashed":[1024,[[59707,"var(--fill-0, #181818)"]]],"file-html":[1024,[[59708,"#181818"]]],"file-pdf":[1024,[[59709,"#181818"]]],"file-text":[1024,[[59710,"var(--fill-0, #181818)"]]],"file":[1024,[[59711,"white"]]],"fingerprint-simple":[1024,[[59712,"#181818"]]],"folder":[1024,[[59713,"#181818"]]],"funnel":[1024,[[59714,"#666666"]]],"gift":[1024,[[59715,"#181818"]]],"git-pull-request":[1024,[[59716,"var(--fill-0, #181818)"]]],"github-logo":[1024,[[59717,"var(--fill-0, #181818)"]]],"hard-drives":[1024,[[59718,"var(--fill-0, #181818)"]]],"home":[1024,[[59719,"#181818"]]],"house":[1024,[[59720,"#6F6F6F"]]],"identifier":[1024,[[59721,"currentColor"]]],"image-outline":[1024,[[59722,"white"]]],"key":[1024,[[59723,"var(--fill-0, #181818)"]]],"link-alt":[1024,[[59724,"#666666"]]],"link":[560,[[59725,"#666666"]]],"list":[2190,[[59726,"#181818"]]],"lock-simple":[1024,[[59727,"white"]]],"lock":[1024,[[59728,"#181818"]]],"markdown":[1024,[[59729,"#181818"]]],"mastodon-logo":[1024,[[59730,"var(--fill-0, #181818)"]]],"menu":[1024,[[59731,"#181818"]]],"message-badge-outline":[1024,[[59732,"currentColor"]]],"minus":[1024,[[59733,"#181818"]]],"mode-edit":[1024,[[59734,"#181818"]]],"moon":[1024,[[59735,"var(--fill-0, #181818)"]]],"network":[1024,[[59736,"var(--fill-0, #181818)"]]],"note":[1024,[[59737,"#181818"]]],"notification":[1024,[[59738,"var(--fill-0, #181818)"]]],"numpad":[1024,[[59739,"#181818"]]],"nut":[1024,[[59740,"#181818"]]],"paint-brush-household":[1024,[[59741,"#181818"]]],"paint-roller":[1024,[[59742,"var(--fill-0, #181818)"]]],"palette":[1024,[[59743,"#666666"]]],"paperclip":[1024,[[59744,"#666666"]]],"pause":[1024,[[59745,"var(--fill-0, #181818)"]]],"pencil-ruler":[1024,[[59746,"#181818"]]],"pencil-simple-line":[1024,[[59747,"var(--fill-0, #181818)"]]],"pencil-simple-slash":[1024,[[59748,"#858585"]]],"pencil-simple":[1024,[[59749,"#181818"]]],"pin":[939,[[59750,"#666666"]]],"plus":[1024,[[59751,"#181818"]]],"radio-button":[1024,[[59752,"#008836"]]],"recovery-key-cloud-arrow-down":[1024,[[59753,"var(--fill-0, #181818)"]]],"recovery-key-copy":[1024,[[59754,"var(--stroke-0, #008836)"]]],"recovery-key-file":[1024,[[59755,"var(--fill-0, #181818)"]]],"recovery-key-key":[1024,[[59756,"var(--fill-0, #181818)"]]],"recovery-key-qr-code":[1024,[[59757,"var(--fill-0, #181818)"]]],"recovery-key-shield-check":[1024,[[59758,"var(--fill-0, #008836)"]]],"search":[1024,[[59759,"#181818"]]],"share":[1024,[[59760,"#666666"]]],"shield-check":[1024,[[59761,"#181818"]]],"shield-plus":[1024,[[59762,"#181818"]]],"shield":[1024,[[59763,"var(--fill-0, #181818)"]]],"shopping-mode":[1024,[[59764,"#666666"]]],"sliders-horizontal":[1024,[[59765,"var(--fill-0, #181818)"]]],"sliders":[1024,[[59766,"#181818"]]],"sort-ascending":[1024,[[59767,"#666666"]]],"sort-descending":[1024,[[59768,"currentColor"]]],"speaker-high":[1024,[[59769,"#181818"]]],"spellcheck":[1067,[[59770,"currentColor"]]],"square-out":[1024,[[59771,"#181818"]]],"squares-four":[1024,[[59772,"var(--fill-0, #181818)"]]],"star-filled":[1024,[[59773,"#E5C131"]]],"star":[1024,[[59774,"#666666"]]],"sun":[1024,[[59775,"#666666"]]],"swatches":[1024,[[59776,"var(--fill-0, #181818)"]]],"sync-disabled":[911,[[59777,"#858585"]]],"table":[1024,[[59778,"#181818"]]],"telegram-logo":[1024,[[59779,"var(--fill-0, #181818)"]]],"text-aa":[1024,[[59780,"#181818"]]],"toggle-off":[1725,[[59781,"#DADADA"]]],"toggle-on":[1725,[[59782,"#008836"]]],"trash-alt":[1024,[[59783,"#FB2C36"]]],"trash":[1024,[[59784,"#666666"]]],"tray-arrow-down":[1024,[[59785,"#181818"]]],"user-circle-minus":[1024,[[59786,"var(--fill-0, #FF242E)"]]],"user-sheet-docs":[1024,[[59787,"var(--fill-0, #181818)"]]],"user-sheet-logout":[1024,[[59788,"var(--fill-0, #FB2C36)"]]],"user-sheet-settings":[1024,[[59789,"var(--fill-0, #181818)"]]],"user-sheet-support":[1024,[[59790,"var(--fill-0, #181818)"]]],"user-sheet-sync":[1024,[[59791,"var(--fill-0, #181818)"]]],"user":[1024,[[59792,"var(--fill-0, #181818)"]]],"users-three":[1024,[[59793,"var(--fill-0, #181818)"]]],"view-list":[1024,[[59794,"#181818"]]],"warning-circle":[1024,[[59795,"#BB3431"]]],"warning":[1024,[[59796,"#FF242E"]]],"wifi-slash":[1024,[[59797,"var(--fill-0, #181818)"]]],"x-logo":[1024,[[59798,"var(--fill-0, #181818)"]]]}}
\ No newline at end of file
+{"m":{"f":"notesnook-icons","u":1024,"z":1020,"s":59648,"h":"062b04ae5d347ff9df140348f63c4db60deae915c8111f816e25228ed8ac34f6"},"i":{"archive":[1024,[[59648,"#666666"]]],"arrow-back":[1024,[[59649,"rgba(255,255,255,0.7)"]]],"arrow-clockwise":[1024,[[59650,"#181818"]]],"arrow-counter-clockwise":[1024,[[59651,"#181818"]]],"arrow-fat-up":[1024,[[59652,"var(--fill-0, #181818)"]]],"arrow-right":[1024,[[59653,"#008836"]]],"arrow-square-out":[1024,[[59654,"#666666"]]],"arrow-u-up-left":[1024,[[59655,"var(--fill-0, #181818)"]]],"arrows-clockwise":[1024,[[59656,"var(--fill-0, #181818)"]]],"backspace":[1024,[[59657,"#181818"]]],"bag-simple":[1024,[[59658,"var(--fill-0, #181818)"]]],"bell-z":[1024,[[59659,"#181818"]]],"bell":[1024,[[59660,"#666666"]]],"bomb-off":[1024,[[59661,"currentColor"]]],"bomb":[1024,[[59662,"#666666"]]],"book-open":[1024,[[59663,"#666666"]]],"bookmark":[1024,[[59664,"#666666"]]],"box-empty":[1024,[[59665,"#B0B0B1"]]],"bug-droid":[1024,[[59666,"var(--fill-0, #181818)"]]],"calendar-check":[946,[[59667,"var(--fill-0, #181818)"]]],"calendar-day":[1024,[[59668,"#181818"]]],"calendar-dots":[946,[[59669,"var(--fill-0, #181818)"]]],"calendar":[1024,[[59670,"rgba(102,102,102,0.8)"]]],"chart-donut":[1024,[[59671,"#181818"]]],"chart-line-up":[1024,[[59672,"var(--fill-0, #181818)"]]],"chat":[1024,[[59673,"white"]]],"check-small":[951,[[59674,"#008836"]]],"check-square":[1024,[[59675,"#181818"]]],"check":[1024,[[59676,"#008836"]]],"checkbox-intermediate":[1024,[[59677,"currentColor"]]],"checkbox":[1024,[[59678,"#008836"],[59679,"white"]]],"checks":[1024,[[59680,"#181818"]]],"chevron-down":[1024,[[59681,"#181818"]]],"chevron-right":[1024,[[59682,"#181818"]]],"chevron-up":[1024,[[59683,"#181818"]]],"clock-counter-clockwise":[1024,[[59684,"var(--fill-0, #181818)"]]],"clock":[1024,[[59685,"#181818"]]],"close":[1024,[[59686,"#666666"]]],"cloud-check":[1024,[[59687,"var(--fill-0, #181818)"]]],"cloud":[1024,[[59688,"white"]]],"copy":[1024,[[59689,"#008836"]]],"crown-simple":[1024,[[59690,"#E0B637"]]],"dark-mode-outline":[1024,[[59691,"currentColor"]]],"delete-restore":[1024,[[59692,"currentColor"]]],"device-mobile-camera":[1024,[[59693,"var(--fill-0, #181818)"]]],"discord-logo":[1024,[[59694,"var(--fill-0, #181818)"]]],"dots-three":[1024,[[59695,"#202020"]]],"download-simple":[1024,[[59696,"var(--fill-0, #181818)"]]],"drive-file-move":[1088,[[59697,"#666666"]]],"duplicate":[1024,[[59698,"currentColor"]]],"edit-pencil":[1024,[[59699,"#181818"]]],"ellipse":[1024,[[59700,"#A6A6A6"]]],"envelope-simple":[1024,[[59701,"white"]]],"export":[1024,[[59702,"var(--fill-0, #181818)"]]],"eye-closed":[1024,[[59703,"white"]]],"eye-filled":[1024,[[59704,"#666666"]]],"eye-open":[1024,[[59705,"currentColor"]]],"eye-slash":[1024,[[59706,"var(--fill-0, #181818)"]]],"file-cloud":[1024,[[59707,"#181818"]]],"file-dashed":[1024,[[59708,"var(--fill-0, #181818)"]]],"file-html":[1024,[[59709,"#181818"]]],"file-pdf":[1024,[[59710,"#181818"]]],"file-text":[1024,[[59711,"var(--fill-0, #181818)"]]],"file":[1024,[[59712,"white"]]],"fingerprint-simple":[1024,[[59713,"#181818"]]],"folder":[1024,[[59714,"#181818"]]],"funnel":[1024,[[59715,"#666666"]]],"gift":[1024,[[59716,"#181818"]]],"git-pull-request":[1024,[[59717,"var(--fill-0, #181818)"]]],"github-logo":[1024,[[59718,"var(--fill-0, #181818)"]]],"hard-drives":[1024,[[59719,"var(--fill-0, #181818)"]]],"home":[1024,[[59720,"#181818"]]],"house":[1024,[[59721,"#6F6F6F"]]],"identifier":[1024,[[59722,"currentColor"]]],"image-outline":[1024,[[59723,"white"]]],"key":[1024,[[59724,"var(--fill-0, #181818)"]]],"link-alt":[1024,[[59725,"#666666"]]],"link":[560,[[59726,"#666666"]]],"list":[2190,[[59727,"#181818"]]],"lock-simple":[1024,[[59728,"white"]]],"lock":[1024,[[59729,"#181818"]]],"markdown":[1024,[[59730,"#181818"]]],"mastodon-logo":[1024,[[59731,"var(--fill-0, #181818)"]]],"menu":[1024,[[59732,"#181818"]]],"message-badge-outline":[1024,[[59733,"currentColor"]]],"minus":[1024,[[59734,"#181818"]]],"mode-edit":[1024,[[59735,"#181818"]]],"moon":[1024,[[59736,"var(--fill-0, #181818)"]]],"network":[1024,[[59737,"var(--fill-0, #181818)"]]],"note":[1024,[[59738,"#181818"]]],"notification":[1024,[[59739,"var(--fill-0, #181818)"]]],"numpad":[1024,[[59740,"#181818"]]],"nut":[1024,[[59741,"#181818"]]],"paint-brush-household":[1024,[[59742,"#181818"]]],"paint-roller":[1024,[[59743,"var(--fill-0, #181818)"]]],"palette":[1024,[[59744,"#666666"]]],"paperclip":[1024,[[59745,"#666666"]]],"pause":[1024,[[59746,"var(--fill-0, #181818)"]]],"pencil-ruler":[1024,[[59747,"#181818"]]],"pencil-simple-line":[1024,[[59748,"var(--fill-0, #181818)"]]],"pencil-simple-slash":[1024,[[59749,"#858585"]]],"pencil-simple":[1024,[[59750,"#181818"]]],"pin":[939,[[59751,"#666666"]]],"plus":[1024,[[59752,"#181818"]]],"radio-button":[1024,[[59753,"#008836"]]],"recovery-key-cloud-arrow-down":[1024,[[59754,"var(--fill-0, #181818)"]]],"recovery-key-copy":[1024,[[59755,"var(--stroke-0, #008836)"]]],"recovery-key-file":[1024,[[59756,"var(--fill-0, #181818)"]]],"recovery-key-key":[1024,[[59757,"var(--fill-0, #181818)"]]],"recovery-key-qr-code":[1024,[[59758,"var(--fill-0, #181818)"]]],"recovery-key-shield-check":[1024,[[59759,"var(--fill-0, #008836)"]]],"search":[1024,[[59760,"#181818"]]],"share":[1024,[[59761,"#666666"]]],"shield-check":[1024,[[59762,"#181818"]]],"shield-plus":[1024,[[59763,"#181818"]]],"shield":[1024,[[59764,"var(--fill-0, #181818)"]]],"shopping-mode":[1024,[[59765,"#666666"]]],"sliders-horizontal":[1024,[[59766,"var(--fill-0, #181818)"]]],"sliders":[1024,[[59767,"#181818"]]],"sort-ascending":[1024,[[59768,"#666666"]]],"sort-descending":[1024,[[59769,"currentColor"]]],"speaker-high":[1024,[[59770,"#181818"]]],"spellcheck":[1067,[[59771,"currentColor"]]],"square-out":[1024,[[59772,"#181818"]]],"squares-four":[1024,[[59773,"var(--fill-0, #181818)"]]],"star-filled":[1024,[[59774,"#E5C131"]]],"star":[1024,[[59775,"#666666"]]],"sun":[1024,[[59776,"#666666"]]],"swatches":[1024,[[59777,"var(--fill-0, #181818)"]]],"sync-disabled":[911,[[59778,"#858585"]]],"table":[1024,[[59779,"#181818"]]],"telegram-logo":[1024,[[59780,"var(--fill-0, #181818)"]]],"text-aa":[1024,[[59781,"#181818"]]],"toggle-off":[1725,[[59782,"#DADADA"]]],"toggle-on":[1725,[[59783,"#008836"]]],"trash-alt":[1024,[[59784,"#FB2C36"]]],"trash":[1024,[[59785,"#666666"]]],"tray-arrow-down":[1024,[[59786,"#181818"]]],"user-circle-minus":[1024,[[59787,"var(--fill-0, #FF242E)"]]],"user-sheet-docs":[1024,[[59788,"var(--fill-0, #181818)"]]],"user-sheet-logout":[1024,[[59789,"var(--fill-0, #FB2C36)"]]],"user-sheet-settings":[1024,[[59790,"var(--fill-0, #181818)"]]],"user-sheet-support":[1024,[[59791,"var(--fill-0, #181818)"]]],"user-sheet-sync":[1024,[[59792,"var(--fill-0, #181818)"]]],"user":[1024,[[59793,"var(--fill-0, #181818)"]]],"users-three":[1024,[[59794,"var(--fill-0, #181818)"]]],"view-list":[1024,[[59795,"#181818"]]],"warning-circle":[1024,[[59796,"#BB3431"]]],"warning":[1024,[[59797,"#FF242E"]]],"wifi-slash":[1024,[[59798,"var(--fill-0, #181818)"]]],"x-logo":[1024,[[59799,"var(--fill-0, #181818)"]]]}}
\ No newline at end of file
diff --git a/apps/mobile/fonts/notesnook-icons.ttf b/apps/mobile/fonts/notesnook-icons.ttf
index e19b52626..d11d881ed 100644
Binary files a/apps/mobile/fonts/notesnook-icons.ttf and b/apps/mobile/fonts/notesnook-icons.ttf differ
diff --git a/apps/mobile/ios/nanoicons-fonts/notesnook-icons.ttf b/apps/mobile/ios/nanoicons-fonts/notesnook-icons.ttf
index e19b52626..d11d881ed 100644
Binary files a/apps/mobile/ios/nanoicons-fonts/notesnook-icons.ttf and b/apps/mobile/ios/nanoicons-fonts/notesnook-icons.ttf differ
diff --git a/packages/icons/svgs/checkbox-intermediate.svg b/packages/icons/svgs/checkbox-intermediate.svg
new file mode 100644
index 000000000..7eb99c1a2
--- /dev/null
+++ b/packages/icons/svgs/checkbox-intermediate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/intl/locale/en.po b/packages/intl/locale/en.po
index 0abb6faed..471ca7ad0 100644
--- a/packages/intl/locale/en.po
+++ b/packages/intl/locale/en.po
@@ -6209,6 +6209,10 @@ msgstr "Save account recovery key"
msgid "Save and continue"
msgstr "Save and continue"
+#: src/strings.ts:2942
+msgid "Save changes"
+msgstr "Save changes"
+
#: src/strings.ts:1066
msgid "Save data recovery key"
msgstr "Save data recovery key"
diff --git a/packages/intl/locale/pseudo-LOCALE.po b/packages/intl/locale/pseudo-LOCALE.po
index 12aab00bf..175f2e5ef 100644
--- a/packages/intl/locale/pseudo-LOCALE.po
+++ b/packages/intl/locale/pseudo-LOCALE.po
@@ -6183,6 +6183,10 @@ msgstr ""
msgid "Save and continue"
msgstr ""
+#: src/strings.ts:2942
+msgid "Save changes"
+msgstr ""
+
#: src/strings.ts:1066
msgid "Save data recovery key"
msgstr ""
diff --git a/packages/intl/src/strings.ts b/packages/intl/src/strings.ts
index 702fba9b0..5d9a4874e 100644
--- a/packages/intl/src/strings.ts
+++ b/packages/intl/src/strings.ts
@@ -2938,5 +2938,6 @@ Continue without attachments?`,
t`Something went wrong while preparing your debug logs. This can happen if no storage location was selected.`,
shareZip: () => t`Share ZIP`,
tryDownloadLogsAgain: () => t`Try again`,
- createSubnotebook: () => t`Create sub-notebook`
+ createSubnotebook: () => t`Create sub-notebook`,
+ saveChanges: () => t`Save changes`
};