Next steps

This commit is contained in:
2026-02-21 13:47:12 +01:00
parent 939983a717
commit c1810aa6b7
22 changed files with 6864 additions and 355 deletions

3
.gitignore vendored
View File

@@ -13,8 +13,7 @@ dist-ssr
*.local *.local
# Editor directories and files # Editor directories and files
.vscode/* .vscode
!.vscode/extensions.json
.idea .idea
.DS_Store .DS_Store
*.suo *.suo

41
biome.json Normal file
View File

@@ -0,0 +1,41 @@
{
"$schema": "https://biomejs.dev/schemas/2.4.2/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"files": {
"includes": ["**", "!!**/dist"]
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"javascript": {
"formatter": {
"quoteStyle": "double"
}
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
},
"css": {
"parser": {
"tailwindDirectives": true
}
}
}

View File

@@ -3,11 +3,15 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
/>
<title>Tauri + Vue + Typescript App</title> <title>Tauri + Vue + Typescript App</title>
<link href="/src/styles/main.css" rel="stylesheet">
</head> </head>
<body> <body class="overflow-hidden">
<div id="app"></div> <div id="app"></div>
<script type="module" src="/src/main.ts"></script> <script type="module" src="/src/main.ts"></script>
</body> </body>

View File

@@ -5,20 +5,34 @@
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vue-tsc --noEmit && vite build", "dev:desktop": "tauri dev",
"dev:ios": "tauri ios dev",
"dev:ios:simulator": "tauri ios dev \"iPhone 16e\"",
"build": "tsc && vite build",
"build:desktop": "tauri build",
"build:ios": "tauri ios build",
"preview": "vite preview", "preview": "vite preview",
"tauri": "tauri" "tauri": "tauri",
"format": "biome format --write"
}, },
"dependencies": { "dependencies": {
"vue": "^3.5.13", "@phosphor-icons/vue": "^2.2.1",
"@tauri-apps/api": "^2", "@tauri-apps/api": "^2",
"@tauri-apps/plugin-opener": "^2" "@tauri-apps/plugin-http": "~2.5.7",
"@tauri-apps/plugin-opener": "^2",
"daisyui": "^5.5.18",
"vue": "^3.5.28",
"vue-router": "^4.6.4"
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^5.2.1", "@biomejs/biome": "2.4.2",
"typescript": "~5.6.2", "@tailwindcss/vite": "^4.2.0",
"vite": "^6.0.3", "@tauri-apps/cli": "^2",
"vue-tsc": "^2.1.10", "@vitejs/plugin-vue": "^6.0.4",
"@tauri-apps/cli": "^2" "tailwindcss": "^4.2.0",
} "typescript": "~5.9.3",
"vite": "^7.3.1",
"vue-tsc": "^2.1.10"
},
"packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a"
} }

792
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

5816
src-tauri/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -22,4 +22,5 @@ tauri = { version = "2", features = [] }
tauri-plugin-opener = "2" tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
tauri-plugin-http = "2"

View File

@@ -2,9 +2,16 @@
"$schema": "../gen/schemas/desktop-schema.json", "$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default", "identifier": "default",
"description": "Capability for the main window", "description": "Capability for the main window",
"windows": ["main"], "windows": [
"main"
],
"permissions": [ "permissions": [
"core:default", "core:default",
"opener:default" "opener:default",
{
"identifier": "http:default",
"allow": [{ "url": "https://*.deep-node.de" }],
"deny": [{ "url": "https://private.tauri.app" }]
}
] ]
} }

View File

