+16
-16
docs/git-history.json
+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
+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
+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
+4
packages/extension/package.json
+7
packages/extension/postcss.config.js
+7
packages/extension/postcss.config.js
+16
-283
packages/extension/src/popup/popup.css
+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
+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
+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
+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: