Zayne Rea Sprague Claude Opus 4.6 commited on
Commit
fa4af69
·
1 Parent(s): d989e09

feat: add markdown rendering for experiment notes and sub-experiments

Browse files

Add react-markdown with remark-gfm for proper rendering of tables,
headers, lists, code blocks, and links in experiment notes and
sub-experiment content. Also add import script for populating
dashboard from local experiment files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

frontend/package-lock.json CHANGED
@@ -9,7 +9,9 @@
9
  "version": "0.1.0",
10
  "dependencies": {
11
  "react": "^18.3.1",
12
- "react-dom": "^18.3.1"
 
 
13
  },
14
  "devDependencies": {
15
  "@types/react": "^18.3.12",
@@ -1249,25 +1251,64 @@
1249
  "@babel/types": "^7.28.2"
1250
  }
1251
  },
 
 
 
 
 
 
 
 
 
1252
  "node_modules/@types/estree": {
1253
  "version": "1.0.8",
1254
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1255
  "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1256
- "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1257
  "license": "MIT"
1258
  },
1259
  "node_modules/@types/prop-types": {
1260
  "version": "15.7.15",
1261
  "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
1262
  "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
1263
- "dev": true,
1264
  "license": "MIT"
1265
  },
1266
  "node_modules/@types/react": {
1267
  "version": "18.3.28",
1268
  "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz",
1269
  "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==",
1270
- "dev": true,
1271
  "license": "MIT",
1272
  "dependencies": {
1273
  "@types/prop-types": "*",
@@ -1284,6 +1325,18 @@
1284
  "@types/react": "^18.0.0"
1285
  }
1286
  },
 
 
 
 
 
 
 
 
 
 
 
 
1287
  "node_modules/@vitejs/plugin-react": {
1288
  "version": "4.7.0",
1289
  "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
@@ -1370,6 +1423,16 @@
1370
  "postcss": "^8.1.0"
1371
  }
1372
  },
 
 
 
 
 
 
 
 
 
 
1373
  "node_modules/baseline-browser-mapping": {
1374
  "version": "2.10.0",
1375
  "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
@@ -1474,6 +1537,56 @@
1474
  ],
1475
  "license": "CC-BY-4.0"
1476
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1477
  "node_modules/chokidar": {
1478
  "version": "3.6.0",
1479
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -1512,6 +1625,16 @@
1512
  "node": ">= 6"
1513
  }
1514
  },
 
 
 
 
 
 
 
 
 
 
1515
  "node_modules/commander": {
1516
  "version": "4.1.1",
1517
  "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
@@ -1546,14 +1669,12 @@
1546
  "version": "3.2.3",
1547
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1548
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1549
- "dev": true,
1550
  "license": "MIT"
1551
  },
1552
  "node_modules/debug": {
1553
  "version": "4.4.3",
1554
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1555
  "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1556
- "dev": true,
1557
  "license": "MIT",
1558
  "dependencies": {
1559
  "ms": "^2.1.3"
@@ -1567,6 +1688,41 @@
1567
  }
1568
  }
1569
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1570
  "node_modules/didyoumean": {
1571
  "version": "1.2.2",
1572
  "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@@ -1640,6 +1796,34 @@
1640
  "node": ">=6"
1641
  }
1642
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1643
  "node_modules/fast-glob": {
1644
  "version": "3.3.3",
1645
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
@@ -1768,6 +1952,86 @@
1768
  "node": ">= 0.4"
1769
  }
1770
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1771
  "node_modules/is-binary-path": {
1772
  "version": "2.1.0",
1773
  "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -1797,6 +2061,16 @@
1797
  "url": "https://github.com/sponsors/ljharb"
1798
  }
1799
  },
 
 
 
 
 
 
 
 
 
 
1800
  "node_modules/is-extglob": {
1801
  "version": "2.1.1",
1802
  "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -1820,6 +2094,16 @@
1820
  "node": ">=0.10.0"
1821
  }
1822
  },
 
 
 
 
 
 
 
 
 
 
1823
  "node_modules/is-number": {
1824
  "version": "7.0.0",
1825
  "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -1830,6 +2114,18 @@
1830
  "node": ">=0.12.0"
1831
  }
1832
  },
 
 
 
 
 
 
 
 
 
 
 
 
1833
  "node_modules/jiti": {
1834
  "version": "1.21.7",
1835
  "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
@@ -1878,52 +2174,905 @@
1878
  "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
1879
  "dev": true,
1880
  "license": "MIT",
1881
- "engines": {
1882
- "node": ">=14"
1883
- },
1884
- "funding": {
1885
- "url": "https://github.com/sponsors/antonk52"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1886
  }
1887
  },
1888
- "node_modules/lines-and-columns": {
1889
- "version": "1.2.4",
1890
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1891
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1892
- "dev": true,
 
 
 
 
 
 
 
 
 
1893
  "license": "MIT"
1894
  },
1895
- "node_modules/loose-envify": {
1896
- "version": "1.4.0",
1897
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1898
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1899
  "license": "MIT",
1900
  "dependencies": {
1901
- "js-tokens": "^3.0.0 || ^4.0.0"
1902
- },
1903
- "bin": {
1904
- "loose-envify": "cli.js"
1905
  }
1906
  },
1907
- "node_modules/lru-cache": {
1908
- "version": "5.1.1",
1909
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1910
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1911
- "dev": true,
1912
- "license": "ISC",
 
 
 
 
 
 
 
 
 
1913
  "dependencies": {
1914
- "yallist": "^3.0.2"
1915
  }
1916
  },
1917
- "node_modules/merge2": {
1918
- "version": "1.4.1",
1919
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1920
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1921
- "dev": true,
 
 
 
 
 
 
 
 
 
1922
  "license": "MIT",
1923
- "engines": {
1924
- "node": ">= 8"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1925
  }
1926
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1927
  "node_modules/micromatch": {
1928
  "version": "4.0.8",
1929
  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@@ -1942,7 +3091,6 @@
1942
  "version": "2.1.3",
1943
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1944
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1945
- "dev": true,
1946
  "license": "MIT"
1947
  },
1948
  "node_modules/mz": {
@@ -2013,6 +3161,31 @@
2013
  "node": ">= 6"
2014
  }
2015
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2016
  "node_modules/path-parse": {
2017
  "version": "1.0.7",
2018
  "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
@@ -2223,6 +3396,16 @@
2223
  "dev": true,
2224
  "license": "MIT"
2225
  },
 
 
 
 
 
 
 
 
 
 
2226
  "node_modules/queue-microtask": {
2227
  "version": "1.2.3",
2228
  "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -2269,6 +3452,33 @@
2269
  "react": "^18.3.1"
2270
  }
2271
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2272
  "node_modules/react-refresh": {
2273
  "version": "0.17.0",
2274
  "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
@@ -2302,6 +3512,72 @@
2302
  "node": ">=8.10.0"
2303
  }
2304
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2305
  "node_modules/resolve": {
2306
  "version": "1.22.11",
2307
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
@@ -2432,6 +3708,48 @@
2432
  "node": ">=0.10.0"
2433
  }
2434
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2435
  "node_modules/sucrase": {
2436
  "version": "3.35.1",
2437
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
@@ -2590,6 +3908,26 @@
2590
  "node": ">=8.0"
2591
  }
2592
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2593
  "node_modules/ts-interface-checker": {
2594
  "version": "0.1.13",
2595
  "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
@@ -2611,6 +3949,93 @@
2611
  "node": ">=14.17"
2612
  }
2613
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2614
  "node_modules/update-browserslist-db": {
2615
  "version": "1.2.3",
2616
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
@@ -2649,6 +4074,34 @@
2649
  "dev": true,
2650
  "license": "MIT"
2651
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2652
  "node_modules/vite": {
2653
  "version": "6.4.1",
2654
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
@@ -2761,6 +4214,16 @@
2761
  "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2762
  "dev": true,
2763
  "license": "ISC"
 
 
 
 
 
 
 
 
 
 
2764
  }
2765
  }
2766
  }
 
9
  "version": "0.1.0",
10
  "dependencies": {
11
  "react": "^18.3.1",
12
+ "react-dom": "^18.3.1",
13
+ "react-markdown": "^10.1.0",
14
+ "remark-gfm": "^4.0.1"
15
  },
16
  "devDependencies": {
17
  "@types/react": "^18.3.12",
 
1251
  "@babel/types": "^7.28.2"
1252
  }
1253
  },
1254
+ "node_modules/@types/debug": {
1255
+ "version": "4.1.12",
1256
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
1257
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
1258
+ "license": "MIT",
1259
+ "dependencies": {
1260
+ "@types/ms": "*"
1261
+ }
1262
+ },
1263
  "node_modules/@types/estree": {
1264
  "version": "1.0.8",
1265
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1266
  "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1267
+ "license": "MIT"
1268
+ },
1269
+ "node_modules/@types/estree-jsx": {
1270
+ "version": "1.0.5",
1271
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
1272
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
1273
+ "license": "MIT",
1274
+ "dependencies": {
1275
+ "@types/estree": "*"
1276
+ }
1277
+ },
1278
+ "node_modules/@types/hast": {
1279
+ "version": "3.0.4",
1280
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
1281
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
1282
+ "license": "MIT",
1283
+ "dependencies": {
1284
+ "@types/unist": "*"
1285
+ }
1286
+ },
1287
+ "node_modules/@types/mdast": {
1288
+ "version": "4.0.4",
1289
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
1290
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
1291
+ "license": "MIT",
1292
+ "dependencies": {
1293
+ "@types/unist": "*"
1294
+ }
1295
+ },
1296
+ "node_modules/@types/ms": {
1297
+ "version": "2.1.0",
1298
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
1299
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
1300
  "license": "MIT"
1301
  },
1302
  "node_modules/@types/prop-types": {
1303
  "version": "15.7.15",
1304
  "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
1305
  "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
 
1306
  "license": "MIT"
1307
  },
1308
  "node_modules/@types/react": {
1309
  "version": "18.3.28",
1310
  "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz",
1311
  "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==",
 
1312
  "license": "MIT",
1313
  "dependencies": {
1314
  "@types/prop-types": "*",
 
1325
  "@types/react": "^18.0.0"
1326
  }
1327
  },
1328
+ "node_modules/@types/unist": {
1329
+ "version": "3.0.3",
1330
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
1331
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
1332
+ "license": "MIT"
1333
+ },
1334
+ "node_modules/@ungap/structured-clone": {
1335
+ "version": "1.3.0",
1336
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
1337
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
1338
+ "license": "ISC"
1339
+ },
1340
  "node_modules/@vitejs/plugin-react": {
1341
  "version": "4.7.0",
1342
  "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
 
1423
  "postcss": "^8.1.0"
1424
  }
1425
  },
1426
+ "node_modules/bail": {
1427
+ "version": "2.0.2",
1428
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
1429
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
1430
+ "license": "MIT",
1431
+ "funding": {
1432
+ "type": "github",
1433
+ "url": "https://github.com/sponsors/wooorm"
1434
+ }
1435
+ },
1436
  "node_modules/baseline-browser-mapping": {
1437
  "version": "2.10.0",
1438
  "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
 
1537
  ],
1538
  "license": "CC-BY-4.0"
1539
  },
1540
+ "node_modules/ccount": {
1541
+ "version": "2.0.1",
1542
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
1543
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
1544
+ "license": "MIT",
1545
+ "funding": {
1546
+ "type": "github",
1547
+ "url": "https://github.com/sponsors/wooorm"
1548
+ }
1549
+ },
1550
+ "node_modules/character-entities": {
1551
+ "version": "2.0.2",
1552
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
1553
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
1554
+ "license": "MIT",
1555
+ "funding": {
1556
+ "type": "github",
1557
+ "url": "https://github.com/sponsors/wooorm"
1558
+ }
1559
+ },
1560
+ "node_modules/character-entities-html4": {
1561
+ "version": "2.1.0",
1562
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
1563
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
1564
+ "license": "MIT",
1565
+ "funding": {
1566
+ "type": "github",
1567
+ "url": "https://github.com/sponsors/wooorm"
1568
+ }
1569
+ },
1570
+ "node_modules/character-entities-legacy": {
1571
+ "version": "3.0.0",
1572
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
1573
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
1574
+ "license": "MIT",
1575
+ "funding": {
1576
+ "type": "github",
1577
+ "url": "https://github.com/sponsors/wooorm"
1578
+ }
1579
+ },
1580
+ "node_modules/character-reference-invalid": {
1581
+ "version": "2.0.1",
1582
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
1583
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
1584
+ "license": "MIT",
1585
+ "funding": {
1586
+ "type": "github",
1587
+ "url": "https://github.com/sponsors/wooorm"
1588
+ }
1589
+ },
1590
  "node_modules/chokidar": {
1591
  "version": "3.6.0",
1592
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
 
1625
  "node": ">= 6"
1626
  }
1627
  },
1628
+ "node_modules/comma-separated-tokens": {
1629
+ "version": "2.0.3",
1630
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
1631
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
1632
+ "license": "MIT",
1633
+ "funding": {
1634
+ "type": "github",
1635
+ "url": "https://github.com/sponsors/wooorm"
1636
+ }
1637
+ },
1638
  "node_modules/commander": {
1639
  "version": "4.1.1",
1640
  "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
 
1669
  "version": "3.2.3",
1670
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1671
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
 
1672
  "license": "MIT"
1673
  },
1674
  "node_modules/debug": {
1675
  "version": "4.4.3",
1676
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1677
  "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
 
1678
  "license": "MIT",
1679
  "dependencies": {
1680
  "ms": "^2.1.3"
 
1688
  }
1689
  }
1690
  },
1691
+ "node_modules/decode-named-character-reference": {
1692
+ "version": "1.3.0",
1693
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
1694
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
1695
+ "license": "MIT",
1696
+ "dependencies": {
1697
+ "character-entities": "^2.0.0"
1698
+ },
1699
+ "funding": {
1700
+ "type": "github",
1701
+ "url": "https://github.com/sponsors/wooorm"
1702
+ }
1703
+ },
1704
+ "node_modules/dequal": {
1705
+ "version": "2.0.3",
1706
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
1707
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
1708
+ "license": "MIT",
1709
+ "engines": {
1710
+ "node": ">=6"
1711
+ }
1712
+ },
1713
+ "node_modules/devlop": {
1714
+ "version": "1.1.0",
1715
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
1716
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
1717
+ "license": "MIT",
1718
+ "dependencies": {
1719
+ "dequal": "^2.0.0"
1720
+ },
1721
+ "funding": {
1722
+ "type": "github",
1723
+ "url": "https://github.com/sponsors/wooorm"
1724
+ }
1725
+ },
1726
  "node_modules/didyoumean": {
1727
  "version": "1.2.2",
1728
  "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
 
1796
  "node": ">=6"
1797
  }
1798
  },
1799
+ "node_modules/escape-string-regexp": {
1800
+ "version": "5.0.0",
1801
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
1802
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
1803
+ "license": "MIT",
1804
+ "engines": {
1805
+ "node": ">=12"
1806
+ },
1807
+ "funding": {
1808
+ "url": "https://github.com/sponsors/sindresorhus"
1809
+ }
1810
+ },
1811
+ "node_modules/estree-util-is-identifier-name": {
1812
+ "version": "3.0.0",
1813
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
1814
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
1815
+ "license": "MIT",
1816
+ "funding": {
1817
+ "type": "opencollective",
1818
+ "url": "https://opencollective.com/unified"
1819
+ }
1820
+ },
1821
+ "node_modules/extend": {
1822
+ "version": "3.0.2",
1823
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1824
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
1825
+ "license": "MIT"
1826
+ },
1827
  "node_modules/fast-glob": {
1828
  "version": "3.3.3",
1829
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
 
1952
  "node": ">= 0.4"
1953
  }
1954
  },
1955
+ "node_modules/hast-util-to-jsx-runtime": {
1956
+ "version": "2.3.6",
1957
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
1958
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
1959
+ "license": "MIT",
1960
+ "dependencies": {
1961
+ "@types/estree": "^1.0.0",
1962
+ "@types/hast": "^3.0.0",
1963
+ "@types/unist": "^3.0.0",
1964
+ "comma-separated-tokens": "^2.0.0",
1965
+ "devlop": "^1.0.0",
1966
+ "estree-util-is-identifier-name": "^3.0.0",
1967
+ "hast-util-whitespace": "^3.0.0",
1968
+ "mdast-util-mdx-expression": "^2.0.0",
1969
+ "mdast-util-mdx-jsx": "^3.0.0",
1970
+ "mdast-util-mdxjs-esm": "^2.0.0",
1971
+ "property-information": "^7.0.0",
1972
+ "space-separated-tokens": "^2.0.0",
1973
+ "style-to-js": "^1.0.0",
1974
+ "unist-util-position": "^5.0.0",
1975
+ "vfile-message": "^4.0.0"
1976
+ },
1977
+ "funding": {
1978
+ "type": "opencollective",
1979
+ "url": "https://opencollective.com/unified"
1980
+ }
1981
+ },
1982
+ "node_modules/hast-util-whitespace": {
1983
+ "version": "3.0.0",
1984
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
1985
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
1986
+ "license": "MIT",
1987
+ "dependencies": {
1988
+ "@types/hast": "^3.0.0"
1989
+ },
1990
+ "funding": {
1991
+ "type": "opencollective",
1992
+ "url": "https://opencollective.com/unified"
1993
+ }
1994
+ },
1995
+ "node_modules/html-url-attributes": {
1996
+ "version": "3.0.1",
1997
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
1998
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
1999
+ "license": "MIT",
2000
+ "funding": {
2001
+ "type": "opencollective",
2002
+ "url": "https://opencollective.com/unified"
2003
+ }
2004
+ },
2005
+ "node_modules/inline-style-parser": {
2006
+ "version": "0.2.7",
2007
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
2008
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
2009
+ "license": "MIT"
2010
+ },
2011
+ "node_modules/is-alphabetical": {
2012
+ "version": "2.0.1",
2013
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
2014
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
2015
+ "license": "MIT",
2016
+ "funding": {
2017
+ "type": "github",
2018
+ "url": "https://github.com/sponsors/wooorm"
2019
+ }
2020
+ },
2021
+ "node_modules/is-alphanumerical": {
2022
+ "version": "2.0.1",
2023
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
2024
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
2025
+ "license": "MIT",
2026
+ "dependencies": {
2027
+ "is-alphabetical": "^2.0.0",
2028
+ "is-decimal": "^2.0.0"
2029
+ },
2030
+ "funding": {
2031
+ "type": "github",
2032
+ "url": "https://github.com/sponsors/wooorm"
2033
+ }
2034
+ },
2035
  "node_modules/is-binary-path": {
2036
  "version": "2.1.0",
2037
  "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
 
2061
  "url": "https://github.com/sponsors/ljharb"
2062
  }
2063
  },
2064
+ "node_modules/is-decimal": {
2065
+ "version": "2.0.1",
2066
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
2067
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
2068
+ "license": "MIT",
2069
+ "funding": {
2070
+ "type": "github",
2071
+ "url": "https://github.com/sponsors/wooorm"
2072
+ }
2073
+ },
2074
  "node_modules/is-extglob": {
2075
  "version": "2.1.1",
2076
  "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 
2094
  "node": ">=0.10.0"
2095
  }
2096
  },
2097
+ "node_modules/is-hexadecimal": {
2098
+ "version": "2.0.1",
2099
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
2100
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
2101
+ "license": "MIT",
2102
+ "funding": {
2103
+ "type": "github",
2104
+ "url": "https://github.com/sponsors/wooorm"
2105
+ }
2106
+ },
2107
  "node_modules/is-number": {
2108
  "version": "7.0.0",
2109
  "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
 
2114
  "node": ">=0.12.0"
2115
  }
2116
  },
2117
+ "node_modules/is-plain-obj": {
2118
+ "version": "4.1.0",
2119
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
2120
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
2121
+ "license": "MIT",
2122
+ "engines": {
2123
+ "node": ">=12"
2124
+ },
2125
+ "funding": {
2126
+ "url": "https://github.com/sponsors/sindresorhus"
2127
+ }
2128
+ },
2129
  "node_modules/jiti": {
2130
  "version": "1.21.7",
2131
  "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
 
2174
  "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
2175
  "dev": true,
2176
  "license": "MIT",
2177
+ "engines": {
2178
+ "node": ">=14"
2179
+ },
2180
+ "funding": {
2181
+ "url": "https://github.com/sponsors/antonk52"
2182
+ }
2183
+ },
2184
+ "node_modules/lines-and-columns": {
2185
+ "version": "1.2.4",
2186
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
2187
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
2188
+ "dev": true,
2189
+ "license": "MIT"
2190
+ },
2191
+ "node_modules/longest-streak": {
2192
+ "version": "3.1.0",
2193
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
2194
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
2195
+ "license": "MIT",
2196
+ "funding": {
2197
+ "type": "github",
2198
+ "url": "https://github.com/sponsors/wooorm"
2199
+ }
2200
+ },
2201
+ "node_modules/loose-envify": {
2202
+ "version": "1.4.0",
2203
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
2204
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
2205
+ "license": "MIT",
2206
+ "dependencies": {
2207
+ "js-tokens": "^3.0.0 || ^4.0.0"
2208
+ },
2209
+ "bin": {
2210
+ "loose-envify": "cli.js"
2211
+ }
2212
+ },
2213
+ "node_modules/lru-cache": {
2214
+ "version": "5.1.1",
2215
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
2216
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2217
+ "dev": true,
2218
+ "license": "ISC",
2219
+ "dependencies": {
2220
+ "yallist": "^3.0.2"
2221
+ }
2222
+ },
2223
+ "node_modules/markdown-table": {
2224
+ "version": "3.0.4",
2225
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
2226
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
2227
+ "license": "MIT",
2228
+ "funding": {
2229
+ "type": "github",
2230
+ "url": "https://github.com/sponsors/wooorm"
2231
+ }
2232
+ },
2233
+ "node_modules/mdast-util-find-and-replace": {
2234
+ "version": "3.0.2",
2235
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
2236
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
2237
+ "license": "MIT",
2238
+ "dependencies": {
2239
+ "@types/mdast": "^4.0.0",
2240
+ "escape-string-regexp": "^5.0.0",
2241
+ "unist-util-is": "^6.0.0",
2242
+ "unist-util-visit-parents": "^6.0.0"
2243
+ },
2244
+ "funding": {
2245
+ "type": "opencollective",
2246
+ "url": "https://opencollective.com/unified"
2247
+ }
2248
+ },
2249
+ "node_modules/mdast-util-from-markdown": {
2250
+ "version": "2.0.3",
2251
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
2252
+ "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
2253
+ "license": "MIT",
2254
+ "dependencies": {
2255
+ "@types/mdast": "^4.0.0",
2256
+ "@types/unist": "^3.0.0",
2257
+ "decode-named-character-reference": "^1.0.0",
2258
+ "devlop": "^1.0.0",
2259
+ "mdast-util-to-string": "^4.0.0",
2260
+ "micromark": "^4.0.0",
2261
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
2262
+ "micromark-util-decode-string": "^2.0.0",
2263
+ "micromark-util-normalize-identifier": "^2.0.0",
2264
+ "micromark-util-symbol": "^2.0.0",
2265
+ "micromark-util-types": "^2.0.0",
2266
+ "unist-util-stringify-position": "^4.0.0"
2267
+ },
2268
+ "funding": {
2269
+ "type": "opencollective",
2270
+ "url": "https://opencollective.com/unified"
2271
+ }
2272
+ },
2273
+ "node_modules/mdast-util-gfm": {
2274
+ "version": "3.1.0",
2275
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
2276
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
2277
+ "license": "MIT",
2278
+ "dependencies": {
2279
+ "mdast-util-from-markdown": "^2.0.0",
2280
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
2281
+ "mdast-util-gfm-footnote": "^2.0.0",
2282
+ "mdast-util-gfm-strikethrough": "^2.0.0",
2283
+ "mdast-util-gfm-table": "^2.0.0",
2284
+ "mdast-util-gfm-task-list-item": "^2.0.0",
2285
+ "mdast-util-to-markdown": "^2.0.0"
2286
+ },
2287
+ "funding": {
2288
+ "type": "opencollective",
2289
+ "url": "https://opencollective.com/unified"
2290
+ }
2291
+ },
2292
+ "node_modules/mdast-util-gfm-autolink-literal": {
2293
+ "version": "2.0.1",
2294
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
2295
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
2296
+ "license": "MIT",
2297
+ "dependencies": {
2298
+ "@types/mdast": "^4.0.0",
2299
+ "ccount": "^2.0.0",
2300
+ "devlop": "^1.0.0",
2301
+ "mdast-util-find-and-replace": "^3.0.0",
2302
+ "micromark-util-character": "^2.0.0"
2303
+ },
2304
+ "funding": {
2305
+ "type": "opencollective",
2306
+ "url": "https://opencollective.com/unified"
2307
+ }
2308
+ },
2309
+ "node_modules/mdast-util-gfm-footnote": {
2310
+ "version": "2.1.0",
2311
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
2312
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
2313
+ "license": "MIT",
2314
+ "dependencies": {
2315
+ "@types/mdast": "^4.0.0",
2316
+ "devlop": "^1.1.0",
2317
+ "mdast-util-from-markdown": "^2.0.0",
2318
+ "mdast-util-to-markdown": "^2.0.0",
2319
+ "micromark-util-normalize-identifier": "^2.0.0"
2320
+ },
2321
+ "funding": {
2322
+ "type": "opencollective",
2323
+ "url": "https://opencollective.com/unified"
2324
+ }
2325
+ },
2326
+ "node_modules/mdast-util-gfm-strikethrough": {
2327
+ "version": "2.0.0",
2328
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
2329
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
2330
+ "license": "MIT",
2331
+ "dependencies": {
2332
+ "@types/mdast": "^4.0.0",
2333
+ "mdast-util-from-markdown": "^2.0.0",
2334
+ "mdast-util-to-markdown": "^2.0.0"
2335
+ },
2336
+ "funding": {
2337
+ "type": "opencollective",
2338
+ "url": "https://opencollective.com/unified"
2339
+ }
2340
+ },
2341
+ "node_modules/mdast-util-gfm-table": {
2342
+ "version": "2.0.0",
2343
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
2344
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
2345
+ "license": "MIT",
2346
+ "dependencies": {
2347
+ "@types/mdast": "^4.0.0",
2348
+ "devlop": "^1.0.0",
2349
+ "markdown-table": "^3.0.0",
2350
+ "mdast-util-from-markdown": "^2.0.0",
2351
+ "mdast-util-to-markdown": "^2.0.0"
2352
+ },
2353
+ "funding": {
2354
+ "type": "opencollective",
2355
+ "url": "https://opencollective.com/unified"
2356
+ }
2357
+ },
2358
+ "node_modules/mdast-util-gfm-task-list-item": {
2359
+ "version": "2.0.0",
2360
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
2361
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
2362
+ "license": "MIT",
2363
+ "dependencies": {
2364
+ "@types/mdast": "^4.0.0",
2365
+ "devlop": "^1.0.0",
2366
+ "mdast-util-from-markdown": "^2.0.0",
2367
+ "mdast-util-to-markdown": "^2.0.0"
2368
+ },
2369
+ "funding": {
2370
+ "type": "opencollective",
2371
+ "url": "https://opencollective.com/unified"
2372
+ }
2373
+ },
2374
+ "node_modules/mdast-util-mdx-expression": {
2375
+ "version": "2.0.1",
2376
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
2377
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
2378
+ "license": "MIT",
2379
+ "dependencies": {
2380
+ "@types/estree-jsx": "^1.0.0",
2381
+ "@types/hast": "^3.0.0",
2382
+ "@types/mdast": "^4.0.0",
2383
+ "devlop": "^1.0.0",
2384
+ "mdast-util-from-markdown": "^2.0.0",
2385
+ "mdast-util-to-markdown": "^2.0.0"
2386
+ },
2387
+ "funding": {
2388
+ "type": "opencollective",
2389
+ "url": "https://opencollective.com/unified"
2390
+ }
2391
+ },
2392
+ "node_modules/mdast-util-mdx-jsx": {
2393
+ "version": "3.2.0",
2394
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
2395
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
2396
+ "license": "MIT",
2397
+ "dependencies": {
2398
+ "@types/estree-jsx": "^1.0.0",
2399
+ "@types/hast": "^3.0.0",
2400
+ "@types/mdast": "^4.0.0",
2401
+ "@types/unist": "^3.0.0",
2402
+ "ccount": "^2.0.0",
2403
+ "devlop": "^1.1.0",
2404
+ "mdast-util-from-markdown": "^2.0.0",
2405
+ "mdast-util-to-markdown": "^2.0.0",
2406
+ "parse-entities": "^4.0.0",
2407
+ "stringify-entities": "^4.0.0",
2408
+ "unist-util-stringify-position": "^4.0.0",
2409
+ "vfile-message": "^4.0.0"
2410
+ },
2411
+ "funding": {
2412
+ "type": "opencollective",
2413
+ "url": "https://opencollective.com/unified"
2414
+ }
2415
+ },
2416
+ "node_modules/mdast-util-mdxjs-esm": {
2417
+ "version": "2.0.1",
2418
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
2419
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
2420
+ "license": "MIT",
2421
+ "dependencies": {
2422
+ "@types/estree-jsx": "^1.0.0",
2423
+ "@types/hast": "^3.0.0",
2424
+ "@types/mdast": "^4.0.0",
2425
+ "devlop": "^1.0.0",
2426
+ "mdast-util-from-markdown": "^2.0.0",
2427
+ "mdast-util-to-markdown": "^2.0.0"
2428
+ },
2429
+ "funding": {
2430
+ "type": "opencollective",
2431
+ "url": "https://opencollective.com/unified"
2432
+ }
2433
+ },
2434
+ "node_modules/mdast-util-phrasing": {
2435
+ "version": "4.1.0",
2436
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
2437
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
2438
+ "license": "MIT",
2439
+ "dependencies": {
2440
+ "@types/mdast": "^4.0.0",
2441
+ "unist-util-is": "^6.0.0"
2442
+ },
2443
+ "funding": {
2444
+ "type": "opencollective",
2445
+ "url": "https://opencollective.com/unified"
2446
+ }
2447
+ },
2448
+ "node_modules/mdast-util-to-hast": {
2449
+ "version": "13.2.1",
2450
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
2451
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
2452
+ "license": "MIT",
2453
+ "dependencies": {
2454
+ "@types/hast": "^3.0.0",
2455
+ "@types/mdast": "^4.0.0",
2456
+ "@ungap/structured-clone": "^1.0.0",
2457
+ "devlop": "^1.0.0",
2458
+ "micromark-util-sanitize-uri": "^2.0.0",
2459
+ "trim-lines": "^3.0.0",
2460
+ "unist-util-position": "^5.0.0",
2461
+ "unist-util-visit": "^5.0.0",
2462
+ "vfile": "^6.0.0"
2463
+ },
2464
+ "funding": {
2465
+ "type": "opencollective",
2466
+ "url": "https://opencollective.com/unified"
2467
+ }
2468
+ },
2469
+ "node_modules/mdast-util-to-markdown": {
2470
+ "version": "2.1.2",
2471
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
2472
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
2473
+ "license": "MIT",
2474
+ "dependencies": {
2475
+ "@types/mdast": "^4.0.0",
2476
+ "@types/unist": "^3.0.0",
2477
+ "longest-streak": "^3.0.0",
2478
+ "mdast-util-phrasing": "^4.0.0",
2479
+ "mdast-util-to-string": "^4.0.0",
2480
+ "micromark-util-classify-character": "^2.0.0",
2481
+ "micromark-util-decode-string": "^2.0.0",
2482
+ "unist-util-visit": "^5.0.0",
2483
+ "zwitch": "^2.0.0"
2484
+ },
2485
+ "funding": {
2486
+ "type": "opencollective",
2487
+ "url": "https://opencollective.com/unified"
2488
+ }
2489
+ },
2490
+ "node_modules/mdast-util-to-string": {
2491
+ "version": "4.0.0",
2492
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
2493
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
2494
+ "license": "MIT",
2495
+ "dependencies": {
2496
+ "@types/mdast": "^4.0.0"
2497
+ },
2498
+ "funding": {
2499
+ "type": "opencollective",
2500
+ "url": "https://opencollective.com/unified"
2501
+ }
2502
+ },
2503
+ "node_modules/merge2": {
2504
+ "version": "1.4.1",
2505
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2506
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2507
+ "dev": true,
2508
+ "license": "MIT",
2509
+ "engines": {
2510
+ "node": ">= 8"
2511
+ }
2512
+ },
2513
+ "node_modules/micromark": {
2514
+ "version": "4.0.2",
2515
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
2516
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
2517
+ "funding": [
2518
+ {
2519
+ "type": "GitHub Sponsors",
2520
+ "url": "https://github.com/sponsors/unifiedjs"
2521
+ },
2522
+ {
2523
+ "type": "OpenCollective",
2524
+ "url": "https://opencollective.com/unified"
2525
+ }
2526
+ ],
2527
+ "license": "MIT",
2528
+ "dependencies": {
2529
+ "@types/debug": "^4.0.0",
2530
+ "debug": "^4.0.0",
2531
+ "decode-named-character-reference": "^1.0.0",
2532
+ "devlop": "^1.0.0",
2533
+ "micromark-core-commonmark": "^2.0.0",
2534
+ "micromark-factory-space": "^2.0.0",
2535
+ "micromark-util-character": "^2.0.0",
2536
+ "micromark-util-chunked": "^2.0.0",
2537
+ "micromark-util-combine-extensions": "^2.0.0",
2538
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
2539
+ "micromark-util-encode": "^2.0.0",
2540
+ "micromark-util-normalize-identifier": "^2.0.0",
2541
+ "micromark-util-resolve-all": "^2.0.0",
2542
+ "micromark-util-sanitize-uri": "^2.0.0",
2543
+ "micromark-util-subtokenize": "^2.0.0",
2544
+ "micromark-util-symbol": "^2.0.0",
2545
+ "micromark-util-types": "^2.0.0"
2546
+ }
2547
+ },
2548
+ "node_modules/micromark-core-commonmark": {
2549
+ "version": "2.0.3",
2550
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
2551
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
2552
+ "funding": [
2553
+ {
2554
+ "type": "GitHub Sponsors",
2555
+ "url": "https://github.com/sponsors/unifiedjs"
2556
+ },
2557
+ {
2558
+ "type": "OpenCollective",
2559
+ "url": "https://opencollective.com/unified"
2560
+ }
2561
+ ],
2562
+ "license": "MIT",
2563
+ "dependencies": {
2564
+ "decode-named-character-reference": "^1.0.0",
2565
+ "devlop": "^1.0.0",
2566
+ "micromark-factory-destination": "^2.0.0",
2567
+ "micromark-factory-label": "^2.0.0",
2568
+ "micromark-factory-space": "^2.0.0",
2569
+ "micromark-factory-title": "^2.0.0",
2570
+ "micromark-factory-whitespace": "^2.0.0",
2571
+ "micromark-util-character": "^2.0.0",
2572
+ "micromark-util-chunked": "^2.0.0",
2573
+ "micromark-util-classify-character": "^2.0.0",
2574
+ "micromark-util-html-tag-name": "^2.0.0",
2575
+ "micromark-util-normalize-identifier": "^2.0.0",
2576
+ "micromark-util-resolve-all": "^2.0.0",
2577
+ "micromark-util-subtokenize": "^2.0.0",
2578
+ "micromark-util-symbol": "^2.0.0",
2579
+ "micromark-util-types": "^2.0.0"
2580
+ }
2581
+ },
2582
+ "node_modules/micromark-extension-gfm": {
2583
+ "version": "3.0.0",
2584
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
2585
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
2586
+ "license": "MIT",
2587
+ "dependencies": {
2588
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
2589
+ "micromark-extension-gfm-footnote": "^2.0.0",
2590
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
2591
+ "micromark-extension-gfm-table": "^2.0.0",
2592
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
2593
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
2594
+ "micromark-util-combine-extensions": "^2.0.0",
2595
+ "micromark-util-types": "^2.0.0"
2596
+ },
2597
+ "funding": {
2598
+ "type": "opencollective",
2599
+ "url": "https://opencollective.com/unified"
2600
+ }
2601
+ },
2602
+ "node_modules/micromark-extension-gfm-autolink-literal": {
2603
+ "version": "2.1.0",
2604
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
2605
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
2606
+ "license": "MIT",
2607
+ "dependencies": {
2608
+ "micromark-util-character": "^2.0.0",
2609
+ "micromark-util-sanitize-uri": "^2.0.0",
2610
+ "micromark-util-symbol": "^2.0.0",
2611
+ "micromark-util-types": "^2.0.0"
2612
+ },
2613
+ "funding": {
2614
+ "type": "opencollective",
2615
+ "url": "https://opencollective.com/unified"
2616
+ }
2617
+ },
2618
+ "node_modules/micromark-extension-gfm-footnote": {
2619
+ "version": "2.1.0",
2620
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
2621
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
2622
+ "license": "MIT",
2623
+ "dependencies": {
2624
+ "devlop": "^1.0.0",
2625
+ "micromark-core-commonmark": "^2.0.0",
2626
+ "micromark-factory-space": "^2.0.0",
2627
+ "micromark-util-character": "^2.0.0",
2628
+ "micromark-util-normalize-identifier": "^2.0.0",
2629
+ "micromark-util-sanitize-uri": "^2.0.0",
2630
+ "micromark-util-symbol": "^2.0.0",
2631
+ "micromark-util-types": "^2.0.0"
2632
+ },
2633
+ "funding": {
2634
+ "type": "opencollective",
2635
+ "url": "https://opencollective.com/unified"
2636
+ }
2637
+ },
2638
+ "node_modules/micromark-extension-gfm-strikethrough": {
2639
+ "version": "2.1.0",
2640
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
2641
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
2642
+ "license": "MIT",
2643
+ "dependencies": {
2644
+ "devlop": "^1.0.0",
2645
+ "micromark-util-chunked": "^2.0.0",
2646
+ "micromark-util-classify-character": "^2.0.0",
2647
+ "micromark-util-resolve-all": "^2.0.0",
2648
+ "micromark-util-symbol": "^2.0.0",
2649
+ "micromark-util-types": "^2.0.0"
2650
+ },
2651
+ "funding": {
2652
+ "type": "opencollective",
2653
+ "url": "https://opencollective.com/unified"
2654
+ }
2655
+ },
2656
+ "node_modules/micromark-extension-gfm-table": {
2657
+ "version": "2.1.1",
2658
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
2659
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
2660
+ "license": "MIT",
2661
+ "dependencies": {
2662
+ "devlop": "^1.0.0",
2663
+ "micromark-factory-space": "^2.0.0",
2664
+ "micromark-util-character": "^2.0.0",
2665
+ "micromark-util-symbol": "^2.0.0",
2666
+ "micromark-util-types": "^2.0.0"
2667
+ },
2668
+ "funding": {
2669
+ "type": "opencollective",
2670
+ "url": "https://opencollective.com/unified"
2671
+ }
2672
+ },
2673
+ "node_modules/micromark-extension-gfm-tagfilter": {
2674
+ "version": "2.0.0",
2675
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
2676
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
2677
+ "license": "MIT",
2678
+ "dependencies": {
2679
+ "micromark-util-types": "^2.0.0"
2680
+ },
2681
+ "funding": {
2682
+ "type": "opencollective",
2683
+ "url": "https://opencollective.com/unified"
2684
+ }
2685
+ },
2686
+ "node_modules/micromark-extension-gfm-task-list-item": {
2687
+ "version": "2.1.0",
2688
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
2689
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
2690
+ "license": "MIT",
2691
+ "dependencies": {
2692
+ "devlop": "^1.0.0",
2693
+ "micromark-factory-space": "^2.0.0",
2694
+ "micromark-util-character": "^2.0.0",
2695
+ "micromark-util-symbol": "^2.0.0",
2696
+ "micromark-util-types": "^2.0.0"
2697
+ },
2698
+ "funding": {
2699
+ "type": "opencollective",
2700
+ "url": "https://opencollective.com/unified"
2701
+ }
2702
+ },
2703
+ "node_modules/micromark-factory-destination": {
2704
+ "version": "2.0.1",
2705
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
2706
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
2707
+ "funding": [
2708
+ {
2709
+ "type": "GitHub Sponsors",
2710
+ "url": "https://github.com/sponsors/unifiedjs"
2711
+ },
2712
+ {
2713
+ "type": "OpenCollective",
2714
+ "url": "https://opencollective.com/unified"
2715
+ }
2716
+ ],
2717
+ "license": "MIT",
2718
+ "dependencies": {
2719
+ "micromark-util-character": "^2.0.0",
2720
+ "micromark-util-symbol": "^2.0.0",
2721
+ "micromark-util-types": "^2.0.0"
2722
+ }
2723
+ },
2724
+ "node_modules/micromark-factory-label": {
2725
+ "version": "2.0.1",
2726
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
2727
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
2728
+ "funding": [
2729
+ {
2730
+ "type": "GitHub Sponsors",
2731
+ "url": "https://github.com/sponsors/unifiedjs"
2732
+ },
2733
+ {
2734
+ "type": "OpenCollective",
2735
+ "url": "https://opencollective.com/unified"
2736
+ }
2737
+ ],
2738
+ "license": "MIT",
2739
+ "dependencies": {
2740
+ "devlop": "^1.0.0",
2741
+ "micromark-util-character": "^2.0.0",
2742
+ "micromark-util-symbol": "^2.0.0",
2743
+ "micromark-util-types": "^2.0.0"
2744
+ }
2745
+ },
2746
+ "node_modules/micromark-factory-space": {
2747
+ "version": "2.0.1",
2748
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
2749
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
2750
+ "funding": [
2751
+ {
2752
+ "type": "GitHub Sponsors",
2753
+ "url": "https://github.com/sponsors/unifiedjs"
2754
+ },
2755
+ {
2756
+ "type": "OpenCollective",
2757
+ "url": "https://opencollective.com/unified"
2758
+ }
2759
+ ],
2760
+ "license": "MIT",
2761
+ "dependencies": {
2762
+ "micromark-util-character": "^2.0.0",
2763
+ "micromark-util-types": "^2.0.0"
2764
+ }
2765
+ },
2766
+ "node_modules/micromark-factory-title": {
2767
+ "version": "2.0.1",
2768
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
2769
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
2770
+ "funding": [
2771
+ {
2772
+ "type": "GitHub Sponsors",
2773
+ "url": "https://github.com/sponsors/unifiedjs"
2774
+ },
2775
+ {
2776
+ "type": "OpenCollective",
2777
+ "url": "https://opencollective.com/unified"
2778
+ }
2779
+ ],
2780
+ "license": "MIT",
2781
+ "dependencies": {
2782
+ "micromark-factory-space": "^2.0.0",
2783
+ "micromark-util-character": "^2.0.0",
2784
+ "micromark-util-symbol": "^2.0.0",
2785
+ "micromark-util-types": "^2.0.0"
2786
+ }
2787
+ },
2788
+ "node_modules/micromark-factory-whitespace": {
2789
+ "version": "2.0.1",
2790
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
2791
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
2792
+ "funding": [
2793
+ {
2794
+ "type": "GitHub Sponsors",
2795
+ "url": "https://github.com/sponsors/unifiedjs"
2796
+ },
2797
+ {
2798
+ "type": "OpenCollective",
2799
+ "url": "https://opencollective.com/unified"
2800
+ }
2801
+ ],
2802
+ "license": "MIT",
2803
+ "dependencies": {
2804
+ "micromark-factory-space": "^2.0.0",
2805
+ "micromark-util-character": "^2.0.0",
2806
+ "micromark-util-symbol": "^2.0.0",
2807
+ "micromark-util-types": "^2.0.0"
2808
+ }
2809
+ },
2810
+ "node_modules/micromark-util-character": {
2811
+ "version": "2.1.1",
2812
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
2813
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
2814
+ "funding": [
2815
+ {
2816
+ "type": "GitHub Sponsors",
2817
+ "url": "https://github.com/sponsors/unifiedjs"
2818
+ },
2819
+ {
2820
+ "type": "OpenCollective",
2821
+ "url": "https://opencollective.com/unified"
2822
+ }
2823
+ ],
2824
+ "license": "MIT",
2825
+ "dependencies": {
2826
+ "micromark-util-symbol": "^2.0.0",
2827
+ "micromark-util-types": "^2.0.0"
2828
+ }
2829
+ },
2830
+ "node_modules/micromark-util-chunked": {
2831
+ "version": "2.0.1",
2832
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
2833
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
2834
+ "funding": [
2835
+ {
2836
+ "type": "GitHub Sponsors",
2837
+ "url": "https://github.com/sponsors/unifiedjs"
2838
+ },
2839
+ {
2840
+ "type": "OpenCollective",
2841
+ "url": "https://opencollective.com/unified"
2842
+ }
2843
+ ],
2844
+ "license": "MIT",
2845
+ "dependencies": {
2846
+ "micromark-util-symbol": "^2.0.0"
2847
+ }
2848
+ },
2849
+ "node_modules/micromark-util-classify-character": {
2850
+ "version": "2.0.1",
2851
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
2852
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
2853
+ "funding": [
2854
+ {
2855
+ "type": "GitHub Sponsors",
2856
+ "url": "https://github.com/sponsors/unifiedjs"
2857
+ },
2858
+ {
2859
+ "type": "OpenCollective",
2860
+ "url": "https://opencollective.com/unified"
2861
+ }
2862
+ ],
2863
+ "license": "MIT",
2864
+ "dependencies": {
2865
+ "micromark-util-character": "^2.0.0",
2866
+ "micromark-util-symbol": "^2.0.0",
2867
+ "micromark-util-types": "^2.0.0"
2868
+ }
2869
+ },
2870
+ "node_modules/micromark-util-combine-extensions": {
2871
+ "version": "2.0.1",
2872
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
2873
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
2874
+ "funding": [
2875
+ {
2876
+ "type": "GitHub Sponsors",
2877
+ "url": "https://github.com/sponsors/unifiedjs"
2878
+ },
2879
+ {
2880
+ "type": "OpenCollective",
2881
+ "url": "https://opencollective.com/unified"
2882
+ }
2883
+ ],
2884
+ "license": "MIT",
2885
+ "dependencies": {
2886
+ "micromark-util-chunked": "^2.0.0",
2887
+ "micromark-util-types": "^2.0.0"
2888
+ }
2889
+ },
2890
+ "node_modules/micromark-util-decode-numeric-character-reference": {
2891
+ "version": "2.0.2",
2892
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
2893
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
2894
+ "funding": [
2895
+ {
2896
+ "type": "GitHub Sponsors",
2897
+ "url": "https://github.com/sponsors/unifiedjs"
2898
+ },
2899
+ {
2900
+ "type": "OpenCollective",
2901
+ "url": "https://opencollective.com/unified"
2902
+ }
2903
+ ],
2904
+ "license": "MIT",
2905
+ "dependencies": {
2906
+ "micromark-util-symbol": "^2.0.0"
2907
+ }
2908
+ },
2909
+ "node_modules/micromark-util-decode-string": {
2910
+ "version": "2.0.1",
2911
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
2912
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
2913
+ "funding": [
2914
+ {
2915
+ "type": "GitHub Sponsors",
2916
+ "url": "https://github.com/sponsors/unifiedjs"
2917
+ },
2918
+ {
2919
+ "type": "OpenCollective",
2920
+ "url": "https://opencollective.com/unified"
2921
+ }
2922
+ ],
2923
+ "license": "MIT",
2924
+ "dependencies": {
2925
+ "decode-named-character-reference": "^1.0.0",
2926
+ "micromark-util-character": "^2.0.0",
2927
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
2928
+ "micromark-util-symbol": "^2.0.0"
2929
  }
2930
  },