@@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 77; objectVersion = 63;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
@@ -27,17 +27,17 @@
1CF53E7B2849E2C09FF8FB57 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; }; 1CF53E7B2849E2C09FF8FB57 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
2242402D4B45A2B0A59DAB07 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 2242402D4B45A2B0A59DAB07 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
23163FF2AFDAE1984D5A9363 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 23163FF2AFDAE1984D5A9363 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
31C9F7302B958060B2D466B9 /* lib.rs */ = {isa = PBXFileReference; path = lib.rs; sourceTree = "<group>"; }; 31C9F7302B958060B2D466B9 /* lib.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = lib.rs; sourceTree = "<group>"; };
48B11840029B955B38CC94BF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 48B11840029B955B38CC94BF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
4B1B3E3FFE8B72EB9B9E3A75 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; 4B1B3E3FFE8B72EB9B9E3A75 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
6D81329460D5AD9A968CBE94 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 6D81329460D5AD9A968CBE94 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
76E2475088F603959477B3FC /* main.rs */ = {isa = PBXFileReference; path = main.rs; sourceTree = "<group>"; }; 76E2475088F603959477B3FC /* main.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = main.rs; sourceTree = "<group>"; };
7E8680A29C703F6DE9CD3DD8 /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bindings.h; sourceTree = "<group>"; }; 7E8680A29C703F6DE9CD3DD8 /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bindings.h; sourceTree = "<group>"; };
92148B69B11E9196394DF7EB /* libapp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libapp.a; sourceTree = "<group>"; }; 92148B69B11E9196394DF7EB /* libapp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libapp.a; sourceTree = "<group>"; };
A1DD970B40E795087AEDDBE3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; A1DD970B40E795087AEDDBE3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
AB9FFC59D64DEA1B4618AC24 /* pomoday_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pomoday_iOS.entitlements; sourceTree = "<group>"; }; AB9FFC59D64DEA1B4618AC24 /* pomoday_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = pomoday_iOS.entitlements; sourceTree = "<group>"; };
BB480DDD4ED4A46AF1C2A8C7 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; BB480DDD4ED4A46AF1C2A8C7 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
C1C51021B6DCA8C9656A1279 /* pomoday_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = pomoday_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; C1C51021B6DCA8C9656A1279 /* pomoday.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = pomoday.app; sourceTree = BUILT_PRODUCTS_DIR; };
DEA87E41F94E1A51293D9837 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = SOURCE_ROOT; }; DEA87E41F94E1A51293D9837 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = SOURCE_ROOT; };
F7353A75219A409DB7E495FB /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; F7353A75219A409DB7E495FB /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */ /* End PBXFileReference section */
@@ -98,7 +98,7 @@
2DBE1B8DFF7B37AC6C1C1822 /* Products */ = { 2DBE1B8DFF7B37AC6C1C1822 /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
C1C51021B6DCA8C9656A1279 /* pomoday_iOS.app */, C1C51021B6DCA8C9656A1279 /* pomoday.app */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -170,7 +170,7 @@
packageProductDependencies = ( packageProductDependencies = (
); );
productName = pomoday_iOS; productName = pomoday_iOS;
productReference = C1C51021B6DCA8C9656A1279 /* pomoday_iOS.app */; productReference = C1C51021B6DCA8C9656A1279 /* pomoday.app */;
productType = "com.apple.product-type.application"; productType = "com.apple.product-type.application";
}; };
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
@@ -192,7 +192,6 @@
); );
mainGroup = 2995AF4E31E30F1685B35647; mainGroup = 2995AF4E31E30F1685B35647;
minimizedProjectReferenceProxies = 1; minimizedProjectReferenceProxies = 1;
preferredProjectObjectVersion = 77;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
targets = ( targets = (
@@ -234,7 +233,7 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "pnpm tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths \"${FRAMEWORK_SEARCH_PATHS:?}\" --header-search-paths \"${HEADER_SEARCH_PATHS:?}\" --gcc-preprocessor-definitions \"${GCC_PREPROCESSOR_DEFINITIONS:-}\" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}"; shellScript = "export PATH=\"$HOME/.nvm/versions/node/v20.19.5/bin:/opt/homebrew/bin:/usr/local/bin:$PATH\"\npnpm tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths \"${FRAMEWORK_SEARCH_PATHS:?}\" --header-search-paths \"${HEADER_SEARCH_PATHS:?}\" --gcc-preprocessor-definitions \"${GCC_PREPROCESSOR_DEFINITIONS:-}\" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}\n";
}; };
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
@@ -310,12 +309,11 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ARCHS = ( ARCHS = arm64;
arm64,
);
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = pomoday_iOS/pomoday_iOS.entitlements; CODE_SIGN_ENTITLEMENTS = pomoday_iOS/pomoday_iOS.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_IDENTITY = "iPhone Developer";
DEVELOPMENT_TEAM = H4J8NKV342;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64; "EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@@ -327,10 +325,22 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
"LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; "LIBRARY_SEARCH_PATHS[arch=arm64]" = (
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; "$(inherited)",
"$(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION)",
"$(SDKROOT)/usr/lib/swift",
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
);
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = (
"$(inherited)",
"$(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION)",
"$(SDKROOT)/usr/lib/swift",
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
);
PRODUCT_BUNDLE_IDENTIFIER = com.paulspenke.pomoday; PRODUCT_BUNDLE_IDENTIFIER = com.paulspenke.pomoday;
PRODUCT_NAME = pomoday; PRODUCT_NAME = "pomoday";
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64; VALID_ARCHS = arm64;
@@ -341,12 +351,11 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ARCHS = ( ARCHS = arm64;
arm64,
);
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = pomoday_iOS/pomoday_iOS.entitlements; CODE_SIGN_ENTITLEMENTS = pomoday_iOS/pomoday_iOS.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_IDENTITY = "iPhone Developer";
DEVELOPMENT_TEAM = H4J8NKV342;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64; "EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@@ -358,10 +367,22 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
"LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; "LIBRARY_SEARCH_PATHS[arch=arm64]" = (
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; "$(inherited)",
"$(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION)",
"$(SDKROOT)/usr/lib/swift",
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
);
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = (
"$(inherited)",
"$(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION)",
"$(SDKROOT)/usr/lib/swift",
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
);
PRODUCT_BUNDLE_IDENTIFIER = com.paulspenke.pomoday; PRODUCT_BUNDLE_IDENTIFIER = com.paulspenke.pomoday;
PRODUCT_NAME = pomoday; PRODUCT_NAME = "pomoday";
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64; VALID_ARCHS = arm64;

