FrederickSundeep commited on
Commit
7db2a6d
·
1 Parent(s): 656995f

commit update 0000001

Browse files
package-lock.json CHANGED
@@ -8,6 +8,9 @@
8
  "name": "react-template",
9
  "version": "0.1.0",
10
  "dependencies": {
 
 
 
11
  "@testing-library/dom": "^10.4.0",
12
  "@testing-library/jest-dom": "^6.6.3",
13
  "@testing-library/react": "^16.3.0",
@@ -2380,6 +2383,167 @@
2380
  "postcss-selector-parser": "^6.0.10"
2381
  }
2382
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2383
  "node_modules/@eslint-community/eslint-utils": {
2384
  "version": "4.7.0",
2385
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
@@ -2952,6 +3116,225 @@
2952
  "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
2953
  "license": "MIT"
2954
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2955
  "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
2956
  "version": "5.1.1-v1",
2957
  "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
@@ -3076,6 +3459,16 @@
3076
  }
3077
  }
3078
  },
 
 
 
 
 
 
 
 
 
 
3079
  "node_modules/@rollup/plugin-babel": {
3080
  "version": "5.3.1",
3081
  "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
@@ -3801,6 +4194,12 @@
3801
  "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
3802
  "license": "MIT"
3803
  },
 
 
 
 
 
 
3804
  "node_modules/@types/q": {
3805
  "version": "1.5.8",
3806
  "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz",
@@ -3819,6 +4218,25 @@
3819
  "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
3820
  "license": "MIT"
3821
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3822
  "node_modules/@types/resolve": {
3823
  "version": "1.17.1",
3824
  "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
@@ -5683,6 +6101,15 @@
5683
  "wrap-ansi": "^7.0.0"
5684
  }
5685
  },
 
 
 
 
 
 
 
 
 
5686
  "node_modules/co": {
5687
  "version": "4.6.0",
5688
  "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -6423,6 +6850,12 @@
6423
  "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
6424
  "license": "MIT"
6425
  },
 
 
 
 
 
 
6426
  "node_modules/damerau-levenshtein": {
6427
  "version": "1.0.8",
6428
  "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
@@ -6749,6 +7182,16 @@
6749
  "utila": "~0.4"
6750
  }
6751
  },
 
 
 
 
 
 
 
 
 
 
6752
  "node_modules/dom-serializer": {
6753
  "version": "1.4.1",
6754
  "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
@@ -8215,6 +8658,12 @@
8215
  "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
8216
  }
8217
  },
 
 
 
 
 
 
8218
  "node_modules/find-up": {
8219
  "version": "4.1.0",
8220
  "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -8957,6 +9406,21 @@
8957
  "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
8958
  "license": "CC0-1.0"
8959
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8960
  "node_modules/hoopy": {
8961
  "version": "0.1.4",
8962
  "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
@@ -14233,6 +14697,22 @@
14233
  "react": ">= 0.14.0"
14234
  }
14235
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14236
  "node_modules/read-cache": {
14237
  "version": "1.0.0",
14238
  "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -15850,6 +16330,12 @@
15850
  "postcss": "^8.2.15"
15851
  }
15852
  },
 
 
 
 
 
 
15853
  "node_modules/sucrase": {
15854
  "version": "3.35.0",
15855
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
@@ -16621,9 +17107,9 @@
16621
  }
16622
  },
16623
  "node_modules/typescript": {
16624
- "version": "5.8.3",
16625
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
16626
- "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
16627
  "license": "Apache-2.0",
16628
  "peer": true,
16629
  "bin": {
@@ -16631,7 +17117,7 @@
16631
  "tsserver": "bin/tsserver"
16632
  },
16633
  "engines": {
16634
- "node": ">=14.17"
16635
  }
16636
  },
16637
  "node_modules/unbox-primitive": {
 
8
  "name": "react-template",
9
  "version": "0.1.0",
10
  "dependencies": {
11
+ "@emotion/react": "^11.14.0",
12
+ "@emotion/styled": "^11.14.1",
13
+ "@mui/material": "^7.2.0",
14
  "@testing-library/dom": "^10.4.0",
15
  "@testing-library/jest-dom": "^6.6.3",
16
  "@testing-library/react": "^16.3.0",
 
2383
  "postcss-selector-parser": "^6.0.10"
2384
  }
2385
  },
