@owdproject/nuxt-theme-paper 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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -2
  3. package/dist/module.d.mts +7 -0
  4. package/dist/module.json +9 -0
  5. package/dist/module.mjs +55 -0
  6. package/dist/runtime/assets/styles/index.css +533 -0
  7. package/dist/runtime/assets/styles/partials/checkbox.css +158 -0
  8. package/dist/runtime/assets/styles/partials/contextmenu.css +22 -0
  9. package/dist/runtime/assets/styles/partials/desktop.css +69 -0
  10. package/dist/runtime/assets/styles/partials/input.css +155 -0
  11. package/dist/runtime/assets/styles/partials/menu.css +72 -0
  12. package/dist/runtime/assets/styles/partials/scrollbar.css +25 -0
  13. package/dist/runtime/assets/styles/partials/tabs.css +163 -0
  14. package/dist/runtime/assets/styles/partials/window-chrome.css +45 -0
  15. package/dist/runtime/assets/styles/partials/window.css +30 -0
  16. package/dist/runtime/components/ButtonWindowNav.d.vue.ts +17 -0
  17. package/dist/runtime/components/ButtonWindowNav.vue +12 -0
  18. package/dist/runtime/components/ButtonWindowNav.vue.d.ts +17 -0
  19. package/dist/runtime/components/Desktop.d.vue.ts +13 -0
  20. package/dist/runtime/components/Desktop.vue +21 -0
  21. package/dist/runtime/components/Desktop.vue.d.ts +13 -0
  22. package/dist/runtime/components/DesktopContent.d.vue.ts +13 -0
  23. package/dist/runtime/components/DesktopContent.vue +9 -0
  24. package/dist/runtime/components/DesktopContent.vue.d.ts +13 -0
  25. package/dist/runtime/components/DesktopWindow.d.vue.ts +21 -0
  26. package/dist/runtime/components/DesktopWindow.vue +51 -0
  27. package/dist/runtime/components/DesktopWindow.vue.d.ts +21 -0
  28. package/dist/runtime/components/DesktopWindowContent.d.vue.ts +13 -0
  29. package/dist/runtime/components/DesktopWindowContent.vue +31 -0
  30. package/dist/runtime/components/DesktopWindowContent.vue.d.ts +13 -0
  31. package/dist/runtime/components/DesktopWindowIframe.d.vue.ts +20 -0
  32. package/dist/runtime/components/DesktopWindowIframe.vue +30 -0
  33. package/dist/runtime/components/DesktopWindowIframe.vue.d.ts +20 -0
  34. package/dist/runtime/components/DesktopWindowNav.d.vue.ts +15 -0
  35. package/dist/runtime/components/DesktopWindowNav.vue +113 -0
  36. package/dist/runtime/components/DesktopWindowNav.vue.d.ts +15 -0
  37. package/dist/runtime/components/DesktopWindowNavButton.d.vue.ts +17 -0
  38. package/dist/runtime/components/DesktopWindowNavButton.vue +54 -0
  39. package/dist/runtime/components/DesktopWindowNavButton.vue.d.ts +17 -0
  40. package/dist/runtime/components/PaperSystemBar.d.vue.ts +3 -0
  41. package/dist/runtime/components/PaperSystemBar.vue +808 -0
  42. package/dist/runtime/components/PaperSystemBar.vue.d.ts +3 -0
  43. package/dist/runtime/components/PaperWindowSnapHints.d.vue.ts +3 -0
  44. package/dist/runtime/components/PaperWindowSnapHints.vue +7 -0
  45. package/dist/runtime/components/PaperWindowSnapHints.vue.d.ts +3 -0
  46. package/dist/runtime/composables/usePaperAppearance.d.ts +8 -0
  47. package/dist/runtime/composables/usePaperAppearance.js +18 -0
  48. package/dist/runtime/plugins/paper-appearance.client.d.ts +6 -0
  49. package/dist/runtime/plugins/paper-appearance.client.js +16 -0
  50. package/dist/runtime/utils/paperAppearance.d.ts +10 -0
  51. package/dist/runtime/utils/paperAppearance.js +18 -0
  52. package/dist/types.d.mts +7 -0
  53. package/package.json +61 -4
  54. package/src/module.ts +71 -0
  55. package/src/runtime/assets/styles/index.scss +13 -0
  56. package/src/runtime/assets/styles/partials/_variables.scss +111 -0
  57. package/src/runtime/assets/styles/partials/checkbox.scss +64 -0
  58. package/src/runtime/assets/styles/partials/contextmenu.scss +25 -0
  59. package/src/runtime/assets/styles/partials/desktop.scss +70 -0
  60. package/src/runtime/assets/styles/partials/input.scss +55 -0
  61. package/src/runtime/assets/styles/partials/menu.scss +88 -0
  62. package/src/runtime/assets/styles/partials/scrollbar.scss +35 -0
  63. package/src/runtime/assets/styles/partials/tabs.scss +68 -0
  64. package/src/runtime/assets/styles/partials/window-chrome.scss +57 -0
  65. package/src/runtime/assets/styles/partials/window.scss +32 -0
  66. package/src/runtime/components/ButtonWindowNav.vue +12 -0
  67. package/src/runtime/components/Desktop.vue +22 -0
  68. package/src/runtime/components/DesktopContent.vue +14 -0
  69. package/src/runtime/components/DesktopWindow.vue +76 -0
  70. package/src/runtime/components/DesktopWindowContent.vue +31 -0
  71. package/src/runtime/components/DesktopWindowIframe.vue +30 -0
  72. package/src/runtime/components/DesktopWindowNav.vue +115 -0
  73. package/src/runtime/components/DesktopWindowNavButton.vue +55 -0
  74. package/src/runtime/components/PaperSystemBar.vue +1482 -0
  75. package/src/runtime/components/PaperWindowSnapHints.vue +7 -0
  76. package/src/runtime/composables/usePaperAppearance.ts +26 -0
  77. package/src/runtime/plugins/paper-appearance.client.ts +23 -0
  78. package/src/runtime/utils/paperAppearance.ts +31 -0