View File

@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1430" LastUpgradeVersion = "1430"
version = "1.7"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES" buildImplicitDependencies = "YES">
runPostActionsOnFailure = "NO">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForTesting = "YES" buildForTesting = "YES"
@@ -16,7 +15,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "DF2F87996592ABEDF947D52A" BlueprintIdentifier = "DF2F87996592ABEDF947D52A"
BuildableName = "pomoday_iOS.app" BuildableName = "pomoday.app"
BlueprintName = "pomoday_iOS" BlueprintName = "pomoday_iOS"
ReferencedContainer = "container:pomoday.xcodeproj"> ReferencedContainer = "container:pomoday.xcodeproj">
</BuildableReference> </BuildableReference>
@@ -27,21 +26,16 @@
buildConfiguration = "debug" buildConfiguration = "debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "NO" shouldUseLaunchSchemeArgsEnv = "NO">
onlyGenerateCoverageForSpecifiedTargets = "NO">
<MacroExpansion> <MacroExpansion>
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "DF2F87996592ABEDF947D52A" BlueprintIdentifier = "DF2F87996592ABEDF947D52A"
BuildableName = "pomoday_iOS.app" BuildableName = "pomoday.app"
BlueprintName = "pomoday_iOS" BlueprintName = "pomoday_iOS"
ReferencedContainer = "container:pomoday.xcodeproj"> ReferencedContainer = "container:pomoday.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
<EnvironmentVariables> <EnvironmentVariables>
<EnvironmentVariable <EnvironmentVariable
key = "RUST_BACKTRACE" key = "RUST_BACKTRACE"
@@ -54,6 +48,8 @@
isEnabled = "YES"> isEnabled = "YES">
</EnvironmentVariable> </EnvironmentVariable>
</EnvironmentVariables> </EnvironmentVariables>
<Testables>
</Testables>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "debug" buildConfiguration = "debug"
@@ -70,13 +66,11 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "DF2F87996592ABEDF947D52A" BlueprintIdentifier = "DF2F87996592ABEDF947D52A"
BuildableName = "pomoday_iOS.app" BuildableName = "pomoday.app"
BlueprintName = "pomoday_iOS" BlueprintName = "pomoday_iOS"
ReferencedContainer = "container:pomoday.xcodeproj"> ReferencedContainer = "container:pomoday.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
<EnvironmentVariables> <EnvironmentVariables>
<EnvironmentVariable <EnvironmentVariable
key = "RUST_BACKTRACE" key = "RUST_BACKTRACE"
@@ -101,13 +95,11 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "DF2F87996592ABEDF947D52A" BlueprintIdentifier = "DF2F87996592ABEDF947D52A"
BuildableName = "pomoday_iOS.app" BuildableName = "pomoday.app"
BlueprintName = "pomoday_iOS" BlueprintName = "pomoday_iOS"
ReferencedContainer = "container:pomoday.xcodeproj"> ReferencedContainer = "container:pomoday.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
<EnvironmentVariables> <EnvironmentVariables>
<EnvironmentVariable <EnvironmentVariable
key = "RUST_BACKTRACE" key = "RUST_BACKTRACE"

