From b50b64460d74e9d26deb35ad1a6ef242e75106ef Mon Sep 17 00:00:00 2001
From: Hugo Bois
Date: Fri, 3 Jul 2026 20:23:04 +0200
Subject: [PATCH 1/2] visual tweaks for the mobile version
---
.../sidebar/DocumentTreeItem.module.css | 26 +++++++++++
.../editor/sidebar/DocumentTreeItem.tsx | 30 ++++++++++++-
.../editor/sidebar/EditorSidebar.module.css | 4 +-
.../EditorSidebarNavigation.module.css | 4 +-
.../editor/sidebar/SidebarItem.module.css | 26 +++++++++++
.../editor/sidebar/SidebarSceneItem.tsx | 43 ++++++++++++++++---
components/navbar/ProjectNavbar.tsx | 13 +++++-
.../navbar/ProjectNavbarMobileMenu.module.css | 13 ++++--
components/navbar/ScreenplaySearch.module.css | 29 +++++++++++++
components/navbar/ScreenplaySearch.tsx | 21 +++++++--
src/context/ViewContext.tsx | 37 ++++++++++++++--
styles/scriptio.css | 7 +++
12 files changed, 229 insertions(+), 24 deletions(-)
diff --git a/components/editor/sidebar/DocumentTreeItem.module.css b/components/editor/sidebar/DocumentTreeItem.module.css
index 8522327..8ec1df2 100644
--- a/components/editor/sidebar/DocumentTreeItem.module.css
+++ b/components/editor/sidebar/DocumentTreeItem.module.css
@@ -132,6 +132,32 @@
flex-shrink: 0;
}
+/* Touch-only "⋮" affordance that opens the node context menu (the desktop
+ * right-click has no touch equivalent). Hidden on fine pointers. */
+.menu_btn {
+ display: none;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ padding: 2px;
+ border: none;
+ border-radius: 4px;
+ background: none;
+ color: var(--secondary-text);
+ cursor: pointer;
+}
+
+.menu_btn:hover {
+ background-color: var(--editor-style-bg-hover);
+ color: var(--primary-text);
+}
+
+@media (pointer: coarse) {
+ .menu_btn {
+ display: flex;
+ }
+}
+
.action_btn:hover {
background-color: var(--editor-style-bg-hover);
color: var(--primary-text);
diff --git a/components/editor/sidebar/DocumentTreeItem.tsx b/components/editor/sidebar/DocumentTreeItem.tsx
index 0c5ceae..e33101e 100644
--- a/components/editor/sidebar/DocumentTreeItem.tsx
+++ b/components/editor/sidebar/DocumentTreeItem.tsx
@@ -4,7 +4,7 @@ import { useCallback, useRef } from "react";
import { useTranslations } from "next-intl";
import { DocumentNode, DocumentNodeType } from "@src/lib/project/project-state";
import { join } from "@src/lib/utils/misc";
-import { ChevronRight, FileText, Folder, LayoutDashboard } from "lucide-react";
+import { ChevronRight, FileText, Folder, LayoutDashboard, MoreVertical } from "lucide-react";
import styles from "./DocumentTreeItem.module.css";
@@ -94,6 +94,23 @@ const DocumentTreeItem = ({
onRenameCommit(node.id, (renameInputRef.current?.value ?? "").trim());
}, [node.id, onRenameCommit]);
+ // Touch equivalent of right-click: the ⋮ button (shown only on coarse
+ // pointers) opens the same node menu, anchored under the button.
+ const handleMenuButton = useCallback(
+ (e: React.MouseEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
+ onContextMenu(node, {
+ preventDefault: () => {},
+ stopPropagation: () => {},
+ clientX: rect.left,
+ clientY: rect.bottom,
+ } as React.MouseEvent);
+ },
+ [node, onContextMenu],
+ );
+
const handleDragOver = useCallback(
(e: React.DragEvent) => {
if (!draggingId || draggingId === node.id) return;
@@ -200,6 +217,17 @@ const DocumentTreeItem = ({
) : (
{node.title}
)}
+
+ {!busy && (
+ e.stopPropagation()}
+ onClick={handleMenuButton}
+ aria-label="Document options"
+ >
+
+
+ )}
{isFolder &&
diff --git a/components/editor/sidebar/EditorSidebar.module.css b/components/editor/sidebar/EditorSidebar.module.css
index e1967d2..d0d1953 100644
--- a/components/editor/sidebar/EditorSidebar.module.css
+++ b/components/editor/sidebar/EditorSidebar.module.css
@@ -50,8 +50,8 @@
width: var(--mobile-drawer-width);
height: 100%;
padding: 12px calc(12px + var(--safe-right)) calc(20px + var(--safe-bottom)) 12px;
- background-color: var(--main-bg);
- box-shadow: var(--panel-shadow);
+ /* No drawer background — only the rounded .element panel shows, floating
+ * over the (backdrop-dimmed) editor, matching the desktop look. */
transform: translateX(0);
transition: transform 0.25s ease;
pointer-events: auto;
diff --git a/components/editor/sidebar/EditorSidebarNavigation.module.css b/components/editor/sidebar/EditorSidebarNavigation.module.css
index cf6bc20..c798d51 100644
--- a/components/editor/sidebar/EditorSidebarNavigation.module.css
+++ b/components/editor/sidebar/EditorSidebarNavigation.module.css
@@ -64,8 +64,8 @@
width: var(--mobile-drawer-width);
height: 100%;
padding: 12px 12px calc(20px + var(--safe-bottom)) calc(12px + var(--safe-left));
- background-color: var(--main-bg);
- box-shadow: var(--panel-shadow);
+ /* No drawer background — only the rounded .element panel shows, floating
+ * over the (backdrop-dimmed) editor, matching the desktop look. */
transform: translateX(0);
transition: transform 0.25s ease;
pointer-events: auto;
diff --git a/components/editor/sidebar/SidebarItem.module.css b/components/editor/sidebar/SidebarItem.module.css
index 55e1d4a..2f115ec 100644
--- a/components/editor/sidebar/SidebarItem.module.css
+++ b/components/editor/sidebar/SidebarItem.module.css
@@ -117,3 +117,29 @@
opacity: 0.4;
cursor: grabbing;
}
+
+/* Touch-only "⋮" affordance that opens the scene context menu (the desktop
+ * right-click has no touch equivalent). Hidden on fine pointers. */
+.menu_btn {
+ display: none;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ padding: 2px;
+ border: none;
+ border-radius: 4px;
+ background: none;
+ color: var(--secondary-text);
+ cursor: pointer;
+}
+
+.menu_btn:hover {
+ background-color: var(--editor-style-bg-hover);
+ color: var(--primary-text);
+}
+
+@media (pointer: coarse) {
+ .menu_btn {
+ display: flex;
+ }
+}
diff --git a/components/editor/sidebar/SidebarSceneItem.tsx b/components/editor/sidebar/SidebarSceneItem.tsx
index feba9a6..da4a892 100644
--- a/components/editor/sidebar/SidebarSceneItem.tsx
+++ b/components/editor/sidebar/SidebarSceneItem.tsx
@@ -1,6 +1,7 @@
"use client";
import { useContext, memo, useCallback, Ref } from "react";
+import { MoreVertical } from "lucide-react";
import { ContextMenuType, SceneContextProps } from "./ContextMenu";
import { UserContext } from "@src/context/UserContext";
import { join } from "@src/lib/utils/misc";
@@ -26,15 +27,35 @@ type SidebarSceneItemProps = SceneContextProps & {
const SidebarSceneItem = memo(({ scene, index, showDropIndicator, isDragging, isCurrent, label, isOmitted, scrollRef, onPointerDown, onDoubleClick }: SidebarSceneItemProps) => {
const { updateContextMenu } = useContext(UserContext);
+ // Clamp so the menu never opens off the right/bottom edge (matters on touch,
+ // where it's triggered from the ⋮ button near the panel edge).
+ const openMenu = useCallback(
+ (x: number, y: number) => {
+ updateContextMenu({
+ type: ContextMenuType.SceneItem,
+ position: {
+ x: Math.min(x, window.innerWidth - 230),
+ y: Math.min(y, window.innerHeight - 220),
+ },
+ typeSpecificProps: { scene },
+ });
+ },
+ [updateContextMenu, scene],
+ );
+
const handleDropdown = (e: React.MouseEvent) => {
e.preventDefault();
- updateContextMenu({
- type: ContextMenuType.SceneItem,
- position: { x: e.clientX, y: e.clientY },
- typeSpecificProps: {
- scene,
- },
- });
+ openMenu(e.clientX, e.clientY);
+ };
+
+ // Touch equivalent of right-click: the ⋮ button (shown only on coarse
+ // pointers). stopPropagation keeps it from starting a drag or, on click,
+ // bubbling to the context-menu host's close-on-click handler.
+ const handleMenuButton = (e: React.MouseEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
+ openMenu(rect.left, rect.bottom);
};
const handleDoubleClick = useCallback(() => {
@@ -72,6 +93,14 @@ const SidebarSceneItem = memo(({ scene, index, showDropIndicator, isDragging, is
+ e.stopPropagation()}
+ onClick={handleMenuButton}
+ aria-label="Scene options"
+ >
+
+
{displayText}
diff --git a/components/navbar/ProjectNavbar.tsx b/components/navbar/ProjectNavbar.tsx
index 1412478..da9e6ea 100644
--- a/components/navbar/ProjectNavbar.tsx
+++ b/components/navbar/ProjectNavbar.tsx
@@ -287,7 +287,18 @@ const ProjectNavbar = () => {
{isInProject && }
setIsMobileMenuOpen((prev) => !prev)}
+ onClick={() =>
+ setIsMobileMenuOpen((prev) => {
+ const next = !prev;
+ // The menu drawer opens on the right, same as the format
+ // sidebar; close both side drawers so it opens cleanly on top.
+ if (next) {
+ setLeftSidebarOpen(false);
+ setRightSidebarOpen(false);
+ }
+ return next;
+ })
+ }
>
diff --git a/components/navbar/ProjectNavbarMobileMenu.module.css b/components/navbar/ProjectNavbarMobileMenu.module.css
index a63ec0e..6821d2d 100644
--- a/components/navbar/ProjectNavbarMobileMenu.module.css
+++ b/components/navbar/ProjectNavbarMobileMenu.module.css
@@ -1,23 +1,28 @@
+/* Starts below the navbar so it lines up with the left/right sidebar drawers
+ * rather than covering the bar. Sits above them (z 60) so it overlays an
+ * already-open sidebar. */
.backdrop {
position: fixed;
- inset: 0;
+ top: var(--navbar-height);
+ left: 0;
+ right: 0;
+ bottom: 0;
z-index: 70;
background-color: rgba(0, 0, 0, 0.4);
}
.drawer {
position: fixed;
- top: 0;
+ top: var(--navbar-height);
right: 0;
bottom: 0;
z-index: 71;
width: var(--mobile-drawer-width);
- max-width: 360px;
display: flex;
flex-direction: column;
gap: 4px;
- padding: calc(12px + var(--safe-top)) calc(16px + var(--safe-right)) calc(16px + var(--safe-bottom)) 16px;
+ padding: 12px calc(12px + var(--safe-right)) calc(20px + var(--safe-bottom)) 12px;
overflow-y: auto;
background-color: var(--main-bg);
diff --git a/components/navbar/ScreenplaySearch.module.css b/components/navbar/ScreenplaySearch.module.css
index 48ef6aa..203a60f 100644
--- a/components/navbar/ScreenplaySearch.module.css
+++ b/components/navbar/ScreenplaySearch.module.css
@@ -77,6 +77,35 @@
z-index: 1;
}
+/* Phone: the search opens as a panel below the navbar with the input at the
+ * top, instead of an inline field that would expand into (and crush) the
+ * navbar's format dropdown. */
+@media (max-width: 767px) {
+ .dropdown {
+ position: fixed;
+ top: calc(var(--navbar-height) + 4px);
+ left: calc(12px + var(--safe-left));
+ right: calc(12px + var(--safe-right));
+ width: auto;
+ }
+}
+
+.panel_search_input {
+ width: 100%;
+ border: none;
+ border-radius: 8px;
+ padding: 10px 12px;
+ margin-bottom: 8px;
+ background-color: var(--secondary);
+ color: var(--primary-text);
+ font-size: 0.9rem;
+ outline: none;
+}
+
+.panel_search_input::placeholder {
+ color: var(--secondary-text);
+}
+
.navigation {
display: flex;
flex-direction: row;
diff --git a/components/navbar/ScreenplaySearch.tsx b/components/navbar/ScreenplaySearch.tsx
index 0d2fa15..060ad16 100644
--- a/components/navbar/ScreenplaySearch.tsx
+++ b/components/navbar/ScreenplaySearch.tsx
@@ -3,6 +3,7 @@
import { useContext, useRef, useEffect, useCallback, useState } from "react";
import { useTranslations } from "next-intl";
import { ProjectContext } from "@src/context/ProjectContext";
+import { useIsPhone } from "@src/lib/utils/hooks";
import { ScreenplayElement } from "@src/lib/utils/enums";
import { scrollToMatch, SearchMatch } from "@src/lib/screenplay/extensions/search-highlight-extension";
import { Search, ChevronUp, ChevronDown, X, Replace, ReplaceAll } from "lucide-react";
@@ -50,6 +51,7 @@ const ScreenplaySearch = () => {
searchMatches,
} = useContext(ProjectContext);
+ const isPhone = useIsPhone();
const [isOpen, setIsOpen] = useState(false);
const [replaceValue, setReplaceValue] = useState("");
const debounceRef = useRef | null>(null);
@@ -226,8 +228,10 @@ const ScreenplaySearch = () => {
return (
-
- {isOpen && (
+
+ {/* On phone the input lives in the panel below (see dropdown) so the
+ expanding field doesn't crush the navbar's format dropdown. */}
+ {isOpen && !isPhone && (
{
)}
@@ -247,6 +251,17 @@ const ScreenplaySearch = () => {
{isOpen && (
+ {isPhone && (
+
+ )}
+
{/* Navigation section */}
+ typeof window !== "undefined" && window.matchMedia("(max-width: 767px)").matches;
export type PanelType = "screenplay" | "board" | "statistics" | "title" | "draft" | "document" | "outline";
export type SplitSide = "primary" | "secondary";
@@ -63,8 +67,33 @@ export const ViewProvider = ({ children }: { children: ReactNode }) => {
const [focusedSide, setFocusedSideState] = useState("primary");
const [isEndlessScroll, setIsEndlessScroll] = useState(false);
const [showComments, setShowComments] = useState(true);
- const [leftSidebarOpen, setLeftSidebarOpen] = useState(false);
- const [rightSidebarOpen, setRightSidebarOpen] = useState(false);
+ const [leftSidebarOpen, setLeftSidebarOpenState] = useState(false);
+ const [rightSidebarOpen, setRightSidebarOpenState] = useState(false);
+
+ // Mirror the live open-state in refs so the wrapped setters can resolve a
+ // functional update and enforce mutual exclusion without stale closures.
+ const leftOpenRef = useRef(leftSidebarOpen);
+ const rightOpenRef = useRef(rightSidebarOpen);
+ useEffect(() => {
+ leftOpenRef.current = leftSidebarOpen;
+ }, [leftSidebarOpen]);
+ useEffect(() => {
+ rightOpenRef.current = rightSidebarOpen;
+ }, [rightSidebarOpen]);
+
+ // On phone the sidebars are overlay drawers that would overlap each other and
+ // the editor, so only one may be open at a time — opening one closes the other.
+ // On desktop they're inline columns and both can stay open.
+ const setLeftSidebarOpen = useCallback((value: boolean | ((prev: boolean) => boolean)) => {
+ const next = typeof value === "function" ? value(leftOpenRef.current) : value;
+ setLeftSidebarOpenState(next);
+ if (next && isPhoneViewport()) setRightSidebarOpenState(false);
+ }, []);
+ const setRightSidebarOpen = useCallback((value: boolean | ((prev: boolean) => boolean)) => {
+ const next = typeof value === "function" ? value(rightOpenRef.current) : value;
+ setRightSidebarOpenState(next);
+ if (next && isPhoneViewport()) setLeftSidebarOpenState(false);
+ }, []);
const isSplit = secondaryPanel !== null;
@@ -264,7 +293,7 @@ export const ViewProvider = ({ children }: { children: ReactNode }) => {
setLeftSidebarOpen,
setRightSidebarOpen,
}),
- [primaryPanel, secondaryPanel, primaryDocId, secondaryDocId, splitRatio, isSplit, visiblePanels, mountedPanels, focusedSide, focusedPanel, isEndlessScroll, showComments, leftSidebarOpen, rightSidebarOpen, setPrimaryPanel, setSecondaryPanel, setFocusedSide, setFocusedPanel, setSidePanel, setSideDocument, splitWithDocument, closeDocument, swapPanels, setIsEndlessScroll, setShowComments],
+ [primaryPanel, secondaryPanel, primaryDocId, secondaryDocId, splitRatio, isSplit, visiblePanels, mountedPanels, focusedSide, focusedPanel, isEndlessScroll, showComments, leftSidebarOpen, rightSidebarOpen, setPrimaryPanel, setSecondaryPanel, setFocusedSide, setFocusedPanel, setSidePanel, setSideDocument, splitWithDocument, closeDocument, swapPanels, setIsEndlessScroll, setShowComments, setLeftSidebarOpen, setRightSidebarOpen],
);
return {children} ;
diff --git a/styles/scriptio.css b/styles/scriptio.css
index 768f88e..f55f12b 100644
--- a/styles/scriptio.css
+++ b/styles/scriptio.css
@@ -57,6 +57,13 @@
/* Prevent outline from appearing when focused on screenplay */
outline: none;
+ /* iOS text autosizing inflates the font past the fixed 16px line box,
+ clipping page numbers and the first line of each page and making the
+ text look oversized. The html/body reset doesn't reliably reach this
+ zoomed subtree, so pin autosizing off on the editor itself. */
+ -webkit-text-size-adjust: 100%;
+ text-size-adjust: 100%;
+
/* Default screenplay paragraph attributes - direct children only
Critical: block + width:100% ensures consistent sizing between empty
and non-empty nodes, preventing pagination flickering and infinite loops.
From 7e876d25a9e149bfdcdf23d1be184ec12fed1489 Mon Sep 17 00:00:00 2001
From: Hugo Bois
Date: Sat, 4 Jul 2026 12:45:04 +0200
Subject: [PATCH 2/2] adapting icons for iOS and macOS for Liquid Glass
---
.github/actions/apply-version/action.yml | 33 +++--
package-lock.json | 104 ++++++++--------
package.json | 4 +-
.../AppIcon.appiconset/AppIcon-20x20@1x.png | Bin 945 -> 0 bytes
.../AppIcon.appiconset/AppIcon-20x20@2x-1.png | Bin 2566 -> 0 bytes
.../AppIcon.appiconset/AppIcon-20x20@2x.png | Bin 2566 -> 0 bytes
.../AppIcon.appiconset/AppIcon-20x20@3x.png | Bin 4630 -> 0 bytes
.../AppIcon.appiconset/AppIcon-29x29@1x.png | Bin 1639 -> 0 bytes
.../AppIcon.appiconset/AppIcon-29x29@2x-1.png | Bin 4473 -> 0 bytes
.../AppIcon.appiconset/AppIcon-29x29@2x.png | Bin 4473 -> 0 bytes
.../AppIcon.appiconset/AppIcon-29x29@3x.png | Bin 7827 -> 0 bytes
.../AppIcon.appiconset/AppIcon-40x40@1x.png | Bin 2566 -> 0 bytes
.../AppIcon.appiconset/AppIcon-40x40@2x-1.png | Bin 6842 -> 0 bytes
.../AppIcon.appiconset/AppIcon-40x40@2x.png | Bin 6842 -> 0 bytes
.../AppIcon.appiconset/AppIcon-40x40@3x.png | Bin 11955 -> 0 bytes
.../AppIcon.appiconset/AppIcon-512@2x.png | Bin 235351 -> 0 bytes
.../AppIcon.appiconset/AppIcon-60x60@2x.png | Bin 11955 -> 0 bytes
.../AppIcon.appiconset/AppIcon-60x60@3x.png | Bin 19927 -> 0 bytes
.../AppIcon.appiconset/AppIcon-76x76@1x.png | Bin 6436 -> 0 bytes
.../AppIcon.appiconset/AppIcon-76x76@2x.png | Bin 16023 -> 0 bytes
.../AppIcon-83.5x83.5@2x.png | Bin 18032 -> 0 bytes
.../AppIcon.appiconset/Contents.json | 116 ------------------
.../icon.icon/Assets/scriptio_icon.png | Bin 0 -> 616008 bytes
.../Assets/scriptio_staging_icon.png | Bin 0 -> 751671 bytes
.../apple/Assets.xcassets/icon.icon/icon.json | 51 ++++++++
.../apple/Scriptio.xcodeproj/project.pbxproj | 4 +-
src-tauri/icons-staging/icon.icns | Bin 653058 -> 68732 bytes
.../icon.icon/Assets/scriptio_icon.png | Bin 0 -> 616008 bytes
.../Assets/scriptio_staging_icon.png | Bin 0 -> 751671 bytes
src-tauri/icons-staging/icon.icon/icon.json | 58 +++++++++
.../icons-staging/ios/AppIcon-20x20@1x.png | Bin 1090 -> 0 bytes
.../icons-staging/ios/AppIcon-20x20@2x-1.png | Bin 3190 -> 0 bytes
.../icons-staging/ios/AppIcon-20x20@2x.png | Bin 3190 -> 0 bytes
.../icons-staging/ios/AppIcon-20x20@3x.png | Bin 5785 -> 0 bytes
.../icons-staging/ios/AppIcon-29x29@1x.png | Bin 1952 -> 0 bytes
.../icons-staging/ios/AppIcon-29x29@2x-1.png | Bin 5519 -> 0 bytes
.../icons-staging/ios/AppIcon-29x29@2x.png | Bin 5519 -> 0 bytes
.../icons-staging/ios/AppIcon-29x29@3x.png | Bin 9669 -> 0 bytes
.../icons-staging/ios/AppIcon-40x40@1x.png | Bin 3190 -> 0 bytes
.../icons-staging/ios/AppIcon-40x40@2x-1.png | Bin 8593 -> 0 bytes
.../icons-staging/ios/AppIcon-40x40@2x.png | Bin 8593 -> 0 bytes
.../icons-staging/ios/AppIcon-40x40@3x.png | Bin 14992 -> 0 bytes
.../icons-staging/ios/AppIcon-512@2x.png | Bin 301963 -> 0 bytes
.../icons-staging/ios/AppIcon-60x60@2x.png | Bin 14992 -> 0 bytes
.../icons-staging/ios/AppIcon-60x60@3x.png | Bin 25721 -> 0 bytes
.../icons-staging/ios/AppIcon-76x76@1x.png | Bin 8029 -> 0 bytes
.../icons-staging/ios/AppIcon-76x76@2x.png | Bin 20429 -> 0 bytes
.../ios/AppIcon-83.5x83.5@2x.png | Bin 23186 -> 0 bytes
src-tauri/icons/icon.icns | Bin 436294 -> 57253 bytes
.../icons/icon.icon/Assets/scriptio_icon.png | Bin 0 -> 616008 bytes
.../Assets/scriptio_staging_icon.png | Bin 0 -> 751671 bytes
src-tauri/icons/icon.icon/icon.json | 51 ++++++++
src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 945 -> 0 bytes
src-tauri/icons/ios/AppIcon-20x20@2x-1.png | Bin 2566 -> 0 bytes
src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 2566 -> 0 bytes
src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 4630 -> 0 bytes
src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 1639 -> 0 bytes
src-tauri/icons/ios/AppIcon-29x29@2x-1.png | Bin 4473 -> 0 bytes
src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 4473 -> 0 bytes
src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 7827 -> 0 bytes
src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 2566 -> 0 bytes
src-tauri/icons/ios/AppIcon-40x40@2x-1.png | Bin 6842 -> 0 bytes
src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 6842 -> 0 bytes
src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 11955 -> 0 bytes
src-tauri/icons/ios/AppIcon-512@2x.png | Bin 235351 -> 0 bytes
src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 11955 -> 0 bytes
src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 19927 -> 0 bytes
src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 6436 -> 0 bytes
src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 16023 -> 0 bytes
src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png | Bin 18032 -> 0 bytes
src-tauri/tauri.conf.json | 2 +-
71 files changed, 237 insertions(+), 186 deletions(-)
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png
delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json
create mode 100644 src-tauri/gen/apple/Assets.xcassets/icon.icon/Assets/scriptio_icon.png
create mode 100644 src-tauri/gen/apple/Assets.xcassets/icon.icon/Assets/scriptio_staging_icon.png
create mode 100644 src-tauri/gen/apple/Assets.xcassets/icon.icon/icon.json
create mode 100644 src-tauri/icons-staging/icon.icon/Assets/scriptio_icon.png
create mode 100644 src-tauri/icons-staging/icon.icon/Assets/scriptio_staging_icon.png
create mode 100644 src-tauri/icons-staging/icon.icon/icon.json
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-20x20@1x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-20x20@2x-1.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-20x20@2x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-20x20@3x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-29x29@1x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-29x29@2x-1.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-29x29@2x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-29x29@3x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-40x40@1x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-40x40@2x-1.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-40x40@2x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-40x40@3x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-512@2x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-60x60@2x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-60x60@3x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-76x76@1x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-76x76@2x.png
delete mode 100644 src-tauri/icons-staging/ios/AppIcon-83.5x83.5@2x.png
create mode 100644 src-tauri/icons/icon.icon/Assets/scriptio_icon.png
create mode 100644 src-tauri/icons/icon.icon/Assets/scriptio_staging_icon.png
create mode 100644 src-tauri/icons/icon.icon/icon.json
delete mode 100644 src-tauri/icons/ios/AppIcon-20x20@1x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-20x20@2x-1.png
delete mode 100644 src-tauri/icons/ios/AppIcon-20x20@2x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-20x20@3x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-29x29@1x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-29x29@2x-1.png
delete mode 100644 src-tauri/icons/ios/AppIcon-29x29@2x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-29x29@3x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-40x40@1x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-40x40@2x-1.png
delete mode 100644 src-tauri/icons/ios/AppIcon-40x40@2x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-40x40@3x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-512@2x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-60x60@2x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-60x60@3x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-76x76@1x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-76x76@2x.png
delete mode 100644 src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png
diff --git a/.github/actions/apply-version/action.yml b/.github/actions/apply-version/action.yml
index eb4bfe4..a906863 100644
--- a/.github/actions/apply-version/action.yml
+++ b/.github/actions/apply-version/action.yml
@@ -115,6 +115,13 @@ runs:
src-tauri/icons-staging/icon.png src-tauri/icons-staging/icon.icns src-tauri/icons-staging/icon.ico \
src-tauri/icons-staging/Square*.png src-tauri/icons-staging/StoreLogo.png \
src-tauri/icons/
+ # icon.icon is the Icon Composer (Liquid Glass) source shared by
+ # macOS and iOS: the macOS bundler compiles it to Assets.car via
+ # actool (icon.icns stays as the pre-macOS-26 fallback), and the
+ # iOS step below copies it into the asset catalog. It's a directory,
+ # so replace it wholesale rather than cp-ing into the existing one.
+ rm -rf src-tauri/icons/icon.icon
+ cp -r src-tauri/icons-staging/icon.icon src-tauri/icons/icon.icon
echo "Using staging icon set (src-tauri/icons-staging)"
else
echo "Using release icon set (src-tauri/icons)"
@@ -177,16 +184,16 @@ runs:
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName ${DISPLAY_NAME}" "$plist" || true
done
- # src-tauri/icons/ios (or icons-staging/ios) is never read by the
- # Xcode build directly — Assets.xcassets in gen/apple is a separate,
- # committed copy that only xcodegen/xcodebuild actually see. Keep
- # them in sync here so the right icon set (and any future icon
- # regeneration) reaches the shipped binary.
- IOS_ICON_SRC="src-tauri/icons/ios"
- if [[ "$INPUT_STAGING" == "true" && -d "src-tauri/icons-staging/ios" ]]; then
- IOS_ICON_SRC="src-tauri/icons-staging/ios"
- fi
- cp "$IOS_ICON_SRC"/*.png src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/
- echo "Synced iOS app icons from $IOS_ICON_SRC"
-
- echo "Applied iOS settings (display: '$DISPLAY_NAME', icons: $IOS_ICON_SRC)"
+ # gen/apple/Assets.xcassets is a separate, committed copy that only
+ # xcodebuild sees — it holds the committed (release) icon.icon. The
+ # "Select app icon set" step above already swapped src-tauri/icons/icon.icon
+ # to the staging Icon Composer source when staging, so sync whatever is
+ # there into the catalog. xcodebuild's actool compiles it into the app's
+ # Assets.car (Liquid Glass on iOS 26) and auto-generates the PNG raster
+ # fallbacks for older iOS. ASSETCATALOG_COMPILER_APPICON_NAME=icon
+ # (project.pbxproj) selects this entry.
+ rm -rf src-tauri/gen/apple/Assets.xcassets/icon.icon
+ cp -r src-tauri/icons/icon.icon src-tauri/gen/apple/Assets.xcassets/icon.icon
+ echo "Synced iOS app icon (icon.icon) into Assets.xcassets"
+
+ echo "Applied iOS settings (display: '$DISPLAY_NAME')"
diff --git a/package-lock.json b/package-lock.json
index cdb3f4e..5351a12 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
"@prisma/adapter-pg": "^7.8.0",
"@prisma/client": "^7.7.0",
"@svgr/core": "^8.1.0",
- "@tauri-apps/api": "2.10.1",
+ "@tauri-apps/api": "2.11.1",
"@tauri-apps/plugin-clipboard-manager": "^2.3.2",
"@tauri-apps/plugin-dialog": "2.6.0",
"@tauri-apps/plugin-fs": "2.4.5",
@@ -74,7 +74,7 @@
"@choochmeque/tauri-windows-bundle": "^0.1.14",
"@cloudflare/workers-types": "^4.20251216.0",
"@svgr/webpack": "^8.1.0",
- "@tauri-apps/cli": "^2.10.0",
+ "@tauri-apps/cli": "^2.11.1",
"@types/file-saver": "^2.0.5",
"@types/hogan.js": "^3.0.1",
"@types/node": "20.11.0",
@@ -7780,9 +7780,9 @@
}
},
"node_modules/@tauri-apps/api": {
- "version": "2.10.1",
- "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz",
- "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.1.tgz",
+ "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==",
"license": "Apache-2.0 OR MIT",
"funding": {
"type": "opencollective",
@@ -7790,9 +7790,9 @@
}
},
"node_modules/@tauri-apps/cli": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.0.tgz",
- "integrity": "sha512-ZwT0T+7bw4+DPCSWzmviwq5XbXlM0cNoleDKOYPFYqcZqeKY31KlpoMW/MOON/tOFBPgi31a2v3w9gliqwL2+Q==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.11.1.tgz",
+ "integrity": "sha512-rpEbaJ/HzNb6fwsquwoAbq29/Vt4gADhS423A8fdkwL4edJ0wZmoB8ar7O6JPDL834MUKOCm/rrJ7c9oAaEaYQ==",
"dev": true,
"license": "Apache-2.0 OR MIT",
"bin": {
@@ -7806,23 +7806,23 @@
"url": "https://opencollective.com/tauri"
},
"optionalDependencies": {
- "@tauri-apps/cli-darwin-arm64": "2.10.0",
- "@tauri-apps/cli-darwin-x64": "2.10.0",
- "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.0",
- "@tauri-apps/cli-linux-arm64-gnu": "2.10.0",
- "@tauri-apps/cli-linux-arm64-musl": "2.10.0",
- "@tauri-apps/cli-linux-riscv64-gnu": "2.10.0",
- "@tauri-apps/cli-linux-x64-gnu": "2.10.0",
- "@tauri-apps/cli-linux-x64-musl": "2.10.0",
- "@tauri-apps/cli-win32-arm64-msvc": "2.10.0",
- "@tauri-apps/cli-win32-ia32-msvc": "2.10.0",
- "@tauri-apps/cli-win32-x64-msvc": "2.10.0"
+ "@tauri-apps/cli-darwin-arm64": "2.11.1",
+ "@tauri-apps/cli-darwin-x64": "2.11.1",
+ "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.1",
+ "@tauri-apps/cli-linux-arm64-gnu": "2.11.1",
+ "@tauri-apps/cli-linux-arm64-musl": "2.11.1",
+ "@tauri-apps/cli-linux-riscv64-gnu": "2.11.1",
+ "@tauri-apps/cli-linux-x64-gnu": "2.11.1",
+ "@tauri-apps/cli-linux-x64-musl": "2.11.1",
+ "@tauri-apps/cli-win32-arm64-msvc": "2.11.1",
+ "@tauri-apps/cli-win32-ia32-msvc": "2.11.1",
+ "@tauri-apps/cli-win32-x64-msvc": "2.11.1"
}
},
"node_modules/@tauri-apps/cli-darwin-arm64": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.0.tgz",
- "integrity": "sha512-avqHD4HRjrMamE/7R/kzJPcAJnZs0IIS+1nkDP5b+TNBn3py7N2aIo9LIpy+VQq0AkN8G5dDpZtOOBkmWt/zjA==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.11.1.tgz",
+ "integrity": "sha512-6eEKMBXsQPCuM1EmvrjT2+aBuxWQuFdKdW8pzNuNQtpq45nEEpBlD5gr8pUeAyOU1DQKlkFaEc/MPBxb/Pfjtg==",
"cpu": [
"arm64"
],
@@ -7837,9 +7837,9 @@
}
},
"node_modules/@tauri-apps/cli-darwin-x64": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.0.tgz",
- "integrity": "sha512-keDmlvJRStzVFjZTd0xYkBONLtgBC9eMTpmXnBXzsHuawV2q9PvDo2x6D5mhuoMVrJ9QWjgaPKBBCFks4dK71Q==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.11.1.tgz",
+ "integrity": "sha512-LQUO7exfRWjWALNhetph5guWpMeHphRpokOLk0OIbTTExaNwJNFu3I4vb+CCM/4G/QGoZe/5XikZOJdNEFP1ig==",
"cpu": [
"x64"
],
@@ -7854,9 +7854,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-arm-gnueabihf": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.0.tgz",
- "integrity": "sha512-e5u0VfLZsMAC9iHaOEANumgl6lfnJx0Dtjkd8IJpysZ8jp0tJ6wrIkto2OzQgzcYyRCKgX72aKE0PFgZputA8g==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.11.1.tgz",
+ "integrity": "sha512-5i/awiBCRRhOUG8yjn0fMHXIWD5Ez8eEk5LtvOxyQrKuJkRaZDvnbIjZbE183blAwkoA4xN3aO/prJiqscl02Q==",
"cpu": [
"arm"
],
@@ -7871,9 +7871,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-arm64-gnu": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.0.tgz",
- "integrity": "sha512-YrYYk2dfmBs5m+OIMCrb+JH/oo+4FtlpcrTCgiFYc7vcs6m3QDd1TTyWu0u01ewsCtK2kOdluhr/zKku+KP7HA==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.11.1.tgz",
+ "integrity": "sha512-9LrwDw3S9Fygtw/Q6WDhOP+3svJRGAsejeE+GKrc0eO1ThMVhwi2LL6hw4dlKw93IfS7VY1G19sWGxJ/NcU4nA==",
"cpu": [
"arm64"
],
@@ -7888,9 +7888,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-arm64-musl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.0.tgz",
- "integrity": "sha512-GUoPdVJmrJRIXFfW3Rkt+eGK9ygOdyISACZfC/bCSfOnGt8kNdQIQr5WRH9QUaTVFIwxMlQyV3m+yXYP+xhSVA==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.11.1.tgz",
+ "integrity": "sha512-mNA5dbbqPqDUdTIwdUYYuhO2GvIe9UnB2r0VU2njxBOS3Opbx4gKNC5yP0Iu4rYmEmqdlwry9VzGZQ3wq9dyFg==",
"cpu": [
"arm64"
],
@@ -7905,9 +7905,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-riscv64-gnu": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.0.tgz",
- "integrity": "sha512-JO7s3TlSxshwsoKNCDkyvsx5gw2QAs/Y2GbR5UE2d5kkU138ATKoPOtxn8G1fFT1aDW4LH0rYAAfBpGkDyJJnw==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.11.1.tgz",
+ "integrity": "sha512-fZj3Gwq+6fUs305T5WQiD5iSGJw+j/4w/HGmk4sHDAcy+rp9zU5eaxB7nOyz5/I/nkNAuKPqfp6uIbiUBXkBCw==",
"cpu": [
"riscv64"
],
@@ -7922,9 +7922,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-x64-gnu": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.0.tgz",
- "integrity": "sha512-Uvh4SUUp4A6DVRSMWjelww0GnZI3PlVy7VS+DRF5napKuIehVjGl9XD0uKoCoxwAQBLctvipyEK+pDXpJeoHng==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.11.1.tgz",
+ "integrity": "sha512-XFxGxOvHM7jjeD6ozCKdGfhzJ7lERYDGZl1/Kb4fsvchaJsfLJ981TlyTG8Qy/gFq+f5GitH3bfrX9JAkjPEyw==",
"cpu": [
"x64"
],
@@ -7939,9 +7939,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-x64-musl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.0.tgz",
- "integrity": "sha512-AP0KRK6bJuTpQ8kMNWvhIpKUkQJfcPFeba7QshOQZjJ8wOS6emwTN4K5g/d3AbCMo0RRdnZWwu67MlmtJyxC1Q==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.11.1.tgz",
+ "integrity": "sha512-d5C2/Zm+68v7R9wTuTCjRQEVrWjcdMkJBZ1+rXse+QdMMlTB9+u9PDNDLw9PQflWxYLaYZ7tjxxL9Nb9II6PbA==",
"cpu": [
"x64"
],
@@ -7956,9 +7956,9 @@
}
},
"node_modules/@tauri-apps/cli-win32-arm64-msvc": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.0.tgz",
- "integrity": "sha512-97DXVU3dJystrq7W41IX+82JEorLNY+3+ECYxvXWqkq7DBN6FsA08x/EFGE8N/b0LTOui9X2dvpGGoeZKKV08g==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.11.1.tgz",
+ "integrity": "sha512-YdeVWFAR1pTXzUU6NLstPq4G6OLxuDrXCXEBdmBH+5EZIDXUx0D2kJlz3+YjpazkKvAzYpgziTsyRagls0OfRQ==",
"cpu": [
"arm64"
],
@@ -7973,9 +7973,9 @@
}
},
"node_modules/@tauri-apps/cli-win32-ia32-msvc": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.0.tgz",
- "integrity": "sha512-EHyQ1iwrWy1CwMalEm9z2a6L5isQ121pe7FcA2xe4VWMJp+GHSDDGvbTv/OPdkt2Lyr7DAZBpZHM6nvlHXEc4A==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.11.1.tgz",
+ "integrity": "sha512-VBGkuH0eB9K9LLSMv361Gzr5Ou72sCS4+ztpmkWEQ+wd/amhcYOsf3X6qn1RJZDzIhiOYHJEOysZUC3baD01rA==",
"cpu": [
"ia32"
],
@@ -7990,9 +7990,9 @@
}
},
"node_modules/@tauri-apps/cli-win32-x64-msvc": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.0.tgz",
- "integrity": "sha512-NTpyQxkpzGmU6ceWBTY2xRIEaS0ZLbVx1HE1zTA3TY/pV3+cPoPPOs+7YScr4IMzXMtOw7tLw5LEXo5oIG3qaQ==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.11.1.tgz",
+ "integrity": "sha512-b3ORhIAKgp9ZYY+zBt7b7r0kLU2kjvyGF0+MS2SBym3emsweGPybEqocJcmtMuxyBhkOKHP4CiuEJEDuAlTx6A==",
"cpu": [
"x64"
],
diff --git a/package.json b/package.json
index bb3ecd2..a8d7a74 100644
--- a/package.json
+++ b/package.json
@@ -45,7 +45,7 @@
"@prisma/adapter-pg": "^7.8.0",
"@prisma/client": "^7.7.0",
"@svgr/core": "^8.1.0",
- "@tauri-apps/api": "2.10.1",
+ "@tauri-apps/api": "2.11.1",
"@tauri-apps/plugin-clipboard-manager": "^2.3.2",
"@tauri-apps/plugin-dialog": "2.6.0",
"@tauri-apps/plugin-fs": "2.4.5",
@@ -103,7 +103,7 @@
"@choochmeque/tauri-windows-bundle": "^0.1.14",
"@cloudflare/workers-types": "^4.20251216.0",
"@svgr/webpack": "^8.1.0",
- "@tauri-apps/cli": "^2.10.0",
+ "@tauri-apps/cli": "^2.11.1",
"@types/file-saver": "^2.0.5",
"@types/hogan.js": "^3.0.1",
"@types/node": "20.11.0",
diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png
deleted file mode 100644
index 6b51776df5baa968faeb4d6680b26e4c69300405..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 945
zcmV;i15W&jP)KWyq9{d+xD`aL!Zx{#NNN*p+O?2N32n5XjT99aSR!rG
zy5S}+m=RHs{SZ-0A&IO&@#?&b^L>6V-#d!~!2!KLp5fu)Kf?e35D^g-MM1=LI_-A58HQmP2L3RbrdgJCyWQz@
zx)zLxP;)||5JgcmO;Z%bvMkT@7K^35z1?6iuq;ba6sZyn1`)AbE-Q)x<#HJj*Vos{
zHN!CDGMCGd@?T$HvMkTc%#e0yn%>yh_zyXg$q+z_qC%k%{%e<)m+^Q!pU)Hb
zP$VK1BTf{zk;r)l~ox1VNVNy}dm;
zl}gF7Ow)9wQt9jKBN76DMx!CgLqkIVKrlNxI!q>$BuP(CPpz%3;Pd%tnpUY)0O0j{
z338=UA>s>yAc|rxmm|_lO-&_}$x^A**48#VI|~kngRlhvj^kumM#M^`QYw`Q)%*MV
zqoX6g-~a2^uhG#_M4X?W2LPAL1tyb;WRlZpG{)ocYPE`p)oQg?qF5|?z258V>xYL2
zLcwe{gV}7RX_~x2XJ==PXCx9S6bd!ve|~;;c6JbPaBz@FU^bh<>2#`8DvF}4Rx2Vd
zE-uyv%Wk)a!{N`*Pek0>+IoI|mL!Sid5WSqj&nF1w9RH?S(afK(&yUR+S1Yz$8i8~
zb#*m8Jspq73xz_ZQqk#j*=%-fY>Z);y1KgF-d;!~5*m$$Oiw10Ax*x%zHV=CudJ->
z?(QPu=H_NTpAQCukB^T%Jv|gfX|>u!A_0il-`~&kJi{=8AmCqicXt=sB9X}9
z;UU8?R;$(Jav>rO0HP=YKtn^r+1Z)L;~|?^v$wZ5o6Qyuhi`6fj*pL*mzNbq2?PQF
z@Xun1qNvyFd7fukwxy+IVPPQ}jh>&MXS3NrARq{WN~Kb()m>d(7K=p`MY32xMgkH2
ze!o_$ZEkMnIIgw;L<^Q>)oQiDV5qOJ_xt^|6d)oKN0KDF-QL*PXfzrP1_RIY8jVJ;
z*BgySyc5QrPZC2^OI3J0p3k2@x3{-%*|J5i*AoJW5}Ky%b~}L(MNt$*Bt`A$=pYe-4?xR?
z4I6rTdZb{YC~i4a_rbKl}bfC22~8hw70iojK{~v|MM7<{>zsy8jVKkE1+Jv
za)lV@@puG5@Or(1APf%=_xJY?3=ELBgv>8rzRa69&kvj9xNqOSVT^zL_~CZDDKMX=
z>D=7h>({T-G%W}M?8X>3H#g_!=X*RJ$X=qQySw}0!-p=HORZMVpFcl4I~%wK3ls{)
z*x1;D1q*t6duf^$MUi0`Q4}*WGK!0fpFe-jaU23OTU%Qd3I(Yduyo_bjX(}W1&EoL
zn5d|zP%4$AX~f6J-?(u@nz|Dc6BuKM!$HaqAruxCwtf5d7cX9%IdkUHrAr8+wP?{I
zX|;fJw{PDD4*(cUtgNgAT_hF=p_?~v`qd0<&d$yTZDz9>I@+sOuXgO%fib2jit6m_
zeEISvMNx!gQ501wRcvgmG{r!m8gXfz6fAf-emllgo;givB);>C*>`}_NE-MZD<+UoUsXUv!p5fS0_dOJEgnwpvl
z3JOwEQV>EPKYna%Z0zsv2bUZU2P!EkVOch?`$MMW=jZ?W^$SlPu7qk3XeNZ-$B!RZ
zR#t|Ghl2*CQc3#V{{8#4S}hpOvTR973ChgORH;;cR7<6#q~zVZcSJkDOC##@`J{#9
za=B`2YvpqJmMvT0Nq2X5e0)4jKs%a<>I`t*rF2ExNb
zLO@DNN^fs3#@OTWY}&L5@*k>SrBYd~R+%V@fv6NkK@=H=@%en6ot;jnbNTY+nVFf%
z$;q>4&sHcDkP6aHLen&SwQt`(i^UQh9gPsWapOjNd%M@`MF?Sx;kXk;5v8W4YPDKv
z?Smql&9-LE8c;{xhJ}UYf!K&R7z2PCHw5)wey&Ye3ELUOrWI^U?(>ZMDU?%uuo&Ye4>qoV}UY
z`0!!)ysoZ}%mp9{g+i;<78Deq>gsB(R?D(1ynwjo=jY?eUcY+vYWM)KiT853++wlp
z*|X=vhYxtNQNMlrcJboHU`KCnZ+d$A)~#ESq?@uVtJP|&tEekAWyDph)VIuMI7w%KeKE?j_hX=&-fg9mTjx`iae6UT9CwfgGS
ztH|YY84L!V=fNoWHJMD{F3Hm4$B!Ef2J|qZs3&q9OvUR;ziQ&&$ihF#5E#w6H9z*XyOj
zC6qsD)Id9t-@ku@mqePHn%1seOV$e)E`)@KqJsR;>-8+lwzRZhGIK>oM~8=p6Q?0}
zo;`a8ktP!e3|7+C0dFzJR;%^p%a<7A@$vD5goNhiW{h!TVR_nBB)22_K4yZtTR#p~tK0J9&NG%}QS6*HYE`I&`b>6&r
zFbWnI7stlN78e&kc<>-2BSWcFTCG+Bhe!!Jolb<1Uat=g4V7YBES8p*7SgAP05*J^
zmzM|0SW!_C7ZRYdyLWHv)~!mVl3^I9(@EeE2^Ge;zP_HO>Bz{)
z(9lrnNUYQ8ii(OF8ylTY=fJ=KRGQR++}zw3FJ6?Dl|iM>nl&pvK0YQUCM6|h@#4ii
z&&y=8`uchTgfXV@;gD}t
zRaF#4g@=dFoH{sfRpr(
z+akfX+wD*QCX>l%G-|b47(=Bem7l;Xg+igxXpBaq$z*~y4A-^5^ZP%l2?229a5x;L
zrKRuRzt`z>9LHgd$HvAcCMKY?{@TNC~A0kcyMsgY&M@ie}2)T
zMLwVJFP!1O{rTecdSPa$t*t$D=+NNcph~4usZ?-tAx#ub-oc>?#>dA;M@L6TM|C>g
zu3fv}NF}QL1y3Plj2apmvfJ&+$;ogoDV0i&<3d70c%J8ZJ|rZB<2a}mnM{_PoNTw-
zN$myx5iljyel`h$Kc5QrPZC2^OI3J0p3k2@x3{-%*|J5i*AoJW5}Ky%b~}L(MNt$*Bt`A$=pYe-4?xR?
z4I6rTdZb{YC~i4a_rbKl}bfC22~8hw70iojK{~v|MM7<{>zsy8jVKkE1+Jv
za)lV@@puG5@Or(1APf%=_xJY?3=ELBgv>8rzRa69&kvj9xNqOSVT^zL_~CZDDKMX=
z>D=7h>({T-G%W}M?8X>3H#g_!=X*RJ$X=qQySw}0!-p=HORZMVpFcl4I~%wK3ls{)
z*x1;D1q*t6duf^$MUi0`Q4}*WGK!0fpFe-jaU23OTU%Qd3I(Yduyo_bjX(}W1&EoL
zn5d|zP%4$AX~f6J-?(u@nz|Dc6BuKM!$HaqAruxCwtf5d7cX9%IdkUHrAr8+wP?{I
zX|;fJw{PDD4*(cUtgNgAT_hF=p_?~v`qd0<&d$yTZDz9>I@+sOuXgO%fib2jit6m_
zeEISvMNx!gQ501wRcvgmG{r!m8gXfz6fAf-emllgo;givB);>C*>`}_NE-MZD<+UoUsXUv!p5fS0_dOJEgnwpvl
z3JOwEQV>EPKYna%Z0zsv2bUZU2P!EkVOch?`$MMW=jZ?W^$SlPu7qk3XeNZ-$B!RZ
zR#t|Ghl2*CQc3#V{{8#4S}hpOvTR973ChgORH;;cR7<6#q~zVZcSJkDOC##@`J{#9
za=B`2YvpqJmMvT0Nq2X5e0)4jKs%a<>I`t*rF2ExNb
zLO@DNN^fs3#@OTWY}&L5@*k>SrBYd~R+%V@fv6NkK@=H=@%en6ot;jnbNTY+nVFf%
z$;q>4&sHcDkP6aHLen&SwQt`(i^UQh9gPsWapOjNd%M@`MF?Sx;kXk;5v8W4YPDKv
z?Smql&9-LE8c;{xhJ}UYf!K&R7z2PCHw5)wey&Ye3ELUOrWI^U?(>ZMDU?%uuo&Ye4>qoV}UY
z`0!!)ysoZ}%mp9{g+i;<78Deq>gsB(R?D(1ynwjo=jY?eUcY+vYWM)KiT853++wlp
z*|X=vhYxtNQNMlrcJboHU`KCnZ+d$A)~#ESq?@uVtJP|&tEekAWyDph)VIuMI7w%KeKE?j_hX=&-fg9mTjx`iae6UT9CwfgGS
ztH|YY84L!V=fNoWHJMD{F3Hm4$B!Ef2J|qZs3&q9OvUR;ziQ&&$ihF#5E#w6H9z*XyOj
zC6qsD)Id9t-@ku@mqePHn%1seOV$e)E`)@KqJsR;>-8+lwzRZhGIK>oM~8=p6Q?0}
zo;`a8ktP!e3|7+C0dFzJR;%^p%a<7A@$vD5goNhiW{h!TVR_nBB)22_K4yZtTR#p~tK0J9&NG%}QS6*HYE`I&`b>6&r
zFbWnI7stlN78e&kc<>-2BSWcFTCG+Bhe!!Jolb<1Uat=g4V7YBES8p*7SgAP05*J^
zmzM|0SW!_C7ZRYdyLWHv)~!mVl3^I9(@EeE2^Ge;zP_HO>Bz{)
z(9lrnNUYQ8ii(OF8ylTY=fJ=KRGQR++}zw3FJ6?Dl|iM>nl&pvK0YQUCM6|h@#4ii
z&&y=8`uchTgfXV@;gD}t
zRaF#4g@=dFoH{sfRpr(
z+akfX+wD*QCX>l%G-|b47(=Bem7l;Xg+igxXpBaq$z*~y4A-^5^ZP%l2?229a5x;L
zrKRuRzt`z>9LHgd$HvAcCMKY?{@TNC~A0kcyMsgY&M@ie}2)T
zMLwVJFP!1O{rTecdSPa$t*t$D=+NNcph~4usZ?-tAx#ub-oc>?#>dA;M@L6TM|C>g
zu3fv}NF}QL1y3Plj2apmvfJ&+$;ogoDV0i&<3d70c%J8ZJ|rZB<2a}mnM{_PoNTw-
zN$myx5iljyel`h$KI;xtwJ0#C`28%1pMhLtH4%*<>Au%F4V$NWPS0W#wy>j>tJ9
zdq(yqqu=}Y$9?Xvd%xeG*X#LyJ|C~cnHuY}F!C@`QBkoN+|n@z-zxwAKxn|Tw!rv0
z6&2g0fsUp{P+p~Ni0R#tUG+vqMa5KJBorbzo6OGfk>hRHR&6b3t;gz{N?5*aZ6Zoe
zayYS8DKIewR*|n1o?)x2OCNgghrp3n7zL)wC-xKqDTY}