2386
+ "node_modules/@emotion/babel-plugin": {
2387
+ "version": "11.13.5",
2388
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
2389
+ "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
2390
+ "license": "MIT",
2391
+ "dependencies": {
2392
+ "@babel/helper-module-imports": "^7.16.7",
2393
+ "@babel/runtime": "^7.18.3",
2394
+ "@emotion/hash": "^0.9.2",
2395
+ "@emotion/memoize": "^0.9.0",
2396
+ "@emotion/serialize": "^1.3.3",
2397
+ "babel-plugin-macros": "^3.1.0",
2398
+ "convert-source-map": "^1.5.0",
2399
+ "escape-string-regexp": "^4.0.0",
2400
+ "find-root": "^1.1.0",
2401
+ "source-map": "^0.5.7",
2402
+ "stylis": "4.2.0"
2403
+ }
2404
+ },
2405
+ "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
2406
+ "version": "1.9.0",
2407
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
2408
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
2409
+ "license": "MIT"
2410
+ },
2411
+ "node_modules/@emotion/babel-plugin/node_modules/source-map": {
2412
+ "version": "0.5.7",
2413
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2414
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
2415
+ "license": "BSD-3-Clause",
2416
+ "engines": {
2417
+ "node": ">=0.10.0"
2418
+ }
2419
+ },
2420
+ "node_modules/@emotion/cache": {
2421
+ "version": "11.14.0",
2422
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
2423
+ "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
2424
+ "license": "MIT",
2425
+ "dependencies": {
2426
+ "@emotion/memoize": "^0.9.0",
2427
+ "@emotion/sheet": "^1.4.0",
2428
+ "@emotion/utils": "^1.4.2",
2429
+ "@emotion/weak-memoize": "^0.4.0",
2430
+ "stylis": "4.2.0"
2431
+ }
2432
+ },
2433
+ "node_modules/@emotion/hash": {
2434
+ "version": "0.9.2",
2435
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
2436
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
2437
+ "license": "MIT"
2438
+ },
2439
+ "node_modules/@emotion/is-prop-valid": {
2440
+ "version": "1.3.1",
2441
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
2442
+ "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
2443
+ "license": "MIT",
2444
+ "dependencies": {
2445
+ "@emotion/memoize": "^0.9.0"
2446
+ }
2447
+ },
2448
+ "node_modules/@emotion/memoize": {
2449
+ "version": "0.9.0",
2450
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
2451
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
2452
+ "license": "MIT"
2453
+ },
2454
+ "node_modules/@emotion/react": {
2455
+ "version": "11.14.0",
2456
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
2457
+ "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
2458
+ "license": "MIT",
2459
+ "dependencies": {
2460
+ "@babel/runtime": "^7.18.3",
2461
+ "@emotion/babel-plugin": "^11.13.5",
2462
+ "@emotion/cache": "^11.14.0",
2463
+ "@emotion/serialize": "^1.3.3",
2464
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
2465
+ "@emotion/utils": "^1.4.2",
2466
+ "@emotion/weak-memoize": "^0.4.0",
2467
+ "hoist-non-react-statics": "^3.3.1"
2468
+ },
2469
+ "peerDependencies": {
2470
+ "react": ">=16.8.0"
2471
+ },
2472
+ "peerDependenciesMeta": {
2473
+ "@types/react": {
2474
+ "optional": true
2475
+ }
2476
+ }
2477
+ },
2478
+ "node_modules/@emotion/serialize": {
2479
+ "version": "1.3.3",
2480
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
2481
+ "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
2482
+ "license": "MIT",
2483
+ "dependencies": {
2484
+ "@emotion/hash": "^0.9.2",
2485
+ "@emotion/memoize": "^0.9.0",
2486
+ "@emotion/unitless": "^0.10.0",
2487
+ "@emotion/utils": "^1.4.2",
2488
+ "csstype": "^3.0.2"
2489
+ }
2490
+ },
2491
+ "node_modules/@emotion/sheet": {
2492
+ "version": "1.4.0",
2493
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
2494
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
2495
+ "license": "MIT"
2496
+ },
2497
+ "node_modules/@emotion/styled": {
2498
+ "version": "11.14.1",
2499
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz",
2500
+ "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==",
2501
+ "license": "MIT",
2502
+ "dependencies": {
2503
+ "@babel/runtime": "^7.18.3",
2504
+ "@emotion/babel-plugin": "^11.13.5",
2505
+ "@emotion/is-prop-valid": "^1.3.0",
2506
+ "@emotion/serialize": "^1.3.3",
2507
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
2508
+ "@emotion/utils": "^1.4.2"
2509
+ },
2510
+ "peerDependencies": {
2511
+ "@emotion/react": "^11.0.0-rc.0",
2512
+ "react": ">=16.8.0"
2513
+ },
2514
+ "peerDependenciesMeta": {
2515
+ "@types/react": {
2516
+ "optional": true
2517
+ }
2518
+ }
2519
+ },
2520
+ "node_modules/@emotion/unitless": {
2521
+ "version": "0.10.0",
2522
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
2523
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
2524
+ "license": "MIT"
2525
+ },
2526
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
2527
+ "version": "1.2.0",
2528
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
2529
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
2530
+ "license": "MIT",
2531
+ "peerDependencies": {
2532
+ "react": ">=16.8.0"
2533
+ }
2534
+ },
2535
+ "node_modules/@emotion/utils": {
2536
+ "version": "1.4.2",
2537
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
2538
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
2539
+ "license": "MIT"
2540
+ },
2541
+ "node_modules/@emotion/weak-memoize": {
2542
+ "version": "0.4.0",
2543
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
2544
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
2545
+ "license": "MIT"
2546
+ },
2547
  "node_modules/@eslint-community/eslint-utils": {
2548
  "version": "4.7.0",
2549
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
 
3116
  "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
3117
  "license": "MIT"
3118
  },