2931
+ "node_modules/micromark-util-encode": {
2932
+ "version": "2.0.1",
2933
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
2934
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
2935
+ "funding": [
2936
+ {
2937
+ "type": "GitHub Sponsors",
2938
+ "url": "https://github.com/sponsors/unifiedjs"
2939
+ },
2940
+ {
2941
+ "type": "OpenCollective",
2942
+ "url": "https://opencollective.com/unified"
2943
+ }
2944
+ ],
2945
  "license": "MIT"
2946
  },
2947
+ "node_modules/micromark-util-html-tag-name": {
2948
+ "version": "2.0.1",
2949
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
2950
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
2951
+ "funding": [
2952
+ {
2953
+ "type": "GitHub Sponsors",
2954
+ "url": "https://github.com/sponsors/unifiedjs"
2955
+ },
2956
+ {
2957
+ "type": "OpenCollective",
2958
+ "url": "https://opencollective.com/unified"
2959
+ }
2960
+ ],
2961
+ "license": "MIT"
2962
+ },
2963
+ "node_modules/micromark-util-normalize-identifier": {
2964
+ "version": "2.0.1",
2965
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
2966
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
2967
+ "funding": [
2968
+ {
2969
+ "type": "GitHub Sponsors",
2970
+ "url": "https://github.com/sponsors/unifiedjs"
2971
+ },
2972
+ {
2973
+ "type": "OpenCollective",
2974
+ "url": "https://opencollective.com/unified"
2975
+ }
2976
+ ],
2977
  "license": "MIT",
2978
  "dependencies": {
2979
+ "micromark-util-symbol": "^2.0.0"
 
 
 
2980
  }
2981
  },
