# HG changeset patch # User drewp@bigasterisk.com # Date 2023-06-08 21:54:26 # Node ID 9d47c44d4ae4fbdd7543a3f73ce13b2dcecc86d1 # Parent 86e569fa59c7c151fde3ae0c69b63b4a5f352edf experimental tiled-layout home page diff --git a/light9/web/TiledHome.ts b/light9/web/TiledHome.ts new file mode 100644 --- /dev/null +++ b/light9/web/TiledHome.ts @@ -0,0 +1,49 @@ +import * as React from "react"; +import { createRoot } from "react-dom/client"; +import * as FlexLayout from "flexlayout-react"; +export { Light9DeviceSettings } from "./live/Light9DeviceSettings"; +export { Light9CollectorUi } from "./collector/Light9CollectorUi"; + +const config:FlexLayout.IJsonModel = { + global: {}, + borders: [], + layout: { + type: "row", + weight: 100, + children: [ + { + type: "tabset", + weight: 50, + children: [{ type: "tab", name: "devsettings", component: "light9-device-settings" }], + }, + { + type: "tabset", + weight: 50, + children: [{ type: "tab", name: "collector", component: "light9-collector-ui" }], + }, + ], + }, +}; + +const e = React.createElement; + +// see https://github.com/lit/lit/tree/main/packages/labs/react + +class Main extends React.Component { + constructor(props) { + super(props); + this.state = { model: FlexLayout.Model.fromJson(config) }; + } + + factory = (node) => { + var component = node.getComponent(); + return e(component, null, ""); + }; + + render() { + return e(FlexLayout.Layout, { model: this.state.model, factory: this.factory }); + } +} + +const root = createRoot(document.getElementById("container")!); +root.render(React.createElement(Main)); diff --git a/light9/web/index.html b/light9/web/index.html --- a/light9/web/index.html +++ b/light9/web/index.html @@ -4,7 +4,10 @@ light9 home + + +
diff --git a/light9/web/style.css b/light9/web/style.css --- a/light9/web/style.css +++ b/light9/web/style.css @@ -1,9 +1,10 @@ body { background: black; color: white; + --color-background: black; + --color-text: white; font-family: sans-serif; } - h1 { margin: 0; } diff --git a/light9/web/vite.config.ts b/light9/web/vite.config.ts --- a/light9/web/vite.config.ts +++ b/light9/web/vite.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from "vite"; export default defineConfig({ base: "/", root: "./light9/web", - // publicDir: ".", + publicDir: "../../node_modules", server: { host: "0.0.0.0", strictPort: true, diff --git a/package.json b/package.json --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "async": "^3.2.4", "d3": "^7.8.4", "debug": "^4.3.4", + "flexlayout-react": "^0.7.7", "fpsmeter": "^0.3.1", "immutable": "^4.3.0", "knockout": "^3.5.1", @@ -32,6 +33,8 @@ "n3": "^1.16.4", "onecolor": "^4.0.0", "parse-prometheus-text-format": "^1.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", "reconnectingwebsocket": "^1.0.0", "sub-events": "^1.9.0", "sylvester": "^0.0.21", @@ -40,5 +43,9 @@ "vite": "^4.3.7", "vite-plugin-rewrite-all": "^1.0.1", "vitest": "^0.31.1" + }, + "devDependencies": { + "@types/react": "^18.2.9", + "@types/react-dom": "^18.2.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,11 +12,14 @@ specifiers: '@types/fpsmeter': ^0.3.31 '@types/n3': ^1.10.4 '@types/node': ^20.2.0 + '@types/react': ^18.2.9 + '@types/react-dom': ^18.2.4 '@types/reconnectingwebsocket': ^1.0.7 '@types/underscore': ^1.11.4 async: ^3.2.4 d3: ^7.8.4 debug: ^4.3.4 + flexlayout-react: ^0.7.7 fpsmeter: ^0.3.1 immutable: ^4.3.0 knockout: ^3.5.1 @@ -24,6 +27,8 @@ specifiers: n3: ^1.16.4 onecolor: ^4.0.0 parse-prometheus-text-format: ^1.1.1 + react: ^18.2.0 + react-dom: ^18.2.0 reconnectingwebsocket: ^1.0.0 sub-events: ^1.9.0 sylvester: ^0.0.21 @@ -50,6 +55,7 @@ dependencies: async: 3.2.4 d3: 7.8.4 debug: 4.3.4 + flexlayout-react: 0.7.7_biqbaboplfbrettd7655fr4n2y fpsmeter: 0.3.1 immutable: 4.3.0 knockout: 3.5.1 @@ -57,6 +63,8 @@ dependencies: n3: 1.16.4 onecolor: 4.0.0 parse-prometheus-text-format: 1.1.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 reconnectingwebsocket: 1.0.0 sub-events: 1.9.0 sylvester: 0.0.21 @@ -66,6 +74,10 @@ dependencies: vite-plugin-rewrite-all: 1.0.1_vite@4.3.7 vitest: 0.31.1 +devDependencies: + '@types/react': 18.2.9 + '@types/react-dom': 18.2.4 + packages: /@esbuild/android-arm/0.17.19: @@ -871,10 +883,32 @@ packages: resolution: {integrity: sha512-3iD2jaCCziTx04uudpJKwe39QxXgSUnpxXSvRQjRvHPxFQfmfP4NXIm/NURVeNlTCc+ru4WqjYGTmpXrW9uMlw==} dev: false + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: true + + /@types/react-dom/18.2.4: + resolution: {integrity: sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==} + dependencies: + '@types/react': 18.2.9 + dev: true + + /@types/react/18.2.9: + resolution: {integrity: sha512-pL3JAesUkF7PEQGxh5XOwdXGV907te6m1/Qe1ERJLgomojS6Ne790QiA7GUl434JEkFA2aAaB6qJ5z4e1zJn/w==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + dev: true + /@types/reconnectingwebsocket/1.0.7: resolution: {integrity: sha512-17pnIZsGi9P8YNp7c0ueY2WEauSxDivuFeGuMuPPJMA3qk34CnFgBHGqkxgun3HUifEuwNr8cf+9rU7vSd8i5g==} dev: false + /@types/scheduler/0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + dev: true + /@types/trusted-types/2.0.3: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} dev: false @@ -1023,6 +1057,10 @@ packages: engines: {node: '>=0.8'} dev: false + /csstype/3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: true + /d3-array/3.2.3: resolution: {integrity: sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==} engines: {node: '>=12'} @@ -1356,6 +1394,16 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: false + /flexlayout-react/0.7.7_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-BOS+lueEBdLVsrB2Jekr/z4WIuerMhkDhYcT+3E56o/ZHz6xkmv8YEkB9qimrGxRt2uAnozzH5VPUnxXMQCu0Q==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + /fpsmeter/0.3.1: resolution: {integrity: sha512-i3zzNJwGkA+9WWIXpAtP0TCN64eO5VkKQgirYE7ZCVqyC3NfUPszU35R044fmSCjiMqefiBs5NiGKvD7lFJ87Q==} dev: false @@ -1397,6 +1445,10 @@ packages: engines: {node: '>= 0.8'} dev: false + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + /jsonc-parser/3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: false @@ -1436,6 +1488,13 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: false + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + /loupe/2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: @@ -1561,10 +1620,27 @@ packages: '@rdfjs/types': 1.1.0 dev: false + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + /react-is/17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: false + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + /readable-stream/4.4.0: resolution: {integrity: sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1599,6 +1675,12 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + /semver/7.5.1: resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} engines: {node: '>=10'}