From 096daffb3e6f43670617813b1aa24cf6d14ec1b5 Mon Sep 17 00:00:00 2001 From: robin Date: Mon, 19 Jan 2026 22:26:21 +0100 Subject: [PATCH] feat: Upgrade to Tailwind CSS v4.1.18 - Migrate from tailwindcss v3.3 to v4.1.18 - Replace @tailwind directives with @import 'tailwindcss' - Move custom colors to @theme block in globals.css - Convert custom utilities to @utility syntax - Update PostCSS config to use @tailwindcss/postcss - Remove autoprefixer (now built-in) --- distillery_tags_results.json | 194 +++---- next-env.d.ts | 2 +- package.json | 4 +- pnpm-lock.yaml | 567 ++++++++++--------- postcss.config.js | 3 +- src/app/admin/banners/BannerManager.tsx | 10 +- src/app/admin/bottles/AdminBottlesList.tsx | 14 +- src/app/admin/ocr-logs/page.tsx | 26 +- src/app/admin/page.tsx | 16 +- src/app/admin/sessions/AdminSessionsList.tsx | 6 +- src/app/admin/splits/AdminSplitsList.tsx | 12 +- src/app/admin/tags/page.tsx | 6 +- src/app/admin/tastings/AdminTastingsList.tsx | 10 +- src/app/admin/users/page.tsx | 8 +- src/app/buddies/page.tsx | 4 +- src/app/globals.css | 111 ++-- src/app/page.tsx | 4 +- src/app/sessions/[id]/page.tsx | 6 +- src/app/sessions/page.tsx | 4 +- src/app/splits/[slug]/page.tsx | 2 +- src/app/splits/manage/page.tsx | 2 +- src/components/ActiveSessionBanner.tsx | 2 +- src/components/AuthForm.tsx | 8 +- src/components/AvatarStack.tsx | 4 +- src/components/BottleDetails.tsx | 10 +- src/components/BottleGrid.tsx | 12 +- src/components/BottleSkeletonCard.tsx | 8 +- src/components/BuddyHandshake.tsx | 4 +- src/components/BuddyList.tsx | 6 +- src/components/BulkScanSheet.tsx | 4 +- src/components/CameraCapture.tsx | 2 +- src/components/CookieBanner.tsx | 2 +- src/components/DramOfTheDay.tsx | 2 +- src/components/EditBottleForm.tsx | 24 +- src/components/FloatingScannerButton.tsx | 2 +- src/components/HeroBanner.tsx | 2 +- src/components/LanguageSwitcher.tsx | 4 +- src/components/NativeOCRScanner.tsx | 8 +- src/components/OnboardingTutorial.tsx | 2 +- src/components/PasswordChangeForm.tsx | 4 +- src/components/PlanManagementClient.tsx | 22 +- src/components/ProfileForm.tsx | 2 +- src/components/ResultCard.tsx | 4 +- src/components/ScanAndTasteFlow.tsx | 6 +- src/components/SessionBottomSheet.tsx | 6 +- src/components/SessionList.tsx | 8 +- src/components/SessionTimeline.tsx | 6 +- src/components/SplitCard.tsx | 2 +- src/components/SplitProgressBar.tsx | 8 +- src/components/TagSelector.tsx | 4 +- src/components/TastingEditor.tsx | 34 +- src/components/TastingFormBody.tsx | 6 +- src/components/TastingHub.tsx | 6 +- src/components/TastingList.tsx | 4 +- src/components/TastingNoteForm.tsx | 2 +- src/components/UploadQueue.tsx | 2 +- src/components/UserManagementClient.tsx | 20 +- src/services/analyze-bottle-mistral.ts | 2 +- tailwind.config.ts | 37 -- 59 files changed, 661 insertions(+), 641 deletions(-) delete mode 100644 tailwind.config.ts diff --git a/distillery_tags_results.json b/distillery_tags_results.json index f96c6c1..9bfec1e 100644 --- a/distillery_tags_results.json +++ b/distillery_tags_results.json @@ -160,7 +160,7 @@ "oily", "medium-full body", "silky", - "rounded", + "rounded-sm", "balanced", "smooth", "slightly warming", @@ -774,7 +774,7 @@ ], "texture": [ "oily and waxy", - "creamy and rounded", + "creamy and rounded-sm", "medium weight", "silky with a gentle grip", "well-structured balancing sweetness and dryness", @@ -880,7 +880,7 @@ "oily", "viscous", "silky", - "rounded", + "rounded-sm", "balanced", "medium-bodied", "slightly-dry", @@ -1038,7 +1038,7 @@ "polished", "well-integrated", "slightly oily", - "rounded", + "rounded-sm", "smooth", "lively" ] @@ -1235,7 +1235,7 @@ "softly effervescent", "polished oak feel", "refreshingly bright", - "lean yet rounded" + "lean yet rounded-sm" ] }, "Aultmore": { @@ -1527,7 +1527,7 @@ "creamy", "silky", "oily", - "rounded", + "rounded-sm", "polished", "mellow", "gentle", @@ -1588,7 +1588,7 @@ "Lingering sea-salt", "Sweet lemon", "Lime zest", - "Dried apple ring", + "Dried apple ring-3", "Vanilla oak", "Gentle oak tannin", "Black pepper", @@ -1883,7 +1883,7 @@ "polished", "slightly resinous", "lively oak spice", - "rounded", + "rounded-sm", "structured", "sappy (young oak feel)" ] @@ -2001,7 +2001,7 @@ "oily", "creamy", "silky", - "rounded", + "rounded-sm", "medium-bodied", "polished", "gently spirity", @@ -2156,7 +2156,7 @@ "oily", "creamy", "medium to full-bodied", - "rounded", + "rounded-sm", "silky", "slightly waxy", "balanced", @@ -2415,7 +2415,7 @@ "grippy", "structured tannins", "cask-driven", - "rounded", + "rounded-sm", "balanced", "robust", "powerful", @@ -2544,7 +2544,7 @@ "waxy", "silky", "rich", - "rounded", + "rounded-sm", "medium-to-full bodied", "coating", "smooth", @@ -2781,7 +2781,7 @@ "light-to-medium body", "soft", "polished", - "rounded", + "rounded-sm", "well-structured", "approachable", "gentle", @@ -2868,7 +2868,7 @@ "creamy toffee and caramelized sugar", "vanilla oak spicing (cinnamon, white pepper)", "nutty undertones (almond, hazelnut)", - "soft rounded bitterness (cocoa nibs, orange marmalade)", + "soft rounded-sm bitterness (cocoa nibs, orange marmalade)", "mild stone fruit (apricot) and dried sultana", "waxy orchard skin texture and gentle oiliness", "cereal maltiness with a slight biscuit edge", @@ -2888,7 +2888,7 @@ ], "texture": [ "waxy mouthfeel that softens with age", - "creamy and rounded", + "creamy and rounded-sm", "oily yet clean, not heavy", "slightly coating but not syrupy", "polished oak structure underneath", @@ -2992,7 +2992,7 @@ "polished oak", "soft tannins", "gentle heat", - "rounded", + "rounded-sm", "clean", "crisp", "gliding", @@ -3591,7 +3591,7 @@ "silky", "medium-bodied", "slightly oily", - "rounded", + "rounded-sm", "well-integrated alcohol", "polished tannins", "sprightly", @@ -3820,7 +3820,7 @@ "viscous", "creamy", "velvety", - "rounded mouthfeel", + "rounded-sm mouthfeel", "slightly chewy", "resinous", "warming", @@ -4776,7 +4776,7 @@ "silky", "oily", "creamy", - "rounded", + "rounded-sm", "balanced", "medium-bodied", "spry", @@ -5066,7 +5066,7 @@ "well-balanced", "medium-to-full body", "coating", - "rounded", + "rounded-sm", "polished", "lively", "gentle", @@ -5424,7 +5424,7 @@ "smooth", "creamy", "soft", - "rounded", + "rounded-sm", "medium-bodied", "polished", "well-balanced", @@ -5602,7 +5602,7 @@ "quiet floral echo (heather)" ], "texture": [ - "creamy and rounded", + "creamy and rounded-sm", "silky with gentle oiliness", "medium body, never heavy", "polished oak grip (fine-grained tannins)", @@ -5861,7 +5861,7 @@ "oily", "creamy", "velvety", - "rounded", + "rounded-sm", "medium-bodied", "approachable", "slightly waxy", @@ -6002,7 +6002,7 @@ "smooth", "silky", "slightly waxy", - "rounded", + "rounded-sm", "gentle", "well-balanced", "not overly viscous", @@ -6070,7 +6070,7 @@ "silky", "oily (light)", "soft", - "rounded", + "rounded-sm", "clean", "crisp", "approachable", @@ -6230,7 +6230,7 @@ "waxy", "silky", "medium-weight", - "rounded", + "rounded-sm", "well-structured", "balanced", "clean", @@ -6427,7 +6427,7 @@ "waxy-coated", "chalky/mineral grip", "well-structured", - "rounded and balanced", + "rounded-sm and balanced", "smooth entry", "zesty lift", "slightly drying oak" @@ -6507,7 +6507,7 @@ "waxy", "silky", "medium-bodied", - "rounded", + "rounded-sm", "slightly resinous", "prickly spice", "chewy", @@ -7021,7 +7021,7 @@ "oily", "waxy", "coastal mouthfeel", - "rounded", + "rounded-sm", "balanced", "creamy", "silky", @@ -7265,7 +7265,7 @@ "smooth and approachable", "medium-bodied", "slightly oily", - "soft and rounded", + "soft and rounded-sm", "creamy", "well-integrated alcohol", "gentle spice", @@ -7648,7 +7648,7 @@ "Slightly prickly", "Weighty yet agile", "Chewy", - "Soft and rounded", + "Soft and rounded-sm", "Peppery heat" ] }, @@ -7949,7 +7949,7 @@ "waxy / coating", "oily", "medium-bodied", - "softly rounded", + "softly rounded-sm", "creamy", "silky", "slightly drying", @@ -8003,7 +8003,7 @@ "oily and resinous", "creamy and luscious", "viscous mouthfeel", - "rounded and polished", + "rounded-sm and polished", "silky with grip", "balanced warmth", "velvety oak", @@ -8145,7 +8145,7 @@ "silky", "creamy", "oily", - "rounded", + "rounded-sm", "plush", "well-integrated", "velvety", @@ -8258,12 +8258,12 @@ "dry, gently cereal/biscuity tail", "clean, crisp acidity (a touch of citrus)", "overall dryness in later stages", - "no sulphur, very smooth and rounded" + "no sulphur, very smooth and rounded-sm" ], "texture": [ "smooth and approachable", "medium-bodied", - "creamy and rounded", + "creamy and rounded-sm", "silky and polished", "slightly oily in the glass but light on the palate", "well-balanced", @@ -8319,7 +8319,7 @@ "smooth with a gentle prickle", "soft and approachable", "salty tactile impression", - "rounded oak structure without heaviness", + "rounded-sm oak structure without heaviness", "clean, brisk progression across the palate" ] }, @@ -8758,7 +8758,7 @@ "silky", "slightly chewy", "polished", - "rounded", + "rounded-sm", "balanced", "approachable", "maritime grip", @@ -9322,7 +9322,7 @@ "creamy", "oily", "waxy", - "rounded", + "rounded-sm", "smooth", "soft", "mouth-coating", @@ -9687,7 +9687,7 @@ "polished", "slightly oily", "creamy", - "rounded", + "rounded-sm", "well-balanced", "slightly drying", "crisp", @@ -9850,7 +9850,7 @@ "silky", "creamy", "velvety", - "rounded", + "rounded-sm", "medium-bodied", "oily", "polished", @@ -9919,7 +9919,7 @@ "Clean and medium length", "Subtle coconut", "A touch of herbal freshness", - "Smooth and rounded close", + "Smooth and rounded-sm close", "Fading floral note" ], "texture": [ @@ -9929,7 +9929,7 @@ "Soft and approachable", "Slightly oily", "Polished", - "Even and rounded", + "Even and rounded-sm", "Mellow", "Clean and fresh", "Non-aggressive" @@ -10140,7 +10140,7 @@ "creamy", "well-integrated alcohol", "polished oak influence", - "soft and rounded", + "soft and rounded-sm", "gently warming", "bright and lively", "clean and crisp" @@ -10267,7 +10267,7 @@ "prickly pepper", "well-integrated heat", "chewy", - "rounded", + "rounded-sm", "silky", "moderately weighted" ] @@ -10409,7 +10409,7 @@ "medium-bodied", "well-integrated alcohol", "polished oak", - "rounded", + "rounded-sm", "luscious", "slightly viscous", "smooth" @@ -10749,7 +10749,7 @@ "thick", "viscous", "mouth-coating", - "rounded", + "rounded-sm", "well-integrated", "polished", "slightly drying", @@ -10845,7 +10845,7 @@ "smooth", "fresh", "sprightly", - "rounded" + "rounded-sm" ] }, "Jameson": { @@ -10920,7 +10920,7 @@ "creamy", "velvety", "oily", - "rounded", + "rounded-sm", "mellow", "balanced", "soft", @@ -11185,7 +11185,7 @@ "waxy, candle-wax polish tone in older bottlings" ], "texture": [ - "creamy, silky and rounded mouthfeel", + "creamy, silky and rounded-sm mouthfeel", "viscous and coating (especially single pot still proofs)", "slightly oily and waxy", "buttery and smooth (vanilla custard texture)", @@ -11489,7 +11489,7 @@ ], "texture": [ "Creamy", - "Silky and rounded", + "Silky and rounded-sm", "Medium viscosity", "Oiliness that coats the palate", "Soft and approachable", @@ -11868,7 +11868,7 @@ "well-balanced", "lightly oily yet clean", "medium-bodied", - "rounded and cohesive", + "rounded-sm and cohesive", "soft-spiced", "refreshing acidity", "velvety oak impression", @@ -12021,7 +12021,7 @@ "elegant and restrained", "refined and precise", "high-definition clarity", - "smooth, rounded edges", + "smooth, rounded-sm edges", "spry acidity (citrus lift)", "tight-grained oak feel", "lifted and airy", @@ -12044,7 +12044,7 @@ "hint of coconut and banana from Mizunara/inactive oak" ], "taste": [ - "soft, rounded mouthfeel", + "soft, rounded-sm mouthfeel", "orchard fruit sweetness (pear, apple)", "peach and apricot preserve", "light floral notes (lilac, jasmine)", @@ -12072,7 +12072,7 @@ "texture": [ "silky and smooth", "light to medium body", - "crisp yet rounded", + "crisp yet rounded-sm", "polished and clean", "well-integrated alcohol", "slightly oily with a fresh core", @@ -12226,7 +12226,7 @@ "Subtle smoke/char - faint ex-bourbon and Mizunara influence" ], "taste": [ - "Velvety malt - soft, rounded mid-palate", + "Velvety malt - soft, rounded-sm mid-palate", "Pear and Nashi fruit - clean orchard sweetness", "White peach and apricot - gentle stone fruit", "Citrus zest - lemon and yuzu acidity for balance", @@ -12615,7 +12615,7 @@ "creamy", "silky", "smooth", - "rounded", + "rounded-sm", "balanced", "firm", "robust", @@ -12764,7 +12764,7 @@ "silky", "full-bodied", "rich", - "rounded", + "rounded-sm", "chewy", "polished", "luscious", @@ -12848,7 +12848,7 @@ "rich", "viscous", "structured", - "rounded", + "rounded-sm", "bold", "smooth", "dense", @@ -12985,7 +12985,7 @@ "chewy", "well-structured", "balanced", - "rounded", + "rounded-sm", "warming", "spicy prickle", "smooth", @@ -13067,7 +13067,7 @@ "hot and vibrant", "slightly prickly", "buttery", - "rounded and integrated", + "rounded-sm and integrated", "unctuous", "mouth-filling", "thick pour" @@ -13176,7 +13176,7 @@ "dense", "full-bodied", "rich", - "rounded", + "rounded-sm", "well-integrated", "balanced", "layered", @@ -13273,7 +13273,7 @@ "creamy", "oily", "medium-bodied", - "rounded", + "rounded-sm", "slightly spicy", "warm", "velvety", @@ -13338,7 +13338,7 @@ "luscious", "chewy", "rich", - "rounded" + "rounded-sm" ] }, "Elijah Craig": { @@ -13719,7 +13719,7 @@ "chewy", "syrupy", "rich", - "rounded", + "rounded-sm", "coating", "smooth", "balanced", @@ -13821,7 +13821,7 @@ "velvety", "silky", "chewy", - "rounded", + "rounded-sm", "well-integrated", "balanced", "smooth", @@ -13966,7 +13966,7 @@ "smooth", "creamy", "oily", - "rounded", + "rounded-sm", "balanced", "mellow", "slightly viscous", @@ -14118,7 +14118,7 @@ "creamy", "velvety", "oily", - "rounded", + "rounded-sm", "syrupy", "chewy", "medium-bodied", @@ -14224,7 +14224,7 @@ "spirited", "well-integrated", "structured", - "rounded", + "rounded-sm", "luscious", "layered", "viscous", @@ -14365,7 +14365,7 @@ "Creamy mouthfeel", "Dense and rich", "Syrupy sweetness balanced by oak", - "Soft and rounded", + "Soft and rounded-sm", "Velvety tannins", "Warming spice prickle", "Chewy and substantial", @@ -14506,7 +14506,7 @@ "full-bodied", "rich", "coating", - "rounded", + "rounded-sm", "dense", "bold", "thick", @@ -14592,7 +14592,7 @@ "chewy", "rich", "well-integrated", - "rounded", + "rounded-sm", "luscious", "dense", "polished", @@ -14818,7 +14818,7 @@ "Luscious and succulent", "Polished and well-integrated", "Silky with a subtle grip", - "Buttery and rounded", + "Buttery and rounded-sm", "Warm and enveloping", "Concentrated and intense" ] @@ -14870,7 +14870,7 @@ "Oiliness from pot still character", "Creamy mouthfeel with soft oak grip", "Slightly viscous with tropical weight", - "Polished and rounded tannins", + "Polished and rounded-sm tannins", "Bright but not sharp, approachable", "Warming spice prickle", "Creamy vanilla custard texture", @@ -14931,7 +14931,7 @@ "polished oak texture", "brine-tinged grip", "cocoa-dusted smoothness", - "rounded yet angular spice", + "rounded-sm yet angular spice", "medium-to-full bodied", "lively pepper-prickly sensation" ] @@ -15027,7 +15027,7 @@ "syrupy and viscous", "silky and velvety", "coating and mouth-coating", - "rounded and plush", + "rounded-sm and plush", "spicy-prickly (white pepper)", "warming yet refreshing", "balanced heat from virgin oak", @@ -15152,7 +15152,7 @@ "oily (coat the palate)", "slightly syrupy", "well-integrated alcohol", - "rounded oak texture", + "rounded-sm oak texture", "polished tannin", "creamy (from vanilla/caramel)", "bright acidity (wine-cask lift)" @@ -15706,7 +15706,7 @@ ], "texture": [ "Silky and creamy mouthfeel", - "Medium body with a rounded profile", + "Medium body with a rounded-sm profile", "Polished and gently coating", "Juicy fruit sensation", "Slightly waxy on the mid-palate", @@ -15955,7 +15955,7 @@ "balanced dryness without harsh astringency" ], "texture": [ - "silky and rounded mouthfeel", + "silky and rounded-sm mouthfeel", "medium body, neither oily nor watery", "slightly waxy on the palate", "creamy texture reminiscent of crème anglaise", @@ -16073,7 +16073,7 @@ "well-integrated alcohol", "slightly drying", "silky", - "rounded mouthfeel", + "rounded-sm mouthfeel", "soft and approachable", "polished oak" ] @@ -16133,7 +16133,7 @@ "texture": [ "silky", "oily", - "rounded", + "rounded-sm", "well-balanced", "moderately creamy", "polished", @@ -16253,7 +16253,7 @@ "smooth and approachable", "concentrated and dense", "chalky-dry towards the end", - "rounded but structured", + "rounded-sm but structured", "supple with a citrusy cut", "polished oak texture" ] @@ -16310,11 +16310,11 @@ "full-bodied for low ABV", "effervescent prickle", "sprightly zing", - "smooth and rounded", + "smooth and rounded-sm", "viscous syrup", "well-integrated heat", "slightly waxy", - "rounded mouthfeel" + "rounded-sm mouthfeel" ] }, "Berry Bros & Rudd": { @@ -16374,7 +16374,7 @@ "silky/velvety mid-palate", "medium-bodied and balanced", "slightly oily with grip", - "crisp yet rounded", + "crisp yet rounded-sm", "chalky/mineral edge", "polished oak feel", "creamy without being heavy", @@ -16678,7 +16678,7 @@ "medium-bodied", "slightly oily", "polished", - "rounded", + "rounded-sm", "well-integrated alcohol", "soft", "crisp", @@ -17228,7 +17228,7 @@ "dense", "oily-tear legs", "weighty", - "rounded", + "rounded-sm", "polished", "plush", "satiny", @@ -17396,7 +17396,7 @@ "clean smoke / ember whisper" ], "texture": [ - "smooth and rounded", + "smooth and rounded-sm", "silky / velvety", "creamy (reminiscent of crème anglaise)", "medium-bodied and well-balanced", @@ -17444,7 +17444,7 @@ "gentle peat (whisper)" ], "finish": [ - "smooth and rounded", + "smooth and rounded-sm", "lingering honey", "soft oak", "dried fruit sultanas", @@ -17461,7 +17461,7 @@ "creamy", "well-balanced", "soft", - "rounded", + "rounded-sm", "slightly oily", "polished", "approachable", @@ -17532,7 +17532,7 @@ ], "texture": [ "smooth and polished", - "creamy and rounded", + "creamy and rounded-sm", "medium-bodied and balanced", "silky mouthfeel", "well-integrated alcohol (no harshness)", @@ -17640,7 +17640,7 @@ "butterscotch" ], "finish": [ - "smooth and rounded", + "smooth and rounded-sm", "medium length", "lingering honey and vanilla", "sweet oak and gentle spice", @@ -17769,7 +17769,7 @@ "balanced sweetness and spice" ], "finish": [ - "smooth and rounded", + "smooth and rounded-sm", "lingering smokiness", "creamy vanilla", "oak-driven warmth", @@ -17790,7 +17790,7 @@ "velvety", "silky", "medium-bodied", - "rounded", + "rounded-sm", "oily", "smooth", "soft", @@ -17866,7 +17866,7 @@ "approachable", "smooth", "sprightly", - "rounded mouthfeel", + "rounded-sm mouthfeel", "gentle" ] }, @@ -17930,7 +17930,7 @@ "texture": [ "creamy", "oily", - "rounded", + "rounded-sm", "full-bodied", "silky", "weighted", @@ -17989,7 +17989,7 @@ "creamy and velvety", "oily and coating", "waxy and beeswax-like", - "rounded and mellow", + "rounded-sm and mellow", "medium-bodied and balanced", "silky and smooth", "slightly drying oak", diff --git a/next-env.d.ts b/next-env.d.ts index c4b7818..9edff1c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/package.json b/package.json index fa1b438..cd04eb1 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ }, "devDependencies": { "@playwright/test": "^1.57.0", + "@tailwindcss/postcss": "^4.1.18", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.1", "@types/node": "^20", @@ -51,13 +52,12 @@ "@types/react-dom": "^19.0.0", "@types/uuid": "^10.0.0", "@vitejs/plugin-react": "^5.1.2", - "autoprefixer": "^10.0.1", "eslint": "^8", "eslint-config-next": "16.1.0", "eslint-plugin-security": "^2.1.1", "jsdom": "^27.3.0", "postcss": "^8", - "tailwindcss": "^3.3.0", + "tailwindcss": "^4.1.18", "typescript": "^5", "vitest": "^4.0.16" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ae9a22..9c51a23 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,6 +99,9 @@ importers: '@playwright/test': specifier: ^1.57.0 version: 1.57.0 + '@tailwindcss/postcss': + specifier: ^4.1.18 + version: 4.1.18 '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -119,10 +122,7 @@ importers: version: 10.0.0 '@vitejs/plugin-react': specifier: ^5.1.2 - version: 5.1.2(vite@7.3.0(@types/node@20.19.27)(jiti@1.21.7)(terser@5.46.0)) - autoprefixer: - specifier: ^10.0.1 - version: 10.4.23(postcss@8.5.6) + version: 5.1.2(vite@7.3.0(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)) eslint: specifier: ^8 version: 8.57.1 @@ -139,14 +139,14 @@ importers: specifier: ^8 version: 8.5.6 tailwindcss: - specifier: ^3.3.0 - version: 3.4.19 + specifier: ^4.1.18 + version: 4.1.18 typescript: specifier: ^5 version: 5.9.3 vitest: specifier: ^4.0.16 - version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@20.19.27)(jiti@1.21.7)(jsdom@27.3.0)(terser@5.46.0) + version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@20.19.27)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(terser@5.46.0) packages: @@ -1305,6 +1305,94 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.18': + resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} + '@tanstack/query-core@5.90.12': resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} @@ -1770,16 +1858,10 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1833,13 +1915,6 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - autoprefixer@10.4.23: - resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1961,10 +2036,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - caniuse-lite@1.0.30001760: resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} @@ -2017,10 +2088,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -2045,11 +2112,6 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - cssstyle@5.3.5: resolution: {integrity: sha512-GlsEptulso7Jg0VaOZ8BXQi3AkYM5BOJKEO/rjMidSCq70FkIC5y0eawrCXeYzxgt3OCf4Ls+eoxN+/05vN0Ag==} engines: {node: '>=20'} @@ -2180,12 +2242,6 @@ packages: dexie@4.2.1: resolution: {integrity: sha512-Ckej0NS6jxQ4Po3OrSQBFddayRhTCic2DoCAG5zacOfOVB9P2Q5Xc5uL/nVa7ZVs+HdMnvUPzLFCB/JwpB6Csg==} - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -2446,10 +2502,6 @@ packages: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -2504,9 +2556,6 @@ packages: forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.23.26: resolution: {integrity: sha512-cPcIhgR42xBn1Uj+PzOyheMtZ73H927+uWPDVhUMqxy8UHt6Okavb6xIz9J/phFUHUj0OncR6UvMfJTXoc/LKA==} peerDependencies: @@ -2878,8 +2927,8 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true js-tokens@4.0.0: @@ -2948,12 +2997,75 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} loader-runner@4.3.1: resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} @@ -3062,9 +3174,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3137,10 +3246,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -3274,14 +3379,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} @@ -3299,49 +3396,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.1.0: - resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -3449,9 +3503,6 @@ packages: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3745,11 +3796,6 @@ packages: babel-plugin-macros: optional: true - sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3765,10 +3811,8 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tailwindcss@3.4.19: - resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} - engines: {node: '>=14.0.0'} - hasBin: true + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} @@ -3820,13 +3864,6 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -3873,9 +3910,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -5322,6 +5356,75 @@ snapshots: dependencies: tslib: 2.8.1 + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + + '@tailwindcss/oxide-android-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide@4.1.18': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/postcss@4.1.18': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + postcss: 8.5.6 + tailwindcss: 4.1.18 + '@tanstack/query-core@5.90.12': {} '@tanstack/react-query@5.90.12(react@19.2.3)': @@ -5636,7 +5739,7 @@ snapshots: '@vercel/oidc@3.0.5': {} - '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@20.19.27)(jiti@1.21.7)(terser@5.46.0))': + '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -5644,7 +5747,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.53 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.0(@types/node@20.19.27)(jiti@1.21.7)(terser@5.46.0) + vite: 7.3.0(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0) transitivePeerDependencies: - supports-color @@ -5657,13 +5760,13 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@20.19.27)(jiti@1.21.7)(terser@5.46.0))': + '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0))': dependencies: '@vitest/spy': 4.0.16 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@20.19.27)(jiti@1.21.7)(terser@5.46.0) + vite: 7.3.0(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0) '@vitest/pretty-format@4.0.16': dependencies: @@ -5844,15 +5947,11 @@ snapshots: ansi-styles@6.2.3: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - arg@5.0.2: {} - argparse@2.0.1: {} aria-query@5.3.0: @@ -5934,15 +6033,6 @@ snapshots: async-function@1.0.0: {} - autoprefixer@10.4.23(postcss@8.5.6): - dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001760 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -6061,8 +6151,6 @@ snapshots: callsites@3.1.0: {} - camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001760: {} canvas-confetti@1.9.4: {} @@ -6114,8 +6202,6 @@ snapshots: commander@2.20.3: {} - commander@4.1.1: {} - commondir@1.0.1: {} concat-map@0.0.1: {} @@ -6137,8 +6223,6 @@ snapshots: css.escape@1.5.1: {} - cssesc@3.0.0: {} - cssstyle@5.3.5: dependencies: '@asamuzakjp/css-color': 4.1.1 @@ -6254,10 +6338,6 @@ snapshots: dexie@4.2.1: {} - didyoumean@1.2.2: {} - - dlv@1.1.3: {} - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -6687,14 +6767,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -6743,8 +6815,6 @@ snapshots: forwarded-parse@2.1.2: {} - fraction.js@5.3.4: {} - framer-motion@12.23.26(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: motion-dom: 12.23.23 @@ -7121,7 +7191,7 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@1.21.7: {} + jiti@2.6.1: {} js-tokens@4.0.0: {} @@ -7198,9 +7268,54 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lilconfig@3.1.3: {} + lightningcss-android-arm64@1.30.2: + optional: true - lines-and-columns@1.2.4: {} + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 loader-runner@4.3.1: {} @@ -7285,12 +7400,6 @@ snapshots: ms@2.1.3: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nanoid@3.3.11: {} nanoid@5.1.6: {} @@ -7345,8 +7454,6 @@ snapshots: object-assign@4.1.1: {} - object-hash@3.0.0: {} - object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -7486,10 +7593,6 @@ snapshots: picomatch@4.0.3: {} - pify@2.3.0: {} - - pirates@4.0.7: {} - platform@1.3.6: {} playwright-core@1.57.0: {} @@ -7502,37 +7605,6 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.11 - - postcss-js@4.1.0(postcss@8.5.6): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.6 - - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 1.21.7 - postcss: 8.5.6 - - postcss-nested@6.2.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-value-parser@4.2.0: {} - postcss@8.4.31: dependencies: nanoid: 3.3.11 @@ -7654,10 +7726,6 @@ snapshots: react@19.2.3: {} - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -8078,16 +8146,6 @@ snapshots: optionalDependencies: '@babel/core': 7.28.5 - sucrase@3.35.1: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - tinyglobby: 0.2.15 - ts-interface-checker: 0.1.13 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -8100,33 +8158,7 @@ snapshots: symbol-tree@3.2.4: {} - tailwindcss@3.4.19: - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6) - postcss-nested: 6.2.0(postcss@8.5.6) - postcss-selector-parser: 6.1.2 - resolve: 1.22.11 - sucrase: 3.35.1 - transitivePeerDependencies: - - tsx - - yaml + tailwindcss@4.1.18: {} tapable@2.3.0: {} @@ -8206,14 +8238,6 @@ snapshots: text-table@0.2.0: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -8251,8 +8275,6 @@ snapshots: dependencies: typescript: 5.9.3 - ts-interface-checker@0.1.13: {} - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -8399,7 +8421,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite@7.3.0(@types/node@20.19.27)(jiti@1.21.7)(terser@5.46.0): + vite@7.3.0(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -8410,13 +8432,14 @@ snapshots: optionalDependencies: '@types/node': 20.19.27 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.6.1 + lightningcss: 1.30.2 terser: 5.46.0 - vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@20.19.27)(jiti@1.21.7)(jsdom@27.3.0)(terser@5.46.0): + vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@20.19.27)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(terser@5.46.0): dependencies: '@vitest/expect': 4.0.16 - '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@20.19.27)(jiti@1.21.7)(terser@5.46.0)) + '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)) '@vitest/pretty-format': 4.0.16 '@vitest/runner': 4.0.16 '@vitest/snapshot': 4.0.16 @@ -8433,7 +8456,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.0(@types/node@20.19.27)(jiti@1.21.7)(terser@5.46.0) + vite: 7.3.0(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 diff --git a/postcss.config.js b/postcss.config.js index 67cdf1a..432659d 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,5 @@ module.exports = { plugins: { - tailwindcss: {}, - autoprefixer: {}, + '@tailwindcss/postcss': {}, }, }; diff --git a/src/app/admin/banners/BannerManager.tsx b/src/app/admin/banners/BannerManager.tsx index ad31cbd..3167020 100644 --- a/src/app/admin/banners/BannerManager.tsx +++ b/src/app/admin/banners/BannerManager.tsx @@ -162,7 +162,7 @@ export default function BannerManager({ initialBanners }: BannerManagerProps) { value={formData.title} onChange={e => setFormData({ ...formData, title: e.target.value })} placeholder="Banner title" - className="w-full px-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-none focus:border-orange-600" + className="w-full px-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-hidden focus:border-orange-600" required /> @@ -174,7 +174,7 @@ export default function BannerManager({ initialBanners }: BannerManagerProps) { value={formData.image_url} onChange={e => setFormData({ ...formData, image_url: e.target.value })} placeholder="https://example.com/banner.jpg" - className="w-full px-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-none focus:border-orange-600" + className="w-full px-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-hidden focus:border-orange-600" required /> @@ -187,7 +187,7 @@ export default function BannerManager({ initialBanners }: BannerManagerProps) { value={formData.link_target} onChange={e => setFormData({ ...formData, link_target: e.target.value })} placeholder="/sessions" - className="w-full px-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-none focus:border-orange-600" + className="w-full px-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-hidden focus:border-orange-600" />
@@ -197,7 +197,7 @@ export default function BannerManager({ initialBanners }: BannerManagerProps) { value={formData.cta_text} onChange={e => setFormData({ ...formData, cta_text: e.target.value })} placeholder="Open" - className="w-full px-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-none focus:border-orange-600" + className="w-full px-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-hidden focus:border-orange-600" />
@@ -320,7 +320,7 @@ export default function BannerManager({ initialBanners }: BannerManagerProps) { /* Display Mode */
{/* Thumbnail */} -
+
{banner.title} setSearch(e.target.value)} placeholder="Search bottles, distilleries, or users..." - className="w-full pl-12 pr-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-none focus:border-orange-600" + className="w-full pl-12 pr-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-hidden focus:border-orange-600" />
@@ -133,7 +133,7 @@ export default function AdminBottlesList({ bottles }: AdminBottlesListProps) { setFilterCategory(e.target.value || null)} - className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-none focus:border-orange-600 appearance-none cursor-pointer" + className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-hidden focus:border-orange-600 appearance-none cursor-pointer" > {categories.map(cat => ( @@ -161,7 +161,7 @@ export default function AdminBottlesList({ bottles }: AdminBottlesListProps) { setSortBy(by); setSortOrder(order); }} - className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-none focus:border-orange-600 appearance-none cursor-pointer" + className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-hidden focus:border-orange-600 appearance-none cursor-pointer" > @@ -202,7 +202,7 @@ export default function AdminBottlesList({ bottles }: AdminBottlesListProps) { className="bg-zinc-900 rounded-2xl border border-zinc-800 overflow-hidden hover:border-zinc-700 transition-colors" > {/* Image */} -
+
{bottle.image_url ? ( + {bottle.category} )} {/* Rating Badge */} {avgRating > 0 && ( - + {avgRating.toFixed(1)} diff --git a/src/app/admin/ocr-logs/page.tsx b/src/app/admin/ocr-logs/page.tsx index ea28e78..93b7ce9 100644 --- a/src/app/admin/ocr-logs/page.tsx +++ b/src/app/admin/ocr-logs/page.tsx @@ -49,7 +49,7 @@ export default async function OcrLogsPage() { {/* Stats Cards */}
-
+
@@ -60,7 +60,7 @@ export default async function OcrLogsPage() {
All time
-
+
@@ -71,7 +71,7 @@ export default async function OcrLogsPage() {
Scans today
-
+
@@ -82,7 +82,7 @@ export default async function OcrLogsPage() {
Recognition quality
-
+
@@ -100,7 +100,7 @@ export default async function OcrLogsPage() { {/* Top Distilleries */} {stats.topDistilleries.length > 0 && ( -
+

Most Scanned Distilleries

{stats.topDistilleries.map((d, i) => ( @@ -119,7 +119,7 @@ export default async function OcrLogsPage() { )} {/* OCR Logs Grid */} -
+

Recent OCR Scans

{logs.length === 0 ? ( @@ -136,7 +136,7 @@ export default async function OcrLogsPage() { className="bg-zinc-50 dark:bg-zinc-800/50 rounded-xl p-4 border border-zinc-200 dark:border-zinc-700 hover:border-orange-500/50 transition-colors" > {/* Image Preview */} -
+
{log.image_thumbnail ? ( {log.distillery_source && ( - + {log.distillery_source} )} @@ -190,22 +190,22 @@ export default async function OcrLogsPage() {
{log.abv && ( - + {log.abv}% )} {log.age && ( - + {log.age}y )} {log.vintage && ( - + {log.vintage} )} {log.volume && ( - + {log.volume} )} @@ -218,7 +218,7 @@ export default async function OcrLogsPage() { Raw Text -
+                                            
                                                 {log.raw_text}
                                             
diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index f38da88..d718d75 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -158,7 +158,7 @@ export default async function AdminPage() { {/* Global Stats Cards */}
-
+
@@ -169,7 +169,7 @@ export default async function AdminPage() {
All time
-
+
@@ -188,7 +188,7 @@ export default async function AdminPage() {
-
+
@@ -199,7 +199,7 @@ export default async function AdminPage() {
Whiskybase searches
-
+
@@ -212,7 +212,7 @@ export default async function AdminPage() {
{/* Top Users */} -
+

Top Users by API Usage

{topUsersWithStats.map((user, index) => ( @@ -235,7 +235,7 @@ export default async function AdminPage() {
{/* Recent API Calls */} -
+

Recent API Calls

Total calls logged: {recentUsage?.length || 0} @@ -296,7 +296,7 @@ export default async function AdminPage() { {call.response_text && (
Response -
+                                                            
                                                                 {call.response_text}
                                                             
@@ -310,7 +310,7 @@ export default async function AdminPage() {
ERR {call.error_message && ( -
+
{call.error_message}
)} diff --git a/src/app/admin/sessions/AdminSessionsList.tsx b/src/app/admin/sessions/AdminSessionsList.tsx index 23d863b..c2feb8f 100644 --- a/src/app/admin/sessions/AdminSessionsList.tsx +++ b/src/app/admin/sessions/AdminSessionsList.tsx @@ -93,7 +93,7 @@ export default function AdminSessionsList({ sessions }: AdminSessionsListProps) value={search} onChange={e => setSearch(e.target.value)} placeholder="Search sessions or hosts..." - className="w-full pl-12 pr-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-none focus:border-orange-600" + className="w-full pl-12 pr-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-hidden focus:border-orange-600" />
@@ -101,7 +101,7 @@ export default function AdminSessionsList({ sessions }: AdminSessionsListProps) setFilterStatus(e.target.value as any)} - className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-none" + className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-hidden" > diff --git a/src/app/admin/splits/AdminSplitsList.tsx b/src/app/admin/splits/AdminSplitsList.tsx index 4889232..ba29465 100644 --- a/src/app/admin/splits/AdminSplitsList.tsx +++ b/src/app/admin/splits/AdminSplitsList.tsx @@ -75,7 +75,7 @@ export default function AdminSplitsList({ splits }: AdminSplitsListProps) { value={search} onChange={e => setSearch(e.target.value)} placeholder="Search bottles, hosts, or slugs..." - className="w-full pl-12 pr-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-none focus:border-orange-600" + className="w-full pl-12 pr-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-white placeholder-zinc-600 focus:outline-hidden focus:border-orange-600" />
@@ -83,7 +83,7 @@ export default function AdminSplitsList({ splits }: AdminSplitsListProps) { setFilterStatus(e.target.value as any)} - className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-none" + className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-hidden" > @@ -124,7 +124,7 @@ export default function AdminSplitsList({ splits }: AdminSplitsListProps) { }`} > {/* Image */} -
+
{split.bottle?.image_url ? ( {/* Participants Badge */} - + {split.participantCount} @@ -170,7 +170,7 @@ export default function AdminSplitsList({ splits }: AdminSplitsListProps) {
diff --git a/src/app/admin/tags/page.tsx b/src/app/admin/tags/page.tsx index 8c9b074..191f71e 100644 --- a/src/app/admin/tags/page.tsx +++ b/src/app/admin/tags/page.tsx @@ -88,7 +88,7 @@ export default function AdminTagsPage() { value={search} onChange={(e) => setSearch(e.target.value)} placeholder="Tags suchen..." - className="w-full pl-10 pr-4 py-2 bg-white dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 rounded-xl text-sm focus:ring-2 focus:ring-amber-500 outline-none transition-all dark:text-zinc-200" + className="w-full pl-10 pr-4 py-2 bg-white dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 rounded-xl text-sm focus:ring-2 focus:ring-amber-500 outline-hidden transition-all dark:text-zinc-200" />
@@ -96,7 +96,7 @@ export default function AdminTagsPage() { setFilterUser(e.target.value || null)} - className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-none" + className="px-4 py-3 bg-zinc-900 border border-zinc-800 rounded-xl text-zinc-300 focus:outline-hidden" > {users.map(([id, name]) => ( @@ -105,7 +105,7 @@ export default function AdminTastingsList({ tastings }: AdminTastingsListProps) setStatus(e.target.value)} - className="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-3 py-2 text-sm text-zinc-100 focus:outline-none focus:border-orange-600 transition-colors" + className="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-3 py-2 text-sm text-zinc-100 focus:outline-hidden focus:border-orange-600 transition-colors" > @@ -672,7 +672,7 @@ export default function TastingEditor({ bottleMetadata, image, onSave, onOpenSes value={guessAbv} onChange={(e) => setGuessAbv(e.target.value)} placeholder="z.B. 46.3" - className="w-full bg-black/40 border border-purple-500/20 rounded-2xl px-5 py-3 text-sm text-white focus:border-purple-500/50 outline-none transition-all" + className="w-full bg-black/40 border border-purple-500/20 rounded-2xl px-5 py-3 text-sm text-white focus:border-purple-500/50 outline-hidden transition-all" />
@@ -682,7 +682,7 @@ export default function TastingEditor({ bottleMetadata, image, onSave, onOpenSes value={guessAge} onChange={(e) => setGuessAge(e.target.value)} placeholder="z.B. 12" - className="w-full bg-black/40 border border-purple-500/20 rounded-2xl px-5 py-3 text-sm text-white focus:border-purple-500/50 outline-none transition-all" + className="w-full bg-black/40 border border-purple-500/20 rounded-2xl px-5 py-3 text-sm text-white focus:border-purple-500/50 outline-hidden transition-all" />
@@ -692,7 +692,7 @@ export default function TastingEditor({ bottleMetadata, image, onSave, onOpenSes value={guessRegion} onChange={(e) => setGuessRegion(e.target.value)} placeholder="z.B. Islay / Lagavulin" - className="w-full bg-black/40 border border-purple-500/20 rounded-2xl px-5 py-3 text-sm text-white focus:border-purple-500/50 outline-none transition-all" + className="w-full bg-black/40 border border-purple-500/20 rounded-2xl px-5 py-3 text-sm text-white focus:border-purple-500/50 outline-hidden transition-all" />
@@ -729,7 +729,7 @@ export default function TastingEditor({ bottleMetadata, image, onSave, onOpenSes
{/* Fixed/Sticky Footer for Save Action */} -
+
@@ -213,7 +213,7 @@ export default function TastingFormBody({ onChange={(e) => setPalate(e.target.value)} placeholder={t('tasting.notesPlaceholder')} rows={2} - className="w-full p-4 bg-zinc-950 border border-zinc-800 rounded-2xl text-sm focus:ring-1 focus:ring-orange-600 outline-none resize-none transition-all text-zinc-200 placeholder:text-zinc-700" + className="w-full p-4 bg-zinc-950 border border-zinc-800 rounded-2xl text-sm focus:ring-1 focus:ring-orange-600 outline-hidden resize-none transition-all text-zinc-200 placeholder:text-zinc-700" />
@@ -281,7 +281,7 @@ export default function TastingFormBody({ onChange={(e) => setFinish(e.target.value)} placeholder={t('tasting.notesPlaceholder')} rows={2} - className="w-full p-4 bg-zinc-950 border border-zinc-800 rounded-2xl text-sm focus:ring-1 focus:ring-orange-600 outline-none resize-none transition-all text-zinc-200 placeholder:text-zinc-700" + className="w-full p-4 bg-zinc-950 border border-zinc-800 rounded-2xl text-sm focus:ring-1 focus:ring-orange-600 outline-hidden resize-none transition-all text-zinc-200 placeholder:text-zinc-700" />
diff --git a/src/components/TastingHub.tsx b/src/components/TastingHub.tsx index 559b8ae..777d012 100644 --- a/src/components/TastingHub.tsx +++ b/src/components/TastingHub.tsx @@ -179,7 +179,7 @@ export default function TastingHub({ isOpen, onClose }: TastingHubProps) { animate={{ opacity: 1 }} exit={{ opacity: 0 }} onClick={onClose} - className="fixed inset-0 bg-black/80 backdrop-blur-sm z-[60]" + className="fixed inset-0 bg-black/80 backdrop-blur-xs z-60" /> {/* Content */} @@ -188,7 +188,7 @@ export default function TastingHub({ isOpen, onClose }: TastingHubProps) { animate={{ y: 0 }} exit={{ y: '100%' }} transition={{ type: 'spring', damping: 25, stiffness: 200 }} - className="fixed bottom-0 left-0 right-0 h-[85vh] bg-[#09090b] border-t border-white/10 rounded-t-[40px] z-[70] flex flex-col shadow-2xl overflow-hidden" + className="fixed bottom-0 left-0 right-0 h-[85vh] bg-[#09090b] border-t border-white/10 rounded-t-[40px] z-70 flex flex-col shadow-2xl overflow-hidden" > {/* Header */}
@@ -242,7 +242,7 @@ export default function TastingHub({ isOpen, onClose }: TastingHubProps) { value={newName} onChange={(e) => setNewName(e.target.value)} placeholder={t('hub.placeholders.sessionName')} - className="flex-1 bg-black/40 border border-white/5 rounded-2xl px-6 py-4 text-sm font-bold text-white placeholder:text-zinc-700 focus:outline-none focus:border-orange-600 transition-all ring-inset focus:ring-1 focus:ring-orange-600/50" + className="flex-1 bg-black/40 border border-white/5 rounded-2xl px-6 py-4 text-sm font-bold text-white placeholder:text-zinc-700 focus:outline-hidden focus:border-orange-600 transition-all ring-inset focus:ring-1 focus:ring-orange-600/50" />