@@ -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,7 @@
1
+ <script setup>
2
+ import WindowSnapHintsBase from "@owdproject/nuxt/runtime/components/window/DesktopCoreWindowSnapHintsBase.vue";
3
+ </script>
4
+
5
+ <template>
6
+ <WindowSnapHintsBase />
7
+ </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,8 @@
1
+ import { type PaperAppearance } from '../utils/paperAppearance.js';
2
+ /** Read/write Paper light/dark appearance (theme-local, not core store). */
3
+ export declare function usePaperAppearance(): {
4
+ appearance: import("vue").Ref<PaperAppearance, PaperAppearance>;
5
+ defaultAppearance: PaperAppearance;
6
+ setAppearance: (appearance: PaperAppearance) => void;
7
+ toggleAppearance: () => void;
8
+ };
@@ -0,0 +1,18 @@
1
+ import {
2
+ DEFAULT_PAPER_APPEARANCE,
3
+ paperAppearanceId
4
+ } from "../utils/paperAppearance.js";
5
+ export function usePaperAppearance() {
6
+ function setAppearance(appearance) {
7
+ paperAppearanceId.value = appearance;
8
+ }
9
+ function toggleAppearance() {
10
+ paperAppearanceId.value = paperAppearanceId.value === "dark" ? "light" : "dark";
11
+ }
12
+ return {
13
+ appearance: paperAppearanceId,
14
+ defaultAppearance: DEFAULT_PAPER_APPEARANCE,
15
+ setAppearance,
16
+ toggleAppearance
17
+ };
18
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Paper light/dark: localStorage → shared ref → html[data-owd-appearance].
3
+ * Head bootstrap script prevents first-paint flash on reload.
4
+ */
5
+ declare const _default: any;
6
+ export default _default;
@@ -0,0 +1,16 @@
1
+ import { watch } from "vue";
2
+ import {
3
+ DEFAULT_PAPER_APPEARANCE,
4
+ PAPER_APPEARANCE_STORAGE_KEY,
5
+ paperAppearanceId,
6
+ readPersistedAppearance,
7
+ syncHtmlAppearance
8
+ } from "../utils/paperAppearance.js";
9
+ export default defineNuxtPlugin(() => {
10
+ paperAppearanceId.value = readPersistedAppearance() ?? DEFAULT_PAPER_APPEARANCE;
11
+ syncHtmlAppearance(paperAppearanceId.value);
12
+ watch(paperAppearanceId, (appearance) => {
13
+ localStorage.setItem(PAPER_APPEARANCE_STORAGE_KEY, appearance);
14
+ syncHtmlAppearance(appearance);
15
+ });
16
+ });
@@ -0,0 +1,10 @@
1
+ export type PaperAppearance = 'light' | 'dark';
2
+ export declare const PAPER_APPEARANCE_STORAGE_KEY = "owd-paper-appearance";
3
+ export declare const DEFAULT_PAPER_APPEARANCE: PaperAppearance;
4
+ /** Shared appearance state — hydrated and synced by `paper-appearance.client` plugin. */
5
+ export declare const paperAppearanceId: import("vue").Ref<PaperAppearance, PaperAppearance>;
6
+ export declare function isPaperAppearance(value: string): value is PaperAppearance;
7
+ export declare function readPersistedAppearance(): PaperAppearance | undefined;
8
+ /** Inline bootstrap: set data-owd-appearance before CSS paints (no flash). */
9
+ export declare const paperAppearanceBootstrapScript: string;
10
+ export declare function syncHtmlAppearance(appearance: PaperAppearance): void;
@@ -0,0 +1,18 @@
1
+ import { ref } from "vue";
2
+ export const PAPER_APPEARANCE_STORAGE_KEY = "owd-paper-appearance";
3
+ export const DEFAULT_PAPER_APPEARANCE = "light";
4
+ export const paperAppearanceId = ref(DEFAULT_PAPER_APPEARANCE);
5
+ export function isPaperAppearance(value) {
6
+ return value === "light" || value === "dark";
7
+ }
8
+ export function readPersistedAppearance() {
9
+ if (typeof localStorage === "undefined") return void 0;
10
+ const stored = localStorage.getItem(PAPER_APPEARANCE_STORAGE_KEY);
11
+ if (stored && isPaperAppearance(stored)) return stored;
12
+ return void 0;
13
+ }
14
+ export const paperAppearanceBootstrapScript = `(function(){var el=document.documentElement,d=${JSON.stringify(DEFAULT_PAPER_APPEARANCE)};try{var s=localStorage.getItem(${JSON.stringify(PAPER_APPEARANCE_STORAGE_KEY)});if(s==="light"||s==="dark"){el.dataset.owdAppearance=s;return}}catch(e){}el.dataset.owdAppearance=d})();`;
15
+ export function syncHtmlAppearance(appearance) {
16
+ if (typeof document === "undefined") return;
17
+ document.documentElement.dataset.owdAppearance = appearance;
18
+ }
@@ -0,0 +1,7 @@
1
+ import type { NuxtModule } from '@nuxt/schema'
2
+
3
+ import type { default as Module } from './module.mjs'
4
+
5
+ export type ModuleOptions = typeof Module extends NuxtModule<infer O> ? Partial<O> : Record<string, any>
6
+
7
+ export { default } from './module.mjs'
package/package.json CHANGED
@@ -1,6 +1,63 @@
1
1
  {
2
2
  "name": "@owdproject/nuxt-theme-paper",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "4.0.0-alpha.3",
4
+ "description": "Open Web Desktop theme",
5
+ "homepage": "https://github.com/owdproject/nuxt-theme-paper",
6
+ "license": "MIT",
7
+ "author": {
8
+ "name": "Open Web Desktop Team",
9
+ "url": "https://github.com/owdproject"
10
+ },
11
+ "type": "module",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/types.d.mts",
15
+ "development": "./src/module.ts",
16
+ "import": "./dist/module.mjs",
17
+ "default": "./dist/module.mjs"
18
+ }
19
+ },
20
+ "main": "./dist/module.mjs",
21
+ "files": [
22
+ "dist",
23
+ "src"
24
+ ],
25
+ "scripts": {
26
+ "prepack": "nuxt-module-build build",
27
+ "dev": "pnpm run dev:prepare && cd playground && pnpm exec nuxt dev",
28
+ "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && cd playground && pnpm exec nuxt prepare",
29
+ "dev:generate": "NUXT_APP_BASE_URL=${NUXT_APP_BASE_URL:-/theme-paper/} nuxt generate playground",
30
+ "validate": "desktop validate ."
31
+ },
32
+ "dependencies": {
33
+ "@nuxt/kit": "^4.6.2",
34
+ "@owdproject/nuxt-kit-primevue": "^4.0.0-alpha.3",
35
+ "@owdproject/nuxt": "^4.0.0-alpha.3",
36
+ "@owdproject/nuxt-kit-tailwind": "^4.0.0-alpha.3"
37
+ },
38
+ "devDependencies": {
39
+ "@nuxt/module-builder": "^1.0.2",
40
+ "@owdproject/core": "^4.0.0-alpha.3",
41
+ "@owdproject/nuxt-kit-primevue": "^4.0.0-alpha.3",
42
+ "nuxt": "^4.6.2",
43
+ "typescript": "~6.0.3",
44
+ "vue-tsc": "^3.3.13",
45
+ "jiti": "^2.7.0",
46
+ "tailwindcss": "^3.4.19"
47
+ },
48
+ "peerDependencies": {
49
+ "@owdproject/core": "^4.0.0-alpha.3",
50
+ "@owdproject/nuxt-kit-primevue": "^4.0.0-alpha.3",
51
+ "@owdproject/nuxt-kit-tailwind": "^4.0.0-alpha.3",
52
+ "@owdproject/nuxt": "^4.0.0-alpha.3",
53
+ "vue": "^3.5.33",
54
+ "vue-i18n": "^11.0.0",
55
+ "primevue": "^4.5.5",
56
+ "nuxt": "^4.6.2"
57
+ },
58
+ "publishConfig": {
59
+ "access": "public",
60
+ "tag": "alpha",
61
+ "registry": "https://registry.npmjs.org/"
62
+ }
63
+ }
package/src/module.ts ADDED
@@ -0,0 +1,71 @@
1
+ import { existsSync } from 'node:fs'
2
+ import {
3
+ createResolver,
4
+ addComponentsDir,
5
+ addImportsDir,
6
+ addPlugin,
7
+ installModule,
8
+ } from '@nuxt/kit'
9
+ import { defineDesktopTheme } from '@owdproject/nuxt'
10
+ import { registerThemeTailwindPath } from '@owdproject/nuxt-kit-tailwind/kit/registerTailwindPath'
11
+ import { paperAppearanceBootstrapScript } from './runtime/utils/paperAppearance'
12
+
13
+ export default defineDesktopTheme({
14
+ meta: {
15
+ name: 'desktop-theme-paper',
16
+ },
17
+ defaults: {
18
+ name: 'paper',
19
+ systemBar: { enabled: true, position: 'top', startButton: true },
20
+ dockBar: { enabled: false },
21
+ workspaces: { enabled: false },
22
+ windows: { position: 'fixed' },
23
+ },
24
+ async setup(_options, nuxt) {
25
+ const { resolve } = createResolver(import.meta.url)
26
+
27
+ await installModule('@owdproject/nuxt-kit-primevue', { explorer: false })
28
+
29
+ registerThemeTailwindPath(nuxt, import.meta.url)
30
+
31
+ addComponentsDir({
32
+ path: resolve('./runtime/components'),
33
+ global: true,
34
+ })
35
+
36
+ addImportsDir(resolve('./runtime/composables'))
37
+
38
+ const css = resolve('./runtime/assets/styles/index.css')
39
+ nuxt.options.css.push(existsSync(css) ? css : resolve('./runtime/assets/styles/index.scss'))
40
+
41
+ const head = nuxt.options.app.head ?? {}
42
+ const existingScripts = Array.isArray(head.script)
43
+ ? head.script
44
+ : head.script
45
+ ? [head.script]
46
+ : []
47
+
48
+ nuxt.options.app.head = {
49
+ ...head,
50
+ htmlAttrs: {
51
+ 'data-owd-appearance': 'light',
52
+ ...(head.htmlAttrs ?? {}),
53
+ },
54
+ script: [
55
+ {
56
+ key: 'paper-appearance-bootstrap',
57
+ innerHTML: paperAppearanceBootstrapScript,
58
+ tagPosition: 'head',
59
+ type: 'text/javascript',
60
+ },
61
+ ...existingScripts,
62
+ ],
63
+ }
64
+
65
+ addPlugin({
66
+ src: resolve('./runtime/plugins/paper-appearance.client'),
67
+ mode: 'client',
68
+ order: 1,
69
+ })
70
+ },
71
+ })
@@ -0,0 +1,13 @@
1
+ @use './partials/variables';
2
+ @use './partials/contextmenu';
3
+ @use './partials/menu';
4
+ @use './partials/scrollbar';
5
+ @use './partials/window';
6
+ @use './partials/window-chrome';
7
+ @use './partials/desktop';
8
+ @use './partials/input';
9
+ @use './partials/tabs';
10
+ @use './partials/checkbox';
11
+
12
+
13
+
@@ -0,0 +1,111 @@
1
+ /* Light (default) — warm neutral Paper */
2
+ :root,
3
+ html[data-owd-appearance='light'] {
4
+ color-scheme: light;
5
+
6
+ --paper-bg: #ececee;
7
+ --paper-surface: #f4f4f6;
8
+ --paper-menu-bg: #f4f4f6;
9
+ --paper-menu-header-bg: #f4f4f6;
10
+ /* Same mix ratio in both schemes → equal hairline weight on light/dark */
11
+ --paper-border: color-mix(in srgb, var(--paper-text) 10%, var(--paper-surface));
12
+ --paper-border-window: color-mix(in srgb, var(--paper-text) 18%, var(--paper-surface));
13
+ --paper-grid-color: color-mix(in srgb, var(--paper-text) 6%, transparent);
14
+ --paper-line: var(--paper-border);
15
+ --paper-line-strong: var(--paper-border);
16
+ --paper-text: #2c2c30;
17
+ --paper-text-secondary: #68686f;
18
+ --paper-text-tertiary: #98989f;
19
+ --paper-accent: #3b6fd4;
20
+ --paper-accent-soft: #e8eef8;
21
+ --paper-scrim: rgba(44, 44, 48, 0.14);
22
+ --paper-scrollbar-track: transparent;
23
+ --paper-scrollbar-thumb: var(--paper-border);
24
+ --paper-scrollbar-thumb-hover: color-mix(in srgb, var(--paper-text) 22%, var(--paper-surface));
25
+ --paper-shadow-menu: none;
26
+ --paper-shadow-bar: none;
27
+ --paper-shadow-window:
28
+ 0 1px 2px rgba(44, 44, 48, 0.04),
29
+ 0 8px 24px -6px rgba(44, 44, 48, 0.08);
30
+ }
31
+
32
+ /* Dark — lifted surfaces, same accent family */
33
+ html[data-owd-appearance='dark'] {
34
+ color-scheme: dark;
35
+
36
+ --paper-bg: #1c1c20;
37
+ --paper-surface: #26262a;
38
+ --paper-menu-bg: #26262a;
39
+ --paper-menu-header-bg: #26262a;
40
+ --paper-border: color-mix(in srgb, var(--paper-text) 10%, var(--paper-surface));
41
+ --paper-border-window: color-mix(in srgb, var(--paper-text) 12%, var(--paper-surface));
42
+ --paper-grid-color: color-mix(in srgb, var(--paper-text) 3.5%, transparent);
43
+ --paper-line: var(--paper-border);
44
+ --paper-line-strong: var(--paper-border);
45
+ --paper-text: #e6e6ea;
46
+ --paper-text-secondary: #94949c;
47
+ --paper-text-tertiary: #707078;
48
+ --paper-accent: #3b6fd4;
49
+ --paper-accent-soft: rgba(59, 111, 212, 0.14);
50
+ --paper-scrim: rgba(0, 0, 0, 0.35);
51
+ --paper-scrollbar-track: transparent;
52
+ --paper-scrollbar-thumb: var(--paper-border);
53
+ --paper-scrollbar-thumb-hover: color-mix(in srgb, var(--paper-text) 22%, var(--paper-surface));
54
+ --paper-shadow-menu: none;
55
+ --paper-shadow-bar: none;
56
+ --paper-shadow-window:
57
+ 0 1px 2px rgba(0, 0, 0, 0.15),
58
+ 0 10px 28px -6px rgba(0, 0, 0, 0.28);
59
+ }
60
+
61
+ /* Shared tokens (both schemes) */
62
+ :root {
63
+ --paper-font: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto,
64
+ sans-serif;
65
+ --paper-mono: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
66
+ --paper-bar-height: 2.75rem;
67
+ --paper-nav-height: 2rem;
68
+ --paper-nav-button-size: 1.75rem;
69
+ /* Single corner scale — containers, controls, and PrimeVue overlays */
70
+ --paper-radius: 6px;
71
+ --paper-radius-pill: 9999px;
72
+ --paper-radius-circle: 50%;
73
+ --paper-radius-sm: var(--paper-radius);
74
+ --paper-radius-md: var(--paper-radius);
75
+ --paper-radius-lg: var(--paper-radius);
76
+ --paper-z-bar: 10061;
77
+ --paper-z-menu: 10070;
78
+
79
+ /* PrimeVue 4 — navigation / overlay surfaces */
80
+ --p-content-background: var(--paper-menu-bg);
81
+ --p-content-border-color: var(--paper-border);
82
+ --p-content-color: var(--paper-text);
83
+ --p-content-border-radius: var(--paper-radius);
84
+
85
+ --p-contextmenu-background: var(--paper-menu-bg);
86
+ --p-contextmenu-border-color: var(--paper-border);
87
+ --p-contextmenu-border-radius: var(--paper-radius);
88
+ --p-contextmenu-color: var(--paper-text);
89
+ --p-contextmenu-shadow: var(--paper-shadow-menu);
90
+ --p-contextmenu-submenu-background: var(--paper-menu-bg);
91
+
92
+ --p-menu-background: var(--paper-menu-bg);
93
+ --p-menu-border-color: var(--paper-border);
94
+ --p-menu-border-radius: var(--paper-radius);
95
+ --p-menu-color: var(--paper-text);
96
+ --p-menu-shadow: var(--paper-shadow-menu);
97
+ --p-menu-submenu-background: var(--paper-menu-bg);
98
+
99
+ --p-tieredmenu-background: var(--paper-menu-bg);
100
+ --p-tieredmenu-border-color: var(--paper-border);
101
+ --p-tieredmenu-border-radius: var(--paper-radius);
102
+ --p-tieredmenu-color: var(--paper-text);
103
+ --p-tieredmenu-shadow: var(--paper-shadow-menu);
104
+ --p-tieredmenu-submenu-background: var(--paper-menu-bg);
105
+
106
+ --p-menubar-submenu-background: var(--paper-menu-bg);
107
+ --p-menubar-submenu-border-color: var(--paper-border);
108
+ --p-menubar-submenu-border-radius: var(--paper-radius);
109
+ --p-menubar-submenu-color: var(--paper-text);
110
+ --p-menubar-submenu-shadow: var(--paper-shadow-menu);
111
+ }
@@ -0,0 +1,64 @@
1
+ @use './variables';
2
+
3
+ /* PrimeVue Checkbox inside paper theme */
4
+ .owd-desktop--paper {
5
+ --p-checkbox-width: 16px;
6
+ --p-checkbox-height: 16px;
7
+ --p-checkbox-border-radius: 4px;
8
+ --p-checkbox-background: var(--paper-surface);
9
+ --p-checkbox-hover-background: color-mix(in srgb, var(--paper-surface) 95%, var(--paper-text));
10
+ --p-checkbox-checked-background: var(--paper-accent);
11
+ --p-checkbox-border-color: var(--paper-border);
12
+ --p-checkbox-hover-border-color: color-mix(in srgb, var(--paper-border) 70%, var(--paper-text));
13
+ --p-checkbox-checked-border-color: var(--paper-accent);
14
+ --p-checkbox-shadow: none;
15
+
16
+ .p-checkbox {
17
+ display: inline-flex;
18
+ position: relative;
19
+ user-select: none;
20
+ vertical-align: middle;
21
+ width: var(--p-checkbox-width);
22
+ height: var(--p-checkbox-height);
23
+ margin-top: -2px;
24
+
25
+ .p-checkbox-box {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ border: 1px solid var(--p-checkbox-border-color);
30
+ background: var(--p-checkbox-background);
31
+ width: var(--p-checkbox-width) !important;
32
+ height: var(--p-checkbox-height) !important;
33
+ min-width: var(--p-checkbox-width) !important;
34
+ min-height: var(--p-checkbox-height) !important;
35
+ border-radius: var(--p-checkbox-border-radius);
36
+ transition: background 0.15s, border-color 0.15s, box-shadow 0.15s;
37
+
38
+ .p-checkbox-icon {
39
+ font-size: 10px;
40
+ transition: transform 0.1s;
41
+ }
42
+ }
43
+
44
+ &.p-checkbox-checked {
45
+ .p-checkbox-box {
46
+ background: var(--p-checkbox-checked-background);
47
+ border-color: var(--p-checkbox-checked-border-color);
48
+ color: white;
49
+ }
50
+ }
51
+
52
+ &:not(.p-checkbox-disabled):hover {
53
+ .p-checkbox-box {
54
+ border-color: var(--p-checkbox-hover-border-color);
55
+ background: var(--p-checkbox-hover-background);
56
+ }
57
+
58
+ &.p-checkbox-checked .p-checkbox-box {
59
+ background: var(--p-checkbox-checked-background);
60
+ border-color: var(--p-checkbox-checked-border-color);
61
+ }
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,25 @@
1
+ .p-contextmenu {
2
+ font-family: var(--paper-font);
3
+ font-size: 0.8125rem;
4
+ color: var(--paper-text);
5
+ background-color: var(--paper-menu-bg);
6
+ border: 1px solid var(--paper-border);
7
+ border-radius: var(--paper-radius);
8
+ box-shadow: none;
9
+
10
+ .p-contextmenu-item-content {
11
+ border-radius: var(--paper-radius);
12
+ transition: background-color 0.12s ease, color 0.12s ease;
13
+ }
14
+
15
+ .p-contextmenu-item:not(.p-disabled) > .p-contextmenu-item-content:hover,
16
+ .p-contextmenu-item.p-focus > .p-contextmenu-item-content {
17
+ background: var(--paper-accent-soft);
18
+ color: var(--paper-accent);
19
+ }
20
+
21
+ .p-contextmenu-separator {
22
+ margin: 0.25rem 0.375rem;
23
+ border-top: 1px solid var(--paper-border);
24
+ }
25
+ }
@@ -0,0 +1,70 @@
1
+ /* Desktop shell: no document scrollbars — scroll only inside windows/apps */
2
+ html,
3
+ body {
4
+ height: 100%;
5
+ margin: 0;
6
+ overflow: hidden;
7
+ overscroll-behavior: none;
8
+ }
9
+
10
+ #__nuxt {
11
+ height: 100%;
12
+ overflow: hidden;
13
+ }
14
+
15
+ .owd-desktop.owd-desktop--paper {
16
+ display: flex;
17
+ flex-direction: column;
18
+ box-sizing: border-box;
19
+ width: 100%;
20
+ max-width: 100%;
21
+ height: 100dvh;
22
+ overflow: hidden;
23
+ background: var(--paper-bg);
24
+ background-image:
25
+ linear-gradient(var(--paper-grid-color) 1px, transparent 1px),
26
+ linear-gradient(90deg, var(--paper-grid-color) 1px, transparent 1px);
27
+ background-size: 80px 80px;
28
+ background-position: center;
29
+ color: var(--paper-text);
30
+ font-family: var(--paper-font);
31
+ font-size: 14px;
32
+ line-height: 1.5;
33
+ -webkit-font-smoothing: antialiased;
34
+ }
35
+
36
+ .owd-desktop--paper .owd-desktop__system-bar {
37
+ position: relative;
38
+ z-index: var(--paper-z-bar);
39
+ flex-shrink: 0;
40
+ }
41
+
42
+ .owd-desktop--paper .paper-shell__stage {
43
+ position: relative;
44
+ flex: 1;
45
+ min-height: 0;
46
+ overflow: hidden;
47
+ }
48
+
49
+ .owd-desktop--paper .desktop-window__content--centered {
50
+ display: flex;
51
+ flex-direction: column;
52
+ justify-content: center;
53
+ align-items: center;
54
+ height: 100%;
55
+ min-height: 0;
56
+ text-align: center;
57
+ }
58
+
59
+ .owd-desktop--paper .desktop-window__content--centered > * {
60
+ width: 100%;
61
+ }
62
+
63
+ .owd-desktop--paper .desktop-window__content a {
64
+ color: var(--paper-accent);
65
+ text-decoration: none;
66
+ }
67
+
68
+ .owd-desktop--paper .desktop-window__content a:hover {
69
+ text-decoration: underline;
70
+ }
@@ -0,0 +1,55 @@
1
+ @use './variables';
2
+
3
+ /* Input elements inside the paper theme */
4
+ .owd-desktop--paper {
5
+ /* Style for InputText */
6
+ .p-inputtext {
7
+ font-family: var(--paper-font);
8
+ font-size: 14px;
9
+ background: var(--paper-surface);
10
+ border: 1px solid var(--paper-border);
11
+ border-radius: var(--paper-radius);
12
+ color: var(--paper-text);
13
+ padding: 6px 12px;
14
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
15
+ box-shadow: none;
16
+
17
+ &::placeholder {
18
+ color: var(--paper-text-tertiary);
19
+ }
20
+
21
+ &:hover {
22
+ border-color: color-mix(in srgb, var(--paper-border) 70%, var(--paper-text));
23
+ }
24
+
25
+ &:focus {
26
+ outline: none;
27
+ border-color: var(--paper-accent);
28
+ box-shadow: 0 0 0 2px var(--paper-accent-soft);
29
+ }
30
+ }
31
+
32
+ /* Style for generic buttons */
33
+ .p-button {
34
+ font-family: var(--paper-font);
35
+ font-size: 14px;
36
+ font-weight: 500;
37
+ color: var(--paper-text);
38
+ background: var(--paper-surface) !important;
39
+ border: 1px solid var(--paper-border) !important;
40
+ border-radius: var(--paper-radius);
41
+ padding: 6px 12px;
42
+ cursor: pointer;
43
+ transition: background 0.15s ease-in-out, border-color 0.15s ease-in-out;
44
+
45
+ &:hover {
46
+ background: color-mix(in srgb, var(--paper-surface) 92%, var(--paper-text)) !important;
47
+ border-color: color-mix(in srgb, var(--paper-border) 60%, var(--paper-text)) !important;
48
+ }
49
+
50
+ &:active {
51
+ background: color-mix(in srgb, var(--paper-surface) 84%, var(--paper-text)) !important;
52
+ border-color: color-mix(in srgb, var(--paper-border) 40%, var(--paper-text)) !important;
53
+ }
54
+ }
55
+ }