ValidTopNotifyInstances;
26 | public static Logger Logger;
27 |
28 | public static bool IsDaemonRunning => ValidTopNotifyInstances.Where((p) => {
29 | try
30 | {
31 | string commandLine;
32 | ProcessCommandLine.Retrieve(p, out commandLine, ProcessCommandLine.Parameter.CommandLine);
33 | return !commandLine.ToLower().Contains("--settings");
34 | }
35 | catch { }
36 | return false;
37 | }).Any();
38 |
39 | public static bool IsGUIRunning => ValidTopNotifyInstances.Where((p) => {
40 | try
41 | {
42 | string commandLine;
43 | ProcessCommandLine.Retrieve(p, out commandLine, ProcessCommandLine.Parameter.CommandLine);
44 | return commandLine.ToLower().Contains("--settings");
45 | }
46 | catch { }
47 | return false;
48 | }).Any();
49 |
50 | [STAThread]
51 | public static void Main(string[] args)
52 | {
53 | AppDomain.CurrentDomain.UnhandledException += (object sender, UnhandledExceptionEventArgs e) =>
54 | {
55 | NotificationTester.MessageBox("Something went wrong with TopNotify", "Unfortunately, TopNotify has crashed. Details: " + e.ExceptionObject.ToString());
56 | };
57 |
58 | //By Default, The App Will Be Launched In Daemon Mode
59 | //Daemon Mode Is A Background Process That Handles Changing The Position Of Notifications
60 | //If The "--settings" Arg Is Used, Then The App Will Launch In Settings Mode
61 | //Settings Mode Shows A GUI That Can Be Used To Configure The App
62 | //These Mode Switches Ensure All Functions Of The App Use The Same Executable
63 |
64 | //Find Other Instances Of TopNotify
65 | ValidTopNotifyInstances = Process.GetProcessesByName("TopNotify").Where((p) => {
66 | try
67 | {
68 | return !p.HasExited && p.Id != Process.GetCurrentProcess().Id;
69 | }
70 | catch { }
71 | return false;
72 | });
73 |
74 | var isGUIRunning = IsGUIRunning;
75 | var isDaemonRunning = IsDaemonRunning;
76 |
77 | #if !GUI_DEBUG
78 | if (!args.Contains("--settings") && isDaemonRunning && !isGUIRunning)
79 | {
80 | //Open GUI Instead Of Daemon
81 | TrayIcon.LaunchSettingsMode(null, null);
82 | Environment.Exit(1);
83 | }
84 | else if (args.Contains("--settings") && isGUIRunning)
85 | {
86 | //Exit To Prevent Multiple GUIs
87 | Environment.Exit(2);
88 | }
89 | else if (!args.Contains("--settings") && isDaemonRunning && isGUIRunning)
90 | {
91 | //Exit To Prevent Multiple Daemons
92 | Environment.Exit(3);
93 | }
94 | #endif
95 |
96 | DesktopPlatformManager.Activate(); // Needed here to initiate plugin DLL loading
97 |
98 | #if !GUI_DEBUG
99 | if (args.Contains("--settings"))
100 | #else
101 | if (true)
102 | #endif
103 | {
104 | // Initialize Logging For GUI
105 | Logger = new LoggerConfiguration()
106 | .WriteTo.File(Path.Join(Settings.GetAppDataFolder(), "gui.log"), rollingInterval: RollingInterval.Infinite)
107 | .CreateLogger();
108 | Logging.WriteWatermark("GUI");
109 |
110 | // Open The GUI App In Settings Mode
111 | GUI = new ViteAppManager();
112 | App();
113 | }
114 | else
115 | {
116 | // Initialize Logging For Daemon
117 | Logger = new LoggerConfiguration()
118 | .WriteTo.File(Path.Join(Settings.GetAppDataFolder(), "daemon.log"), rollingInterval: RollingInterval.Infinite)
119 | .CreateLogger();
120 | Logging.WriteWatermark("daemon");
121 |
122 | // Open The Background Daemon
123 | Background = new Daemon.Daemon();
124 | }
125 |
126 | }
127 |
128 | public static async Task App()
129 | {
130 | // Copy The Wallpaper File So That The GUI Can Access It
131 | WallpaperFinder.CopyWallpaper();
132 | AppManager.Instance.RegisterDynamicFileRoute("/wallpaper.jpg", WallpaperFinder.WallpaperRoute);
133 |
134 | var mainWindow =
135 | WebWindow.Create()
136 | .WithTitle("TopNotify")
137 | .WithBounds(new LockedWindowBounds((int)(400f * ResolutionFinder.GetScale()), (int)(650f * ResolutionFinder.GetScale())))
138 | .With((w) => (w as Win32WebWindow).BackgroundMode = Win32WebWindow.WindowBackgroundMode.Acrylic)
139 | .WithoutTitleBar()
140 | .Show();
141 |
142 | Context = StoreContext.GetDefault();
143 | WinRT.Interop.InitializeWithWindow.Initialize(Context, mainWindow.NativeHandle);
144 |
145 | // Clean Up
146 | GUI.OnCleanUp += () =>
147 | {
148 | WallpaperFinder.CleanUp();
149 | ToastNotificationManagerCompat.Uninstall();
150 | };
151 |
152 | GUI.Run();
153 | }
154 |
155 | }
156 | }
157 |
158 |
--------------------------------------------------------------------------------
/TopNotify/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "profiles": {
3 | "TopNotify": {
4 | "commandName": "Project",
5 | "remoteDebugEnabled": false
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/TopNotify/TopNotify.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | WinExe
5 | net9.0-windows10.0.17763.0
6 | SamsidParty_TopNotify
7 | enable
8 | enable
9 | dist\Image\Icon.ico
10 | dist\Meta\manifest.xml
11 | TopNotify
12 | TopNotify
13 | False
14 | C:\Users\SamarthCat\Documents\Certificates\SamsidParty Private.pfx
15 | OnBuildSuccess
16 | False
17 | AnyCPU;x64;ARM64
18 | Debug;Release;GUI Debug
19 |
20 |
21 |
22 | embedded
23 |
24 |
25 |
26 | embedded
27 |
28 |
29 |
30 | embedded
31 |
32 |
33 |
34 | embedded
35 |
36 |
37 |
38 | embedded
39 |
40 |
41 |
42 | embedded
43 |
44 |
45 |
46 | none
47 |
48 |
49 |
50 | none
51 |
52 |
53 |
54 | none
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | PreserveNewest
91 | true
92 |
93 |
94 |
95 | true
96 | react
97 |
98 | https://raw.githubusercontent.com/SamsidParty/IgniteView/refs/heads/main/IgniteView.Scripts
99 | node -e "fetch('$(ScriptsURL)/Prebuild.js').then((c) => c.text().then(eval))" "$(ScriptsURL)" "$(MSBuildProjectDirectory.Replace('\', '\\'))" "$(Configuration)" "$(JSFramework)"
100 | node -e "fetch('$(ScriptsURL)/Postbuild.js').then((c) => c.text().then(eval))" "$(ScriptsURL)" "$(MSBuildProjectDirectory.Replace('\', '\\'))" "$(Configuration)" "$(JSFramework)"
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
--------------------------------------------------------------------------------
/TopNotify/TopNotify.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.4.33205.214
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TopNotify", "TopNotify.csproj", "{F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}"
7 | EndProject
8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TopNotify.Native", "..\TopNotify.Native\TopNotify.Native.vcxproj", "{28BD2D1B-A248-496F-BA22-5FF2B8412AA3}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|ARM64 = Debug|ARM64
13 | Debug|x64 = Debug|x64
14 | GUI Debug|ARM64 = GUI Debug|ARM64
15 | GUI Debug|x64 = GUI Debug|x64
16 | Release|ARM64 = Release|ARM64
17 | Release|x64 = Release|x64
18 | EndGlobalSection
19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
20 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.Debug|ARM64.ActiveCfg = Debug|ARM64
21 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.Debug|ARM64.Build.0 = Debug|ARM64
22 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.Debug|x64.ActiveCfg = Debug|x64
23 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.Debug|x64.Build.0 = Debug|x64
24 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.GUI Debug|ARM64.ActiveCfg = GUI Debug|ARM64
25 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.GUI Debug|ARM64.Build.0 = GUI Debug|ARM64
26 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.GUI Debug|x64.ActiveCfg = GUI Debug|x64
27 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.GUI Debug|x64.Build.0 = GUI Debug|x64
28 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.Release|ARM64.ActiveCfg = Release|ARM64
29 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.Release|ARM64.Build.0 = Release|ARM64
30 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.Release|x64.ActiveCfg = Release|x64
31 | {F9E7FE42-E9AF-48C2-A17C-72E3315FDD59}.Release|x64.Build.0 = Release|x64
32 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.Debug|ARM64.ActiveCfg = Debug|ARM64
33 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.Debug|ARM64.Build.0 = Debug|ARM64
34 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.Debug|x64.ActiveCfg = Debug|x64
35 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.Debug|x64.Build.0 = Debug|x64
36 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.GUI Debug|ARM64.ActiveCfg = Debug|ARM64
37 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.GUI Debug|ARM64.Build.0 = Debug|ARM64
38 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.GUI Debug|x64.ActiveCfg = Debug|x64
39 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.GUI Debug|x64.Build.0 = Debug|x64
40 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.Release|ARM64.ActiveCfg = Release|ARM64
41 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.Release|ARM64.Build.0 = Release|ARM64
42 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.Release|x64.ActiveCfg = Release|x64
43 | {28BD2D1B-A248-496F-BA22-5FF2B8412AA3}.Release|x64.Build.0 = Release|x64
44 | EndGlobalSection
45 | GlobalSection(SolutionProperties) = preSolution
46 | HideSolutionNode = FALSE
47 | EndGlobalSection
48 | GlobalSection(ExtensibilityGlobals) = postSolution
49 | SolutionGuid = {11B9B45A-D960-44D1-92A4-00A42DE32BDB}
50 | EndGlobalSection
51 | EndGlobal
52 |
--------------------------------------------------------------------------------
/TopNotify/iv2runtime/TopNotify.igniteview:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/iv2runtime/TopNotify.igniteview
--------------------------------------------------------------------------------
/TopNotify/iv2runtime/win-arm64/native/TopNotify.Native.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/iv2runtime/win-arm64/native/TopNotify.Native.dll
--------------------------------------------------------------------------------
/TopNotify/iv2runtime/win-arm64/native/TopNotify.Native.exp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/iv2runtime/win-arm64/native/TopNotify.Native.exp
--------------------------------------------------------------------------------
/TopNotify/iv2runtime/win-arm64/native/TopNotify.Native.lib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/iv2runtime/win-arm64/native/TopNotify.Native.lib
--------------------------------------------------------------------------------
/TopNotify/iv2runtime/win-x64/native/TopNotify.Native.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/iv2runtime/win-x64/native/TopNotify.Native.dll
--------------------------------------------------------------------------------
/TopNotify/iv2runtime/win-x64/native/TopNotify.Native.exp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/iv2runtime/win-x64/native/TopNotify.Native.exp
--------------------------------------------------------------------------------
/TopNotify/iv2runtime/win-x64/native/TopNotify.Native.lib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/iv2runtime/win-x64/native/TopNotify.Native.lib
--------------------------------------------------------------------------------
/TopNotify/src-vite/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: { browser: true, es2020: true },
4 | extends: [
5 | 'eslint:recommended',
6 | 'plugin:react/recommended',
7 | 'plugin:react/jsx-runtime',
8 | 'plugin:react-hooks/recommended',
9 | ],
10 | ignorePatterns: ['dist', '.eslintrc.cjs'],
11 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
12 | settings: { react: { version: '18.2' } },
13 | plugins: ['react-refresh'],
14 | rules: {
15 | 'react/jsx-no-target-blank': 'off',
16 | 'react-refresh/only-export-components': [
17 | 'warn',
18 | { allowConstantExport: true },
19 | ],
20 | },
21 | }
22 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "topnotify",
3 | "private": false,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build --emptyOutDir",
9 | "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@chakra-ui/react": "^2.8.2",
14 | "@emotion/react": "^11.11.4",
15 | "@emotion/styled": "^11.11.5",
16 | "framer-motion": "^11.1.7",
17 | "react": "^18.2.0",
18 | "react-dom": "^18.2.0"
19 | },
20 | "devDependencies": {
21 | "@types/react": "^18.2.66",
22 | "@types/react-dom": "^18.2.22",
23 | "@vitejs/plugin-react-swc": "^3.5.0",
24 | "eslint": "^8.57.0",
25 | "eslint-plugin-react": "^7.34.1",
26 | "eslint-plugin-react-hooks": "^4.6.0",
27 | "eslint-plugin-react-refresh": "^0.4.6",
28 | "vite": "^5.2.0",
29 | "vite-plugin-transform": "^2.0.1"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Audio/internal/silent.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Audio/internal/silent.wav
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Audio/windows/win10.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Audio/windows/win10.wav
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Audio/windows/win10alt.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Audio/windows/win10alt.wav
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Audio/windows/win11.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Audio/windows/win11.wav
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Audio/windows/win7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Audio/windows/win7.wav
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Audio/windows/winxp.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Audio/windows/winxp.wav
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Audio/windows/winxp_error.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Audio/windows/winxp_error.wav
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Font/InterVariable.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Font/InterVariable.woff2
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Font/Tabler.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Font/Tabler.ttf
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/BackgroundDark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/BackgroundDark.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/BackgroundDecoration.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/BackgroundDecoration.jpg
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/BackgroundLight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/BackgroundLight.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/Blank.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/Blank.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/DefaultAppReferenceIcon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/Icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/Icon.ico
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/Icon.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/IconSmall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/IconSmall.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/IconTiny.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/IconTiny.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/LeftClick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/LeftClick.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/NoSound.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/NotificationPreview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/NotificationPreview.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/PartyWordmarkIconMono.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/PartyWordmarkIconMono.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/Sound.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/Taskbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/Taskbar.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/ThirdParty/Discord.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/ThirdParty/Outlook.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/ThirdParty/WhatsApp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/ThirdParty/Windows10.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/ThirdParty/Windows11.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Image/ThirdParty/WindowsXP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SamsidParty/TopNotify/9bb0846ad703d4a26f676b43d3da030c0724fd71/TopNotify/src-vite/public/Image/ThirdParty/WindowsXP.png
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Meta/AppxManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | TopNotify
9 | SamsidParty
10 | None
11 | Assets\StoreLogo.png
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
26 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Meta/NotificationNames.csv:
--------------------------------------------------------------------------------
1 | en-*,New notification
2 | nl-*,Nieuwe melding
3 | fr-*,Nouvelle notification
4 | he-*,הודעה חדשה
5 | es-ES,Notificación nueva
6 | es-*,Nueva notificación
7 | ja-*,新しい通知
8 | pt-*,Nova notificação
9 | de-*,Neue Benachrichtigung
10 | zh-*,新通知
11 | it-*,Nuova notifica
12 | pl-*,Nowe powiadomienie
13 | sv-*,Ny avisering
14 | da-*,Ny meddelelse
15 | no-*,Ny melding
16 | hu-*,Új értesítés
17 | ru-*,Новое уведомление
18 | hi-*,नई सूचना
19 | ko-*,새로운 알림
20 | sk-*,Nové oznámenie
21 | *,null
22 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Meta/SoundPacks.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "Name": "Your Collection",
4 | "Description": ".WAV files from your music folder will show up here",
5 | "ID": "custom_sound_path",
6 | "Sounds": [
7 | {
8 | "Path": "internal/silent",
9 | "Name": "No Sound",
10 | "Icon": "/Image/NoSound.svg"
11 | }
12 | ]
13 | },
14 | {
15 | "Name": "Windows Sounds",
16 | "Description": "Includes sounds from both modern & classic versions",
17 | "ID": "windows",
18 | "Sounds": [
19 | {
20 | "Path": "windows/win11",
21 | "Name": "Notify 11",
22 | "Icon": "/Image/ThirdParty/Windows11.svg"
23 | },
24 | {
25 | "Path": "windows/win10",
26 | "Name": "Notify 10",
27 | "Icon": "/Image/ThirdParty/Windows10.svg"
28 | },
29 | {
30 | "Path": "windows/win10alt",
31 | "Name": "Notify 10 Alt",
32 | "Icon": "/Image/ThirdParty/Windows10.svg"
33 | },
34 | {
35 | "Path": "windows/win7",
36 | "Name": "Notify 7",
37 | "Icon": "/Image/ThirdParty/Windows7.svg"
38 | },
39 | {
40 | "Path": "windows/winxp",
41 | "Name": "Notify XP",
42 | "Icon": "/Image/ThirdParty/WindowsXP.png"
43 | },
44 | {
45 | "Path": "windows/winxp_error",
46 | "Name": "Error XP",
47 | "Icon": "/Image/ThirdParty/WindowsXP.png"
48 | }
49 | ]
50 | }
51 | ]
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Meta/WinGet/SamsidParty.TopNotifyWG.installer.yaml:
--------------------------------------------------------------------------------
1 | PackageIdentifier: "SamsidParty.TopNotifyWG"
2 | PackageVersion: "%{TOPNOTIFY_VERSION}%"
3 | Platform:
4 | - "Windows.Desktop"
5 | MinimumOSVersion: "10.0.19041.0"
6 | InstallerType: "msix"
7 | InstallModes:
8 | - "silent"
9 | PackageFamilyName: "55968SamsidGameStudios.TopNotify_r9j5xrxak4zje"
10 | Installers:
11 | - Architecture: "x64"
12 | InstallerUrl: "https://github.com/SamsidParty/TopNotify/releases/download/%{TOPNOTIFY_VERSION}%/TopNotify.Msix"
13 | InstallerSha256: 1ab364e2ed182e0c879fd9ec7a730aafa47fd441facac8b5adccf77767026917
14 | ManifestType: "installer"
15 | ManifestVersion: "1.6.0"
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Meta/WinGet/SamsidParty.TopNotifyWG.locale.en-US.yaml:
--------------------------------------------------------------------------------
1 | PackageIdentifier: "SamsidParty.TopNotifyWG"
2 | PackageVersion: "%{TOPNOTIFY_VERSION}%"
3 | PackageLocale: "en-US"
4 | Publisher: "SamsidParty"
5 | PublisherUrl: "https://www.samsidparty.com/"
6 | PrivacyUrl: "https://www.samsidparty.com/docs/support/privacy"
7 | PackageName: "TopNotify"
8 | PackageUrl: "https://www.samsidparty.com/software/topnotify"
9 | License: "GPLv3"
10 | LicenseUrl: "https://github.com/SamsidParty/TopNotify/blob/main/LICENSE"
11 | ShortDescription: "The Ultimate Notification Customization Tool"
12 | ManifestType: "defaultLocale"
13 | ManifestVersion: "1.6.0"
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Meta/WinGet/SamsidParty.TopNotifyWG.yaml:
--------------------------------------------------------------------------------
1 | PackageIdentifier: "SamsidParty.TopNotifyWG"
2 | PackageVersion: "%{TOPNOTIFY_VERSION}%"
3 | DefaultLocale: "en-US"
4 | ManifestType: "version"
5 | ManifestVersion: "1.6.0"
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/Meta/manifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | Display Notifications At The Top Of The Screen
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | true
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/public/drag.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |

72 |
73 |
Drag to desired position
74 |
Left-click to confirm
75 |
76 |
77 |
78 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/About.jsx:
--------------------------------------------------------------------------------
1 | import { Button } from "@chakra-ui/react";
2 | import "./CSS/About.css";
3 | import { useState } from "react";
4 |
5 | export default function About() {
6 |
7 | var [version, setVersion] = useState("");
8 |
9 | if (version == "") {
10 | setVersion(" ...");
11 |
12 | setTimeout(async () => {
13 | setVersion(await igniteView.commandBridge.GetVersion());
14 | });
15 | }
16 |
17 | return (
18 |
19 |
20 |
About
21 |
22 |
23 |
24 |
25 |
26 |
27 |

28 |
TopNotify{version}
29 |
Developed by SamsidParty • Powered by IgniteView
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | )
40 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/App.jsx:
--------------------------------------------------------------------------------
1 | import { useState } from 'react'
2 | import { Button, Switch, Divider, Container } from '@chakra-ui/react'
3 | import NotificationTransparency from './Transparency'
4 | import ClickThrough from './ClickThrough'
5 | import TestNotification from './TestNotification'
6 | import ManageNotificationSounds from './NotificationSounds'
7 | import Preview from './Preview'
8 | import { DebugMenu } from './DebugMenu'
9 | import ReadAloud from './ReadAloud'
10 | import MonitorSelect from './MonitorSelect'
11 | import SoundInterceptionToggle from './SoundInterceptionToggle'
12 | import { useFirstRender } from './Helper'
13 |
14 |
15 | window.Config = {
16 | Location: -1,
17 | Opacity: 0,
18 | ReadAloud: false,
19 | AppReferences: []
20 | }
21 |
22 | // Called By C#, Sets The window.Config Object To The Saved Config File
23 | window.SetConfig = async (config) => {
24 | Config = JSON.parse(config);
25 | window.setRerender(rerender + 1);
26 | }
27 |
28 | window.UploadConfig = () => {
29 |
30 | if (Config.Location == -1) {
31 | //Config Hasn't Loaded Yet
32 | return;
33 | }
34 |
35 | igniteView.commandBridge.WriteConfigFile(JSON.stringify(Config));
36 | window.setRerender(rerender + 1);
37 | }
38 |
39 | window.ChangeSwitch = function (key, e) {
40 | Config[key] = e.target.checked;
41 | UploadConfig();
42 | window.setRerender(rerender + 1);
43 | }
44 |
45 | window.ChangeValue = function (key, e) {
46 | Config[key] = e;
47 | UploadConfig();
48 | window.setRerender(rerender + 1);
49 | }
50 |
51 | function App() {
52 |
53 | var [rerender, setRerender] = useState(0);
54 | window.rerender = rerender;
55 | window.setRerender = setRerender;
56 |
57 | if (useFirstRender()) {
58 | igniteView.commandBridge.invoke("RequestConfig");
59 | }
60 |
61 | return (
62 | 0) ? " loaded" : "")}>
63 |
64 |
65 |
66 |
67 |