3119
+ "node_modules/@mui/core-downloads-tracker": {
3120
+ "version": "7.2.0",
3121
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.2.0.tgz",
3122
+ "integrity": "sha512-d49s7kEgI5iX40xb2YPazANvo7Bx0BLg/MNRwv+7BVpZUzXj1DaVCKlQTDex3gy/0jsCb4w7AY2uH4t4AJvSog==",
3123
+ "license": "MIT",
3124
+ "funding": {
3125
+ "type": "opencollective",
3126
+ "url": "https://opencollective.com/mui-org"
3127
+ }
3128
+ },
3129
+ "node_modules/@mui/material": {
3130
+ "version": "7.2.0",
3131
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.2.0.tgz",
3132
+ "integrity": "sha512-NTuyFNen5Z2QY+I242MDZzXnFIVIR6ERxo7vntFi9K1wCgSwvIl0HcAO2OOydKqqKApE6omRiYhpny1ZhGuH7Q==",
3133
+ "license": "MIT",
3134
+ "dependencies": {
3135
+ "@babel/runtime": "^7.27.6",
3136
+ "@mui/core-downloads-tracker": "^7.2.0",
3137
+ "@mui/system": "^7.2.0",
3138
+ "@mui/types": "^7.4.4",
3139
+ "@mui/utils": "^7.2.0",
3140
+ "@popperjs/core": "^2.11.8",
3141
+ "@types/react-transition-group": "^4.4.12",
3142
+ "clsx": "^2.1.1",
3143
+ "csstype": "^3.1.3",
3144
+ "prop-types": "^15.8.1",
3145
+ "react-is": "^19.1.0",
3146
+ "react-transition-group": "^4.4.5"
3147
+ },
3148
+ "engines": {
3149
+ "node": ">=14.0.0"
3150
+ },
3151
+ "funding": {
3152
+ "type": "opencollective",
3153
+ "url": "https://opencollective.com/mui-org"
3154
+ },
3155
+ "peerDependencies": {
3156
+ "@emotion/react": "^11.5.0",
3157
+ "@emotion/styled": "^11.3.0",
3158
+ "@mui/material-pigment-css": "^7.2.0",
3159
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
3160
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
3161
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
3162
+ },
3163
+ "peerDependenciesMeta": {
3164
+ "@emotion/react": {
3165
+ "optional": true
3166
+ },
3167
+ "@emotion/styled": {
3168
+ "optional": true
3169
+ },
3170
+ "@mui/material-pigment-css": {
3171
+ "optional": true
3172
+ },
3173
+ "@types/react": {
3174
+ "optional": true
3175
+ }
3176
+ }
3177
+ },
3178
+ "node_modules/@mui/material/node_modules/react-is": {
3179
+ "version": "19.1.0",
3180
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz",
3181
+ "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==",
3182
+ "license": "MIT"
3183
+ },
3184
+ "node_modules/@mui/private-theming": {
3185
+ "version": "7.2.0",
3186
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.2.0.tgz",
3187
+ "integrity": "sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw==",
3188
+ "license": "MIT",
3189
+ "dependencies": {
3190
+ "@babel/runtime": "^7.27.6",
3191
+ "@mui/utils": "^7.2.0",
3192
+ "prop-types": "^15.8.1"
3193
+ },
3194
+ "engines": {
3195
+ "node": ">=14.0.0"
3196
+ },
3197
+ "funding": {
3198
+ "type": "opencollective",
3199
+ "url": "https://opencollective.com/mui-org"
3200
+ },
3201
+ "peerDependencies": {
3202
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
3203
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
3204
+ },
3205
+ "peerDependenciesMeta": {
3206
+ "@types/react": {
3207
+ "optional": true
3208
+ }
3209
+ }
3210
+ },
3211
+ "node_modules/@mui/styled-engine": {
3212
+ "version": "7.2.0",
3213
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.2.0.tgz",
3214
+ "integrity": "sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==",
3215
+ "license": "MIT",
3216
+ "dependencies": {
3217
+ "@babel/runtime": "^7.27.6",
3218
+ "@emotion/cache": "^11.14.0",
3219
+ "@emotion/serialize": "^1.3.3",
3220
+ "@emotion/sheet": "^1.4.0",
3221
+ "csstype": "^3.1.3",
3222
+ "prop-types": "^15.8.1"
3223
+ },
3224
+ "engines": {
3225
+ "node": ">=14.0.0"
3226
+ },
3227
+ "funding": {
3228
+ "type": "opencollective",
3229
+ "url": "https://opencollective.com/mui-org"
3230
+ },
3231
+ "peerDependencies": {
3232
+ "@emotion/react": "^11.4.1",
3233
+ "@emotion/styled": "^11.3.0",
3234
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
3235
+ },
3236
+ "peerDependenciesMeta": {
3237
+ "@emotion/react": {
3238
+ "optional": true
3239
+ },
3240
+ "@emotion/styled": {
3241
+ "optional": true
3242
+ }
3243
+ }
3244
+ },
3245
+ "node_modules/@mui/system": {
3246
+ "version": "7.2.0",
3247
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.2.0.tgz",
3248
+ "integrity": "sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A==",
3249
+ "license": "MIT",
3250
+ "dependencies": {
3251
+ "@babel/runtime": "^7.27.6",
3252
+ "@mui/private-theming": "^7.2.0",
3253
+ "@mui/styled-engine": "^7.2.0",
3254
+ "@mui/types": "^7.4.4",
3255
+ "@mui/utils": "^7.2.0",
3256
+ "clsx": "^2.1.1",
3257
+ "csstype": "^3.1.3",
3258
+ "prop-types": "^15.8.1"
3259
+ },
3260
+ "engines": {
3261
+ "node": ">=14.0.0"
3262
+ },
3263
+ "funding": {
3264
+ "type": "opencollective",
3265
+ "url": "https://opencollective.com/mui-org"
3266
+ },
3267
+ "peerDependencies": {
3268
+ "@emotion/react": "^11.5.0",
3269
+ "@emotion/styled": "^11.3.0",
3270
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
3271
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
3272
+ },
3273
+ "peerDependenciesMeta": {
3274
+ "@emotion/react": {
3275
+ "optional": true
3276
+ },
3277
+ "@emotion/styled": {
3278
+ "optional": true
3279
+ },
3280
+ "@types/react": {
3281
+ "optional": true
3282
+ }
3283
+ }
3284
+ },
3285
+ "node_modules/@mui/types": {
3286
+ "version": "7.4.4",
3287
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.4.tgz",
3288
+ "integrity": "sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==",
3289
+ "license": "MIT",
3290
+ "dependencies": {
3291
+ "@babel/runtime": "^7.27.6"
3292
+ },
3293
+ "peerDependencies": {
3294
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
3295
+ },
3296
+ "peerDependenciesMeta": {
3297
+ "@types/react": {
3298
+ "optional": true
3299
+ }
3300
+ }
3301
+ },
3302
+ "node_modules/@mui/utils": {
3303
+ "version": "7.2.0",
3304
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.2.0.tgz",
3305
+ "integrity": "sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==",
3306
+ "license": "MIT",
3307
+ "dependencies": {
3308
+ "@babel/runtime": "^7.27.6",
3309
+ "@mui/types": "^7.4.4",
3310
+ "@types/prop-types": "^15.7.15",
3311
+ "clsx": "^2.1.1",
3312
+ "prop-types": "^15.8.1",
3313
+ "react-is": "^19.1.0"
3314
+ },
3315
+ "engines": {
3316
+ "node": ">=14.0.0"
3317
+ },
3318
+ "funding": {
3319
+ "type": "opencollective",
3320
+ "url": "https://opencollective.com/mui-org"
3321
+ },
3322
+ "peerDependencies": {
3323
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
3324
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
3325
+ },
3326
+ "peerDependenciesMeta": {
3327
+ "@types/react": {
3328
+ "optional": true
3329
+ }
3330
+ }
3331
+ },
3332
+ "node_modules/@mui/utils/node_modules/react-is": {
3333
+ "version": "19.1.0",
3334
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz",
3335
+ "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==",
3336
+ "license": "MIT"
3337
+ },
3338
  "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
