@dirathea/busical 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="1000"><g clip-path="url(#SvgjsClipPath1015)"><rect width="1000" height="1000" fill="#3b82f6"></rect><g transform="matrix(1.3671875,0,0,1.3671875,150,150)"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512"><svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="512" height="512" rx="128" fill="#000000"></rect>
3
+ <rect x="96" y="128" width="320" height="288" rx="16" fill="white"></rect>
4
+ <rect x="96" y="128" width="320" height="64" rx="16" fill="#3b82f6"></rect>
5
+ <line x1="176" y1="224" x2="176" y2="368" stroke="#e5e7eb" stroke-width="2"></line>
6
+ <line x1="256" y1="224" x2="256" y2="368" stroke="#e5e7eb" stroke-width="2"></line>
7
+ <line x1="336" y1="224" x2="336" y2="368" stroke="#e5e7eb" stroke-width="2"></line>
8
+ <line x1="136" y1="264" x2="376" y2="264" stroke="#e5e7eb" stroke-width="2"></line>
9
+ <line x1="136" y1="304" x2="376" y2="304" stroke="#e5e7eb" stroke-width="2"></line>
10
+ <line x1="136" y1="344" x2="376" y2="344" stroke="#e5e7eb" stroke-width="2"></line>
11
+ <rect x="200" y="280" width="48" height="16" rx="4" fill="#3b82f6"></rect>
12
+ </svg></svg></g></g><defs><clipPath id="SvgjsClipPath1015"><rect width="1000" height="1000" x="0" y="0" rx="350" ry="350"></rect></clipPath></defs></svg>
@@ -0,0 +1,12 @@
1
+ <svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="512" height="512" rx="128" fill="#000000"/>
3
+ <rect x="96" y="128" width="320" height="288" rx="16" fill="white"/>
4
+ <rect x="96" y="128" width="320" height="64" rx="16" fill="#3b82f6"/>
5
+ <line x1="176" y1="224" x2="176" y2="368" stroke="#e5e7eb" stroke-width="2"/>
6
+ <line x1="256" y1="224" x2="256" y2="368" stroke="#e5e7eb" stroke-width="2"/>
7
+ <line x1="336" y1="224" x2="336" y2="368" stroke="#e5e7eb" stroke-width="2"/>
8
+ <line x1="136" y1="264" x2="376" y2="264" stroke="#e5e7eb" stroke-width="2"/>
9
+ <line x1="136" y1="304" x2="376" y2="304" stroke="#e5e7eb" stroke-width="2"/>
10
+ <line x1="136" y1="344" x2="376" y2="344" stroke="#e5e7eb" stroke-width="2"/>
11
+ <rect x="200" y="280" width="48" height="16" rx="4" fill="#3b82f6"/>
12
+ </svg>
@@ -0,0 +1,77 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+
6
+ <!-- Content Security Policy (frame-ancestors only works via HTTP header, handled by X-Frame-Options in worker) -->
7
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' https://*.google.com https://*.outlook.com https://*.office365.com https://*.live.com https://*.icloud.com; worker-src 'self'; manifest-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self';">
8
+
9
+ <!-- Favicons -->
10
+ <link rel="icon" type="image/svg+xml" href="/icons/favicon.svg" />
11
+ <link rel="icon" type="image/png" sizes="96x96" href="/icons/favicon-96x96.png" />
12
+ <link rel="shortcut icon" href="/icons/favicon.ico" />
13
+
14
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
15
+
16
+ <!-- PWA Meta Tags -->
17
+ <link rel="manifest" href="/manifest.json">
18
+ <meta name="theme-color" content="#000000">
19
+ <meta name="mobile-web-app-capable" content="yes">
20
+ <meta name="apple-mobile-web-app-capable" content="yes">
21
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
22
+ <meta name="apple-mobile-web-app-title" content="BusiCal">
23
+ <link rel="apple-touch-icon" href="/icons/apple-touch-icon.png">
24
+
25
+ <meta name="description" content="Sync calendar events to your work calendar — with privacy">
26
+
27
+ <title>BusiCal - Sync Calendar Events</title>
28
+ <script type="module" crossorigin src="/assets/index-Dclvnqq8.js"></script>
29
+ <link rel="stylesheet" crossorigin href="/assets/index-BQ96LB2s.css">
30
+ </head>
31
+ <body>
32
+ <div id="root"></div>
33
+
34
+ <!-- Service Worker Registration with Update Detection -->
35
+ <script>
36
+ if ('serviceWorker' in navigator) {
37
+ let refreshing = false;
38
+
39
+ // Detect controller change and reload page
40
+ navigator.serviceWorker.addEventListener('controllerchange', () => {
41
+ if (refreshing) return;
42
+ refreshing = true;
43
+ window.location.reload();
44
+ });
45
+
46
+ window.addEventListener('load', () => {
47
+ navigator.serviceWorker.register('/sw.js')
48
+ .then(registration => {
49
+ console.log('SW registered:', registration);
50
+
51
+ // Check for updates periodically (every minute)
52
+ setInterval(() => {
53
+ registration.update();
54
+ }, 60000);
55
+
56
+ // Listen for waiting service worker
57
+ registration.addEventListener('updatefound', () => {
58
+ const newWorker = registration.installing;
59
+
60
+ newWorker.addEventListener('statechange', () => {
61
+ if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
62
+ // New service worker available - dispatch custom event
63
+ window.dispatchEvent(new CustomEvent('swUpdate', {
64
+ detail: { registration }
65
+ }));
66
+ }
67
+ });
68
+ });
69
+ })
70
+ .catch(error => {
71
+ console.log('SW registration failed:', error);
72
+ });
73
+ });
74
+ }
75
+ </script>
76
+ </body>
77
+ </html>
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "BusiCal",
3
+ "short_name": "BusiCal",
4
+ "description": "Sync calendar events to your work calendar — with privacy",
5
+ "start_url": "/",
6
+ "display": "standalone",
7
+ "theme_color": "#000000",
8
+ "background_color": "#ffffff",
9
+ "orientation": "portrait-primary",
10
+ "icons": [
11
+ {
12
+ "src": "/icons/web-app-manifest-192x192.png",
13
+ "sizes": "192x192",
14
+ "type": "image/png",
15
+ "purpose": "any"
16
+ },
17
+ {
18
+ "src": "/icons/web-app-manifest-192x192.png",
19
+ "sizes": "192x192",
20
+ "type": "image/png",
21
+ "purpose": "maskable"
22
+ },
23
+ {
24
+ "src": "/icons/web-app-manifest-512x512.png",
25
+ "sizes": "512x512",
26
+ "type": "image/png",
27
+ "purpose": "any"
28
+ },
29
+ {
30
+ "src": "/icons/web-app-manifest-512x512.png",
31
+ "sizes": "512x512",
32
+ "type": "image/png",
33
+ "purpose": "maskable"
34
+ }
35
+ ]
36
+ }
@@ -0,0 +1,27 @@
1
+ const VERSION = 'v0.1.3';
2
+
3
+ // Install event - skip waiting immediately (no caching)
4
+ self.addEventListener('install', (event) => {
5
+ console.log(`[SW ${VERSION}] Installing...`);
6
+ self.skipWaiting();
7
+ });
8
+
9
+ // Activate event - claim clients immediately
10
+ self.addEventListener('activate', (event) => {
11
+ console.log(`[SW ${VERSION}] Activating...`);
12
+ event.waitUntil(self.clients.claim());
13
+ });
14
+
15
+ // Fetch event - pass through (NO caching, always network)
16
+ self.addEventListener('fetch', (event) => {
17
+ // Always fetch from network, no cache fallback
18
+ // This ensures the app always gets fresh data and doesn't work offline
19
+ event.respondWith(fetch(event.request));
20
+ });
21
+
22
+ // Listen for messages from the client (for update handling)
23
+ self.addEventListener('message', (event) => {
24
+ if (event.data && event.data.type === 'SKIP_WAITING') {
25
+ self.skipWaiting();
26
+ }
27
+ });
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
@@ -0,0 +1,8 @@
1
+ {
2
+ "virtual:cloudflare/worker-entry": {
3
+ "file": "index.js",
4
+ "name": "index",
5
+ "src": "virtual:cloudflare/worker-entry",
6
+ "isEntry": true
7
+ }
8
+ }