ATlast — you'll never need to find your favorites on another platform again. Find your favs in the ATmosphere.
atproto

feat: add Tailwind CSS to extension

Replaced 299 lines of vanilla CSS with Tailwind for design consistency with web app. Production build minified to 13KB.

byarielm.fyi d07180cd 6ac877ee

verified
+16 -16
docs/git-history.json
··· 8 8 "files_changed": 6 9 9 }, 10 10 { 11 - "hash": "2a163c5f033a79324b100a236ea26c905909bfc6", 12 - "short_hash": "2a163c5", 11 + "hash": "fe29bb3e5faa0151f63c14724f7509af669860de", 12 + "short_hash": "fe29bb3", 13 13 "author": "Ariel M. Lighty", 14 - "date": "2025-12-27T15:49:08-05:00", 15 - "message": "docs: update decision graph after documentation improvements", 16 - "files_changed": 2 14 + "date": "2025-12-27T16:02:10-05:00", 15 + "message": "docs: update all .md files to reflect current project status\n\nUpdated 4 markdown files with current state:\n\nEXTENSION_STATUS.md:\n- Changed status from DEBUGGING to COMPLETE\n- Updated decision graph count (295 → 332 nodes)\n- Added recently completed section (nodes 296-332)\n- Marked all extension bugs as resolved\n\nCONTRIBUTING.md:\n- Replaced npm with pnpm throughout\n- Added monorepo structure documentation\n- Updated development commands (netlify-cli dev --filter)\n- Added extension development workflow\n\nPLAN.md:\n- Updated status to Phase 1 COMPLETE\n- Added all recent fixes to completion list\n- Updated decision graph count to 332 nodes\n- Added changelog entries for latest work\n\npackages/extension/README.md:\n- Added prerequisites section (dev server + login required)\n- Updated build commands with dev/prod distinction\n- Added Step 0: Start ATlast Dev Server\n- Added common issues for auth and server states\n\nAll files now accurately reflect completion status and use pnpm.", 16 + "files_changed": 6 17 17 }, 18 18 { 19 19 "hash": "fcf682bb8969aca108262348e7e17531077713be", ··· 32 32 "files_changed": 1 33 33 }, 34 34 { 35 - "hash": "8f692c7ff534680b09e98e16c58e5effa0badd9f", 36 - "short_hash": "8f692c7", 35 + "hash": "e04934ffb5e2d78791fcd23bc3afeb4d438a5546", 36 + "short_hash": "e04934f", 37 37 "author": "Ariel M. Lighty", 38 - "date": "2025-12-26T21:48:59-05:00", 39 - "message": "docs: update decision graph after timezone fix", 40 - "files_changed": 2 38 + "date": "2025-12-26T21:57:05-05:00", 39 + "message": "perf: optimize Vite dev server startup\n\nAdded explicit optimizeDeps.include to pre-bundle common dependencies:\n- React ecosystem (react, react-dom, react-router-dom)\n- Icon libraries (@icons-pack/react-simple-icons, lucide-react)\n- Other deps (date-fns, jszip, zustand, @tanstack/react-virtual)\n\nAlso added server.fs.allow config for monorepo file serving.\n\nThis should speed up subsequent dev server starts by ensuring these\ndependencies are consistently pre-bundled.", 40 + "files_changed": 1 41 41 }, 42 42 { 43 43 "hash": "aacbbaa27797781098dacdfd0194c93cd71d7bd2", ··· 136 136 "files_changed": 3 137 137 }, 138 138 { 139 - "hash": "ba29fd68872913ba0a587aa7f29f97b3d373a732", 140 - "short_hash": "ba29fd6", 139 + "hash": "32cdee3aeac7ef986df47e0fff786b5f7471e55b", 140 + "short_hash": "32cdee3", 141 141 "author": "Ariel M. Lighty", 142 142 "date": "2025-12-25T13:22:32-05:00", 143 143 "message": "configure Netlify dev for monorepo with --filter flag\n\nFixed Netlify CLI monorepo detection issue by using --filter flag:\n- Updated root package.json scripts to use 'npx netlify-cli dev --filter @atlast/web'\n- Updated netlify.toml [dev] section to use npm with --prefix for framework command\n- Added monorepo development instructions to CLAUDE.md\n- Documented Windows Git Bash compatibility issue with netlify command\n\nSolution: Use 'npx netlify-cli dev --filter @atlast/web' to bypass monorepo\nproject selection prompt and specify which workspace package to run.\n\nDev server now runs successfully at http://localhost:8888 with all backend\nfunctions loaded.", 144 - "files_changed": 5 144 + "files_changed": 4 145 145 }, 146 146 { 147 - "hash": "32cdee3aeac7ef986df47e0fff786b5f7471e55b", 148 - "short_hash": "32cdee3", 147 + "hash": "ba29fd68872913ba0a587aa7f29f97b3d373a732", 148 + "short_hash": "ba29fd6", 149 149 "author": "Ariel M. Lighty", 150 150 "date": "2025-12-25T13:22:32-05:00", 151 151 "message": "configure Netlify dev for monorepo with --filter flag\n\nFixed Netlify CLI monorepo detection issue by using --filter flag:\n- Updated root package.json scripts to use 'npx netlify-cli dev --filter @atlast/web'\n- Updated netlify.toml [dev] section to use npm with --prefix for framework command\n- Added monorepo development instructions to CLAUDE.md\n- Documented Windows Git Bash compatibility issue with netlify command\n\nSolution: Use 'npx netlify-cli dev --filter @atlast/web' to bypass monorepo\nproject selection prompt and specify which workspace package to run.\n\nDev server now runs successfully at http://localhost:8888 with all backend\nfunctions loaded.", 152 - "files_changed": 4 152 + "files_changed": 5 153 153 }, 154 154 { 155 155 "hash": "c3e7afad396d130791d801a85cbfc9643bcd6309",
+214 -71
docs/graph-data.json
··· 3185 3185 "node_type": "goal", 3186 3186 "title": "Fix extension upload errors - undefined response and invalid URL", 3187 3187 "description": null, 3188 - "status": "pending", 3188 + "status": "completed", 3189 3189 "created_at": "2025-12-26T13:31:45.695565800-05:00", 3190 - "updated_at": "2025-12-26T13:31:45.695565800-05:00", 3190 + "updated_at": "2025-12-27T17:49:55.246500-05:00", 3191 3191 "metadata_json": "{\"branch\":\"master\",\"confidence\":85}" 3192 3192 }, 3193 3193 { ··· 3196 3196 "node_type": "observation", 3197 3197 "title": "Backend returns correct structure but response might be wrapped by successResponse helper", 3198 3198 "description": null, 3199 - "status": "pending", 3199 + "status": "completed", 3200 3200 "created_at": "2025-12-26T13:32:20.697112800-05:00", 3201 - "updated_at": "2025-12-26T13:32:20.697112800-05:00", 3201 + "updated_at": "2025-12-27T17:49:55.310376600-05:00", 3202 3202 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3203 3203 }, 3204 3204 { ··· 3207 3207 "node_type": "observation", 3208 3208 "title": "successResponse wraps data in {success: true, data: {...}} structure - extension expects flat response", 3209 3209 "description": null, 3210 - "status": "pending", 3210 + "status": "completed", 3211 3211 "created_at": "2025-12-26T13:32:50.409160400-05:00", 3212 - "updated_at": "2025-12-26T13:32:50.409160400-05:00", 3212 + "updated_at": "2025-12-27T17:49:55.384830800-05:00", 3213 3213 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3214 3214 }, 3215 3215 { ··· 3218 3218 "node_type": "action", 3219 3219 "title": "Fix api-client.ts to unwrap ApiResponse.data field", 3220 3220 "description": null, 3221 - "status": "pending", 3221 + "status": "completed", 3222 3222 "created_at": "2025-12-26T13:32:54.625124500-05:00", 3223 - "updated_at": "2025-12-26T13:32:54.625124500-05:00", 3223 + "updated_at": "2025-12-27T17:49:55.449186500-05:00", 3224 3224 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3225 3225 }, 3226 3226 { ··· 3229 3229 "node_type": "outcome", 3230 3230 "title": "Fixed API client to unwrap ApiResponse.data - both uploadToATlast and checkSession now correctly access nested data field", 3231 3231 "description": null, 3232 - "status": "pending", 3232 + "status": "completed", 3233 3233 "created_at": "2025-12-26T13:34:09.012837500-05:00", 3234 - "updated_at": "2025-12-26T13:34:09.012837500-05:00", 3234 + "updated_at": "2025-12-27T17:49:55.512809400-05:00", 3235 3235 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3236 3236 }, 3237 3237 { ··· 3240 3240 "node_type": "outcome", 3241 3241 "title": "Committed API response fix to git", 3242 3242 "description": null, 3243 - "status": "pending", 3243 + "status": "completed", 3244 3244 "created_at": "2025-12-26T13:36:02.733197600-05:00", 3245 - "updated_at": "2025-12-26T13:36:02.733197600-05:00", 3245 + "updated_at": "2025-12-27T17:49:55.576426900-05:00", 3246 3246 "metadata_json": "{\"branch\":\"master\",\"commit\":\"9563633\",\"confidence\":95}" 3247 3247 }, 3248 3248 { ··· 3251 3251 "node_type": "observation", 3252 3252 "title": "Extension upload flow fixed and ready for testing - API response unwrapping resolves undefined errors", 3253 3253 "description": null, 3254 - "status": "pending", 3254 + "status": "completed", 3255 3255 "created_at": "2025-12-26T13:37:35.844832-05:00", 3256 - "updated_at": "2025-12-26T13:37:35.844832-05:00", 3256 + "updated_at": "2025-12-27T17:49:55.653339900-05:00", 3257 3257 "metadata_json": "{\"branch\":\"master\",\"commit\":\"9ca7347\",\"confidence\":95}" 3258 3258 }, 3259 3259 { ··· 3262 3262 "node_type": "goal", 3263 3263 "title": "Fix backend repository method error and missing frontend route", 3264 3264 "description": null, 3265 - "status": "pending", 3265 + "status": "completed", 3266 3266 "created_at": "2025-12-26T13:43:03.332690700-05:00", 3267 - "updated_at": "2025-12-26T13:43:03.332690700-05:00", 3267 + "updated_at": "2025-12-27T17:49:55.729232100-05:00", 3268 3268 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3269 3269 }, 3270 3270 { ··· 3273 3273 "node_type": "observation", 3274 3274 "title": "Two issues: 1) SourceAccountRepository has getOrCreate/bulkCreate not upsertSourceAccount, 2) Router only has / route, no /results route", 3275 3275 "description": null, 3276 - "status": "pending", 3276 + "status": "completed", 3277 3277 "created_at": "2025-12-26T13:43:28.902663600-05:00", 3278 - "updated_at": "2025-12-26T13:43:28.902663600-05:00", 3278 + "updated_at": "2025-12-27T17:49:55.791246300-05:00", 3279 3279 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3280 3280 }, 3281 3281 { ··· 3284 3284 "node_type": "action", 3285 3285 "title": "Fix backend to use bulkCreate and frontend to handle uploadId param", 3286 3286 "description": null, 3287 - "status": "pending", 3287 + "status": "completed", 3288 3288 "created_at": "2025-12-26T13:44:28.406069900-05:00", 3289 - "updated_at": "2025-12-26T13:44:28.406069900-05:00", 3289 + "updated_at": "2025-12-27T17:49:55.863335500-05:00", 3290 3290 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3291 3291 }, 3292 3292 { ··· 3295 3295 "node_type": "outcome", 3296 3296 "title": "Fixed both issues: backend uses bulkCreate, redirects to /?uploadId, frontend loads results from uploadId param", 3297 3297 "description": null, 3298 - "status": "pending", 3298 + "status": "completed", 3299 3299 "created_at": "2025-12-26T13:45:58.309042200-05:00", 3300 - "updated_at": "2025-12-26T13:45:58.309042200-05:00", 3300 + "updated_at": "2025-12-27T17:49:55.947393200-05:00", 3301 3301 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3302 3302 }, 3303 3303 { ··· 3306 3306 "node_type": "outcome", 3307 3307 "title": "Committed fixes for bulkCreate and uploadId handling", 3308 3308 "description": null, 3309 - "status": "pending", 3309 + "status": "completed", 3310 3310 "created_at": "2025-12-26T13:47:48.770693200-05:00", 3311 - "updated_at": "2025-12-26T13:47:48.770693200-05:00", 3311 + "updated_at": "2025-12-27T17:49:56.029469300-05:00", 3312 3312 "metadata_json": "{\"branch\":\"master\",\"commit\":\"581ed00\",\"confidence\":95}" 3313 3313 }, 3314 3314 { ··· 3317 3317 "node_type": "observation", 3318 3318 "title": "Frontend error: loadUploadResults not defined - need to check function scope", 3319 3319 "description": null, 3320 - "status": "pending", 3320 + "status": "completed", 3321 3321 "created_at": "2025-12-26T13:50:59.977950500-05:00", 3322 - "updated_at": "2025-12-26T13:50:59.977950500-05:00", 3322 + "updated_at": "2025-12-27T17:49:56.093781100-05:00", 3323 3323 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3324 3324 }, 3325 3325 { ··· 3328 3328 "node_type": "action", 3329 3329 "title": "Fix useEffect to call handleLoadUpload instead of non-existent loadUploadResults", 3330 3330 "description": null, 3331 - "status": "pending", 3331 + "status": "completed", 3332 3332 "created_at": "2025-12-26T13:51:36.007564400-05:00", 3333 - "updated_at": "2025-12-26T13:51:36.007564400-05:00", 3333 + "updated_at": "2025-12-27T17:49:56.169258900-05:00", 3334 3334 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3335 3335 }, 3336 3336 { ··· 3339 3339 "node_type": "outcome", 3340 3340 "title": "Fixed function name - now calls handleLoadUpload correctly", 3341 3341 "description": null, 3342 - "status": "pending", 3342 + "status": "completed", 3343 3343 "created_at": "2025-12-26T13:51:52.256909300-05:00", 3344 - "updated_at": "2025-12-26T13:51:52.256909300-05:00", 3344 + "updated_at": "2025-12-27T17:49:56.234188500-05:00", 3345 3345 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3346 3346 }, 3347 3347 { ··· 3350 3350 "node_type": "goal", 3351 3351 "title": "Fix extension flow: auto-search after load, history navigation, time formatting", 3352 3352 "description": null, 3353 - "status": "pending", 3353 + "status": "completed", 3354 3354 "created_at": "2025-12-26T14:05:53.798547500-05:00", 3355 - "updated_at": "2025-12-26T14:05:53.798547500-05:00", 3355 + "updated_at": "2025-12-27T17:49:56.309329800-05:00", 3356 3356 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3357 3357 }, 3358 3358 { ··· 3361 3361 "node_type": "observation", 3362 3362 "title": "handleLoadUpload expects existing results but extension creates empty upload - need to load source accounts and trigger search", 3363 3363 "description": null, 3364 - "status": "pending", 3364 + "status": "completed", 3365 3365 "created_at": "2025-12-26T14:06:18.067673100-05:00", 3366 - "updated_at": "2025-12-26T14:06:18.067673100-05:00", 3366 + "updated_at": "2025-12-27T17:49:56.384145700-05:00", 3367 3367 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3368 3368 }, 3369 3369 { ··· 3372 3372 "node_type": "observation", 3373 3373 "title": "Extension-import creates upload and source_accounts but NOT user_source_follows - get-upload-details returns empty because it queries FROM user_source_follows", 3374 3374 "description": null, 3375 - "status": "pending", 3375 + "status": "completed", 3376 3376 "created_at": "2025-12-26T14:08:57.918421600-05:00", 3377 - "updated_at": "2025-12-26T14:08:57.918421600-05:00", 3377 + "updated_at": "2025-12-27T17:49:56.459539400-05:00", 3378 3378 "metadata_json": "{\"branch\":\"master\",\"confidence\":100}" 3379 3379 }, 3380 3380 { ··· 3383 3383 "node_type": "action", 3384 3384 "title": "Add user_source_follows creation to extension-import endpoint", 3385 3385 "description": null, 3386 - "status": "pending", 3386 + "status": "completed", 3387 3387 "created_at": "2025-12-26T14:09:03.035871-05:00", 3388 - "updated_at": "2025-12-26T14:09:03.035871-05:00", 3388 + "updated_at": "2025-12-27T17:49:56.523841100-05:00", 3389 3389 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3390 3390 }, 3391 3391 { ··· 3394 3394 "node_type": "outcome", 3395 3395 "title": "Fixed all extension flow issues: added user_source_follows creation, auto-search after load, time formatting", 3396 3396 "description": null, 3397 - "status": "pending", 3397 + "status": "completed", 3398 3398 "created_at": "2025-12-26T14:11:09.055850200-05:00", 3399 - "updated_at": "2025-12-26T14:11:09.055850200-05:00", 3399 + "updated_at": "2025-12-27T17:49:56.588486100-05:00", 3400 3400 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3401 3401 }, 3402 3402 { ··· 3405 3405 "node_type": "outcome", 3406 3406 "title": "Committed all extension flow fixes", 3407 3407 "description": null, 3408 - "status": "pending", 3408 + "status": "completed", 3409 3409 "created_at": "2025-12-26T14:16:08.387214900-05:00", 3410 - "updated_at": "2025-12-26T14:16:08.387214900-05:00", 3410 + "updated_at": "2025-12-27T17:49:56.670180800-05:00", 3411 3411 "metadata_json": "{\"branch\":\"master\",\"commit\":\"6ced3f0\",\"confidence\":95}" 3412 3412 }, 3413 3413 { ··· 3416 3416 "node_type": "observation", 3417 3417 "title": "searchAllUsers called with wrong parameters - missing onProgressUpdate callback", 3418 3418 "description": null, 3419 - "status": "pending", 3419 + "status": "completed", 3420 3420 "created_at": "2025-12-26T16:07:21.838974100-05:00", 3421 - "updated_at": "2025-12-26T16:07:21.838974100-05:00", 3421 + "updated_at": "2025-12-27T17:49:56.746464900-05:00", 3422 3422 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3423 3423 }, 3424 3424 { ··· 3427 3427 "node_type": "action", 3428 3428 "title": "Fix searchAllUsers call with correct parameters and callbacks", 3429 3429 "description": null, 3430 - "status": "pending", 3430 + "status": "completed", 3431 3431 "created_at": "2025-12-26T16:08:18.523845400-05:00", 3432 - "updated_at": "2025-12-26T16:08:18.523845400-05:00", 3432 + "updated_at": "2025-12-27T17:49:56.809583600-05:00", 3433 3433 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3434 3434 }, 3435 3435 { ··· 3438 3438 "node_type": "outcome", 3439 3439 "title": "Fixed searchAllUsers call - now passes onProgressUpdate and onComplete callbacks", 3440 3440 "description": null, 3441 - "status": "pending", 3441 + "status": "completed", 3442 3442 "created_at": "2025-12-26T16:08:24.248208800-05:00", 3443 - "updated_at": "2025-12-26T16:08:24.248208800-05:00", 3443 + "updated_at": "2025-12-27T17:49:56.884711900-05:00", 3444 3444 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3445 3445 }, 3446 3446 { ··· 3449 3449 "node_type": "goal", 3450 3450 "title": "Fix validation error and undefined localeCompare in extension flow", 3451 3451 "description": null, 3452 - "status": "pending", 3452 + "status": "completed", 3453 3453 "created_at": "2025-12-26T20:17:59.516959100-05:00", 3454 - "updated_at": "2025-12-26T20:17:59.516959100-05:00", 3454 + "updated_at": "2025-12-27T17:49:56.971434500-05:00", 3455 3455 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3456 3456 }, 3457 3457 { ··· 3460 3460 "node_type": "observation", 3461 3461 "title": "Two errors: 1) batch-search-actors gets null in usernames array, 2) Frontend localeCompare on undefined - likely wrong SearchResult structure", 3462 3462 "description": null, 3463 - "status": "pending", 3463 + "status": "completed", 3464 3464 "created_at": "2025-12-26T20:18:03.693879700-05:00", 3465 - "updated_at": "2025-12-26T20:18:03.693879700-05:00", 3465 + "updated_at": "2025-12-27T17:49:57.049131800-05:00", 3466 3466 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3467 3467 }, 3468 3468 { ··· 3471 3471 "node_type": "action", 3472 3472 "title": "Fix SearchResult structure - sourceUser should be object not string", 3473 3473 "description": null, 3474 - "status": "pending", 3474 + "status": "completed", 3475 3475 "created_at": "2025-12-26T20:19:47.621459800-05:00", 3476 - "updated_at": "2025-12-26T20:19:47.621459800-05:00", 3476 + "updated_at": "2025-12-27T17:49:57.127563700-05:00", 3477 3477 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3478 3478 }, 3479 3479 { ··· 3482 3482 "node_type": "outcome", 3483 3483 "title": "Fixed SearchResult structure - sourceUser is now correct SourceUser object instead of string", 3484 3484 "description": null, 3485 - "status": "pending", 3485 + "status": "completed", 3486 3486 "created_at": "2025-12-26T20:20:22.507291300-05:00", 3487 - "updated_at": "2025-12-26T20:20:22.507291300-05:00", 3487 + "updated_at": "2025-12-27T17:49:57.190209200-05:00", 3488 3488 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3489 3489 }, 3490 3490 { ··· 3493 3493 "node_type": "goal", 3494 3494 "title": "Fix results not saving to database and timestamp timezone issue", 3495 3495 "description": null, 3496 - "status": "pending", 3496 + "status": "completed", 3497 3497 "created_at": "2025-12-26T20:37:03.493239600-05:00", 3498 - "updated_at": "2025-12-26T20:37:03.493239600-05:00", 3498 + "updated_at": "2025-12-27T17:49:57.263765-05:00", 3499 3499 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3500 3500 }, 3501 3501 { ··· 3603 3603 "node_type": "outcome", 3604 3604 "title": "Fixed decision graph integrity - linked 18 orphan nodes to parent goals, marked nodes 319-327 as completed", 3605 3605 "description": null, 3606 - "status": "pending", 3606 + "status": "completed", 3607 3607 "created_at": "2025-12-27T15:38:21.291457500-05:00", 3608 - "updated_at": "2025-12-27T15:38:21.291457500-05:00", 3608 + "updated_at": "2025-12-27T17:49:54.129059900-05:00", 3609 3609 "metadata_json": "{\"branch\":\"master\",\"confidence\":100}" 3610 3610 }, 3611 3611 { ··· 3614 3614 "node_type": "observation", 3615 3615 "title": "Decision graph audit revealed systematic issues: 18 orphan nodes, incorrect status (pending vs completed), wrong orphan detection commands in recovery workflow", 3616 3616 "description": null, 3617 - "status": "pending", 3617 + "status": "completed", 3618 3618 "created_at": "2025-12-27T15:40:23.238704300-05:00", 3619 - "updated_at": "2025-12-27T15:40:23.238704300-05:00", 3619 + "updated_at": "2025-12-27T17:49:57.327650700-05:00", 3620 3620 "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3621 3621 }, 3622 3622 { ··· 3627 3627 "description": null, 3628 3628 "status": "completed", 3629 3629 "created_at": "2025-12-27T15:41:04.067444-05:00", 3630 - "updated_at": "2025-12-27T15:47:53.643256600-05:00", 3630 + "updated_at": "2025-12-27T17:49:57.403361400-05:00", 3631 3631 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3632 3632 }, 3633 3633 { ··· 3638 3638 "description": null, 3639 3639 "status": "completed", 3640 3640 "created_at": "2025-12-27T15:47:49.308750700-05:00", 3641 - "updated_at": "2025-12-27T15:47:55.838439500-05:00", 3641 + "updated_at": "2025-12-27T17:49:57.478252800-05:00", 3642 3642 "metadata_json": "{\"branch\":\"master\",\"confidence\":100}" 3643 3643 }, 3644 3644 { ··· 3649 3649 "description": null, 3650 3650 "status": "completed", 3651 3651 "created_at": "2025-12-27T15:48:47.658343800-05:00", 3652 - "updated_at": "2025-12-27T15:48:51.950405900-05:00", 3652 + "updated_at": "2025-12-27T17:49:57.553143200-05:00", 3653 3653 "metadata_json": "{\"branch\":\"master\",\"commit\":\"fcf682b\",\"confidence\":100}" 3654 3654 }, 3655 3655 { ··· 3660 3660 "description": null, 3661 3661 "status": "completed", 3662 3662 "created_at": "2025-12-27T15:50:48.815758500-05:00", 3663 - "updated_at": "2025-12-27T15:59:50.747036600-05:00", 3663 + "updated_at": "2025-12-27T17:49:57.630386-05:00", 3664 3664 "metadata_json": "{\"branch\":\"master\",\"confidence\":90,\"prompt\":\"review and update the .md files thru the project based on current project status.\"}" 3665 3665 }, 3666 3666 { ··· 3671 3671 "description": null, 3672 3672 "status": "completed", 3673 3673 "created_at": "2025-12-27T15:51:22.583189100-05:00", 3674 - "updated_at": "2025-12-27T15:52:10.859032400-05:00", 3674 + "updated_at": "2025-12-27T17:49:57.707946400-05:00", 3675 3675 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3676 3676 }, 3677 3677 { ··· 3680 3680 "node_type": "observation", 3681 3681 "title": "Analyzed all project .md files - found outdated information in CONTRIBUTING.md (npm→pnpm), EXTENSION_STATUS.md (debugging→completed), PLAN.md (optimization status), extension README (build commands)", 3682 3682 "description": null, 3683 - "status": "pending", 3683 + "status": "completed", 3684 3684 "created_at": "2025-12-27T15:52:06.741629200-05:00", 3685 - "updated_at": "2025-12-27T15:52:06.741629200-05:00", 3685 + "updated_at": "2025-12-27T17:49:57.786343300-05:00", 3686 3686 "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3687 3687 }, 3688 3688 { ··· 3691 3691 "node_type": "decision", 3692 3692 "title": "Choose which .md files to update based on priority and impact", 3693 3693 "description": null, 3694 - "status": "pending", 3694 + "status": "completed", 3695 3695 "created_at": "2025-12-27T15:52:30.322805700-05:00", 3696 - "updated_at": "2025-12-27T15:52:30.322805700-05:00", 3696 + "updated_at": "2025-12-27T17:49:57.849977800-05:00", 3697 3697 "metadata_json": "{\"branch\":\"master\",\"confidence\":85}" 3698 3698 }, 3699 3699 { ··· 3772 3772 "created_at": "2025-12-27T16:02:13.397776700-05:00", 3773 3773 "updated_at": "2025-12-27T16:02:56.131931100-05:00", 3774 3774 "metadata_json": "{\"branch\":\"master\",\"commit\":\"fe29bb3\",\"confidence\":100}" 3775 + }, 3776 + { 3777 + "id": 344, 3778 + "change_id": "2a06900e-ea62-4adf-81d5-7f0cf1a29b31", 3779 + "node_type": "goal", 3780 + "title": "Add Tailwind CSS to extension for design consistency", 3781 + "description": null, 3782 + "status": "completed", 3783 + "created_at": "2025-12-27T17:59:23.523767600-05:00", 3784 + "updated_at": "2025-12-27T18:07:53.271415-05:00", 3785 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90,\"prompt\":\"yes\"}" 3786 + }, 3787 + { 3788 + "id": 345, 3789 + "change_id": "0ef352ed-538b-4632-8b62-ebb17603f944", 3790 + "node_type": "action", 3791 + "title": "Installing Tailwind CSS and PostCSS dependencies", 3792 + "description": null, 3793 + "status": "completed", 3794 + "created_at": "2025-12-27T18:00:41.652670100-05:00", 3795 + "updated_at": "2025-12-27T18:00:43.901523100-05:00", 3796 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3797 + }, 3798 + { 3799 + "id": 346, 3800 + "change_id": "888e6ad0-5002-4cdb-b35e-f4214ca07dfa", 3801 + "node_type": "action", 3802 + "title": "Creating Tailwind and PostCSS config files", 3803 + "description": null, 3804 + "status": "completed", 3805 + "created_at": "2025-12-27T18:01:27.404433500-05:00", 3806 + "updated_at": "2025-12-27T18:01:29.980132200-05:00", 3807 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3808 + }, 3809 + { 3810 + "id": 347, 3811 + "change_id": "fae7a634-d921-4b6f-9620-0c58d88b863e", 3812 + "node_type": "action", 3813 + "title": "Updating build.js to process CSS with PostCSS + Tailwind", 3814 + "description": null, 3815 + "status": "completed", 3816 + "created_at": "2025-12-27T18:01:50.537140900-05:00", 3817 + "updated_at": "2025-12-27T18:01:53.031316700-05:00", 3818 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3819 + }, 3820 + { 3821 + "id": 348, 3822 + "change_id": "c25a8f4b-8bf1-4a33-bef9-3731dfd83627", 3823 + "node_type": "action", 3824 + "title": "Converting popup.css to use Tailwind directives", 3825 + "description": null, 3826 + "status": "completed", 3827 + "created_at": "2025-12-27T18:02:42.167814700-05:00", 3828 + "updated_at": "2025-12-27T18:02:44.488653900-05:00", 3829 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3830 + }, 3831 + { 3832 + "id": 349, 3833 + "change_id": "c65ee3d9-62a0-47aa-870a-f6422ff2536a", 3834 + "node_type": "action", 3835 + "title": "Converting popup.html to use Tailwind utility classes", 3836 + "description": null, 3837 + "status": "completed", 3838 + "created_at": "2025-12-27T18:03:00.465637900-05:00", 3839 + "updated_at": "2025-12-27T18:03:02.815261100-05:00", 3840 + "metadata_json": "{\"branch\":\"master\",\"confidence\":90}" 3841 + }, 3842 + { 3843 + "id": 350, 3844 + "change_id": "8136e615-5baa-4fe5-9a7d-d672ff1a6f85", 3845 + "node_type": "outcome", 3846 + "title": "Successfully integrated Tailwind CSS into extension", 3847 + "description": null, 3848 + "status": "completed", 3849 + "created_at": "2025-12-27T18:07:49.869572400-05:00", 3850 + "updated_at": "2025-12-27T18:07:52.136827400-05:00", 3851 + "metadata_json": "{\"branch\":\"master\",\"confidence\":95}" 3775 3852 } 3776 3853 ], 3777 3854 "edges": [ ··· 7558 7635 "weight": 1.0, 7559 7636 "rationale": "Git commit with all documentation updates", 7560 7637 "created_at": "2025-12-27T16:02:15.712335700-05:00" 7638 + }, 7639 + { 7640 + "id": 345, 7641 + "from_node_id": 344, 7642 + "to_node_id": 345, 7643 + "from_change_id": "2a06900e-ea62-4adf-81d5-7f0cf1a29b31", 7644 + "to_change_id": "0ef352ed-538b-4632-8b62-ebb17603f944", 7645 + "edge_type": "leads_to", 7646 + "weight": 1.0, 7647 + "rationale": "Installation step for Tailwind integration", 7648 + "created_at": "2025-12-27T18:00:42.787737600-05:00" 7649 + }, 7650 + { 7651 + "id": 346, 7652 + "from_node_id": 344, 7653 + "to_node_id": 346, 7654 + "from_change_id": "2a06900e-ea62-4adf-81d5-7f0cf1a29b31", 7655 + "to_change_id": "888e6ad0-5002-4cdb-b35e-f4214ca07dfa", 7656 + "edge_type": "leads_to", 7657 + "weight": 1.0, 7658 + "rationale": "Configuration step for Tailwind", 7659 + "created_at": "2025-12-27T18:01:28.695956-05:00" 7660 + }, 7661 + { 7662 + "id": 347, 7663 + "from_node_id": 344, 7664 + "to_node_id": 347, 7665 + "from_change_id": "2a06900e-ea62-4adf-81d5-7f0cf1a29b31", 7666 + "to_change_id": "fae7a634-d921-4b6f-9620-0c58d88b863e", 7667 + "edge_type": "leads_to", 7668 + "weight": 1.0, 7669 + "rationale": "Build process integration", 7670 + "created_at": "2025-12-27T18:01:51.815468700-05:00" 7671 + }, 7672 + { 7673 + "id": 348, 7674 + "from_node_id": 344, 7675 + "to_node_id": 348, 7676 + "from_change_id": "2a06900e-ea62-4adf-81d5-7f0cf1a29b31", 7677 + "to_change_id": "c25a8f4b-8bf1-4a33-bef9-3731dfd83627", 7678 + "edge_type": "leads_to", 7679 + "weight": 1.0, 7680 + "rationale": "CSS conversion step", 7681 + "created_at": "2025-12-27T18:02:43.312580-05:00" 7682 + }, 7683 + { 7684 + "id": 349, 7685 + "from_node_id": 344, 7686 + "to_node_id": 349, 7687 + "from_change_id": "2a06900e-ea62-4adf-81d5-7f0cf1a29b31", 7688 + "to_change_id": "c65ee3d9-62a0-47aa-870a-f6422ff2536a", 7689 + "edge_type": "leads_to", 7690 + "weight": 1.0, 7691 + "rationale": "HTML conversion step", 7692 + "created_at": "2025-12-27T18:03:01.642571400-05:00" 7693 + }, 7694 + { 7695 + "id": 350, 7696 + "from_node_id": 344, 7697 + "to_node_id": 350, 7698 + "from_change_id": "2a06900e-ea62-4adf-81d5-7f0cf1a29b31", 7699 + "to_change_id": "8136e615-5baa-4fe5-9a7d-d672ff1a6f85", 7700 + "edge_type": "leads_to", 7701 + "weight": 1.0, 7702 + "rationale": "Final outcome of Tailwind integration", 7703 + "created_at": "2025-12-27T18:07:51.011406300-05:00" 7561 7704 } 7562 7705 ] 7563 7706 }
+35 -1
packages/extension/build.js
··· 2 2 import * as fs from 'fs'; 3 3 import * as path from 'path'; 4 4 import { fileURLToPath } from 'url'; 5 + import postcss from 'postcss'; 6 + import tailwindcss from 'tailwindcss'; 7 + import autoprefixer from 'autoprefixer'; 5 8 6 9 const __dirname = path.dirname(fileURLToPath(import.meta.url)); 7 10 ··· 76 79 // Copy static files 77 80 copyStaticFiles(); 78 81 82 + // Process CSS with Tailwind 83 + await processCSS(); 84 + 79 85 if (!watch) { 80 86 console.log('✨ Build complete!'); 81 87 } ··· 85 91 } 86 92 } 87 93 94 + // Process CSS with PostCSS (Tailwind + Autoprefixer) 95 + async function processCSS() { 96 + const cssPath = path.join(__dirname, 'src/popup/popup.css'); 97 + const outputPath = path.join(distDir, 'popup/popup.css'); 98 + 99 + const css = fs.readFileSync(cssPath, 'utf8'); 100 + 101 + // Import cssnano dynamically for production minification 102 + const plugins = [tailwindcss, autoprefixer]; 103 + if (isProd) { 104 + const cssnano = (await import('cssnano')).default; 105 + plugins.push(cssnano); 106 + } 107 + 108 + const result = await postcss(plugins).process(css, { 109 + from: cssPath, 110 + to: outputPath, 111 + }); 112 + 113 + // Create directory if it doesn't exist 114 + const destDir = path.dirname(outputPath); 115 + if (!fs.existsSync(destDir)) { 116 + fs.mkdirSync(destDir, { recursive: true }); 117 + } 118 + 119 + fs.writeFileSync(outputPath, result.css); 120 + console.log('🎨 Processed CSS with Tailwind'); 121 + } 122 + 88 123 // Copy static files 89 124 function copyStaticFiles() { 90 125 const filesToCopy = [ 91 126 { from: 'manifest.json', to: 'manifest.json' }, 92 127 { from: 'src/popup/popup.html', to: 'popup/popup.html' }, 93 - { from: 'src/popup/popup.css', to: 'popup/popup.css' }, 94 128 ]; 95 129 96 130 for (const file of filesToCopy) {
+4
packages/extension/package.json
··· 16 16 }, 17 17 "devDependencies": { 18 18 "@types/chrome": "^0.0.256", 19 + "autoprefixer": "^10.4.23", 20 + "cssnano": "^7.1.2", 19 21 "esbuild": "^0.19.11", 22 + "postcss": "^8.5.6", 23 + "tailwindcss": "^3.4.19", 20 24 "typescript": "^5.3.3" 21 25 } 22 26 }
+7
packages/extension/postcss.config.js
··· 1 + export default { 2 + plugins: { 3 + tailwindcss: {}, 4 + autoprefixer: {}, 5 + ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}), 6 + }, 7 + };
+16 -283
packages/extension/src/popup/popup.css
··· 1 - * { 2 - margin: 0; 3 - padding: 0; 4 - box-sizing: border-box; 5 - } 6 - 7 - code { 8 - background: rgba(0, 0, 0, 0.1); 9 - padding: 4px 8px; 10 - border-radius: 4px; 11 - font-family: 'Courier New', monospace; 12 - font-size: 11px; 13 - display: inline-block; 14 - margin: 8px 0; 15 - } 16 - 17 - @media (prefers-color-scheme: dark) { 18 - code { 19 - background: rgba(255, 255, 255, 0.1); 20 - } 21 - } 22 - 23 - body { 24 - width: 350px; 25 - min-height: 400px; 26 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; 27 - color: #1e293b; 28 - background: linear-gradient(135deg, #faf5ff 0%, #ffffff 50%, #ecfeff 100%); 29 - } 30 - 31 - @media (prefers-color-scheme: dark) { 32 - body { 33 - color: #e0f2fe; 34 - background: linear-gradient(135deg, #0f172a 0%, #1e1b4b 50%, #0c4a6e 100%); 35 - } 36 - } 37 - 38 - .container { 39 - display: flex; 40 - flex-direction: column; 41 - min-height: 400px; 42 - } 43 - 44 - header { 45 - background: linear-gradient(to right, #facc15 0%, #f97316 50%, #ec4899 100%); 46 - color: white; 47 - padding: 20px; 48 - text-align: center; 49 - } 50 - 51 - h1 { 52 - font-size: 20px; 53 - font-weight: 700; 54 - margin-bottom: 4px; 55 - } 56 - 57 - .tagline { 58 - font-size: 13px; 59 - opacity: 0.9; 60 - } 61 - 62 - main { 63 - flex: 1; 64 - padding: 24px 20px; 65 - display: flex; 66 - align-items: center; 67 - justify-content: center; 68 - } 69 - 70 - .state { 71 - width: 100%; 72 - text-align: center; 73 - } 74 - 75 - .state.hidden { 76 - display: none; 77 - } 1 + @tailwind base; 2 + @tailwind components; 3 + @tailwind utilities; 78 4 79 - .icon { 80 - font-size: 48px; 81 - margin-bottom: 16px; 82 - } 83 - 84 - .spinner { 85 - animation: spin 2s linear infinite; 86 - } 87 - 5 + /* Custom animations for spinner */ 88 6 @keyframes spin { 89 - from { transform: rotate(0deg); } 90 - to { transform: rotate(360deg); } 91 - } 92 - 93 - .message { 94 - font-size: 16px; 95 - font-weight: 600; 96 - margin-bottom: 12px; 97 - color: #334155; 98 - } 99 - 100 - @media (prefers-color-scheme: dark) { 101 - .message { 102 - color: #e0f2fe; 7 + from { 8 + transform: rotate(0deg); 103 9 } 104 - } 105 - 106 - .hint { 107 - font-size: 13px; 108 - color: #64748b; 109 - margin-top: 8px; 110 - } 111 - 112 - @media (prefers-color-scheme: dark) { 113 - .hint { 114 - color: #94a3b8; 10 + to { 11 + transform: rotate(360deg); 115 12 } 116 13 } 117 14 118 - .btn-primary { 119 - background: #ea580c; 120 - color: white; 121 - border: none; 122 - padding: 12px 24px; 123 - border-radius: 8px; 124 - font-size: 14px; 125 - font-weight: 600; 126 - cursor: pointer; 127 - margin-top: 16px; 128 - width: 100%; 129 - transition: transform 0.2s, box-shadow 0.2s, background-color 0.2s; 130 - } 131 - 132 - .btn-primary:hover { 133 - background: #c2410c; 134 - transform: translateY(-1px); 135 - box-shadow: 0 4px 12px rgba(234, 88, 12, 0.3); 136 - } 137 - 138 - .btn-primary:active { 139 - transform: translateY(0); 140 - } 141 - 142 - .btn-secondary { 143 - background: white; 144 - color: #6b21a8; 145 - border: 2px solid #6b21a8; 146 - padding: 10px 24px; 147 - border-radius: 8px; 148 - font-size: 14px; 149 - font-weight: 600; 150 - cursor: pointer; 151 - margin-top: 16px; 152 - width: 100%; 153 - transition: all 0.2s; 154 - } 155 - 156 - .btn-secondary:hover { 157 - background: #faf5ff; 158 - } 159 - 160 - @media (prefers-color-scheme: dark) { 161 - .btn-secondary { 162 - background: #1e1b4b; 163 - color: #06b6d4; 164 - border-color: #06b6d4; 15 + @keyframes pulse { 16 + 0%, 17 + 100% { 18 + opacity: 1; 165 19 } 166 - 167 - .btn-secondary:hover { 168 - background: #312e81; 20 + 50% { 21 + opacity: 0.7; 169 22 } 170 23 } 171 24 172 - .progress { 173 - margin-top: 20px; 174 - } 175 - 176 - .progress-bar { 177 - width: 100%; 178 - height: 8px; 179 - background: #f0f9ff; 180 - border-radius: 4px; 181 - overflow: hidden; 182 - margin-bottom: 12px; 183 - } 184 - 185 - @media (prefers-color-scheme: dark) { 186 - .progress-bar { 187 - background: #1e293b; 188 - } 25 + .spinner { 26 + animation: spin 2s linear infinite; 189 27 } 190 28 191 29 .progress-fill { 192 - height: 100%; 193 - background: linear-gradient(90deg, #ea580c 0%, #ec4899 100%); 194 - width: 0%; 195 - transition: width 0.3s ease; 196 30 animation: pulse 2s infinite; 197 31 } 198 - 199 - @keyframes pulse { 200 - 0%, 100% { opacity: 1; } 201 - 50% { opacity: 0.7; } 202 - } 203 - 204 - .progress-text { 205 - font-size: 16px; 206 - font-weight: 600; 207 - color: #334155; 208 - } 209 - 210 - @media (prefers-color-scheme: dark) { 211 - .progress-text { 212 - color: #e0f2fe; 213 - } 214 - } 215 - 216 - .status-message { 217 - font-size: 13px; 218 - color: #64748b; 219 - margin-top: 8px; 220 - } 221 - 222 - @media (prefers-color-scheme: dark) { 223 - .status-message { 224 - color: #94a3b8; 225 - } 226 - } 227 - 228 - .count-display { 229 - font-size: 14px; 230 - color: #64748b; 231 - margin-top: 8px; 232 - } 233 - 234 - @media (prefers-color-scheme: dark) { 235 - .count-display { 236 - color: #94a3b8; 237 - } 238 - } 239 - 240 - .count-display strong { 241 - color: #ea580c; 242 - font-size: 18px; 243 - } 244 - 245 - @media (prefers-color-scheme: dark) { 246 - .count-display strong { 247 - color: #fb923c; 248 - } 249 - } 250 - 251 - .error-message { 252 - font-size: 13px; 253 - color: #dc2626; 254 - margin-top: 8px; 255 - padding: 12px; 256 - background: #fee2e2; 257 - border-radius: 6px; 258 - border-left: 3px solid #dc2626; 259 - } 260 - 261 - @media (prefers-color-scheme: dark) { 262 - .error-message { 263 - color: #fca5a5; 264 - background: #450a0a; 265 - border-left-color: #ef4444; 266 - } 267 - } 268 - 269 - footer { 270 - padding: 16px; 271 - text-align: center; 272 - border-top: 1px solid #e0e7ff; 273 - background: white; 274 - } 275 - 276 - @media (prefers-color-scheme: dark) { 277 - footer { 278 - border-top-color: #1e293b; 279 - background: #0f172a; 280 - } 281 - } 282 - 283 - footer a { 284 - color: #ea580c; 285 - text-decoration: none; 286 - font-size: 13px; 287 - font-weight: 500; 288 - } 289 - 290 - @media (prefers-color-scheme: dark) { 291 - footer a { 292 - color: #fb923c; 293 - } 294 - } 295 - 296 - footer a:hover { 297 - text-decoration: underline; 298 - }
+51 -53
packages/extension/src/popup/popup.html
··· 6 6 <title>ATlast Importer</title> 7 7 <link rel="stylesheet" href="popup.css" /> 8 8 </head> 9 - <body> 10 - <div class="container"> 11 - <header> 12 - <h1>ATlast Importer</h1> 13 - <p class="tagline">Find your follows in the ATmosphere</p> 9 + <body class="w-[350px] min-h-[400px] font-sans text-slate-800 dark:text-cyan-50 bg-gradient-to-br from-purple-50 via-white to-cyan-50 dark:from-slate-900 dark:via-purple-950 dark:to-sky-900"> 10 + <div class="flex flex-col min-h-[400px]"> 11 + <header class="bg-firefly-banner text-white p-5 text-center"> 12 + <h1 class="text-xl font-bold mb-1">ATlast Importer</h1> 13 + <p class="text-[13px] opacity-90">Find your follows in the ATmosphere</p> 14 14 </header> 15 15 16 - <main id="app"> 16 + <main id="app" class="flex-1 px-5 py-6 flex items-center justify-center"> 17 17 <!-- Idle state --> 18 - <div id="state-idle" class="state hidden"> 19 - <div class="icon">🔍</div> 20 - <p class="message"> 18 + <div id="state-idle" class="w-full text-center hidden"> 19 + <div class="text-5xl mb-4">🔍</div> 20 + <p class="text-base font-semibold mb-3 text-slate-700 dark:text-cyan-50"> 21 21 Go to your Twitter/X Following page to start 22 22 </p> 23 - <p class="hint">Visit x.com/yourusername/following</p> 23 + <p class="text-[13px] text-slate-500 dark:text-slate-400 mt-2">Visit x.com/yourusername/following</p> 24 24 </div> 25 25 26 26 <!-- Ready state --> 27 - <div id="state-ready" class="state hidden"> 28 - <div class="icon">✅</div> 29 - <p class="message"> 27 + <div id="state-ready" class="w-full text-center hidden"> 28 + <div class="text-5xl mb-4">✅</div> 29 + <p class="text-base font-semibold mb-3 text-slate-700 dark:text-cyan-50"> 30 30 Ready to scan <span id="platform-name"></span> 31 31 </p> 32 - <button id="btn-start" class="btn-primary"> 32 + <button id="btn-start" class="w-full bg-orange-600 hover:bg-orange-700 text-white font-semibold py-3 px-6 rounded-lg mt-4 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-orange-600/30 active:translate-y-0"> 33 33 Start Scan 34 34 </button> 35 35 </div> 36 36 37 37 <!-- Scraping state --> 38 - <div id="state-scraping" class="state hidden"> 39 - <div class="icon spinner">⏳</div> 40 - <p class="message">Scanning...</p> 41 - <div class="progress"> 42 - <div class="progress-bar"> 43 - <div id="progress-fill" class="progress-fill"></div> 38 + <div id="state-scraping" class="w-full text-center hidden"> 39 + <div class="text-5xl mb-4 spinner">⏳</div> 40 + <p class="text-base font-semibold mb-3 text-slate-700 dark:text-cyan-50">Scanning...</p> 41 + <div class="mt-5"> 42 + <div class="w-full h-2 bg-sky-50 dark:bg-slate-800 rounded overflow-hidden mb-3"> 43 + <div id="progress-fill" class="h-full bg-gradient-to-r from-orange-600 to-pink-600 w-0 transition-all duration-300 progress-fill"></div> 44 44 </div> 45 - <p class="progress-text"> 45 + <p class="text-base font-semibold text-slate-700 dark:text-cyan-50"> 46 46 Found <span id="count">0</span> users 47 47 </p> 48 - <p id="status-message" class="status-message"></p> 48 + <p id="status-message" class="text-[13px] text-slate-500 dark:text-slate-400 mt-2"></p> 49 49 </div> 50 50 </div> 51 51 52 52 <!-- Complete state --> 53 - <div id="state-complete" class="state hidden"> 54 - <div class="icon">🎉</div> 55 - <p class="message">Scan complete!</p> 56 - <p class="count-display"> 57 - Found <strong id="final-count">0</strong> users 53 + <div id="state-complete" class="w-full text-center hidden"> 54 + <div class="text-5xl mb-4">🎉</div> 55 + <p class="text-base font-semibold mb-3 text-slate-700 dark:text-cyan-50">Scan complete!</p> 56 + <p class="text-sm text-slate-500 dark:text-slate-400 mt-2"> 57 + Found <strong id="final-count" class="text-orange-600 dark:text-orange-400 text-lg">0</strong> users 58 58 </p> 59 - <button id="btn-upload" class="btn-primary"> 59 + <button id="btn-upload" class="w-full bg-orange-600 hover:bg-orange-700 text-white font-semibold py-3 px-6 rounded-lg mt-4 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-orange-600/30 active:translate-y-0"> 60 60 Open in ATlast 61 61 </button> 62 62 </div> 63 63 64 64 <!-- Uploading state --> 65 - <div id="state-uploading" class="state hidden"> 66 - <div class="icon spinner">📤</div> 67 - <p class="message">Uploading to ATlast...</p> 65 + <div id="state-uploading" class="w-full text-center hidden"> 66 + <div class="text-5xl mb-4 spinner">📤</div> 67 + <p class="text-base font-semibold mb-3 text-slate-700 dark:text-cyan-50">Uploading to ATlast...</p> 68 68 </div> 69 69 70 70 <!-- Error state --> 71 - <div id="state-error" class="state hidden"> 72 - <div class="icon">⚠️</div> 73 - <p class="message">Error</p> 74 - <p id="error-message" class="error-message"></p> 75 - <button id="btn-retry" class="btn-secondary"> 71 + <div id="state-error" class="w-full text-center hidden"> 72 + <div class="text-5xl mb-4">⚠️</div> 73 + <p class="text-base font-semibold mb-3 text-slate-700 dark:text-cyan-50">Error</p> 74 + <p id="error-message" class="text-[13px] text-red-600 dark:text-red-400 mt-2 p-3 bg-red-50 dark:bg-red-950/50 rounded border-l-[3px] border-red-600"></p> 75 + <button id="btn-retry" class="w-full bg-white dark:bg-purple-950 text-purple-700 dark:text-cyan-400 border-2 border-purple-700 dark:border-cyan-400 font-semibold py-2.5 px-6 rounded-lg mt-4 transition-all duration-200 hover:bg-purple-50 dark:hover:bg-purple-900"> 76 76 Try Again 77 77 </button> 78 78 </div> 79 79 80 80 <!-- Server offline state --> 81 - <div id="state-offline" class="state hidden"> 82 - <div class="icon">🔌</div> 83 - <p class="message">ATlast server not running</p> 84 - <p class="error-message"> 81 + <div id="state-offline" class="w-full text-center hidden"> 82 + <div class="text-5xl mb-4">🔌</div> 83 + <p class="text-base font-semibold mb-3 text-slate-700 dark:text-cyan-50">ATlast server not running</p> 84 + <p class="text-[13px] text-red-600 dark:text-red-400 mt-2 p-3 bg-red-50 dark:bg-red-950/50 rounded border-l-[3px] border-red-600"> 85 85 Start the dev server:<br /> 86 - <code>npx netlify-cli dev --filter @atlast/web</code> 86 + <code class="bg-black/10 dark:bg-white/10 px-2 py-1 rounded font-mono text-[11px] inline-block my-2">npx netlify-cli dev --filter @atlast/web</code> 87 87 </p> 88 - <p class="hint" id="server-url"></p> 89 - <button id="btn-check-server" class="btn-primary"> 88 + <p class="text-[13px] text-slate-500 dark:text-slate-400 mt-2" id="server-url"></p> 89 + <button id="btn-check-server" class="w-full bg-orange-600 hover:bg-orange-700 text-white font-semibold py-3 px-6 rounded-lg mt-4 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-orange-600/30 active:translate-y-0"> 90 90 Check Again 91 91 </button> 92 92 </div> 93 93 94 94 <!-- Not logged in state --> 95 - <div id="state-not-logged-in" class="state hidden"> 96 - <div class="icon">🔐</div> 97 - <p class="message">Not logged in to ATlast</p> 98 - <p class="error-message"> 95 + <div id="state-not-logged-in" class="w-full text-center hidden"> 96 + <div class="text-5xl mb-4">🔐</div> 97 + <p class="text-base font-semibold mb-3 text-slate-700 dark:text-cyan-50">Not logged in to ATlast</p> 98 + <p class="text-[13px] text-red-600 dark:text-red-400 mt-2 p-3 bg-red-50 dark:bg-red-950/50 rounded border-l-[3px] border-red-600"> 99 99 Please log in to ATlast first, then return here to scan. 100 100 </p> 101 - <button id="btn-open-atlast" class="btn-primary"> 101 + <button id="btn-open-atlast" class="w-full bg-orange-600 hover:bg-orange-700 text-white font-semibold py-3 px-6 rounded-lg mt-4 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-orange-600/30 active:translate-y-0"> 102 102 Open ATlast 103 103 </button> 104 - <button id="btn-retry-login" class="btn-secondary"> 104 + <button id="btn-retry-login" class="w-full bg-white dark:bg-purple-950 text-purple-700 dark:text-cyan-400 border-2 border-purple-700 dark:border-cyan-400 font-semibold py-2.5 px-6 rounded-lg mt-4 transition-all duration-200 hover:bg-purple-50 dark:hover:bg-purple-900"> 105 105 Check Again 106 106 </button> 107 107 </div> 108 108 </main> 109 109 110 - <footer> 111 - <a href="https://atlast.byarielm.fyi" target="_blank" 112 - >atlast.byarielm.fyi</a 113 - > 110 + <footer class="p-4 text-center border-t border-purple-200 dark:border-slate-800 bg-white dark:bg-slate-900"> 111 + <a href="https://atlast.byarielm.fyi" target="_blank" class="text-orange-600 dark:text-orange-400 no-underline text-[13px] font-medium hover:underline">atlast.byarielm.fyi</a> 114 112 </footer> 115 113 </div> 116 114
+35
packages/extension/tailwind.config.js
··· 1 + /** @type {import('tailwindcss').Config} */ 2 + export default { 3 + // Use class-based dark mode to match web app 4 + darkMode: "class", 5 + 6 + // Scan popup HTML and TypeScript files 7 + content: [ 8 + "./src/popup/**/*.{html,ts}", 9 + "./src/content/**/*.ts", 10 + ], 11 + 12 + // Extend with same custom config as web app 13 + theme: { 14 + extend: { 15 + colors: { 16 + firefly: { 17 + glow: "#FCD34D", 18 + amber: "#F59E0B", 19 + orange: "#F97316", 20 + pink: "#EC4899", 21 + cyan: "#10D2F4", 22 + }, 23 + cyan: { 250: "#72EEFD" }, 24 + purple: { 750: "#6A1DD1" }, 25 + yellow: { 650: "#C56508" }, 26 + orange: { 650: "#DF3F00" }, 27 + pink: { 650: "#CD206A" }, 28 + }, 29 + backgroundImage: ({ theme }) => ({ 30 + "firefly-banner": `linear-gradient(to right, ${theme("colors.yellow.400")}, ${theme("colors.orange.500")}, ${theme("colors.pink.600")})`, 31 + "firefly-banner-dark": `linear-gradient(to right, ${theme("colors.yellow.600")}, ${theme("colors.orange.600")}, ${theme("colors.pink.700")})`, 32 + }), 33 + }, 34 + }, 35 + };
+563
pnpm-lock.yaml
··· 118 118 '@types/chrome': 119 119 specifier: ^0.0.256 120 120 version: 0.0.256 121 + autoprefixer: 122 + specifier: ^10.4.23 123 + version: 10.4.23(postcss@8.5.6) 124 + cssnano: 125 + specifier: ^7.1.2 126 + version: 7.1.2(postcss@8.5.6) 121 127 esbuild: 122 128 specifier: ^0.19.11 123 129 version: 0.19.12 130 + postcss: 131 + specifier: ^8.5.6 132 + version: 8.5.6 133 + tailwindcss: 134 + specifier: ^3.4.19 135 + version: 3.4.19 124 136 typescript: 125 137 specifier: ^5.3.3 126 138 version: 5.9.3 ··· 1431 1443 bindings@1.5.0: 1432 1444 resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 1433 1445 1446 + boolbase@1.0.0: 1447 + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 1448 + 1434 1449 brace-expansion@2.0.2: 1435 1450 resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 1436 1451 ··· 1471 1486 resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 1472 1487 engines: {node: '>=10'} 1473 1488 1489 + caniuse-api@3.0.0: 1490 + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} 1491 + 1474 1492 caniuse-lite@1.0.30001761: 1475 1493 resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} 1476 1494 ··· 1512 1530 color@5.0.3: 1513 1531 resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} 1514 1532 engines: {node: '>=18'} 1533 + 1534 + colord@2.9.3: 1535 + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} 1515 1536 1516 1537 commander@10.0.1: 1517 1538 resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 1518 1539 engines: {node: '>=14'} 1519 1540 1541 + commander@11.1.0: 1542 + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} 1543 + engines: {node: '>=16'} 1544 + 1520 1545 commander@12.1.0: 1521 1546 resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} 1522 1547 engines: {node: '>=18'} ··· 1586 1611 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1587 1612 engines: {node: '>= 8'} 1588 1613 1614 + css-declaration-sorter@7.3.0: 1615 + resolution: {integrity: sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==} 1616 + engines: {node: ^14 || ^16 || >=18} 1617 + peerDependencies: 1618 + postcss: ^8.0.9 1619 + 1620 + css-select@5.2.2: 1621 + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} 1622 + 1623 + css-tree@2.2.1: 1624 + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} 1625 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} 1626 + 1627 + css-tree@3.1.0: 1628 + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} 1629 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 1630 + 1631 + css-what@6.2.2: 1632 + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} 1633 + engines: {node: '>= 6'} 1634 + 1589 1635 cssesc@3.0.0: 1590 1636 resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1591 1637 engines: {node: '>=4'} 1592 1638 hasBin: true 1639 + 1640 + cssnano-preset-default@7.0.10: 1641 + resolution: {integrity: sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA==} 1642 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 1643 + peerDependencies: 1644 + postcss: ^8.4.32 1645 + 1646 + cssnano-utils@5.0.1: 1647 + resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==} 1648 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 1649 + peerDependencies: 1650 + postcss: ^8.4.32 1651 + 1652 + cssnano@7.1.2: 1653 + resolution: {integrity: sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA==} 1654 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 1655 + peerDependencies: 1656 + postcss: ^8.4.32 1657 + 1658 + csso@5.0.5: 1659 + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} 1660 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} 1593 1661 1594 1662 csstype@3.2.3: 1595 1663 resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} ··· 1669 1737 dlv@1.1.3: 1670 1738 resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1671 1739 1740 + dom-serializer@2.0.0: 1741 + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 1742 + 1743 + domelementtype@2.3.0: 1744 + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 1745 + 1746 + domhandler@5.0.3: 1747 + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 1748 + engines: {node: '>= 4'} 1749 + 1750 + domutils@3.2.2: 1751 + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 1752 + 1672 1753 dot-case@3.0.4: 1673 1754 resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 1674 1755 ··· 2121 2202 resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} 2122 2203 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2123 2204 2205 + lodash.memoize@4.1.2: 2206 + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 2207 + 2208 + lodash.uniq@4.5.0: 2209 + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} 2210 + 2124 2211 lodash@4.17.21: 2125 2212 resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2126 2213 ··· 2156 2243 make-dir@3.1.0: 2157 2244 resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 2158 2245 engines: {node: '>=8'} 2246 + 2247 + mdn-data@2.0.28: 2248 + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} 2249 + 2250 + mdn-data@2.12.2: 2251 + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} 2159 2252 2160 2253 merge-options@3.0.4: 2161 2254 resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} ··· 2257 2350 npm-run-path@5.3.0: 2258 2351 resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 2259 2352 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2353 + 2354 + nth-check@2.1.1: 2355 + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 2260 2356 2261 2357 object-assign@4.1.1: 2262 2358 resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} ··· 2394 2490 resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 2395 2491 engines: {node: '>=8'} 2396 2492 2493 + postcss-calc@10.1.1: 2494 + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} 2495 + engines: {node: ^18.12 || ^20.9 || >=22.0} 2496 + peerDependencies: 2497 + postcss: ^8.4.38 2498 + 2499 + postcss-colormin@7.0.5: 2500 + resolution: {integrity: sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA==} 2501 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2502 + peerDependencies: 2503 + postcss: ^8.4.32 2504 + 2505 + postcss-convert-values@7.0.8: 2506 + resolution: {integrity: sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg==} 2507 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2508 + peerDependencies: 2509 + postcss: ^8.4.32 2510 + 2511 + postcss-discard-comments@7.0.5: 2512 + resolution: {integrity: sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ==} 2513 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2514 + peerDependencies: 2515 + postcss: ^8.4.32 2516 + 2517 + postcss-discard-duplicates@7.0.2: 2518 + resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==} 2519 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2520 + peerDependencies: 2521 + postcss: ^8.4.32 2522 + 2523 + postcss-discard-empty@7.0.1: 2524 + resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==} 2525 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2526 + peerDependencies: 2527 + postcss: ^8.4.32 2528 + 2529 + postcss-discard-overridden@7.0.1: 2530 + resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==} 2531 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2532 + peerDependencies: 2533 + postcss: ^8.4.32 2534 + 2397 2535 postcss-import@15.1.0: 2398 2536 resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 2399 2537 engines: {node: '>=14.0.0'} ··· 2424 2562 yaml: 2425 2563 optional: true 2426 2564 2565 + postcss-merge-longhand@7.0.5: 2566 + resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==} 2567 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2568 + peerDependencies: 2569 + postcss: ^8.4.32 2570 + 2571 + postcss-merge-rules@7.0.7: 2572 + resolution: {integrity: sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew==} 2573 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2574 + peerDependencies: 2575 + postcss: ^8.4.32 2576 + 2577 + postcss-minify-font-values@7.0.1: 2578 + resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==} 2579 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2580 + peerDependencies: 2581 + postcss: ^8.4.32 2582 + 2583 + postcss-minify-gradients@7.0.1: 2584 + resolution: {integrity: sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==} 2585 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2586 + peerDependencies: 2587 + postcss: ^8.4.32 2588 + 2589 + postcss-minify-params@7.0.5: 2590 + resolution: {integrity: sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ==} 2591 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2592 + peerDependencies: 2593 + postcss: ^8.4.32 2594 + 2595 + postcss-minify-selectors@7.0.5: 2596 + resolution: {integrity: sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==} 2597 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2598 + peerDependencies: 2599 + postcss: ^8.4.32 2600 + 2427 2601 postcss-nested@6.2.0: 2428 2602 resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} 2429 2603 engines: {node: '>=12.0'} 2430 2604 peerDependencies: 2431 2605 postcss: ^8.2.14 2432 2606 2607 + postcss-normalize-charset@7.0.1: 2608 + resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==} 2609 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2610 + peerDependencies: 2611 + postcss: ^8.4.32 2612 + 2613 + postcss-normalize-display-values@7.0.1: 2614 + resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==} 2615 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2616 + peerDependencies: 2617 + postcss: ^8.4.32 2618 + 2619 + postcss-normalize-positions@7.0.1: 2620 + resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==} 2621 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2622 + peerDependencies: 2623 + postcss: ^8.4.32 2624 + 2625 + postcss-normalize-repeat-style@7.0.1: 2626 + resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==} 2627 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2628 + peerDependencies: 2629 + postcss: ^8.4.32 2630 + 2631 + postcss-normalize-string@7.0.1: 2632 + resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==} 2633 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2634 + peerDependencies: 2635 + postcss: ^8.4.32 2636 + 2637 + postcss-normalize-timing-functions@7.0.1: 2638 + resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==} 2639 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2640 + peerDependencies: 2641 + postcss: ^8.4.32 2642 + 2643 + postcss-normalize-unicode@7.0.5: 2644 + resolution: {integrity: sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q==} 2645 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2646 + peerDependencies: 2647 + postcss: ^8.4.32 2648 + 2649 + postcss-normalize-url@7.0.1: 2650 + resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==} 2651 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2652 + peerDependencies: 2653 + postcss: ^8.4.32 2654 + 2655 + postcss-normalize-whitespace@7.0.1: 2656 + resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==} 2657 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2658 + peerDependencies: 2659 + postcss: ^8.4.32 2660 + 2661 + postcss-ordered-values@7.0.2: 2662 + resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==} 2663 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2664 + peerDependencies: 2665 + postcss: ^8.4.32 2666 + 2667 + postcss-reduce-initial@7.0.5: 2668 + resolution: {integrity: sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA==} 2669 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2670 + peerDependencies: 2671 + postcss: ^8.4.32 2672 + 2673 + postcss-reduce-transforms@7.0.1: 2674 + resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==} 2675 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2676 + peerDependencies: 2677 + postcss: ^8.4.32 2678 + 2433 2679 postcss-selector-parser@6.1.2: 2434 2680 resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 2435 2681 engines: {node: '>=4'} 2682 + 2683 + postcss-selector-parser@7.1.1: 2684 + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} 2685 + engines: {node: '>=4'} 2686 + 2687 + postcss-svgo@7.1.0: 2688 + resolution: {integrity: sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==} 2689 + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} 2690 + peerDependencies: 2691 + postcss: ^8.4.32 2692 + 2693 + postcss-unique-selectors@7.0.4: 2694 + resolution: {integrity: sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==} 2695 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2696 + peerDependencies: 2697 + postcss: ^8.4.32 2436 2698 2437 2699 postcss-value-parser@4.2.0: 2438 2700 resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} ··· 2596 2858 resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 2597 2859 engines: {node: '>=10'} 2598 2860 2861 + sax@1.4.3: 2862 + resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} 2863 + 2599 2864 scheduler@0.23.2: 2600 2865 resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 2601 2866 ··· 2692 2957 resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} 2693 2958 engines: {node: '>=0.10.0'} 2694 2959 2960 + stylehacks@7.0.7: 2961 + resolution: {integrity: sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g==} 2962 + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} 2963 + peerDependencies: 2964 + postcss: ^8.4.32 2965 + 2695 2966 sucrase@3.35.1: 2696 2967 resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} 2697 2968 engines: {node: '>=16 || 14 >=14.17'} ··· 2703 2974 2704 2975 svg-parser@2.0.4: 2705 2976 resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} 2977 + 2978 + svgo@4.0.0: 2979 + resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} 2980 + engines: {node: '>=16'} 2981 + hasBin: true 2706 2982 2707 2983 tailwindcss@3.4.19: 2708 2984 resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} ··· 4125 4401 dependencies: 4126 4402 file-uri-to-path: 1.0.0 4127 4403 4404 + boolbase@1.0.0: {} 4405 + 4128 4406 brace-expansion@2.0.2: 4129 4407 dependencies: 4130 4408 balanced-match: 1.0.2 ··· 4160 4438 4161 4439 camelcase@6.3.0: {} 4162 4440 4441 + caniuse-api@3.0.0: 4442 + dependencies: 4443 + browserslist: 4.28.1 4444 + caniuse-lite: 1.0.30001761 4445 + lodash.memoize: 4.1.2 4446 + lodash.uniq: 4.5.0 4447 + 4163 4448 caniuse-lite@1.0.30001761: {} 4164 4449 4165 4450 chokidar@3.6.0: ··· 4207 4492 color-convert: 3.1.3 4208 4493 color-string: 2.1.4 4209 4494 4495 + colord@2.9.3: {} 4496 + 4210 4497 commander@10.0.1: {} 4498 + 4499 + commander@11.1.0: {} 4211 4500 4212 4501 commander@12.1.0: {} 4213 4502 ··· 4268 4557 shebang-command: 2.0.0 4269 4558 which: 2.0.2 4270 4559 4560 + css-declaration-sorter@7.3.0(postcss@8.5.6): 4561 + dependencies: 4562 + postcss: 8.5.6 4563 + 4564 + css-select@5.2.2: 4565 + dependencies: 4566 + boolbase: 1.0.0 4567 + css-what: 6.2.2 4568 + domhandler: 5.0.3 4569 + domutils: 3.2.2 4570 + nth-check: 2.1.1 4571 + 4572 + css-tree@2.2.1: 4573 + dependencies: 4574 + mdn-data: 2.0.28 4575 + source-map-js: 1.2.1 4576 + 4577 + css-tree@3.1.0: 4578 + dependencies: 4579 + mdn-data: 2.12.2 4580 + source-map-js: 1.2.1 4581 + 4582 + css-what@6.2.2: {} 4583 + 4271 4584 cssesc@3.0.0: {} 4272 4585 4586 + cssnano-preset-default@7.0.10(postcss@8.5.6): 4587 + dependencies: 4588 + browserslist: 4.28.1 4589 + css-declaration-sorter: 7.3.0(postcss@8.5.6) 4590 + cssnano-utils: 5.0.1(postcss@8.5.6) 4591 + postcss: 8.5.6 4592 + postcss-calc: 10.1.1(postcss@8.5.6) 4593 + postcss-colormin: 7.0.5(postcss@8.5.6) 4594 + postcss-convert-values: 7.0.8(postcss@8.5.6) 4595 + postcss-discard-comments: 7.0.5(postcss@8.5.6) 4596 + postcss-discard-duplicates: 7.0.2(postcss@8.5.6) 4597 + postcss-discard-empty: 7.0.1(postcss@8.5.6) 4598 + postcss-discard-overridden: 7.0.1(postcss@8.5.6) 4599 + postcss-merge-longhand: 7.0.5(postcss@8.5.6) 4600 + postcss-merge-rules: 7.0.7(postcss@8.5.6) 4601 + postcss-minify-font-values: 7.0.1(postcss@8.5.6) 4602 + postcss-minify-gradients: 7.0.1(postcss@8.5.6) 4603 + postcss-minify-params: 7.0.5(postcss@8.5.6) 4604 + postcss-minify-selectors: 7.0.5(postcss@8.5.6) 4605 + postcss-normalize-charset: 7.0.1(postcss@8.5.6) 4606 + postcss-normalize-display-values: 7.0.1(postcss@8.5.6) 4607 + postcss-normalize-positions: 7.0.1(postcss@8.5.6) 4608 + postcss-normalize-repeat-style: 7.0.1(postcss@8.5.6) 4609 + postcss-normalize-string: 7.0.1(postcss@8.5.6) 4610 + postcss-normalize-timing-functions: 7.0.1(postcss@8.5.6) 4611 + postcss-normalize-unicode: 7.0.5(postcss@8.5.6) 4612 + postcss-normalize-url: 7.0.1(postcss@8.5.6) 4613 + postcss-normalize-whitespace: 7.0.1(postcss@8.5.6) 4614 + postcss-ordered-values: 7.0.2(postcss@8.5.6) 4615 + postcss-reduce-initial: 7.0.5(postcss@8.5.6) 4616 + postcss-reduce-transforms: 7.0.1(postcss@8.5.6) 4617 + postcss-svgo: 7.1.0(postcss@8.5.6) 4618 + postcss-unique-selectors: 7.0.4(postcss@8.5.6) 4619 + 4620 + cssnano-utils@5.0.1(postcss@8.5.6): 4621 + dependencies: 4622 + postcss: 8.5.6 4623 + 4624 + cssnano@7.1.2(postcss@8.5.6): 4625 + dependencies: 4626 + cssnano-preset-default: 7.0.10(postcss@8.5.6) 4627 + lilconfig: 3.1.3 4628 + postcss: 8.5.6 4629 + 4630 + csso@5.0.5: 4631 + dependencies: 4632 + css-tree: 2.2.1 4633 + 4273 4634 csstype@3.2.3: {} 4274 4635 4275 4636 date-fns@4.1.0: {} ··· 4349 4710 path-type: 4.0.0 4350 4711 4351 4712 dlv@1.1.3: {} 4713 + 4714 + dom-serializer@2.0.0: 4715 + dependencies: 4716 + domelementtype: 2.3.0 4717 + domhandler: 5.0.3 4718 + entities: 4.5.0 4719 + 4720 + domelementtype@2.3.0: {} 4721 + 4722 + domhandler@5.0.3: 4723 + dependencies: 4724 + domelementtype: 2.3.0 4725 + 4726 + domutils@3.2.2: 4727 + dependencies: 4728 + dom-serializer: 2.0.0 4729 + domelementtype: 2.3.0 4730 + domhandler: 5.0.3 4352 4731 4353 4732 dot-case@3.0.4: 4354 4733 dependencies: ··· 4817 5196 dependencies: 4818 5197 p-locate: 6.0.0 4819 5198 5199 + lodash.memoize@4.1.2: {} 5200 + 5201 + lodash.uniq@4.5.0: {} 5202 + 4820 5203 lodash@4.17.21: {} 4821 5204 4822 5205 logform@2.7.0: ··· 4855 5238 make-dir@3.1.0: 4856 5239 dependencies: 4857 5240 semver: 6.3.1 5241 + 5242 + mdn-data@2.0.28: {} 5243 + 5244 + mdn-data@2.12.2: {} 4858 5245 4859 5246 merge-options@3.0.4: 4860 5247 dependencies: ··· 4941 5328 dependencies: 4942 5329 path-key: 4.0.0 4943 5330 5331 + nth-check@2.1.1: 5332 + dependencies: 5333 + boolbase: 1.0.0 5334 + 4944 5335 object-assign@4.1.1: {} 4945 5336 4946 5337 object-hash@3.0.0: {} ··· 5051 5442 dependencies: 5052 5443 find-up: 4.1.0 5053 5444 5445 + postcss-calc@10.1.1(postcss@8.5.6): 5446 + dependencies: 5447 + postcss: 8.5.6 5448 + postcss-selector-parser: 7.1.1 5449 + postcss-value-parser: 4.2.0 5450 + 5451 + postcss-colormin@7.0.5(postcss@8.5.6): 5452 + dependencies: 5453 + browserslist: 4.28.1 5454 + caniuse-api: 3.0.0 5455 + colord: 2.9.3 5456 + postcss: 8.5.6 5457 + postcss-value-parser: 4.2.0 5458 + 5459 + postcss-convert-values@7.0.8(postcss@8.5.6): 5460 + dependencies: 5461 + browserslist: 4.28.1 5462 + postcss: 8.5.6 5463 + postcss-value-parser: 4.2.0 5464 + 5465 + postcss-discard-comments@7.0.5(postcss@8.5.6): 5466 + dependencies: 5467 + postcss: 8.5.6 5468 + postcss-selector-parser: 7.1.1 5469 + 5470 + postcss-discard-duplicates@7.0.2(postcss@8.5.6): 5471 + dependencies: 5472 + postcss: 8.5.6 5473 + 5474 + postcss-discard-empty@7.0.1(postcss@8.5.6): 5475 + dependencies: 5476 + postcss: 8.5.6 5477 + 5478 + postcss-discard-overridden@7.0.1(postcss@8.5.6): 5479 + dependencies: 5480 + postcss: 8.5.6 5481 + 5054 5482 postcss-import@15.1.0(postcss@8.5.6): 5055 5483 dependencies: 5056 5484 postcss: 8.5.6 ··· 5070 5498 jiti: 1.21.7 5071 5499 postcss: 8.5.6 5072 5500 5501 + postcss-merge-longhand@7.0.5(postcss@8.5.6): 5502 + dependencies: 5503 + postcss: 8.5.6 5504 + postcss-value-parser: 4.2.0 5505 + stylehacks: 7.0.7(postcss@8.5.6) 5506 + 5507 + postcss-merge-rules@7.0.7(postcss@8.5.6): 5508 + dependencies: 5509 + browserslist: 4.28.1 5510 + caniuse-api: 3.0.0 5511 + cssnano-utils: 5.0.1(postcss@8.5.6) 5512 + postcss: 8.5.6 5513 + postcss-selector-parser: 7.1.1 5514 + 5515 + postcss-minify-font-values@7.0.1(postcss@8.5.6): 5516 + dependencies: 5517 + postcss: 8.5.6 5518 + postcss-value-parser: 4.2.0 5519 + 5520 + postcss-minify-gradients@7.0.1(postcss@8.5.6): 5521 + dependencies: 5522 + colord: 2.9.3 5523 + cssnano-utils: 5.0.1(postcss@8.5.6) 5524 + postcss: 8.5.6 5525 + postcss-value-parser: 4.2.0 5526 + 5527 + postcss-minify-params@7.0.5(postcss@8.5.6): 5528 + dependencies: 5529 + browserslist: 4.28.1 5530 + cssnano-utils: 5.0.1(postcss@8.5.6) 5531 + postcss: 8.5.6 5532 + postcss-value-parser: 4.2.0 5533 + 5534 + postcss-minify-selectors@7.0.5(postcss@8.5.6): 5535 + dependencies: 5536 + cssesc: 3.0.0 5537 + postcss: 8.5.6 5538 + postcss-selector-parser: 7.1.1 5539 + 5073 5540 postcss-nested@6.2.0(postcss@8.5.6): 5074 5541 dependencies: 5075 5542 postcss: 8.5.6 5076 5543 postcss-selector-parser: 6.1.2 5077 5544 5545 + postcss-normalize-charset@7.0.1(postcss@8.5.6): 5546 + dependencies: 5547 + postcss: 8.5.6 5548 + 5549 + postcss-normalize-display-values@7.0.1(postcss@8.5.6): 5550 + dependencies: 5551 + postcss: 8.5.6 5552 + postcss-value-parser: 4.2.0 5553 + 5554 + postcss-normalize-positions@7.0.1(postcss@8.5.6): 5555 + dependencies: 5556 + postcss: 8.5.6 5557 + postcss-value-parser: 4.2.0 5558 + 5559 + postcss-normalize-repeat-style@7.0.1(postcss@8.5.6): 5560 + dependencies: 5561 + postcss: 8.5.6 5562 + postcss-value-parser: 4.2.0 5563 + 5564 + postcss-normalize-string@7.0.1(postcss@8.5.6): 5565 + dependencies: 5566 + postcss: 8.5.6 5567 + postcss-value-parser: 4.2.0 5568 + 5569 + postcss-normalize-timing-functions@7.0.1(postcss@8.5.6): 5570 + dependencies: 5571 + postcss: 8.5.6 5572 + postcss-value-parser: 4.2.0 5573 + 5574 + postcss-normalize-unicode@7.0.5(postcss@8.5.6): 5575 + dependencies: 5576 + browserslist: 4.28.1 5577 + postcss: 8.5.6 5578 + postcss-value-parser: 4.2.0 5579 + 5580 + postcss-normalize-url@7.0.1(postcss@8.5.6): 5581 + dependencies: 5582 + postcss: 8.5.6 5583 + postcss-value-parser: 4.2.0 5584 + 5585 + postcss-normalize-whitespace@7.0.1(postcss@8.5.6): 5586 + dependencies: 5587 + postcss: 8.5.6 5588 + postcss-value-parser: 4.2.0 5589 + 5590 + postcss-ordered-values@7.0.2(postcss@8.5.6): 5591 + dependencies: 5592 + cssnano-utils: 5.0.1(postcss@8.5.6) 5593 + postcss: 8.5.6 5594 + postcss-value-parser: 4.2.0 5595 + 5596 + postcss-reduce-initial@7.0.5(postcss@8.5.6): 5597 + dependencies: 5598 + browserslist: 4.28.1 5599 + caniuse-api: 3.0.0 5600 + postcss: 8.5.6 5601 + 5602 + postcss-reduce-transforms@7.0.1(postcss@8.5.6): 5603 + dependencies: 5604 + postcss: 8.5.6 5605 + postcss-value-parser: 4.2.0 5606 + 5078 5607 postcss-selector-parser@6.1.2: 5079 5608 dependencies: 5080 5609 cssesc: 3.0.0 5081 5610 util-deprecate: 1.0.2 5611 + 5612 + postcss-selector-parser@7.1.1: 5613 + dependencies: 5614 + cssesc: 3.0.0 5615 + util-deprecate: 1.0.2 5616 + 5617 + postcss-svgo@7.1.0(postcss@8.5.6): 5618 + dependencies: 5619 + postcss: 8.5.6 5620 + postcss-value-parser: 4.2.0 5621 + svgo: 4.0.0 5622 + 5623 + postcss-unique-selectors@7.0.4(postcss@8.5.6): 5624 + dependencies: 5625 + postcss: 8.5.6 5626 + postcss-selector-parser: 7.1.1 5082 5627 5083 5628 postcss-value-parser@4.2.0: {} 5084 5629 ··· 5278 5823 5279 5824 safe-stable-stringify@2.5.0: {} 5280 5825 5826 + sax@1.4.3: {} 5827 + 5281 5828 scheduler@0.23.2: 5282 5829 dependencies: 5283 5830 loose-envify: 1.4.0 ··· 5373 5920 dependencies: 5374 5921 escape-string-regexp: 1.0.5 5375 5922 5923 + stylehacks@7.0.7(postcss@8.5.6): 5924 + dependencies: 5925 + browserslist: 4.28.1 5926 + postcss: 8.5.6 5927 + postcss-selector-parser: 7.1.1 5928 + 5376 5929 sucrase@3.35.1: 5377 5930 dependencies: 5378 5931 '@jridgewell/gen-mapping': 0.3.13 ··· 5386 5939 supports-preserve-symlinks-flag@1.0.0: {} 5387 5940 5388 5941 svg-parser@2.0.4: {} 5942 + 5943 + svgo@4.0.0: 5944 + dependencies: 5945 + commander: 11.1.0 5946 + css-select: 5.2.2 5947 + css-tree: 3.1.0 5948 + css-what: 6.2.2 5949 + csso: 5.0.5 5950 + picocolors: 1.1.1 5951 + sax: 1.4.3 5389 5952 5390 5953 tailwindcss@3.4.19: 5391 5954 dependencies: