@owdproject/core 3.4.0 → 4.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -13
- package/dist/dom/index.d.mts +65 -0
- package/dist/dom/index.d.ts +65 -0
- package/dist/dom/index.mjs +224 -0
- package/dist/events/index.d.mts +70 -0
- package/dist/events/index.d.ts +70 -0
- package/dist/events/index.mjs +3 -0
- package/dist/index.d.mts +73 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.mjs +115 -0
- package/dist/layout/index.d.mts +41 -0
- package/dist/layout/index.d.ts +41 -0
- package/dist/layout/index.mjs +64 -0
- package/dist/machines/index.d.mts +31 -0
- package/dist/machines/index.d.ts +31 -0
- package/dist/machines/index.mjs +2 -0
- package/dist/managers/index.d.mts +117 -0
- package/dist/managers/index.d.ts +117 -0
- package/dist/managers/index.mjs +6 -0
- package/dist/session/index.d.mts +57 -0
- package/dist/session/index.d.ts +57 -0
- package/dist/session/index.mjs +65 -0
- package/dist/shared/core.B0B0KfVK.mjs +865 -0
- package/dist/shared/core.B1XxB289.mjs +239 -0
- package/dist/shared/core.B3mp7ztE.mjs +237 -0
- package/dist/shared/core.BOvFdEVQ.d.ts +114 -0
- package/dist/shared/core.CsDFgGnX.mjs +40 -0
- package/dist/shared/core.Di1eFcr_.d.mts +114 -0
- package/dist/shared/core.Pd_Ogt4g.mjs +101 -0
- package/dist/shared/core.b3Xldzyu.mjs +29 -0
- package/dist/types/index.d.mts +266 -0
- package/dist/types/index.d.ts +266 -0
- package/dist/types/index.mjs +1 -0
- package/package.json +56 -112
- package/CHANGELOG.md +0 -98
- package/DESKTOP_KERNEL.md +0 -232
- package/MIGRATION_3.3.2.md +0 -23
- package/MIGRATION_3.4.md +0 -126
- package/PLAYGROUND.md +0 -91
- package/dist/module.d.mts +0 -13
- package/dist/module.json +0 -9
- package/dist/module.mjs +0 -254
- package/dist/types.d.mts +0 -7
- package/index.ts +0 -8
- package/kit/authoring.ts +0 -340
- package/kit/defineDesktopApp.ts +0 -56
- package/module.ts +0 -203
- package/runtime/components/Application/DesktopCoreApplicationRender.vue +0 -20
- package/runtime/components/Application/DesktopCoreApplicationWindowsRender.vue +0 -38
- package/runtime/components/background/DesktopCoreBackground.vue +0 -16
- package/runtime/components/core/DesktopCore.vue +0 -43
- package/runtime/components/time/DesktopCoreTime.vue +0 -56
- package/runtime/components/window/DesktopCoreWindow.vue +0 -215
- package/runtime/components/window/DesktopCoreWindowContent.vue +0 -28
- package/runtime/components/window/DesktopCoreWindowNav.vue +0 -66
- package/runtime/components/window/DesktopCoreWindowSnapHintsBase.vue +0 -74
- package/runtime/components/workspace/DesktopCoreWorkspaceEdgeHintsBase.vue +0 -84
- package/runtime/composables/useApplicationEntries.ts +0 -51
- package/runtime/composables/useApplicationManager.ts +0 -285
- package/runtime/composables/useBlockNonInputContextMenu.ts +0 -30
- package/runtime/composables/useDesktopConfig.ts +0 -8
- package/runtime/composables/useDesktopDialogs.ts +0 -16
- package/runtime/composables/useDesktopExtension.ts +0 -8
- package/runtime/composables/useDesktopManager.ts +0 -51
- package/runtime/composables/useDesktopManifest.ts +0 -17
- package/runtime/composables/useDesktopSession.ts +0 -27
- package/runtime/composables/useDesktopShellIdentity.ts +0 -99
- package/runtime/composables/useDesktopShellOptions.ts +0 -36
- package/runtime/composables/useDesktopShellReady.ts +0 -7
- package/runtime/composables/useDesktopWorkArea.ts +0 -93
- package/runtime/composables/useTerminalManager.ts +0 -159
- package/runtime/composables/useToggleWindowMaximize.ts +0 -35
- package/runtime/composables/useWindowDragHandlers.ts +0 -47
- package/runtime/composables/useWindowSnapDrop.ts +0 -112
- package/runtime/composables/useWorkspaceEdgeDrop.ts +0 -176
- package/runtime/composables/useWorkspaceManager.ts +0 -67
- package/runtime/composables/useWorkspaceOverviewCapture.ts +0 -92
- package/runtime/composables/useWorkspaceOverviewLiveScale.ts +0 -151
- package/runtime/constants/desktopShellKeys.ts +0 -12
- package/runtime/constants/shellLayout.ts +0 -5
- package/runtime/dialogs/desktopDialogProvider.ts +0 -73
- package/runtime/internal/controllers/ApplicationController.ts +0 -351
- package/runtime/internal/controllers/WindowController.ts +0 -547
- package/runtime/plugins/01.desktop-shell-init.client.ts +0 -28
- package/runtime/plugins/02.desktop-register-desktop-apps.client.ts +0 -13
- package/runtime/plugins/resize.client.ts +0 -6
- package/runtime/stores/storeApplicationMeta.ts +0 -60
- package/runtime/stores/storeApplicationWindows.ts +0 -21
- package/runtime/stores/storeDesktop.ts +0 -71
- package/runtime/stores/storeDesktopDefaultApps.ts +0 -54
- package/runtime/stores/storeDesktopVolume.ts +0 -19
- package/runtime/stores/storeDesktopWindow.ts +0 -38
- package/runtime/stores/storeDesktopWorkspace.ts +0 -105
- package/runtime/stores/storeIds.ts +0 -35
- package/runtime/types/desktopMenu.ts +0 -10
- package/runtime/utils/initDesktopShell.ts +0 -80
- package/runtime/utils/migratePersistedStoreIds.ts +0 -57
- package/runtime/utils/utilApp.ts +0 -25
- package/runtime/utils/utilCaptureElementToCanvas.ts +0 -21
- package/runtime/utils/utilCommon.ts +0 -26
- package/runtime/utils/utilDebug.ts +0 -30
- package/runtime/utils/utilDetectSnapZone.ts +0 -57
- package/runtime/utils/utilTerminal.ts +0 -6
- package/runtime/utils/utilWindowControllerAdapter.ts +0 -15
- package/runtime/utils/utilWindowLayout.ts +0 -82
- package/runtime/utils/utilWindowMaximizeLayout.ts +0 -44
- package/runtime/utils/utilWorkspaceWindows.ts +0 -33
- package/types/index.d.ts +0 -531
package/module.ts
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
defineNuxtModule,
|
|
3
|
-
createResolver,
|
|
4
|
-
addComponentsDir,
|
|
5
|
-
addImportsDir,
|
|
6
|
-
installModule,
|
|
7
|
-
addPlugin,
|
|
8
|
-
resolvePath
|
|
9
|
-
} from '@nuxt/kit'
|
|
10
|
-
import { defu } from 'defu'
|
|
11
|
-
import {
|
|
12
|
-
assertValidDesktopUserConfig,
|
|
13
|
-
installDesktopPackage,
|
|
14
|
-
resolveDesktopConfigPath,
|
|
15
|
-
warnDesktopConfigKeys,
|
|
16
|
-
warnLegacyDesktopConfig,
|
|
17
|
-
} from './kit/authoring'
|
|
18
|
-
import pkg from './package.json'
|
|
19
|
-
|
|
20
|
-
export default defineNuxtModule({
|
|
21
|
-
meta: {
|
|
22
|
-
name: 'desktop',
|
|
23
|
-
configKey: 'desktop',
|
|
24
|
-
},
|
|
25
|
-
defaults: {
|
|
26
|
-
theme: '@owdproject/theme-nova',
|
|
27
|
-
apps: [],
|
|
28
|
-
modules: [],
|
|
29
|
-
},
|
|
30
|
-
moduleDependencies: {
|
|
31
|
-
'@pinia/nuxt': {},
|
|
32
|
-
'@nuxt/fonts': {},
|
|
33
|
-
'@nuxt/icon': {
|
|
34
|
-
defaults: {
|
|
35
|
-
clientBundle: {
|
|
36
|
-
scan: true,
|
|
37
|
-
sizeLimitKb: 256,
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
'@vueuse/nuxt': {},
|
|
42
|
-
'@nuxtjs/i18n': {},
|
|
43
|
-
},
|
|
44
|
-
async setup(_options, _nuxt) {
|
|
45
|
-
const { resolve } = createResolver(import.meta.url)
|
|
46
|
-
|
|
47
|
-
let resolvedNanoid: string | null = null
|
|
48
|
-
try {
|
|
49
|
-
resolvedNanoid = await resolvePath('nanoid', { url: import.meta.url })
|
|
50
|
-
} catch (e) {
|
|
51
|
-
// ignore
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Required for Nuxt 4 dev (playgrounds, module graphs): avoids
|
|
55
|
-
// "Vite Node IPC socket path not configured" when using @nuxt/kit pipelines.
|
|
56
|
-
_nuxt.options.experimental = {
|
|
57
|
-
..._nuxt.options.experimental,
|
|
58
|
-
viteEnvironmentApi:
|
|
59
|
-
_nuxt.options.experimental?.viteEnvironmentApi ?? true,
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
_nuxt.options.runtimeConfig.public.desktop = {}
|
|
63
|
-
|
|
64
|
-
// get open web desktop config (desktop.config.ts; owd.config.ts legacy)
|
|
65
|
-
|
|
66
|
-
let clientConfig
|
|
67
|
-
|
|
68
|
-
const resolvedConfig = resolveDesktopConfigPath(_nuxt.options.rootDir)
|
|
69
|
-
|
|
70
|
-
if (!resolvedConfig) {
|
|
71
|
-
const hint =
|
|
72
|
-
'Create desktop.config.ts next to your Nuxt root (e.g. desktop/desktop.config.ts), export default defineDesktopConfig({ theme, apps, modules }).'
|
|
73
|
-
throw new Error(`[@owdproject/core] Cannot find desktop.config.ts in ${_nuxt.options.rootDir}. ${hint}`)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
warnLegacyDesktopConfig(resolvedConfig)
|
|
77
|
-
|
|
78
|
-
// Nuxt dev restart + ℹ log (same as nuxt.config.ts); avoid builder:watch + restart (silent / double).
|
|
79
|
-
_nuxt.options.watch ??= []
|
|
80
|
-
_nuxt.options.watch.push(resolvedConfig.path)
|
|
81
|
-
|
|
82
|
-
try {
|
|
83
|
-
clientConfig = (await import(resolvedConfig.path)).default
|
|
84
|
-
} catch (e) {
|
|
85
|
-
const hint =
|
|
86
|
-
'Export default defineDesktopConfig({ theme, apps, modules }) from desktop.config.ts.'
|
|
87
|
-
throw new Error(
|
|
88
|
-
`[@owdproject/core] Cannot load ${resolvedConfig.file}. ${hint}`,
|
|
89
|
-
{ cause: e },
|
|
90
|
-
)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
assertValidDesktopUserConfig(clientConfig, resolvedConfig.file)
|
|
94
|
-
|
|
95
|
-
if (!clientConfig.theme) {
|
|
96
|
-
clientConfig.theme = '@owdproject/theme-nova'
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const configRecord = clientConfig as Record<string, unknown>
|
|
100
|
-
warnDesktopConfigKeys(configRecord, resolvedConfig.file)
|
|
101
|
-
|
|
102
|
-
const desktop = defu(configRecord, { coreVersion: pkg.version }) as Record<
|
|
103
|
-
string,
|
|
104
|
-
unknown
|
|
105
|
-
> & {
|
|
106
|
-
theme?: string
|
|
107
|
-
apps?: string[]
|
|
108
|
-
modules?: string[]
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
_nuxt.options.runtimeConfig.public.desktop = desktop
|
|
112
|
-
|
|
113
|
-
{
|
|
114
|
-
if (desktop.theme) {
|
|
115
|
-
try {
|
|
116
|
-
await installDesktopPackage(_nuxt, desktop.theme, desktop)
|
|
117
|
-
} catch (e) {
|
|
118
|
-
const msg = e instanceof Error ? e.message : String(e)
|
|
119
|
-
console.warn(`[@owdproject/core] Warning: Could not load theme "${desktop.theme}". Details: ${msg}`)
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (Array.isArray(desktop.modules)) {
|
|
124
|
-
for (const modulePath of desktop.modules) {
|
|
125
|
-
try {
|
|
126
|
-
await installDesktopPackage(_nuxt, modulePath, desktop)
|
|
127
|
-
} catch (e) {
|
|
128
|
-
const msg = e instanceof Error ? e.message : String(e)
|
|
129
|
-
console.warn(`[@owdproject/core] Warning: Could not load module "${modulePath}". Details: ${msg}`)
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (Array.isArray(desktop.apps)) {
|
|
135
|
-
for (const appPath of desktop.apps) {
|
|
136
|
-
try {
|
|
137
|
-
await installDesktopPackage(_nuxt, appPath, desktop)
|
|
138
|
-
} catch (e) {
|
|
139
|
-
const msg = e instanceof Error ? e.message : String(e)
|
|
140
|
-
console.warn(`[@owdproject/core] Warning: Could not load app "${appPath}". Details: ${msg}`)
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// assign runtimeConfig desktop prop to appConfig
|
|
147
|
-
// to make it overwritable by components later
|
|
148
|
-
// via useDesktopManager
|
|
149
|
-
_nuxt.options.appConfig.desktop = _nuxt.options.runtimeConfig.public.desktop
|
|
150
|
-
|
|
151
|
-
{
|
|
152
|
-
// configure scss for vite
|
|
153
|
-
|
|
154
|
-
_nuxt.hook('vite:extendConfig', (viteConfig) => {
|
|
155
|
-
viteConfig.css = viteConfig.css || {}
|
|
156
|
-
viteConfig.css.preprocessorOptions =
|
|
157
|
-
viteConfig.css.preprocessorOptions || {}
|
|
158
|
-
viteConfig.css.preprocessorOptions.scss = {
|
|
159
|
-
api: 'modern-compiler'
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
viteConfig.optimizeDeps = viteConfig.optimizeDeps || {}
|
|
163
|
-
viteConfig.optimizeDeps.include = viteConfig.optimizeDeps.include || []
|
|
164
|
-
if (resolvedNanoid && !viteConfig.optimizeDeps.include.includes(resolvedNanoid)) {
|
|
165
|
-
viteConfig.optimizeDeps.include.push(resolvedNanoid)
|
|
166
|
-
}
|
|
167
|
-
})
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
{
|
|
171
|
-
// add css
|
|
172
|
-
|
|
173
|
-
_nuxt.options.css.push('sanitize.css')
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
{
|
|
177
|
-
// add components
|
|
178
|
-
|
|
179
|
-
addComponentsDir({
|
|
180
|
-
path: resolve('./runtime/components'),
|
|
181
|
-
prefix: 'Desktop',
|
|
182
|
-
pathPrefix: false,
|
|
183
|
-
global: true
|
|
184
|
-
})
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
{
|
|
188
|
-
addPlugin(resolve('./runtime/plugins/resize.client.ts'))
|
|
189
|
-
addPlugin(
|
|
190
|
-
resolve('./runtime/plugins/01.desktop-shell-init.client.ts'),
|
|
191
|
-
)
|
|
192
|
-
addPlugin(
|
|
193
|
-
resolve('./runtime/plugins/02.desktop-register-desktop-apps.client.ts'),
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
// add other files
|
|
197
|
-
|
|
198
|
-
addImportsDir(resolve('./runtime/composables'))
|
|
199
|
-
addImportsDir(resolve('./runtime/stores'))
|
|
200
|
-
addImportsDir(resolve('./runtime/utils'))
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
})
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { useApplicationManager } from '../../composables/useApplicationManager'
|
|
3
|
-
|
|
4
|
-
defineProps<{
|
|
5
|
-
workspaceFilter?: string
|
|
6
|
-
}>()
|
|
7
|
-
|
|
8
|
-
const applicationManager = useApplicationManager()
|
|
9
|
-
const runningApps = applicationManager.appsRunning
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<template>
|
|
13
|
-
<DesktopCoreApplicationWindowsRender
|
|
14
|
-
v-for="app of runningApps"
|
|
15
|
-
:key="app.id"
|
|
16
|
-
:workspace-filter="workspaceFilter"
|
|
17
|
-
:windows="app.windowsOpened"
|
|
18
|
-
:window-revision="app.openWindowCount.value"
|
|
19
|
-
/>
|
|
20
|
-
</template>
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { computed } from 'vue'
|
|
3
|
-
import { useDesktopWorkspaceStore } from '../../stores/storeDesktopWorkspace'
|
|
4
|
-
|
|
5
|
-
const props = defineProps<{
|
|
6
|
-
workspaceFilter?: string
|
|
7
|
-
windows: Map<string, IWindowController>
|
|
8
|
-
/** Tracks ApplicationController.openWindowCount so Vue re-renders when the map is replaced. */
|
|
9
|
-
windowRevision?: number
|
|
10
|
-
}>()
|
|
11
|
-
|
|
12
|
-
const desktopWorkspaceStore = useDesktopWorkspaceStore()
|
|
13
|
-
|
|
14
|
-
const windowEntries = computed(() => {
|
|
15
|
-
void props.windowRevision
|
|
16
|
-
return Array.from(props.windows.entries())
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
function matchesWorkspace(window: IWindowController): boolean {
|
|
20
|
-
const filter = props.workspaceFilter
|
|
21
|
-
if (!filter) return true
|
|
22
|
-
|
|
23
|
-
const ws = window.state.workspace
|
|
24
|
-
if (!ws) {
|
|
25
|
-
return filter === desktopWorkspaceStore.active
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return ws === filter
|
|
29
|
-
}
|
|
30
|
-
</script>
|
|
31
|
-
|
|
32
|
-
<template>
|
|
33
|
-
<template v-for="[windowId, window] in windowEntries" :key="windowId">
|
|
34
|
-
<Suspense v-if="matchesWorkspace(window)">
|
|
35
|
-
<component :window="window" :is="window.config.component" />
|
|
36
|
-
</Suspense>
|
|
37
|
-
</template>
|
|
38
|
-
</template>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="owd-background">
|
|
3
|
-
<slot />
|
|
4
|
-
</div>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<style scoped lang="scss">
|
|
8
|
-
.owd-background {
|
|
9
|
-
position: fixed;
|
|
10
|
-
top: 0;
|
|
11
|
-
left: 0;
|
|
12
|
-
right: 0;
|
|
13
|
-
bottom: 0;
|
|
14
|
-
background-color: var(--owd-background-color);
|
|
15
|
-
}
|
|
16
|
-
</style>
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { useAttrs, computed } from 'vue'
|
|
3
|
-
import { useAppConfig } from 'nuxt/app'
|
|
4
|
-
|
|
5
|
-
defineOptions({ inheritAttrs: false })
|
|
6
|
-
|
|
7
|
-
defineProps<{
|
|
8
|
-
windows?: DesktopWindowsConfig
|
|
9
|
-
systemBar?: DesktopSystemBarConfig
|
|
10
|
-
dockBar?: DesktopDockBarConfig
|
|
11
|
-
workspaces?: DesktopWorkspacesConfig
|
|
12
|
-
}>()
|
|
13
|
-
|
|
14
|
-
const appConfig = useAppConfig()
|
|
15
|
-
const attrs = useAttrs()
|
|
16
|
-
|
|
17
|
-
const classes = computed(() => {
|
|
18
|
-
const list = ['owd-desktop']
|
|
19
|
-
|
|
20
|
-
if (appConfig.desktop?.name) {
|
|
21
|
-
list.push(`owd-desktop--${appConfig.desktop.name}`)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return list
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
const rootClass = computed(() => [classes.value, attrs.class])
|
|
28
|
-
const rootStyle = computed(() => attrs.style)
|
|
29
|
-
</script>
|
|
30
|
-
|
|
31
|
-
<template>
|
|
32
|
-
<div :class="rootClass" :style="rootStyle">
|
|
33
|
-
<slot />
|
|
34
|
-
</div>
|
|
35
|
-
</template>
|
|
36
|
-
|
|
37
|
-
<style scoped lang="scss">
|
|
38
|
-
.owd-desktop {
|
|
39
|
-
width: 100vw;
|
|
40
|
-
height: 100dvh;
|
|
41
|
-
user-select: none;
|
|
42
|
-
}
|
|
43
|
-
</style>
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { ref, onMounted, onUnmounted } from 'vue'
|
|
3
|
-
import { computed } from '@vue/reactivity'
|
|
4
|
-
import { useI18n } from 'vue-i18n'
|
|
5
|
-
|
|
6
|
-
const date: Ref<Date> = ref(new Date())
|
|
7
|
-
const { locale } = useI18n()
|
|
8
|
-
|
|
9
|
-
let minuteTimeout: any
|
|
10
|
-
|
|
11
|
-
onMounted(() => {
|
|
12
|
-
function scheduleNextMinute() {
|
|
13
|
-
const now = new Date()
|
|
14
|
-
const millisecondsToNextMinute =
|
|
15
|
-
(60 - now.getSeconds()) * 1000 - now.getMilliseconds()
|
|
16
|
-
minuteTimeout = setTimeout(() => {
|
|
17
|
-
date.value = new Date()
|
|
18
|
-
scheduleNextMinute()
|
|
19
|
-
}, millisecondsToNextMinute)
|
|
20
|
-
}
|
|
21
|
-
scheduleNextMinute()
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
onUnmounted(() => {
|
|
25
|
-
clearTimeout(minuteTimeout)
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
const time = computed(() => {
|
|
29
|
-
if (!date.value) {
|
|
30
|
-
return ''
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
let hours = date.value.getHours()
|
|
34
|
-
let minutes: string = date.value.getMinutes().toString()
|
|
35
|
-
let period = 'AM'
|
|
36
|
-
|
|
37
|
-
if (locale.value !== 'it') {
|
|
38
|
-
if (hours >= 12) {
|
|
39
|
-
period = 'PM'
|
|
40
|
-
if (hours > 12) hours -= 12
|
|
41
|
-
} else if (hours === 0) {
|
|
42
|
-
hours = 12
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (minutes.length === 1) minutes = `0${minutes}`
|
|
47
|
-
|
|
48
|
-
return locale.value === 'it'
|
|
49
|
-
? `${hours}:${minutes}`
|
|
50
|
-
: `${hours}:${minutes} ${period}`
|
|
51
|
-
})
|
|
52
|
-
</script>
|
|
53
|
-
|
|
54
|
-
<template>
|
|
55
|
-
<time class="owd-time" v-text="time" />
|
|
56
|
-
</template>
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { ref, provide, onMounted } from 'vue'
|
|
3
|
-
import { computed } from '@vue/reactivity'
|
|
4
|
-
import { useAppConfig } from 'nuxt/app'
|
|
5
|
-
import { handleWindowControllerProps } from '../../utils/utilWindowControllerAdapter'
|
|
6
|
-
import { useDesktopWorkspaceStore } from '../../stores/storeDesktopWorkspace'
|
|
7
|
-
|
|
8
|
-
const props = defineProps<{
|
|
9
|
-
window?: IWindowController
|
|
10
|
-
content?: WindowContent
|
|
11
|
-
}>()
|
|
12
|
-
|
|
13
|
-
const desktopWorkspaceStore = useDesktopWorkspaceStore()
|
|
14
|
-
|
|
15
|
-
const emit = defineEmits([
|
|
16
|
-
'resize:start',
|
|
17
|
-
'resize:move',
|
|
18
|
-
'resize:end',
|
|
19
|
-
'drag:start',
|
|
20
|
-
'drag:move',
|
|
21
|
-
'drag:end',
|
|
22
|
-
'close',
|
|
23
|
-
'open',
|
|
24
|
-
'blur',
|
|
25
|
-
'focus',
|
|
26
|
-
'minimize',
|
|
27
|
-
'restore',
|
|
28
|
-
'maximize',
|
|
29
|
-
'unmaximize',
|
|
30
|
-
'toggle-maximize',
|
|
31
|
-
])
|
|
32
|
-
|
|
33
|
-
const appConfig = useAppConfig()
|
|
34
|
-
const windowController: IWindowController = handleWindowControllerProps(
|
|
35
|
-
props.window,
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
provide<IWindowController>('windowController', windowController)
|
|
39
|
-
provide<WindowContent>('windowContent', props.content ?? {})
|
|
40
|
-
|
|
41
|
-
const isDragging = ref(false)
|
|
42
|
-
const isResizing = ref(false)
|
|
43
|
-
|
|
44
|
-
onMounted(() => {
|
|
45
|
-
if (windowController?.state?.focused) {
|
|
46
|
-
windowController.actions.bringToFront()
|
|
47
|
-
}
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
function onWindowPointerDown() {
|
|
51
|
-
windowController?.actions?.setActive(true)
|
|
52
|
-
windowController?.actions?.bringToFront()
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function onWindowDragStart(data: any) {
|
|
56
|
-
isDragging.value = true
|
|
57
|
-
|
|
58
|
-
emit('drag:start', data)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function onWindowDragMove(data: any) {
|
|
62
|
-
emit('drag:move', data)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function onWindowDragEnd(data: { left: number; top: number }) {
|
|
66
|
-
windowController?.actions?.setPosition({
|
|
67
|
-
x: data.left,
|
|
68
|
-
y: data.top,
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
isDragging.value = false
|
|
72
|
-
|
|
73
|
-
emit('drag:end', data)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function onWindowResizeStart(data: any) {
|
|
77
|
-
isResizing.value = true
|
|
78
|
-
|
|
79
|
-
emit('resize:start', data)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function onWindowResizeMove(data: any) {
|
|
83
|
-
emit('resize:move', data)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Window end resize event
|
|
88
|
-
*/
|
|
89
|
-
function onWindowResizeEnd(data: {
|
|
90
|
-
left: number
|
|
91
|
-
top: number
|
|
92
|
-
width: number
|
|
93
|
-
height: number
|
|
94
|
-
}) {
|
|
95
|
-
isResizing.value = false
|
|
96
|
-
|
|
97
|
-
windowController?.actions?.setPosition({
|
|
98
|
-
x: data.left,
|
|
99
|
-
y: data.top,
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
windowController?.actions?.setSize({
|
|
103
|
-
width: data.width,
|
|
104
|
-
height: data.height,
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
emit('resize:end', data)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const classes = computed(() => {
|
|
111
|
-
const list = ['owd-window']
|
|
112
|
-
|
|
113
|
-
if (windowController?.state.focused) {
|
|
114
|
-
list.push('owd-window--focused')
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if (isDragging.value) {
|
|
118
|
-
list.push('owd-window--dragging')
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (isResizing.value) {
|
|
122
|
-
list.push('owd-window--resizing')
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return list
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
/** While workspace overview is open, disable vue-resizable chrome drag and use native HTML5 drag to move windows between desktops. */
|
|
129
|
-
const workspaceChromeDragSelector = computed(() => {
|
|
130
|
-
if (desktopWorkspaceStore.overview) {
|
|
131
|
-
return '.owd-window-overview-drag-none'
|
|
132
|
-
}
|
|
133
|
-
return windowController?.isDraggable
|
|
134
|
-
? '.owd-window-nav__draggable'
|
|
135
|
-
: '.owd-window-nav__draggable-none'
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
function onOverviewNativeDragStart(e: DragEvent) {
|
|
139
|
-
if (!desktopWorkspaceStore.overview || !windowController) return
|
|
140
|
-
e.stopPropagation()
|
|
141
|
-
e.dataTransfer?.setData('text/plain', windowController.state.id)
|
|
142
|
-
e.dataTransfer!.effectAllowed = 'move'
|
|
143
|
-
try {
|
|
144
|
-
const img = new Image()
|
|
145
|
-
img.src =
|
|
146
|
-
'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
|
|
147
|
-
e.dataTransfer?.setDragImage(img, 0, 0)
|
|
148
|
-
} catch {
|
|
149
|
-
/* noop */
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const windowPositionMode = computed(
|
|
154
|
-
() => appConfig.desktop?.windows?.position ?? 'fixed',
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
/** `fit-parent` clamps drag/resize to the parent box — wrong for viewport-fixed shells (Win11, GNOME). */
|
|
158
|
-
const shouldFitParent = computed(
|
|
159
|
-
() => windowPositionMode.value !== 'fixed',
|
|
160
|
-
)
|
|
161
|
-
</script>
|
|
162
|
-
|
|
163
|
-
<template>
|
|
164
|
-
<vue-resizable
|
|
165
|
-
ref="windowResizableController"
|
|
166
|
-
:class="classes"
|
|
167
|
-
:width="windowController?.size.width"
|
|
168
|
-
:height="windowController?.size.height"
|
|
169
|
-
:min-width="windowController?.size.minWidth"
|
|
170
|
-
:min-height="windowController?.size.minHeight"
|
|
171
|
-
:max-width="windowController?.size.maxWidth"
|
|
172
|
-
:max-height="windowController?.size.maxHeight"
|
|
173
|
-
:left="windowController?.position?.x"
|
|
174
|
-
:top="windowController?.position?.y"
|
|
175
|
-
:active="windowController?.isResizable ? undefined : []"
|
|
176
|
-
:fit-parent="shouldFitParent"
|
|
177
|
-
@drag:start="onWindowDragStart"
|
|
178
|
-
@drag:move="onWindowDragMove"
|
|
179
|
-
@drag:end="onWindowDragEnd"
|
|
180
|
-
@resize:start="onWindowResizeStart"
|
|
181
|
-
@resize:move="onWindowResizeMove"
|
|
182
|
-
@resize:end="onWindowResizeEnd"
|
|
183
|
-
:style="{ zIndex: windowController?.position?.z }"
|
|
184
|
-
:drag-selector="workspaceChromeDragSelector"
|
|
185
|
-
:draggable="desktopWorkspaceStore.overview"
|
|
186
|
-
@pointerdown="onWindowPointerDown"
|
|
187
|
-
@dragstart="onOverviewNativeDragStart"
|
|
188
|
-
>
|
|
189
|
-
<slot />
|
|
190
|
-
</vue-resizable>
|
|
191
|
-
</template>
|
|
192
|
-
|
|
193
|
-
<style scoped lang="scss">
|
|
194
|
-
/* vue-resizable sets `.resizable-component { position: relative }` — override so desktop geometry stays consistent */
|
|
195
|
-
.owd-window.resizable-component {
|
|
196
|
-
position: v-bind('windowPositionMode') !important;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
.owd-window {
|
|
200
|
-
position: v-bind('windowPositionMode');
|
|
201
|
-
|
|
202
|
-
&--dragging,
|
|
203
|
-
&--resizing {
|
|
204
|
-
:deep(.owd-window__content) {
|
|
205
|
-
pointer-events: none;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
:deep(.owd-window__content) {
|
|
210
|
-
overflow-y: auto;
|
|
211
|
-
height: 100%;
|
|
212
|
-
min-height: 0;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
</style>
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { inject } from 'vue'
|
|
3
|
-
import { computed } from '@vue/reactivity'
|
|
4
|
-
|
|
5
|
-
const windowContent = inject<WindowContent>('windowContent')
|
|
6
|
-
|
|
7
|
-
const classes = computed(() => {
|
|
8
|
-
const list = ['owd-window__content']
|
|
9
|
-
|
|
10
|
-
if (windowContent?.centered) {
|
|
11
|
-
list.push('owd-window__content--centered')
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (windowContent?.padded) {
|
|
15
|
-
list.push('owd-window__content--padded')
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return list
|
|
19
|
-
})
|
|
20
|
-
</script>
|
|
21
|
-
|
|
22
|
-
<template>
|
|
23
|
-
<div :class="classes">
|
|
24
|
-
<slot />
|
|
25
|
-
</div>
|
|
26
|
-
</template>
|
|
27
|
-
|
|
28
|
-
<style scoped lang="scss"></style>
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { inject } from 'vue'
|
|
3
|
-
import { computed } from '@vue/reactivity'
|
|
4
|
-
|
|
5
|
-
const windowController = inject<IWindowController>('windowController')
|
|
6
|
-
|
|
7
|
-
const classes = computed(() => {
|
|
8
|
-
const list = ['owd-window-nav']
|
|
9
|
-
|
|
10
|
-
if (
|
|
11
|
-
typeof windowController?.state.active === 'undefined' ||
|
|
12
|
-
!!windowController?.state.active
|
|
13
|
-
) {
|
|
14
|
-
list.push('owd-window-nav--active')
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (windowController?.state.focused) {
|
|
18
|
-
list.push('owd-window-nav--focused')
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return list
|
|
22
|
-
})
|
|
23
|
-
</script>
|
|
24
|
-
|
|
25
|
-
<template>
|
|
26
|
-
<div :class="classes">
|
|
27
|
-
<div class="owd-window-nav__draggable" />
|
|
28
|
-
|
|
29
|
-
<slot />
|
|
30
|
-
</div>
|
|
31
|
-
</template>
|
|
32
|
-
|
|
33
|
-
<style lang="scss">
|
|
34
|
-
/**
|
|
35
|
-
* Title/icon sit above the drag layer in DOM order; use pointer-events so
|
|
36
|
-
* mousedown reaches `.owd-window-nav__draggable` for vue-resizable. Window
|
|
37
|
-
* controls stay clickable.
|
|
38
|
-
*/
|
|
39
|
-
.owd-window-nav {
|
|
40
|
-
position: relative;
|
|
41
|
-
display: flex;
|
|
42
|
-
align-items: stretch;
|
|
43
|
-
width: 100%;
|
|
44
|
-
min-height: 0;
|
|
45
|
-
|
|
46
|
-
&__draggable {
|
|
47
|
-
position: absolute;
|
|
48
|
-
inset: 0;
|
|
49
|
-
z-index: 1;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
> :not(.owd-window-nav__draggable) {
|
|
53
|
-
position: relative;
|
|
54
|
-
z-index: 2;
|
|
55
|
-
pointer-events: none;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
> .owd-window-nav__btn-group {
|
|
59
|
-
pointer-events: auto;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
> .owd-window-nav__interactive {
|
|
63
|
-
pointer-events: auto;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
</style>
|