From 4ee00ed869d4c46faa8a646c3d58ca987c4b9793 Mon Sep 17 00:00:00 2001 From: ThinLiquid Date: Tue, 17 Oct 2023 23:46:58 +0100 Subject: [PATCH 01/10] =?UTF-8?q?[=F0=9F=8D=B1]=20Added=20info=20app=20ico?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/icons/info.png | Bin 0 -> 34401 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/assets/icons/info.png diff --git a/src/assets/icons/info.png b/src/assets/icons/info.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfc5073be2724549a691afc0efbe25a3bf1b073 GIT binary patch literal 34401 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Π<1sPkyK! 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 bp)fyW;cTM)?1$ul190J-k?y-Q_`ClLJEgPp literal 0 HcmV?d00001 From e1bc359f2455c8c37f294f2cf4290baef7c1f583 Mon Sep 17 00:00:00 2001 From: ThinLiquid Date: Wed, 18 Oct 2023 00:00:36 +0100 Subject: [PATCH 02/10] =?UTF-8?q?[=F0=9F=93=A6]=20Added=20vite=20serve...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 494ea71..80e7317 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "test": "ts-standard", "dev": "vite", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "serve": "vite serve" }, "keywords": [], "author": "", From f2229b4f54c21503c07050462cf9004b874b1152 Mon Sep 17 00:00:00 2001 From: ThinLiquid Date: Wed, 18 Oct 2023 00:18:42 +0100 Subject: [PATCH 03/10] =?UTF-8?q?[=F0=9F=93=A6]=20Changed=20to=20vite=20de?= =?UTF-8?q?v?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 80e7317..681f14b 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dev": "vite", "build": "vite build", "preview": "vite preview", - "serve": "vite serve" + "serve": "vite dev" }, "keywords": [], "author": "", From aba3cc85eb44af08d7cd8609e3709dbaac4895d9 Mon Sep 17 00:00:00 2001 From: RisingGlitch Date: Tue, 17 Oct 2023 17:44:22 -0700 Subject: [PATCH 04/10] Commits --- src/apps/editor.ts | 3 ++- src/apps/files.ts | 3 ++- src/apps/info.ts | 60 ++++++++++++++++++++++++++++++++++++++++++++ src/apps/music.ts | 5 +++- src/apps/settings.ts | 3 ++- src/flow.ts | 4 ++- src/types.ts | 2 ++ src/wm.ts | 13 +++++++--- 8 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 src/apps/info.ts diff --git a/src/apps/editor.ts b/src/apps/editor.ts index 5d3a846..9625f38 100644 --- a/src/apps/editor.ts +++ b/src/apps/editor.ts @@ -30,7 +30,8 @@ export default class EditorApp implements App { title: this.name, icon, width: 500, - height: 400 + height: 400, + canResize: true }) if (data != null) { diff --git a/src/apps/files.ts b/src/apps/files.ts index 69ba2ff..eca41e9 100644 --- a/src/apps/files.ts +++ b/src/apps/files.ts @@ -17,7 +17,8 @@ export default class FilesApp implements App { title: this.name, icon, width: 500, - height: 400 + height: 400, + canResize: true }) win.content.style.display = 'flex' diff --git a/src/apps/info.ts b/src/apps/info.ts new file mode 100644 index 0000000..35b9d28 --- /dev/null +++ b/src/apps/info.ts @@ -0,0 +1,60 @@ +import icon from '../assets/icons/settings.png' +import { App } from '../types.ts' +import { FlowWindow } from '../wm.ts' + +export default class SettingsApp implements App { + name = 'Info' + pkg = 'flow.info' + icon = icon + version = '1.0.0' + canResize = true + + async open (): Promise { + const win = window.wm.createWindow({ + title: this.name, + icon, + width: 300, + height: 400, + canResize: false + }) + + win.content.style.padding = '10px' + win.content.innerHTML = ` +

FlowOS

+

v2.0

+ +

Created by ThinLiquid, 1nspird_, Proudparot2, Systemless_

