├── .eslintrc.json
├── .gitignore
├── .prettierignore
├── .prettierrc
├── README.md
├── app
├── favicon.ico
├── globals.css
├── layout.tsx
└── page.tsx
├── components.json
├── components
├── AddNode.tsx
├── SDA
│ ├── AddColumn.tsx
│ ├── CleanColumnNames.tsx
│ ├── Describe.tsx
│ ├── FetchData.tsx
│ ├── FetchGeoData.tsx
│ ├── Filter.tsx
│ ├── Join.tsx
│ ├── JoinGeo.tsx
│ ├── LinearRegressions.tsx
│ ├── LoadFile.tsx
│ ├── LoadGeoFile.tsx
│ ├── LogTable.tsx
│ ├── Longer.tsx
│ ├── Note.tsx
│ ├── Points.tsx
│ ├── ProportionsVertical.tsx
│ ├── RemoveDuplicates.tsx
│ ├── RenameColumns.tsx
│ ├── SDB.tsx
│ ├── ST.tsx
│ ├── SelectColumns.tsx
│ ├── Sort.tsx
│ ├── Summarize.tsx
│ ├── UpdateColumn.tsx
│ └── Wider.tsx
├── SimpleFlow.tsx
├── helpers
│ └── getNewState.tsx
├── initialState.tsx
├── nodeTypes.tsx
├── partials
│ ├── AllCode.tsx
│ ├── CardTitleWithLoader.tsx
│ ├── Code.tsx
│ ├── CodeIcon.tsx
│ ├── CopyIcon.tsx
│ ├── DataTable.tsx
│ ├── Error.tsx
│ ├── GithubLogo.tsx
│ ├── MenuBar.tsx
│ ├── Options.tsx
│ ├── OptionsCheckbox.tsx
│ ├── OptionsInputNumber.tsx
│ ├── OptionsInputText.tsx
│ ├── OptionsItem.tsx
│ ├── OptionsMultipleCheckBoxes.tsx
│ ├── OptionsMultipleInputText.tsx
│ ├── OptionsSelect.tsx
│ ├── OptionsTextArea.tsx
│ ├── Source.tsx
│ ├── Spinner.tsx
│ └── Target.tsx
└── ui
│ ├── accordion.tsx
│ ├── button.tsx
│ ├── card.tsx
│ ├── checkbox.tsx
│ ├── context-menu.tsx
│ ├── input.tsx
│ ├── label.tsx
│ ├── menubar.tsx
│ ├── select.tsx
│ ├── separator.tsx
│ ├── table.tsx
│ └── textarea.tsx
├── docs
├── .nojekyll
├── 404.html
├── _next
│ └── static
│ │ ├── V2RuNXPZAMrBd2bvUYRrN
│ │ ├── _buildManifest.js
│ │ └── _ssgManifest.js
│ │ ├── chunks
│ │ ├── 0295e583.ba25b0b765c49573.js
│ │ ├── 0457c758.f23db0228cf5fe9e.js
│ │ ├── 1004.d3fd77d01a796acd.js
│ │ ├── 1012.b337c54ec36393c3.js
│ │ ├── 1051.f17985eed6b22f78.js
│ │ ├── 110.ceb5c300bd6c10de.js
│ │ ├── 1115.9bc958c1247198c3.js
│ │ ├── 1124.4417b964d3c688cb.js
│ │ ├── 1226.0165a8e6c6f82322.js
│ │ ├── 1325.5b627c16b0e9f4cc.js
│ │ ├── 1340.283bed25b4458394.js
│ │ ├── 1421.2591174390815395.js
│ │ ├── 1454.447e350336481a6e.js
│ │ ├── 147.3b7262a10d72f5da.js
│ │ ├── 1629.f84fec160887f531.js
│ │ ├── 1686.9189a5bf49ca983a.js
│ │ ├── 1796.2ef7f849514bf425.js
│ │ ├── 1839.c7ea9bda727b7d9b.js
│ │ ├── 1849.3d091bf586de9db2.js
│ │ ├── 1862.feb3ce30e2f4ce78.js
│ │ ├── 192.da3a15a265c4cdc6.js
│ │ ├── 1986.a2a6c76c5d05b211.js
│ │ ├── 200.80bdb17c532b1e7a.js
│ │ ├── 2004.4a3aa353a6faa009.js
│ │ ├── 2043.2951f898f4485cf0.js
│ │ ├── 2057.d7a7e03d3ff03a0f.js
│ │ ├── 2129.70927ee0e26680ff.js
│ │ ├── 21ca6e34.0bd58711a3e1a16c.js
│ │ ├── 222.c87b51a3f70b4d54.js
│ │ ├── 2228.7b56d8af029d5fdd.js
│ │ ├── 2242.8078e2cb74f41319.js
│ │ ├── 229.1519f3f744ea4205.js
│ │ ├── 2296.96bbf247a9965253.js
│ │ ├── 2337.e188060cc404c69d.js
│ │ ├── 234.7bb43f384eb47bf9.js
│ │ ├── 2360.6673f5c2fb28035e.js
│ │ ├── 2428.6f66e6476dd38a39.js
│ │ ├── 2445.bc9cf7ed67d4a7ed.js
│ │ ├── 2521.2b7ddf215077bacf.js
│ │ ├── 2537.648aa094e7f9ff51.js
│ │ ├── 255.27aa620996ff291c.js
│ │ ├── 258.e88926071247fd57.js
│ │ ├── 267.62aee69d9a6c1392.js
│ │ ├── 2686.6c087021db38bf53.js
│ │ ├── 2716.b5160ab1ada940a5.js
│ │ ├── 2843.9776b5738b4c24c1.js
│ │ ├── 2866.5592e5e634eb27b9.js
│ │ ├── 2873.36c5eed147ee5078.js
│ │ ├── 2908.ac18a2dc91bd3a1b.js
│ │ ├── 3022.208d7add57fc62de.js
│ │ ├── 3049.8542b1ff7293500d.js
│ │ ├── 3053.223f14cd00e3a2ea.js
│ │ ├── 3068.402b01c166387575.js
│ │ ├── 3075.138aadfa47c6fb75.js
│ │ ├── 3078.9220bdab578f1a9b.js
│ │ ├── 3108.d920ef87673c1e4c.js
│ │ ├── 3160.909eefc109dc1d89.js
│ │ ├── 3181.76c7a2fc01848ca1.js
│ │ ├── 3186.9c0be2c0ce820d53.js
│ │ ├── 3189.ada87aef700e0eea.js
│ │ ├── 3197.a79af7dab75278e4.js
│ │ ├── 3349.2419556212e41871.js
│ │ ├── 3360.0c30f3d9da0443a8.js
│ │ ├── 3375.41342a7cc0b85e1d.js
│ │ ├── 33f1252a.84419672a6828629.js
│ │ ├── 3421.e6781b80d26a985d.js
│ │ ├── 3522.3dc8f43f8ee30dbb.js
│ │ ├── 3527.ee780e6c6d87831e.js
│ │ ├── 3553.9df62252f54b2208.js
│ │ ├── 3606.a9f1f6c0e6817347.js
│ │ ├── 3609.a7e4af14d0ce7b97.js
│ │ ├── 3693.c932ded9ad9aaf12.js
│ │ ├── 3731.8a58a9e3965cc7db.js
│ │ ├── 3862.65f214e8e1d22ea3.js
│ │ ├── 3864.43f3553354f00572.js
│ │ ├── 3937.c997ac9a72ccc098.js
│ │ ├── 3b7e0f76.f65613a0eab2174b.js
│ │ ├── 4001.78ea3954d8053ed4.js
│ │ ├── 4017.aa8187418a2ebb7f.js
│ │ ├── 4022.987edf4a35c7ce1a.js
│ │ ├── 403.077cd420a60e5a86.js
│ │ ├── 4054-ecbc552e055f18e3.js
│ │ ├── 4059.dc4d54a9d583b312.js
│ │ ├── 411.deee02058499f43e.js
│ │ ├── 4121.ae3dbc613fe4774c.js
│ │ ├── 417.a94f3d46c6f6081a.js
│ │ ├── 4178.47e5637b27d22b6b.js
│ │ ├── 4192.85b3d3077b21aa6e.js
│ │ ├── 4220.18d980a6f0c4e8c5.js
│ │ ├── 4222.c4eb1d401f25e63f.js
│ │ ├── 423.acc208af4b8b7234.js
│ │ ├── 4242.59d12e5ce84f98e8.js
│ │ ├── 4316.b46df82ca817589e.js
│ │ ├── 4349.97a14eb868ff3004.js
│ │ ├── 4395.445af27948f10068.js
│ │ ├── 4403.283af96390c34fb2.js
│ │ ├── 443.ffdc7d57d47ba307.js
│ │ ├── 4495.d79063ba44ea6326.js
│ │ ├── 4519.f8845315ef7fe03a.js
│ │ ├── 456.536b9928d7104113.js
│ │ ├── 4562.db2e363ed9a2d0ac.js
│ │ ├── 4594.9c73b08bb73dc676.js
│ │ ├── 4615.576f6d531a96c6de.js
│ │ ├── 4624.48e767266012b9cb.js
│ │ ├── 4630.65e8399ad24f8db3.js
│ │ ├── 4657.22e2028477a1db14.js
│ │ ├── 4678.e3eae34ac92c695c.js
│ │ ├── 4729.ebd8df84187d05e7.js
│ │ ├── 4738.781da85ec308045e.js
│ │ ├── 474.216c15ffda3f7ad2.js
│ │ ├── 4760.4354237c4613727d.js
│ │ ├── 4766.5e8b312204321b8a.js
│ │ ├── 4777.7af40330304acd2e.js
│ │ ├── 4876.e383c1ffd735b4ba.js
│ │ ├── 4901.96226f99730fa185.js
│ │ ├── 4910.3c1993cf0ca68f4d.js
│ │ ├── 4f541c7f.f1de305e1b504cf3.js
│ │ ├── 5043.4901c070bd02b57a.js
│ │ ├── 5065.02cae544c6b61b46.js
│ │ ├── 5236.0382fb240f594ba2.js
│ │ ├── 5351.03fd9f8c838d59c1.js
│ │ ├── 5355.dd3ab8dba73c7ba9.js
│ │ ├── 5360.ed878c87bbd801ab.js
│ │ ├── 5370.599e9f783de4d597.js
│ │ ├── 5425.03782d42a713cd25.js
│ │ ├── 5459.6c1e48eabc6e797c.js
│ │ ├── 5463.2aa0cee8e91677fa.js
│ │ ├── 5527.aa12bee457976515.js
│ │ ├── 5575.7f204b44e37feb27.js
│ │ ├── 55826268.5ebad7605bcc8cd7.js
│ │ ├── 559.9a4728d8b965bcbb.js
│ │ ├── 55d07805.f7a53d3b8f3104e7.js
│ │ ├── 5612.a1772f337e438531.js
│ │ ├── 5789.bd2f1e5f4c6d0a9e.js
│ │ ├── 581.531a8e0f66e2beb7.js
│ │ ├── 5828.ba14a56b9862a370.js
│ │ ├── 5829.a562e51da0453244.js
│ │ ├── 5845.6dfa395f49b0d1cc.js
│ │ ├── 5898.82c77bed98f0e054.js
│ │ ├── 5975.bde89f4fe4001e98.js
│ │ ├── 5990.8d1438d0ff4d7040.js
│ │ ├── 5991.670d9fbb66a53969.js
│ │ ├── 5995.1fefd9db51144c58.js
│ │ ├── 601.b08bf8192ef6285d.js
│ │ ├── 6012.1319a46b6943c91c.js
│ │ ├── 6032.493309ea66c1c116.js
│ │ ├── 6038.a9bd439b148eb2a8.js
│ │ ├── 6043.e3da222f0bdb6485.js
│ │ ├── 6170.d7504018438a43ed.js
│ │ ├── 6281.6ac11298597f025d.js
│ │ ├── 6320.3d176c75ac7b291e.js
│ │ ├── 6350.b2d721fbd7c9c30c.js
│ │ ├── 6351.0fa7bf5d6144da83.js
│ │ ├── 6420.ec126e46c8d2bbf1.js
│ │ ├── 6484.37ddbfc561fdc997.js
│ │ ├── 6523.eae1b04a1536be1a.js
│ │ ├── 6562.25f07034ccc886c4.js
│ │ ├── 6587.95d3ae8fa3d50cd3.js
│ │ ├── 6607.ac4d6c34f6994a60.js
│ │ ├── 6710.4116144ca09676d4.js
│ │ ├── 6722.1147b918f8f769ba.js
│ │ ├── 6741.280a68918381aaaf.js
│ │ ├── 6768.97bc738aed34ea5d.js
│ │ ├── 6770.7bd173bc9bd4b3d8.js
│ │ ├── 6814.c871ec2910b34535.js
│ │ ├── 6863.be5983a142fd99e3.js
│ │ ├── 6957.78ebda0f10c03a68.js
│ │ ├── 6974.6a443a30c83721d7.js
│ │ ├── 7023-57f9c7525478086f.js
│ │ ├── 7028.342b7f9e0d9beccf.js
│ │ ├── 7032.f5707e43b6a280fb.js
│ │ ├── 7042.3451eb2f7a071a61.js
│ │ ├── 7048.377770ce8fd15857.js
│ │ ├── 7091.ce7fab6bc551dc7d.js
│ │ ├── 7101.c2130c983aa77e34.js
│ │ ├── 7119.954b320eb2a7c0a5.js
│ │ ├── 7139.793c97bfbe6b135e.js
│ │ ├── 7144.78331ab1a7ffdf65.js
│ │ ├── 7168.e5f5faee7d02432f.js
│ │ ├── 7217.57beadb92b8188a8.js
│ │ ├── 7238.d404381f70dce37e.js
│ │ ├── 7249.a7fd1d99ae3da6dd.js
│ │ ├── 7264.07573063a79ee2c3.js
│ │ ├── 7304.a7628ddd3cae3c15.js
│ │ ├── 7375.aca3955cfc57561b.js
│ │ ├── 7410.4a1451f181aa0fde.js
│ │ ├── 7475.85610087b0b53bc1.js
│ │ ├── 7480.b5f0cc2b362d0753.js
│ │ ├── 7498.a089ea3f778b6aac.js
│ │ ├── 7501.e39df9319b6226fc.js
│ │ ├── 7589.4afbc7d3c1fd737e.js
│ │ ├── 7607.e4bf0ba03b43d8e1.js
│ │ ├── 768.f383a234e1f25445.js
│ │ ├── 76db47ee.c69cb785aa8732e4.js
│ │ ├── 7700.82087bc67bf7afa6.js
│ │ ├── 7710.cb0ac85ac55d2bf5.js
│ │ ├── 7825.77ad8304d0d51d08.js
│ │ ├── 7831.0ae6464f85a139cf.js
│ │ ├── 7837.d43802d9d7df7a98.js
│ │ ├── 7862.02457c1bccebc18c.js
│ │ ├── 7878.2fcdd886b86b7382.js
│ │ ├── 7915.e4f71fb9615d8953.js
│ │ ├── 7fcf5a4a.339c13e46056bd0a.js
│ │ ├── 8030.4aab3f65ac3dc159.js
│ │ ├── 8060.931ca94e8e30b463.js
│ │ ├── 8093.c89f62b0bc5fa24d.js
│ │ ├── 8110.d4e6bb65608acb9e.js
│ │ ├── 8217.283e589646bab0fe.js
│ │ ├── 8248.2309e94e4b9a6413.js
│ │ ├── 8252.5c0f94ef6adbb994.js
│ │ ├── 8271.1c1c633fcd3c2f1f.js
│ │ ├── 832.e2f4738ba35965e4.js
│ │ ├── 8346.e6af31d94167dd65.js
│ │ ├── 8414.6bedc148480daa83.js
│ │ ├── 8472.311cc354b4e26a29.js
│ │ ├── 8526.35611a36737cc91c.js
│ │ ├── 8579.fe29b87eca8a09af.js
│ │ ├── 8592.ef92262980693d17.js
│ │ ├── 8597740b.0ecf76d88bbed071.js
│ │ ├── 8619.36a6a7c92ccc65c7.js
│ │ ├── 864.863ce01377c675a1.js
│ │ ├── 8641.24f14a689c55ade1.js
│ │ ├── 8706.7745aaa3e76dded8.js
│ │ ├── 8714.e56cffeed1a30233.js
│ │ ├── 8726.5726eeaaac7cdf6c.js
│ │ ├── 8742.c4b45c1d59425a27.js
│ │ ├── 87bccb7d.21303fc0e9e49a12.js
│ │ ├── 8823.3bf0b782455e038a.js
│ │ ├── 8870.4b15b9781c02393d.js
│ │ ├── 8877.03bac32f50d1cadd.js
│ │ ├── 8919.38447c38ba2b94b9.js
│ │ ├── 8942.667adb96cad5a8cc.js
│ │ ├── 8980.f252ff9584faa915.js
│ │ ├── 8986.483dc72a08a9957c.js
│ │ ├── 8b07858d.daab52ea3460f96a.js
│ │ ├── 9048.d60a12c719e45198.js
│ │ ├── 9051.783fbf40ef4031fb.js
│ │ ├── 9063.5f9447cc9942561f.js
│ │ ├── 908.a39358a012859f7e.js
│ │ ├── 9139.d8c1011b97b1f3b4.js
│ │ ├── 9155.41f6426b84ddc9ed.js
│ │ ├── 9163.a294c46ca5a37783.js
│ │ ├── 9170.3974906319418ff1.js
│ │ ├── 9206.64d6db872d794942.js
│ │ ├── 9207.57aeba99ea00ed64.js
│ │ ├── 9228.ad9afae0ed3ab3ce.js
│ │ ├── 9236.59403c81a11d7023.js
│ │ ├── 924.c14f6053110f7244.js
│ │ ├── 9243.2d6204f212b19302.js
│ │ ├── 9257.b08a03cf0221785d.js
│ │ ├── 9286.532ed4d4f72c5205.js
│ │ ├── 9294.c27d025d03a9144e.js
│ │ ├── 931.02a5295aa02453fd.js
│ │ ├── 944.81e7db354c8ed5b3.js
│ │ ├── 9468d19c.3cc2763dddffdc65.js
│ │ ├── 948.c917c7b85df9a2e8.js
│ │ ├── 94ad0e32.dec28f631790a5d2.js
│ │ ├── 950.d55fd287a24baab3.js
│ │ ├── 9504.9b74a5fd614e09bc.js
│ │ ├── 9531.3559c1d15ec7d038.js
│ │ ├── 962.359ebe18fd3e30e8.js
│ │ ├── 9714.701497bfd7c68125.js
│ │ ├── 9716.3ff0471cfc96a8ce.js
│ │ ├── 9731.b497c42fd7233113.js
│ │ ├── 9816.b1978a439ccfe50a.js
│ │ ├── 9851.e107acbd273fb2d8.js
│ │ ├── 9888.a67aecaaae2bc960.js
│ │ ├── 9900.a301b22021ada59d.js
│ │ ├── 9949.590f3ad5abca9f38.js
│ │ ├── 9e052d69.4cef8752f85fd9d1.js
│ │ ├── a50c0dd0.0c272c2561672563.js
│ │ ├── ac74fd1c.5f79606f9cac2cb7.js
│ │ ├── app
│ │ │ ├── _not-found
│ │ │ │ └── page-f01e7c15f3882046.js
│ │ │ ├── layout-5f3fbea6e5509db4.js
│ │ │ └── page-9113efe66febbb21.js
│ │ ├── c24cc598-1633c6f334c250a2.js
│ │ ├── cca622d2.42e5b360038eb1ef.js
│ │ ├── ccb8f04b.98acc2ab6576c800.js
│ │ ├── dab78cdb-11a3c5a3e726a7f0.js
│ │ ├── e30973c3.baf08befe1c61dd2.js
│ │ ├── f4df560a.5fe879309ca9e15e.js
│ │ ├── fd9d1056-231b9b6933cef830.js
│ │ ├── framework-8e0e0f4a6b83a956.js
│ │ ├── main-app-b239df8585f488e7.js
│ │ ├── main-e9967d864ab7f685.js
│ │ ├── pages
│ │ │ ├── _app-f870474a17b7f2fd.js
│ │ │ └── _error-c66a4e8afc46f17b.js
│ │ ├── polyfills-78c92fac7aa8fdd8.js
│ │ └── webpack-ef9c09c146f640eb.js
│ │ ├── css
│ │ ├── 8e2b5a9de91ab637.css
│ │ └── 9c6f759383f5db47.css
│ │ └── media
│ │ ├── 26a46d62cd723877-s.woff2
│ │ ├── 55c55f0601d81cf3-s.woff2
│ │ ├── 581909926a08bbc8-s.woff2
│ │ ├── 6d93bde91c0c2823-s.woff2
│ │ ├── 97e0cb1ae144a2a9-s.woff2
│ │ ├── a34f9d1faa5f3315-s.p.woff2
│ │ └── df0a9ae256c0569c-s.woff2
├── favicon.ico
├── flow-examples
│ ├── climate-trends.json
│ └── fires-in-canada.json
├── index.html
└── index.txt
├── lib
├── shiki.ts
└── utils.ts
├── next.config.mjs
├── package-lock.json
├── package.json
├── postcss.config.mjs
├── public
└── flow-examples
│ ├── climate-trends.json
│ └── fires-in-canada.json
├── tailwind.config.ts
└── tsconfig.json
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["next/core-web-vitals"]
3 | }
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | docs/
2 | .next/
3 | out/
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "trailingComma": "es5",
3 | "tabWidth": 2,
4 | "semi": false
5 | }
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Simple Data Analysis Flow
2 |
3 | SDA-Flow is a node-based editor for [simple-data-analysis](https://github.com/nshiab/simple-data-analysis), an easy-to-use and high-performance JavaScript library for data analysis.
4 |
5 | This repo and the SDA library are maintained by [Nael Shiab](http://naelshiab.com/), computational journalist and senior data producer for [CBC News](https://www.cbc.ca/news).
6 |
7 | Not all [SDA methods](https://nshiab.github.io/simple-data-analysis/classes/SimpleWebTable.html) are implemented. If you need one, [create an issue](https://github.com/nshiab/simple-data-analysis-flow/issues).
8 |
9 | > To use the editor, [click here](https://nshiab.github.io/simple-data-analysis-flow/). Everything runs in your browser. The data doesn't leave your computer.
10 |
--------------------------------------------------------------------------------
/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/app/favicon.ico
--------------------------------------------------------------------------------
/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | pre {
6 | white-space: pre-wrap;
7 | word-break: break-all;
8 | width: 550px;
9 | }
10 |
11 | code {
12 | counter-reset: step;
13 | counter-increment: step 0;
14 | }
15 |
16 | code .line::before {
17 | content: counter(step, decimal);
18 | counter-increment: step;
19 | width: 2rem;
20 | margin-right: 1.5rem;
21 | display: inline-block;
22 | text-align: right;
23 | color: rgba(115, 138, 148, 0.4);
24 | }
25 |
26 | .react-flow__nodes .selected > div > div:not(.flex) {
27 | border: 1px solid black;
28 | }
29 |
30 | @layer base {
31 | :root {
32 | --background: 0 0% 100%;
33 | --foreground: 222.2 84% 4.9%;
34 | --card: 0 0% 100%;
35 | --card-foreground: 222.2 84% 4.9%;
36 | --popover: 0 0% 100%;
37 | --popover-foreground: 222.2 84% 4.9%;
38 | --primary: 222.2 47.4% 11.2%;
39 | --primary-foreground: 210 40% 98%;
40 | --secondary: 210 40% 96.1%;
41 | --secondary-foreground: 222.2 47.4% 11.2%;
42 | --muted: 210 40% 96.1%;
43 | --muted-foreground: 215.4 16.3% 46.9%;
44 | --accent: 210 40% 96.1%;
45 | --accent-foreground: 222.2 47.4% 11.2%;
46 | --destructive: 0 84.2% 60.2%;
47 | --destructive-foreground: 210 40% 98%;
48 | --border: 214.3 31.8% 91.4%;
49 | --input: 214.3 31.8% 91.4%;
50 | --ring: 222.2 84% 4.9%;
51 | --radius: 0.5rem;
52 | --chart-1: 12 76% 61%;
53 | --chart-2: 173 58% 39%;
54 | --chart-3: 197 37% 24%;
55 | --chart-4: 43 74% 66%;
56 | --chart-5: 27 87% 67%;
57 | }
58 |
59 | .dark {
60 | --background: 222.2 84% 4.9%;
61 | --foreground: 210 40% 98%;
62 | --card: 222.2 84% 4.9%;
63 | --card-foreground: 210 40% 98%;
64 | --popover: 222.2 84% 4.9%;
65 | --popover-foreground: 210 40% 98%;
66 | --primary: 210 40% 98%;
67 | --primary-foreground: 222.2 47.4% 11.2%;
68 | --secondary: 217.2 32.6% 17.5%;
69 | --secondary-foreground: 210 40% 98%;
70 | --muted: 217.2 32.6% 17.5%;
71 | --muted-foreground: 215 20.2% 65.1%;
72 | --accent: 217.2 32.6% 17.5%;
73 | --accent-foreground: 210 40% 98%;
74 | --destructive: 0 62.8% 30.6%;
75 | --destructive-foreground: 210 40% 98%;
76 | --border: 217.2 32.6% 17.5%;
77 | --input: 217.2 32.6% 17.5%;
78 | --ring: 212.7 26.8% 83.9%;
79 | --chart-1: 220 70% 50%;
80 | --chart-2: 160 60% 45%;
81 | --chart-3: 30 80% 55%;
82 | --chart-4: 280 65% 60%;
83 | --chart-5: 340 75% 55%;
84 | }
85 | }
86 |
87 | @layer base {
88 | * {
89 | @apply border-border;
90 | }
91 | body {
92 | @apply bg-background text-foreground;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next"
2 | import { Inter } from "next/font/google"
3 | import "./globals.css"
4 |
5 | const inter = Inter({ subsets: ["latin"] })
6 |
7 | export const metadata: Metadata = {
8 | title: "Simple Data Analysis Flow",
9 | description:
10 | "A node-based editor for the JavaScript library Simple-Data-Analysis.",
11 | }
12 |
13 | export default function RootLayout({
14 | children,
15 | }: Readonly<{
16 | children: React.ReactNode
17 | }>) {
18 | return (
19 |
20 |
{children}
21 |
22 | )
23 | }
24 |
--------------------------------------------------------------------------------
/app/page.tsx:
--------------------------------------------------------------------------------
1 | import GithubLogo from "@/components/partials/GithubLogo"
2 | import SimpleFlow from "@/components/SimpleFlow"
3 | import { ReactFlowProvider } from "@xyflow/react"
4 |
5 | export default function Home() {
6 | return (
7 |
8 |
9 |
46 |
47 |
48 |
49 |
50 |
51 | )
52 | }
53 |
--------------------------------------------------------------------------------
/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "default",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "app/globals.css",
9 | "baseColor": "slate",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/components/SDA/CleanColumnNames.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Card,
3 | CardContent,
4 | CardDescription,
5 | CardHeader,
6 | } from "@/components/ui/card"
7 | import { useHandleConnections, useNodesData, useReactFlow } from "@xyflow/react"
8 | import { useEffect, useState } from "react"
9 | import SimpleWebTable from "../../node_modules/simple-data-analysis/dist/class/SimpleWebTable"
10 |
11 | import Code from "../partials/Code"
12 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
13 | import Error from "../partials/Error"
14 | import Target from "../partials/Target"
15 | import Source from "../partials/Source"
16 |
17 | export default function CleanColumnNames({ id }: { id: string }) {
18 | const { updateNodeData } = useReactFlow()
19 |
20 | const target = useHandleConnections({ type: "target" })
21 | const source = useNodesData(target[0]?.source)
22 | const [targetReady, setTargetReady] = useState(false)
23 | const [sourceReady, setSourceReady] = useState(false)
24 |
25 | const [code, setCode] = useState("")
26 | const [loader, setLoader] = useState(false)
27 | const [error, setError] = useState(null)
28 |
29 | useEffect(() => {
30 | async function run() {
31 | const table = source?.data?.instance
32 | if (table instanceof SimpleWebTable) {
33 | setTargetReady(true)
34 | }
35 | if (table instanceof SimpleWebTable) {
36 | try {
37 | setLoader(true)
38 | const clonedTable = await table.cloneTable({
39 | outputTable: id,
40 | })
41 | await clonedTable.cleanColumnNames()
42 |
43 | const originalTableName =
44 | source?.data?.originalTableName ?? table.name
45 | const code = `await ${originalTableName}.cleanColumnNames();`
46 | setCode(code)
47 | updateNodeData(id, {
48 | instance: clonedTable,
49 | originalTableName: originalTableName,
50 | code,
51 | })
52 | setError(null)
53 | setLoader(false)
54 | setSourceReady(true)
55 | } catch (err) {
56 | console.error(err)
57 | //@ts-expect-error okay
58 | setError(err.message)
59 | setLoader(false)
60 | setSourceReady(false)
61 | }
62 | }
63 | }
64 |
65 | run()
66 | }, [source, id, updateNodeData])
67 |
68 | return (
69 |
70 |
71 |
72 |
73 |
74 |
75 | Clean column names
76 |
77 |
78 | Removes special characters and spaces from column names.
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | )
88 | }
89 |
--------------------------------------------------------------------------------
/components/SDA/Describe.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Card,
3 | CardContent,
4 | CardDescription,
5 | CardHeader,
6 | } from "@/components/ui/card"
7 | import { useHandleConnections, useNodesData } from "@xyflow/react"
8 | import { useEffect, useState } from "react"
9 | import SimpleWebTable from "../../node_modules/simple-data-analysis/dist/class/SimpleWebTable"
10 |
11 | import DataTable from "../partials/DataTable"
12 | import Code from "../partials/Code"
13 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
14 | import Target from "../partials/Target"
15 |
16 | export default function Describe({ id }: { id: string }) {
17 | const [name, setName] = useState(undefined)
18 | const [data, setData] = useState<
19 | { [key: string]: string | number | boolean | Date | null }[] | null
20 | >(null)
21 | const [columns, setColumns] = useState(null)
22 |
23 | const targetConnection = useHandleConnections({ type: "target" })
24 | const source = useNodesData(targetConnection[0]?.source)
25 |
26 | const [targetRead, setTargetReady] = useState(false)
27 | const [code, setCode] = useState("")
28 | const [loader, setLoader] = useState(false)
29 |
30 | useEffect(() => {
31 | async function run() {
32 | const table = source?.data?.instance
33 | if (table instanceof SimpleWebTable) {
34 | setTargetReady(true)
35 | setLoader(true)
36 |
37 | const description = (await table.getDescription()) as {
38 | [key: string]: string | number | boolean | Date | null
39 | }[]
40 | setData(description)
41 | const columns = Object.keys(description[0])
42 | setColumns(columns)
43 |
44 | const originalTableName = source?.data?.originalTableName ?? table.name
45 | setName(originalTableName as string)
46 | const code = `await ${originalTableName}.logDescription()`
47 | setCode(code)
48 | setLoader(false)
49 | } else {
50 | setData(null)
51 | setColumns(null)
52 | }
53 | }
54 |
55 | run()
56 | }, [source, id])
57 |
58 | return (
59 |
60 |
61 |
62 |
63 |
64 |
65 | Describe{typeof name === "string" ? ` ${name}` : ""}
66 |
67 |
68 | Returns details like data types, number of null and distinct values.
69 |
70 |
71 | {Array.isArray(data) && Array.isArray(columns) && (
72 |
73 |
74 |
75 | )}
76 |
77 |
78 | )
79 | }
80 |
--------------------------------------------------------------------------------
/components/SDA/FetchGeoData.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Card,
3 | CardContent,
4 | CardDescription,
5 | CardHeader,
6 | } from "@/components/ui/card"
7 | import { useHandleConnections, useNodesData, useReactFlow } from "@xyflow/react"
8 | import { useEffect, useState } from "react"
9 | import SimpleWebTable from "../../node_modules/simple-data-analysis/dist/class/SimpleWebTable"
10 | import Code from "../partials/Code"
11 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
12 | import Error from "../partials/Error"
13 | import Target from "../partials/Target"
14 | import Source from "../partials/Source"
15 | import OptionsInputText from "../partials/OptionsInputText"
16 |
17 | export default function FetchGeoData({ id }: { id: string }) {
18 | const [url, setURL] = useState(undefined)
19 |
20 | const { updateNodeData } = useReactFlow()
21 |
22 | const target = useHandleConnections({ type: "target" })
23 | const source = useNodesData(target[0]?.source)
24 |
25 | const [code, setCode] = useState("")
26 | const [loader, setLoader] = useState(false)
27 | const [targetReady, setTargetReady] = useState(false)
28 | const [sourceReady, setSourceReady] = useState(false)
29 | const [error, setError] = useState(null)
30 |
31 | const nodeData = useNodesData(id)
32 | useEffect(() => {
33 | if (nodeData?.data.imported) {
34 | if (typeof nodeData.data.url === "string") {
35 | setURL(nodeData.data.url)
36 | }
37 | nodeData.data.imported = false
38 | }
39 | }, [nodeData])
40 |
41 | useEffect(() => {
42 | async function run() {
43 | const table = source?.data?.instance
44 | if (table instanceof SimpleWebTable) {
45 | setTargetReady(true)
46 | }
47 | if (table instanceof SimpleWebTable && typeof url === "string") {
48 | try {
49 | setLoader(true)
50 | await table.fetchGeoData(url)
51 | const code = `// For front-end projects, use fetchGeoData.
52 | await ${table.name}.loadGeoData("${url}");`
53 | setCode(code)
54 | updateNodeData(id, {
55 | instance: table,
56 | code,
57 | url,
58 | })
59 | setError(null)
60 | setLoader(false)
61 | setSourceReady(true)
62 | } catch (err) {
63 | console.error(err)
64 | // @ts-expect-error okay
65 | setError(err.message)
66 | setLoader(false)
67 | setSourceReady(false)
68 | }
69 | }
70 | }
71 |
72 | run()
73 | }, [source, id, updateNodeData, url])
74 |
75 | return (
76 |
77 |
78 |
79 |
80 |
81 |
82 | Fetch geo data
83 |
84 | Fetches spatial data from a URL.
85 |
86 |
87 | setURL(e)}
91 | />
92 |
93 |
94 |
95 |
96 |
97 | )
98 | }
99 |
--------------------------------------------------------------------------------
/components/SDA/Filter.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Card,
3 | CardContent,
4 | CardDescription,
5 | CardHeader,
6 | } from "@/components/ui/card"
7 | import { useHandleConnections, useNodesData, useReactFlow } from "@xyflow/react"
8 | import { useEffect, useState } from "react"
9 | import SimpleWebTable from "../../node_modules/simple-data-analysis/dist/class/SimpleWebTable"
10 |
11 | import Code from "../partials/Code"
12 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
13 | import Error from "../partials/Error"
14 | import Target from "../partials/Target"
15 | import Source from "../partials/Source"
16 | import OptionsTextArea from "../partials/OptionsTextArea"
17 |
18 | export default function Filter({ id }: { id: string }) {
19 | const [definition, setDefinition] = useState(undefined)
20 |
21 | const { updateNodeData } = useReactFlow()
22 |
23 | const target = useHandleConnections({ type: "target" })
24 | const source = useNodesData(target[0]?.source)
25 | const [targetReady, setTargetReady] = useState(false)
26 | const [sourceReady, setSourceReady] = useState(false)
27 |
28 | const [code, setCode] = useState("")
29 | const [loader, setLoader] = useState(false)
30 | const [error, setError] = useState(null)
31 |
32 | const nodeData = useNodesData(id)
33 | useEffect(() => {
34 | if (nodeData?.data.imported) {
35 | if (typeof nodeData.data.definition === "string") {
36 | setDefinition(nodeData.data.definition)
37 | }
38 | nodeData.data.imported = false
39 | }
40 | }, [nodeData])
41 |
42 | useEffect(() => {
43 | async function run() {
44 | const table = source?.data?.instance
45 | if (table instanceof SimpleWebTable) {
46 | setTargetReady(true)
47 | }
48 | if (table instanceof SimpleWebTable && typeof definition === "string") {
49 | try {
50 | setLoader(true)
51 | const clonedTable = await table.cloneTable({
52 | outputTable: id,
53 | })
54 | await clonedTable.filter(definition)
55 |
56 | const originalTableName =
57 | source?.data?.originalTableName ?? table.name
58 | const code = `await ${originalTableName}.filter(\`${definition}\`);`
59 | setCode(code)
60 | updateNodeData(id, {
61 | instance: clonedTable,
62 | originalTableName: originalTableName,
63 | code,
64 | definition,
65 | })
66 | setError(null)
67 | setLoader(false)
68 | setSourceReady(true)
69 | } catch (err) {
70 | console.error(err)
71 | //@ts-expect-error okay
72 | setError(err.message)
73 | setLoader(false)
74 | setSourceReady(false)
75 | }
76 | }
77 | }
78 |
79 | run()
80 | }, [source, id, updateNodeData, definition])
81 |
82 | return (
83 |
84 |
85 |
86 |
87 |
88 | Filter
89 |
90 | Filter rows in the table. The condition is in SQL.
91 |
92 |
93 |
94 |
99 |
100 |
101 |
102 |
103 |
104 | )
105 | }
106 |
--------------------------------------------------------------------------------
/components/SDA/LoadGeoFile.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Card,
3 | CardContent,
4 | CardDescription,
5 | CardHeader,
6 | } from "@/components/ui/card"
7 | import { useHandleConnections, useNodesData, useReactFlow } from "@xyflow/react"
8 | import { useEffect, useRef, useState } from "react"
9 | import SimpleWebTable from "../../node_modules/simple-data-analysis/dist/class/SimpleWebTable"
10 | import { Input } from "../ui/input"
11 |
12 | import Code from "../partials/Code"
13 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
14 | import Error from "../partials/Error"
15 | import Target from "../partials/Target"
16 | import Source from "../partials/Source"
17 | import { AsyncDuckDB, DuckDBDataProtocol } from "@duckdb/duckdb-wasm"
18 |
19 | export default function LoadGeoFile({ id }: { id: string }) {
20 | const refUrl = useRef(null)
21 |
22 | const [file, setFile] = useState(null)
23 |
24 | const { updateNodeData } = useReactFlow()
25 |
26 | const target = useHandleConnections({ type: "target" })
27 | const source = useNodesData(target[0]?.source)
28 |
29 | const [code, setCode] = useState("")
30 | const [loader, setLoader] = useState(false)
31 | const [targetReady, setTargetReady] = useState(false)
32 | const [sourceReady, setSourceReady] = useState(false)
33 | const [error, setError] = useState(null)
34 |
35 | useEffect(() => {
36 | async function run() {
37 | const table = source?.data?.instance
38 | if (table instanceof SimpleWebTable) {
39 | setTargetReady(true)
40 | }
41 | if (table instanceof SimpleWebTable && file instanceof File) {
42 | try {
43 | setLoader(true)
44 | const db = table.db as AsyncDuckDB
45 |
46 | await db.registerFileHandle(
47 | file.name,
48 | file,
49 | DuckDBDataProtocol.BROWSER_FILEREADER,
50 | true
51 | )
52 | await table.sdb.customQuery(
53 | `INSTALL spatial; LOAD spatial;
54 | INSTALL https; LOAD https;
55 | CREATE OR REPLACE TABLE ${table.name} AS SELECT * FROM ST_Read('${file.name}');`
56 | )
57 |
58 | const code = `// More options available. Check documentation.
59 | await ${table.name}.loadGeoData("${file.name}");`
60 | setCode(code)
61 | updateNodeData(id, {
62 | instance: table,
63 | code,
64 | })
65 | setError(null)
66 | setLoader(false)
67 | setSourceReady(true)
68 | } catch (err) {
69 | console.error(err)
70 | // @ts-expect-error okay
71 | setError(err.message)
72 | setLoader(false)
73 | setSourceReady(true)
74 | }
75 | }
76 | }
77 |
78 | run()
79 | }, [source, id, updateNodeData, file])
80 |
81 | return (
82 |
83 |
84 |
85 |
86 |
87 |
88 | Load geo file
89 |
90 |
91 | Loads spatial data from a local file.
92 |
93 |
94 |
95 |
96 | {
100 | const files = e.target.files
101 | if (files) {
102 | setFile(files[0])
103 | }
104 | }}
105 | />
106 |
107 |
108 |
109 |
110 |
111 |
112 | )
113 | }
114 |
--------------------------------------------------------------------------------
/components/SDA/Note.tsx:
--------------------------------------------------------------------------------
1 | import { Card } from "@/components/ui/card"
2 | import { useNodesData, useReactFlow } from "@xyflow/react"
3 | import { useEffect, useState } from "react"
4 | import { Textarea } from "../ui/textarea"
5 |
6 | export default function Note({ id }: { id: string }) {
7 | const [importedText, setImportedText] = useState(
8 | undefined
9 | )
10 | const [text, setText] = useState(undefined)
11 |
12 | const { updateNodeData } = useReactFlow()
13 |
14 | const nodeData = useNodesData(id)
15 | useEffect(() => {
16 | if (nodeData?.data.imported) {
17 | if (typeof nodeData.data.text === "string") {
18 | setImportedText(nodeData.data.text)
19 | }
20 | nodeData.data.imported = false
21 | }
22 | }, [nodeData])
23 |
24 | useEffect(() => {
25 | async function run() {
26 | updateNodeData(id, {
27 | text,
28 | })
29 | }
30 |
31 | run()
32 | }, [text, id, updateNodeData])
33 |
34 | return (
35 |
36 |
37 |
43 |
44 | )
45 | }
46 |
--------------------------------------------------------------------------------
/components/SDA/RemoveDuplicates.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Card,
3 | CardContent,
4 | CardDescription,
5 | CardHeader,
6 | } from "@/components/ui/card"
7 | import { useHandleConnections, useNodesData, useReactFlow } from "@xyflow/react"
8 | import { useEffect, useState } from "react"
9 | import SimpleWebTable from "../../node_modules/simple-data-analysis/dist/class/SimpleWebTable"
10 |
11 | import Code from "../partials/Code"
12 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
13 | import Error from "../partials/Error"
14 | import Target from "../partials/Target"
15 | import Source from "../partials/Source"
16 |
17 | export default function RemoveDuplicates({ id }: { id: string }) {
18 | const { updateNodeData } = useReactFlow()
19 |
20 | const target = useHandleConnections({ type: "target" })
21 | const source = useNodesData(target[0]?.source)
22 | const [targetReady, setTargetReady] = useState(false)
23 | const [sourceReady, setSourceReady] = useState(false)
24 |
25 | const [code, setCode] = useState("")
26 | const [loader, setLoader] = useState(false)
27 | const [error, setError] = useState(null)
28 |
29 | useEffect(() => {
30 | async function run() {
31 | const table = source?.data?.instance
32 | if (table instanceof SimpleWebTable) {
33 | setTargetReady(true)
34 | }
35 | if (table instanceof SimpleWebTable) {
36 | try {
37 | setLoader(true)
38 | const clonedTable = await table.cloneTable({
39 | outputTable: id,
40 | })
41 | await clonedTable.removeDuplicates()
42 |
43 | const originalTableName =
44 | source?.data?.originalTableName ?? table.name
45 | const code = `await ${originalTableName}.removeDuplicates();`
46 | setCode(code)
47 | updateNodeData(id, {
48 | instance: clonedTable,
49 | originalTableName: originalTableName,
50 | code,
51 | })
52 | setError(null)
53 | setLoader(false)
54 | setSourceReady(true)
55 | } catch (err) {
56 | console.error(err)
57 | //@ts-expect-error okay
58 | setError(err.message)
59 | setLoader(false)
60 | setSourceReady(false)
61 | }
62 | }
63 | }
64 |
65 | run()
66 | }, [source, id, updateNodeData])
67 |
68 | return (
69 |
70 |
71 |
72 |
73 |
74 |
75 | Remove duplicates
76 |
77 |
78 | Removes duplicate rows from this table, keeping unique rows. The
79 | data might be returned in a different order than the original.
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | )
89 | }
90 |
--------------------------------------------------------------------------------
/components/SDA/SDB.tsx:
--------------------------------------------------------------------------------
1 | import { Card, CardDescription, CardHeader } from "@/components/ui/card"
2 | import { useReactFlow } from "@xyflow/react"
3 | import SimpleWebDB from "../../node_modules/simple-data-analysis/dist/class/SimpleWebDB"
4 | import { useEffect, useState } from "react"
5 | import Code from "../partials/Code"
6 | import Source from "../partials/Source"
7 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
8 |
9 | export default function SDB({ id }: { id: string }) {
10 | const { updateNodeData } = useReactFlow()
11 | const [code, setCode] = useState("")
12 | const [sourceReady, setSourceReady] = useState(false)
13 | const [loader, setLoader] = useState(false)
14 |
15 | useEffect(() => {
16 | async function start() {
17 | setLoader(true)
18 | const sdb = await new SimpleWebDB().start()
19 | // await sdb.customQuery(`ATTACH DATABASE '${id}' as mydb;
20 | // use mydb;`)
21 | const code = `// For front-end projects, switch to SimpleWebDB
22 | import { SimpleDB } from "simple-data-analysis";
23 |
24 | const sdb = new SimpleDB();`
25 | setCode(code)
26 | updateNodeData(id, { instance: sdb, code })
27 | setLoader(false)
28 | setSourceReady(true)
29 | }
30 | start()
31 | }, [id, updateNodeData])
32 |
33 | return (
34 |
35 |
36 |
37 |
38 | SimpleDB
39 | This is your in-memory database.
40 |
41 |
42 |
43 |
44 | )
45 | }
46 |
--------------------------------------------------------------------------------
/components/SDA/ST.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Card,
3 | CardContent,
4 | CardDescription,
5 | CardHeader,
6 | } from "@/components/ui/card"
7 | import { useHandleConnections, useNodesData, useReactFlow } from "@xyflow/react"
8 | import { useEffect, useState } from "react"
9 | import SimpleWebDB from "../../node_modules/simple-data-analysis/dist/class/SimpleWebDB"
10 | import Code from "../partials/Code"
11 | import Target from "../partials/Target"
12 | import Source from "../partials/Source"
13 | import OptionsInputText from "../partials/OptionsInputText"
14 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
15 |
16 | export default function ST({ id }: { id: string }) {
17 | const { updateNodeData } = useReactFlow()
18 | const [targetReady, setTargetReady] = useState(false)
19 | const [sourceReady, setSourceReady] = useState(false)
20 | const [loader, setLoader] = useState(false)
21 |
22 | const targetConnection = useHandleConnections({ type: "target" })
23 |
24 | const [name, setName] = useState(`${id}`)
25 | const [code, setCode] = useState("")
26 |
27 | const source = useNodesData(targetConnection[0]?.source)
28 |
29 | const nodeData = useNodesData(id)
30 | useEffect(() => {
31 | if (nodeData?.data.imported) {
32 | if (typeof nodeData.data.name === "string") {
33 | setName(nodeData.data.name)
34 | }
35 | nodeData.data.imported = false
36 | }
37 | }, [nodeData])
38 |
39 | useEffect(() => {
40 | const sdb = source?.data?.instance
41 | if (sdb instanceof SimpleWebDB) {
42 | setTargetReady(true)
43 | setLoader(true)
44 | const code = `const ${name} = sdb.newTable("${name}");`
45 | setCode(code)
46 | updateNodeData(id, {
47 | name,
48 | instance: sdb.newTable(name),
49 | code: code,
50 | })
51 | setLoader(false)
52 | setSourceReady(true)
53 | }
54 | }, [source, id, updateNodeData, name])
55 |
56 | return (
57 |
58 |
59 |
60 |
61 |
62 | SimpleTable
63 | This is a table in the database.
64 |
65 |
66 | setName(e)}
70 | />
71 |
72 |
73 |
74 |
75 | )
76 | }
77 |
--------------------------------------------------------------------------------
/components/SDA/SelectColumns.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Card,
3 | CardContent,
4 | CardDescription,
5 | CardHeader,
6 | } from "@/components/ui/card"
7 | import { useHandleConnections, useNodesData, useReactFlow } from "@xyflow/react"
8 | import { useEffect, useState } from "react"
9 | import SimpleWebTable from "../../node_modules/simple-data-analysis/dist/class/SimpleWebTable"
10 |
11 | import Code from "../partials/Code"
12 | import CardTitleWithLoader from "../partials/CardTitleWithLoader"
13 | import Error from "../partials/Error"
14 | import Target from "../partials/Target"
15 | import Source from "../partials/Source"
16 | import OptionsMultiplesCheckBoxes from "../partials/OptionsMultipleCheckBoxes"
17 |
18 | export default function SelectColumns({ id }: { id: string }) {
19 | const [columns, setColumns] = useState<{ value: string; label: string }[]>([])
20 | const [selectedColumns, setSelectedColumns] = useState()
21 |
22 | const { updateNodeData } = useReactFlow()
23 |
24 | const target = useHandleConnections({ type: "target" })
25 | const source = useNodesData(target[0]?.source)
26 |
27 | useEffect(() => {
28 | async function run() {
29 | const table = source?.data?.instance
30 | if (table instanceof SimpleWebTable) {
31 | setColumns(
32 | (await table.getColumns()).map((d) => ({ value: d, label: d }))
33 | )
34 | }
35 | }
36 | run()
37 | }, [source])
38 |
39 | const [code, setCode] = useState("")
40 | const [loader, setLoader] = useState(false)
41 | const [targetReady, setTargetReady] = useState(false)
42 | const [sourceReady, setSourceReady] = useState(false)
43 | const [error, setError] = useState(null)
44 |
45 | const nodeData = useNodesData(id)
46 | useEffect(() => {
47 | if (nodeData?.data.imported) {
48 | if (Array.isArray(nodeData.data.columns)) {
49 | setColumns(nodeData.data.columns)
50 | }
51 | if (Array.isArray(nodeData.data.selectedColumns)) {
52 | setSelectedColumns(nodeData.data.selectedColumns)
53 | }
54 |
55 | nodeData.data.imported = false
56 | }
57 | }, [nodeData])
58 |
59 | useEffect(() => {
60 | async function run() {
61 | const table = source?.data?.instance
62 | if (table instanceof SimpleWebTable) {
63 | setTargetReady(true)
64 | }
65 | if (table instanceof SimpleWebTable && selectedColumns?.length) {
66 | try {
67 | setLoader(true)
68 |
69 | const clonedTable = await table.cloneTable({
70 | outputTable: id,
71 | })
72 | await clonedTable.selectColumns(selectedColumns)
73 |
74 | const originalTableName =
75 | source?.data?.originalTableName ?? table.name
76 | const code = `await ${originalTableName}.selectColumns(${JSON.stringify(selectedColumns)});`
77 | setCode(code)
78 | updateNodeData(id, {
79 | instance: clonedTable,
80 | originalTableName,
81 | code,
82 | selectedColumns,
83 | columns,
84 | })
85 | setError(null)
86 | setLoader(false)
87 | setSourceReady(true)
88 | } catch (err) {
89 | console.error(err)
90 | //@ts-expect-error okay
91 | setError(err.message)
92 | setLoader(false)
93 | setSourceReady(false)
94 | }
95 | }
96 | }
97 |
98 | run()
99 | }, [source, id, updateNodeData, selectedColumns, columns])
100 |
101 | return (
102 |
103 |
104 |
105 |
106 |
107 |
108 | Select columns
109 |
110 | Selects columns in a table
111 |
112 |
113 |
119 |
120 |
121 |
122 |
123 |
124 | )
125 | }
126 |
--------------------------------------------------------------------------------
/components/SimpleFlow.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import React, { useCallback, useEffect, useState } from "react"
4 | import {
5 | ReactFlow,
6 | Controls,
7 | Background,
8 | useNodesState,
9 | useEdgesState,
10 | addEdge,
11 | BackgroundVariant,
12 | MarkerType,
13 | ConnectionLineType,
14 | ReactFlowInstance,
15 | } from "@xyflow/react"
16 |
17 | import "@xyflow/react/dist/style.css"
18 | import AddNode from "./AddNode"
19 | import AllCode from "./partials/AllCode"
20 |
21 | import { initialNodes, initialEdges } from "./initialState"
22 | import nodeTypes from "./nodeTypes"
23 | import { MenuBar } from "./partials/MenuBar"
24 |
25 | let previousSave = Date.now()
26 |
27 | export default function SimpleFlow() {
28 | const [rfInstance, setRfInstance] = useState()
29 |
30 | const [height, setHeight] = useState("0")
31 |
32 | useEffect(() => {
33 | function dimensions() {
34 | const header = document.querySelector("#header")
35 | if (header) {
36 | const bbox = header.getBoundingClientRect()
37 | setHeight(`${window.innerHeight - bbox.height}px`)
38 | }
39 | }
40 | dimensions()
41 |
42 | window.addEventListener("resize", dimensions)
43 |
44 | return () => window.removeEventListener("resize", dimensions)
45 | }, [])
46 |
47 | const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes)
48 | const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges)
49 |
50 | const onConnect = useCallback(
51 | (params: any) =>
52 | setEdges((eds) => {
53 | return addEdge(
54 | params,
55 | eds.filter((d) => {
56 | if (!d.targetHandle || !params.targetHandle) {
57 | return d.target !== params.target
58 | } else {
59 | return (
60 | d.target !== params.target ||
61 | d.targetHandle !== params.targetHandle
62 | )
63 | }
64 | })
65 | )
66 | }),
67 | [setEdges]
68 | )
69 | useEffect(() => {
70 | if (rfInstance) {
71 | const now = Date.now()
72 | if (now - previousSave > 500) {
73 | const flow = rfInstance.toObject()
74 | const string = JSON.stringify(flow)
75 | localStorage.setItem("sda-flow", string)
76 | previousSave = now
77 | }
78 | }
79 | }, [nodes, rfInstance])
80 |
81 | return (
82 | height !== "0" && (
83 | <>
84 |
89 |
90 |
91 |
97 |
115 |
116 |
117 |
118 |
119 |
120 | >
121 | )
122 | )
123 | }
124 |
--------------------------------------------------------------------------------
/components/helpers/getNewState.tsx:
--------------------------------------------------------------------------------
1 | import { getId } from "journalism"
2 | import { Edge, Node } from "@xyflow/react"
3 |
4 | export default function getNewState() {
5 | const dbId = `node_${getId()}`
6 | const tableId = `node_${getId()}`
7 |
8 | const nodes: Node[] = [
9 | {
10 | id: dbId,
11 | type: "SDB",
12 | position: { x: 0, y: 0 },
13 | data: { instance: null },
14 | origin: [0.5, 0],
15 | },
16 | {
17 | id: tableId,
18 | type: "ST",
19 | position: { x: -50, y: 150 },
20 | data: { instance: null, name: tableId },
21 | origin: [0.5, 0],
22 | },
23 | ]
24 |
25 | const edgeId = `edge_${getId()}`
26 |
27 | const edges: Edge[] = [
28 | {
29 | id: edgeId,
30 | source: dbId,
31 | target: tableId,
32 | },
33 | ]
34 |
35 | return { nodes, edges }
36 | }
37 |
--------------------------------------------------------------------------------
/components/initialState.tsx:
--------------------------------------------------------------------------------
1 | import getNewState from "./helpers/getNewState"
2 | import { Edge, Node } from "@xyflow/react"
3 |
4 | let initialNodes: Node[] = []
5 | let initialEdges: Edge[] = []
6 |
7 | let recoveredFlow = null
8 | if (typeof window !== "undefined") {
9 | recoveredFlow = window.localStorage.getItem("sda-flow")
10 | }
11 |
12 | if (recoveredFlow) {
13 | const flow = JSON.parse(recoveredFlow)
14 | initialNodes = flow.nodes.map((d: Node) => ({
15 | ...d,
16 | data: { ...d.data, imported: true },
17 | }))
18 | initialEdges = flow.edges
19 | } else {
20 | const newState = getNewState()
21 | initialNodes = newState.nodes
22 | initialEdges = newState.edges
23 | }
24 |
25 | export { initialNodes, initialEdges }
26 |
--------------------------------------------------------------------------------
/components/nodeTypes.tsx:
--------------------------------------------------------------------------------
1 | import SDB from "./SDA/SDB"
2 | import ST from "./SDA/ST"
3 | import FetchData from "./SDA/FetchData"
4 | import LogTable from "./SDA/LogTable"
5 | import FetchGeoData from "./SDA/FetchGeoData"
6 | import Points from "./SDA/Points"
7 | import JoinGeo from "./SDA/JoinGeo"
8 | import Summarize from "./SDA/Summarize"
9 | import RenameColumns from "./SDA/RenameColumns"
10 | import Sort from "./SDA/Sort"
11 | import AddColumn from "./SDA/AddColumn"
12 | import Filter from "./SDA/Filter"
13 | import Join from "./SDA/Join"
14 | import LinearRegressions from "./SDA/LinearRegressions"
15 | import LoadFile from "./SDA/LoadFile"
16 | import LoadGeoFile from "./SDA/LoadGeoFile"
17 | import Note from "./SDA/Note"
18 | import SelectColumns from "./SDA/SelectColumns"
19 | import Longer from "./SDA/Longer"
20 | import Wider from "./SDA/Wider"
21 | import CleanColumnNames from "./SDA/CleanColumnNames"
22 | import Describe from "./SDA/Describe"
23 | import ProportionsVertical from "./SDA/ProportionsVertical"
24 | import RemoveDuplicates from "./SDA/RemoveDuplicates"
25 | import UpdateColumn from "./SDA/UpdateColumn"
26 |
27 | const nodeTypes = {
28 | SDB: SDB,
29 | ST: ST,
30 | FetchData: FetchData,
31 | LoadFile: LoadFile,
32 | LoadGeoFile: LoadGeoFile,
33 | FetchGeoData: FetchGeoData,
34 | LogTable: LogTable,
35 | Points: Points,
36 | JoinGeo: JoinGeo,
37 | Summarize: Summarize,
38 | RenameColumns: RenameColumns,
39 | Sort: Sort,
40 | AddColumn: AddColumn,
41 | Filter: Filter,
42 | Join: Join,
43 | LinearRegressions: LinearRegressions,
44 | Note: Note,
45 | SelectColumns: SelectColumns,
46 | Longer: Longer,
47 | Wider: Wider,
48 | CleanColumnNames: CleanColumnNames,
49 | Describe: Describe,
50 | ProportionsVertical: ProportionsVertical,
51 | RemoveDuplicates: RemoveDuplicates,
52 | UpdateColumn: UpdateColumn,
53 | }
54 |
55 | export default nodeTypes
56 |
--------------------------------------------------------------------------------
/components/partials/AllCode.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useMemo, useState } from "react"
2 | import Code from "./Code"
3 | import { useNodes, useNodesData } from "@xyflow/react"
4 |
5 | export default function AllCode() {
6 | const [open, setOpen] = useState(false)
7 |
8 | const [code, setCode] = useState("")
9 |
10 | const nodes = useNodes()
11 | const ids = useMemo(() => nodes.map((d) => d.id), [nodes])
12 | const nodesData = useNodesData(ids)
13 |
14 | useEffect(() => {
15 | if (open) {
16 | const code = nodesData
17 | .map((d) => d.data.code)
18 | .filter((d) => d !== "" && d !== null && d !== undefined)
19 | .join("\n\n")
20 | setCode(code)
21 | }
22 | }, [nodesData, open])
23 |
24 | return (
25 | setOpen(!open)}>
26 |
27 |
28 | )
29 | }
30 |
--------------------------------------------------------------------------------
/components/partials/CardTitleWithLoader.tsx:
--------------------------------------------------------------------------------
1 | import { CardTitle } from "../ui/card"
2 | import Spinner from "./Spinner"
3 |
4 | export default function CardTitleWithLoader({
5 | loader,
6 | children,
7 | }: {
8 | loader: boolean
9 | children: any
10 | }) {
11 | return (
12 |
13 | {children}
14 |
15 |
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/components/partials/Code.tsx:
--------------------------------------------------------------------------------
1 | import { useCallback, useEffect, useState } from "react"
2 | import codeToHtml from "@/lib/shiki"
3 | import CodeIcon from "./CodeIcon"
4 | import { Button } from "../ui/button"
5 | import CopyIcon from "./CopyIcon"
6 |
7 | export default function Code({
8 | code,
9 | border,
10 | left,
11 | }: {
12 | code: string
13 | border?: boolean
14 | left?: boolean
15 | }) {
16 | const [innerHTML, setInnerHTML] = useState("")
17 | const [open, setOpen] = useState(false)
18 |
19 | useEffect(() => {
20 | async function toHtml() {
21 | const html = await codeToHtml(code)
22 | setInnerHTML(html)
23 | }
24 | toHtml()
25 | }, [code])
26 |
27 | const copy = useCallback(() => {
28 | navigator.clipboard.writeText(code)
29 | }, [code])
30 |
31 | return (
32 |
33 |
34 |
setOpen(!open)}
39 | >
40 |
41 |
42 | {open && (
43 |
48 |
52 |
53 |
59 |
60 |
61 |
62 |
63 | )}
64 |
65 |
66 | )
67 | }
68 |
--------------------------------------------------------------------------------
/components/partials/CodeIcon.tsx:
--------------------------------------------------------------------------------
1 | export default function CodeIcon() {
2 | return (
3 |
10 |
16 |
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/components/partials/CopyIcon.tsx:
--------------------------------------------------------------------------------
1 | export default function CopyIcon() {
2 | return (
3 |
10 |
16 |
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/components/partials/DataTable.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Table,
3 | TableBody,
4 | TableCell,
5 | TableFooter,
6 | TableHead,
7 | TableHeader,
8 | TableRow,
9 | } from "../ui/table"
10 | import { formatDate, formatNumber } from "journalism"
11 |
12 | export default function DataTable({
13 | data,
14 | columns,
15 | types,
16 | nbRows,
17 | }: {
18 | data: { [key: string]: string | number | Date | boolean | null }[]
19 | columns: string[]
20 | types?: string[]
21 | nbRows?: number
22 | }) {
23 | return (
24 |
25 |
26 |
27 | {columns.map((d, i) => (
28 |
29 | {d}
30 | {types && {types[i]}
}
31 |
32 | ))}
33 |
34 |
35 |
36 | {data.map((d, i) => (
37 |
38 | {columns.map((c, i) => {
39 | if (d[c] instanceof Date) {
40 | return (
41 |
42 | {formatDate(d[c], "Month DD, YYYY, at HH:MM period TZ", {
43 | utc: true,
44 | abbreviations: true,
45 | })}
46 |
47 | )
48 | } else if (typeof d[c] === "number") {
49 | return {formatNumber(d[c])}
50 | } else if (ArrayBuffer.isView(d[c])) {
51 | return {``}
52 | } else {
53 | return {d[c]?.toString()}
54 | }
55 | })}
56 |
57 | ))}
58 |
59 | {nbRows && (
60 |
61 |
62 |
63 | {formatNumber(nbRows)} rows in total in the table
64 |
65 |
66 |
67 | )}
68 |
69 | )
70 | }
71 |
--------------------------------------------------------------------------------
/components/partials/Error.tsx:
--------------------------------------------------------------------------------
1 | export default function Error({ error }: { error: null | string }) {
2 | return (
3 | error && (
4 |
7 | )
8 | )
9 | }
10 |
--------------------------------------------------------------------------------
/components/partials/GithubLogo.tsx:
--------------------------------------------------------------------------------
1 | export default function GithubLogo() {
2 | return (
3 |
7 |
14 |
20 |
21 |
22 | )
23 | }
24 |
--------------------------------------------------------------------------------
/components/partials/Options.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Accordion,
3 | AccordionTrigger,
4 | AccordionItem,
5 | AccordionContent,
6 | } from "../ui/accordion"
7 |
8 | export default function Options({ children }: { children: any }) {
9 | return (
10 |
11 |
12 | Options
13 | {children}
14 |
15 |
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/components/partials/OptionsCheckbox.tsx:
--------------------------------------------------------------------------------
1 | import { Checkbox } from "../ui/checkbox"
2 | import OptionsItem from "./OptionsItem"
3 | import { Label } from "../ui/label"
4 |
5 | export default function OptionsCheckbox({
6 | label,
7 | defaultChecked,
8 | checked,
9 | onChange,
10 | smallMargin,
11 | }: {
12 | label: string
13 | checked: boolean
14 | defaultChecked?: boolean
15 | onChange: (e: boolean) => void
16 | smallMargin?: boolean
17 | }) {
18 | return (
19 |
20 |
25 | {label}
26 |
27 | )
28 | }
29 |
--------------------------------------------------------------------------------
/components/partials/OptionsInputNumber.tsx:
--------------------------------------------------------------------------------
1 | import { SetStateAction } from "react"
2 | import { Input } from "../ui/input"
3 | import { Label } from "../ui/label"
4 | import OptionsItem from "./OptionsItem"
5 |
6 | export default function OptionsInputNumber({
7 | label,
8 | value,
9 | set,
10 | }: {
11 | label: string
12 | value: number | undefined
13 | set: (value: SetStateAction) => void
14 | }) {
15 | return (
16 |
17 | {label}
18 | set(parseInt(e.target.value))}
23 | />
24 |
25 | )
26 | }
27 |
--------------------------------------------------------------------------------
/components/partials/OptionsInputText.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef, useState } from "react"
2 | import { Input } from "../ui/input"
3 | import { Label } from "../ui/label"
4 | import OptionsItem from "./OptionsItem"
5 | import { Button } from "../ui/button"
6 |
7 | export default function OptionsInputText({
8 | label,
9 | value,
10 | onClick,
11 | }: {
12 | label: string
13 | value: string
14 | onClick: (e: string) => void
15 | }) {
16 | const ref = useRef(null)
17 |
18 | const [localValue, setLocalValue] = useState("")
19 |
20 | useEffect(() => {
21 | setLocalValue(value)
22 | }, [value])
23 |
24 | return (
25 |
26 | {label}
27 | setLocalValue(e.target.value)}
32 | onKeyDown={(e) => {
33 | e.key === "Enter" && ref.current ? onClick(ref.current.value) : null
34 | }}
35 | />
36 |
38 | ref.current &&
39 | typeof ref.current.value === "string" &&
40 | onClick(ref.current.value)
41 | }
42 | >
43 | Update
44 |
45 |
46 | )
47 | }
48 |
--------------------------------------------------------------------------------
/components/partials/OptionsItem.tsx:
--------------------------------------------------------------------------------
1 | export default function OptionsItem({
2 | smallMargin,
3 | children,
4 | }: {
5 | smallMargin?: boolean
6 | children: any
7 | }) {
8 | return (
9 |
12 | {children}
13 |
14 | )
15 | }
16 |
--------------------------------------------------------------------------------
/components/partials/OptionsMultipleCheckBoxes.tsx:
--------------------------------------------------------------------------------
1 | import { Dispatch, Fragment, SetStateAction, useEffect, useState } from "react"
2 | import OptionsCheckbox from "./OptionsCheckbox"
3 | import { Separator } from "../ui/separator"
4 | import { Label } from "../ui/label"
5 |
6 | export default function OptionsMultiplesCheckBoxes({
7 | label,
8 | items,
9 | set,
10 | values,
11 | }: {
12 | label: string
13 | items: { value: string; label: string }[]
14 | set: Dispatch>
15 | values: string[]
16 | }) {
17 | return (
18 |
19 |
{label}
20 |
21 | {items.map((d, i) => (
22 |
23 | {i !== 0 && i !== items.length - 1 && (
24 |
29 | )}
30 | {
36 | if (e) {
37 | if (!values.includes(d.value)) {
38 | set([...values, d.value])
39 | }
40 | } else {
41 | set(values.filter((x) => x !== d.value))
42 | }
43 | }}
44 | />
45 |
46 | ))}
47 |
48 |
49 | )
50 | }
51 |
--------------------------------------------------------------------------------
/components/partials/OptionsMultipleInputText.tsx:
--------------------------------------------------------------------------------
1 | import { Dispatch, SetStateAction, useEffect, useState } from "react"
2 | import OptionsInputText from "./OptionsInputText"
3 |
4 | export default function OptionsMultipleInputText({
5 | items,
6 | values,
7 | setValues,
8 | }: {
9 | items: {
10 | label: string
11 | defaultValue: string
12 | }[]
13 | values: { [key: string]: string }
14 | setValues: Dispatch<
15 | SetStateAction<{
16 | [key: string]: string
17 | }>
18 | >
19 | }) {
20 | return (
21 | <>
22 | {items.map((d, i) => (
23 | {
28 | const newLocalValues = { ...values }
29 | newLocalValues[d.label] = e
30 | setValues(newLocalValues)
31 | }}
32 | />
33 | ))}
34 | >
35 | )
36 | }
37 |
--------------------------------------------------------------------------------
/components/partials/OptionsSelect.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Select,
3 | SelectContent,
4 | SelectTrigger,
5 | SelectValue,
6 | SelectGroup,
7 | SelectItem,
8 | } from "../ui/select"
9 | import OptionsItem from "./OptionsItem"
10 | import { Label } from "../ui/label"
11 |
12 | export default function OptionsSelect({
13 | label,
14 | placeholder,
15 | items,
16 | onChange,
17 | value,
18 | }: {
19 | label: string
20 | placeholder?: string | undefined
21 | items: { value: any; label: any }[]
22 | onChange: (e: string) => void
23 | value: string
24 | }) {
25 | return (
26 |
27 | {label}
28 |
29 |
30 |
31 |
32 |
33 |
34 | {items.map((d, i) => (
35 |
36 | {d.label}
37 |
38 | ))}
39 |
40 |
41 |
42 |
43 | )
44 | }
45 |
--------------------------------------------------------------------------------
/components/partials/OptionsTextArea.tsx:
--------------------------------------------------------------------------------
1 | import { Dispatch, SetStateAction, useEffect, useRef, useState } from "react"
2 | import { Label } from "../ui/label"
3 | import { Textarea } from "../ui/textarea"
4 | import OptionsItem from "./OptionsItem"
5 | import { Button } from "../ui/button"
6 |
7 | export default function OptionsTextArea({
8 | label,
9 | set,
10 | value,
11 | }: {
12 | label: string
13 | value: string
14 | set: Dispatch>
15 | }) {
16 | const ref = useRef(null)
17 |
18 | const [localValue, setLocalValue] = useState("")
19 |
20 | useEffect(() => {
21 | setLocalValue(value)
22 | }, [value])
23 |
24 | return (
25 |
26 |
27 |
28 |
{label}
29 |
30 |
51 |
52 |
53 |
54 | )
55 | }
56 |
--------------------------------------------------------------------------------
/components/partials/Source.tsx:
--------------------------------------------------------------------------------
1 | import { Handle, Position } from "@xyflow/react"
2 |
3 | export default function Source({ sourceReady }: { sourceReady: boolean }) {
4 | return (
5 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/components/partials/Spinner.tsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default function Spinner({ show }: { show: boolean }) {
4 | return (
5 | show && (
6 |
7 |
27 |
28 | )
29 | )
30 | }
31 |
--------------------------------------------------------------------------------
/components/partials/Target.tsx:
--------------------------------------------------------------------------------
1 | import { Handle, Position } from "@xyflow/react"
2 |
3 | export default function Target({
4 | targetReady,
5 | id,
6 | }: {
7 | targetReady: boolean
8 | id?: string
9 | }) {
10 | return (
11 |
25 | )
26 | }
27 |
--------------------------------------------------------------------------------
/components/ui/accordion.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as AccordionPrimitive from "@radix-ui/react-accordion"
5 | import { ChevronDown } from "lucide-react"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const Accordion = AccordionPrimitive.Root
10 |
11 | const AccordionItem = React.forwardRef<
12 | React.ElementRef,
13 | React.ComponentPropsWithoutRef
14 | >(({ className, ...props }, ref) => (
15 |
16 | ))
17 | AccordionItem.displayName = "AccordionItem"
18 |
19 | const AccordionTrigger = React.forwardRef<
20 | React.ElementRef,
21 | React.ComponentPropsWithoutRef
22 | >(({ className, children, ...props }, ref) => (
23 |
24 | svg]:rotate-180",
28 | className
29 | )}
30 | {...props}
31 | >
32 | {children}
33 |
34 |
35 |
36 | ))
37 | AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
38 |
39 | const AccordionContent = React.forwardRef<
40 | React.ElementRef,
41 | React.ComponentPropsWithoutRef
42 | >(({ className, children, ...props }, ref) => (
43 |
48 | {children}
49 |
50 | ))
51 |
52 | AccordionContent.displayName = AccordionPrimitive.Content.displayName
53 |
54 | export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
55 |
--------------------------------------------------------------------------------
/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import { Slot } from "@radix-ui/react-slot"
3 | import { cva, type VariantProps } from "class-variance-authority"
4 |
5 | import { cn } from "@/lib/utils"
6 |
7 | const buttonVariants = cva(
8 | "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
9 | {
10 | variants: {
11 | variant: {
12 | default: "bg-primary text-primary-foreground hover:bg-primary/90",
13 | destructive:
14 | "bg-destructive text-destructive-foreground hover:bg-destructive/90",
15 | outline:
16 | "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
17 | secondary:
18 | "bg-secondary text-secondary-foreground hover:bg-secondary/80",
19 | ghost: "hover:bg-accent hover:text-accent-foreground",
20 | link: "text-primary underline-offset-4 hover:underline",
21 | },
22 | size: {
23 | default: "h-10 px-4 py-2",
24 | sm: "h-9 rounded-md px-3",
25 | lg: "h-11 rounded-md px-8",
26 | icon: "h-10 w-10",
27 | },
28 | },
29 | defaultVariants: {
30 | variant: "default",
31 | size: "default",
32 | },
33 | }
34 | )
35 |
36 | export interface ButtonProps
37 | extends React.ButtonHTMLAttributes,
38 | VariantProps {
39 | asChild?: boolean
40 | }
41 |
42 | const Button = React.forwardRef(
43 | ({ className, variant, size, asChild = false, ...props }, ref) => {
44 | const Comp = asChild ? Slot : "button"
45 | return (
46 |
51 | )
52 | }
53 | )
54 | Button.displayName = "Button"
55 |
56 | export { Button, buttonVariants }
57 |
--------------------------------------------------------------------------------
/components/ui/card.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | const Card = React.forwardRef<
6 | HTMLDivElement,
7 | React.HTMLAttributes
8 | >(({ className, ...props }, ref) => (
9 |
17 | ))
18 | Card.displayName = "Card"
19 |
20 | const CardHeader = React.forwardRef<
21 | HTMLDivElement,
22 | React.HTMLAttributes
23 | >(({ className, ...props }, ref) => (
24 |
29 | ))
30 | CardHeader.displayName = "CardHeader"
31 |
32 | const CardTitle = React.forwardRef<
33 | HTMLParagraphElement,
34 | React.HTMLAttributes
35 | >(({ className, ...props }, ref) => (
36 |
44 | ))
45 | CardTitle.displayName = "CardTitle"
46 |
47 | const CardDescription = React.forwardRef<
48 | HTMLParagraphElement,
49 | React.HTMLAttributes
50 | >(({ className, ...props }, ref) => (
51 |
56 | ))
57 | CardDescription.displayName = "CardDescription"
58 |
59 | const CardContent = React.forwardRef<
60 | HTMLDivElement,
61 | React.HTMLAttributes
62 | >(({ className, ...props }, ref) => (
63 |
64 | ))
65 | CardContent.displayName = "CardContent"
66 |
67 | const CardFooter = React.forwardRef<
68 | HTMLDivElement,
69 | React.HTMLAttributes
70 | >(({ className, ...props }, ref) => (
71 |
76 | ))
77 | CardFooter.displayName = "CardFooter"
78 |
79 | export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
80 |
--------------------------------------------------------------------------------
/components/ui/checkbox.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
5 | import { Check } from "lucide-react"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const Checkbox = React.forwardRef<
10 | React.ElementRef,
11 | React.ComponentPropsWithoutRef
12 | >(({ className, ...props }, ref) => (
13 |
21 |
24 |
25 |
26 |
27 | ))
28 | Checkbox.displayName = CheckboxPrimitive.Root.displayName
29 |
30 | export { Checkbox }
31 |
--------------------------------------------------------------------------------
/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export interface InputProps
6 | extends React.InputHTMLAttributes {}
7 |
8 | const Input = React.forwardRef(
9 | ({ className, type, ...props }, ref) => {
10 | return (
11 |
20 | )
21 | }
22 | )
23 | Input.displayName = "Input"
24 |
25 | export { Input }
26 |
--------------------------------------------------------------------------------
/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as LabelPrimitive from "@radix-ui/react-label"
5 | import { cva, type VariantProps } from "class-variance-authority"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const labelVariants = cva(
10 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
11 | )
12 |
13 | const Label = React.forwardRef<
14 | React.ElementRef,
15 | React.ComponentPropsWithoutRef &
16 | VariantProps
17 | >(({ className, ...props }, ref) => (
18 |
23 | ))
24 | Label.displayName = LabelPrimitive.Root.displayName
25 |
26 | export { Label }
27 |
--------------------------------------------------------------------------------
/components/ui/separator.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as SeparatorPrimitive from "@radix-ui/react-separator"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Separator = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(
12 | (
13 | { className, orientation = "horizontal", decorative = true, ...props },
14 | ref
15 | ) => (
16 |
27 | )
28 | )
29 | Separator.displayName = SeparatorPrimitive.Root.displayName
30 |
31 | export { Separator }
32 |
--------------------------------------------------------------------------------
/components/ui/table.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | const Table = React.forwardRef<
6 | HTMLTableElement,
7 | React.HTMLAttributes
8 | >(({ className, ...props }, ref) => (
9 |
16 | ))
17 | Table.displayName = "Table"
18 |
19 | const TableHeader = React.forwardRef<
20 | HTMLTableSectionElement,
21 | React.HTMLAttributes
22 | >(({ className, ...props }, ref) => (
23 |
24 | ))
25 | TableHeader.displayName = "TableHeader"
26 |
27 | const TableBody = React.forwardRef<
28 | HTMLTableSectionElement,
29 | React.HTMLAttributes
30 | >(({ className, ...props }, ref) => (
31 |
36 | ))
37 | TableBody.displayName = "TableBody"
38 |
39 | const TableFooter = React.forwardRef<
40 | HTMLTableSectionElement,
41 | React.HTMLAttributes
42 | >(({ className, ...props }, ref) => (
43 | tr]:last:border-b-0", className)}
46 | {...props}
47 | />
48 | ))
49 | TableFooter.displayName = "TableFooter"
50 |
51 | const TableRow = React.forwardRef<
52 | HTMLTableRowElement,
53 | React.HTMLAttributes
54 | >(({ className, ...props }, ref) => (
55 |
63 | ))
64 | TableRow.displayName = "TableRow"
65 |
66 | const TableHead = React.forwardRef<
67 | HTMLTableCellElement,
68 | React.ThHTMLAttributes
69 | >(({ className, ...props }, ref) => (
70 |
78 | ))
79 | TableHead.displayName = "TableHead"
80 |
81 | const TableCell = React.forwardRef<
82 | HTMLTableCellElement,
83 | React.TdHTMLAttributes
84 | >(({ className, ...props }, ref) => (
85 |
90 | ))
91 | TableCell.displayName = "TableCell"
92 |
93 | const TableCaption = React.forwardRef<
94 | HTMLTableCaptionElement,
95 | React.HTMLAttributes
96 | >(({ className, ...props }, ref) => (
97 |
102 | ))
103 | TableCaption.displayName = "TableCaption"
104 |
105 | export {
106 | Table,
107 | TableHeader,
108 | TableBody,
109 | TableFooter,
110 | TableHead,
111 | TableRow,
112 | TableCell,
113 | TableCaption,
114 | }
115 |
--------------------------------------------------------------------------------
/components/ui/textarea.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export interface TextareaProps
6 | extends React.TextareaHTMLAttributes {}
7 |
8 | const Textarea = React.forwardRef(
9 | ({ className, ...props }, ref) => {
10 | return (
11 |
19 | )
20 | }
21 | )
22 | Textarea.displayName = "Textarea"
23 |
24 | export { Textarea }
25 |
--------------------------------------------------------------------------------
/docs/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/.nojekyll
--------------------------------------------------------------------------------
/docs/_next/static/V2RuNXPZAMrBd2bvUYRrN/_buildManifest.js:
--------------------------------------------------------------------------------
1 | self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-c66a4e8afc46f17b.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
--------------------------------------------------------------------------------
/docs/_next/static/V2RuNXPZAMrBd2bvUYRrN/_ssgManifest.js:
--------------------------------------------------------------------------------
1 | self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
--------------------------------------------------------------------------------
/docs/_next/static/chunks/1004.d3fd77d01a796acd.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1004],{71004:function(e,n,a){a.r(n),a.d(n,{default:function(){return t}});var t=[Object.freeze({displayName:"Wenyan",name:"wenyan",patterns:[{include:"#keywords"},{include:"#constants"},{include:"#operators"},{include:"#symbols"},{include:"#expression"},{include:"#comment-blocks"},{include:"#comment-lines"}],repository:{"comment-blocks":{begin:"(注曰|疏曰|批曰)。?(「「|『)",end:"(」」|』)",name:"comment.block",patterns:[{match:"\\\\.",name:"constant.character"}]},"comment-lines":{begin:"注曰|疏曰|批曰",end:"$",name:"comment.line",patterns:[{match:"\\\\.",name:"constant.character"}]},constants:{patterns:[{match:"負|\xb7|又|零|〇|一|二|三|四|五|六|七|八|九|十|百|千|萬|億|兆|京|垓|秭|穰|溝|澗|正|載|極|分|釐|毫|絲|忽|微|纖|沙|塵|埃|渺|漠",name:"constant.numeric"},{match:"其|陰|陽",name:"constant.language"},{begin:"「「|『",end:"」」|』",name:"string.quoted",patterns:[{match:"\\\\.",name:"constant.character"}]}]},expression:{patterns:[{include:"#variables"}]},keywords:{patterns:[{match:"數|列|言|術|爻|物|元",name:"storage.type"},{match:"乃行是術曰|若其不然者|乃歸空無|欲行是術|乃止是遍|若其然者|其物如是|乃得矣|之術也|必先得|是術曰|恆為是|之物也|乃得|是謂|云云|中之|為是|乃止|若非|或若|之長|其餘",name:"keyword.control"},{match:"或云|蓋謂",name:"keyword.control"},{match:"中有陽乎|中無陰乎|所餘幾何|不等於|不大於|不小於|等於|大於|小於|加|減|乘|除|變|以|於",name:"keyword.operator"},{match:"不知何禍歟|不復存矣|姑妄行此|如事不諧|名之曰|吾嘗觀|之禍歟|乃作罷|吾有|今有|物之|書之|以施|昔之|是矣|之書|方悟|之義|嗚呼|之禍|有|施|曰|噫|取|今|夫|中|豈",name:"keyword.other"},{match:"也|凡|遍|若|者|之|充|銜",name:"keyword.control"}]},symbols:{patterns:[{match:"。|、",name:"punctuation.separator"}]},variables:{begin:"「",end:"」",name:"variable.other",patterns:[{match:"\\\\.",name:"constant.character"}]}},scopeName:"source.wenyan",aliases:["文言"]})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/110.ceb5c300bd6c10de.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[110],{80110:function(a,t,e){e.r(t),e.d(t,{default:function(){return n}});var n=[Object.freeze({displayName:"Smalltalk",fileTypes:["st"],foldingStartMarker:"\\[",foldingStopMarker:"^\\s*\\]|^\\s\\]",name:"smalltalk",patterns:[{match:"\\$.",name:"constant.character.smalltalk"},{match:"\\b(class)\\b",name:"storage.type.$1.smalltalk"},{match:"\\b(extend|super|self)\\b",name:"storage.modifier.$1.smalltalk"},{match:"\\b(yourself|new|Smalltalk)\\b",name:"keyword.control.$1.smalltalk"},{match:":=",name:"keyword.operator.assignment.smalltalk"},{comment:"Parse the variable declaration like: |a b c|",match:"/^:\\w*\\s*\\|/",name:"constant.other.block.smalltalk"},{captures:{1:{name:"punctuation.definition.instance-variables.begin.smalltalk"},2:{patterns:[{match:"\\w+",name:"support.type.variable.declaration.smalltalk"}]},3:{name:"punctuation.definition.instance-variables.end.smalltalk"}},match:"(\\|)(\\s*\\w[\\w ]*)(\\|)"},{captures:{1:{patterns:[{match:":\\w+",name:"entity.name.function.block.smalltalk"}]}},comment:"Parse the blocks like: [ :a :b | ...... ]",match:"\\[((\\s+|:\\w+)*)\\|"},{include:"#numeric"},{match:"<(?!<|=)|>(?!<|=|>)|<=|>=|=|==|~=|~~|>>|\\^",name:"keyword.operator.comparison.smalltalk"},{match:"(\\*|\\+|-|/|\\\\)",name:"keyword.operator.arithmetic.smalltalk"},{match:"(?<=[ \\t])!+|\\bnot\\b|&|\\band\\b|\\||\\bor\\b",name:"keyword.operator.logical.smalltalk"},{comment:"Fake reserved word -> main Smalltalk messages",match:"(?[a-zA-Z_]\\w*(?>[?!])?)(:)(?!:)",name:"constant.other.messages.smalltalk"},{captures:{1:{name:"punctuation.definition.constant.smalltalk"}},comment:"symbols",match:"(#)[a-zA-Z_][a-zA-Z0-9_:]*",name:"constant.other.symbol.smalltalk"},{begin:"#\\[",beginCaptures:[{name:"punctuation.definition.constant.begin.smalltalk"}],end:"\\]",endCaptures:[{name:"punctuation.definition.constant.end.smalltalk"}],name:"meta.array.byte.smalltalk",patterns:[{match:"\\d+(r[a-zA-Z0-9]+)?",name:"constant.numeric.integer.smalltalk"},{match:"[^\\s\\]]+",name:"invalid.illegal.character-not-allowed-here.smalltalk"}]},{begin:"#\\(",beginCaptures:[{name:"punctuation.definition.constant.begin.smalltalk"}],comment:"Array Constructor",end:"\\)",endCaptures:[{name:"punctuation.definition.constant.end.smalltalk"}],name:"constant.other.array.smalltalk"},{begin:"'",beginCaptures:[{name:"punctuation.definition.string.begin.smalltalk"}],end:"'",endCaptures:[{name:"punctuation.definition.string.end.smalltalk"}],name:"string.quoted.single.smalltalk"},{match:"\\b[A-Z]\\w*\\b",name:"variable.other.constant.smalltalk"}],repository:{numeric:{patterns:[{match:"(?]*)(?)",endCaptures:{1:{name:"punctuation.definition.tag.end.html"}},name:"meta.tag.other.unrecognized.html.derivative",patterns:[{include:"text.html.basic#attribute"}]}],scopeName:"text.html.derivative",embeddedLangs:["html"]});var i=[...a.default,m]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/229.1519f3f744ea4205.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[229],{80229:function(e,a,t){t.r(a),t.d(a,{default:function(){return n}});var n=[Object.freeze({displayName:"Desktop",name:"desktop",patterns:[{include:"#layout"},{include:"#keywords"},{include:"#values"},{include:"#inCommands"},{include:"#inCategories"}],repository:{inCategories:{patterns:[{match:"(?<=^Categories.*)AudioVideo|(?<=^Categories.*)Audio|(?<=^Categories.*)Video|(?<=^Categories.*)Development|(?<=^Categories.*)Education|(?<=^Categories.*)Game|(?<=^Categories.*)Graphics|(?<=^Categories.*)Network|(?<=^Categories.*)Office|(?<=^Categories.*)Science|(?<=^Categories.*)Settings|(?<=^Categories.*)System|(?<=^Categories.*)Utility",name:"markup.bold"}]},inCommands:{patterns:[{match:"(?<=^Exec.*\\s)-+\\S+",name:"variable.parameter"},{match:"(?<=^Exec.*)\\s\\%[fFuUick]\\s",name:"variable.language"},{match:'".*"',name:"string"}]},keywords:{patterns:[{match:"^Type\\b|^Version\\b|^Name\\b|^GenericName\\b|^NoDisplay\\b|^Comment\\b|^Icon\\b|^Hidden\\b|^OnlyShowIn\\b|^NotShowIn\\b|^DBusActivatable\\b|^TryExec\\b|^Exec\\b|^Path\\b|^Terminal\\b|^Actions\\b|^MimeType\\b|^Categories\\b|^Implements\\b|^Keywords\\b|^StartupNotify\\b|^StartupWMClass\\b|^URL\\b|^PrefersNonDefaultGPU\\b|^Encoding\\b",name:"keyword"},{match:"^X-[A-z 0-9 -]*",name:"keyword.other"},{match:"(?"{}|^`\\\\]*>',name:"entity.name.type.iriref.turtle"},"language-tag":{captures:{1:{name:"entity.name.class.turtle"}},match:"@(\\w+)",name:"meta.string-literal-language-tag.turtle"},literals:{patterns:[{include:"#string"},{include:"#numeric"},{include:"#boolean"}]},numeric:{patterns:[{include:"#integer"}]},prefix:{match:"(?i:@?base|@?prefix)\\s",name:"keyword.operator.turtle"},"prefixed-name":{captures:{1:{name:"storage.type.PNAME_NS.turtle"},2:{name:"support.variable.PN_LOCAL.turtle"}},match:"(\\w*:)(\\w*)",name:"constant.complex.turtle"},"rule-constraint":{begin:'(rule:content) (""")',beginCaptures:{1:{patterns:[{include:"#prefixed-name"}]},2:{name:"string.quoted.triple.turtle"}},end:'"""',endCaptures:{0:{name:"string.quoted.triple.turtle"}},name:"meta.rule-constraint.turtle",patterns:[{include:"source.srs"}]},"single-dquote-string-literal":{begin:'"',beginCaptures:{0:{name:"punctuation.definition.string.begin.turtle"}},end:'"',endCaptures:{0:{name:"punctuation.definition.string.end.turtle"}},name:"string.quoted.double.turtle",patterns:[{include:"#string-character-escape"}]},"single-squote-string-literal":{begin:"'",beginCaptures:{0:{name:"punctuation.definition.string.begin.turtle"}},end:"'",endCaptures:{1:{name:"punctuation.definition.string.end.turtle"},2:{name:"invalid.illegal.newline.turtle"}},name:"string.quoted.single.turtle",patterns:[{include:"#string-character-escape"}]},"special-predicate":{captures:{1:{name:"keyword.control.turtle"}},match:"\\s(a)\\s",name:"meta.specialPredicate.turtle"},string:{patterns:[{include:"#triple-squote-string-literal"},{include:"#triple-dquote-string-literal"},{include:"#single-squote-string-literal"},{include:"#single-dquote-string-literal"},{include:"#triple-tick-string-literal"}]},"string-character-escape":{match:"\\\\(x\\h{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)",name:"constant.character.escape.turtle"},"triple-dquote-string-literal":{begin:'"""',beginCaptures:{0:{name:"punctuation.definition.string.begin.turtle"}},end:'"""',endCaptures:{0:{name:"punctuation.definition.string.end.turtle"}},name:"string.quoted.triple.turtle",patterns:[{include:"#string-character-escape"}]},"triple-squote-string-literal":{begin:"'''",beginCaptures:{0:{name:"punctuation.definition.string.begin.turtle"}},end:"'''",endCaptures:{0:{name:"punctuation.definition.string.end.turtle"}},name:"string.quoted.triple.turtle",patterns:[{include:"#string-character-escape"}]},"triple-tick-string-literal":{begin:"```",beginCaptures:{0:{name:"punctuation.definition.string.begin.turtle"}},end:"```",endCaptures:{0:{name:"punctuation.definition.string.end.turtle"}},name:"string.quoted.triple.turtle",patterns:[{include:"#string-character-escape"}]}},scopeName:"source.turtle"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/2521.2b7ddf215077bacf.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2521],{92521:function(n,t,o){o.r(t),o.d(t,{default:function(){return a}});var a=[Object.freeze({displayName:"JSSM",fileTypes:["jssm","jssm_state"],name:"jssm",patterns:[{begin:"/\\*",captures:{0:{name:"punctuation.definition.comment.mn"}},comment:"block comment",end:"\\*/",name:"comment.block.jssm"},{begin:"//",comment:"block comment",end:"$",name:"comment.line.jssm"},{begin:"\\${",captures:{0:{name:"entity.name.function"}},comment:"js outcalls",end:"}",name:"keyword.other"},{comment:"semver",match:"(\\d*)(\\.)(\\d*)(\\.)(\\d*)",name:"constant.numeric"},{comment:"jssm language tokens",match:"graph_layout(\\s*)(:)",name:"constant.language.jssmLanguage"},{comment:"jssm language tokens",match:"machine_name(\\s*)(:)",name:"constant.language.jssmLanguage"},{comment:"jssm language tokens",match:"machine_version(\\s*)(:)",name:"constant.language.jssmLanguage"},{comment:"jssm language tokens",match:"jssm_version(\\s*)(:)",name:"constant.language.jssmLanguage"},{comment:"transitions",match:"<->",name:"keyword.control.transition.jssmArrow.legal_legal"},{comment:"transitions",match:"<-",name:"keyword.control.transition.jssmArrow.legal_none"},{comment:"transitions",match:"->",name:"keyword.control.transition.jssmArrow.none_legal"},{comment:"transitions",match:"<=>",name:"keyword.control.transition.jssmArrow.main_main"},{comment:"transitions",match:"=>",name:"keyword.control.transition.jssmArrow.none_main"},{comment:"transitions",match:"<=",name:"keyword.control.transition.jssmArrow.main_none"},{comment:"transitions",match:"<~>",name:"keyword.control.transition.jssmArrow.forced_forced"},{comment:"transitions",match:"~>",name:"keyword.control.transition.jssmArrow.none_forced"},{comment:"transitions",match:"<~",name:"keyword.control.transition.jssmArrow.forced_none"},{comment:"transitions",match:"<-=>",name:"keyword.control.transition.jssmArrow.legal_main"},{comment:"transitions",match:"<=->",name:"keyword.control.transition.jssmArrow.main_legal"},{comment:"transitions",match:"<-~>",name:"keyword.control.transition.jssmArrow.legal_forced"},{comment:"transitions",match:"<~->",name:"keyword.control.transition.jssmArrow.forced_legal"},{comment:"transitions",match:"<=~>",name:"keyword.control.transition.jssmArrow.main_forced"},{comment:"transitions",match:"<~=>",name:"keyword.control.transition.jssmArrow.forced_main"},{comment:"edge probability annotation",match:"(\\d+)%",name:"constant.numeric.jssmProbability"},{comment:"action annotation",match:"\\'[^']*\\'",name:"constant.character.jssmAction"},{comment:"jssm label annotation",match:'\\"[^"]*\\"',name:"entity.name.tag.jssmLabel.doublequoted"},{comment:"jssm label annotation",match:"([a-zA-Z0-9_.+&()#@!?,])",name:"entity.name.tag.jssmLabel.atom"}],scopeName:"source.jssm",aliases:["fsl"]})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/255.27aa620996ff291c.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[255],{60255:function(e,t,n){n.r(t),n.d(t,{default:function(){return i}});var r=n(97066);function i(){var e,t,n,i;return e=this,t=void 0,n=void 0,i=function*(){let e=yield r.selectBundle(r.getJsDelivrBundles()),t=URL.createObjectURL(new Blob([`importScripts("${e.mainWorker}");`],{type:"text/javascript"})),n=new Worker(t),i=new r.AsyncDuckDB({log:()=>{}},n);return yield i.instantiate(e.mainModule,e.pthreadWorker),URL.revokeObjectURL(t),yield i.open({path:":memory:",query:{castBigIntToDouble:!0}}),{db:i,worker:n}},new(n||(n=Promise))(function(r,o){function c(e){try{a(i.next(e))}catch(e){o(e)}}function u(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?r(e.value):((t=e.value)instanceof n?t:new n(function(e){e(t)})).then(c,u)}a((i=i.apply(e,t||[])).next())})}}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/258.e88926071247fd57.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[258],{40258:function(e,n,a){a.r(n),a.d(n,{default:function(){return s}});var t=a(59714);let r=Object.freeze({displayName:"HXML",fileTypes:["hxml"],foldingStartMarker:"--next",foldingStopMarker:"\\n\\n",name:"hxml",patterns:[{captures:{1:{name:"punctuation.definition.comment.hxml"}},match:"(#).*$\\n?",name:"comment.line.number-sign.hxml"},{begin:"(?)",name:"keyword.operator.arrow.gleam"},{match:"\\|>",name:"keyword.operator.pipe.gleam"},{match:"\\.\\.",name:"keyword.operator.splat.gleam"},{match:"(==|!=)",name:"keyword.operator.comparison.gleam"},{match:"(<=\\.|>=\\.|<\\.|>\\.)",name:"keyword.operator.comparison.float.gleam"},{match:"(<=|>=|<|>)",name:"keyword.operator.comparison.int.gleam"},{match:"(&&|\\|\\|)",name:"keyword.operator.logical.gleam"},{match:"<>",name:"keyword.operator.string.gleam"},{match:"\\|",name:"keyword.operator.other.gleam"},{match:"(\\+\\.|-\\.|/\\.|\\*\\.)",name:"keyword.operator.arithmetic.float.gleam"},{match:"(\\+|-|/|\\*|%)",name:"keyword.operator.arithmetic.int.gleam"},{match:"=",name:"keyword.operator.assignment.gleam"}]},octal_number:{match:"\\b0[oO]0*[1-7][0-7]*\\b",name:"constant.numeric.octal.gleam",patterns:[]},strings:{begin:'"',end:'"',name:"string.quoted.double.gleam",patterns:[{match:"\\\\.",name:"constant.character.escape.gleam"}]}},scopeName:"source.gleam"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/3522.3dc8f43f8ee30dbb.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3522],{73522:function(e,n,r){r.r(n),r.d(n,{default:function(){return o}});var t=r(27781);let a=Object.freeze({displayName:"Fortran (Fixed Form)",fileTypes:["f","F","f77","F77","for","FOR"],injections:{"source.fortran.fixed - ( string | comment )":{patterns:[{include:"#line-header"},{include:"#line-end-comment"}]}},name:"fortran-fixed-form",patterns:[{include:"#comments"},{include:"#line-header"},{include:"source.fortran.free"}],repository:{comments:{patterns:[{begin:"^[cC\\*]",end:"\\n",name:"comment.line.fortran"},{begin:"^ *!",end:"\\n",name:"comment.line.fortran"}]},"line-end-comment":{begin:"(?<=^.{72})(?!\\n)",end:"(?=\\n)",name:"comment.line-end.fortran"},"line-header":{captures:{1:{name:"constant.numeric.fortran"},2:{name:"keyword.line-continuation-operator.fortran"},3:{name:"source.fortran.free"},4:{name:"invalid.error.fortran"}},match:"^(?!\\s*[!#])(?:([ \\d]{5} )|( {5}.)|(\\t)|(.{1,5}))"}},scopeName:"source.fortran.fixed",embeddedLangs:["fortran-free-form"],aliases:["f","for","f77"]});var o=[...t.default,a]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/3527.ee780e6c6d87831e.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3527],{33527:function(e,n,t){t.r(n),t.d(n,{default:function(){return a}});var a=[Object.freeze({displayName:"Rel",name:"rel",patterns:[{include:"#strings"},{include:"#comment"},{include:"#single-line-comment-consuming-line-ending"},{include:"#deprecated-temporary"},{include:"#operators"},{include:"#symbols"},{include:"#keywords"},{include:"#otherkeywords"},{include:"#types"},{include:"#constants"}],repository:{comment:{patterns:[{begin:"/\\*\\*(?!/)",beginCaptures:{0:{name:"punctuation.definition.comment.rel"}},end:"\\*/",endCaptures:{0:{name:"punctuation.definition.comment.rel"}},name:"comment.block.documentation.rel",patterns:[{include:"#docblock"}]},{begin:"(/\\*)(?:\\s*((@)internal)(?=\\s|(\\*/)))?",beginCaptures:{1:{name:"punctuation.definition.comment.rel"},2:{name:"storage.type.internaldeclaration.rel"},3:{name:"punctuation.decorator.internaldeclaration.rel"}},end:"\\*/",endCaptures:{0:{name:"punctuation.definition.comment.rel"}},name:"comment.block.rel"},{begin:'doc"""',end:'"""',name:"comment.block.documentation.rel"},{begin:"(^[ \\t]+)?((//)(?:\\s*((@)internal)(?=\\s|$))?)",beginCaptures:{1:{name:"punctuation.whitespace.comment.leading.rel"},2:{name:"comment.line.double-slash.rel"},3:{name:"punctuation.definition.comment.rel"},4:{name:"storage.type.internaldeclaration.rel"},5:{name:"punctuation.decorator.internaldeclaration.rel"}},contentName:"comment.line.double-slash.rel",end:"(?=$)"}]},constants:{patterns:[{match:"(\\b(true|false)\\b)",name:"constant.language.rel"}]},"deprecated-temporary":{patterns:[{match:"@inspect",name:"keyword.other.rel"}]},keywords:{patterns:[{match:"(\\b(def|entity|bound|include|ic|forall|exists|∀|∃|return|module|^end)\\b)|(((<)?\\|(>)?)|∀|∃)",name:"keyword.control.rel"}]},operators:{patterns:[{match:"(\\b(if|then|else|and|or|not|eq|neq|lt|lt_eq|gt|gt_eq)\\b)|(\\+|-|\\*|\\/|\xf7|\\^|\\%|=|!=|≠|<|<=|≤|>|>=|≥|\\&)|\\s+(end)",name:"keyword.other.rel"}]},otherkeywords:{patterns:[{match:"\\s*(@inline)\\s*|\\s*(@auto_number)\\s*|\\s*(function)\\s|(\\b(implies|select|from|∈|where|for|in)\\b)|(((<)?\\|(>)?)|∈)",name:"keyword.other.rel"}]},"single-line-comment-consuming-line-ending":{begin:"(^[ \\t]+)?((//)(?:\\s*((@)internal)(?=\\s|$))?)",beginCaptures:{1:{name:"punctuation.whitespace.comment.leading.rel"},2:{name:"comment.line.double-slash.rel"},3:{name:"punctuation.definition.comment.rel"},4:{name:"storage.type.internaldeclaration.rel"},5:{name:"punctuation.decorator.internaldeclaration.rel"}},contentName:"comment.line.double-slash.rel",end:"(?=^)"},strings:{begin:'"',end:'"',name:"string.quoted.double.rel",patterns:[{match:"\\\\.",name:"constant.character.escape.rel"}]},symbols:{patterns:[{match:"(:[\\[_$A-Za-z](\\]|[_$0-9A-Za-z]*))",name:"variable.parameter.rel"}]},types:{patterns:[{match:"(\\b(Symbol|Char|Bool|Rational|FixedDecimal|Float16|Float32|Float64|Int8|Int16|Int32|Int64|Int128|UInt8|UInt16|UInt32|UInt64|UInt128|Date|DateTime|Day|Week|Month|Year|Nanosecond|Microsecond|Millisecond|Second|Minute|Hour|FilePos|HashValue|AutoNumberValue)\\b)",name:"entity.name.type.rel"}]}},scopeName:"source.rel"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/4022.987edf4a35c7ce1a.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4022],{64022:function(e,n,t){t.r(n),t.d(n,{default:function(){return i}});var i=[Object.freeze({displayName:"Bicep",fileTypes:[".bicep"],name:"bicep",patterns:[{include:"#expression"},{include:"#comments"}],repository:{"array-literal":{begin:"\\[(?!(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*\\bfor\\b)",end:"]",name:"meta.array-literal.bicep",patterns:[{include:"#expression"},{include:"#comments"}]},"block-comment":{begin:"/\\*",end:"\\*/",name:"comment.block.bicep"},comments:{patterns:[{include:"#line-comment"},{include:"#block-comment"}]},decorator:{begin:"@(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*(?=\\b[_$A-Za-z][_$0-9A-Za-z]*\\b)",end:"",name:"meta.decorator.bicep",patterns:[{include:"#expression"},{include:"#comments"}]},directive:{begin:"#\\b[_a-zA-Z-0-9]+\\b",end:"$",name:"meta.directive.bicep",patterns:[{include:"#directive-variable"},{include:"#comments"}]},"directive-variable":{match:"\\b[_a-zA-Z-0-9]+\\b",name:"keyword.control.declaration.bicep"},"escape-character":{match:"\\\\(u{[0-9A-Fa-f]+}|n|r|t|\\\\|'|\\${)",name:"constant.character.escape.bicep"},expression:{patterns:[{include:"#string-literal"},{include:"#string-verbatim"},{include:"#numeric-literal"},{include:"#named-literal"},{include:"#object-literal"},{include:"#array-literal"},{include:"#keyword"},{include:"#identifier"},{include:"#function-call"},{include:"#decorator"},{include:"#lambda-start"},{include:"#directive"}]},"function-call":{begin:"(\\b[_$A-Za-z][_$0-9A-Za-z]*\\b)(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*\\(",beginCaptures:{1:{name:"entity.name.function.bicep"}},end:"\\)",name:"meta.function-call.bicep",patterns:[{include:"#expression"},{include:"#comments"}]},identifier:{match:"\\b[_$A-Za-z][_$0-9A-Za-z]*\\b(?!(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*\\()",name:"variable.other.readwrite.bicep"},keyword:{match:"\\b(metadata|targetScope|resource|module|param|var|output|for|in|if|existing|import|as|type|with|using|extends|func|assert|extension)\\b",name:"keyword.control.declaration.bicep"},"lambda-start":{begin:"(\\((?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*\\b[_$A-Za-z][_$0-9A-Za-z]*\\b(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*(,(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*\\b[_$A-Za-z][_$0-9A-Za-z]*\\b(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*)*\\)|\\((?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*\\)|(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*\\b[_$A-Za-z][_$0-9A-Za-z]*\\b(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*)(?=(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*=>)",beginCaptures:{1:{name:"meta.undefined.bicep",patterns:[{include:"#identifier"},{include:"#comments"}]}},end:"(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*=>",name:"meta.lambda-start.bicep"},"line-comment":{match:"//.*(?=$)",name:"comment.line.double-slash.bicep"},"named-literal":{match:"\\b(true|false|null)\\b",name:"constant.language.bicep"},"numeric-literal":{match:"\\d+",name:"constant.numeric.bicep"},"object-literal":{begin:"{",end:"}",name:"meta.object-literal.bicep",patterns:[{include:"#object-property-key"},{include:"#expression"},{include:"#comments"}]},"object-property-key":{match:"\\b[_$A-Za-z][_$0-9A-Za-z]*\\b(?=(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*:)",name:"variable.other.property.bicep"},"string-literal":{begin:"'(?!'')",end:"'",name:"string.quoted.single.bicep",patterns:[{include:"#escape-character"},{include:"#string-literal-subst"}]},"string-literal-subst":{begin:"(?\\s*)?\\()",name:"entity.name.function.vala"}]},keywords:{patterns:[{match:"(?<=^|[^@\\w\\.])(as|do|if|in|is|not|or|and|for|get|new|out|ref|set|try|var|base|case|else|enum|lock|null|this|true|void|weak|async|break|catch|class|const|false|owned|throw|using|while|with|yield|delete|extern|inline|params|public|return|sealed|signal|sizeof|static|struct|switch|throws|typeof|unlock|default|dynamic|ensures|finally|foreach|private|unowned|virtual|abstract|continue|delegate|internal|override|requires|volatile|construct|interface|namespace|protected|errordomain)\\b",name:"keyword.vala"},{match:"(?<=^|[^@\\w\\.])(bool|double|float|unichar|unichar2|char|uchar|int|uint|long|ulong|short|ushort|size_t|ssize_t|string|string16|string32|void|signal|int8|int16|int32|int64|uint8|uint16|uint32|uint64|va_list|time_t)\\b",name:"keyword.vala"},{match:"(#if|#elif|#else|#endif)",name:"keyword.vala"}]},strings:{patterns:[{begin:'"""',end:'"""',name:"string.quoted.triple.vala"},{begin:'@"',end:'"',name:"string.quoted.interpolated.vala",patterns:[{match:"\\\\.",name:"constant.character.escape.vala"},{match:"\\$\\w+",name:"constant.character.escape.vala"},{match:"\\$\\(([^)(]|\\(([^)(]|\\([^)]*\\))*\\))*\\)",name:"constant.character.escape.vala"}]},{begin:'"',end:'"',name:"string.quoted.double.vala",patterns:[{match:"\\\\.",name:"constant.character.escape.vala"}]},{begin:"'",end:"'",name:"string.quoted.single.vala",patterns:[{match:"\\\\.",name:"constant.character.escape.vala"}]},{match:"/((\\\\/)|([^/]))*/(?=\\s*[,;)\\.\\n])",name:"string.regexp.vala"}]},types:{patterns:[{match:"(?<=^|[^@\\w\\.])(bool|double|float|unichar|unichar2|char|uchar|int|uint|long|ulong|short|ushort|size_t|ssize_t|string|string16|string32|void|signal|int8|int16|int32|int64|uint8|uint16|uint32|uint64|va_list|time_t)\\b",name:"storage.type.primitive.vala"},{match:"\\b([A-Z]+\\w*)\\b",name:"entity.name.type.vala"}]},variables:{patterns:[{match:"\\b([_a-z]+\\w*)\\b",name:"variable.other.vala"}]}},scopeName:"source.vala"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/4562.db2e363ed9a2d0ac.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4562],{44562:function(n,t,e){e.r(t),e.d(t,{default:function(){return a}});var a=[Object.freeze({displayName:"Jsonnet",name:"jsonnet",patterns:[{include:"#expression"},{include:"#keywords"}],repository:{"builtin-functions":{patterns:[{match:"\\bstd[.](acos|asin|atan|ceil|char|codepoint|cos|exp|exponent)\\b",name:"support.function.jsonnet"},{match:"\\bstd[.](filter|floor|force|length|log|makeArray|mantissa)\\b",name:"support.function.jsonnet"},{match:"\\bstd[.](objectFields|objectHas|pow|sin|sqrt|tan|type|thisFile)\\b",name:"support.function.jsonnet"},{match:"\\bstd[.](acos|asin|atan|ceil|char|codepoint|cos|exp|exponent)\\b",name:"support.function.jsonnet"},{match:"\\bstd[.](abs|assertEqual|escapeString(Bash|Dollars|Json|Python))\\b",name:"support.function.jsonnet"},{match:"\\bstd[.](filterMap|flattenArrays|foldl|foldr|format|join)\\b",name:"support.function.jsonnet"},{match:"\\bstd[.](lines|manifest(Ini|Python(Vars)?)|map|max|min|mod)\\b",name:"support.function.jsonnet"},{match:"\\bstd[.](set|set(Diff|Inter|Member|Union)|sort)\\b",name:"support.function.jsonnet"},{match:"\\bstd[.](range|split|stringChars|substr|toString|uniq)\\b",name:"support.function.jsonnet"}]},comment:{patterns:[{begin:"/\\*",end:"\\*/",name:"comment.block.jsonnet"},{match:"//.*$",name:"comment.line.jsonnet"},{match:"#.*$",name:"comment.block.jsonnet"}]},"double-quoted-strings":{begin:'"',end:'"',name:"string.quoted.double.jsonnet",patterns:[{match:'\\\\(["\\\\/bfnrt]|(u[0-9a-fA-F]{4}))',name:"constant.character.escape.jsonnet"},{match:'\\\\[^"\\\\/bfnrtu]',name:"invalid.illegal.jsonnet"}]},expression:{patterns:[{include:"#literals"},{include:"#comment"},{include:"#single-quoted-strings"},{include:"#double-quoted-strings"},{include:"#triple-quoted-strings"},{include:"#builtin-functions"},{include:"#functions"}]},functions:{patterns:[{begin:"\\b([a-zA-Z_][a-z0-9A-Z_]*)\\s*\\(",beginCaptures:{1:{name:"entity.name.function.jsonnet"}},end:"\\)",name:"meta.function",patterns:[{include:"#expression"}]}]},keywords:{patterns:[{match:"[!:~+\\-&\\|\\^=<>\\*\\/%]",name:"keyword.operator.jsonnet"},{match:"\\$",name:"keyword.other.jsonnet"},{match:"\\b(self|super|import|importstr|local|tailstrict)\\b",name:"keyword.other.jsonnet"},{match:"\\b(if|then|else|for|in|error|assert)\\b",name:"keyword.control.jsonnet"},{match:"\\b(function)\\b",name:"storage.type.jsonnet"},{match:"[a-zA-Z_][a-z0-9A-Z_]*\\s*(:::|\\+:::)",name:"variable.parameter.jsonnet"},{match:"[a-zA-Z_][a-z0-9A-Z_]*\\s*(::|\\+::)",name:"entity.name.type"},{match:"[a-zA-Z_][a-z0-9A-Z_]*\\s*(:|\\+:)",name:"variable.parameter.jsonnet"}]},literals:{patterns:[{match:"\\b(true|false|null)\\b",name:"constant.language.jsonnet"},{match:"\\b(\\d+([Ee][+-]?\\d+)?)\\b",name:"constant.numeric.jsonnet"},{match:"\\b\\d+[.]\\d*([Ee][+-]?\\d+)?\\b",name:"constant.numeric.jsonnet"},{match:"\\b[.]\\d+([Ee][+-]?\\d+)?\\b",name:"constant.numeric.jsonnet"}]},"single-quoted-strings":{begin:"'",end:"'",name:"string.quoted.double.jsonnet",patterns:[{match:"\\\\(['\\\\/bfnrt]|(u[0-9a-fA-F]{4}))",name:"constant.character.escape.jsonnet"},{match:"\\\\[^'\\\\/bfnrtu]",name:"invalid.illegal.jsonnet"}]},"triple-quoted-strings":{patterns:[{begin:"\\|\\|\\|",end:"\\|\\|\\|",name:"string.quoted.triple.jsonnet"}]}},scopeName:"source.jsonnet"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/4615.576f6d531a96c6de.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4615],{24615:function(n,e,i){i.r(e),i.d(e,{default:function(){return t}});var t=[Object.freeze({displayName:"INI",name:"ini",patterns:[{begin:"(^[ \\t]+)?(?=#)",beginCaptures:{1:{name:"punctuation.whitespace.comment.leading.ini"}},end:"(?!\\G)",patterns:[{begin:"#",beginCaptures:{0:{name:"punctuation.definition.comment.ini"}},end:"\\n",name:"comment.line.number-sign.ini"}]},{begin:"(^[ \\t]+)?(?=;)",beginCaptures:{1:{name:"punctuation.whitespace.comment.leading.ini"}},end:"(?!\\G)",patterns:[{begin:";",beginCaptures:{0:{name:"punctuation.definition.comment.ini"}},end:"\\n",name:"comment.line.semicolon.ini"}]},{captures:{1:{name:"keyword.other.definition.ini"},2:{name:"punctuation.separator.key-value.ini"}},match:"\\b([a-zA-Z0-9_.-]+)\\b\\s*(=)"},{captures:{1:{name:"punctuation.definition.entity.ini"},3:{name:"punctuation.definition.entity.ini"}},match:"^(\\[)(.*?)(\\])",name:"entity.name.section.group-title.ini"},{begin:"'",beginCaptures:{0:{name:"punctuation.definition.string.begin.ini"}},end:"'",endCaptures:{0:{name:"punctuation.definition.string.end.ini"}},name:"string.quoted.single.ini",patterns:[{match:"\\\\.",name:"constant.character.escape.ini"}]},{begin:'"',beginCaptures:{0:{name:"punctuation.definition.string.begin.ini"}},end:'"',endCaptures:{0:{name:"punctuation.definition.string.end.ini"}},name:"string.quoted.double.ini"}],scopeName:"source.ini",aliases:["properties"]})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/4657.22e2028477a1db14.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4657],{64657:function(e,r,a){a.r(r),a.d(r,{default:function(){return o}});var t=a(52192);let l=Object.freeze({displayName:"GLSL",fileTypes:["vs","fs","gs","vsh","fsh","gsh","vshader","fshader","gshader","vert","frag","geom","f.glsl","v.glsl","g.glsl"],foldingStartMarker:"/\\*\\*|\\{\\s*$",foldingStopMarker:"\\*\\*/|^\\s*\\}",name:"glsl",patterns:[{match:"\\b(break|case|continue|default|discard|do|else|for|if|return|switch|while)\\b",name:"keyword.control.glsl"},{match:"\\b(void|bool|int|uint|float|vec2|vec3|vec4|bvec2|bvec3|bvec4|ivec2|ivec2|ivec3|uvec2|uvec2|uvec3|mat2|mat3|mat4|mat2x2|mat2x3|mat2x4|mat3x2|mat3x3|mat3x4|mat4x2|mat4x3|mat4x4|sampler[1|2|3]D|samplerCube|sampler2DRect|sampler[1|2]DShadow|sampler2DRectShadow|sampler[1|2]DArray|sampler[1|2]DArrayShadow|samplerBuffer|sampler2DMS|sampler2DMSArray|struct|isampler[1|2|3]D|isamplerCube|isampler2DRect|isampler[1|2]DArray|isamplerBuffer|isampler2DMS|isampler2DMSArray|usampler[1|2|3]D|usamplerCube|usampler2DRect|usampler[1|2]DArray|usamplerBuffer|usampler2DMS|usampler2DMSArray)\\b",name:"storage.type.glsl"},{match:"\\b(attribute|centroid|const|flat|in|inout|invariant|noperspective|out|smooth|uniform|varying)\\b",name:"storage.modifier.glsl"},{match:"\\b(gl_BackColor|gl_BackLightModelProduct|gl_BackLightProduct|gl_BackMaterial|gl_BackSecondaryColor|gl_ClipDistance|gl_ClipPlane|gl_ClipVertex|gl_Color|gl_DepthRange|gl_DepthRangeParameters|gl_EyePlaneQ|gl_EyePlaneR|gl_EyePlaneS|gl_EyePlaneT|gl_Fog|gl_FogCoord|gl_FogFragCoord|gl_FogParameters|gl_FragColor|gl_FragCoord|gl_FragDat|gl_FragDept|gl_FrontColor|gl_FrontFacing|gl_FrontLightModelProduct|gl_FrontLightProduct|gl_FrontMaterial|gl_FrontSecondaryColor|gl_InstanceID|gl_Layer|gl_LightModel|gl_LightModelParameters|gl_LightModelProducts|gl_LightProducts|gl_LightSource|gl_LightSourceParameters|gl_MaterialParameters|gl_ModelViewMatrix|gl_ModelViewMatrixInverse|gl_ModelViewMatrixInverseTranspose|gl_ModelViewMatrixTranspose|gl_ModelViewProjectionMatrix|gl_ModelViewProjectionMatrixInverse|gl_ModelViewProjectionMatrixInverseTranspose|gl_ModelViewProjectionMatrixTranspose|gl_MultiTexCoord[0-7]|gl_Normal|gl_NormalMatrix|gl_NormalScale|gl_ObjectPlaneQ|gl_ObjectPlaneR|gl_ObjectPlaneS|gl_ObjectPlaneT|gl_Point|gl_PointCoord|gl_PointParameters|gl_PointSize|gl_Position|gl_PrimitiveIDIn|gl_ProjectionMatrix|gl_ProjectionMatrixInverse|gl_ProjectionMatrixInverseTranspose|gl_ProjectionMatrixTranspose|gl_SecondaryColor|gl_TexCoord|gl_TextureEnvColor|gl_TextureMatrix|gl_TextureMatrixInverse|gl_TextureMatrixInverseTranspose|gl_TextureMatrixTranspose|gl_Vertex|gl_VertexIDh)\\b",name:"support.variable.glsl"},{match:"\\b(gl_MaxClipPlanes|gl_MaxCombinedTextureImageUnits|gl_MaxDrawBuffers|gl_MaxFragmentUniformComponents|gl_MaxLights|gl_MaxTextureCoords|gl_MaxTextureImageUnits|gl_MaxTextureUnits|gl_MaxVaryingFloats|gl_MaxVertexAttribs|gl_MaxVertexTextureImageUnits|gl_MaxVertexUniformComponents)\\b",name:"support.constant.glsl"},{match:"\\b(abs|acos|all|any|asin|atan|ceil|clamp|cos|cross|degrees|dFdx|dFdy|distance|dot|equal|exp|exp2|faceforward|floor|fract|ftransform|fwidth|greaterThan|greaterThanEqual|inversesqrt|length|lessThan|lessThanEqual|log|log2|matrixCompMult|max|min|mix|mod|noise[1-4]|normalize|not|notEqual|outerProduct|pow|radians|reflect|refract|shadow1D|shadow1DLod|shadow1DProj|shadow1DProjLod|shadow2D|shadow2DLod|shadow2DProj|shadow2DProjLod|sign|sin|smoothstep|sqrt|step|tan|texture1D|texture1DLod|texture1DProj|texture1DProjLod|texture2D|texture2DLod|texture2DProj|texture2DProjLod|texture3D|texture3DLod|texture3DProj|texture3DProjLod|textureCube|textureCubeLod|transpose)\\b",name:"support.function.glsl"},{match:"\\b(asm|double|enum|extern|goto|inline|long|short|sizeof|static|typedef|union|unsigned|volatile)\\b",name:"invalid.illegal.glsl"},{include:"source.c"}],scopeName:"source.glsl",embeddedLangs:["c"]});var o=[...t.default,l]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/4760.4354237c4613727d.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4760],{44760:function(e,a,t){t.r(a),t.d(a,{default:function(){return n}});var n=[Object.freeze({displayName:"Splunk Query Language",fileTypes:["splunk","spl"],name:"splunk",patterns:[{comment:"Splunk Built-in functions",match:"(?<=(\\||\\[))([\\s]*)\\b(abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|append|appendcols|appendpipe|arules|associate|audit|autoregress|bucket|bucketdir|chart|cluster|collect|concurrency|contingency|convert|correlate|crawl|datamodel|dbinspect|dbxquery|dbxlookup|dedup|delete|delta|diff|dispatch|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|file|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geostats|head|highlight|history|input|inputcsv|inputlookup|iplocation|join|kmeans|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|metadata|metasearch|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\\b(?=[\\s])",name:"support.class.splunk_search"},{comment:"Splunk Eval functions",match:"\\b(abs|acos|acosh|asin|asinh|atan|atan2|atanh|case|cidrmatch|ceiling|coalesce|commands|cos|cosh|exact|exp|floor|hypot|if|in|isbool|isint|isnotnull|isnull|isnum|isstr|len|like|ln|log|lower|ltrim|match|max|md5|min|mvappend|mvcount|mvdedup|mvfilter|mvfind|mvindex|mvjoin|mvrange|mvsort|mvzip|now|null|nullif|pi|pow|printf|random|relative_time|replace|round|rtrim|searchmatch|sha1|sha256|sha512|sigfig|sin|sinh|spath|split|sqrt|strftime|strptime|substr|tan|tanh|time|tonumber|tostring|trim|typeof|upper|urldecode|validate)(?=\\()\\b",name:"support.function.splunk_search"},{comment:"Splunk Transforming functions",match:"\\b(avg|count|distinct_count|estdc|estdc_error|eval|max|mean|median|min|mode|percentile|range|stdev|stdevp|sum|sumsq|var|varp|first|last|list|values|earliest|earliest_time|latest|latest_time|per_day|per_hour|per_minute|per_second|rate)\\b",name:"support.function.splunk_search"},{comment:"Splunk Macro Names",match:"(?<=\\`)[\\w]+(?=\\(|\\`)",name:"entity.name.function.splunk_search"},{comment:"Digits",match:"\\b(\\d+)\\b",name:"constant.numeric.splunk_search"},{comment:"Escape Characters",match:"(\\\\\\\\|\\\\\\||\\\\\\*|\\\\=)",name:"contant.character.escape.splunk_search"},{comment:"Splunk Operators",match:"(\\|,)",name:"keyword.operator.splunk_search"},{comment:"Splunk Language Constants",match:"(?i)\\b(as|by|or|and|over|where|output|outputnew)\\b|(?-i)\\b(NOT|true|false)\\b",name:"constant.language.splunk_search"},{comment:"Splunk Macro Parameters",match:'(?<=\\(|,|[^=]\\s{300})([^()\\",=]+)(?=\\)|,)',name:"variable.parameter.splunk_search"},{comment:"Splunk Variables",match:"([\\w\\.]+)(\\[\\]|\\{\\})?([\\s]*)(?==)",name:"variable.splunk_search"},{comment:"Comparison or assignment",match:"=",name:"keyword.operator.splunk_search"},{begin:'(?])",name:"meta.definitioncommand.lean4",patterns:[{include:"#comments"},{include:"#definitionName"},{match:","}]},{match:"\\b(?*]):[\\.:\\w_\\-=!@$%^&?\\/<>*]*",name:"variable.other.constant"},keywords:{patterns:[{match:"\\b(\\.|->|->>|and|match|let|await|annotate|as->|as-model|assert|assoc|break|chainc|comment|cond|continue|do|doc|#doc|([dgls])?for|set[vx]|defclass|defmain|defmacro|defmacro\\/g!|defmacro!|deftag|del|doto|eval-and-compile|eval-when-compile|first|gensym|get|global|if|if\\*|if-not|import|(de)?fn(\\/a)?|last|nonlocal|not(\\?|-in)?|or|print|(quasi)?quote|require|rest|return|cut|raise|try|unless|unpack-iterable|unpack-mapping|unquote|unquote-splice|when|while|with(\\/a)?|with-decorator|with-gensyms|xor|yield(-from)?|butlast|coll\\?|comp|complement|constantly|dec|disassemble|empty\\?|eval|every\\?|exec|float\\?|fraction|even\\?|identity|inc|instance\\?|integer\\?|interleave|interpose|iterable\\?|iterator\\?|juxt|keyword|keyword\\?|macroexpand(-1)?|mangle|merge-with|name|neg\\?|none\\?|nth|numeric\\?|odd\\?|partition|pos\\?|second|some|string\\?|symbol\\?|zero\\?|cycle|distinct|drop|drop-last|drop-while|filter|flatten|iterate|read|read-str|remove|repeat|repeatedly|take|take-nth|take-while|unmangle|False|None|True|as|in|is|py(s)?|lambda|nonlocal|not|pass|abs|all|any|ascii|bin|bool|bytearray|bytes|callable|chr|classmethod|compile|complex|delattr|dict|dir|divmod|enumerate|eval|exec|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|isinstance|issubclass|iter|len|list|locals|map|max|memoryview|min|next|object|oct|open|ord|pow|print|property|range|repr(-register)?|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|vars|zip|__import__|abs|acos|angle|asin|assoc|assq|assv|atan|ceiling|cos|floor|round|sin|sqrt|tan|(?:real|imag)-part|numerator|denominatormodulo|exp|expt|remainder|quotient|lcm|call-with-(?:input|output)-file|(?:close|current)-(?:input|output)-port|with-(?:input|output)-from-file|open-(?:input|output)-file|char-(?:downcase|upcase|ready)|make-(?:polar|promise|rectangular|string|vector)|string(?:-(?:append|copy|length|ref))|vector(?:-length|-ref))[\\s)]",name:"keyword.control.hy"}]},operators:{patterns:[{match:"(?<=\\()\\s*(\\+=?|\\/+|\\*+|-=?|[!<>]?=|@|%|<<|>>|<|>|&|\\||\\^|~)",name:"keyword.control.hy"}]},strings:{begin:'(f?"|}(?=[^\n]*?[{"]))',end:'("|(?<=["}][^\n]*?){)',name:"string.quoted.double.hy",patterns:[{match:"\\\\.",name:"constant.character.escape.hy"}]},symbol:{match:"(?*#])[\\.a-zA-ZΑ-Ωα-ω_\\-=!@$%^/<>*#][\\.:\\w_\\-=!@$%^&?/<>*#]*",name:"variable.other.hy"}},scopeName:"source.hy"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/581.531a8e0f66e2beb7.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[581],{30581:function(e,t,n){n.r(t),n.d(t,{default:function(){return a}});var a=[Object.freeze({displayName:"ZenScript",fileTypes:["zs"],name:"zenscript",patterns:[{comment:"numbers",match:"\\b((0(x|X)[0-9a-fA-F]*)|((\\d+\\.?\\d*)|(\\.\\d+))((e|E)(\\+|-)?\\d+)?)([LlFfUuDd]|UL|ul)?\\b",name:"constant.numeric.zenscript"},{comment:"prefixedNumbers",match:"\\b-?(0b|0x|0o|0B|0X|0O)(0|[1-9a-fA-F][0-9a-fA-F_]*)[a-zA-Z_]*\\b",name:"constant.numeric.zenscript"},{include:"#code"},{comment:"arrays",match:"\\b((?:[a-z]\\w*\\.)*[A-Z]+\\w*)(?=\\[)",name:"storage.type.object.array.zenscript"}],repository:{brackets:{patterns:[{captures:{1:{name:"keyword.control.zenscript"},2:{name:"keyword.other.zenscript"},3:{name:"keyword.control.zenscript"},4:{name:"variable.other.zenscript"},5:{name:"keyword.control.zenscript"},6:{name:"constant.numeric.zenscript"},7:{name:"keyword.control.zenscript"}},comment:"items and blocks",match:"(<)\\b(.*?)(:(.*?(:(\\*|\\d+)?)?)?)(>)",name:"keyword.other.zenscript"}]},class:{captures:{1:{name:"storage.type.zenscript"},2:{name:"entity.name.type.class.zenscript"}},comment:"class",match:"(zenClass)\\s+(\\w+)",name:"meta.class.zenscript"},code:{patterns:[{include:"#class"},{include:"#functions"},{include:"#dots"},{include:"#quotes"},{include:"#brackets"},{include:"#comments"},{include:"#var"},{include:"#keywords"},{include:"#constants"},{include:"#operators"}]},comments:{patterns:[{comment:"inline comments",match:"//[^\n]*",name:"comment.line.double=slash"},{begin:"\\/\\*",beginCaptures:{0:{name:"comment.block"}},comment:"block comments",end:"\\*\\/",endCaptures:{0:{name:"comment.block"}},name:"comment.block"}]},dots:{captures:{1:{name:"storage.type.zenscript"},2:{name:"keyword.control.zenscript"},5:{name:"keyword.control.zenscript"}},comment:"dots",match:"\\b(\\w+)(\\.)(\\w+)((\\.)(\\w+))*",name:"plain.text.zenscript"},functions:{captures:{0:{name:"storage.type.function.zenscript"},1:{name:"entity.name.function.zenscript"}},comment:"functions",match:"function\\s+([A-Za-z_$][\\w$]*)\\s*(?=\\()",name:"meta.function.zenscript"},keywords:{patterns:[{comment:"statement keywords",match:"\\b(instanceof|get|implements|set|import|function|override|const|if|else|do|while|for|throw|panic|lock|try|catch|finally|return|break|continue|switch|case|default|in|is|as|match|throws|super|new)\\b",name:"keyword.control.zenscript"},{comment:"storage keywords",match:"\\b(zenClass|zenConstructor|alias|class|interface|enum|struct|expand|variant|set|void|bool|byte|sbyte|short|ushort|int|uint|long|ulong|usize|float|double|char|string)\\b",name:"storage.type.zenscript"},{comment:"modifier keywords",match:"\\b(variant|abstract|final|private|public|export|internal|static|protected|implicit|virtual|extern|immutable)\\b",name:"storage.modifier.zenscript"},{comment:"annotation keywords",match:"\\b(Native|Precondition)\\b",name:"entity.other.attribute-name"},{comment:"language keywords",match:"\\b(null|true|false)\\b",name:"constant.language"}]},operators:{patterns:[{comment:"math operators",match:"\\b(\\.|\\.\\.|\\.\\.\\.|,|\\+|\\+=|\\+\\+|-|-=|--|~|~=|\\*|\\*=|/|/=|%|%=|\\||\\|=|\\|\\||&|&=|&&|\\^|\\^=|\\?|\\?\\.|\\?\\?|<|<=|<<|<<=|>|>=|>>|>>=|>>>|>>>=|=>|=|==|===|!|!=|!==|\\$|`)\\b",name:"keyword.control"},{comment:"colons",match:"\\b(;|:)\\b",name:"keyword.control"}]},quotes:{patterns:[{begin:'"',beginCaptures:{0:{name:"punctuation.definition.string.begin.zenscript"}},end:'"',endCaptures:{0:{name:"punctuation.definition.string.end.zenscript"}},name:"string.quoted.double.zenscript",patterns:[{match:"\\\\.",name:"constant.character.escape.zenscript"}]},{begin:"'",beginCaptures:{0:{name:"punctuation.definition.string.begin.zenscript"}},end:"'",endCaptures:{0:{name:"punctuation.definition.string.end.zenscript"}},name:"string.quoted.single.zenscript",patterns:[{match:"\\\\.",name:"constant.character.escape.zenscript"}]}]},var:{comment:"var",match:"\\b(val|var)\\b",name:"storage.type"}},scopeName:"source.zenscript"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/5990.8d1438d0ff4d7040.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5990,864],{20864:function(e,n,t){t.r(n),t.d(n,{default:function(){return i}});var i=[Object.freeze({displayName:"Diff",name:"diff",patterns:[{captures:{1:{name:"punctuation.definition.separator.diff"}},match:"^((\\*{15})|(={67})|(-{3}))$\\n?",name:"meta.separator.diff"},{match:"^\\d+(,\\d+)*(a|d|c)\\d+(,\\d+)*$\\n?",name:"meta.diff.range.normal"},{captures:{1:{name:"punctuation.definition.range.diff"},2:{name:"meta.toc-list.line-number.diff"},3:{name:"punctuation.definition.range.diff"}},match:"^(@@)\\s*(.+?)\\s*(@@)($\\n?)?",name:"meta.diff.range.unified"},{captures:{3:{name:"punctuation.definition.range.diff"},4:{name:"punctuation.definition.range.diff"},6:{name:"punctuation.definition.range.diff"},7:{name:"punctuation.definition.range.diff"}},match:"^(((-{3}) .+ (-{4}))|((\\*{3}) .+ (\\*{4})))$\\n?",name:"meta.diff.range.context"},{match:"^diff --git a/.*$\\n?",name:"meta.diff.header.git"},{match:"^diff (-|\\S+\\s+\\S+).*$\\n?",name:"meta.diff.header.command"},{captures:{4:{name:"punctuation.definition.from-file.diff"},6:{name:"punctuation.definition.from-file.diff"},7:{name:"punctuation.definition.from-file.diff"}},match:"(^(((-{3}) .+)|((\\*{3}) .+))$\\n?|^(={4}) .+(?= - ))",name:"meta.diff.header.from-file"},{captures:{2:{name:"punctuation.definition.to-file.diff"},3:{name:"punctuation.definition.to-file.diff"},4:{name:"punctuation.definition.to-file.diff"}},match:"(^(\\+{3}) .+$\\n?| (-) .* (={4})$\\n?)",name:"meta.diff.header.to-file"},{captures:{3:{name:"punctuation.definition.inserted.diff"},6:{name:"punctuation.definition.inserted.diff"}},match:"^(((>)( .*)?)|((\\+).*))$\\n?",name:"markup.inserted.diff"},{captures:{1:{name:"punctuation.definition.changed.diff"}},match:"^(!).*$\\n?",name:"markup.changed.diff"},{captures:{3:{name:"punctuation.definition.deleted.diff"},6:{name:"punctuation.definition.deleted.diff"}},match:"^(((<)( .*)?)|((-).*))$\\n?",name:"markup.deleted.diff"},{begin:"^(#)",captures:{1:{name:"punctuation.definition.comment.diff"}},comment:'Git produces unified diffs with embedded comments"',end:"\\n",name:"comment.line.number-sign.diff"},{match:"^index [0-9a-f]{7,40}\\.\\.[0-9a-f]{7,40}.*$\\n?",name:"meta.diff.index.git"},{captures:{1:{name:"punctuation.separator.key-value.diff"},2:{name:"meta.toc-list.file-name.diff"}},match:"^Index(:) (.+)$\\n?",name:"meta.diff.index"},{match:"^Only in .*: .*$\\n?",name:"meta.diff.only-in"}],scopeName:"source.diff"})]},15990:function(e,n,t){t.r(n),t.d(n,{default:function(){return m}});var i=t(20864);let a=Object.freeze({displayName:"Git Commit Message",name:"git-commit",patterns:[{begin:"(?=^diff --git)",comment:"diff presented at the end of the commit message when using commit -v.",contentName:"source.diff",end:"\\z",name:"meta.embedded.diff.git-commit",patterns:[{include:"source.diff"}]},{begin:"^(?!#)",comment:"User supplied message",end:"^(?=#)",name:"meta.scope.message.git-commit",patterns:[{captures:{1:{name:"invalid.deprecated.line-too-long.git-commit"},2:{name:"invalid.illegal.line-too-long.git-commit"}},comment:"Mark > 50 lines as deprecated, > 72 as illegal",match:"\\G.{0,50}(.{0,22}(.*))$",name:"meta.scope.subject.git-commit"}]},{begin:"^(?=#)",comment:"Git supplied metadata in a number of lines starting with #",contentName:"comment.line.number-sign.git-commit",end:"^(?!#)",name:"meta.scope.metadata.git-commit",patterns:[{captures:{1:{name:"markup.changed.git-commit"}},match:"^#\\t((modified|renamed):.*)$"},{captures:{1:{name:"markup.inserted.git-commit"}},match:"^#\\t(new file:.*)$"},{captures:{1:{name:"markup.deleted.git-commit"}},match:"^#\\t(deleted.*)$"},{captures:{1:{name:"keyword.other.file-type.git-commit"},2:{name:"string.unquoted.filename.git-commit"}},comment:"Fallback for non-English git commit template",match:"^#\\t([^:]+): *(.*)$"}]}],scopeName:"text.git-commit",embeddedLangs:["diff"]});var m=[...i.default,a]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/5991.670d9fbb66a53969.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5991],{55991:function(e,n,t){t.r(n),t.d(n,{default:function(){return r}});var a=t(35355),m=t(81744);let i=Object.freeze({displayName:"ERB",fileTypes:["erb","rhtml","html.erb"],injections:{"text.html.erb - (meta.embedded.block.erb | meta.embedded.line.erb | comment)":{patterns:[{begin:"(^\\s*)(?=<%+#(?![^%]*%>))",beginCaptures:{0:{name:"punctuation.whitespace.comment.leading.erb"}},end:"(?!\\G)(\\s*$\\n)?",endCaptures:{0:{name:"punctuation.whitespace.comment.trailing.erb"}},patterns:[{include:"#comment"}]},{begin:"(^\\s*)(?=<%(?![^%]*%>))",beginCaptures:{0:{name:"punctuation.whitespace.embedded.leading.erb"}},end:"(?!\\G)(\\s*$\\n)?",endCaptures:{0:{name:"punctuation.whitespace.embedded.trailing.erb"}},patterns:[{include:"#tags"}]},{include:"#comment"},{include:"#tags"}]}},name:"erb",patterns:[{include:"text.html.basic"}],repository:{comment:{patterns:[{begin:"<%+#",beginCaptures:{0:{name:"punctuation.definition.comment.begin.erb"}},end:"%>",endCaptures:{0:{name:"punctuation.definition.comment.end.erb"}},name:"comment.block.erb"}]},tags:{patterns:[{begin:"<%+(?!>)[-=]?(?![^%]*%>)",beginCaptures:{0:{name:"punctuation.section.embedded.begin.erb"}},contentName:"source.ruby",end:"(-?%)>",endCaptures:{0:{name:"punctuation.section.embedded.end.erb"},1:{name:"source.ruby"}},name:"meta.embedded.block.erb",patterns:[{captures:{1:{name:"punctuation.definition.comment.erb"}},match:"(#).*?(?=-?%>)",name:"comment.line.number-sign.erb"},{include:"source.ruby"}]},{begin:"<%+(?!>)[-=]?",beginCaptures:{0:{name:"punctuation.section.embedded.begin.erb"}},contentName:"source.ruby",end:"(-?%)>",endCaptures:{0:{name:"punctuation.section.embedded.end.erb"},1:{name:"source.ruby"}},name:"meta.embedded.line.erb",patterns:[{captures:{1:{name:"punctuation.definition.comment.erb"}},match:"(#).*?(?=-?%>)",name:"comment.line.number-sign.erb"},{include:"source.ruby"}]}]}},scopeName:"text.html.erb",embeddedLangs:["html","ruby"]});var r=[...a.default,...m.default,i]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/6038.a9bd439b148eb2a8.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6038],{46038:function(e,n,t){t.r(n),t.d(n,{default:function(){return o}});var o=[Object.freeze({displayName:"Gettext PO",fileTypes:["po","pot","potx"],name:"po",patterns:[{begin:'^(?=(msgid(_plural)?|msgctxt)\\s*"[^"])|^\\s*$',comment:"Start of body of document, after header",end:"\\z",patterns:[{include:"#body"}]},{include:"#comments"},{match:'^msg(id|str)\\s+""\\s*$\\n?',name:"comment.line.number-sign.po"},{captures:{1:{name:"constant.language.po"},2:{name:"punctuation.separator.key-value.po"},3:{name:"string.other.po"}},match:'^"(?:([^\\s:]+)(:)\\s+)?([^"]*)"\\s*$\\n?',name:"meta.header.po"}],repository:{body:{patterns:[{begin:"^(msgid(_plural)?)\\s+",beginCaptures:{1:{name:"keyword.control.msgid.po"}},end:'^(?!")',name:"meta.scope.msgid.po",patterns:[{begin:'(\\G|^)"',end:'"',name:"string.quoted.double.po",patterns:[{match:'\\\\[\\\\"]',name:"constant.character.escape.po"}]}]},{begin:"^(msgstr)(?:(\\[)(\\d+)(\\]))?\\s+",beginCaptures:{1:{name:"keyword.control.msgstr.po"},2:{name:"keyword.control.msgstr.po"},3:{name:"constant.numeric.po"},4:{name:"keyword.control.msgstr.po"}},end:'^(?!")',name:"meta.scope.msgstr.po",patterns:[{begin:'(\\G|^)"',end:'"',name:"string.quoted.double.po",patterns:[{match:'\\\\[\\\\"]',name:"constant.character.escape.po"}]}]},{begin:"^(msgctxt)(?:(\\[)(\\d+)(\\]))?\\s+",beginCaptures:{1:{name:"keyword.control.msgctxt.po"},2:{name:"keyword.control.msgctxt.po"},3:{name:"constant.numeric.po"},4:{name:"keyword.control.msgctxt.po"}},end:'^(?!")',name:"meta.scope.msgctxt.po",patterns:[{begin:'(\\G|^)"',end:'"',name:"string.quoted.double.po",patterns:[{match:'\\\\[\\\\"]',name:"constant.character.escape.po"}]}]},{captures:{1:{name:"punctuation.definition.comment.po"}},match:"^(#~).*$\\n?",name:"comment.line.number-sign.obsolete.po"},{include:"#comments"},{comment:'a line that does not begin with # or ". Could improve this regexp',match:'^(?!\\s*$)[^#"].*$\\n?',name:"invalid.illegal.po"}]},comments:{patterns:[{begin:"^(?=#)",end:"(?!\\G)",patterns:[{begin:"(#,)\\s+",beginCaptures:{1:{name:"punctuation.definition.comment.po"}},end:"\\n",name:"comment.line.number-sign.flag.po",patterns:[{captures:{1:{name:"entity.name.type.flag.po"}},match:"(?:\\G|,\\s*)((?:fuzzy)|(?:no-)?(?:c|objc|sh|lisp|elisp|librep|scheme|smalltalk|java|csharp|awk|object-pascal|ycp|tcl|perl|perl-brace|php|gcc-internal|qt|boost)-format)"}]},{begin:"#\\.",beginCaptures:{0:{name:"punctuation.definition.comment.po"}},end:"\\n",name:"comment.line.number-sign.extracted.po"},{begin:"(#:)[ \\t]*",beginCaptures:{1:{name:"punctuation.definition.comment.po"}},end:"\\n",name:"comment.line.number-sign.reference.po",patterns:[{match:"(\\S+:)([\\d;]*)",name:"storage.type.class.po"}]},{begin:"#\\|",beginCaptures:{0:{name:"punctuation.definition.comment.po"}},end:"\\n",name:"comment.line.number-sign.previous.po"},{begin:"#",beginCaptures:{0:{name:"punctuation.definition.comment.po"}},end:"\\n",name:"comment.line.number-sign.po"}]}]}},scopeName:"source.po",aliases:["pot","potx"]})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/6484.37ddbfc561fdc997.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6484],{96484:function(e,n,t){t.r(n),t.d(n,{default:function(){return o}});var o=[Object.freeze({displayName:"CODEOWNERS",name:"codeowners",patterns:[{include:"#comment"},{include:"#pattern"},{include:"#owner"}],repository:{comment:{patterns:[{begin:"^\\s*#",captures:{0:{name:"punctuation.definition.comment.codeowners"}},end:"$",name:"comment.line.codeowners"}]},owner:{match:"\\S*@\\S+",name:"storage.type.function.codeowners"},pattern:{match:"^\\s*(\\S+)",name:"variable.other.codeowners"}},scopeName:"text.codeowners"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/6562.25f07034ccc886c4.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6562],{96562:function(e,n,t){t.r(n),t.d(n,{default:function(){return i}});var i=[Object.freeze({displayName:"Windows Registry Script",fileTypes:["reg","REG"],name:"reg",patterns:[{match:"Windows Registry Editor Version 5\\.00|REGEDIT4",name:"keyword.control.import.reg"},{captures:{1:{name:"punctuation.definition.comment.reg"}},match:"(;).*$",name:"comment.line.semicolon.reg"},{captures:{1:{name:"punctuation.definition.section.reg"},2:{name:"entity.section.reg"},3:{name:"punctuation.definition.section.reg"}},match:"^\\s*(\\[(?!-))(.*?)(\\])",name:"entity.name.function.section.add.reg"},{captures:{1:{name:"punctuation.definition.section.reg"},2:{name:"entity.section.reg"},3:{name:"punctuation.definition.section.reg"}},match:"^\\s*(\\[-)(.*?)(\\])",name:"entity.name.function.section.delete.reg"},{captures:{2:{name:"punctuation.definition.quote.reg"},3:{name:"support.function.regname.ini"},4:{name:"punctuation.definition.quote.reg"},5:{name:"punctuation.definition.equals.reg"},7:{name:"keyword.operator.arithmetic.minus.reg"},9:{name:"punctuation.definition.quote.reg"},10:{name:"string.name.regdata.reg"},11:{name:"punctuation.definition.quote.reg"},13:{name:"support.type.dword.reg"},14:{name:"keyword.operator.arithmetic.colon.reg"},15:{name:"constant.numeric.dword.reg"},17:{name:"support.type.dword.reg"},18:{name:"keyword.operator.arithmetic.parenthesis.reg"},19:{name:"keyword.operator.arithmetic.parenthesis.reg"},20:{name:"constant.numeric.hex.size.reg"},21:{name:"keyword.operator.arithmetic.parenthesis.reg"},22:{name:"keyword.operator.arithmetic.colon.reg"},23:{name:"constant.numeric.hex.reg"},24:{name:"keyword.operator.arithmetic.linecontinuation.reg"},25:{name:"comment.declarationline.semicolon.reg"}},match:"^(\\s*([\"']?)(.+?)([\"']?)\\s*(=))?\\s*((-)|(([\"'])(.*?)([\"']))|(((?i:dword))(:)\\s*([\\dabcdefABCDEF]{1,8}))|(((?i:hex))((\\()([\\d]*)(\\)))?(:)(.*?)(\\\\?)))\\s*(;.*)?$",name:"meta.declaration.reg"},{match:"\\d+",name:"constant.numeric.reg"},{match:"[a-fA-F]+",name:"constant.numeric.hex.reg"},{match:",+",name:"constant.numeric.hex.comma.reg"},{match:"\\\\",name:"keyword.operator.arithmetic.linecontinuation.reg"}],scopeName:"source.reg"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/6768.97bc738aed34ea5d.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6768],{86768:function(n,e,t){t.r(e),t.d(e,{default:function(){return a}});var a=[Object.freeze({displayName:"JSON Lines",name:"jsonl",patterns:[{include:"#value"}],repository:{array:{begin:"\\[",beginCaptures:{0:{name:"punctuation.definition.array.begin.json.lines"}},end:"\\]",endCaptures:{0:{name:"punctuation.definition.array.end.json.lines"}},name:"meta.structure.array.json.lines",patterns:[{include:"#value"},{match:",",name:"punctuation.separator.array.json.lines"},{match:"[^\\s\\]]",name:"invalid.illegal.expected-array-separator.json.lines"}]},comments:{patterns:[{begin:"/\\*\\*(?!/)",captures:{0:{name:"punctuation.definition.comment.json.lines"}},end:"\\*/",name:"comment.block.documentation.json.lines"},{begin:"/\\*",captures:{0:{name:"punctuation.definition.comment.json.lines"}},end:"\\*/",name:"comment.block.json.lines"},{captures:{1:{name:"punctuation.definition.comment.json.lines"}},match:"(//).*$\\n?",name:"comment.line.double-slash.js"}]},constant:{match:"\\b(?:true|false|null)\\b",name:"constant.language.json.lines"},number:{match:"-?(?:0|[1-9]\\d*)(?:(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)?",name:"constant.numeric.json.lines"},object:{begin:"\\{",beginCaptures:{0:{name:"punctuation.definition.dictionary.begin.json.lines"}},end:"\\}",endCaptures:{0:{name:"punctuation.definition.dictionary.end.json.lines"}},name:"meta.structure.dictionary.json.lines",patterns:[{comment:"the JSON object key",include:"#objectkey"},{include:"#comments"},{begin:":",beginCaptures:{0:{name:"punctuation.separator.dictionary.key-value.json.lines"}},end:"(,)|(?=\\})",endCaptures:{1:{name:"punctuation.separator.dictionary.pair.json.lines"}},name:"meta.structure.dictionary.value.json.lines",patterns:[{comment:"the JSON object value",include:"#value"},{match:"[^\\s,]",name:"invalid.illegal.expected-dictionary-separator.json.lines"}]},{match:"[^\\s}]",name:"invalid.illegal.expected-dictionary-separator.json.lines"}]},objectkey:{begin:'"',beginCaptures:{0:{name:"punctuation.support.type.property-name.begin.json.lines"}},end:'"',endCaptures:{0:{name:"punctuation.support.type.property-name.end.json.lines"}},name:"string.json.lines support.type.property-name.json.lines",patterns:[{include:"#stringcontent"}]},string:{begin:'"',beginCaptures:{0:{name:"punctuation.definition.string.begin.json.lines"}},end:'"',endCaptures:{0:{name:"punctuation.definition.string.end.json.lines"}},name:"string.quoted.double.json.lines",patterns:[{include:"#stringcontent"}]},stringcontent:{patterns:[{match:'\\\\(?:["\\\\/bfnrt]|u[0-9a-fA-F]{4})',name:"constant.character.escape.json.lines"},{match:"\\\\.",name:"invalid.illegal.unrecognized-string-escape.json.lines"}]},value:{patterns:[{include:"#constant"},{include:"#number"},{include:"#string"},{include:"#array"},{include:"#object"},{include:"#comments"}]}},scopeName:"source.json.lines"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/6814.c871ec2910b34535.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6814],{46814:function(e,a,t){t.r(a),t.d(a,{default:function(){return m}});var s=t(82873);let n=Object.freeze({displayName:"Git Rebase Message",name:"git-rebase",patterns:[{captures:{1:{name:"punctuation.definition.comment.git-rebase"}},match:"^\\s*(#).*$\\n?",name:"comment.line.number-sign.git-rebase"},{captures:{1:{name:"support.function.git-rebase"},2:{name:"constant.sha.git-rebase"},3:{name:"meta.commit-message.git-rebase"}},match:"^\\s*(pick|p|reword|r|edit|e|squash|s|fixup|f|drop|d)\\s+([0-9a-f]+)\\s+(.*)$",name:"meta.commit-command.git-rebase"},{captures:{1:{name:"support.function.git-rebase"},2:{patterns:[{include:"source.shell"}]}},match:"^\\s*(exec|x)\\s+(.*)$",name:"meta.commit-command.git-rebase"},{captures:{1:{name:"support.function.git-rebase"}},match:"^\\s*(break|b)\\s*$",name:"meta.commit-command.git-rebase"}],scopeName:"text.git-rebase",embeddedLangs:["shellscript"]});var m=[...s.default,n]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/6863.be5983a142fd99e3.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6863],{56863:function(e,t,a){a.r(t),a.d(t,{default:function(){return m}});var n=a(35355);let i=Object.freeze({displayName:"HTML (Derivative)",injections:{"R:text.html - (comment.block, text.html meta.embedded, meta.tag.*.*.html, meta.tag.*.*.*.html, meta.tag.*.*.*.*.html)":{comment:"Uses R: to ensure this matches after any other injections.",patterns:[{match:"<",name:"invalid.illegal.bad-angle-bracket.html"}]}},name:"html-derivative",patterns:[{include:"text.html.basic#core-minus-invalid"},{begin:"(?)(\\w[^\\s>]*)(?)",endCaptures:{1:{name:"punctuation.definition.tag.end.html"}},name:"meta.tag.other.unrecognized.html.derivative",patterns:[{include:"text.html.basic#attribute"}]}],scopeName:"text.html.derivative",embeddedLangs:["html"]});var m=[...n.default,i]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/7042.3451eb2f7a071a61.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7042],{97042:function(e,s,t){t.r(s),t.d(s,{default:function(){return a}});var l=t(82873);let n=Object.freeze({displayName:"Shell Session",fileTypes:["sh-session"],name:"shellsession",patterns:[{captures:{1:{name:"entity.other.prompt-prefix.shell-session"},2:{name:"punctuation.separator.prompt.shell-session"},3:{name:"source.shell",patterns:[{include:"source.shell"}]}},match:"^(?:((?:\\(\\S+\\)\\s*)?(?:sh\\S*?|\\w+\\S+[@:]\\S+(?:\\s+\\S+)?|\\[\\S+?[@:][^\\n]+?\\].*?))\\s*)?([>$#%❯➜]|\\p{Greek})\\s+(.*)$"},{match:"^.+$",name:"meta.output.shell-session"}],scopeName:"text.shell-session",embeddedLangs:["shellscript"],aliases:["console"]});var a=[...l.default,n]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/7475.85610087b0b53bc1.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7475],{7475:function(e,t,r){r.r(t),r.d(t,{default:function(){return a}});var a=[Object.freeze({displayName:"Logo",fileTypes:[],name:"logo",patterns:[{match:"^to [\\w.]+",name:"entity.name.function.logo"},{match:"continue|do\\.until|do\\.while|end|for(each)?|if(else|falsetrue|)|repeat|stop|until",name:"keyword.control.logo"},{match:"\\b(\\.defmacro|\\.eq|\\.macro|\\.maybeoutput|\\.setbf|\\.setfirst|\\.setitem|\\.setsegmentsize|allopen|allowgetset|and|apply|arc|arctan|arity|array|arrayp|arraytolist|ascii|ashift|back|background|backslashedp|beforep|bitand|bitnot|bitor|bitxor|buried|buriedp|bury|buryall|buryname|butfirst|butfirsts|butlast|bye|cascade|case|caseignoredp|catch|char|clean|clearscreen|cleartext|close|closeall|combine|cond|contents|copydef|cos|count|crossmap|cursor|define|definedp|dequeue|difference|dribble|edall|edit|editfile|edn|edns|edpl|edpls|edps|emptyp|eofp|epspict|equalp|erall|erase|erasefile|ern|erns|erpl|erpls|erps|erract|error|exp|fence|filep|fill|filter|find|first|firsts|forever|form|forward|fput|fullprintp|fullscreen|fulltext|gc|gensym|global|goto|gprop|greaterp|heading|help|hideturtle|home|ignore|int|invoke|iseq|item|keyp|label|last|left|lessp|list|listp|listtoarray|ln|load|loadnoisily|loadpict|local|localmake|log10|lowercase|lput|lshift|macroexpand|macrop|make|map|map.se|mdarray|mditem|mdsetitem|member|memberp|minus|modulo|name|namelist|namep|names|nodes|nodribble|norefresh|not|numberp|openappend|openread|openupdate|openwrite|or|output|palette|parse|pause|pen|pencolor|pendown|pendownp|penerase|penmode|penpaint|penreverse|pensize|penup|pick|plist|plistp|plists|pllist|po|poall|pon|pons|pop|popl|popls|pops|pos|pot|pots|power|pprop|prefix|primitivep|print|printdepthlimit|printwidthlimit|procedurep|procedures|product|push|queue|quoted|quotient|radarctan|radcos|radsin|random|rawascii|readchar|readchars|reader|readlist|readpos|readrawline|readword|redefp|reduce|refresh|remainder|remdup|remove|remprop|repcount|rerandom|reverse|right|round|rseq|run|runparse|runresult|save|savel|savepict|screenmode|scrunch|sentence|setbackground|setcursor|seteditor|setheading|sethelploc|setitem|setlibloc|setmargins|setpalette|setpen|setpencolor|setpensize|setpos|setprefix|setread|setreadpos|setscrunch|settemploc|settextcolor|setwrite|setwritepos|setx|setxy|sety|shell|show|shownp|showturtle|sin|splitscreen|sqrt|standout|startup|step|stepped|steppedp|substringp|sum|tag|test|text|textscreen|thing|throw|towards|trace|traced|tracedp|transfer|turtlemode|type|unbury|unburyall|unburyname|unburyonedit|unstep|untrace|uppercase|usealternatenam|wait|while|window|word|wordp|wrap|writepos|writer|xcor|ycor)\\b",name:"keyword.other.logo"},{captures:{1:{name:"punctuation.definition.variable.logo"}},match:"(:)(?:\\|[^|]*\\||[-\\w.]*)+",name:"variable.parameter.logo"},{match:'"(?:\\|[^|]*\\||[-\\w.]*)+',name:"string.other.word.logo"},{begin:"(^[ \\t]+)?(?=;)",beginCaptures:{1:{name:"punctuation.whitespace.comment.leading.logo"}},end:"(?!\\G)",patterns:[{begin:";",beginCaptures:{0:{name:"punctuation.definition.comment.logo"}},end:"\\n",name:"comment.line.semicolon.logo"}]}],scopeName:"source.logo"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/7878.2fcdd886b86b7382.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7878],{27878:function(e,n,t){t.r(n),t.d(n,{default:function(){return m}});var m=[Object.freeze({displayName:"QML Directory",name:"qmldir",patterns:[{include:"#comment"},{include:"#keywords"},{include:"#version"},{include:"#names"}],repository:{comment:{patterns:[{begin:"#",end:"$",name:"comment.line.number-sign.qmldir"}]},"file-name":{patterns:[{match:"\\b\\w+\\.(qmltypes|qml|js)\\b",name:"string.unquoted.qmldir"}]},identifier:{patterns:[{match:"\\b\\w+\\b",name:"variable.parameter.qmldir"}]},keywords:{patterns:[{match:"\\b(module|singleton|internal|plugin|classname|typeinfo|depends|designersupported)\\b",name:"keyword.other.qmldir"}]},"module-name":{patterns:[{match:"\\b[A-Z]\\w*\\b",name:"entity.name.type.qmldir"}]},names:{patterns:[{include:"#file-name"},{include:"#module-name"},{include:"#identifier"}]},version:{patterns:[{match:"\\b\\d+\\.\\d+\\b",name:"constant.numeric.qml"}]}},scopeName:"source.qmldir"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/8093.c89f62b0bc5fa24d.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8093],{18093:function(e,a,n){n.r(a),n.d(a,{default:function(){return t}});var t=[Object.freeze({displayName:"Genie",fileTypes:["gs"],name:"genie",patterns:[{include:"#code"}],repository:{code:{patterns:[{include:"#comments"},{include:"#constants"},{include:"#strings"},{include:"#keywords"},{include:"#types"},{include:"#functions"},{include:"#variables"}]},comments:{patterns:[{captures:{0:{name:"punctuation.definition.comment.vala"}},match:"/\\*\\*/",name:"comment.block.empty.vala"},{include:"text.html.javadoc"},{include:"#comments-inline"}]},"comments-inline":{patterns:[{begin:"/\\*",captures:{0:{name:"punctuation.definition.comment.vala"}},end:"\\*/",name:"comment.block.vala"},{captures:{1:{name:"comment.line.double-slash.vala"},2:{name:"punctuation.definition.comment.vala"}},match:"\\s*((//).*$\\n?)"}]},constants:{patterns:[{match:"\\b((0(x|X)[0-9a-fA-F]*)|((\\d+\\.?\\d*)|(\\.\\d+))((e|E)(\\+|-)?\\d+)?)([LlFfUuDd]|UL|ul)?\\b",name:"constant.numeric.vala"},{match:"\\b([A-Z][A-Z0-9_]+)\\b",name:"variable.other.constant.vala"}]},functions:{patterns:[{match:"(\\w+)(?=\\s*(<[\\s\\w.]+>\\s*)?\\()",name:"entity.name.function.vala"}]},keywords:{patterns:[{match:"(?<=^|[^@\\w\\.])(as|do|if|in|is|of|or|to|and|def|for|get|isa|new|not|out|ref|set|try|var|case|dict|else|enum|init|list|lock|null|pass|prop|self|true|uses|void|weak|when|array|async|break|class|const|event|false|final|owned|print|super|raise|while|yield|assert|delete|downto|except|extern|inline|params|public|raises|return|sealed|sizeof|static|struct|typeof|default|dynamic|ensures|finally|private|unowned|virtual|abstract|continue|delegate|internal|override|readonly|requires|volatile|construct|errordomain|interface|namespace|protected|implements)\\b",name:"keyword.vala"},{match:"(?<=^|[^@\\w\\.])(bool|double|float|unichar|char|uchar|int|uint|long|ulong|short|ushort|size_t|ssize_t|string|void|signal|int8|int16|int32|int64|uint8|uint16|uint32|uint64)\\b",name:"keyword.vala"},{match:"(#if|#elif|#else|#endif)",name:"keyword.vala"}]},strings:{patterns:[{begin:'"""',end:'"""',name:"string.quoted.triple.vala"},{begin:'@"',end:'"',name:"string.quoted.interpolated.vala",patterns:[{match:"\\\\.",name:"constant.character.escape.vala"},{match:"\\$\\w+",name:"constant.character.escape.vala"},{match:"\\$\\(([^)(]|\\(([^)(]|\\([^)]*\\))*\\))*\\)",name:"constant.character.escape.vala"}]},{begin:'"',end:'"',name:"string.quoted.double.vala",patterns:[{match:"\\\\.",name:"constant.character.escape.vala"}]},{begin:"'",end:"'",name:"string.quoted.single.vala",patterns:[{match:"\\\\.",name:"constant.character.escape.vala"}]},{match:"/((\\\\/)|([^/]))*/(?=\\s*[,;)\\.\\n])",name:"string.regexp.vala"}]},types:{patterns:[{match:"(?<=^|[^@\\w\\.])(bool|double|float|unichar|char|uchar|int|uint|long|ulong|short|ushort|size_t|ssize_t|string|void|signal|int8|int16|int32|int64|uint8|uint16|uint32|uint64)\\b",name:"storage.type.primitive.vala"},{match:"\\b([A-Z]+\\w*)\\b",name:"entity.name.type.vala"}]},variables:{patterns:[{match:"\\b([_a-z]+\\w*)\\b",name:"variable.other.vala"}]}},scopeName:"source.genie"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/8110.d4e6bb65608acb9e.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8110],{98110:function(a,e,t){t.r(e),t.d(e,{default:function(){return n}});var n=[Object.freeze({displayName:"Narrat Language",name:"narrat",patterns:[{include:"#comments"},{include:"#expression"}],repository:{commands:{patterns:[{match:"\\b(set|var)\\b",name:"keyword.commands.variables.narrat"},{match:"\\b(talk|think)\\b",name:"keyword.commands.text.narrat"},{match:"\\b(jump|run|wait|return|save|save_prompt)",name:"keyword.commands.flow.narrat"},{match:"\\b(log|clear_dialog)\\b",name:"keyword.commands.helpers.narrat"},{match:"\\b(set_screen|empty_layer|set_button)",name:"keyword.commands.screens.narrat"},{match:"\\b(play|pause|stop)\\b",name:"keyword.commands.audio.narrat"},{match:"\\b(notify|enable_notifications|disable_notifications)\\b",name:"keyword.commands.notifications.narrat"},{match:"\\b(set_stat|get_stat_value|add_stat)",name:"keyword.commands.stats.narrat"},{match:"\\b(neg|abs|random|random_float|random_from_args|min|max|clamp|floor|round|ceil|sqrt|^)\\b",name:"keyword.commands.math.narrat"},{match:"\\b(concat|join)\\b",name:"keyword.commands.string.narrat"},{match:"\\b(text_field)\\b",name:"keyword.commands.text_field.narrat"},{match:"\\b(add_level|set_level|add_xp|roll|get_level|get_xp)\\b",name:"keyword.commands.skills.narrat"},{match:"\\b(add_item|remove_item|enable_interaction|disable_interaction|has_item?|item_amount?)",name:"keyword.commands.inventory.narrat"},{match:"\\b(start_quest|start_objective|complete_objective|complete_quest|quest_started?|objective_started?|quest_completed?|objective_completed?)",name:"keyword.commands.quests.narrat"}]},comments:{patterns:[{match:"\\/\\/.*$",name:"comment.line.narrat"}]},expression:{patterns:[{include:"#keywords"},{include:"#commands"},{include:"#operators"},{include:"#primitives"},{include:"#strings"},{include:"#paren-expression"}]},interpolation:{patterns:[{match:"(\\w|\\.)+",name:"variable.interpolation.narrat"}]},keywords:{patterns:[{match:"\\b(if|else|choice)\\b",name:"keyword.control.narrat"},{match:"\\$[\\w|\\.]+\\b",name:"variable.value.narrat"},{match:"^\\w+(?=(\\s|\\w)*:)",name:"entity.name.function.narrat"},{match:"^\\w+(?!(\\s|\\w)*:)",name:"invalid.label.narrat"},{match:"(?<=\\w)[^^](\\b\\w+\\b)(?=(\\s|\\w)*:)",name:"entity.other.attribute-name"}]},operators:{patterns:[{match:"(&&|\\|\\||!=|==|>=|<=|<|>|!|\\?)\\s",name:"keyword.operator.logic.narrat"},{match:"(\\+|-|\\*|\\/)\\s",name:"keyword.operator.arithmetic.narrat"}]},"paren-expression":{begin:"\\(",beginCaptures:{0:{name:"punctuation.paren.open"}},end:"\\)",endCaptures:{0:{name:"punctuation.paren.close"}},name:"expression.group",patterns:[{include:"#expression"}]},primitives:{patterns:[{match:"\\b\\d+\\b",name:"constant.numeric.narrat"},{match:"\\btrue\\b",name:"constant.language.true.narrat"},{match:"\\bfalse\\b",name:"constant.language.false.narrat"},{match:"\\bnull\\b",name:"constant.language.null.narrat"},{match:"\\bundefined\\b",name:"constant.language.undefined.narrat"}]},strings:{begin:'"',end:'"',name:"string.quoted.double.narrat",patterns:[{match:"\\\\.",name:"constant.character.escape.narrat"},{begin:"%{",beginCaptures:{0:{name:"punctuation.template.open"}},end:"}",endCaptures:{0:{name:"punctuation.template.close.narrat"}},name:"expression.template",patterns:[{include:"#expression"},{include:"#interpolation"}]}]}},scopeName:"source.narrat",aliases:["nar"]})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/8252.5c0f94ef6adbb994.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8252],{58252:function(e,r,n){n.r(r),n.d(r,{default:function(){return t}});var t=[Object.freeze({displayName:"Berry",name:"berry",patterns:[{include:"#controls"},{include:"#strings"},{include:"#comment-block"},{include:"#comments"},{include:"#keywords"},{include:"#function"},{include:"#member"},{include:"#identifier"},{include:"#number"},{include:"#operator"}],repository:{"comment-block":{begin:"\\#-",end:"-#",name:"comment.berry",patterns:[{}]},comments:{begin:"\\#",end:"\\n",name:"comment.line.berry",patterns:[{}]},controls:{patterns:[{match:"\\b(if|elif|else|for|while|do|end|break|continue|return|try|except|raise)\\b",name:"keyword.control.berry"}]},function:{patterns:[{match:"\\b([a-zA-Z_]\\w*(?=\\s*\\())",name:"entity.name.function.berry"}]},identifier:{patterns:[{match:"\\b[_A-Za-z]\\w+\\b",name:"identifier.berry"}]},keywords:{patterns:[{match:"\\b(var|static|def|class|true|false|nil|self|super|import|as|_class)\\b",name:"keyword.berry"}]},member:{patterns:[{captures:{0:{name:"entity.other.attribute-name.berry"}},match:"\\.([a-zA-Z_]\\w*)"}]},number:{patterns:[{match:"0x[a-fA-F0-9]+|\\d+|(\\d+\\.?|\\.\\d)\\d*([eE][+-]?\\d+)?",name:"constant.numeric.berry"}]},operator:{patterns:[{match:"\\(|\\)|\\[|\\]|\\.|-|!|~|\\*|/|%|\\+|&|\\^|\\||<|>|=|:",name:"keyword.operator.berry"}]},strings:{patterns:[{begin:"(\"|')",end:"\\1",name:"string.quoted.double.berry",patterns:[{match:"(\\\\x[\\h]{2})|(\\\\[0-7]{3})|(\\\\\\\\)|(\\\\\")|(\\\\')|(\\\\a)|(\\\\b)|(\\\\f)|(\\\\n)|(\\\\r)|(\\\\t)|(\\\\v)",name:"constant.character.escape.berry"}]},{begin:"f(\"|')",end:"\\1",name:"string.quoted.other.berry",patterns:[{match:"(\\\\x[\\h]{2})|(\\\\[0-7]{3})|(\\\\\\\\)|(\\\\\")|(\\\\')|(\\\\a)|(\\\\b)|(\\\\f)|(\\\\n)|(\\\\r)|(\\\\t)|(\\\\v)",name:"constant.character.escape.berry"},{match:"\\{\\{[^}]*\\}\\}",name:"string.quoted.other.berry"},{begin:"\\{",end:"\\}",name:"keyword.other.unit.berry",patterns:[{include:"#keywords"},{include:"#numbers"},{include:"#identifier"},{include:"#operator"},{include:"#member"},{include:"#function"}]}]}]}},scopeName:"source.berry",aliases:["be"]})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/864.863ce01377c675a1.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[864],{20864:function(n,e,i){i.r(e),i.d(e,{default:function(){return a}});var a=[Object.freeze({displayName:"Diff",name:"diff",patterns:[{captures:{1:{name:"punctuation.definition.separator.diff"}},match:"^((\\*{15})|(={67})|(-{3}))$\\n?",name:"meta.separator.diff"},{match:"^\\d+(,\\d+)*(a|d|c)\\d+(,\\d+)*$\\n?",name:"meta.diff.range.normal"},{captures:{1:{name:"punctuation.definition.range.diff"},2:{name:"meta.toc-list.line-number.diff"},3:{name:"punctuation.definition.range.diff"}},match:"^(@@)\\s*(.+?)\\s*(@@)($\\n?)?",name:"meta.diff.range.unified"},{captures:{3:{name:"punctuation.definition.range.diff"},4:{name:"punctuation.definition.range.diff"},6:{name:"punctuation.definition.range.diff"},7:{name:"punctuation.definition.range.diff"}},match:"^(((-{3}) .+ (-{4}))|((\\*{3}) .+ (\\*{4})))$\\n?",name:"meta.diff.range.context"},{match:"^diff --git a/.*$\\n?",name:"meta.diff.header.git"},{match:"^diff (-|\\S+\\s+\\S+).*$\\n?",name:"meta.diff.header.command"},{captures:{4:{name:"punctuation.definition.from-file.diff"},6:{name:"punctuation.definition.from-file.diff"},7:{name:"punctuation.definition.from-file.diff"}},match:"(^(((-{3}) .+)|((\\*{3}) .+))$\\n?|^(={4}) .+(?= - ))",name:"meta.diff.header.from-file"},{captures:{2:{name:"punctuation.definition.to-file.diff"},3:{name:"punctuation.definition.to-file.diff"},4:{name:"punctuation.definition.to-file.diff"}},match:"(^(\\+{3}) .+$\\n?| (-) .* (={4})$\\n?)",name:"meta.diff.header.to-file"},{captures:{3:{name:"punctuation.definition.inserted.diff"},6:{name:"punctuation.definition.inserted.diff"}},match:"^(((>)( .*)?)|((\\+).*))$\\n?",name:"markup.inserted.diff"},{captures:{1:{name:"punctuation.definition.changed.diff"}},match:"^(!).*$\\n?",name:"markup.changed.diff"},{captures:{3:{name:"punctuation.definition.deleted.diff"},6:{name:"punctuation.definition.deleted.diff"}},match:"^(((<)( .*)?)|((-).*))$\\n?",name:"markup.deleted.diff"},{begin:"^(#)",captures:{1:{name:"punctuation.definition.comment.diff"}},comment:'Git produces unified diffs with embedded comments"',end:"\\n",name:"comment.line.number-sign.diff"},{match:"^index [0-9a-f]{7,40}\\.\\.[0-9a-f]{7,40}.*$\\n?",name:"meta.diff.index.git"},{captures:{1:{name:"punctuation.separator.key-value.diff"},2:{name:"meta.toc-list.file-name.diff"}},match:"^Index(:) (.+)$\\n?",name:"meta.diff.index"},{match:"^Only in .*: .*$\\n?",name:"meta.diff.only-in"}],scopeName:"source.diff"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/8641.24f14a689c55ade1.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8641],{78641:function(n,a,e){e.r(a),e.d(a,{default:function(){return r}});var r=[Object.freeze({displayName:"CSV",fileTypes:["csv"],name:"csv",patterns:[{captures:{1:{name:"rainbow1"},2:{name:"keyword.rainbow2"},3:{name:"entity.name.function.rainbow3"},4:{name:"comment.rainbow4"},5:{name:"string.rainbow5"},6:{name:"variable.parameter.rainbow6"},7:{name:"constant.numeric.rainbow7"},8:{name:"entity.name.type.rainbow8"},9:{name:"markup.bold.rainbow9"},10:{name:"invalid.rainbow10"}},match:'((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?((?: *"(?:[^"]*"")*[^"]*" *(?:,|$))|(?:[^,]*(?:,|$)))?',name:"rainbowgroup"}],scopeName:"text.csv"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/8714.e56cffeed1a30233.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8714],{38714:function(n,e,t){t.r(e),t.d(e,{default:function(){return a}});var a=[Object.freeze({displayName:"JSON",name:"json",patterns:[{include:"#value"}],repository:{array:{begin:"\\[",beginCaptures:{0:{name:"punctuation.definition.array.begin.json"}},end:"\\]",endCaptures:{0:{name:"punctuation.definition.array.end.json"}},name:"meta.structure.array.json",patterns:[{include:"#value"},{match:",",name:"punctuation.separator.array.json"},{match:"[^\\s\\]]",name:"invalid.illegal.expected-array-separator.json"}]},comments:{patterns:[{begin:"/\\*\\*(?!/)",captures:{0:{name:"punctuation.definition.comment.json"}},end:"\\*/",name:"comment.block.documentation.json"},{begin:"/\\*",captures:{0:{name:"punctuation.definition.comment.json"}},end:"\\*/",name:"comment.block.json"},{captures:{1:{name:"punctuation.definition.comment.json"}},match:"(//).*$\\n?",name:"comment.line.double-slash.js"}]},constant:{match:"\\b(?:true|false|null)\\b",name:"constant.language.json"},number:{match:"-?(?:0|[1-9]\\d*)(?:(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)?",name:"constant.numeric.json"},object:{begin:"\\{",beginCaptures:{0:{name:"punctuation.definition.dictionary.begin.json"}},end:"\\}",endCaptures:{0:{name:"punctuation.definition.dictionary.end.json"}},name:"meta.structure.dictionary.json",patterns:[{comment:"the JSON object key",include:"#objectkey"},{include:"#comments"},{begin:":",beginCaptures:{0:{name:"punctuation.separator.dictionary.key-value.json"}},end:"(,)|(?=\\})",endCaptures:{1:{name:"punctuation.separator.dictionary.pair.json"}},name:"meta.structure.dictionary.value.json",patterns:[{comment:"the JSON object value",include:"#value"},{match:"[^\\s,]",name:"invalid.illegal.expected-dictionary-separator.json"}]},{match:"[^\\s}]",name:"invalid.illegal.expected-dictionary-separator.json"}]},objectkey:{begin:'"',beginCaptures:{0:{name:"punctuation.support.type.property-name.begin.json"}},end:'"',endCaptures:{0:{name:"punctuation.support.type.property-name.end.json"}},name:"string.json support.type.property-name.json",patterns:[{include:"#stringcontent"}]},string:{begin:'"',beginCaptures:{0:{name:"punctuation.definition.string.begin.json"}},end:'"',endCaptures:{0:{name:"punctuation.definition.string.end.json"}},name:"string.quoted.double.json",patterns:[{include:"#stringcontent"}]},stringcontent:{patterns:[{match:'\\\\(?:["\\\\/bfnrt]|u[0-9a-fA-F]{4})',name:"constant.character.escape.json"},{match:"\\\\.",name:"invalid.illegal.unrecognized-string-escape.json"}]},value:{patterns:[{include:"#constant"},{include:"#number"},{include:"#string"},{include:"#array"},{include:"#object"},{include:"#comments"}]}},scopeName:"source.json"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/8877.03bac32f50d1cadd.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8877],{48877:function(e,n,a){a.r(n),a.d(n,{default:function(){return t}});var t=[Object.freeze({displayName:"Fluent",name:"fluent",patterns:[{include:"#comment"},{include:"#message"},{include:"#wrong-line"}],repository:{attributes:{begin:"\\s*(\\.[a-zA-Z][a-zA-Z0-9_-]*\\s*=\\s*)",beginCaptures:{1:{name:"support.class.attribute-begin.fluent"}},end:"^(?=\\s*[^\\.])",patterns:[{include:"#placeable"}]},comment:{match:"^##?#?\\s.*$",name:"comment.fluent"},"function-comma":{match:",",name:"support.function.function-comma.fluent"},"function-named-argument":{begin:'([a-zA-Z0-9]+:)\\s*(["a-zA-Z0-9]+)',beginCaptures:{1:{name:"support.function.named-argument.name.fluent"},2:{name:"variable.other.named-argument.value.fluent"}},end:"(?=\\)|,|\\s)",name:"variable.other.named-argument.fluent"},"function-positional-argument":{match:"\\$[a-zA-Z0-9_-]+",name:"variable.other.function.positional-argument.fluent"},"invalid-placeable-string-missing-end-quote":{match:'"[^"]+$',name:"invalid.illegal.wrong-placeable-missing-end-quote.fluent"},"invalid-placeable-wrong-placeable-missing-end":{match:"([^}A-Z]*$|[^-][^>]$)\\b",name:"invalid.illegal.wrong-placeable-missing-end.fluent"},message:{begin:"^(-?[a-zA-Z][a-zA-Z0-9_-]*\\s*=\\s*)",beginCaptures:{1:{name:"support.class.message-identifier.fluent"}},contentName:"string.fluent",end:"^(?=\\S)",patterns:[{include:"#attributes"},{include:"#placeable"}]},placeable:{begin:"({)",beginCaptures:{1:{name:"keyword.placeable.begin.fluent"}},contentName:"variable.other.placeable.content.fluent",end:"(})",endCaptures:{1:{name:"keyword.placeable.end.fluent"}},patterns:[{include:"#placeable-string"},{include:"#placeable-function"},{include:"#placeable-reference-or-number"},{include:"#selector"},{include:"#invalid-placeable-wrong-placeable-missing-end"},{include:"#invalid-placeable-string-missing-end-quote"},{include:"#invalid-placeable-wrong-function-name"}]},"placeable-function":{begin:"([A-Z][A-Z0-9_-]*\\()",beginCaptures:{1:{name:"support.function.placeable-function.call.begin.fluent"}},contentName:"string.placeable-function.fluent",end:"(\\))",endCaptures:{1:{name:"support.function.placeable-function.call.end.fluent"}},patterns:[{include:"#function-comma"},{include:"#function-positional-argument"},{include:"#function-named-argument"}]},"placeable-reference-or-number":{match:"((-|\\$)[a-zA-Z0-9_-]+|[a-zA-Z][a-zA-Z0-9_-]*|\\d+)",name:"variable.other.placeable.reference-or-number.fluent"},"placeable-string":{begin:'(")(?=[^\\n]*")',beginCaptures:{1:{name:"variable.other.placeable-string-begin.fluent"}},contentName:"string.placeable-string-content.fluent",end:'(")',endCaptures:{1:{name:"variable.other.placeable-string-end.fluent"}}},selector:{begin:"(->)",beginCaptures:{1:{name:"support.function.selector.begin.fluent"}},contentName:"string.selector.content.fluent",end:"^(?=\\s*})",patterns:[{include:"#selector-item"}]},"selector-item":{begin:"(\\s*\\*?\\[)([a-zA-Z0-9_-]+)(\\]\\s*)",beginCaptures:{1:{name:"support.function.selector-item.begin.fluent"},2:{name:"variable.other.selector-item.begin.fluent"},3:{name:"support.function.selector-item.begin.fluent"}},contentName:"string.selector-item.content.fluent",end:"^(?=(\\s*})|(\\s*\\[)|(\\s*\\*))",patterns:[{include:"#placeable"}]},"wrong-line":{match:".*",name:"invalid.illegal.wrong-line.fluent"}},scopeName:"source.ftl",aliases:["ftl"]})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/8919.38447c38ba2b94b9.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8919],{8919:function(n,e,t){t.r(e),t.d(e,{default:function(){return a}});var a=[Object.freeze({displayName:"JSON with Comments",name:"jsonc",patterns:[{include:"#value"}],repository:{array:{begin:"\\[",beginCaptures:{0:{name:"punctuation.definition.array.begin.json.comments"}},end:"\\]",endCaptures:{0:{name:"punctuation.definition.array.end.json.comments"}},name:"meta.structure.array.json.comments",patterns:[{include:"#value"},{match:",",name:"punctuation.separator.array.json.comments"},{match:"[^\\s\\]]",name:"invalid.illegal.expected-array-separator.json.comments"}]},comments:{patterns:[{begin:"/\\*\\*(?!/)",captures:{0:{name:"punctuation.definition.comment.json.comments"}},end:"\\*/",name:"comment.block.documentation.json.comments"},{begin:"/\\*",captures:{0:{name:"punctuation.definition.comment.json.comments"}},end:"\\*/",name:"comment.block.json.comments"},{captures:{1:{name:"punctuation.definition.comment.json.comments"}},match:"(//).*$\\n?",name:"comment.line.double-slash.js"}]},constant:{match:"\\b(?:true|false|null)\\b",name:"constant.language.json.comments"},number:{match:"-?(?:0|[1-9]\\d*)(?:(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)?",name:"constant.numeric.json.comments"},object:{begin:"\\{",beginCaptures:{0:{name:"punctuation.definition.dictionary.begin.json.comments"}},end:"\\}",endCaptures:{0:{name:"punctuation.definition.dictionary.end.json.comments"}},name:"meta.structure.dictionary.json.comments",patterns:[{comment:"the JSON object key",include:"#objectkey"},{include:"#comments"},{begin:":",beginCaptures:{0:{name:"punctuation.separator.dictionary.key-value.json.comments"}},end:"(,)|(?=\\})",endCaptures:{1:{name:"punctuation.separator.dictionary.pair.json.comments"}},name:"meta.structure.dictionary.value.json.comments",patterns:[{comment:"the JSON object value",include:"#value"},{match:"[^\\s,]",name:"invalid.illegal.expected-dictionary-separator.json.comments"}]},{match:"[^\\s}]",name:"invalid.illegal.expected-dictionary-separator.json.comments"}]},objectkey:{begin:'"',beginCaptures:{0:{name:"punctuation.support.type.property-name.begin.json.comments"}},end:'"',endCaptures:{0:{name:"punctuation.support.type.property-name.end.json.comments"}},name:"string.json.comments support.type.property-name.json.comments",patterns:[{include:"#stringcontent"}]},string:{begin:'"',beginCaptures:{0:{name:"punctuation.definition.string.begin.json.comments"}},end:'"',endCaptures:{0:{name:"punctuation.definition.string.end.json.comments"}},name:"string.quoted.double.json.comments",patterns:[{include:"#stringcontent"}]},stringcontent:{patterns:[{match:'\\\\(?:["\\\\/bfnrt]|u[0-9a-fA-F]{4})',name:"constant.character.escape.json.comments"},{match:"\\\\.",name:"invalid.illegal.unrecognized-string-escape.json.comments"}]},value:{patterns:[{include:"#constant"},{include:"#number"},{include:"#string"},{include:"#array"},{include:"#object"},{include:"#comments"}]}},scopeName:"source.json.comments"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/9236.59403c81a11d7023.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9236],{19236:function(e,n,t){t.r(n),t.d(n,{default:function(){return a}});var a=[Object.freeze({displayName:"Tasl",fileTypes:["tasl"],name:"tasl",patterns:[{include:"#comment"},{include:"#namespace"},{include:"#type"},{include:"#class"},{include:"#edge"}],repository:{class:{begin:"(?:^\\s*)(class)\\b",beginCaptures:{1:{name:"keyword.control.tasl.class"}},end:"$",patterns:[{include:"#key"},{include:"#export"},{include:"#expression"}]},comment:{captures:{1:{name:"punctuation.definition.comment.tasl"}},match:"(#).*$",name:"comment.line.number-sign.tasl"},component:{begin:"->",beginCaptures:{0:{name:"punctuation.separator.tasl.component"}},end:"$",patterns:[{include:"#expression"}]},coproduct:{begin:"\\[",beginCaptures:{0:{name:"punctuation.definition.block.tasl.coproduct"}},end:"\\]",endCaptures:{0:{name:"punctuation.definition.block.tasl.coproduct"}},patterns:[{include:"#comment"},{include:"#term"},{include:"#option"}]},datatype:{match:"[a-zA-Z][a-zA-Z0-9]*:(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})+",name:"string.regexp"},edge:{begin:"(?:^\\s*)(edge)\\b",beginCaptures:{1:{name:"keyword.control.tasl.edge"}},end:"$",patterns:[{include:"#key"},{include:"#export"},{match:"=/",name:"punctuation.separator.tasl.edge.source"},{match:"/=>",name:"punctuation.separator.tasl.edge.target"},{match:"=>",name:"punctuation.separator.tasl.edge"},{include:"#expression"}]},export:{match:"::",name:"keyword.operator.tasl.export"},expression:{patterns:[{include:"#literal"},{include:"#uri"},{include:"#product"},{include:"#coproduct"},{include:"#reference"},{include:"#optional"},{include:"#identifier"}]},identifier:{captures:{1:{name:"variable"}},match:"([a-zA-Z][a-zA-Z0-9]*)\\b"},key:{match:"[a-zA-Z][a-zA-Z0-9]*:(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})+",name:"markup.bold entity.name.class"},literal:{patterns:[{include:"#datatype"}]},namespace:{captures:{1:{name:"keyword.control.tasl.namespace"},2:{patterns:[{include:"#namespaceURI"},{match:"[a-zA-Z][a-zA-Z0-9]*\\b",name:"entity.name"}]}},match:"(?:^\\s*)(namespace)\\b(.*)"},namespaceURI:{match:"[a-z]+:[a-zA-Z0-9-._~:\\/?#\\[\\]@!$&'()*+,;%=]+",name:"markup.underline.link"},option:{begin:"<-",beginCaptures:{0:{name:"punctuation.separator.tasl.option"}},end:"$",patterns:[{include:"#expression"}]},optional:{begin:"\\?",beginCaptures:{0:{name:"keyword.operator"}},end:"$",patterns:[{include:"#expression"}]},product:{begin:"{",beginCaptures:{0:{name:"punctuation.definition.block.tasl.product"}},end:"}",endCaptures:{0:{name:"punctuation.definition.block.tasl.product"}},patterns:[{include:"#comment"},{include:"#term"},{include:"#component"}]},reference:{captures:{1:{name:"markup.bold keyword.operator"},2:{patterns:[{include:"#key"}]}},match:"(\\*)\\s*(.*)"},term:{match:"[a-zA-Z][a-zA-Z0-9]*:(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})+",name:"entity.other.tasl.key"},type:{begin:"(?:^\\s*)(type)\\b",beginCaptures:{1:{name:"keyword.control.tasl.type"}},end:"$",patterns:[{include:"#expression"}]},uri:{match:"<>",name:"variable.other.constant"}},scopeName:"source.tasl"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/9286.532ed4d4f72c5205.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9286],{9286:function(e,t,n){n.r(t),n.d(t,{default:function(){return a}});var a=[Object.freeze({displayName:"dotEnv",name:"dotenv",patterns:[{captures:{1:{patterns:[{include:"#line-comment"}]}},comment:"Full Line Comment",match:"^\\s?(#.*$)\\n"},{captures:{1:{patterns:[{include:"#key"}]},2:{name:"keyword.operator.assignment.dotenv"},3:{name:"property.value.dotenv",patterns:[{include:"#line-comment"},{include:"#double-quoted-string"},{include:"#single-quoted-string"},{include:"#interpolation"}]}},comment:"ENV entry",match:"^\\s?(.*?)\\s?(=)(.*)$"}],repository:{"double-quoted-string":{captures:{1:{patterns:[{include:"#interpolation"},{include:"#escape-characters"}]}},comment:"Double Quoted String",match:'"(.*)"',name:"string.quoted.double.dotenv"},"escape-characters":{comment:"Escape characters",match:"\\\\[nrtfb\"'\\\\]|\\\\u[0123456789ABCDEF]{4}",name:"constant.character.escape.dotenv"},interpolation:{captures:{1:{name:"keyword.interpolation.begin.dotenv"},2:{name:"variable.interpolation.dotenv"},3:{name:"keyword.interpolation.end.dotenv"}},comment:"Interpolation (variable substitution)",match:"(\\$\\{)(.*)(\\})"},key:{captures:{1:{name:"keyword.key.export.dotenv"},2:{name:"variable.key.dotenv",patterns:[{include:"#variable"}]}},comment:"Key",match:"(export\\s)?(.*)"},"line-comment":{comment:"Comment",match:"#.*$",name:"comment.line.dotenv"},"single-quoted-string":{comment:"Single Quoted String",match:"'(.*)'",name:"string.quoted.single.dotenv"},variable:{comment:"env variable",match:"[a-zA-Z_]+\\w*"}},scopeName:"source.dotenv"})]}}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/app/_not-found/page-f01e7c15f3882046.js:
--------------------------------------------------------------------------------
1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7409],{67589:function(e,t,n){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_not-found/page",function(){return n(35457)}])},35457:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return s}}),n(99920);let i=n(57437);n(2265);let o={fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},l={display:"inline-block"},r={display:"inline-block",margin:"0 20px 0 0",padding:"0 23px 0 0",fontSize:24,fontWeight:500,verticalAlign:"top",lineHeight:"49px"},d={fontSize:14,fontWeight:400,lineHeight:"49px",margin:0};function s(){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("title",{children:"404: This page could not be found."}),(0,i.jsx)("div",{style:o,children:(0,i.jsxs)("div",{children:[(0,i.jsx)("style",{dangerouslySetInnerHTML:{__html:"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}),(0,i.jsx)("h1",{className:"next-error-h1",style:r,children:"404"}),(0,i.jsx)("div",{style:l,children:(0,i.jsx)("h2",{style:d,children:"This page could not be found."})})]})})]})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}},function(e){e.O(0,[2971,7023,1744],function(){return e(e.s=67589)}),_N_E=e.O()}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/app/layout-5f3fbea6e5509db4.js:
--------------------------------------------------------------------------------
1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3185],{42864:function(e,n,t){Promise.resolve().then(t.t.bind(t,73247,23)),Promise.resolve().then(t.t.bind(t,58877,23))},58877:function(){},73247:function(e){e.exports={style:{fontFamily:"'__Inter_70ec37', '__Inter_Fallback_70ec37'",fontStyle:"normal"},className:"__className_70ec37"}}},function(e){e.O(0,[4569,2971,7023,1744],function(){return e(e.s=42864)}),_N_E=e.O()}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/main-app-b239df8585f488e7.js:
--------------------------------------------------------------------------------
1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1744],{69939:function(e,n,t){Promise.resolve().then(t.t.bind(t,95751,23)),Promise.resolve().then(t.t.bind(t,66513,23)),Promise.resolve().then(t.t.bind(t,76130,23)),Promise.resolve().then(t.t.bind(t,39275,23)),Promise.resolve().then(t.t.bind(t,16585,23)),Promise.resolve().then(t.t.bind(t,61343,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[2971,7023],function(){return n(11028),n(69939)}),_N_E=e.O()}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/pages/_app-f870474a17b7f2fd.js:
--------------------------------------------------------------------------------
1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2888],{41597:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_app",function(){return u(52239)}])}},function(n){var _=function(_){return n(n.s=_)};n.O(0,[9774,179],function(){return _(41597),_(26036)}),_N_E=n.O()}]);
--------------------------------------------------------------------------------
/docs/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js:
--------------------------------------------------------------------------------
1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4820],{81981:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return u(83387)}])}},function(n){n.O(0,[2888,9774,179],function(){return n(n.s=81981)}),_N_E=n.O()}]);
--------------------------------------------------------------------------------
/docs/_next/static/media/26a46d62cd723877-s.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/_next/static/media/26a46d62cd723877-s.woff2
--------------------------------------------------------------------------------
/docs/_next/static/media/55c55f0601d81cf3-s.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/_next/static/media/55c55f0601d81cf3-s.woff2
--------------------------------------------------------------------------------
/docs/_next/static/media/581909926a08bbc8-s.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/_next/static/media/581909926a08bbc8-s.woff2
--------------------------------------------------------------------------------
/docs/_next/static/media/6d93bde91c0c2823-s.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/_next/static/media/6d93bde91c0c2823-s.woff2
--------------------------------------------------------------------------------
/docs/_next/static/media/97e0cb1ae144a2a9-s.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/_next/static/media/97e0cb1ae144a2a9-s.woff2
--------------------------------------------------------------------------------
/docs/_next/static/media/a34f9d1faa5f3315-s.p.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/_next/static/media/a34f9d1faa5f3315-s.p.woff2
--------------------------------------------------------------------------------
/docs/_next/static/media/df0a9ae256c0569c-s.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/_next/static/media/df0a9ae256c0569c-s.woff2
--------------------------------------------------------------------------------
/docs/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nshiab/simple-data-analysis-flow/880f5470743f780ae952f0ee0729aabc8202796e/docs/favicon.ico
--------------------------------------------------------------------------------
/lib/shiki.ts:
--------------------------------------------------------------------------------
1 | import {
2 | BundledLanguage,
3 | BundledTheme,
4 | createHighlighter,
5 | HighlighterGeneric,
6 | } from "shiki"
7 |
8 | let highlighter: HighlighterGeneric | null = null
9 | let creating = false
10 | let ready = false
11 | export default async function codeToHtml(code: string) {
12 | if (!highlighter && !creating && !ready) {
13 | creating = true
14 | highlighter = await createHighlighter({
15 | themes: ["slack-ochin"],
16 | langs: ["ts"],
17 | })
18 | ready = true
19 | }
20 | return (
21 | highlighter?.codeToHtml(code, { lang: "ts", theme: "slack-ochin" }) ?? ""
22 | )
23 | }
24 |
--------------------------------------------------------------------------------
/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { type ClassValue, clsx } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | output: "export",
4 | transpilePackages: ["shiki"],
5 | basePath: "/simple-data-analysis-flow",
6 | }
7 |
8 | export default nextConfig
9 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "simple-data-analysis-flow",
3 | "version": "0.3.0",
4 | "scripts": {
5 | "dev": "next dev",
6 | "build": "npm run format && rm -rf docs 2>/dev/null || true && next build && cp -R out docs && touch docs/.nojekyll",
7 | "start": "next start",
8 | "lint": "next lint",
9 | "check-format": "prettier --ignore-path .prettierignore --check .",
10 | "format": "prettier --ignore-path .prettierignore --write ."
11 | },
12 | "dependencies": {
13 | "@duckdb/duckdb-wasm": "1.28.1-dev258.0",
14 | "@radix-ui/react-accordion": "^1.2.0",
15 | "@radix-ui/react-checkbox": "^1.1.1",
16 | "@radix-ui/react-context-menu": "^2.2.1",
17 | "@radix-ui/react-label": "^2.1.0",
18 | "@radix-ui/react-menubar": "^1.1.1",
19 | "@radix-ui/react-select": "^2.1.1",
20 | "@radix-ui/react-separator": "^1.1.0",
21 | "@radix-ui/react-slot": "^1.1.0",
22 | "@xyflow/react": "^12.0.0",
23 | "class-variance-authority": "^0.7.0",
24 | "clsx": "^2.1.1",
25 | "i": "^0.3.7",
26 | "journalism": "^1.13.0",
27 | "lucide-react": "^0.406.0",
28 | "next": "14.2.4",
29 | "npm": "^10.8.1",
30 | "react": "^18",
31 | "react-dom": "^18",
32 | "simple-data-analysis": "^3.8.10",
33 | "tailwind-merge": "^2.4.0",
34 | "tailwindcss-animate": "^1.0.7"
35 | },
36 | "devDependencies": {
37 | "@types/node": "^20",
38 | "@types/react": "^18",
39 | "@types/react-dom": "^18",
40 | "eslint": "^8",
41 | "eslint-config-next": "14.2.4",
42 | "postcss": "^8",
43 | "prettier": "^3.3.3",
44 | "shiki": "^1.10.3",
45 | "tailwindcss": "^3.4.1",
46 | "typescript": "^5"
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | tailwindcss: {},
5 | },
6 | }
7 |
8 | export default config
9 |
--------------------------------------------------------------------------------
/tailwind.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "tailwindcss"
2 |
3 | const config = {
4 | darkMode: ["class"],
5 | content: [
6 | "./pages/**/*.{ts,tsx}",
7 | "./components/**/*.{ts,tsx}",
8 | "./app/**/*.{ts,tsx}",
9 | "./src/**/*.{ts,tsx}",
10 | ],
11 | prefix: "",
12 | theme: {
13 | container: {
14 | center: true,
15 | padding: "2rem",
16 | screens: {
17 | "2xl": "1400px",
18 | },
19 | },
20 | extend: {
21 | colors: {
22 | border: "hsl(var(--border))",
23 | input: "hsl(var(--input))",
24 | ring: "hsl(var(--ring))",
25 | background: "hsl(var(--background))",
26 | foreground: "hsl(var(--foreground))",
27 | primary: {
28 | DEFAULT: "hsl(var(--primary))",
29 | foreground: "hsl(var(--primary-foreground))",
30 | },
31 | secondary: {
32 | DEFAULT: "hsl(var(--secondary))",
33 | foreground: "hsl(var(--secondary-foreground))",
34 | },
35 | destructive: {
36 | DEFAULT: "hsl(var(--destructive))",
37 | foreground: "hsl(var(--destructive-foreground))",
38 | },
39 | muted: {
40 | DEFAULT: "hsl(var(--muted))",
41 | foreground: "hsl(var(--muted-foreground))",
42 | },
43 | accent: {
44 | DEFAULT: "hsl(var(--accent))",
45 | foreground: "hsl(var(--accent-foreground))",
46 | },
47 | popover: {
48 | DEFAULT: "hsl(var(--popover))",
49 | foreground: "hsl(var(--popover-foreground))",
50 | },
51 | card: {
52 | DEFAULT: "hsl(var(--card))",
53 | foreground: "hsl(var(--card-foreground))",
54 | },
55 | },
56 | borderRadius: {
57 | lg: "var(--radius)",
58 | md: "calc(var(--radius) - 2px)",
59 | sm: "calc(var(--radius) - 4px)",
60 | },
61 | keyframes: {
62 | "accordion-down": {
63 | from: { height: "0" },
64 | to: { height: "var(--radix-accordion-content-height)" },
65 | },
66 | "accordion-up": {
67 | from: { height: "var(--radix-accordion-content-height)" },
68 | to: { height: "0" },
69 | },
70 | },
71 | animation: {
72 | "accordion-down": "accordion-down 0.2s ease-out",
73 | "accordion-up": "accordion-up 0.2s ease-out",
74 | },
75 | },
76 | },
77 | plugins: [require("tailwindcss-animate")],
78 | } satisfies Config
79 |
80 | export default config
81 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": ["dom", "dom.iterable", "esnext"],
4 | "allowJs": true,
5 | "skipLibCheck": true,
6 | "strict": true,
7 | "noEmit": true,
8 | "esModuleInterop": true,
9 | "module": "esnext",
10 | "moduleResolution": "bundler",
11 | "resolveJsonModule": true,
12 | "isolatedModules": true,
13 | "jsx": "preserve",
14 | "incremental": true,
15 | "plugins": [
16 | {
17 | "name": "next"
18 | }
19 | ],
20 | "paths": {
21 | "@/*": ["./*"]
22 | }
23 | },
24 | "include": [
25 | "next-env.d.ts",
26 | "**/*.ts",
27 | "**/*.tsx",
28 | ".next/types/**/*.ts",
29 | "docs/types/**/*.ts"
30 | ],
31 | "exclude": ["node_modules"]
32 | }
33 |
--------------------------------------------------------------------------------