2982
+ "node_modules/micromark-util-resolve-all": {
2983
+ "version": "2.0.1",
2984
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
2985
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
2986
+ "funding": [
2987
+ {
2988
+ "type": "GitHub Sponsors",
2989
+ "url": "https://github.com/sponsors/unifiedjs"
2990
+ },
2991
+ {
2992
+ "type": "OpenCollective",
2993
+ "url": "https://opencollective.com/unified"
2994
+ }
2995
+ ],
2996
+ "license": "MIT",
2997
  "dependencies": {
2998
+ "micromark-util-types": "^2.0.0"
2999
  }
3000
  },
3001
+ "node_modules/micromark-util-sanitize-uri": {
3002
+ "version": "2.0.1",
3003
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
3004
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
3005
+ "funding": [
3006
+ {
3007
+ "type": "GitHub Sponsors",
3008
+ "url": "https://github.com/sponsors/unifiedjs"
3009
+ },
3010
+ {
3011
+ "type": "OpenCollective",
3012
+ "url": "https://opencollective.com/unified"
3013
+ }
3014
+ ],
3015
  "license": "MIT",
3016
+ "dependencies": {
3017
+ "micromark-util-character": "^2.0.0",
3018
+ "micromark-util-encode": "^2.0.0",
3019
+ "micromark-util-symbol": "^2.0.0"
3020
+ }
3021
+ },
3022
+ "node_modules/micromark-util-subtokenize": {
3023
+ "version": "2.1.0",
3024
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
3025
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
3026
+ "funding": [
3027
+ {
3028
+ "type": "GitHub Sponsors",
3029
+ "url": "https://github.com/sponsors/unifiedjs"
3030
+ },
3031
+ {
3032
+ "type": "OpenCollective",
3033
+ "url": "https://opencollective.com/unified"
3034
+ }
3035
+ ],
3036
+ "license": "MIT",
3037
+ "dependencies": {
3038
+ "devlop": "^1.0.0",
3039
+ "micromark-util-chunked": "^2.0.0",
3040
+ "micromark-util-symbol": "^2.0.0",
3041
+ "micromark-util-types": "^2.0.0"
3042
  }
3043
  },
3044
+ "node_modules/micromark-util-symbol": {
3045
+ "version": "2.0.1",
3046
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
3047
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
3048
+ "funding": [
3049
+ {
3050
+ "type": "GitHub Sponsors",
3051
+ "url": "https://github.com/sponsors/unifiedjs"
3052
+ },
3053
+ {
3054
+ "type": "OpenCollective",
3055
+ "url": "https://opencollective.com/unified"
3056
+ }
3057
+ ],
3058
+ "license": "MIT"
3059
+ },
3060
+ "node_modules/micromark-util-types": {
3061
+ "version": "2.0.2",
3062
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
3063
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
3064
+ "funding": [
3065
+ {
3066
+ "type": "GitHub Sponsors",
3067
+ "url": "https://github.com/sponsors/unifiedjs"
3068
+ },
3069
+ {
3070
+ "type": "OpenCollective",
3071
+ "url": "https://opencollective.com/unified"
3072
+ }
3073
+ ],
3074
+ "license": "MIT"
3075
+ },
3076
  "node_modules/micromatch": {
3077
  "version": "4.0.8",
3078
  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
 
3091
  "version": "2.1.3",
3092
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
3093
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
 
3094
  "license": "MIT"
3095
  },
3096
  "node_modules/mz": {
 
3161
  "node": ">= 6"
3162
  }
3163
  },
3164
+ "node_modules/parse-entities": {
3165
+ "version": "4.0.2",
3166
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
3167
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
3168
+ "license": "MIT",
3169
+ "dependencies": {
3170
+ "@types/unist": "^2.0.0",
3171
+ "character-entities-legacy": "^3.0.0",
3172
+ "character-reference-invalid": "^2.0.0",
3173
+ "decode-named-character-reference": "^1.0.0",
3174
+ "is-alphanumerical": "^2.0.0",
3175
+ "is-decimal": "^2.0.0",
3176
+ "is-hexadecimal": "^2.0.0"
3177
+ },
3178
+ "funding": {
3179
+ "type": "github",
3180
+ "url": "https://github.com/sponsors/wooorm"
3181
+ }
3182
+ },
3183
+ "node_modules/parse-entities/node_modules/@types/unist": {
3184
+ "version": "2.0.11",
3185
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
3186
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
3187
+ "license": "MIT"
3188
+ },
3189
  "node_modules/path-parse": {
3190
  "version": "1.0.7",
3191
  "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
 
3396
  "dev": true,
3397
  "license": "MIT"
3398
  },
3399
+ "node_modules/property-information": {
3400
+ "version": "7.1.0",
3401
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
3402
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
3403
+ "license": "MIT",
3404
+ "funding": {
3405
+ "type": "github",
3406
+ "url": "https://github.com/sponsors/wooorm"
3407
+ }
3408
+ },
3409
  "node_modules/queue-microtask": {
3410
  "version": "1.2.3",
3411
  "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
 
3452
  "react": "^18.3.1"
3453
  }
3454
  },
3455
+ "node_modules/react-markdown": {
3456
+ "version": "10.1.0",
3457
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
3458
+ "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==",
3459
+ "license": "MIT",
3460
+ "dependencies": {
3461
+ "@types/hast": "^3.0.0",
3462
+ "@types/mdast": "^4.0.0",
3463
+ "devlop": "^1.0.0",
3464
+ "hast-util-to-jsx-runtime": "^2.0.0",
3465
+ "html-url-attributes": "^3.0.0",
3466
+ "mdast-util-to-hast": "^13.0.0",
3467
+ "remark-parse": "^11.0.0",
3468
+ "remark-rehype": "^11.0.0",
3469
+ "unified": "^11.0.0",
3470
+ "unist-util-visit": "^5.0.0",
3471
+ "vfile": "^6.0.0"
3472
+ },
3473
+ "funding": {
3474
+ "type": "opencollective",
3475
+ "url": "https://opencollective.com/unified"
3476
+ },
3477
+ "peerDependencies": {
3478
+ "@types/react": ">=18",
3479
+ "react": ">=18"
3480
+ }
3481
+ },
3482
  "node_modules/react-refresh": {
3483
  "version": "0.17.0",
3484
  "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
 
3512
  "node": ">=8.10.0"
3513
  }