+ + Discord + + Github + + + ` + + return win + } +} diff --git a/src/apps/music.ts b/src/apps/music.ts index a93abee..f31ad2b 100644 --- a/src/apps/music.ts +++ b/src/apps/music.ts @@ -11,7 +11,10 @@ export default class MusicApp implements App { async open (): Promise { const win = window.wm.createWindow({ title: this.name, - icon + icon, + width: 700, + height: 300, + canResize: true }) win.content.innerHTML = 'hi' diff --git a/src/apps/settings.ts b/src/apps/settings.ts index 04567db..3354c83 100644 --- a/src/apps/settings.ts +++ b/src/apps/settings.ts @@ -13,7 +13,8 @@ export default class SettingsApp implements App { title: this.name, icon, width: 700, - height: 300 + height: 300, + canResize: true }) win.content.style.padding = '10px' diff --git a/src/flow.ts b/src/flow.ts index 5be8f64..bf53e0c 100644 --- a/src/flow.ts +++ b/src/flow.ts @@ -4,13 +4,15 @@ import SettingsApp from './apps/settings.ts' import FilesApp from './apps/files.ts' import MusicApp from './apps/music.ts' import EditorApp from './apps/editor.ts' +import InfoApp from './apps/info.ts' const flow: Flow = { apps: { 'flow.settings': new SettingsApp(), 'flow.music': new MusicApp(), 'flow.files': new FilesApp(), - 'flow.editor': new EditorApp() + 'flow.editor': new EditorApp(), + 'flow.info': new InfoApp() }, async openApp (pkg: string, data: any) { const win = this.apps[pkg].open(data) diff --git a/src/types.ts b/src/types.ts index d6748be..71f5f9c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -40,6 +40,8 @@ export interface FlowWindowConfig { width?: number height?: number + canResize: boolean + minWidth?: number minHeight?: number } diff --git a/src/wm.ts b/src/wm.ts index 4e97706..8afb7a6 100644 --- a/src/wm.ts +++ b/src/wm.ts @@ -93,13 +93,20 @@ export class FlowWindow { this.element.style.height = `${config.height ?? 200}px` this.header = document.createElement('window-header') - this.header.innerHTML = `
${config.title}
`; + this.header.innerHTML = `
${config.title}
` + if (config.canResize) { + this.header.innerHTML = `
${config.title}
` + } + (this.header.querySelector('#close') as HTMLElement).onclick = () => { this.close() } - (this.header.querySelector('#min') as HTMLElement).onclick = () => this.toggleMin(); - (this.header.querySelector('#max') as HTMLElement).onclick = () => this.toggleMax() + (this.header.querySelector('#min') as HTMLElement).onclick = () => this.toggleMin() + + if (config.canResize) { + (this.header.querySelector('#max') as HTMLElement).onclick = () => this.toggleMax() + } this.content = document.createElement('window-content') From dc0ea072262287ec7c7c570713e0e21e0182cd2f Mon Sep 17 00:00:00 2001 From: ThinLiquid Date: Wed, 18 Oct 2023 01:57:16 +0100 Subject: [PATCH 05/10] =?UTF-8?q?[=E2=9C=A8]=20Added=20preloader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 20 ++++++++++++++++---- src/preloader.ts | 39 +++++++++++++++++++++++++++++++++++++++ src/statusbar.ts | 42 ++++++++++++++++++++++++++---------------- src/style.less | 25 +++++++++++++++++++++++++ src/wm.ts | 14 ++++++++++---- tsconfig.json | 2 +- 6 files changed, 117 insertions(+), 25 deletions(-) create mode 100644 src/preloader.ts diff --git a/src/index.ts b/src/index.ts index 24f0676..40f3993 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ import './style.less' +import Preloader from './preloader' import StatusBar from './statusbar' import WM from './wm' @@ -7,16 +8,13 @@ import * as fs from 'fs' declare global { interface Window { + preloader: Preloader statusBar: StatusBar wm: WM fs: typeof fs } } -window.statusBar = new StatusBar() -window.wm = new WM() -window.fs = new (window as any).Filer.FileSystem() - const params = new URLSearchParams(window.location.search) async function enableDebug (): Promise { @@ -28,3 +26,17 @@ async function enableDebug (): Promise { if (params.get('debug') !== null && params.get('debug') !== undefined) { enableDebug().catch(e => console.error(e)) } + +window.preloader = new Preloader() +window.statusBar = new StatusBar() +window.wm = new WM() + +window.preloader.setPending('filesystem') +window.fs = new (window as any).Filer.FileSystem() +await window.preloader.setDone('filesystem') + +await window.statusBar.init() +await window.wm.init() + +window.preloader.setStatus('') +window.preloader.finish() diff --git a/src/preloader.ts b/src/preloader.ts new file mode 100644 index 0000000..200a246 --- /dev/null +++ b/src/preloader.ts @@ -0,0 +1,39 @@ +import flowIcon from './assets/flow.png' + +class Preloader { + element: HTMLElement + + constructor () { + this.element = document.createElement('preloader') + + this.element.innerHTML = ` + +
+
+ ` + + document.body.appendChild(this.element) + } + + setStatus (value: string): void { + (this.element.querySelector('.status') as HTMLElement).innerText = value + } + + setPending (value: string): void { + (this.element.querySelector('.done') as HTMLElement).innerHTML += `
${value}
` + } + + async setDone (value: string): Promise { + const icon = this.element.querySelector('.done')?.querySelector(`.${value.split(' ').join('-')}`)?.querySelector('.icon') + icon?.classList.remove('bx-minus') + icon?.classList.add('bx-check') + await new Promise(resolve => setTimeout(resolve, 300)) + } + + finish (): void { + this.element.style.opacity = '0' + this.element.style.pointerEvents = 'none' + } +} + +export default Preloader diff --git a/src/statusbar.ts b/src/statusbar.ts index 5111cfc..6f6ed86 100644 --- a/src/statusbar.ts +++ b/src/statusbar.ts @@ -1,31 +1,27 @@ -import * as clock from './modules/clock.ts' -import * as switcher from './modules/switcher.ts' -import * as appView from './modules/appLauncher.ts' -import * as apps from './modules/apps.ts' -import * as weather from './modules/weather.ts' -import * as battery from './modules/battery.ts' import { StatusItem } from './types' class StatusBar { - items: StatusItem[] = [] + pluginList: string[] = [ + './modules/appLauncher.ts', + './modules/apps.ts', + './modules/weather.ts', + './modules/clock.ts', + './modules/switcher.ts', + './modules/battery.ts' + ] + + plugins: StatusItem[] = [] element: HTMLElement constructor () { this.element = document.createElement('toolbar') document.body.appendChild(this.element) - - this.add(appView) - this.add(apps) - this.add(weather) - this.add(clock) - this.add(switcher) - this.add(battery) } add (item: StatusItem): void { - if (this.items.some(x => x.meta.id === item.meta.id)) { + if (this.plugins.some(x => x.meta.id === item.meta.id)) { console.error(`Unable to register tool; ${item.meta.id} is already registered.`) return } @@ -33,11 +29,25 @@ class StatusBar { const element = document.createElement('div') element.setAttribute('data-toolbar-id', item.meta.id) - this.items.push(item) + this.plugins.push(item) this.element.appendChild(element) item.run(element) } + + async init (): Promise { + window.preloader.setPending('plugins') + window.preloader.setStatus('importing default plugins...') + + for (const pluginPath of this.pluginList) { + const plugin = await import(pluginPath) + + window.preloader.setStatus(`importing default plugins\n${pluginPath}`) + this.add(plugin) + } + + await window.preloader.setDone('plugins') + } } export default StatusBar diff --git a/src/style.less b/src/style.less index 9efce8c..1f5a4e3 100644 --- a/src/style.less +++ b/src/style.less @@ -185,3 +185,28 @@ launcher { } } } + +preloader { + position: absolute; + z-index: 999999999999999999; + top: 0; + left: 0; + background: var(--crust); + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + transition: opacity 1s; + + .status, .done { + text-align: center; + } + + .done div { + display: flex; + align-items: center; + gap: 2px; + } +} \ No newline at end of file diff --git a/src/wm.ts b/src/wm.ts index d7da6a4..0fc83f3 100644 --- a/src/wm.ts +++ b/src/wm.ts @@ -173,9 +173,6 @@ class WM { constructor () { this.windowArea = document.createElement('window-area') - this.launcher = document.createElement('launcher') - - this.init() } getHighestZIndex (): number { @@ -210,7 +207,11 @@ class WM { return this.isLauncherOpen } - private init (): void { + async init (): Promise { + window.preloader.setPending('window manager') + window.preloader.setStatus('creating app launcher...') + this.launcher = document.createElement('launcher') + this.launcher.innerHTML = ` @@ -230,7 +231,10 @@ class WM { this.launcher.style.filter = 'blur(0px)' this.launcher.style.pointerEvents = 'none' + window.preloader.setStatus('adding apps to app launcher...') + for (const pkg in flow.apps) { + window.preloader.setStatus(`adding apps to app launcher\n${flow.apps[pkg].name}`) const app = document.createElement('app') app.onclick = () => { flow.openApp(pkg) @@ -242,6 +246,8 @@ class WM { document.body.appendChild(this.windowArea) document.body.appendChild(this.launcher) + + await window.preloader.setDone('window manager') } } diff --git a/tsconfig.json b/tsconfig.json index 8b317be..a2d9131 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "outDir": "./dist/", "sourceMap": true, "noImplicitAny": true, - "module": "CommonJS", + "module": "ES2022", "target": "ESNext", "jsx": "react", "jsxFactory": "h", From 1b9595b923d4ef72da441834cad0324894fe6d83 Mon Sep 17 00:00:00 2001 From: ThinLiquid Date: Wed, 18 Oct 2023 02:02:28 +0100 Subject: [PATCH 06/10] =?UTF-8?q?[=F0=9F=9A=91]=20Removed=20top-level=20aw?= =?UTF-8?q?aits?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/index.ts b/src/index.ts index 40f3993..312bb1c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,14 +29,16 @@ if (params.get('debug') !== null && params.get('debug') !== undefined) { window.preloader = new Preloader() window.statusBar = new StatusBar() -window.wm = new WM() +window.wm = new WM(); -window.preloader.setPending('filesystem') -window.fs = new (window as any).Filer.FileSystem() -await window.preloader.setDone('filesystem') +(async function () { + window.preloader.setPending('filesystem') + window.fs = new (window as any).Filer.FileSystem() + await window.preloader.setDone('filesystem') -await window.statusBar.init() -await window.wm.init() + await window.statusBar.init() + await window.wm.init() -window.preloader.setStatus('') -window.preloader.finish() + window.preloader.setStatus('') + window.preloader.finish() +})().catch(e => console.error) From df2be116a56dee9816d402ebec80be413991b80d Mon Sep 17 00:00:00 2001 From: RisingGlitch Date: Tue, 17 Oct 2023 18:18:34 -0700 Subject: [PATCH 07/10] =?UTF-8?q?[=E2=9C=A8]=20Added=20CanResize=20option?= =?UTF-8?q?=20to=20vm,=20and=20added=20info=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apps/info.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/info.ts b/src/apps/info.ts index 35b9d28..7ed97ad 100644 --- a/src/apps/info.ts +++ b/src/apps/info.ts @@ -1,4 +1,4 @@ -import icon from '../assets/icons/settings.png' +import icon from '../assets/icons/info.png' import { App } from '../types.ts' import { FlowWindow } from '../wm.ts' @@ -45,12 +45,12 @@ export default class SettingsApp implements App { .github { float:right; position: relative; - top: 80px; + top: 125px; } .discord { float:left; position: relative; - top: 80px; + top: 125px; } ` From cc91d9e9aff01f737bff5ec769ee27bc8cf0d961 Mon Sep 17 00:00:00 2001 From: ThinLiquid Date: Wed, 18 Oct 2023 02:19:19 +0100 Subject: [PATCH 08/10] =?UTF-8?q?[=E2=9A=A1]=20Improve=20info=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apps/info.ts | 50 ++++++++++++++++-------------------------------- src/files.d.ts | 1 + src/types.ts | 4 ++++ 3 files changed, 21 insertions(+), 34 deletions(-) diff --git a/src/apps/info.ts b/src/apps/info.ts index 7ed97ad..2e69b75 100644 --- a/src/apps/info.ts +++ b/src/apps/info.ts @@ -1,5 +1,5 @@ import icon from '../assets/icons/info.png' -import { App } from '../types.ts' +import { App, PackageJSON } from '../types.ts' import { FlowWindow } from '../wm.ts' export default class SettingsApp implements App { @@ -10,6 +10,7 @@ export default class SettingsApp implements App { canResize = true async open (): Promise { + const packageJSON: PackageJSON = await import('../../package.json') const win = window.wm.createWindow({ title: this.name, icon, @@ -19,40 +20,21 @@ export default class SettingsApp implements App { }) win.content.style.padding = '10px' + win.content.style.textAlign = 'center' + win.content.style.display = 'flex' + win.content.style.flexDirection = 'column' + win.content.style.justifyContent = 'center' + win.content.style.alignItems = 'center' win.content.innerHTML = ` -

FlowOS

-

v2.0

- -

Created by ThinLiquid, 1nspird_, Proudparot2, Systemless_

- - Discord - - Github - - +
+

FlowOS

+

v${packageJSON.version}

+
+

Created by ThinLiquid, 1nspird_, proudparot2, systemless_

+ Discord + - + Github +
` return win diff --git a/src/files.d.ts b/src/files.d.ts index 31dca6b..5d25086 100644 --- a/src/files.d.ts +++ b/src/files.d.ts @@ -1 +1,2 @@ declare module '*.png' +declare module '*.json' diff --git a/src/types.ts b/src/types.ts index 71f5f9c..f978b3b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -9,6 +9,10 @@ export interface StatusItem { run: Function } +export interface PackageJSON { + version: string +} + export interface App { name: string pkg: string From f3327d75cd3601cea71a06abdebd60b429965a69 Mon Sep 17 00:00:00 2001 From: ThinLiquid Date: Wed, 18 Oct 2023 02:20:15 +0100 Subject: [PATCH 09/10] =?UTF-8?q?[=E2=9A=A1]=20Make=20gradient=20match=20t?= =?UTF-8?q?heming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/style.less | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/style.less b/src/style.less index 1f5a4e3..ae5aa87 100644 --- a/src/style.less +++ b/src/style.less @@ -11,10 +11,6 @@ --crust: #11111b; } -.bx-category { - color: #181926; -} - body, html { background-color: var(--crust); @@ -55,10 +51,9 @@ toolbar { justify-content: center; div[data-toolbar-id="appview"] { - background: rgb(150, 181, 246); - background: linear-gradient(45deg, rgba(150, 181, 246, 1) 0%, rgba(150, 181, 246, 1) 12%, rgba(77, 129, 236, 1) 100%); - color: black; + background: linear-gradient(45deg, var(--crust), var(--surface-0)); } + & > div { background: var(--base); padding: 5px; From 7702f2728ef7568b0873460956044f9fe6d0b522 Mon Sep 17 00:00:00 2001 From: ThinLiquid Date: Wed, 18 Oct 2023 02:27:17 +0100 Subject: [PATCH 10/10] =?UTF-8?q?[=F0=9F=9A=91]=20Fixed=20plugins=20not=20?= =?UTF-8?q?loading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 19 +++++++++++++++++++ package.json | 1 + src/statusbar.ts | 14 +++++++------- vite.config.js | 4 +++- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2667fe3..f529086 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "ts-standard": "^12.0.2", "typescript": "^5.2.2", "vite": "^4.4.11", + "vite-plugin-dynamic-import": "^1.5.0", "vite-plugin-node-polyfills": "^0.15.0" } }, @@ -1927,6 +1928,12 @@ "safe-array-concat": "^1.0.1" } }, + "node_modules/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true + }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -5930,6 +5937,18 @@ } } }, + "node_modules/vite-plugin-dynamic-import": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.5.0.tgz", + "integrity": "sha512-Qp85c+AVJmLa8MLni74U4BDiWpUeFNx7NJqbGZyR2XJOU7mgW0cb7nwlAMucFyM4arEd92Nfxp4j44xPi6Fu7g==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2", + "es-module-lexer": "^1.2.1", + "fast-glob": "^3.2.12", + "magic-string": "^0.30.1" + } + }, "node_modules/vite-plugin-node-polyfills": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.15.0.tgz", diff --git a/package.json b/package.json index 681f14b..d62f652 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "ts-standard": "^12.0.2", "typescript": "^5.2.2", "vite": "^4.4.11", + "vite-plugin-dynamic-import": "^1.5.0", "vite-plugin-node-polyfills": "^0.15.0" }, "dependencies": { diff --git a/src/statusbar.ts b/src/statusbar.ts index 6f6ed86..74a2146 100644 --- a/src/statusbar.ts +++ b/src/statusbar.ts @@ -3,12 +3,12 @@ import { StatusItem } from './types' class StatusBar { pluginList: string[] = [ - './modules/appLauncher.ts', - './modules/apps.ts', - './modules/weather.ts', - './modules/clock.ts', - './modules/switcher.ts', - './modules/battery.ts' + 'appLauncher', + 'apps', + 'weather', + 'clock', + 'switcher', + 'battery' ] plugins: StatusItem[] = [] @@ -40,7 +40,7 @@ class StatusBar { window.preloader.setStatus('importing default plugins...') for (const pluginPath of this.pluginList) { - const plugin = await import(pluginPath) + const plugin = await import(`./modules/${pluginPath}.ts`) window.preloader.setStatus(`importing default plugins\n${pluginPath}`) this.add(plugin) diff --git a/vite.config.js b/vite.config.js index ff70d3f..ed22f22 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,8 +1,10 @@ import { defineConfig } from 'vite' import { nodePolyfills } from 'vite-plugin-node-polyfills' +import dynamicImport from 'vite-plugin-dynamic-import' export default defineConfig({ plugins: [ - nodePolyfills() + nodePolyfills(), + dynamicImport() ] })