3339
  "version": "5.1.1-v1",
3340
  "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
 
3459
  }
3460
  }
3461
  },
3462
+ "node_modules/@popperjs/core": {
3463
+ "version": "2.11.8",
3464
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
3465
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
3466
+ "license": "MIT",
3467
+ "funding": {
3468
+ "type": "opencollective",
3469
+ "url": "https://opencollective.com/popperjs"
3470
+ }
3471
+ },
3472
  "node_modules/@rollup/plugin-babel": {
3473
  "version": "5.3.1",
3474
  "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
 
4194
  "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
4195
  "license": "MIT"
4196
  },
4197
+ "node_modules/@types/prop-types": {
4198
+ "version": "15.7.15",
4199
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
4200
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
4201
+ "license": "MIT"
4202
+ },
4203
  "node_modules/@types/q": {
4204
  "version": "1.5.8",
4205
  "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz",
 
4218
  "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
4219
  "license": "MIT"
4220
  },
4221
+ "node_modules/@types/react": {
4222
+ "version": "19.1.8",
4223
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz",
4224
+ "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==",
4225
+ "license": "MIT",
4226
+ "peer": true,
4227
+ "dependencies": {
4228
+ "csstype": "^3.0.2"
4229
+ }
4230
+ },
4231
+ "node_modules/@types/react-transition-group": {
4232
+ "version": "4.4.12",
4233
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
4234
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
4235
+ "license": "MIT",
4236
+ "peerDependencies": {
4237
+ "@types/react": "*"
4238
+ }
4239
+ },
4240
  "node_modules/@types/resolve": {
4241
  "version": "1.17.1",
4242
  "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
 
6101
  "wrap-ansi": "^7.0.0"
6102
  }
6103
  },
6104
+ "node_modules/clsx": {
6105
+ "version": "2.1.1",
6106
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
6107
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
6108
+ "license": "MIT",
6109
+ "engines": {
6110
+ "node": ">=6"
6111
+ }
6112
+ },
6113
  "node_modules/co": {
6114
  "version": "4.6.0",
6115
  "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
 
6850
  "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
6851
  "license": "MIT"
6852
  },
6853
+ "node_modules/csstype": {
6854
+ "version": "3.1.3",
6855
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
6856
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
6857
+ "license": "MIT"
6858
+ },
6859
  "node_modules/damerau-levenshtein": {
6860
  "version": "1.0.8",
6861
  "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
 
7182
  "utila": "~0.4"
7183
  }
7184
  },
7185
+ "node_modules/dom-helpers": {
7186
+ "version": "5.2.1",
7187
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
7188
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
7189
+ "license": "MIT",
7190
+ "dependencies": {
7191
+ "@babel/runtime": "^7.8.7",
7192
+ "csstype": "^3.0.2"
7193
+ }
7194
+ },
7195
  "node_modules/dom-serializer": {
7196
  "version": "1.4.1",
7197
  "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
 
8658
  "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
8659
  }
8660
  },
8661
+ "node_modules/find-root": {
8662
+ "version": "1.1.0",
8663
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
8664
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
8665
+ "license": "MIT"
8666
+ },
8667
  "node_modules/find-up": {
8668
  "version": "4.1.0",
8669
  "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
 
9406
  "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
9407
  "license": "CC0-1.0"
9408
  },
