@owdproject/nuxt-theme-ui 0.0.0-stage → 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/dist/i18n/locales/en.d.ts +2 -0
- package/dist/i18n/locales/en.js +1 -0
- package/dist/module.d.mts +7 -0
- package/dist/module.json +9 -0
- package/dist/module.mjs +50 -0
- package/dist/runtime/apps/calculator/app.config.d.ts +34 -0
- package/dist/runtime/apps/calculator/app.config.js +35 -0
- package/dist/runtime/apps/calculator/components/Window/WindowCalculator.d.vue.ts +6 -0
- package/dist/runtime/apps/calculator/components/Window/WindowCalculator.vue +85 -0
- package/dist/runtime/apps/calculator/components/Window/WindowCalculator.vue.d.ts +6 -0
- package/dist/runtime/apps/calculator/plugin.d.ts +2 -0
- package/dist/runtime/apps/calculator/plugin.js +11 -0
- package/dist/runtime/apps/explorer/app.config.d.ts +36 -0
- package/dist/runtime/apps/explorer/app.config.js +39 -0
- package/dist/runtime/apps/explorer/components/Window/WindowExplorer.d.vue.ts +6 -0
- package/dist/runtime/apps/explorer/components/Window/WindowExplorer.vue +30 -0
- package/dist/runtime/apps/explorer/components/Window/WindowExplorer.vue.d.ts +6 -0
- package/dist/runtime/apps/explorer/plugin.d.ts +2 -0
- package/dist/runtime/apps/explorer/plugin.js +11 -0
- package/dist/runtime/apps/installBuiltInApps.d.ts +3 -0
- package/dist/runtime/apps/installBuiltInApps.js +28 -0
- package/dist/runtime/apps/notepad/app.config.d.ts +34 -0
- package/dist/runtime/apps/notepad/app.config.js +35 -0
- package/dist/runtime/apps/notepad/components/Window/WindowNotepad.d.vue.ts +6 -0
- package/dist/runtime/apps/notepad/components/Window/WindowNotepad.vue +43 -0
- package/dist/runtime/apps/notepad/components/Window/WindowNotepad.vue.d.ts +6 -0
- package/dist/runtime/apps/notepad/plugin.d.ts +2 -0
- package/dist/runtime/apps/notepad/plugin.js +11 -0
- package/dist/runtime/apps/registry.d.ts +8 -0
- package/dist/runtime/apps/registry.js +10 -0
- package/dist/runtime/components/Background/DesktopBackground.d.vue.ts +3 -0
- package/dist/runtime/components/Background/DesktopBackground.vue +3 -0
- package/dist/runtime/components/Background/DesktopBackground.vue.d.ts +3 -0
- package/dist/runtime/components/Desktop/DesktopContent.d.vue.ts +13 -0
- package/dist/runtime/components/Desktop/DesktopContent.vue +23 -0
- package/dist/runtime/components/Desktop/DesktopContent.vue.d.ts +13 -0
- package/dist/runtime/components/Desktop.client.d.vue.ts +23 -0
- package/dist/runtime/components/Desktop.client.vue +47 -0
- package/dist/runtime/components/Desktop.client.vue.d.ts +23 -0
- package/dist/runtime/components/NuxtLauncherOverlay.d.vue.ts +3 -0
- package/dist/runtime/components/NuxtLauncherOverlay.vue +69 -0
- package/dist/runtime/components/NuxtLauncherOverlay.vue.d.ts +3 -0
- package/dist/runtime/components/NuxtTopBar.d.vue.ts +3 -0
- package/dist/runtime/components/NuxtTopBar.vue +63 -0
- package/dist/runtime/components/NuxtTopBar.vue.d.ts +3 -0
- package/dist/runtime/components/Window/DesktopWindow.d.vue.ts +43 -0
- package/dist/runtime/components/Window/DesktopWindow.vue +40 -0
- package/dist/runtime/components/Window/DesktopWindow.vue.d.ts +43 -0
- package/dist/runtime/components/Window/DesktopWindowContent.d.vue.ts +13 -0
- package/dist/runtime/components/Window/DesktopWindowContent.vue +9 -0
- package/dist/runtime/components/Window/DesktopWindowContent.vue.d.ts +13 -0
- package/dist/runtime/components/Window/DesktopWindowIframe.d.vue.ts +29 -0
- package/dist/runtime/components/Window/DesktopWindowIframe.vue +13 -0
- package/dist/runtime/components/Window/DesktopWindowIframe.vue.d.ts +29 -0
- package/dist/runtime/components/Window/DesktopWindowNav.d.vue.ts +3 -0
- package/dist/runtime/components/Window/DesktopWindowNav.vue +105 -0
- package/dist/runtime/components/Window/DesktopWindowNav.vue.d.ts +3 -0
- package/dist/runtime/composables/useNuxtStartMenu.d.ts +9 -0
- package/dist/runtime/composables/useNuxtStartMenu.js +57 -0
- package/dist/types.d.mts +7 -0
- package/package.json +70 -4
- package/src/i18n/locales/en.ts +1 -0
- package/src/module.ts +69 -0
- package/src/runtime/apps/calculator/app.config.ts +35 -0
- package/src/runtime/apps/calculator/components/Window/WindowCalculator.vue +95 -0
- package/src/runtime/apps/calculator/plugin.ts +12 -0
- package/src/runtime/apps/explorer/app.config.ts +39 -0
- package/src/runtime/apps/explorer/components/Window/WindowExplorer.vue +34 -0
- package/src/runtime/apps/explorer/plugin.ts +12 -0
- package/src/runtime/apps/installBuiltInApps.ts +36 -0
- package/src/runtime/apps/notepad/app.config.ts +35 -0
- package/src/runtime/apps/notepad/components/Window/WindowNotepad.vue +46 -0
- package/src/runtime/apps/notepad/plugin.ts +12 -0
- package/src/runtime/apps/registry.ts +21 -0
- package/src/runtime/components/Background/DesktopBackground.vue +3 -0
- package/src/runtime/components/Desktop/DesktopContent.vue +37 -0
- package/src/runtime/components/Desktop.client.vue +55 -0
- package/src/runtime/components/NuxtLauncherOverlay.vue +71 -0
- package/src/runtime/components/NuxtTopBar.vue +68 -0
- package/src/runtime/components/Window/DesktopWindow.vue +44 -0
- package/src/runtime/components/Window/DesktopWindowContent.vue +17 -0
- package/src/runtime/components/Window/DesktopWindowIframe.vue +13 -0
- package/src/runtime/components/Window/DesktopWindowNav.vue +110 -0
- package/src/runtime/composables/useNuxtStartMenu.ts +72 -0
- package/README.md +0 -3
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare var __VLS_1: {};
|
|
2
|
+
type __VLS_Slots = {} & {
|
|
3
|
+
default?: (props: typeof __VLS_1) => any;
|
|
4
|
+
};
|
|
5
|
+
declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
6
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
7
|
+
declare const _default: typeof __VLS_export;
|
|
8
|
+
export default _default;
|
|
9
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
10
|
+
new (): {
|
|
11
|
+
$slots: S;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
declare var __VLS_23: {};
|
|
2
|
+
type __VLS_Slots = {} & {
|
|
3
|
+
default?: (props: typeof __VLS_23) => any;
|
|
4
|
+
};
|
|
5
|
+
declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
6
|
+
systemBar: {
|
|
7
|
+
type: null;
|
|
8
|
+
required: false;
|
|
9
|
+
};
|
|
10
|
+
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
11
|
+
systemBar: {
|
|
12
|
+
type: null;
|
|
13
|
+
required: false;
|
|
14
|
+
};
|
|
15
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
16
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
17
|
+
declare const _default: typeof __VLS_export;
|
|
18
|
+
export default _default;
|
|
19
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
20
|
+
new (): {
|
|
21
|
+
$slots: S;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { ref, onMounted, onUnmounted } from "vue";
|
|
3
|
+
import { useDesktopWorkArea } from "@owdproject/nuxt/runtime/composables/useDesktopWorkArea";
|
|
4
|
+
import Background from "./Background/DesktopBackground.vue";
|
|
5
|
+
import DesktopContent from "./Desktop/DesktopContent.vue";
|
|
6
|
+
import NuxtTopBar from "./NuxtTopBar.vue";
|
|
7
|
+
import NuxtLauncherOverlay from "./NuxtLauncherOverlay.vue";
|
|
8
|
+
defineProps({
|
|
9
|
+
systemBar: { type: null, required: false }
|
|
10
|
+
});
|
|
11
|
+
const shellStageRef = ref(null);
|
|
12
|
+
useDesktopWorkArea(shellStageRef);
|
|
13
|
+
const BODY_SHELL_CLASS = "owd-has-nuxt-shell";
|
|
14
|
+
onMounted(() => {
|
|
15
|
+
document.body.classList.add(BODY_SHELL_CLASS);
|
|
16
|
+
});
|
|
17
|
+
onUnmounted(() => {
|
|
18
|
+
document.body.classList.remove(BODY_SHELL_CLASS);
|
|
19
|
+
});
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<template>
|
|
23
|
+
<DesktopCore
|
|
24
|
+
v-bind="$props"
|
|
25
|
+
class="owd-desktop--nuxt flex flex-col h-screen overflow-hidden select-none bg-gray-50 dark:bg-gray-950"
|
|
26
|
+
>
|
|
27
|
+
<NuxtTopBar />
|
|
28
|
+
|
|
29
|
+
<div ref="shellStageRef" class="flex-1 min-h-0 relative flex flex-col">
|
|
30
|
+
<Background />
|
|
31
|
+
|
|
32
|
+
<DesktopContent>
|
|
33
|
+
<slot />
|
|
34
|
+
</DesktopContent>
|
|
35
|
+
<DesktopCoreApplicationRender />
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<NuxtLauncherOverlay />
|
|
39
|
+
|
|
40
|
+
<!-- Supports programmatically opened Nuxt UI modals -->
|
|
41
|
+
<UModals />
|
|
42
|
+
</DesktopCore>
|
|
43
|
+
</template>
|
|
44
|
+
|
|
45
|
+
<style>
|
|
46
|
+
.owd-desktop--nuxt{--owd-system-bar-height:48px}
|
|
47
|
+
</style>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
declare var __VLS_23: {};
|
|
2
|
+
type __VLS_Slots = {} & {
|
|
3
|
+
default?: (props: typeof __VLS_23) => any;
|
|
4
|
+
};
|
|
5
|
+
declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
6
|
+
systemBar: {
|
|
7
|
+
type: null;
|
|
8
|
+
required: false;
|
|
9
|
+
};
|
|
10
|
+
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
11
|
+
systemBar: {
|
|
12
|
+
type: null;
|
|
13
|
+
required: false;
|
|
14
|
+
};
|
|
15
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
16
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
17
|
+
declare const _default: typeof __VLS_export;
|
|
18
|
+
export default _default;
|
|
19
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
20
|
+
new (): {
|
|
21
|
+
$slots: S;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { useNuxtStartMenu } from "../composables/useNuxtStartMenu";
|
|
3
|
+
import { watch, ref } from "vue";
|
|
4
|
+
const { open, searchQuery, filteredEntries, close, launchEntry } = useNuxtStartMenu();
|
|
5
|
+
const searchInput = ref(null);
|
|
6
|
+
watch(open, (isOpen) => {
|
|
7
|
+
if (isOpen) {
|
|
8
|
+
setTimeout(() => {
|
|
9
|
+
searchInput.value?.$el?.querySelector("input")?.focus();
|
|
10
|
+
}, 100);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<template>
|
|
16
|
+
<div v-if="open" class="fixed inset-0 z-40 flex items-start justify-center pt-24" @click="close">
|
|
17
|
+
<!-- Overlay/Command Palette -->
|
|
18
|
+
<div
|
|
19
|
+
class="w-full max-w-xl mx-4 flex flex-col bg-white/75 dark:bg-gray-900/75 backdrop-blur-xl border border-gray-200 dark:border-gray-800 rounded-xl shadow-2xl overflow-hidden ring-1 ring-gray-200 dark:ring-gray-800"
|
|
20
|
+
@click.stop
|
|
21
|
+
>
|
|
22
|
+
<div class="p-4 border-b border-gray-200 dark:border-gray-800">
|
|
23
|
+
<UInput
|
|
24
|
+
ref="searchInput"
|
|
25
|
+
v-model="searchQuery"
|
|
26
|
+
icon="i-heroicons-magnifying-glass"
|
|
27
|
+
size="lg"
|
|
28
|
+
color="gray"
|
|
29
|
+
variant="none"
|
|
30
|
+
placeholder="Search apps..."
|
|
31
|
+
class="w-full text-lg"
|
|
32
|
+
:ui="{ wrapper: 'shadow-none', icon: { base: 'text-gray-400 dark:text-gray-500' } }"
|
|
33
|
+
/>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div class="flex-1 overflow-y-auto max-h-[50vh] p-2">
|
|
37
|
+
<div v-if="filteredEntries.length === 0" class="text-center py-12 text-gray-500 dark:text-gray-400 text-sm">
|
|
38
|
+
No apps found.
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<div class="grid grid-cols-1 gap-1">
|
|
42
|
+
<button
|
|
43
|
+
v-for="entry in filteredEntries"
|
|
44
|
+
:key="entry.application.id"
|
|
45
|
+
class="flex items-center gap-3 p-3 rounded-lg hover:bg-gray-100/50 dark:hover:bg-gray-800/50 focus:bg-gray-100/50 dark:focus:bg-gray-800/50 transition-colors text-left outline-none"
|
|
46
|
+
@click="launchEntry(entry)"
|
|
47
|
+
>
|
|
48
|
+
<div class="flex-shrink-0 p-2 bg-gray-100 dark:bg-gray-800 rounded-md">
|
|
49
|
+
<UIcon
|
|
50
|
+
v-if="entry.icon"
|
|
51
|
+
:name="entry.icon"
|
|
52
|
+
class="w-5 h-5 text-gray-700 dark:text-gray-300"
|
|
53
|
+
/>
|
|
54
|
+
<UIcon
|
|
55
|
+
v-else
|
|
56
|
+
name="i-heroicons-window"
|
|
57
|
+
class="w-5 h-5 text-gray-700 dark:text-gray-300"
|
|
58
|
+
/>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="flex flex-col min-w-0">
|
|
61
|
+
<span class="text-sm font-medium text-gray-900 dark:text-gray-100">{{ entry.title }}</span>
|
|
62
|
+
<span class="text-xs text-gray-500 dark:text-gray-400 truncate" v-if="entry.description">{{ entry.description }}</span>
|
|
63
|
+
</div>
|
|
64
|
+
</button>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</template>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { ref, onMounted, onUnmounted, computed } from "vue";
|
|
3
|
+
import { useColorMode } from "#imports";
|
|
4
|
+
import { useNuxtStartMenu } from "../composables/useNuxtStartMenu";
|
|
5
|
+
const { toggle: toggleStart, open: startOpen } = useNuxtStartMenu();
|
|
6
|
+
const time = ref("");
|
|
7
|
+
const dateLabel = ref("");
|
|
8
|
+
let timer;
|
|
9
|
+
onMounted(() => {
|
|
10
|
+
const update = () => {
|
|
11
|
+
const d = /* @__PURE__ */ new Date();
|
|
12
|
+
time.value = d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
13
|
+
dateLabel.value = d.toLocaleDateString([], { weekday: "short", month: "short", day: "numeric" });
|
|
14
|
+
};
|
|
15
|
+
update();
|
|
16
|
+
timer = setInterval(update, 1e3);
|
|
17
|
+
});
|
|
18
|
+
onUnmounted(() => {
|
|
19
|
+
clearInterval(timer);
|
|
20
|
+
});
|
|
21
|
+
const colorMode = useColorMode();
|
|
22
|
+
const isDark = computed({
|
|
23
|
+
get() {
|
|
24
|
+
return colorMode.value === "dark";
|
|
25
|
+
},
|
|
26
|
+
set() {
|
|
27
|
+
colorMode.preference = colorMode.value === "dark" ? "light" : "dark";
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<template>
|
|
33
|
+
<header class="h-[60px] w-full flex items-center justify-between px-4 sm:px-6 lg:px-8 bg-white/75 dark:bg-gray-900/75 backdrop-blur border-b border-gray-200 dark:border-gray-800 flex-shrink-0 select-none z-50">
|
|
34
|
+
<!-- Left Section: Logo/Start Button -->
|
|
35
|
+
<div class="flex items-center gap-4">
|
|
36
|
+
<button
|
|
37
|
+
@click="toggleStart"
|
|
38
|
+
class="flex items-center gap-2 hover:opacity-80 transition-opacity"
|
|
39
|
+
aria-label="Toggle Start Menu"
|
|
40
|
+
>
|
|
41
|
+
<UIcon name="i-heroicons-cube-transparent" class="w-6 h-6 text-green-500" />
|
|
42
|
+
<span class="font-bold text-gray-900 dark:text-white text-lg tracking-tight hidden sm:block">Nuxt OS</span>
|
|
43
|
+
</button>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<!-- Center Section: Title/Clock -->
|
|
47
|
+
<div class="flex flex-col items-center justify-center">
|
|
48
|
+
<span class="text-sm font-medium text-gray-700 dark:text-gray-300">{{ time }}</span>
|
|
49
|
+
<span class="text-xs text-gray-500 dark:text-gray-400">{{ dateLabel }}</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<!-- Right Section: Quick controls -->
|
|
53
|
+
<div class="flex items-center gap-3">
|
|
54
|
+
<UButton
|
|
55
|
+
:icon="isDark ? 'i-heroicons-moon' : 'i-heroicons-sun'"
|
|
56
|
+
color="gray"
|
|
57
|
+
variant="ghost"
|
|
58
|
+
class="text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"
|
|
59
|
+
@click="isDark = !isDark"
|
|
60
|
+
/>
|
|
61
|
+
</div>
|
|
62
|
+
</header>
|
|
63
|
+
</template>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
declare var __VLS_17: {}, __VLS_20: {}, __VLS_28: {};
|
|
2
|
+
type __VLS_Slots = {} & {
|
|
3
|
+
'nav-prepend'?: (props: typeof __VLS_17) => any;
|
|
4
|
+
} & {
|
|
5
|
+
'nav-append'?: (props: typeof __VLS_20) => any;
|
|
6
|
+
} & {
|
|
7
|
+
default?: (props: typeof __VLS_28) => any;
|
|
8
|
+
};
|
|
9
|
+
declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
10
|
+
config: {
|
|
11
|
+
type: null;
|
|
12
|
+
required: false;
|
|
13
|
+
};
|
|
14
|
+
window: {
|
|
15
|
+
type: null;
|
|
16
|
+
required: false;
|
|
17
|
+
};
|
|
18
|
+
content: {
|
|
19
|
+
type: null;
|
|
20
|
+
required: false;
|
|
21
|
+
};
|
|
22
|
+
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
23
|
+
config: {
|
|
24
|
+
type: null;
|
|
25
|
+
required: false;
|
|
26
|
+
};
|
|
27
|
+
window: {
|
|
28
|
+
type: null;
|
|
29
|
+
required: false;
|
|
30
|
+
};
|
|
31
|
+
content: {
|
|
32
|
+
type: null;
|
|
33
|
+
required: false;
|
|
34
|
+
};
|
|
35
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
36
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
37
|
+
declare const _default: typeof __VLS_export;
|
|
38
|
+
export default _default;
|
|
39
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
40
|
+
new (): {
|
|
41
|
+
$slots: S;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { useWindowDragHandlers } from "@owdproject/nuxt/runtime/composables/useWindowDragHandlers";
|
|
3
|
+
const props = defineProps({
|
|
4
|
+
config: { type: null, required: false },
|
|
5
|
+
window: { type: null, required: false },
|
|
6
|
+
content: { type: null, required: false }
|
|
7
|
+
});
|
|
8
|
+
const { onDragStart, onDragEnd } = useWindowDragHandlers(
|
|
9
|
+
() => props.window
|
|
10
|
+
);
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<DesktopCoreWindow
|
|
15
|
+
v-bind="$props"
|
|
16
|
+
v-show="window?.state?.active !== false"
|
|
17
|
+
@drag:start="onDragStart"
|
|
18
|
+
@drag:end="onDragEnd"
|
|
19
|
+
>
|
|
20
|
+
<div class="flex flex-col h-full bg-white dark:bg-gray-950 border border-gray-200 dark:border-gray-800 rounded-lg shadow-xl overflow-hidden">
|
|
21
|
+
<DesktopWindowNav>
|
|
22
|
+
<template #prepend>
|
|
23
|
+
<slot name="nav-prepend" />
|
|
24
|
+
</template>
|
|
25
|
+
<template #append>
|
|
26
|
+
<slot name="nav-append" />
|
|
27
|
+
</template>
|
|
28
|
+
</DesktopWindowNav>
|
|
29
|
+
<div class="flex-1 min-h-0 relative">
|
|
30
|
+
<DesktopWindowContent>
|
|
31
|
+
<slot />
|
|
32
|
+
</DesktopWindowContent>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</DesktopCoreWindow>
|
|
36
|
+
</template>
|
|
37
|
+
|
|
38
|
+
<style scoped>
|
|
39
|
+
.owd-window{box-sizing:border-box;min-height:160px;min-width:160px}
|
|
40
|
+
</style>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
declare var __VLS_17: {}, __VLS_20: {}, __VLS_28: {};
|
|
2
|
+
type __VLS_Slots = {} & {
|
|
3
|
+
'nav-prepend'?: (props: typeof __VLS_17) => any;
|
|
4
|
+
} & {
|
|
5
|
+
'nav-append'?: (props: typeof __VLS_20) => any;
|
|
6
|
+
} & {
|
|
7
|
+
default?: (props: typeof __VLS_28) => any;
|
|
8
|
+
};
|
|
9
|
+
declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
10
|
+
config: {
|
|
11
|
+
type: null;
|
|
12
|
+
required: false;
|
|
13
|
+
};
|
|
14
|
+
window: {
|
|
15
|
+
type: null;
|
|
16
|
+
required: false;
|
|
17
|
+
};
|
|
18
|
+
content: {
|
|
19
|
+
type: null;
|
|
20
|
+
required: false;
|
|
21
|
+
};
|
|
22
|
+
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
23
|
+
config: {
|
|
24
|
+
type: null;
|
|
25
|
+
required: false;
|
|
26
|
+
};
|
|
27
|
+
window: {
|
|
28
|
+
type: null;
|
|
29
|
+
required: false;
|
|
30
|
+
};
|
|
31
|
+
content: {
|
|
32
|
+
type: null;
|
|
33
|
+
required: false;
|
|
34
|
+
};
|
|
35
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
36
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
37
|
+
declare const _default: typeof __VLS_export;
|
|
38
|
+
export default _default;
|
|
39
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
40
|
+
new (): {
|
|
41
|
+
$slots: S;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare var __VLS_7: {};
|
|
2
|
+
type __VLS_Slots = {} & {
|
|
3
|
+
default?: (props: typeof __VLS_7) => any;
|
|
4
|
+
};
|
|
5
|
+
declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
6
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
7
|
+
declare const _default: typeof __VLS_export;
|
|
8
|
+
export default _default;
|
|
9
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
10
|
+
new (): {
|
|
11
|
+
$slots: S;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<DesktopCoreWindowContent>
|
|
3
|
+
<slot />
|
|
4
|
+
</DesktopCoreWindowContent>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<style scoped>
|
|
8
|
+
.owd-window__content--centered{align-items:center;display:flex;flex-direction:column;justify-content:center}.owd-window__content--padded{padding:12px}
|
|
9
|
+
</style>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare var __VLS_7: {};
|
|
2
|
+
type __VLS_Slots = {} & {
|
|
3
|
+
default?: (props: typeof __VLS_7) => any;
|
|
4
|
+
};
|
|
5
|
+
declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
6
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
7
|
+
declare const _default: typeof __VLS_export;
|
|
8
|
+
export default _default;
|
|
9
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
10
|
+
new (): {
|
|
11
|
+
$slots: S;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
2
|
+
config: {
|
|
3
|
+
type: null;
|
|
4
|
+
required: false;
|
|
5
|
+
};
|
|
6
|
+
window: {
|
|
7
|
+
type: null;
|
|
8
|
+
required: false;
|
|
9
|
+
};
|
|
10
|
+
src: {
|
|
11
|
+
type: StringConstructor;
|
|
12
|
+
required: true;
|
|
13
|
+
};
|
|
14
|
+
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
15
|
+
config: {
|
|
16
|
+
type: null;
|
|
17
|
+
required: false;
|
|
18
|
+
};
|
|
19
|
+
window: {
|
|
20
|
+
type: null;
|
|
21
|
+
required: false;
|
|
22
|
+
};
|
|
23
|
+
src: {
|
|
24
|
+
type: StringConstructor;
|
|
25
|
+
required: true;
|
|
26
|
+
};
|
|
27
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
28
|
+
declare const _default: typeof __VLS_export;
|
|
29
|
+
export default _default;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
defineProps({
|
|
3
|
+
config: { type: null, required: false },
|
|
4
|
+
window: { type: null, required: false },
|
|
5
|
+
src: { type: String, required: true }
|
|
6
|
+
});
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<template>
|
|
10
|
+
<DesktopWindow v-bind="$props">
|
|
11
|
+
<iframe :src="src" class="w-full h-full border-0" />
|
|
12
|
+
</DesktopWindow>
|
|
13
|
+
</template>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
2
|
+
config: {
|
|
3
|
+
type: null;
|
|
4
|
+
required: false;
|
|
5
|
+
};
|
|
6
|
+
window: {
|
|
7
|
+
type: null;
|
|
8
|
+
required: false;
|
|
9
|
+
};
|
|
10
|
+
src: {
|
|
11
|
+
type: StringConstructor;
|
|
12
|
+
required: true;
|
|
13
|
+
};
|
|
14
|
+
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
15
|
+
config: {
|
|
16
|
+
type: null;
|
|
17
|
+
required: false;
|
|
18
|
+
};
|
|
19
|
+
window: {
|
|
20
|
+
type: null;
|
|
21
|
+
required: false;
|
|
22
|
+
};
|
|
23
|
+
src: {
|
|
24
|
+
type: StringConstructor;
|
|
25
|
+
required: true;
|
|
26
|
+
};
|
|
27
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
28
|
+
declare const _default: typeof __VLS_export;
|
|
29
|
+
export default _default;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { inject, computed } from "vue";
|
|
3
|
+
import { useToggleWindowMaximize } from "@owdproject/nuxt/runtime/composables/useToggleWindowMaximize";
|
|
4
|
+
const windowController = inject("windowController");
|
|
5
|
+
const toggleWindowMaximize = useToggleWindowMaximize();
|
|
6
|
+
function onWindowMinimize() {
|
|
7
|
+
if (!windowController?.instanced) return;
|
|
8
|
+
windowController.actions.minimize();
|
|
9
|
+
}
|
|
10
|
+
function onWindowMaximize() {
|
|
11
|
+
toggleWindowMaximize(windowController);
|
|
12
|
+
}
|
|
13
|
+
function onWindowNavDestroy() {
|
|
14
|
+
if (!windowController?.instanced) return;
|
|
15
|
+
windowController.actions.destroy();
|
|
16
|
+
}
|
|
17
|
+
const dropdownItems = computed(() => [
|
|
18
|
+
[
|
|
19
|
+
{
|
|
20
|
+
label: "Minimize",
|
|
21
|
+
icon: "i-heroicons-minus",
|
|
22
|
+
click: onWindowMinimize
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
label: windowController?.state?.maximized ? "Restore" : "Maximize",
|
|
26
|
+
icon: "i-heroicons-squares-2x2",
|
|
27
|
+
click: onWindowMaximize
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
[
|
|
31
|
+
{
|
|
32
|
+
label: "Close",
|
|
33
|
+
icon: "i-heroicons-x-mark",
|
|
34
|
+
click: onWindowNavDestroy
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
]);
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<template>
|
|
41
|
+
<DesktopCoreWindowNav
|
|
42
|
+
class="flex items-center justify-between px-3 py-1.5 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 select-none cursor-default"
|
|
43
|
+
@dblclick="onWindowMaximize"
|
|
44
|
+
>
|
|
45
|
+
<div class="flex items-center space-x-2 min-w-0">
|
|
46
|
+
<UDropdown :items="dropdownItems" :popper="{ placement: 'bottom-start' }">
|
|
47
|
+
<UButton
|
|
48
|
+
v-if="windowController?.icon"
|
|
49
|
+
:icon="windowController.icon"
|
|
50
|
+
color="gray"
|
|
51
|
+
variant="ghost"
|
|
52
|
+
size="2xs"
|
|
53
|
+
class="h-5 w-5 p-0 flex items-center justify-center rounded"
|
|
54
|
+
/>
|
|
55
|
+
<UButton
|
|
56
|
+
v-else
|
|
57
|
+
icon="i-heroicons-cog-6-tooth"
|
|
58
|
+
color="gray"
|
|
59
|
+
variant="ghost"
|
|
60
|
+
size="2xs"
|
|
61
|
+
class="h-5 w-5 p-0 flex items-center justify-center rounded"
|
|
62
|
+
/>
|
|
63
|
+
</UDropdown>
|
|
64
|
+
|
|
65
|
+
<div
|
|
66
|
+
v-if="windowController?.title"
|
|
67
|
+
class="text-xs font-semibold text-gray-700 dark:text-gray-300 truncate"
|
|
68
|
+
v-text="windowController?.title"
|
|
69
|
+
/>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<div class="flex items-center space-x-1 flex-shrink-0">
|
|
73
|
+
<UButton
|
|
74
|
+
v-if="!windowController?.instanced || windowController?.isMinimizable"
|
|
75
|
+
icon="i-heroicons-minus"
|
|
76
|
+
size="2xs"
|
|
77
|
+
color="gray"
|
|
78
|
+
variant="ghost"
|
|
79
|
+
class="h-5 w-5 p-0 flex items-center justify-center rounded"
|
|
80
|
+
@mousedown.stop
|
|
81
|
+
@click.stop="onWindowMinimize"
|
|
82
|
+
/>
|
|
83
|
+
<UButton
|
|
84
|
+
v-if="windowController?.isMaximizable"
|
|
85
|
+
icon="i-heroicons-squares-2x2"
|
|
86
|
+
size="2xs"
|
|
87
|
+
color="gray"
|
|
88
|
+
variant="ghost"
|
|
89
|
+
class="h-5 w-5 p-0 flex items-center justify-center rounded"
|
|
90
|
+
@mousedown.stop
|
|
91
|
+
@click.stop="onWindowMaximize"
|
|
92
|
+
/>
|
|
93
|
+
<UButton
|
|
94
|
+
v-if="!windowController?.instanced || windowController?.isDestroyable"
|
|
95
|
+
icon="i-heroicons-x-mark"
|
|
96
|
+
size="2xs"
|
|
97
|
+
color="red"
|
|
98
|
+
variant="ghost"
|
|
99
|
+
class="h-5 w-5 p-0 flex items-center justify-center rounded hover:bg-red-500 hover:text-white"
|
|
100
|
+
@mousedown.stop
|
|
101
|
+
@click.stop="onWindowNavDestroy"
|
|
102
|
+
/>
|
|
103
|
+
</div>
|
|
104
|
+
</DesktopCoreWindowNav>
|
|
105
|
+
</template>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function useNuxtStartMenu(): {
|
|
2
|
+
open: import("vue").Ref<boolean, boolean>;
|
|
3
|
+
searchQuery: import("vue").Ref<string, string>;
|
|
4
|
+
allEntries: import("vue").ComputedRef<any>;
|
|
5
|
+
filteredEntries: import("vue").ComputedRef<any>;
|
|
6
|
+
toggle: () => void;
|
|
7
|
+
close: () => void;
|
|
8
|
+
launchEntry: (entry: any) => Promise<void>;
|
|
9
|
+
};
|