View File

@@ -41,4 +41,4 @@
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
</dict> </dict>
</plist> </plist>

View File

@@ -7,6 +7,7 @@ fn greet(name: &str) -> String {
#[cfg_attr(mobile, tauri::mobile_entry_point)] #[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() { pub fn run() {
tauri::Builder::default() tauri::Builder::default()
.plugin(tauri_plugin_http::init())
.plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_opener::init())
.invoke_handler(tauri::generate_handler![greet]) .invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!()) .run(tauri::generate_context!())

View File

@@ -1,160 +1,34 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from "vue"; import { PhCheckSquareOffset, PhListChecks, PhSliders } from '@phosphor-icons/vue';
import { invoke } from "@tauri-apps/api/core"; import { useRouter } from 'vue-router';
import { computed } from 'vue';
const greetMsg = ref(""); const router = useRouter();
const name = ref(""); const currentPath = computed(() => router.currentRoute.value.path);
async function greet() {
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
greetMsg.value = await invoke("greet", { name: name.value });
}
</script> </script>
<template> <template>
<main class="container"> <div class="overflow-hidden">
<h1>Welcome to Tauri + Vue</h1>
<div class="row"> <main class="pb-40 overflow-y-scroll h-screen">
<a href="https://vite.dev" target="_blank"> <RouterView v-slot="{ Component }">
<img src="/vite.svg" class="logo vite" alt="Vite logo" /> <Transition name="fade">
</a> <component :is="Component" />
<a href="https://tauri.app" target="_blank"> </Transition>
<img src="/tauri.svg" class="logo tauri" alt="Tauri logo" /> </RouterView>
</a> </main>
<a href="https://vuejs.org/" target="_blank"> <div class="dock dock-xl bg-neutral-400">
<img src="./assets/vue.svg" class="logo vue" alt="Vue logo" /> <RouterLink to="/create" :class="currentPath === '/create' ? 'dock-active' : ''">
</a> <PhCheckSquareOffset :size="32" />
</RouterLink>
<RouterLink to="/" :class="currentPath === '/' ? 'dock-active' : ''">
<PhListChecks :size="32" />
</RouterLink>
<RouterLink to="/settings" :class="currentPath === '/settings' ? 'dock-active' : ''">
<PhSliders :size="32" />
</RouterLink>
</div> </div>
<p>Click on the Tauri, Vite, and Vue logos to learn more.</p> </div>
<form class="row" @submit.prevent="greet">
<input id="greet-input" v-model="name" placeholder="Enter a name..." />
<button type="submit">Greet</button>
</form>
<p>{{ greetMsg }}</p>
</main>
</template> </template>
<style scoped>
.logo.vite:hover {
filter: drop-shadow(0 0 2em #747bff);
}
.logo.vue:hover {
filter: drop-shadow(0 0 2em #249b73);
}
</style>
<style>
:root {
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 24px;
font-weight: 400;
color: #0f0f0f;
background-color: #f6f6f6;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
}
.container {
margin: 0;
padding-top: 10vh;
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
}
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: 0.75s;
}
.logo.tauri:hover {
filter: drop-shadow(0 0 2em #24c8db);
}
.row {
display: flex;
justify-content: center;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
h1 {
text-align: center;
}
input,
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
color: #0f0f0f;
background-color: #ffffff;
transition: border-color 0.25s;
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
}
button {
cursor: pointer;
}
button:hover {
border-color: #396cd8;
}
button:active {
border-color: #396cd8;
background-color: #e8e8e8;
}
input,
button {
outline: none;
}
#greet-input {
margin-right: 5px;
}
@media (prefers-color-scheme: dark) {
:root {
color: #f6f6f6;
background-color: #2f2f2f;
}
a:hover {
color: #24c8db;
}
input,
button {
color: #ffffff;
background-color: #0f0f0f98;
}
button:active {
background-color: #0f0f0f69;
}
}
</style>

20
src/components/Tauri.vue Normal file
View File

@@ -0,0 +1,20 @@
<script setup lang="ts">
import { ref } from "vue";
import { invoke } from "@tauri-apps/api/core";
const greetMsg = ref("");
const name = ref("");
async function greet() {
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
greetMsg.value = await invoke("greet", { name: name.value });
}
</script>
<template>
<form class="row" @submit.prevent="greet">
<input id="greet-input" v-model="name" placeholder="Enter a name..." />
<button class="btn" type="submit">Greet</button>
</form>
<p>{{ greetMsg }}</p>
</template>

View File

@@ -1,4 +1,5 @@
import { createApp } from "vue"; import { createApp } from "vue";
import App from "./App.vue"; import App from "./App.vue";
import { router } from './router.ts';
createApp(App).mount("#app"); createApp(App).use(router).mount("#app");

16
src/router.ts Normal file
View File

@@ -0,0 +1,16 @@
import { createWebHistory, createRouter } from 'vue-router'
import ListScreen from './screens/ListScreen.vue';
import SettingsScreen from './screens/SettingsScreen.vue';
import CreateScreen from './screens/CreateScreen.vue';
const routes = [
{ path: '/', component: ListScreen },
{ path: '/settings', component: SettingsScreen },
{ path: '/create', component: CreateScreen }
]
export const router = createRouter({
history: createWebHistory(),
routes,
})

View File

@@ -0,0 +1,41 @@
<script setup lang="ts">
import { fetch } from '@tauri-apps/plugin-http';
import { router } from '../router.ts';
import { Task } from '../types.ts';
const handleSubmit = async(e: Event) => {
const data = new FormData(e.target as HTMLFormElement);
const task: Partial<Task> = Object.fromEntries(data)
const nextId = await fetch(
'https://automation.deep-node.de/webhook/d49dde4c-530d-46ee-8205-d1357563ac16',
{ method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': 'Basic cGF1bDoxMG1hYmF1MTU=', }}
).then((response) => response.json()).then((json) => json.nextId as number).catch(() => null);
if (!nextId) return;
task.id_ = nextId;
task.logs = [];
await fetch(
'https://automation.deep-node.de/webhook/e5880167-9322-4d7b-8a38-e06bae8a7734/list',
{ method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ tasks: [task] } )}
);
await router.push('/');
}
</script>
<template>
<div>
<form @submit.prevent="handleSubmit">
<fieldset class="fieldset">
<legend class="fieldset-legend">What is your name?</legend>
<input type="text" class="input" name="title" placeholder="Type here" />
</fieldset>
<button class="btn btn-primary">Submit</button>
</form>
</div>
</template>
<style scoped>
</style>