9409
+ "node_modules/hoist-non-react-statics": {
9410
+ "version": "3.3.2",
9411
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
9412
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
9413
+ "license": "BSD-3-Clause",
9414
+ "dependencies": {
9415
+ "react-is": "^16.7.0"
9416
+ }
9417
+ },
9418
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
9419
+ "version": "16.13.1",
9420
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
9421
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
9422
+ "license": "MIT"
9423
+ },
9424
  "node_modules/hoopy": {
9425
  "version": "0.1.4",
9426
  "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
 
14697
  "react": ">= 0.14.0"
14698
  }
14699
  },
14700
+ "node_modules/react-transition-group": {
14701
+ "version": "4.4.5",
14702
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
14703
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
14704
+ "license": "BSD-3-Clause",
14705
+ "dependencies": {
14706
+ "@babel/runtime": "^7.5.5",
14707
+ "dom-helpers": "^5.0.1",
14708
+ "loose-envify": "^1.4.0",
14709
+ "prop-types": "^15.6.2"
14710
+ },
14711
+ "peerDependencies": {
14712
+ "react": ">=16.6.0",
14713
+ "react-dom": ">=16.6.0"
14714
+ }
14715
+ },
14716
  "node_modules/read-cache": {
14717
  "version": "1.0.0",
14718
  "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
 
16330
  "postcss": "^8.2.15"
16331
  }
16332
  },
16333
+ "node_modules/stylis": {
16334
+ "version": "4.2.0",
16335
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
16336
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
16337
+ "license": "MIT"
16338
+ },
16339
  "node_modules/sucrase": {
16340
  "version": "3.35.0",
16341
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
 
17107
  }
17108
  },
17109
  "node_modules/typescript": {
17110
+ "version": "4.9.5",
17111
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
17112
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
17113
  "license": "Apache-2.0",
17114
  "peer": true,
17115
  "bin": {
 
17117
  "tsserver": "bin/tsserver"
17118
  },
17119
  "engines": {
17120
+ "node": ">=4.2.0"
17121
  }
17122
  },
