@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.
Files changed (108) hide show
  1. package/README.md +112 -13
  2. package/dist/dom/index.d.mts +65 -0
  3. package/dist/dom/index.d.ts +65 -0
  4. package/dist/dom/index.mjs +224 -0
  5. package/dist/events/index.d.mts +70 -0
  6. package/dist/events/index.d.ts +70 -0
  7. package/dist/events/index.mjs +3 -0
  8. package/dist/index.d.mts +73 -0
  9. package/dist/index.d.ts +73 -0
  10. package/dist/index.mjs +115 -0
  11. package/dist/layout/index.d.mts +41 -0
  12. package/dist/layout/index.d.ts +41 -0
  13. package/dist/layout/index.mjs +64 -0
  14. package/dist/machines/index.d.mts +31 -0
  15. package/dist/machines/index.d.ts +31 -0
  16. package/dist/machines/index.mjs +2 -0
  17. package/dist/managers/index.d.mts +117 -0
  18. package/dist/managers/index.d.ts +117 -0
  19. package/dist/managers/index.mjs +6 -0
  20. package/dist/session/index.d.mts +57 -0
  21. package/dist/session/index.d.ts +57 -0
  22. package/dist/session/index.mjs +65 -0
  23. package/dist/shared/core.B0B0KfVK.mjs +865 -0
  24. package/dist/shared/core.B1XxB289.mjs +239 -0
  25. package/dist/shared/core.B3mp7ztE.mjs +237 -0
  26. package/dist/shared/core.BOvFdEVQ.d.ts +114 -0
  27. package/dist/shared/core.CsDFgGnX.mjs +40 -0
  28. package/dist/shared/core.Di1eFcr_.d.mts +114 -0
  29. package/dist/shared/core.Pd_Ogt4g.mjs +101 -0
  30. package/dist/shared/core.b3Xldzyu.mjs +29 -0
  31. package/dist/types/index.d.mts +266 -0
  32. package/dist/types/index.d.ts +266 -0
  33. package/dist/types/index.mjs +1 -0
  34. package/package.json +56 -112
  35. package/CHANGELOG.md +0 -98
  36. package/DESKTOP_KERNEL.md +0 -232
  37. package/MIGRATION_3.3.2.md +0 -23
  38. package/MIGRATION_3.4.md +0 -126
  39. package/PLAYGROUND.md +0 -91
  40. package/dist/module.d.mts +0 -13
  41. package/dist/module.json +0 -9
  42. package/dist/module.mjs +0 -254
  43. package/dist/types.d.mts +0 -7
  44. package/index.ts +0 -8
  45. package/kit/authoring.ts +0 -340
  46. package/kit/defineDesktopApp.ts +0 -56
  47. package/module.ts +0 -203
  48. package/runtime/components/Application/DesktopCoreApplicationRender.vue +0 -20
  49. package/runtime/components/Application/DesktopCoreApplicationWindowsRender.vue +0 -38
  50. package/runtime/components/background/DesktopCoreBackground.vue +0 -16
  51. package/runtime/components/core/DesktopCore.vue +0 -43
  52. package/runtime/components/time/DesktopCoreTime.vue +0 -56
  53. package/runtime/components/window/DesktopCoreWindow.vue +0 -215
  54. package/runtime/components/window/DesktopCoreWindowContent.vue +0 -28
  55. package/runtime/components/window/DesktopCoreWindowNav.vue +0 -66
  56. package/runtime/components/window/DesktopCoreWindowSnapHintsBase.vue +0 -74
  57. package/runtime/components/workspace/DesktopCoreWorkspaceEdgeHintsBase.vue +0 -84
  58. package/runtime/composables/useApplicationEntries.ts +0 -51
  59. package/runtime/composables/useApplicationManager.ts +0 -285
  60. package/runtime/composables/useBlockNonInputContextMenu.ts +0 -30
  61. package/runtime/composables/useDesktopConfig.ts +0 -8
  62. package/runtime/composables/useDesktopDialogs.ts +0 -16
  63. package/runtime/composables/useDesktopExtension.ts +0 -8
  64. package/runtime/composables/useDesktopManager.ts +0 -51
  65. package/runtime/composables/useDesktopManifest.ts +0 -17
  66. package/runtime/composables/useDesktopSession.ts +0 -27
  67. package/runtime/composables/useDesktopShellIdentity.ts +0 -99
  68. package/runtime/composables/useDesktopShellOptions.ts +0 -36
  69. package/runtime/composables/useDesktopShellReady.ts +0 -7
  70. package/runtime/composables/useDesktopWorkArea.ts +0 -93
  71. package/runtime/composables/useTerminalManager.ts +0 -159
  72. package/runtime/composables/useToggleWindowMaximize.ts +0 -35
  73. package/runtime/composables/useWindowDragHandlers.ts +0 -47
  74. package/runtime/composables/useWindowSnapDrop.ts +0 -112
  75. package/runtime/composables/useWorkspaceEdgeDrop.ts +0 -176
  76. package/runtime/composables/useWorkspaceManager.ts +0 -67
  77. package/runtime/composables/useWorkspaceOverviewCapture.ts +0 -92
  78. package/runtime/composables/useWorkspaceOverviewLiveScale.ts +0 -151
  79. package/runtime/constants/desktopShellKeys.ts +0 -12
  80. package/runtime/constants/shellLayout.ts +0 -5
  81. package/runtime/dialogs/desktopDialogProvider.ts +0 -73
  82. package/runtime/internal/controllers/ApplicationController.ts +0 -351
  83. package/runtime/internal/controllers/WindowController.ts +0 -547
  84. package/runtime/plugins/01.desktop-shell-init.client.ts +0 -28
  85. package/runtime/plugins/02.desktop-register-desktop-apps.client.ts +0 -13
  86. package/runtime/plugins/resize.client.ts +0 -6
  87. package/runtime/stores/storeApplicationMeta.ts +0 -60
  88. package/runtime/stores/storeApplicationWindows.ts +0 -21
  89. package/runtime/stores/storeDesktop.ts +0 -71
  90. package/runtime/stores/storeDesktopDefaultApps.ts +0 -54
  91. package/runtime/stores/storeDesktopVolume.ts +0 -19
  92. package/runtime/stores/storeDesktopWindow.ts +0 -38
  93. package/runtime/stores/storeDesktopWorkspace.ts +0 -105
  94. package/runtime/stores/storeIds.ts +0 -35
  95. package/runtime/types/desktopMenu.ts +0 -10
  96. package/runtime/utils/initDesktopShell.ts +0 -80
  97. package/runtime/utils/migratePersistedStoreIds.ts +0 -57
  98. package/runtime/utils/utilApp.ts +0 -25
  99. package/runtime/utils/utilCaptureElementToCanvas.ts +0 -21
  100. package/runtime/utils/utilCommon.ts +0 -26
  101. package/runtime/utils/utilDebug.ts +0 -30
  102. package/runtime/utils/utilDetectSnapZone.ts +0 -57
  103. package/runtime/utils/utilTerminal.ts +0 -6
  104. package/runtime/utils/utilWindowControllerAdapter.ts +0 -15
  105. package/runtime/utils/utilWindowLayout.ts +0 -82
  106. package/runtime/utils/utilWindowMaximizeLayout.ts +0 -44
  107. package/runtime/utils/utilWorkspaceWindows.ts +0 -33
  108. 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>