View File

@@ -0,0 +1,73 @@
<script setup lang="ts">
import { fetch } from '@tauri-apps/plugin-http';
import { computed, onMounted, ref } from 'vue';
import { Task, TaskStatus } from '../types.ts';
import { PhCaretDown, PhCaretUp, PhCheckSquare, PhDotsThree, PhPlay, PhSquare } from '@phosphor-icons/vue';
const rawTasks = ref<Task[]>([]);
onMounted(async () => {
rawTasks.value = await fetch('https://automation.deep-node.de/webhook/e5880167-9322-4d7b-8a38-e06bae8a7734/list', { method: 'GET', headers: { 'Content-Type': 'application/json'} })
.then(response => response.json())
.then((data: { tasks: Task[] }) => rawTasks.value = data.tasks ?? [])
.catch(() => []);
})
const visibleTasks = computed(() => rawTasks.value.filter(task => !task.archived))
const categorizedTasks = computed(() => visibleTasks.value.reduce((acc, task) => {
const tag = task.tag ?? 'Uncategorized';
acc[tag] = acc[tag] ?? [];
acc[tag].push(task);
return acc;
}, {} as Record<string, Task[]>))
const collapsed = ref<string[]>([]);
</script>
<template>
<div>
<div class="flex flex-col gap-4">
<div class="m-4 rounded-box border border-neutral-100 shadow-md" v-for="(tasks, category) in categorizedTasks" :key="category">
<div class="m-4 flex justify-between items-center">
<div class="badge badge-xl badge-primary">{{ category }}</div>
<button
@click="collapsed.includes(category) ? collapsed.splice(collapsed.indexOf(category), 1) : collapsed.push(category)"
class="btn btn-square btn-sm"
>
<PhCaretDown :size="20" v-if="collapsed.includes(category)" />
<PhCaretUp :size="20" v-else />
</button>
</div>
<Transition name="fade">
<ul v-if="!collapsed.includes(category)" class="list bg-base-100 rounded-box" >
<li class="list-row" v-for="task in tasks" :key="task.id">
<div class="flex items-center justify-center">
<PhSquare v-if="task.status === TaskStatus.WAIT" :size="20" />
<PhCheckSquare v-else-if="task.status === TaskStatus.DONE" :size="20" weight="fill" class="text-success" />
<PhSquare v-else-if="task.status === TaskStatus.FLAG" :size="20" weight="fill" class="text-warning" />
<PhPlay v-else-if="task.status === TaskStatus.WIP" :size="20" weight="fill" class="text-info" />
</div>
<div class="flex items-center gap-2">
<div>{{task.title}}</div>
</div>
<button class="btn btn-square btn-ghost btn-sm">
<PhDotsThree :size="24" weight="regular" />
</button>
</li>
</ul>
</Transition>
</div>
</div>
</div>
</template>
<style scoped>
</style>