17123
  "node_modules/unbox-primitive": {
package.json CHANGED
@@ -3,6 +3,9 @@
3
  "version": "0.1.0",
4
  "private": true,
5
  "dependencies": {
 
 
 
6
  "@testing-library/dom": "^10.4.0",
7
  "@testing-library/jest-dom": "^6.6.3",
8
  "@testing-library/react": "^16.3.0",
 
3
  "version": "0.1.0",
4
  "private": true,
5
  "dependencies": {
6
+ "@emotion/react": "^11.14.0",
7
+ "@emotion/styled": "^11.14.1",
8
+ "@mui/material": "^7.2.0",
9
  "@testing-library/dom": "^10.4.0",
10
  "@testing-library/jest-dom": "^6.6.3",
11
  "@testing-library/react": "^16.3.0",
public/index.html CHANGED
@@ -24,7 +24,7 @@
24
  work correctly both with client-side routing and a non-root public URL.
25
  Learn how to configure a non-root public URL by running `npm run build`.
26
  -->
27
- <title>React App</title>
28
  </head>
29
  <body>
30
  <noscript>You need to enable JavaScript to run this app.</noscript>
 
24
  work correctly both with client-side routing and a non-root public URL.
25
  Learn how to configure a non-root public URL by running `npm run build`.
26
  -->
27
+ <title>DevMate App</title>
28
  </head>
29
  <body>
30
  <noscript>You need to enable JavaScript to run this app.</noscript>
src/App.css CHANGED
@@ -28,6 +28,19 @@
28
  color: #61dafb;
29
  }
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  @keyframes App-logo-spin {
32
  from {
33
  transform: rotate(0deg);
@@ -42,3 +55,98 @@
42
  line-height: 1.5;
43
  margin-bottom: 8px;
44
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  color: #61dafb;
29
  }
30
 
31
+ body {
32
+ font-family: 'Roboto', sans-serif;
33
+ background: #121212;
34
+ color: #ffffff;
35
+ }
36
+
37
+ h2 {
38
+
39
+ color: #bb86fc;
40
+ margin-bottom: 20px;
41
+ font-weight: 500;
42
+ }
43
+
44
  @keyframes App-logo-spin {
45
  from {
46
  transform: rotate(0deg);
 
55
  line-height: 1.5;
56
  margin-bottom: 8px;
57
  }
58
+
59
+ /* Global scrollbar styles */
60
+ * {
61
+ scrollbar-width: thin; /* Firefox */
62
+ scrollbar-color: #555 #1e1e2f; /* Firefox */
63
+ }
64
+
65
+ /* Chrome, Edge, Safari */
66
+ ::-webkit-scrollbar {
67
+ width: 8px;
68
+ height: 6px;
69
+ }
70
+
71
+ ::-webkit-scrollbar-track {
72
+ background: #1e1e2f;
73
+ }
74
+
75
+ ::-webkit-scrollbar-thumb {
76
+ background-color: #555;
77
+ border-radius: 6px;
78
+ }
79
+
80
+ ::-webkit-scrollbar-thumb:hover {
81
+ background-color: #777;
82
+ }
83
+
84
+
85
+ .chat-container {
86
+ max-width: 800px;
87
+ margin: 0 auto;
88
+ display: flex;
89
+ flex-direction: column;
90
+ height: 100vh;
91
+ color: #ffffff;
92
+ background: #2a2a2a;
93
+ background: #2a2a2a;
94
+ border-radius: 12px;
95
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
96
+ overflow: hidden; /* prevent accidental scrollbars */
97
+ }
98
+
99
+ .header-area {
100
+ display: flex;
101
+ justify-content: center;
102
+ text-align: center;
103
+ background: #383838;
104
+ }
105
+
106
+ .chat-input {
107
+ display: flex;
108
+ padding: 10px;
109
+ background: #383838;
110
+ }
111
+
112
+ textarea {
113
+ flex-grow: 1;
114
+ padding: 10px 12px;
115
+ resize: none;
116
+ border-radius: 6px;
117
+ background: #2a2a2a;
118
+ color: #fff;
119
+ border: 1px solid #444;
120
+ font-size: 14px;
121
+ }
122
+
123
+
124
+
125
+ .message {
126
+ display: block; /* ensures full-width layout */
127
+ width: fit-content;
128
+ max-width: 85%;
129
+ margin-bottom: 12px;
130
+ padding: 10px 14px;
131
+ border-radius: 16px;
132
+ line-height: 1.5;
133
+ word-wrap: break-word;
134
+ }
135
+
136
+ .message.user {
137
+ align-self: flex-end;
138
+ margin-left: auto;
139
+ background: #333c4d;
140
+ color: #e3f2fd;
141
+ border-bottom-right-radius: 0;
142
+ }
143
+
144
+ .message.assistant {
145
+ align-self: flex-start;
146
+ margin-right: auto;
147
+ background: #383838;
148
+ border-bottom-left-radius: 0;
149
+ }
150
+
151
+
152
+
src/App.js CHANGED
@@ -3,7 +3,9 @@ import ChatBox from "./components/ChatBox";
3
  import ChatInput from "./components/ChatInput";
4
  import FileUpload from "./components/FileUpload";
5
  import { streamChat } from "./utils/streamChat";
 
6
  import "./index.css";
 
7
 
8
  export default function App() {
9
  const [messages, setMessages] = useState([]);
@@ -60,34 +62,80 @@ export default function App() {
60
  if (lastCode) handleSend("Fix the bug in this code and explain");
61
  };
62
 
63
- return (
 
 
 
 
 
 
 
64
  <div className="app">
65
- <h1>🧑‍💻 DevMate</h1>
66
- <div className="main">
67
- <ChatBox messages={messages} loading={loading}/>
68
- <div className="buttons">
69
- <FileUpload reset={resetKey}
70
- onUpload={() => setFileUploaded(true)}
71
- onCodeParsed={(code, filename) => {
72
- const lang = detectLanguage(filename);
73
- const formatted = `\`\`\`${lang}\n${code}\n\`\`\``;
74
- setLastCode(formatted);
75
- setMessages((prev) => [
76
- ...prev,
77
- { role: "user", content: `Here's my code:\n\n${formatted}` },
78
- ]);
79
- setFileUploaded(true);
80
- }} />
81
- <button onClick={handleExplain} >Explain Code</button>
82
- <button onClick={handleFixBug} >Fix Bug</button>
83
- <button onClick={() => {
84
- setMessages([]);
85
- setLastCode("");
86
- setFileUploaded(false);
87
- setResetKey((k) => k + 1);
88
- }}>Clear Chat</button>
89
- </div>
90
- <ChatInput onSend={handleSend} fileUploaded={!fileUploaded}/>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  </div>
92
  </div>
93
  );
 
3
  import ChatInput from "./components/ChatInput";
4
  import FileUpload from "./components/FileUpload";
5
  import { streamChat } from "./utils/streamChat";
6
+ import { Button, Box, Typography } from "@mui/material";
7
  import "./index.css";
8
+ import "./App.css";
9
 
10
  export default function App() {
11
  const [messages, setMessages] = useState([]);
 
62
  if (lastCode) handleSend("Fix the bug in this code and explain");
63
  };
64
 
65
+ const handleClear = () => {
66
+ setMessages([]);
67
+ setLastCode("");
68
+ setFileUploaded(false);
69
+ setResetKey((k) => k + 1);
70
+ };
71
+
72
+ return (
73
  <div className="app">
74
+
75
+
76
+ <div className="chat-container">
77
+ <div className="header-area">
78
+ <Box display="flex" alignItems="center" gap={1} >
79
+ <Typography variant="h4" component="h1" gutterBottom>
80
+ 🧑‍💻 DevMate
81
+ </Typography>
82
+ </Box>
83
+ </div>
84
+ <ChatBox messages={messages} loading={loading} />
85
+
86
+ <Box className="buttons"
87
+ sx={{
88
+ display: "flex",
89
+ justifyContent: "space-between",
90
+ alignItems: "center",
91
+ mt: 1,
92
+ ml: 1,
93
+ flexWrap: "wrap",
94
+ gap: 2,
95
+ }}
96
+ >
97
+ <FileUpload
98
+ reset={resetKey}
99
+ onUpload={() => setFileUploaded(true)}
100
+ onCodeParsed={(code, filename) => {
101
+ const lang = detectLanguage(filename);
102
+ const formatted = `\`\`\`${lang}\n${code}\n\`\`\``;
103
+ setLastCode(formatted);
104
+ setMessages((prev) => [
105
+ ...prev,
106
+ { role: "user", content: `Here's my code:\n\n${formatted}` },
107
+ ]);
108
+ setFileUploaded(true);
109
+ }}
110
+ />
111
+
112
+ <Box sx={{ display: 'flex', gap: 1 ,mr:1}}>
113
+ <Button
114
+ variant="contained"
115
+ onClick={handleExplain}
116
+ disabled={!fileUploaded || loading}
117
+ >
118
+ Explain Code
119
+ </Button>
120
+ <Button
121
+ variant="contained"
122
+ onClick={handleFixBug}
123
+ disabled={!fileUploaded || loading}
124
+ color="warning"
125
+ >
126
+ Fix Bug
127
+ </Button>
128
+ <Button
129
+ variant="outlined"
130
+ onClick={handleClear}
131
+ color="error"
132
+ >
133
+ Clear Chat
134
+ </Button>
135
+ </Box>
136
+ </Box>
137
+
138
+ <ChatInput onSend={handleSend} fileUploaded={fileUploaded} />
139
  </div>
140
  </div>
141
  );
src/components/ChatBox.css CHANGED
@@ -2,7 +2,6 @@
2
  display: flex;
3
  gap: 6px;
4
  padding: 0.5rem;
5
- margin-left: 1rem;
6
  align-items: center;
7
  }
8
 
@@ -25,3 +24,69 @@
25
  0%, 80%, 100% { opacity: 0; }
26
  40% { opacity: 1; }
27
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  display: flex;
3
  gap: 6px;
4
  padding: 0.5rem;
 
5
  align-items: center;
6
  }
7
 
 
24
  0%, 80%, 100% { opacity: 0; }
25
  40% { opacity: 1; }
26
  }
27
+
28
+ .message {
29
+ display: block; /* ensures full-width layout */
30
+ width: fit-content;
31
+ max-width: 85%;
32
+ margin-bottom: 12px;
33
+ padding: 10px 14px;
34
+ border-radius: 16px;
35
+ line-height: 1.5;
36
+ word-wrap: break-word;
37
+ }
38
+
39
+ .message.user {
40
+ align-self: flex-end;
41
+ margin-left: auto;
42
+ background: #333c4d;
43
+ color: #e3f2fd;
44
+ border-bottom-right-radius: 0;
45
+ }
46
+
47
+ .message.assistant {
48
+ align-self: flex-start;
49
+ margin-right: auto;
50
+ background: #383838;
51
+ border-bottom-left-radius: 0;
52
+ }
53
+ .chat-box {
54
+ flex-grow: 1;
55
+ overflow-y: auto;
56
+ padding: 12px;
57
+ border: 1px solid #2d2d2d;
58
+ border-radius: 8px;
59
+ background: #2a2a2a;
60
+ margin-bottom: 16px;
61
+ display: flex;
62
+ flex-direction: column;
63
+ }
64
+
65
+ .chat-box p {
66
+ margin: 0.5em 0;
67
+ line-height: 1.6;
68
+ }
69
+
70
+ .chat-box li {
71
+ margin: 0.3em 0;
72
+ }
73
+
74
+ .chat-box ul, .chat-box ol {
75
+ margin: 0.5em 0 0.5em 1.2em;
76
+ padding: 0;
77
+ }
78
+
79
+
80
+ .code-block-wrapper pre {
81
+ background: #2d2d2d; /* override if needed */
82
+ padding: 1em;
83
+ font-size: 0.9em;
84
+ line-height: 1.5;
85
+ }
86
+
87
+ .code-block-wrapper {
88
+ margin: 12px 0;
89
+ background-color: #2d2d2d;
90
+ border-radius: 8px;
91
+ overflow: auto;
92
+ }
src/components/ChatBox.jsx CHANGED
@@ -1,30 +1,71 @@
1
- import React from "react";
2
  import CodeBlock from "./CodeBlock";
 
3
  import "./ChatBox.css"; // Add dot animation CSS
4
 
5
  export default function ChatBox({ messages, loading }) {
6
- return (
7
- <div className="chat-box">
8
- {messages.map((msg, i) => (
9
- msg.content?.trim() && ( <div key={i} className={`message ${msg.role}`}>
10
- <div className="bubble">
11
- <Message content={msg.content} />
12
- </div>
13
- </div>
14
- )
15
- ))}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
- {/* ✅ Typing indicator when loading */}
18
  {loading && (
19
- <div className="message assistant">
20
- <div className="typing-indicator">
21
- <span className="dot"></span>
22
- <span className="dot"></span>
23
- <span className="dot"></span>
24
- </div>
25
- </div>
26
- )}
27
- </div>
 
 
 
 
 
 
 
 
 
 
 
28
  );
29
  }
30
  const formatText = (text) => {
@@ -116,11 +157,15 @@ function Message({ content }) {
116
  return (
117
  <>
118
  {parts.map((part, i) =>
119
- i % 2 === 1 ? <CodeBlock key={i} code={part.trim()} /> : <div
 
 
 
120
  key={i}
121
  className="formatted-text"
122
  dangerouslySetInnerHTML={{ __html: formatText(part) }}
123
  />
 
124
  )}
125
  </>
126
  );
 
1
+ import React, { useRef, useEffect } from 'react';
2
  import CodeBlock from "./CodeBlock";
3
+ import { Box, Paper, CircularProgress, Typography } from "@mui/material";
4
  import "./ChatBox.css"; // Add dot animation CSS
5
 
6
  export default function ChatBox({ messages, loading }) {
7
+ const bottomRef = useRef(null);
8
+
9
+ useEffect(() => {
10
+ if (bottomRef.current) {
11
+ bottomRef.current.scrollIntoView({ behavior: 'smooth' });
12
+ }
13
+ }, [messages, loading]);
14
+
15
+ return (
16
+ <Box className="chat-box">
17
+ {messages.map((msg, i) =>
18
+ msg.content?.trim() ? (
19
+ <Box
20
+ key={i}
21
+ className={`message ${msg.role}`}
22
+ // sx={{
23
+ // display: "flex",
24
+ // justifyContent: msg.role === "user" ? "flex-end" : "flex-start",
25
+ // mb: 1.5,
26
+ // }}
27
+ >
28
+ <Paper
29
+ elevation={3}
30
+ sx={{
31
+ p: 1.5,
32
+ bgcolor: msg.role === "user" ? "#1e1e2f" : "#2c2c3e",
33
+ color: "#fff",
34
+ maxWidth: "100%",
35
+ borderRadius: 2,
36
+ // overflowX: "auto",
37
+ }}
38
+ >
39
+ <div className="bubble">
40
+ <Message content={msg.content} />
41
+ </div>
42
+ </Paper>
43
+ </Box>
44
+
45
+ ) : null
46
+ )}
47
 
 
48
  {loading && (
49
+ <Box
50
+ className="message assistant"
51
+ sx={{
52
+ display: "flex",
53
+ justifyContent: "flex-start",
54
+ pl: 1,
55
+ mt: 1,
56
+ }}
57
+ >
58
+
59
+ <Box className="typing-indicator">
60
+ <span className="dot" />
61
+ <span className="dot" />
62
+ <span className="dot" />
63
+ </Box>
64
+
65
+ </Box>
66
+ )}
67
+ <Box ref={bottomRef} />
68
+ </Box>
69
  );
70
  }
71
  const formatText = (text) => {
 
157
  return (
158
  <>
159
  {parts.map((part, i) =>
160
+ i % 2 === 1 ? (
161
+ <CodeBlock key={i} code={part.trim()} />
162
+ ) : (
163
+ <div
164
  key={i}
165
  className="formatted-text"
166
  dangerouslySetInnerHTML={{ __html: formatText(part) }}
167
  />
168
+ )
169
  )}
170
  </>
171
  );
src/components/ChatInput.jsx CHANGED
@@ -18,7 +18,7 @@ export default function ChatInput({ onSend, fileUploaded }) {
18
  const isButtonDisabled = fileUploaded || !input.trim();
19
  return (
20
  <div className="chat-input">
21
- <input
22
  placeholder="Paste error, ask DevMate..."
23
  value={input}
24
  onChange={(e) => setInput(e.target.value)}
 
18
  const isButtonDisabled = fileUploaded || !input.trim();
19
  return (
20
  <div className="chat-input">
21
+ <textarea
22
  placeholder="Paste error, ask DevMate..."
23
  value={input}
24
  onChange={(e) => setInput(e.target.value)}
src/index.css CHANGED
@@ -1,14 +1,15 @@
1
  body {
2
  margin: 0;
3
- font-family: sans-serif;
4
- background: #1e1e1e;
5
- color: white;
 
 
6
  }
7
 
8
- .app {
9
- padding: 1rem;
10
- max-width: 800px;
11
- margin: auto;
12
  }
13
 
14
  h1 {
@@ -17,12 +18,12 @@ h1 {
17
  margin-bottom: 1rem;
18
  }
19
 
20
- .main {
21
  background: #2a2a2a;
22
- padding: 1rem;
23
  border-radius: 8px;
24
- }
25
-
26
  .chat-box {
27
  max-height: 60vh;
28
  overflow-y: auto;
@@ -35,22 +36,22 @@ h1 {
35
 
36
  .message.user {
37
  text-align: right;
38
- }
39
 
40
- .bubble {
41
  display: inline-block;
42
  padding: 0.75rem;
43
  border-radius: 8px;
44
  background: #3b3b3b;
45
  max-width: 100%;
46
  white-space: pre-wrap;
47
- }
48
 
49
- .chat-input {
50
  display: flex;
51
  gap: 0.5rem;
52
  margin-top: 1rem;
53
- }
54
 
55
  .chat-input input {
56
  flex: 1;
 
1
  body {
2
  margin: 0;
3
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5
+ sans-serif;
6
+ -webkit-font-smoothing: antialiased;
7
+ -moz-osx-font-smoothing: grayscale;
8
  }
9
 
10
+ code {
11
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12
+ monospace;
 
13
  }
14
 
15
  h1 {
 
18
  margin-bottom: 1rem;
19
  }
20
 
21
+ /* .main {
22
  background: #2a2a2a;
23
+ padding: 1rem;
24
  border-radius: 8px;
25
+ } */
26
+ /*
27
  .chat-box {
28
  max-height: 60vh;
29
  overflow-y: auto;
 
36
 
37
  .message.user {
38
  text-align: right;
39
+ } */
40
 
41
+ /* .bubble {
42
  display: inline-block;
43
  padding: 0.75rem;
44
  border-radius: 8px;
45
  background: #3b3b3b;
46
  max-width: 100%;
47
  white-space: pre-wrap;
48
+ } */
49
 
50
+ /* .chat-input {
51
  display: flex;
52
  gap: 0.5rem;
53
  margin-top: 1rem;
54
+ } */
55
 
56
  .chat-input input {
57
  flex: 1;