68 |
TopNotify
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | {
82 | window.errorList?.map((error, i) => {
83 | return (
)
84 | })
85 | }
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | )
107 | }
108 |
109 | function ErrorMessage(props) {
110 | return (
111 |
{props.error.Text}
112 | )
113 | }
114 |
115 |
116 | export default App
117 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/CSS/About.css:
--------------------------------------------------------------------------------
1 | .aboutButtons {
2 | display: block;
3 | justify-content: center;
4 | align-items: center;
5 | text-align: center;
6 | width: 100%;
7 | height: auto;
8 | }
9 |
10 | .aboutButtons button {
11 | margin: 2px;
12 | }
13 |
14 | .about .draggableHeader {
15 |
16 | }
17 |
18 | .about h4 {
19 | font-size: 24px;
20 | text-align: center;
21 | font-weight: 600;
22 | letter-spacing: -0.05em;
23 | }
24 |
25 | .about h6 {
26 | font-size: 12px;
27 | text-align: center;
28 | font-weight: 400;
29 | margin-top: 5px;
30 | margin-bottom: 5px;
31 | }
32 |
33 | .about img {
34 | width: 15vw;
35 | height: auto;
36 | margin: auto;
37 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/CSS/App.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: Main;
3 | size-adjust: 110%;
4 | src: url("/Font/InterVariable.woff2");
5 | }
6 |
7 | @font-face {
8 | font-family: Icon;
9 | src: url("/Font/Tabler.ttf");
10 | }
11 |
12 |
13 | .app {
14 | transition: opacity 0.3s, transform 0.3s;
15 | opacity: 0;
16 | transform: scale(0.95);
17 | position: relative;
18 | }
19 |
20 | .app.loaded {
21 | opacity: 1;
22 | height: calc(100vh - 27px);
23 | transform: scale(1);
24 | }
25 |
26 | * {
27 | font-family: Main, Icon;
28 | color: var(--col-text);
29 | box-sizing: border-box;
30 | user-select: none;
31 | -webkit-user-select: none;
32 | font-size: 11px;
33 |
34 | --col-bg: white;
35 | --col-overlay: rgba(255, 255, 255, 0.5);
36 | --col-text: #111111;
37 | --col-text-inverted: #F1ECF3;
38 | --col-text-overlay: rgb(107 114 128);
39 | --col-primary: #5536e0;
40 | --col-primary-hover: #492fbb;
41 | --col-secondary: #acee3a;
42 | --col-tertiary: #ffffffab;
43 | --col-contrast: #ebebeb;
44 | --col-border: #bbbbbb;
45 | --col-disabled: #251F29;
46 | --image-bg: url("/Image/BackgroundLight.png");
47 |
48 | image-rendering: auto;
49 | }
50 |
51 | @media (prefers-color-scheme: dark) {
52 | * {
53 | --col-bg: #222222;
54 | --col-overlay: rgba(0, 0, 0, 0.5);
55 | --col-text: #F1ECF3;
56 | --col-text-inverted: #111111;
57 | --col-text-overlay: rgb(107 114 128);
58 | --col-primary: #767df9;
59 | --col-primary-hover: #6268d3;
60 | --col-secondary: #BEF264;
61 | --col-tertiary: #50505031;
62 | --col-contrast: #343434;
63 | --col-disabled: #251F29;
64 | --col-border: #433e46;
65 | --image-bg: url("/Image/BackgroundDark.png");
66 | }
67 | }
68 |
69 | *[data-greyed-out="true"] {
70 | pointer-events: none;
71 | opacity: 0.5;
72 | }
73 |
74 | html, body {
75 | width: 100vw;
76 | height: 100vh;
77 | position: relative;
78 | display: flex;
79 | overflow: hidden;
80 | }
81 |
82 | body {
83 | flex-direction: column;
84 | padding: 1.5rem;
85 | padding-top: 7px;
86 | height: 100vh;
87 | width: 100vw;
88 | background-image: var(--image-bg) !important;
89 | background-size: 120vw !important;
90 | background-repeat: no-repeat;
91 | image-rendering: pixelated;
92 | }
93 |
94 |
95 |
96 | .errorMessage {
97 | height: 40px;
98 | border-radius: 5px;
99 | background-color: rgba(0, 0, 0, 0.2);
100 | display: flex;
101 | align-items: center;
102 | font-size: 12px;
103 | padding-left: 10px;
104 | gap: 10px;
105 | margin-top: 12px;
106 | }
107 |
108 | .errorMessage h4 {
109 | font-size: 20px;
110 | color: var(--col-secondary);
111 | }
112 |
113 | .errorMessage.medium {
114 | height: 60px;
115 | }
116 |
117 | .footer {
118 | position: absolute;
119 | width: 100%;
120 | height: 40px;
121 | bottom: 0;
122 | border-radius: 5px;
123 | background-color: var(--col-tertiary);
124 | display: flex;
125 | align-items: center;
126 | }
127 |
128 | .footerLogo {
129 | height: 50%;
130 | margin-left: 10px;
131 | opacity: 0.8;
132 | filter: invert(100);
133 | }
134 |
135 |
136 | @media (prefers-color-scheme: dark) {
137 | .footerLogo {
138 | filter: none;
139 | opacity: 0.6;
140 | }
141 | }
142 |
143 |
144 | .draggableHeader {
145 | display: flex;
146 | margin-right: 15%;
147 | align-items: center;
148 | gap: 0.5rem;
149 | margin-bottom: 4.3vw;
150 | }
151 |
152 | .draggableHeader img {
153 | height: 8vw;
154 | width: auto;
155 | }
156 |
157 | .windowCloseButton {
158 | position: absolute;
159 | right: 0px;
160 | top: 2vw;
161 | }
162 |
163 | .windowCloseButton button {
164 | background-color: rgba(255, 255, 255, 0.06) !important;
165 | color: var(--col-text) !important;
166 | font-weight: 400 !important;
167 | border-radius: 3px !important;
168 | }
169 |
170 | .buttonContainer button {
171 | font-weight: 550 !important;
172 | border-radius: 3px !important;
173 | }
174 |
175 | label {
176 | font-size: 1rem;
177 | }
178 |
179 | button {
180 | width: auto;
181 | height: 25px;
182 | padding: 14px !important;
183 | font-size: 1rem !important;
184 | font-weight: 400 !important;
185 | color: var(--col-text) !important;
186 | border-radius: 3px !important;
187 | }
188 |
189 | button:hover {
190 | opacity: 0.8;
191 | }
192 |
193 | .iconButton {
194 | width: 2rem !important;
195 | min-width: 0px !important;
196 | height: 2rem !important;
197 | padding: 2px !important;
198 | font-size: 1.2rem !important;
199 | color: white !important;
200 | background-color: var(--col-primary) !important;
201 | }
202 |
203 |
204 | *::-webkit-scrollbar {
205 | background: transparent;
206 | }
207 |
208 | *::-webkit-scrollbar-thumb {
209 | height: 56px;
210 | border-radius: 8px;
211 | border: 4px solid transparent;
212 | background-clip: content-box;
213 | background-color: var(--text-color);
214 | opacity: 0.5;
215 | }
216 |
217 | .flexx {
218 | display: flex;
219 | flex-direction: row;
220 | }
221 |
222 | .flexy {
223 | display: flex;
224 | flex-direction: column;
225 | }
226 |
227 | .fillx {
228 | width: 100%;
229 | }
230 |
231 | .filly {
232 | height: 100%;
233 | }
234 |
235 | .fjend {
236 | justify-content: flex-end !important;
237 | }
238 |
239 | .fjcenter {
240 | justify-content: center !important;
241 | }
242 |
243 | .fjstart {
244 | justify-content: flex-start !important;
245 | }
246 |
247 | .faend {
248 | align-items: flex-end !important;
249 | }
250 |
251 | .facenter {
252 | align-items: center !important;
253 | }
254 |
255 | .fastart {
256 | align-items: flex-start !important;
257 | }
258 |
259 | .gap20 {
260 | gap: 2rem;
261 | }
262 |
263 | .gap15 {
264 | gap: 1.5rem;
265 | }
266 |
267 | .gap10 {
268 | gap: 1rem;
269 | }
270 |
271 | .gap5 {
272 | gap: 0.5rem;
273 | }
274 |
275 | .tacenter {
276 | text-align: center;
277 | }
278 |
279 | .taleft {
280 | text-align: left;
281 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/CSS/ChakraOverrides.css:
--------------------------------------------------------------------------------
1 | * {
2 | --chakra-colors-blue-500: var(--col-primary) !important;
3 | --chakra-colors-blue-200: var(--col-primary) !important;
4 | --chakra-colors-gray-700: var(--col-bg) !important;
5 | --chakra-colors-chakra-border-color: var(--col-border) !important;
6 | --chakra-colors-whiteAlpha-400: var(--chakra-colors-whiteAlpha-200) !important;
7 | --drawer-bg: transparent !important;
8 | --drawer-box-shadow: none !important;
9 | }
10 |
11 | .chakra-modal__content-container .windowCloseButton {
12 | margin-right: 5vw;
13 | margin-top: 1vh;
14 | }
15 |
16 | .chakra-button, .chakra-button * {
17 | transition: none !important;
18 | }
19 |
20 | h2, .chakra-modal__header {
21 | margin: 0 !important;
22 | line-height: 11vw !important;
23 | font-size: 6.5vw !important;
24 | font-weight: 600 !important;
25 | letter-spacing: -0.05em !important;
26 | }
27 |
28 | .chakra-modal__header {
29 | padding-top: 1.5vw !important;
30 | padding-bottom: 1.5vw !important;
31 | margin-right: 10vw !important;
32 | }
33 |
34 | .chakra-divider {
35 | width: 100%;
36 | margin-top: 0.5rem;
37 | margin-bottom: 0.5rem;
38 | }
39 |
40 | .chakra-modal__content {
41 | height: 100%;
42 | width: 100%;
43 | }
44 |
45 | .chakra-container {
46 | padding: 10px !important;
47 | border: 1px solid var(--col-border);
48 | border-radius: 5px;
49 | margin-top: 10px;
50 | margin-bottom: 10px;
51 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/CSS/NotificationSounds.css:
--------------------------------------------------------------------------------
1 | .appReferenceSoundItem {
2 | display: flex;
3 | gap: 10px;
4 | align-items: center;
5 | }
6 |
7 | .appReferenceSoundItem .selectSoundButton {
8 | margin-left: auto;
9 | width: 200px;
10 | }
11 |
12 | .appReferenceSoundItem .selectSoundButton * {
13 | float: right;
14 | }
15 |
16 | .appReferenceSoundItem img {
17 | width: 24px;
18 | height: 24px;
19 | }
20 |
21 | .soundPackList {
22 | display: flex;
23 | justify-content: center;
24 | align-items: center;
25 | flex-direction: column;
26 | gap: 15px;
27 | }
28 |
29 | .soundPack {
30 | background-color: var(--col-tertiary);
31 | border-radius: 5px;
32 | display: flex;
33 | flex-direction: column;
34 | padding: 15px;
35 | width: 100%;
36 | overflow: hidden;
37 | }
38 |
39 | .soundPack h3 {
40 | font-size: 1.3rem;
41 | font-weight: 500;
42 | letter-spacing: -0.05em;
43 | }
44 |
45 | .soundPack h4 {
46 | font-size: 1rem;
47 | font-weight: 400;
48 | letter-spacing: -0.05em;
49 | opacity: 0.6;
50 | }
51 |
52 | .soundList {
53 | display: grid;
54 | justify-content: center;
55 | align-items: center;
56 | grid-template-columns: 1fr 1fr 1fr;
57 | gap: 12px;
58 | }
59 |
60 | .soundItem {
61 | transition: opacity 0.3s;
62 | display: flex;
63 | flex-direction: column;
64 | justify-content: flex-end;
65 | align-items: center;
66 | min-width: 23vw;
67 | max-width: 23vw;
68 | min-height: 23vw;
69 | max-height: 23vw;
70 | background-color: var(--col-tertiary);
71 | border-radius: 5px;
72 | }
73 |
74 | .soundItem .soundItemButton {
75 | width: 100%;
76 | height: calc(17vw);
77 | }
78 |
79 | .soundItem img {
80 | height: 60px;
81 | }
82 |
83 | .soundItem .iconButton {
84 | width: 1.5rem !important;
85 | height: 1.5rem !important;
86 | padding: 0 !important;
87 | font-weight: 400 !important;
88 | }
89 |
90 | .soundItem h5 {
91 | margin: auto;
92 | font-size: 0.8rem;
93 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/CSS/Preview.css:
--------------------------------------------------------------------------------
1 | .previewContainer {
2 | width: 100%;
3 | background-image: url("/Image/BackgroundDecoration.jpg");
4 | background-size: cover;
5 | background-repeat: no-repeat;
6 | background-position: center;
7 | border-radius: 5px;
8 | border-bottom-right-radius: 0px;
9 | border-bottom-left-radius: 0px;
10 | position: relative;
11 | margin-top: 10px;
12 | overflow: hidden;
13 | display: flex;
14 | justify-content: center;
15 | align-items: center;
16 | }
17 |
18 |
19 | .previewContainer .taskbarPreview {
20 | position: absolute;
21 | bottom: 0;
22 | width: 100%;
23 | background-color: var(--col-overlay);
24 | display: flex;
25 | align-items: center;
26 | justify-content: center;
27 | }
28 |
29 | .previewContainer .taskbarPreview img {
30 | height: 80%;
31 | }
32 |
33 | .previewContainer .notificationWindowPreview {
34 | position: absolute;
35 | display: flex;
36 | justify-content: center;
37 | align-items: center;
38 | }
39 |
40 | .previewContainer .notificationWindowPreview .notificationPreview {
41 | background-color: var(--col-text-inverted);
42 | border-radius: 5px;
43 | }
44 |
45 | .previewContainer .notificationWindowPreview .notificationPreview img {
46 | height: 100%;
47 | width: auto;
48 | filter: invert(100%);
49 | }
50 |
51 | .previewContainer .locationSelect {
52 | border-radius: 5px;
53 | display: grid;
54 | grid-template-columns: 1fr 1fr;
55 | gap: 2.2rem;
56 | }
57 |
58 | .previewContainer .locationSelectButton {
59 | background-color: var(--col-overlay) !important;
60 | width: 2.5rem;
61 | height: 2.5rem;
62 | font-size: 1.8rem !important;
63 | font-weight: 100;
64 | }
65 |
66 | .previewContainer .locationSelectButton:hover {
67 | opacity: 0.8;
68 | }
69 |
70 | .previewContainer .customLocationSelectButton {
71 | position: absolute;
72 | margin: auto;
73 | top: 0;
74 | left: 0;
75 | right: 0;
76 | bottom: 0;
77 | }
78 |
79 | .monitorSelect {
80 | border-top-left-radius: 0px !important;
81 | border-top-right-radius: 0px !important;
82 | }
83 |
84 | @media (prefers-color-scheme: dark) {
85 | .previewContainer .notificationWindowPreview .notificationPreview img {
86 | filter: none;
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/ClickThrough.jsx:
--------------------------------------------------------------------------------
1 |
2 | import { Switch } from '@chakra-ui/react'
3 |
4 | export default function ClickThrough() {
5 |
6 |
7 | return (
8 |
9 |
10 | ChangeSwitch("EnableClickThrough", e)} isChecked={Config.EnableClickThrough} style={{ marginLeft: "auto" }} size='lg' />
11 |
12 | )
13 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/DebugMenu.jsx:
--------------------------------------------------------------------------------
1 |
2 | import {
3 | Drawer,
4 | DrawerBody,
5 | DrawerFooter,
6 | DrawerHeader,
7 | DrawerOverlay,
8 | DrawerContent,
9 | DrawerCloseButton
10 | } from '@chakra-ui/react'
11 |
12 | import { Button, Switch, Slider, SliderTrack, SliderFilledTrack, SliderThumb, Divider } from '@chakra-ui/react'
13 | import { useState } from 'react'
14 |
15 | export function DebugMenu() {
16 |
17 | var [isOpen, _setIsOpen] = useState(false);
18 |
19 | var setIsOpen = (v) => {
20 |
21 | if (v && rerender < 0) { return; }
22 |
23 | if (v) {
24 | setTimeout(() => setRerender(-9999999), 0);
25 | }
26 | else {
27 | setTimeout(() => setRerender(2), 0);
28 | }
29 |
30 | _setIsOpen(v);
31 | }
32 |
33 | window.openDebugMenu = () => setIsOpen(true);
34 |
35 | return (
36 | <>
37 | setIsOpen(false)}
42 | >
43 |
44 |
45 |
46 |
47 |
48 |
49 | Debug Menu
50 |
51 |
52 |
53 |
54 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | ChangeSwitch("EnableDebugForceFallbackMode", e)} isChecked={Config.EnableDebugForceFallbackMode} style={{ marginLeft: "auto" }} size='lg' />
64 |
65 |
66 |
67 |
68 |
69 |
70 | ChangeSwitch("EnableDebugRemoveBoundsCorrection", e)} isChecked={Config.EnableDebugRemoveBoundsCorrection} style={{ marginLeft: "auto" }} size='lg' />
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 | >
80 | )
81 | }
82 |
83 | addEventListener("keydown", (e) => {
84 | if (e.key == "F2") {
85 | window.openDebugMenu();
86 | e.preventDefault();
87 | }
88 | })
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/Helper.jsx:
--------------------------------------------------------------------------------
1 | import { useRef } from "react";
2 |
3 | //https://stackoverflow.com/a/66139558/18071273
4 | export function useFirstRender() {
5 | const ref = useRef(true);
6 | const firstRender = ref.current;
7 | ref.current = false;
8 | return firstRender;
9 | }
10 |
11 | //https://stackoverflow.com/a/52652681/18071273
12 | export function waitUntil(conditionFunction) {
13 |
14 | const poll = resolve => {
15 | if(conditionFunction()) resolve();
16 | else setTimeout(_ => poll(resolve), 400);
17 | }
18 |
19 | return new Promise(poll);
20 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/MonitorSelect.jsx:
--------------------------------------------------------------------------------
1 | import { Button, Switch, Divider, Select } from '@chakra-ui/react'
2 |
3 | export default function MonitorSelect(props) {
4 | return (
5 |
13 | )
14 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/NotificationSounds.jsx:
--------------------------------------------------------------------------------
1 | import { Button, Divider } from '@chakra-ui/react'
2 |
3 | import { useState, Fragment } from 'react';
4 | import { useFirstRender } from './Helper.jsx'
5 |
6 | import "./CSS/NotificationSounds.css";
7 |
8 | import {
9 | Drawer,
10 | DrawerBody,
11 | DrawerFooter,
12 | DrawerHeader,
13 | DrawerOverlay,
14 | DrawerContent,
15 | DrawerCloseButton
16 | } from '@chakra-ui/react'
17 |
18 | export default function ManageNotificationSounds() {
19 |
20 | var [isOpen, _setIsOpen] = useState(false);
21 | var [isPickerOpen, _setIsPickerOpen] = useState(false);
22 |
23 | var setIsOpen = (v) => {
24 |
25 | if (v && rerender < 0) { return; }
26 |
27 | if (v) {
28 | setTimeout(() => setRerender(-9999999), 0);
29 | }
30 | else {
31 | setTimeout(() => setRerender(2), 0);
32 | }
33 |
34 | _setIsOpen(v);
35 | }
36 |
37 | var setIsPickerOpen = (v, id) => {
38 | _setIsOpen(!v);
39 | _setIsPickerOpen(v);
40 | }
41 |
42 | var applySound = (sound) => {
43 |
44 | for (var i = 0; i < Config.AppReferences.length; i++) {
45 | if (Config.AppReferences[i].ID == window.soundPickerReferenceID) {
46 | Config.AppReferences[i].SoundPath = sound.Path;
47 | Config.AppReferences[i].SoundDisplayName = sound.Name;
48 | break;
49 | }
50 | }
51 |
52 | UploadConfig();
53 | setIsPickerOpen(false);
54 | }
55 |
56 | return (
57 |
58 |
59 |
62 |
setIsOpen(false)}
67 | >
68 |
69 |
70 |
71 |
72 |
73 |
74 | Notification Sounds
75 |
76 |
77 |
Some apps will play their own sounds, you may have to turn them off in-app to prevent overlapping audio.
78 | {
79 | window.Config.AppReferences.map((appReference, i) => {
80 | return (
81 |
82 |
83 |
84 |
85 | )
86 | })
87 | }
88 |
89 | {
90 | window.Config.AppReferences.length == 0 ? (When an app sends a notification, TopNotify will capture it and it will show up here for you to modify the sounds.
) : null
91 | }
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 | )
102 | }
103 |
104 | function AppReferenceSoundItem(props) {
105 |
106 | var pickSound = () => {
107 | window.soundPickerReferenceID = props.appReference.ID;
108 | props.setIsPickerOpen(true);
109 | }
110 |
111 | return (
112 |
113 |

114 |
{props.appReference.DisplayName}
115 |
116 |
117 |
118 |
119 | )
120 | }
121 |
122 | function SoundPicker(props) {
123 |
124 | var [soundPacks, setSoundPacks] = useState([]);
125 |
126 | if (useFirstRender()) {
127 | setTimeout(async () => {
128 | var newSounds = JSON.parse(await igniteView.commandBridge.FindSounds());
129 | setSoundPacks(newSounds);
130 | }, 0);
131 | }
132 |
133 | return (
134 | props.setIsPickerOpen(false)}
139 | >
140 |
141 |
142 |
143 |
144 |
145 |
146 | Select Sound
147 |
148 |
149 |
150 | {
151 | soundPacks.map((soundPack, i) => {
152 | return ()
153 | })
154 | }
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 | )
164 | }
165 |
166 | function SoundPack(props) {
167 |
168 | var playSound = (sound) => igniteView.commandBridge.PreviewSound(sound.Path);
169 |
170 | return (
171 |
172 |
{props.soundPack.Name}
173 |
{props.soundPack.Description}
174 |
175 |
176 | {
177 | props.soundPack.Sounds.map((sound, i) => {
178 | return (
179 |
180 |
183 |
{sound.Name}
184 |
185 | )
186 | })
187 | }
188 |
189 |
190 | )
191 | }
192 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/Preview.jsx:
--------------------------------------------------------------------------------
1 |
2 | import { Button } from "@chakra-ui/react";
3 | import "./CSS/Preview.css";
4 |
5 | var previewWidth = 352;
6 | var previewScale = previewWidth / 1920; // Relative to actual scale
7 |
8 | function CalculatePreviewContainerStyle() {
9 | var aspect = 0.5625; // 16:9
10 |
11 | if (window.Config.__ScreenWidth) {
12 | aspect = window.Config.__ScreenHeight / window.Config.__ScreenWidth;
13 | }
14 |
15 | return { width: previewWidth, height: (previewWidth * aspect), backgroundImage: `url('${igniteView.resolverURL + "/wallpaper.jpg"}')` };
16 | }
17 |
18 | function CalculateTaskbarPreviewStyle() {
19 | //Windows taskbar is 48px high
20 | var standardHeight = 48 * previewScale;
21 |
22 | return {
23 | height: window.Config.__ScreenScale ? (standardHeight * window.Config.__ScreenScale) : standardHeight
24 | };
25 | }
26 |
27 | function CalculateNotificationWindowPreviewStyle() {
28 |
29 | //The window size (not displayed size) of windows notifications are 396 * 152
30 | var standardWidth = 396 * previewScale;
31 | var standardHeight = 152 * previewScale;
32 |
33 | var style = {
34 | width: window.Config.__ScreenScale ? (standardWidth * window.Config.__ScreenScale) : standardWidth,
35 | height: window.Config.__ScreenScale ? (standardHeight * window.Config.__ScreenScale) : standardHeight
36 | };
37 |
38 | var posX = 0;
39 | var posY = 0;
40 | var scaledMainDisplayWidth = CalculatePreviewContainerStyle().width;
41 | var scaledMainDisplayHeight = CalculatePreviewContainerStyle().height;
42 |
43 | if (window.Config.Location) {
44 | if (window.Config.Location == 0) { // Top left
45 | posX = 0;
46 | posY = 0;
47 | }
48 | else if (window.Config.Location == 1) { // Top Right
49 | posX = scaledMainDisplayWidth - style.width;
50 | posY = 0;
51 | }
52 | else if (window.Config.Location == 2) { // Bottom Left
53 | posX = 0;
54 | posY = scaledMainDisplayHeight - style.height - (50 * previewScale);
55 | }
56 | else if (window.Config.Location == 3) { // Bottom Right
57 | posX = scaledMainDisplayWidth - style.width;
58 | posY = scaledMainDisplayHeight - style.height - (50 * previewScale);
59 | }
60 | else { // Custom
61 | posX = window.Config.CustomPositionPercentX / 100 * scaledMainDisplayWidth;
62 | posY = window.Config.CustomPositionPercentY / 100 * scaledMainDisplayHeight;
63 |
64 | //Make Sure Position Isn't Out Of Bounds
65 | posX = Math.max(0, Math.min(posX, scaledMainDisplayWidth - style.width));
66 | posY = Math.max(0, Math.min(posY, scaledMainDisplayHeight - style.height));
67 | }
68 | }
69 |
70 | style.left = posX;
71 | style.top = posY;
72 |
73 | return style;
74 | }
75 |
76 | function CalculateNotificationPreviwStyle() {
77 |
78 | //The displayed size is 364 * 109, which has a scale of 0.919191917 * 0.717105263 relative to the window
79 |
80 | return {
81 | width: CalculateNotificationWindowPreviewStyle().width * 0.919191917,
82 | height: CalculateNotificationWindowPreviewStyle().height * 0.717105263,
83 | opacity: (Config.Opacity != undefined) ? (1 - (Config.Opacity / 5)) : 0
84 | }
85 | }
86 |
87 | export default function Preview() {
88 | return (
89 |
90 |
91 |
92 |

93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | )
105 | }
106 |
107 |
108 | // 0 = TopLeft,
109 | // 1 = TopRight,
110 | // 2 = BottomLeft,
111 | // 3 = BottomRight,
112 | // 4 = Custom
113 | function SetPresetPosition(position) {
114 | window.ChangeValue("Location", position);
115 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/ReadAloud.jsx:
--------------------------------------------------------------------------------
1 |
2 | import { Switch } from '@chakra-ui/react'
3 |
4 | export default function ReadAloud() {
5 |
6 |
7 | return (
8 |
9 |
10 | ChangeSwitch("ReadAloud", e)} isChecked={Config.ReadAloud} style={{ marginLeft: "auto" }} size='lg' />
11 |
12 | )
13 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/SoundInterceptionToggle.jsx:
--------------------------------------------------------------------------------
1 | import { Button, Switch, Slider, SliderTrack, SliderFilledTrack, SliderThumb, Divider } from '@chakra-ui/react'
2 | import { useState } from 'react'
3 |
4 | export default function SoundInterceptionToggle() {
5 |
6 | var [isInterceptionEnabled, setIsInterceptionEnabled] = useState(false);
7 | var [checkState, setCheckState] = useState("none");
8 |
9 | if (checkState == "none") {
10 | setCheckState("loading");
11 | setTimeout(async () => {
12 | window.isInterceptionEnabled = await igniteView.commandBridge.IsSoundInstalledInRegistry();
13 | setIsInterceptionEnabled(window.isInterceptionEnabled);
14 | setCheckState("success");
15 | window.setRerender(rerender + 1);
16 | }, 0);
17 | }
18 |
19 | var setEnabled = async (isChecked) => {
20 | if (isChecked) {
21 | await igniteView.commandBridge.InstallSoundInRegistry();
22 | }
23 | else {
24 | await igniteView.commandBridge.UninstallSoundInRegistry();
25 | }
26 |
27 | UploadConfig();
28 |
29 | setCheckState("none");
30 | }
31 |
32 | return (
33 |
34 |
35 | setEnabled(e.target.checked)} isChecked={isInterceptionEnabled} style={{ marginLeft: "auto" }} size='lg' />
36 |
37 | )
38 | }
39 |
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/TestNotification.jsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@chakra-ui/react'
2 |
3 | export default function TestNotification() {
4 | return (
5 |
6 |
7 |
10 |
11 | )
12 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/Transparency.jsx:
--------------------------------------------------------------------------------
1 | import { Button, Switch, Slider, SliderTrack, SliderFilledTrack, SliderThumb, Divider } from '@chakra-ui/react'
2 |
3 | export default function NotificationTransparency() {
4 | return (
5 |
6 |
7 | {
8 | //Slider Is In Uncontrolled Mode For Performance Reasons
9 | //So We Need To Wait For The Config To Load Before Setting The Default Value
10 | (Config.Location < 0) ?
11 | (<>>) :
12 | (
13 |
14 |
15 |
16 |
17 |
18 |
19 | )
20 | }
21 |
22 | )
23 | }
24 |
25 | function ChangeTransparency(opacity) {
26 | Config.Opacity = (opacity * 0.05);
27 | window.UploadConfig();
28 | window.setRerender(rerender + 1);
29 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/src/main.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import App from './App.jsx'
4 | import { ChakraProvider } from '@chakra-ui/react'
5 | import './CSS/App.css'
6 | import './CSS/ChakraOverrides.css'
7 | import { useFirstRender, waitUntil } from './Helper.jsx'
8 | import About from './About.jsx'
9 |
10 | window.serverURL = "http://" + window.location.host + "/";
11 |
12 | //Chakra UI Color Mode
13 | var defaultTheme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? "dark" : "light";
14 | localStorage.setItem("chakra-ui-color-mode", defaultTheme);
15 | document.documentElement.setAttribute("data-theme", defaultTheme);
16 | document.body.setAttribute("chakra-ui-theme", "chakra-ui-" + defaultTheme);
17 |
18 | window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
19 | location.reload();
20 | });
21 |
22 |
23 |
24 | ReactDOM.createRoot(document.getElementById('root')).render(RootComponent());
25 |
26 | function RootComponent(params) {
27 | return (
28 |
29 |
30 |
31 | )
32 | }
33 |
34 | function Dispatcher() {
35 | var MainMethod = App;
36 |
37 | if (window.location.search.includes("about")) {
38 | MainMethod = About;
39 | }
40 |
41 | return (
42 |
43 | )
44 | }
--------------------------------------------------------------------------------
/TopNotify/src-vite/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react-swc'
3 | import transformPlugin from 'vite-plugin-transform';
4 | import { resolve, join } from 'path';
5 |
6 | var version = "3.0.0";
7 |
8 | // https://vitejs.dev/config/
9 | export default defineConfig({
10 | plugins: [
11 | react(),
12 | transformPlugin({
13 | tStart: '%{',
14 | tEnd: '}%',
15 | replace: {
16 | "TOPNOTIFY_VERSION": version
17 | },
18 | replaceFiles: [
19 | resolve(join(__dirname, '..\\..\\TopNotify\\dist\\Meta\\AppxManifest.xml')),
20 | resolve(join(__dirname, '..\\..\\TopNotify\\dist\\Meta\\manifest.xml')),
21 | resolve(join(__dirname, '..\\..\\TopNotify\\dist\\Meta\\WinGet\\SamsidParty.TopNotifyWG.yaml')),
22 | resolve(join(__dirname, '..\\..\\TopNotify\\dist\\Meta\\WinGet\\SamsidParty.TopNotifyWG.installer.yaml')),
23 | resolve(join(__dirname, '..\\..\\TopNotify\\dist\\Meta\\WinGet\\SamsidParty.TopNotifyWG.locale.en-US.yaml')),
24 | ]
25 | })
26 | ],
27 | build: {
28 | outDir: '..\\..\\TopNotify\\dist'
29 | },
30 | define: {
31 | TOPNOTIFY_VERSION: `"${version}"`,
32 | },
33 | })
34 |
--------------------------------------------------------------------------------