3514
  },
3515
+ "node_modules/remark-gfm": {
3516
+ "version": "4.0.1",
3517
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
3518
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
3519
+ "license": "MIT",
3520
+ "dependencies": {
3521
+ "@types/mdast": "^4.0.0",
3522
+ "mdast-util-gfm": "^3.0.0",
3523
+ "micromark-extension-gfm": "^3.0.0",
3524
+ "remark-parse": "^11.0.0",
3525
+ "remark-stringify": "^11.0.0",
3526
+ "unified": "^11.0.0"
3527
+ },
3528
+ "funding": {
3529
+ "type": "opencollective",
3530
+ "url": "https://opencollective.com/unified"
3531
+ }
3532
+ },
3533
+ "node_modules/remark-parse": {
3534
+ "version": "11.0.0",
3535
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
3536
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
3537
+ "license": "MIT",
3538
+ "dependencies": {
3539
+ "@types/mdast": "^4.0.0",
3540
+ "mdast-util-from-markdown": "^2.0.0",
3541
+ "micromark-util-types": "^2.0.0",
3542
+ "unified": "^11.0.0"
3543
+ },
3544
+ "funding": {
3545
+ "type": "opencollective",
3546
+ "url": "https://opencollective.com/unified"
3547
+ }
3548
+ },
3549
+ "node_modules/remark-rehype": {
3550
+ "version": "11.1.2",
3551
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
3552
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
3553
+ "license": "MIT",
3554
+ "dependencies": {
3555
+ "@types/hast": "^3.0.0",
3556
+ "@types/mdast": "^4.0.0",
3557
+ "mdast-util-to-hast": "^13.0.0",
3558
+ "unified": "^11.0.0",
3559
+ "vfile": "^6.0.0"
3560
+ },
3561
+ "funding": {
3562
+ "type": "opencollective",
3563
+ "url": "https://opencollective.com/unified"
3564
+ }
3565
+ },
3566
+ "node_modules/remark-stringify": {
3567
+ "version": "11.0.0",
3568
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
3569
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
3570
+ "license": "MIT",
3571
+ "dependencies": {
3572
+ "@types/mdast": "^4.0.0",
3573
+ "mdast-util-to-markdown": "^2.0.0",
3574
+ "unified": "^11.0.0"
3575
+ },
3576
+ "funding": {
3577
+ "type": "opencollective",
3578
+ "url": "https://opencollective.com/unified"
3579
+ }
3580
+ },
3581
  "node_modules/resolve": {
3582
  "version": "1.22.11",
3583
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
 
3708
  "node": ">=0.10.0"
3709
  }
3710
  },
3711
+ "node_modules/space-separated-tokens": {
3712
+ "version": "2.0.2",
3713
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
3714
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
3715
+ "license": "MIT",
3716
+ "funding": {
3717
+ "type": "github",
3718
+ "url": "https://github.com/sponsors/wooorm"
3719
+ }
3720
+ },
3721
+ "node_modules/stringify-entities": {
3722
+ "version": "4.0.4",
3723
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
3724
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
3725
+ "license": "MIT",
3726
+ "dependencies": {
3727
+ "character-entities-html4": "^2.0.0",
3728
+ "character-entities-legacy": "^3.0.0"
3729
+ },
3730
+ "funding": {
3731
+ "type": "github",
3732
+ "url": "https://github.com/sponsors/wooorm"
3733
+ }
3734
+ },
3735
+ "node_modules/style-to-js": {
3736
+ "version": "1.1.21",
3737
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
3738
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
3739
+ "license": "MIT",
3740
+ "dependencies": {
3741
+ "style-to-object": "1.0.14"
3742
+ }
3743
+ },
3744
+ "node_modules/style-to-object": {
3745
+ "version": "1.0.14",
3746
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
3747
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
3748
+ "license": "MIT",
3749
+ "dependencies": {
3750
+ "inline-style-parser": "0.2.7"
3751
+ }
3752
+ },
3753
  "node_modules/sucrase": {
3754
  "version": "3.35.1",
3755
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
 
3908
  "node": ">=8.0"
3909
  }
3910
  },
3911
+ "node_modules/trim-lines": {
3912
+ "version": "3.0.1",
3913
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
3914
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
3915
+ "license": "MIT",
3916
+ "funding": {
3917
+ "type": "github",
3918
+ "url": "https://github.com/sponsors/wooorm"
3919
+ }
3920
+ },
3921
+ "node_modules/trough": {
3922
+ "version": "2.2.0",
3923
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
3924
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
3925
+ "license": "MIT",
3926
+ "funding": {
3927
+ "type": "github",
3928
+ "url": "https://github.com/sponsors/wooorm"
3929
+ }
3930
+ },
3931
  "node_modules/ts-interface-checker": {
3932
  "version": "0.1.13",
3933
  "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
 
3949
  "node": ">=14.17"
3950
  }
3951
  },
3952
+ "node_modules/unified": {
3953
+ "version": "11.0.5",
3954
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
3955
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
3956
+ "license": "MIT",
3957
+ "dependencies": {
3958
+ "@types/unist": "^3.0.0",
3959
+ "bail": "^2.0.0",
3960
+ "devlop": "^1.0.0",
3961
+ "extend": "^3.0.0",
3962
+ "is-plain-obj": "^4.0.0",
3963
+ "trough": "^2.0.0",
3964
+ "vfile": "^6.0.0"
3965
+ },
3966
+ "funding": {
3967
+ "type": "opencollective",
3968
+ "url": "https://opencollective.com/unified"
3969
+ }
3970
+ },
3971
+ "node_modules/unist-util-is": {
3972
+ "version": "6.0.1",
3973
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
3974
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
3975
+ "license": "MIT",
3976
+ "dependencies": {
3977
+ "@types/unist": "^3.0.0"
3978
+ },
3979
+ "funding": {
3980
+ "type": "opencollective",
3981
+ "url": "https://opencollective.com/unified"
3982
+ }
3983
+ },
3984
+ "node_modules/unist-util-position": {
3985
+ "version": "5.0.0",
3986
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
3987
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
3988
+ "license": "MIT",
3989
+ "dependencies": {
3990
+ "@types/unist": "^3.0.0"
3991
+ },
3992
+ "funding": {
3993
+ "type": "opencollective",
3994
+ "url": "https://opencollective.com/unified"
3995
+ }
3996
+ },
3997
+ "node_modules/unist-util-stringify-position": {
3998
+ "version": "4.0.0",
3999
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
4000
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
4001
+ "license": "MIT",
4002
+ "dependencies": {
4003
+ "@types/unist": "^3.0.0"
4004
+ },
4005
+ "funding": {
4006
+ "type": "opencollective",
4007
+ "url": "https://opencollective.com/unified"
4008
+ }
4009
+ },
4010
+ "node_modules/unist-util-visit": {
4011
+ "version": "5.1.0",
4012
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
4013
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
4014
+ "license": "MIT",
4015
+ "dependencies": {
4016
+ "@types/unist": "^3.0.0",
4017
+ "unist-util-is": "^6.0.0",
4018
+ "unist-util-visit-parents": "^6.0.0"
4019
+ },
4020
+ "funding": {
4021
+ "type": "opencollective",
4022
+ "url": "https://opencollective.com/unified"
4023
+ }
4024
+ },
4025
+ "node_modules/unist-util-visit-parents": {
4026
+ "version": "6.0.2",
4027
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
4028
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
4029
+ "license": "MIT",
4030
+ "dependencies": {
4031
+ "@types/unist": "^3.0.0",
4032
+ "unist-util-is": "^6.0.0"
4033
+ },
4034
+ "funding": {
4035
+ "type": "opencollective",
4036
+ "url": "https://opencollective.com/unified"
4037
+ }
4038
+ },
4039
  "node_modules/update-browserslist-db": {
4040
  "version": "1.2.3",
4041
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
 
4074
  "dev": true,
4075
  "license": "MIT"
4076
  },
4077
+ "node_modules/vfile": {
4078
+ "version": "6.0.3",
4079
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
4080
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
4081
+ "license": "MIT",
4082
+ "dependencies": {
4083
+ "@types/unist": "^3.0.0",
4084
+ "vfile-message": "^4.0.0"
4085
+ },
4086
+ "funding": {
4087
+ "type": "opencollective",
4088
+ "url": "https://opencollective.com/unified"
4089
+ }
4090
+ },
4091
+ "node_modules/vfile-message": {
4092
+ "version": "4.0.3",
4093
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
4094
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
4095
+ "license": "MIT",
4096
+ "dependencies": {
4097
+ "@types/unist": "^3.0.0",
4098
+ "unist-util-stringify-position": "^4.0.0"
4099
+ },
4100
+ "funding": {
4101
+ "type": "opencollective",
4102
+ "url": "https://opencollective.com/unified"
4103
+ }
4104
+ },
4105
  "node_modules/vite": {
4106
  "version": "6.4.1",
4107
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
 
4214
  "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
4215
  "dev": true,
4216
  "license": "ISC"
4217
+ },
4218
+ "node_modules/zwitch": {
4219
+ "version": "2.0.4",
4220
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
4221
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
4222
+ "license": "MIT",
4223
+ "funding": {
4224
+ "type": "github",
4225
+ "url": "https://github.com/sponsors/wooorm"
4226
+ }
4227
  }
4228
  }
4229
  }
frontend/package.json CHANGED
@@ -10,7 +10,9 @@
10
  },
11
  "dependencies": {
12
  "react": "^18.3.1",
13
- "react-dom": "^18.3.1"
 
 
14
  },
15
  "devDependencies": {
16
  "@types/react": "^18.3.12",
 
10
  },
11
  "dependencies": {
12
  "react": "^18.3.1",
13
+ "react-dom": "^18.3.1",
14
+ "react-markdown": "^10.1.0",
15
+ "remark-gfm": "^4.0.1"
16
  },