View File

@@ -0,0 +1,13 @@
<script setup lang="ts">
</script>
<template>
<div>
Settings SCREEN
</div>
</template>
<style scoped>
</style>

50
src/styles/main.css Normal file
View File

@@ -0,0 +1,50 @@
@import "tailwindcss";
@plugin "daisyui";
@plugin "daisyui/theme" {
name: "emerald";
default: true;
prefersdark: true;
color-scheme: "light";
--color-base-100: oklch(100% 0 0);
--color-base-200: oklch(93% 0 0);
--color-base-300: oklch(86% 0 0);
--color-base-content: oklch(35.519% 0.032 262.988);
--color-primary: oklch(76.662% 0.135 153.45);
--color-primary-content: oklch(33.387% 0.04 162.24);
--color-secondary: oklch(61.302% 0.202 261.294);
--color-secondary-content: oklch(100% 0 0);
--color-accent: oklch(72.772% 0.149 33.2);
--color-accent-content: oklch(0% 0 0);
--color-neutral: oklch(35.519% 0.032 262.988);
--color-neutral-content: oklch(98.462% 0.001 247.838);
--color-info: oklch(72.06% 0.191 231.6);
--color-info-content: oklch(0% 0 0);
--color-success: oklch(64.8% 0.15 160);
--color-success-content: oklch(0% 0 0);
--color-warning: oklch(84.71% 0.199 83.87);
--color-warning-content: oklch(0% 0 0);
--color-error: oklch(71.76% 0.221 22.18);
--color-error-content: oklch(0% 0 0);
--radius-selector: 1rem;
--radius-field: 0.5rem;
--radius-box: 1rem;
--size-selector: 0.25rem;
--size-field: 0.25rem;
--border: 1px;
--depth: 0;
--noise: 0;
}
/* Transitions */
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.25s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}

25
src/types.ts Normal file
View File

@@ -0,0 +1,25 @@
export enum TaskStatus {
NONE,
DONE,
WIP,
WAIT,
FLAG,
}
export type Worklog = {
start: number;
end: number;
};
export type Task = {
"uuid": string,
"archived": boolean,
"tag": string,
"title": string,
"status": TaskStatus,
"lastaction": number,
"logs": Worklog[],
"dueDate": number,
"id_": number,
"id": number
}

View File

@@ -1,12 +1,14 @@
import { defineConfig } from "vite"; import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue"; import vue from "@vitejs/plugin-vue";
import tailwindcss from '@tailwindcss/vite'
// @ts-expect-error process is a nodejs global // @ts-expect-error process is a nodejs global
const host = process.env.TAURI_DEV_HOST; const host = process.env.TAURI_DEV_HOST;
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig(async () => ({ export default defineConfig(async () => ({
plugins: [vue()], plugins: [vue(), tailwindcss(),],
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
// //