diff --git a/frontend/app/color-preview/page.tsx b/frontend/app/color-preview/page.tsx deleted file mode 100644 index 7552806e..00000000 --- a/frontend/app/color-preview/page.tsx +++ /dev/null @@ -1,354 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import { AlertCircle, CheckCircle, AlertTriangle, Info, Package, Zap, Lock } from 'lucide-react'; - -const palettes = { - current: { - name: 'Current (Blue)', - description: 'Current OLED palette - High contrast, professional', - colors: { - background: '#0A0E27', - surface: '#1A1F3A', - foreground: '#F0F4F8', - secondary: '#C7D2E0', - muted: '#8B95AD', - primary: '#3B82F6', - success: '#10B981', - error: '#EF4444', - warning: '#F59E0B', - info: '#3B82F6', - } - }, - proposal1: { - name: 'Proposal 1: Green IoT', - description: 'Technical/IoT style - Dark with green status indicators', - colors: { - background: '#020617', - surface: '#0F172A', - foreground: '#F8FAFC', - secondary: '#CBD5E1', - muted: '#94A3B8', - primary: '#1E293B', - success: '#22C55E', - error: '#DC2626', - warning: '#F59E0B', - info: '#06B6D4', - } - }, - proposal2: { - name: 'Proposal 2: Indigo Orange', - description: 'Premium tech - Deep indigo with warm orange accents', - colors: { - background: '#0F0F23', - surface: '#1E1B4B', - foreground: '#F8FAFC', - secondary: '#C7D2E0', - muted: '#8B5CF6', - primary: '#312E81', - success: '#10B981', - error: '#EF4444', - warning: '#F97316', - info: '#8B5CF6', - } - }, - proposal3: { - name: 'Proposal 3: Slate Cyan', - description: 'Modern minimal - Slate with cyan tech accent', - colors: { - background: '#0F172A', - surface: '#1E293B', - foreground: '#F1F5F9', - secondary: '#CBD5E1', - muted: '#94A3B8', - primary: '#334155', - success: '#14B8A6', - error: '#F87171', - warning: '#FBBF24', - info: '#06B6D4', - } - } -}; - -export default function ColorPreview() { - const [selected, setSelected] = useState('current'); - const palette = palettes[selected]; - - return ( -
-
- {/* Header */} -
-

- Color Palette Preview -

-

- IT Inventory System - Compare color schemes -

-
- - {/* Palette Selector */} -
- {Object.entries(palettes).map(([key, p]) => ( - - ))} -
- - {/* Color Swatches */} -
-

- Color System -

-
- {Object.entries(palette.colors).map(([name, color]) => ( -
-
-
-
- {name} -
-
- {color} -
-
-
- ))} -
-
- - {/* Text Examples */} -
-

- Typography & Text Colors -

-
-
-
- Primary Text - Headlines, main content -
-
- Secondary Text - Supporting information, descriptions -
-
- Muted Text - Labels, captions, subtle information -
-
-
-
- - {/* Buttons */} -
-

- Interactive Elements -

-
- {/* Primary Button */} - - - {/* Secondary Button */} - - - {/* Ghost Button */} - -
-
- - {/* Cards */} -
-

- Cards & Containers -

-
- {/* Standard Card */} -
-
- - Storage Device -
-
- 1.6TB NVMe SSD • U.3 Connector -
-
- Part #: p66093-002 • Status: In Stock -
-
- - {/* Status Card */} -
-
- - Operational -
-
- System Status Normal -
-
- Last Updated: 2 minutes ago -
-
-
-
- - {/* Status Badges */} -
-

- Status Indicators & Semantic Colors -

-
- {/* Success */} -
- - - Success / Active - -
- - {/* Error */} -
- - - Error / Critical - -
- - {/* Warning */} -
- - - Warning / Caution - -
- - {/* Info */} -
- - - Info / Notice - -
-
-
- - {/* Form Elements */} -
-

- Form Elements -

-
-
- - -
- -
- - -
-
-
- - {/* Contrast Info */} -
-

- Contrast Ratios -

-
-
-
Foreground on Background
-
- Verified WCAG AAA -
-
-
-
Secondary on Background
-
- Verified WCAG AA -
-
-
-
Muted on Background
-
- Verified WCAG AA -
-
-
-
- - {/* Footer */} -
-

- This is a preview page for color palette comparison. Select a palette above to see how it looks across the entire UI. -

-

- URL: /color-preview — Not in main navigation. Visit this page directly to compare palettes. -

-
-
-
- ); -} diff --git a/frontend/docs/COLOR_PALETTE_PROPOSALS.md b/frontend/docs/COLOR_PALETTE_PROPOSALS.md deleted file mode 100644 index 1363dadc..00000000 --- a/frontend/docs/COLOR_PALETTE_PROPOSALS.md +++ /dev/null @@ -1,185 +0,0 @@ -# Color Palette Proposals for IT Inventory System - -**Preview Page:** Visit `/color-preview` to see all palettes side-by-side - -## Current Palette (Blue) -**Status:** In use -**Best for:** Professional, familiar, high contrast - -``` -Background: #0A0E27 (Deep Navy) -Surface: #1A1F3A (Slate) -Foreground: #F0F4F8 (Almost White) -Secondary: #C7D2E0 (Light Slate) -Muted: #8B95AD (Gray Blue) -Primary: #3B82F6 (Blue) -Success: #10B981 (Green) -Error: #EF4444 (Red) -Warning: #F59E0B (Amber) -Info: #3B82F6 (Blue) -``` - -**Strengths:** -- High contrast (WCAG AAA compliant) -- Professional appearance -- Familiar and proven in current use -- Consistent with Fira typography - -**Considerations:** -- Blue can feel corporate/cold -- Limited visual distinctiveness vs. competitors -- Primary accent is same as info color (redundant) - ---- - -## Proposal 1: Green IoT (Recommended for Inventory) -**Status:** Proposed -**Best for:** Technical/IoT systems, status indicators, operational tracking - -``` -Background: #020617 (Almost Black) -Surface: #0F172A (Deep Navy) -Foreground: #F8FAFC (Bright White) -Secondary: #CBD5E1 (Light Gray) -Muted: #94A3B8 (Medium Gray) -Primary: #1E293B (Dark Slate) -Success: #22C55E (Bright Green) -Error: #DC2626 (Deep Red) -Warning: #F59E0B (Amber) -Info: #06B6D4 (Cyan) -``` - -**Why This Works for IT Inventory:** -- **Green success color** - Excellent for "in stock", "operational" status -- **Higher contrast** - Better visibility for status indicators -- **Cyan info** - Distinct from success/error, good for informational content -- **Technical feel** - Aligns with IoT/infrastructure aesthetic -- **Inventory-friendly** - Green naturally suggests "ready" or "available" - -**Strengths:** -- Very high contrast (WCAG AAA++ -- Status colors are immediately recognizable -- Professional technical appearance -- Better visual hierarchy with green/red/cyan separation - -**Considerations:** -- Darker background might feel slightly less inviting initially -- Green accent is bolder than current approach -- Requires care with green/red for colorblind users (mitigated with icons) - ---- - -## Proposal 2: Indigo Orange (Premium Tech) -**Status:** Proposed -**Best for:** Modern, distinctive, premium feel - -``` -Background: #0F0F23 (Deep Indigo) -Surface: #1E1B4B (Dark Indigo) -Foreground: #F8FAFC (Bright White) -Secondary: #C7D2E0 (Light Slate) -Muted: #8B5CF6 (Purple) -Primary: #312E81 (Deep Indigo) -Success: #10B981 (Green) -Error: #EF4444 (Red) -Warning: #F97316 (Warm Orange) -Info: #8B5CF6 (Purple) -``` - -**Why This Works:** -- **Distinctive aesthetic** - Sets it apart from typical tech interfaces -- **Warm orange accent** - More inviting than cold blue/cyan -- **Premium feel** - Indigo + orange is luxe aesthetic -- **Personality** - Shows intentional design choice - -**Strengths:** -- Highly distinctive and memorable -- Warm accent feels more approachable -- Modern and sophisticated appearance -- Good visual contrast - -**Considerations:** -- Less conservative than current approach -- Indigo background might be harder to read in certain lighting -- Orange for warnings might confuse with success in some contexts -- Requires confident implementation - ---- - -## Proposal 3: Slate Cyan (Modern Minimal) -**Status:** Proposed -**Best for:** Clean, minimal aesthetic with technical flair - -``` -Background: #0F172A (Navy) -Surface: #1E293B (Slate) -Foreground: #F1F5F9 (Off White) -Secondary: #CBD5E1 (Light Slate) -Muted: #94A3B8 (Medium Slate) -Primary: #334155 (Dark Slate) -Success: #14B8A6 (Teal/Cyan) -Error: #F87171 (Light Red) -Warning: #FBBF24 (Golden Amber) -Info: #06B6D4 (Bright Cyan) -``` - -**Why This Works:** -- **Minimal aesthetic** - Less color saturation, more subtle -- **Cyan accents** - Modern tech feel without being too bold -- **Teal success** - Soft but distinct -- **Professional** - Balances between current and bolder proposals - -**Strengths:** -- Clean and contemporary -- Cyan colors feel technical and modern -- All-slate primary removes confusion -- Safe but still distinctive - -**Considerations:** -- Teal success (cyan) might blend with cyan info -- Less visual impact than Proposal 1 -- Warning and info colors somewhat similar -- Between current and bold proposals - ---- - -## Recommendation - -**For an IT Inventory System, I recommend: Proposal 1 (Green IoT)** - -**Reasons:** -1. **Status colors align with domain** - Green = "in stock", "ready", "operational" -2. **Better accessibility** - Higher contrast + clearer semantic meaning -3. **Technical credibility** - IoT/infrastructure aesthetic fits inventory tracking -4. **Inventory-specific UX** - Users will immediately understand status colors -5. **Minimal implementation burden** - Only color token changes, no layout changes -6. **WCAG AAA compliant** - Highest accessibility standard -7. **Inventory psychology** - Green naturally suggests availability/supply - -**Alternative if you prefer distinctiveness:** -Proposal 2 (Indigo Orange) if you want a premium, memorable appearance that stands out. - ---- - -## Implementation Plan (If Approved) - -1. Update `tailwind.config.ts` color tokens -2. Run bulk sed replacements (like before) -3. Test on all pages (home, inventory, logs, admin) -4. Verify accessibility with Lighthouse -5. Commit: "refactor(design): implement new color palette" - -**Estimated time:** 1-2 hours including testing - ---- - -## Testing Checklist Before Final Approval - -- [ ] View `/color-preview` page -- [ ] Check text readability at different brightness levels -- [ ] Review status colors in context (green for success, red for error) -- [ ] Verify green/red distinction for colorblind users -- [ ] Consider personal preference vs. inventory domain fit -- [ ] Compare with competitors (if applicable) - -**Next step:** Visit `/color-preview` to preview all options, then let me know which direction you prefer! diff --git a/frontend/public/sw.js b/frontend/public/sw.js index fb8e0a9c..0150653c 100644 --- a/frontend/public/sw.js +++ b/frontend/public/sw.js @@ -1 +1 @@ -if(!self.define){let e,s={};const n=(n,a)=>(n=new URL(n+".js",a).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(a,t)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(s[c])return;let i={};const r=e=>n(e,c),o={module:{uri:c},exports:i,require:r};s[c]=Promise.all(a.map(e=>o[e]||r(e))).then(e=>(t(...e),i))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"75b9e3f126763089f704b36ed9c35f39"},{url:"/_next/static/chunks/13.ae2fd9645430ed90.js",revision:"ae2fd9645430ed90"},{url:"/_next/static/chunks/255-4f212684648fcab9.js",revision:"4f212684648fcab9"},{url:"/_next/static/chunks/374-a4ed2a0d861d9cab.js",revision:"a4ed2a0d861d9cab"},{url:"/_next/static/chunks/4bd1b696-c023c6e3521b1417.js",revision:"c023c6e3521b1417"},{url:"/_next/static/chunks/512-ce90bee899e5ddb3.js",revision:"ce90bee899e5ddb3"},{url:"/_next/static/chunks/734-20d0b46905ff0127.js",revision:"20d0b46905ff0127"},{url:"/_next/static/chunks/7cb1fa1f-32fc9056ac653916.js",revision:"32fc9056ac653916"},{url:"/_next/static/chunks/802-838213ff73429b14.js",revision:"838213ff73429b14"},{url:"/_next/static/chunks/814-d4585cd22c8d1c30.js",revision:"d4585cd22c8d1c30"},{url:"/_next/static/chunks/app/_not-found/page-32814a613bf1bbe9.js",revision:"32814a613bf1bbe9"},{url:"/_next/static/chunks/app/admin/page-fd9f8428db5049be.js",revision:"fd9f8428db5049be"},{url:"/_next/static/chunks/app/inventory/page-4afb0b0035e4216b.js",revision:"4afb0b0035e4216b"},{url:"/_next/static/chunks/app/layout-61972fdaeb813508.js",revision:"61972fdaeb813508"},{url:"/_next/static/chunks/app/login/page-8740513bf9f96639.js",revision:"8740513bf9f96639"},{url:"/_next/static/chunks/app/logs/page-3d1dd93723833ec9.js",revision:"3d1dd93723833ec9"},{url:"/_next/static/chunks/app/page-a28b7fe1d0caeb00.js",revision:"a28b7fe1d0caeb00"},{url:"/_next/static/chunks/framework-050c1f32293f7182.js",revision:"050c1f32293f7182"},{url:"/_next/static/chunks/main-aa573100fdde0547.js",revision:"aa573100fdde0547"},{url:"/_next/static/chunks/main-app-290572149fe5c423.js",revision:"290572149fe5c423"},{url:"/_next/static/chunks/pages/_app-7d307437aca18ad4.js",revision:"7d307437aca18ad4"},{url:"/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js",revision:"cb2a52f75f2162e2"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-7a9cf6b863b8c67d.js",revision:"7a9cf6b863b8c67d"},{url:"/_next/static/css/927d2fe04ec26e35.css",revision:"927d2fe04ec26e35"},{url:"/_next/static/orkHZmfsyqRBd23tVc91f/_buildManifest.js",revision:"31eba5c94d685fe15b2d866310094bce"},{url:"/_next/static/orkHZmfsyqRBd23tVc91f/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/custom-logo.png",revision:"d41d8cd98f00b204e9800998ecf8427e"},{url:"/icons/icon-192x192.png",revision:"bde7fc04fd83ed65ce0e71259f4574b5"},{url:"/icons/icon-512x512.png",revision:"0c2346ba1775af7af6ec2e346ee7c72e"},{url:"/icons/maskable-icon.png",revision:"0c2346ba1775af7af6ec2e346ee7c72e"},{url:"/logo.png",revision:"084f394cfe19b7d85abec9878a797795"},{url:"/logo_TFM.png",revision:"084f394cfe19b7d85abec9878a797795"},{url:"/manifest.json",revision:"7b6e42d577201b657b72b8698d44d0b2"},{url:"/network.json",revision:"ce173a00263b4f64c8c05fe22ef7c54f"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:n,state:a})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); +if(!self.define){let e,s={};const n=(n,a)=>(n=new URL(n+".js",a).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(a,c)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let t={};const r=e=>n(e,i),o={module:{uri:i},exports:t,require:r};s[i]=Promise.all(a.map(e=>o[e]||r(e))).then(e=>(c(...e),t))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"0735dfec616d160b9af9669387c706cb"},{url:"/_next/static/chunks/13.ae2fd9645430ed90.js",revision:"ae2fd9645430ed90"},{url:"/_next/static/chunks/255-4f212684648fcab9.js",revision:"4f212684648fcab9"},{url:"/_next/static/chunks/374-a4ed2a0d861d9cab.js",revision:"a4ed2a0d861d9cab"},{url:"/_next/static/chunks/4bd1b696-c023c6e3521b1417.js",revision:"c023c6e3521b1417"},{url:"/_next/static/chunks/512-ce90bee899e5ddb3.js",revision:"ce90bee899e5ddb3"},{url:"/_next/static/chunks/734-20d0b46905ff0127.js",revision:"20d0b46905ff0127"},{url:"/_next/static/chunks/7cb1fa1f-32fc9056ac653916.js",revision:"32fc9056ac653916"},{url:"/_next/static/chunks/802-838213ff73429b14.js",revision:"838213ff73429b14"},{url:"/_next/static/chunks/814-d4585cd22c8d1c30.js",revision:"d4585cd22c8d1c30"},{url:"/_next/static/chunks/app/_not-found/page-32814a613bf1bbe9.js",revision:"32814a613bf1bbe9"},{url:"/_next/static/chunks/app/admin/page-fd9f8428db5049be.js",revision:"fd9f8428db5049be"},{url:"/_next/static/chunks/app/color-preview/page-29f65f2099e31bcc.js",revision:"29f65f2099e31bcc"},{url:"/_next/static/chunks/app/inventory/page-4afb0b0035e4216b.js",revision:"4afb0b0035e4216b"},{url:"/_next/static/chunks/app/layout-61972fdaeb813508.js",revision:"61972fdaeb813508"},{url:"/_next/static/chunks/app/login/page-8740513bf9f96639.js",revision:"8740513bf9f96639"},{url:"/_next/static/chunks/app/logs/page-3d1dd93723833ec9.js",revision:"3d1dd93723833ec9"},{url:"/_next/static/chunks/app/page-2317ba3eb5c2fab8.js",revision:"2317ba3eb5c2fab8"},{url:"/_next/static/chunks/framework-050c1f32293f7182.js",revision:"050c1f32293f7182"},{url:"/_next/static/chunks/main-aa573100fdde0547.js",revision:"aa573100fdde0547"},{url:"/_next/static/chunks/main-app-290572149fe5c423.js",revision:"290572149fe5c423"},{url:"/_next/static/chunks/pages/_app-7d307437aca18ad4.js",revision:"7d307437aca18ad4"},{url:"/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js",revision:"cb2a52f75f2162e2"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-7a9cf6b863b8c67d.js",revision:"7a9cf6b863b8c67d"},{url:"/_next/static/css/8bb44c41b1b0efa9.css",revision:"8bb44c41b1b0efa9"},{url:"/_next/static/kppsXTile8-zGiZl4ha_l/_buildManifest.js",revision:"ba6ac79a3c788736240d3780db9bc9bc"},{url:"/_next/static/kppsXTile8-zGiZl4ha_l/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/custom-logo.png",revision:"d41d8cd98f00b204e9800998ecf8427e"},{url:"/icons/icon-192x192.png",revision:"bde7fc04fd83ed65ce0e71259f4574b5"},{url:"/icons/icon-512x512.png",revision:"0c2346ba1775af7af6ec2e346ee7c72e"},{url:"/icons/maskable-icon.png",revision:"0c2346ba1775af7af6ec2e346ee7c72e"},{url:"/logo.png",revision:"084f394cfe19b7d85abec9878a797795"},{url:"/logo_TFM.png",revision:"084f394cfe19b7d85abec9878a797795"},{url:"/manifest.json",revision:"7b6e42d577201b657b72b8698d44d0b2"},{url:"/network.json",revision:"ce173a00263b4f64c8c05fe22ef7c54f"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:n,state:a})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")});