17
  "devDependencies": {
18
  "@types/react": "^18.3.12",
frontend/src/experiments/components/ExperimentDetail.tsx CHANGED
@@ -1,6 +1,7 @@
1
  import { useState } from "react";
2
  import type { ExperimentDetail as ExperimentDetailType, RunRecord, HfRepo } from "../types";
3
  import { experimentsApi } from "../api";
 
4
 
5
  const STATUS_COLORS: Record<string, string> = {
6
  pending: "bg-gray-600",
@@ -260,8 +261,12 @@ export default function ExperimentDetail({ experiment, onBack, onSelectSub, onRe
260
  rows={10}
261
  />
262
  ) : (
263
- <div className="mt-2 text-sm text-gray-300 whitespace-pre-wrap bg-gray-900 rounded p-4 min-h-[100px]">
264
- {experiment.notes || <span className="text-gray-600 italic">No notes yet. Click Edit to add findings.</span>}
 
 
 
 
265
  </div>
266
  )}
267
  </div>
 
1
  import { useState } from "react";
2
  import type { ExperimentDetail as ExperimentDetailType, RunRecord, HfRepo } from "../types";
3
  import { experimentsApi } from "../api";
4
+ import Markdown from "./Markdown";
5
 
6
  const STATUS_COLORS: Record<string, string> = {
7
  pending: "bg-gray-600",
 
261
  rows={10}
262
  />
263
  ) : (
264
+ <div className="mt-2 bg-gray-900 rounded p-4 min-h-[100px]">
265
+ {experiment.notes ? (
266
+ <Markdown content={experiment.notes} />
267
+ ) : (
268
+ <span className="text-sm text-gray-600 italic">No notes yet. Click Edit to add findings.</span>
269
+ )}
270
  </div>
271
  )}
272
  </div>
frontend/src/experiments/components/Markdown.tsx ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ReactMarkdown from "react-markdown";
2
+ import remarkGfm from "remark-gfm";
3
+
4
+ interface Props {
5
+ content: string;
6
+ }
7
+
8
+ export default function Markdown({ content }: Props) {
9
+ return (
10
+ <ReactMarkdown
11
+ remarkPlugins={[remarkGfm]}
12
+ components={{
13
+ h1: ({ children }) => <h1 className="text-xl font-bold text-gray-200 mb-3 mt-6 first:mt-0">{children}</h1>,
14
+ h2: ({ children }) => <h2 className="text-lg font-semibold text-gray-200 mb-2 mt-5 first:mt-0">{children}</h2>,
15
+ h3: ({ children }) => <h3 className="text-base font-semibold text-gray-300 mb-2 mt-4">{children}</h3>,
16
+ h4: ({ children }) => <h4 className="text-sm font-semibold text-gray-300 mb-1 mt-3">{children}</h4>,
17
+ p: ({ children }) => <p className="text-sm text-gray-300 mb-2 leading-relaxed">{children}</p>,
18
+ ul: ({ children }) => <ul className="list-disc list-inside text-sm text-gray-300 mb-2 space-y-0.5 ml-2">{children}</ul>,
19
+ ol: ({ children }) => <ol className="list-decimal list-inside text-sm text-gray-300 mb-2 space-y-0.5 ml-2">{children}</ol>,
20
+ li: ({ children }) => <li className="text-sm text-gray-300">{children}</li>,
21
+ a: ({ href, children }) => (
22
+ <a href={href} target="_blank" rel="noopener noreferrer" className="text-cyan-400 hover:text-cyan-300 underline">
23
+ {children}
24
+ </a>
25
+ ),
26
+ code: ({ className, children }) => {
27
+ const isBlock = className?.includes("language-");
28
+ if (isBlock) {
29
+ return (
30
+ <pre className="bg-gray-950 border border-gray-800 rounded p-3 mb-2 overflow-x-auto">
31
+ <code className="text-xs text-gray-300 font-mono">{children}</code>
32
+ </pre>
33
+ );
34
+ }
35
+ return <code className="bg-gray-800 text-cyan-300 text-xs px-1 py-0.5 rounded font-mono">{children}</code>;
36
+ },
37
+ pre: ({ children }) => <>{children}</>,
38
+ blockquote: ({ children }) => (
39
+ <blockquote className="border-l-2 border-gray-600 pl-3 my-2 text-sm text-gray-400 italic">{children}</blockquote>
40
+ ),
41
+ hr: () => <hr className="border-gray-700 my-4" />,
42
+ strong: ({ children }) => <strong className="text-gray-200 font-semibold">{children}</strong>,
43
+ em: ({ children }) => <em className="text-gray-400">{children}</em>,
44
+ table: ({ children }) => (
45
+ <div className="overflow-x-auto mb-3">
46
+ <table className="w-full text-sm border-collapse">{children}</table>
47
+ </div>
48
+ ),
49
+ thead: ({ children }) => <thead className="border-b border-gray-700">{children}</thead>,
50
+ tbody: ({ children }) => <tbody>{children}</tbody>,
51
+ tr: ({ children }) => <tr className="border-b border-gray-800/50">{children}</tr>,
52
+ th: ({ children }) => <th className="text-left py-1.5 px-2 text-xs text-gray-400 uppercase tracking-wide font-medium">{children}</th>,
53
+ td: ({ children }) => <td className="py-1.5 px-2 text-sm text-gray-300">{children}</td>,
54
+ }}
55
+ >
56
+ {content}
57
+ </ReactMarkdown>
58
+ );
59
+ }
frontend/src/experiments/components/SubExperimentView.tsx CHANGED
@@ -1,6 +1,7 @@
1
  import { useState } from "react";
2
  import type { SubExperiment } from "../types";
3
  import { experimentsApi } from "../api";
 
4
 
5
  interface Props {
6
  sub: SubExperiment;
@@ -112,8 +113,12 @@ export default function SubExperimentView({ sub, experimentName, onBack, onRefre
112
  placeholder="Write your sub-experiment report in markdown..."
113
  />
114
  ) : (
115
- <div className="text-sm text-gray-300 whitespace-pre-wrap bg-gray-900 rounded p-6 min-h-[300px]">
116
- {sub.content_md || <span className="text-gray-600 italic">No content yet. Click Edit to add your sub-experiment report.</span>}
 
 
 
 
117
  </div>
118
  )}
119
 
 
1
  import { useState } from "react";
2
  import type { SubExperiment } from "../types";
3
  import { experimentsApi } from "../api";
4
+ import Markdown from "./Markdown";
5
 
6
  interface Props {
7
  sub: SubExperiment;
 
113
  placeholder="Write your sub-experiment report in markdown..."
114
  />
115
  ) : (
116
+ <div className="bg-gray-900 rounded p-6 min-h-[300px]">
117
+ {sub.content_md ? (
118
+ <Markdown content={sub.content_md} />
119
+ ) : (
120
+ <span className="text-sm text-gray-600 italic">No content yet. Click Edit to add your sub-experiment report.</span>
121
+ )}
122
  </div>
123
  )}
124
 
frontend/tsconfig.app.tsbuildinfo CHANGED
@@ -1 +1 @@
1
- {"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/adaevolve/adaevolveapp.tsx","./src/adaevolve/api.ts","./src/adaevolve/store.ts","./src/adaevolve/types.ts","./src/arena/arenaapp.tsx","./src/arena/api.ts","./src/arena/store.ts","./src/arena/types.ts","./src/arena/components/episodebar.tsx","./src/arena/components/episodenav.tsx","./src/arena/components/sidebar.tsx","./src/arena/components/transcriptpanel.tsx","./src/arena/utils/tracehighlight.ts","./src/experiments/experimentsapp.tsx","./src/experiments/api.ts","./src/experiments/store.ts","./src/experiments/types.ts","./src/experiments/components/experimentdetail.tsx","./src/experiments/components/experimentlist.tsx","./src/experiments/components/subexperimentview.tsx","./src/harbor/harborapp.tsx","./src/harbor/api.ts","./src/harbor/store.ts","./src/harbor/types.ts","./src/harbor/components/chatbubble.tsx","./src/harbor/components/infobar.tsx","./src/harbor/components/instancelist.tsx","./src/harbor/components/instancenav.tsx","./src/harbor/components/metricssummary.tsx","./src/harbor/components/sidebar.tsx","./src/harbor/components/stepdetail.tsx","./src/harbor/components/trajectoryview.tsx","./src/model/modelapp.tsx","./src/model/api.ts","./src/model/store.ts","./src/model/types.ts","./src/model/components/infobar.tsx","./src/model/components/questionnav.tsx","./src/model/components/sidebar.tsx","./src/model/components/tracepanel.tsx","./src/model/utils/promptparser.ts","./src/model/utils/tracehighlight.ts","./src/rlm/rlmapp.tsx","./src/rlm/api.ts","./src/rlm/store.ts","./src/rlm/types.ts","./src/rlm/components/breadcrumb.tsx","./src/rlm/components/datasetselector.tsx","./src/rlm/components/gepaiterlevel.tsx","./src/rlm/components/overviewlevel.tsx","./src/rlm/components/panel.tsx","./src/rlm/components/rlmdetaillevel.tsx","./src/rlm/components/sidebar.tsx","./src/rlm-eval/rlmevalapp.tsx","./src/rlm-eval/api.ts","./src/rlm-eval/store.ts","./src/rlm-eval/types.ts","./src/rlm-eval/components/breadcrumb.tsx","./src/rlm-eval/components/datasetselector.tsx","./src/rlm-eval/components/exampledetaillevel.tsx","./src/rlm-eval/components/iterationdetail.tsx","./src/rlm-eval/components/overviewlevel.tsx","./src/rlm-eval/components/panel.tsx","./src/rlm-eval/components/sidebar.tsx","./src/visualizer/visualizerapp.tsx"],"version":"5.9.3"}
 
1
+ {"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/adaevolve/adaevolveapp.tsx","./src/adaevolve/api.ts","./src/adaevolve/store.ts","./src/adaevolve/types.ts","./src/arena/arenaapp.tsx","./src/arena/api.ts","./src/arena/store.ts","./src/arena/types.ts","./src/arena/components/episodebar.tsx","./src/arena/components/episodenav.tsx","./src/arena/components/sidebar.tsx","./src/arena/components/transcriptpanel.tsx","./src/arena/utils/tracehighlight.ts","./src/experiments/experimentsapp.tsx","./src/experiments/api.ts","./src/experiments/store.ts","./src/experiments/types.ts","./src/experiments/components/experimentdetail.tsx","./src/experiments/components/experimentlist.tsx","./src/experiments/components/markdown.tsx","./src/experiments/components/subexperimentview.tsx","./src/harbor/harborapp.tsx","./src/harbor/api.ts","./src/harbor/store.ts","./src/harbor/types.ts","./src/harbor/components/chatbubble.tsx","./src/harbor/components/infobar.tsx","./src/harbor/components/instancelist.tsx","./src/harbor/components/instancenav.tsx","./src/harbor/components/metricssummary.tsx","./src/harbor/components/sidebar.tsx","./src/harbor/components/stepdetail.tsx","./src/harbor/components/trajectoryview.tsx","./src/model/modelapp.tsx","./src/model/api.ts","./src/model/store.ts","./src/model/types.ts","./src/model/components/infobar.tsx","./src/model/components/questionnav.tsx","./src/model/components/sidebar.tsx","./src/model/components/tracepanel.tsx","./src/model/utils/promptparser.ts","./src/model/utils/tracehighlight.ts","./src/rlm/rlmapp.tsx","./src/rlm/api.ts","./src/rlm/store.ts","./src/rlm/types.ts","./src/rlm/components/breadcrumb.tsx","./src/rlm/components/datasetselector.tsx","./src/rlm/components/gepaiterlevel.tsx","./src/rlm/components/overviewlevel.tsx","./src/rlm/components/panel.tsx","./src/rlm/components/rlmdetaillevel.tsx","./src/rlm/components/sidebar.tsx","./src/rlm-eval/rlmevalapp.tsx","./src/rlm-eval/api.ts","./src/rlm-eval/store.ts","./src/rlm-eval/types.ts","./src/rlm-eval/components/breadcrumb.tsx","./src/rlm-eval/components/datasetselector.tsx","./src/rlm-eval/components/exampledetaillevel.tsx","./src/rlm-eval/components/iterationdetail.tsx","./src/rlm-eval/components/overviewlevel.tsx","./src/rlm-eval/components/panel.tsx","./src/rlm-eval/components/sidebar.tsx","./src/visualizer/visualizerapp.tsx"],"version":"5.9.3"}
scripts/import_experiments.py ADDED
@@ -0,0 +1,251 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Import all experiment data from local files into the Research Dashboard HF repo."""
2
+
3
+ import json
4
+ import os
5
+ import re
6
+ import tempfile
7
+ import uuid
8
+ import yaml
9
+ from pathlib import Path
10
+ from huggingface_hub import HfApi
11
+
12
+ EXPERIMENTS_DIR = Path("/Users/rs2020/Research/notes/experiments")
13
+ DASHBOARD_REPO = "reasoning-degeneration-dev/RESEARCH_DASHBOARD"
14
+
15
+ STAGE_MAP = {
16
+ "supported": "concluded",
17
+ "invalidated": "concluded",
18
+ "inconclusive": "inconclusive",
19
+ "exploring": "active",
20
+ "active": "active",
21
+ "pending": "planned",
22
+ }
23
+
24
+
25
+ def compute_completeness(exp_dir: Path, config: dict) -> int:
26
+ score = 0
27
+ if (exp_dir / "questions.md").exists():
28
+ score += 1
29
+ if (exp_dir / "EXPERIMENT_README.md").exists():
30
+ score += 1
31
+ if (exp_dir / "HUGGINGFACE_REPOS.md").exists():
32
+ score += 1
33
+ if (exp_dir / "experiment.yaml").exists():
34
+ score += 1
35
+ sub_dir = exp_dir / "experiments"
36
+ if sub_dir.exists() and any(sub_dir.glob("*.md")):
37
+ score += 1
38
+ return score
39
+
40
+
41
+ def parse_hf_repos(content: str) -> list[dict]:
42
+ """Extract HF repo links from HUGGINGFACE_REPOS.md markdown tables."""
43
+ repos = []
44
+ seen = set()
45
+ # Match markdown links like [name](https://huggingface.co/datasets/org/repo)
46
+ link_pattern = re.compile(r'\[([^\]]*)\]\(https://huggingface\.co/datasets/([^)]+)\)')
47
+ for match in link_pattern.finditer(content):
48
+ name, repo = match.groups()
49
+ if repo not in seen:
50
+ seen.add(repo)
51
+ repos.append({"repo": repo, "description": name.strip(), "date": ""})
52
+
53
+ # Also match plain repo references like reasoning-degeneration-dev/something
54
+ plain_pattern = re.compile(r'(?:^|\s)(reasoning-degeneration-dev/[\w-]+)')
55
+ for match in plain_pattern.finditer(content):
56
+ repo = match.group(1).strip()
57
+ if repo not in seen:
58
+ seen.add(repo)
59
+ repos.append({"repo": repo, "description": "", "date": ""})
60
+
61
+ return repos
62
+
63
+
64
+ def load_experiment(exp_dir: Path) -> tuple[dict, list[dict], list[dict]]:
65
+ """Load a single experiment directory. Returns (experiment, runs, sub_experiments)."""
66
+ name = exp_dir.name
67
+
68
+ # Load config
69
+ config = {}
70
+ config_path = exp_dir / "experiment.yaml"
71
+ if config_path.exists():
72
+ with open(config_path) as f:
73
+ config = yaml.safe_load(f) or {}
74
+
75
+ # Hypothesis
76
+ hyp_raw = config.get("hypothesis", {})
77
+ if isinstance(hyp_raw, str):
78
+ hyp_raw = {"statement": hyp_raw}
79
+ hypothesis = {
80
+ "statement": hyp_raw.get("statement", ""),
81
+ "type": hyp_raw.get("type", "exploration"),
82
+ "status": hyp_raw.get("status", "pending"),
83
+ "success_criteria": hyp_raw.get("success_criteria", ""),
84
+ }
85
+
86
+ # Stage from hypothesis status
87
+ stage = STAGE_MAP.get(hypothesis["status"], "active")
88
+ if not (exp_dir / "EXPERIMENT_README.md").exists() and not config:
89
+ stage = "idea"
90
+
91
+ # Models
92
+ models_raw = config.get("models", [])
93
+ models = []
94
+ for m in models_raw:
95
+ if isinstance(m, dict):
96
+ mid = m.get("id", "")
97
+ # Clean up provider prefix for display
98
+ short = mid.split("/")[-1] if "/" in mid else mid
99
+ if short and short not in models:
100
+ models.append(short)
101
+ elif isinstance(m, str) and m not in models:
102
+ models.append(m)
103
+
104
+ # Tasks
105
+ tasks = []
106
+ eval_cfg = config.get("evaluation", {})
107
+ if isinstance(eval_cfg, dict):
108
+ task = eval_cfg.get("task", "")
109
+ if task:
110
+ tasks.append(task)
111
+ extra_tasks = eval_cfg.get("extra", {}).get("additional_tasks", [])
112
+ tasks.extend(extra_tasks)
113
+
114
+ # Tags
115
+ obs = config.get("observability", {})
116
+ tags = obs.get("tags", []) if isinstance(obs, dict) else []
117
+
118
+ # Notes from EXPERIMENT_README.md
119
+ notes = ""
120
+ readme_path = exp_dir / "EXPERIMENT_README.md"
121
+ if readme_path.exists():
122
+ with open(readme_path) as f:
123
+ notes = f.read()
124
+
125
+ # HF repos
126
+ hf_repos = []
127
+ hf_path = exp_dir / "HUGGINGFACE_REPOS.md"
128
+ if hf_path.exists():
129
+ with open(hf_path) as f:
130
+ hf_repos = parse_hf_repos(f.read())
131
+
132
+ # Wandb
133
+ wandb_project = obs.get("wandb_project", "") if isinstance(obs, dict) else ""
134
+ wandb_url = f"https://wandb.ai/{wandb_project}" if wandb_project else ""
135
+
136
+ # Completeness
137
+ completeness = compute_completeness(exp_dir, config)
138
+
139
+ experiment = {
140
+ "id": name,
141
+ "name": config.get("name", name).replace("_", " ").replace("-", " ").title(),
142
+ "research_project": config.get("research_project", ""),
143
+ "hypothesis": hypothesis,
144
+ "stage": stage,
145
+ "completeness": completeness,
146
+ "models": models,
147
+ "tasks": tasks,
148
+ "tags": tags,
149
+ "hf_repos": hf_repos,
150
+ "wandb_url": wandb_url,
151
+ "notes": notes,
152
+ "created": config.get("created", ""),
153
+ "updated": config.get("updated", ""),
154
+ }
155
+
156
+ # Runs from config
157
+ runs = []
158
+ for run_raw in config.get("runs", []):
159
+ run = {
160
+ "id": run_raw.get("run_id", f"run_{uuid.uuid4().hex[:8]}"),
161
+ "experiment_id": name,
162
+ "condition": run_raw.get("condition", ""),
163
+ "model": run_raw.get("model", "").split("/")[-1] if run_raw.get("model") else "",
164
+ "cluster": run_raw.get("cluster", "local"),
165
+ "status": run_raw.get("status", "completed"),
166
+ "hf_dataset": run_raw.get("hf_dataset", ""),
167
+ "metrics": run_raw.get("metrics", {}),
168
+ "timestamp": run_raw.get("timestamp", ""),
169
+ "notes": run_raw.get("notes", ""),
170
+ }
171
+ runs.append(run)
172
+
173
+ # Sub-experiments
174
+ sub_experiments = []
175
+ sub_dir = exp_dir / "experiments"
176
+ if sub_dir.exists():
177
+ for md_file in sorted(sub_dir.glob("*.md")):
178
+ sub_name = md_file.stem.replace("_", " ").title()
179
+ with open(md_file) as f:
180
+ content = f.read()
181
+
182
+ # Try to extract hypothesis from first few lines
183
+ sub_hypothesis = ""
184
+ for line in content.split("\n")[:20]:
185
+ if "hypothesis" in line.lower() or "question" in line.lower():
186
+ sub_hypothesis = line.strip().lstrip("#").lstrip("*").strip()
187
+ break
188
+
189
+ sub_id = f"{name}__{md_file.stem}"
190
+ sub = {
191
+ "id": sub_id,
192
+ "experiment_id": name,
193
+ "name": sub_name,
194
+ "hypothesis": sub_hypothesis,
195
+ "status": "active",
196
+ "content_md": content,
197
+ "hf_repos": parse_hf_repos(content),
198
+ "created": config.get("created", ""),
199
+ "updated": config.get("updated", ""),
200
+ }
201
+ sub_experiments.append(sub)
202
+
203
+ return experiment, runs, sub_experiments
204
+
205
+
206
+ def main():
207
+ all_experiments = []
208
+ all_runs = []
209
+ all_subs = []
210
+
211
+ for exp_dir in sorted(EXPERIMENTS_DIR.iterdir()):
212
+ if not exp_dir.is_dir():
213
+ continue
214
+ if exp_dir.name.startswith(".") or exp_dir.name == "old":
215
+ continue
216
+
217
+ print(f"Loading: {exp_dir.name}")
218
+ exp, runs, subs = load_experiment(exp_dir)
219
+ all_experiments.append(exp)
220
+ all_runs.extend(runs)
221
+ all_subs.extend(subs)
222
+ print(f" -> {len(runs)} runs, {len(subs)} sub-experiments, {len(exp.get('hf_repos', []))} HF repos")
223
+
224
+ print(f"\nTotal: {len(all_experiments)} experiments, {len(all_runs)} runs, {len(all_subs)} sub-experiments")
225
+
226
+ # Upload to HF
227
+ api = HfApi()
228
+ try:
229
+ api.create_repo(DASHBOARD_REPO, repo_type="dataset", exist_ok=True)
230
+ except Exception:
231
+ pass
232
+
233
+ for name, data in [("experiments", all_experiments), ("runs", all_runs), ("sub_experiments", all_subs)]:
234
+ with tempfile.NamedTemporaryFile("w", suffix=".json", delete=False) as f:
235
+ json.dump(data, f, indent=2, default=str)
236
+ tmp = f.name
237
+ print(f"Uploading {name}.json ({len(data)} records)...")
238
+ api.upload_file(
239
+ path_or_fileobj=tmp,
240
+ path_in_repo=f"{name}.json",
241
+ repo_id=DASHBOARD_REPO,
242
+ repo_type="dataset",
243
+ )
244
+ os.unlink(tmp)
245
+
246
+ print("\nDone! Data uploaded to", DASHBOARD_REPO)
247
+ print("Sync the dashboard: curl -X POST https://reasoning-degeneration-dev-agg-trace-visualizer.hf.space/api/experiments/sync")
248
+
249
+
250
+ if __name__ == "__main__":
251
+ main()