@owdproject/nuxt-theme-paper 0.0.0-stage → 4.0.0-alpha.4

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 +17 -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 +24 -0
  78. package/src/runtime/utils/paperAppearance.ts +31 -0
@@ -0,0 +1,88 @@
1
+ /* Popup / overlay menus (teleport to body) */
2
+ .p-menu,
3
+ .p-tieredmenu,
4
+ .p-menubar .p-menubar-submenu {
5
+ font-family: var(--paper-font);
6
+ font-size: 0.8125rem;
7
+ color: var(--paper-text);
8
+ background-color: var(--paper-menu-bg);
9
+ border: 1px solid var(--paper-border);
10
+ border-radius: var(--paper-radius);
11
+ box-shadow: none;
12
+ }
13
+
14
+ .p-menu {
15
+ .p-menu-list {
16
+ padding: 0.25rem;
17
+ }
18
+
19
+ .p-menu-item-content {
20
+ border-radius: var(--paper-radius);
21
+ transition: background-color 0.12s ease, color 0.12s ease;
22
+ }
23
+
24
+ .p-menu-item:not(.p-disabled) > .p-menu-item-content:hover,
25
+ .p-menu-item.p-focus > .p-menu-item-content {
26
+ background: var(--paper-accent-soft);
27
+ color: var(--paper-accent);
28
+ }
29
+
30
+ .p-menu-separator {
31
+ margin: 0.25rem 0.375rem;
32
+ border-top: 1px solid var(--paper-border);
33
+ }
34
+ }
35
+
36
+ .p-tieredmenu {
37
+ .p-tieredmenu-root-list,
38
+ .p-tieredmenu-submenu {
39
+ padding: 0.25rem;
40
+ }
41
+
42
+ .p-tieredmenu-item-content {
43
+ border-radius: var(--paper-radius);
44
+ transition: background-color 0.12s ease, color 0.12s ease;
45
+ }
46
+
47
+ .p-tieredmenu-item:not(.p-disabled) > .p-tieredmenu-item-content:hover,
48
+ .p-tieredmenu-item.p-focus > .p-tieredmenu-item-content,
49
+ .p-tieredmenu-item-active > .p-tieredmenu-item-content {
50
+ background: var(--paper-accent-soft);
51
+ color: var(--paper-accent);
52
+ }
53
+
54
+ .p-tieredmenu-separator {
55
+ margin: 0.25rem 0.375rem;
56
+ border-top: 1px solid var(--paper-border);
57
+ }
58
+
59
+ .p-tieredmenu-submenu {
60
+ background-color: var(--paper-menu-bg);
61
+ border: 1px solid var(--paper-border);
62
+ border-radius: var(--paper-radius);
63
+ box-shadow: none;
64
+ }
65
+ }
66
+
67
+ .p-menubar {
68
+ .p-menubar-submenu {
69
+ padding: 0.25rem;
70
+ border-radius: var(--paper-radius);
71
+
72
+ .p-menubar-item-content {
73
+ border-radius: var(--paper-radius);
74
+ transition: background-color 0.12s ease, color 0.12s ease;
75
+ }
76
+
77
+ .p-menubar-item:not(.p-disabled) > .p-menubar-item-content:hover,
78
+ .p-menubar-item.p-focus > .p-menubar-item-content {
79
+ background: var(--paper-accent-soft);
80
+ color: var(--paper-accent);
81
+ }
82
+ }
83
+
84
+ .p-menubar-separator {
85
+ margin: 0.25rem 0.375rem;
86
+ border-top: 1px solid var(--paper-border);
87
+ }
88
+ }
@@ -0,0 +1,35 @@
1
+ @mixin paper-scrollbar {
2
+ scrollbar-width: thin;
3
+ scrollbar-color: var(--paper-scrollbar-thumb) var(--paper-scrollbar-track);
4
+
5
+ &::-webkit-scrollbar {
6
+ width: 8px;
7
+ height: 8px;
8
+ }
9
+
10
+ &::-webkit-scrollbar-track {
11
+ background: var(--paper-scrollbar-track);
12
+ }
13
+
14
+ &::-webkit-scrollbar-thumb {
15
+ background-color: var(--paper-scrollbar-thumb);
16
+ border: 2px solid transparent;
17
+ border-radius: var(--paper-radius-pill);
18
+ background-clip: padding-box;
19
+ }
20
+
21
+ &::-webkit-scrollbar-thumb:hover {
22
+ background-color: var(--paper-scrollbar-thumb-hover);
23
+ }
24
+
25
+ &::-webkit-scrollbar-corner {
26
+ background: transparent;
27
+ }
28
+ }
29
+
30
+ /* Scroll only inside window content and app panels — not on body */
31
+ .owd-desktop--paper {
32
+ .desktop-window__content {
33
+ @include paper-scrollbar;
34
+ }
35
+ }
@@ -0,0 +1,68 @@
1
+ @use './variables';
2
+
3
+ /* PrimeVue Tabs inside paper theme */
4
+ .owd-desktop--paper {
5
+ .p-tabs {
6
+ display: flex;
7
+ flex-direction: column;
8
+ width: 100%;
9
+
10
+ .p-tablist {
11
+ background: transparent;
12
+ border-bottom: 1px solid var(--paper-border);
13
+ }
14
+
15
+ .p-tablist-tab-list {
16
+ display: flex;
17
+ flex-direction: row;
18
+ gap: 4px;
19
+ border: 0;
20
+ margin: 0;
21
+ padding: 0;
22
+ list-style: none;
23
+
24
+ .p-tab {
25
+ font-family: var(--paper-font);
26
+ font-size: 12px;
27
+ font-weight: 500;
28
+ color: var(--paper-text-secondary);
29
+ background: transparent;
30
+ border: 1px solid transparent;
31
+ border-bottom: 0;
32
+ border-top-left-radius: var(--paper-radius);
33
+ border-top-right-radius: var(--paper-radius);
34
+ padding: 4px 10px;
35
+ cursor: pointer;
36
+ transition: all 0.15s ease-in-out;
37
+ margin-bottom: -1px;
38
+
39
+ &:hover {
40
+ color: var(--paper-text);
41
+ background: color-mix(in srgb, var(--paper-surface) 95%, var(--paper-text));
42
+ border-color: transparent;
43
+ border-bottom: 0;
44
+ }
45
+
46
+ &.p-tab-active {
47
+ color: var(--paper-accent);
48
+ background: var(--paper-surface);
49
+ border-color: var(--paper-border);
50
+ border-bottom: 1px solid var(--paper-surface);
51
+
52
+ &:hover {
53
+ border-color: var(--paper-border);
54
+ border-bottom: 1px solid var(--paper-surface);
55
+ background: var(--paper-surface);
56
+ }
57
+ }
58
+ }
59
+ }
60
+
61
+ .p-tabpanels {
62
+ background: transparent;
63
+ padding: 12px 0 0 0;
64
+ border: 0;
65
+ color: var(--paper-text);
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,57 @@
1
+ /*
2
+ * Window titlebar chrome for Paper theme windows.
3
+ * Layout/sizing lives in Vue components; colors and hover states here.
4
+ */
5
+ .owd-desktop--paper .paper-window.owd-window.resizable-component {
6
+ .paper-window-nav {
7
+ min-height: var(--paper-nav-height);
8
+ padding: 0 0.5rem;
9
+ border-bottom: 1px solid var(--paper-border-window);
10
+ background: var(--paper-surface);
11
+ color: var(--paper-text);
12
+
13
+ .owd-window-nav__btn-group--append {
14
+ align-self: stretch;
15
+ }
16
+
17
+ .owd-window-nav__btn-group--append-inner {
18
+ display: flex;
19
+ align-items: stretch;
20
+ }
21
+
22
+ .owd-window-nav__button {
23
+ color: var(--paper-text-secondary);
24
+ transition: background-color 0.12s ease, color 0.12s ease;
25
+
26
+ &:hover {
27
+ background: var(--paper-bg);
28
+ color: var(--paper-text);
29
+ }
30
+
31
+ &:active {
32
+ background: color-mix(in srgb, var(--paper-text) 8%, var(--paper-bg));
33
+ }
34
+
35
+ &--close:hover {
36
+ background: color-mix(in srgb, #c0392b 88%, var(--paper-surface));
37
+ color: #fff;
38
+ }
39
+
40
+ &--close:active {
41
+ background: color-mix(in srgb, #e74c3c 92%, var(--paper-surface));
42
+ color: #fff;
43
+ }
44
+ }
45
+ }
46
+ }
47
+
48
+ .owd-desktop--paper .owd-window.resizable-component:not(.paper-window) .owd-window-nav {
49
+ .owd-window-nav__button {
50
+ color: var(--paper-text-secondary);
51
+
52
+ &:hover {
53
+ background: var(--paper-bg);
54
+ color: var(--paper-text);
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,32 @@
1
+ /* Theme Window chrome lives in Window*.vue (scoped). Globals only for fallbacks. */
2
+
3
+ .owd-desktop--paper .paper-window.owd-window.resizable-component {
4
+ overflow: hidden;
5
+ }
6
+
7
+ /* Apps that use DesktopWindow without theme <Window> (e.g. kit-fs explorer) */
8
+ .owd-desktop--paper .owd-window.resizable-component:not(.paper-window) {
9
+ box-sizing: border-box;
10
+ overflow: hidden;
11
+ background: var(--paper-surface);
12
+ border: 1px solid var(--paper-border-window);
13
+ border-radius: var(--paper-radius);
14
+ }
15
+
16
+ .owd-desktop--paper .owd-window.resizable-component:not(.paper-window) .owd-window-nav {
17
+ min-height: var(--paper-nav-height);
18
+ padding: 0 0.625rem;
19
+ border-bottom: 1px solid var(--paper-border-window);
20
+ background: var(--paper-surface);
21
+ align-items: center;
22
+ }
23
+
24
+ .owd-desktop--paper .owd-window.resizable-component:not(.paper-window) .desktop-window__content {
25
+ background: var(--paper-surface);
26
+ }
27
+
28
+ .owd-desktop--paper .desktop-window__content--padded {
29
+ padding: 10px;
30
+ box-sizing: border-box;
31
+ }
32
+
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ defineProps<{
3
+ title?: string
4
+ disabled?: boolean
5
+ }>()
6
+ </script>
7
+
8
+ <template>
9
+ <DesktopWindowNavButton :title="title" :disabled="disabled">
10
+ <slot />
11
+ </DesktopWindowNavButton>
12
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import PaperSystemBar from './PaperSystemBar.vue'
4
+ import PaperWindowSnapHints from './PaperWindowSnapHints.vue'
5
+ import { useDesktopWorkArea } from '@owdproject/nuxt/runtime/composables/useDesktopWorkArea'
6
+
7
+ const shellStageRef = ref<HTMLElement | null>(null)
8
+ useDesktopWorkArea(shellStageRef)
9
+ </script>
10
+
11
+ <template>
12
+ <DesktopCore v-bind="$props" class="owd-desktop owd-desktop--paper">
13
+ <PaperSystemBar />
14
+ <PaperWindowSnapHints />
15
+ <div ref="shellStageRef" class="paper-shell__stage">
16
+ <DesktopContent>
17
+ <slot />
18
+ </DesktopContent>
19
+ <DesktopCoreApplicationRender />
20
+ </div>
21
+ </DesktopCore>
22
+ </template>
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <div class="paper-desktop__content">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <style scoped>
8
+ .paper-desktop__content {
9
+ position: relative;
10
+ width: 100%;
11
+ height: 100%;
12
+ overflow: hidden;
13
+ }
14
+ </style>
@@ -0,0 +1,76 @@
1
+ <script setup lang="ts">
2
+ import { computed, useAttrs } from 'vue'
3
+ import { useWindowDragHandlers } from '@owdproject/nuxt/runtime/composables/useWindowDragHandlers'
4
+
5
+ const props = defineProps<{
6
+ window?: IWindowController
7
+ content?: WindowContent
8
+ }>()
9
+
10
+ defineOptions({ inheritAttrs: false })
11
+
12
+ const attrs = useAttrs()
13
+
14
+ const windowRootClass = computed(() => {
15
+ return ['paper-window', attrs.class].filter(Boolean)
16
+ })
17
+
18
+ const windowRef = computed(
19
+ () => (props.window ?? attrs.window) as IWindowController | undefined,
20
+ )
21
+ const contentRef = computed(
22
+ () => (props.content ?? attrs.content) as WindowContent | undefined,
23
+ )
24
+
25
+ const { onDragStart, onDragEnd } = useWindowDragHandlers(
26
+ () => windowRef.value,
27
+ )
28
+ </script>
29
+
30
+ <template>
31
+ <DesktopCoreWindow
32
+ :window="windowRef"
33
+ :content="contentRef"
34
+ v-show="windowRef?.state?.active !== false"
35
+ :class="windowRootClass"
36
+ @drag:start="onDragStart"
37
+ @drag:end="onDragEnd"
38
+ >
39
+ <div class="paper-window__frame">
40
+ <DesktopWindowNav>
41
+ <template v-slot:prepend>
42
+ <slot name="nav-prepend" />
43
+ </template>
44
+ <template v-slot:append>
45
+ <slot name="nav-append" />
46
+ </template>
47
+ </DesktopWindowNav>
48
+ <DesktopWindowContent>
49
+ <slot />
50
+ </DesktopWindowContent>
51
+ </div>
52
+ </DesktopCoreWindow>
53
+ </template>
54
+
55
+ <style scoped>
56
+ .paper-window {
57
+ border-radius: var(--paper-radius);
58
+ overflow: hidden;
59
+ }
60
+
61
+ .paper-window__frame {
62
+ display: flex;
63
+ flex-direction: column;
64
+ height: 100%;
65
+ box-sizing: border-box;
66
+ overflow: hidden;
67
+ background: var(--paper-surface);
68
+ border: 1px solid var(--paper-border-window);
69
+ border-radius: var(--paper-radius);
70
+ }
71
+
72
+ .paper-window :deep(.desktop-window__content) {
73
+ flex: 1;
74
+ min-height: 0;
75
+ }
76
+ </style>
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <DesktopCoreWindowContent class="paper-window__body">
3
+ <div class="paper-window-body">
4
+ <slot />
5
+ </div>
6
+ </DesktopCoreWindowContent>
7
+ </template>
8
+
9
+ <style scoped lang="scss">
10
+ :deep(.desktop-window__content) {
11
+ flex: 1 1 auto;
12
+ display: flex;
13
+ flex-direction: column;
14
+ min-height: 0;
15
+ }
16
+
17
+ .paper-window__body {
18
+ flex: 1 1 auto;
19
+ min-height: 0;
20
+ overflow: auto;
21
+ background: var(--paper-surface);
22
+ }
23
+
24
+ .paper-window-body {
25
+ display: flex;
26
+ flex-direction: column;
27
+ flex: 1 1 auto;
28
+ min-height: 0;
29
+ height: 100%;
30
+ }
31
+ </style>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps<{
3
+ config?: WindowConfig
4
+ window?: IWindowController
5
+ src: string
6
+ }>()
7
+ </script>
8
+
9
+ <template>
10
+ <DesktopWindow v-bind="$props">
11
+ <template #nav-prepend>
12
+ <slot name="nav-prepend" />
13
+ </template>
14
+ <template #nav-append>
15
+ <slot name="nav-append" />
16
+ </template>
17
+ <iframe :src="src" />
18
+ </DesktopWindow>
19
+ </template>
20
+
21
+ <style scoped lang="scss">
22
+ iframe {
23
+ display: block;
24
+ flex: 1 1 auto;
25
+ min-height: 0;
26
+ border: 0;
27
+ width: 100%;
28
+ height: 100%;
29
+ }
30
+ </style>
@@ -0,0 +1,115 @@
1
+ <script setup lang="ts">
2
+ import { inject } from 'vue'
3
+
4
+ const windowController = inject<IWindowController>('windowController')
5
+
6
+ function onClose() {
7
+ if (!windowController?.instanced) return
8
+ windowController.actions.destroy()
9
+ }
10
+ </script>
11
+
12
+ <template>
13
+ <DesktopCoreWindowNav class="paper-window-nav">
14
+ <div
15
+ v-if="$slots.prepend"
16
+ class="owd-window-nav__btn-group owd-window-nav__btn-group--prepend"
17
+ >
18
+ <slot name="prepend" />
19
+ </div>
20
+
21
+ <div v-if="windowController?.windowTitle" class="paper-window-nav__title-container">
22
+ <Icon
23
+ v-if="windowController?.icon"
24
+ :name="windowController.icon"
25
+ class="paper-window-nav__icon"
26
+ />
27
+ <span class="paper-window-nav__title">
28
+ {{ windowController.windowTitle }}
29
+ </span>
30
+ </div>
31
+
32
+ <div class="desktop-window-nav__btn-group owd-window-nav__btn-group owd-window-nav__btn-group--append">
33
+ <div
34
+ v-if="$slots.append"
35
+ class="owd-window-nav__btn-group owd-window-nav__btn-group--append-inner"
36
+ >
37
+ <slot name="append" />
38
+ </div>
39
+
40
+ <DesktopWindowNavButton
41
+ v-if="!windowController?.instanced || windowController?.isDestroyable"
42
+ class="owd-window-nav__button--close"
43
+ title="Close"
44
+ @mousedown.stop
45
+ @click.stop="onClose"
46
+ >
47
+ <svg width="9.5" height="9.5" viewBox="0 0 12 12" aria-hidden="true">
48
+ <path
49
+ d="M1 1l10 10M11 1L1 11"
50
+ fill="none"
51
+ stroke="currentColor"
52
+ stroke-width="1.6"
53
+ stroke-linecap="round"
54
+ />
55
+ </svg>
56
+ </DesktopWindowNavButton>
57
+ </div>
58
+ </DesktopCoreWindowNav>
59
+ </template>
60
+
61
+ <style scoped lang="scss">
62
+ .paper-window-nav {
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: space-between;
66
+ gap: 0.5rem;
67
+ flex-shrink: 0;
68
+ min-height: var(--paper-nav-height);
69
+ }
70
+
71
+ .paper-window-nav__title-container {
72
+ display: flex;
73
+ align-items: center;
74
+ gap: 6px;
75
+ flex: 1;
76
+ min-width: 0;
77
+ }
78
+
79
+ .paper-window-nav__icon {
80
+ width: 14px;
81
+ height: 14px;
82
+ flex-shrink: 0;
83
+ color: var(--paper-text-secondary);
84
+ }
85
+
86
+ .paper-window-nav__title {
87
+ overflow: hidden;
88
+ text-overflow: ellipsis;
89
+ white-space: nowrap;
90
+ pointer-events: none;
91
+ font-size: 0.75rem;
92
+ font-weight: 500;
93
+ line-height: 1.2;
94
+ color: var(--paper-text);
95
+ }
96
+
97
+ .owd-window-nav__btn-group {
98
+ display: flex;
99
+ align-items: stretch;
100
+ gap: 4px;
101
+ }
102
+
103
+ .owd-window-nav__btn-group--append {
104
+ margin-left: auto;
105
+ }
106
+
107
+ .owd-window-nav__btn-group--append-inner {
108
+ display: flex;
109
+ align-items: stretch;
110
+ gap: 4px;
111
+ margin: 0;
112
+ padding: 0;
113
+ border: 0;
114
+ }
115
+ </style>
@@ -0,0 +1,55 @@
1
+ <script setup lang="ts">
2
+ defineProps<{
3
+ title?: string
4
+ disabled?: boolean
5
+ }>()
6
+ </script>
7
+
8
+ <template>
9
+ <button
10
+ type="button"
11
+ class="owd-window-nav__button"
12
+ :title="title"
13
+ :aria-label="title"
14
+ :disabled="disabled"
15
+ @mousedown.stop
16
+ >
17
+ <slot />
18
+ </button>
19
+ </template>
20
+
21
+ <style scoped lang="scss">
22
+ /* Sizing only — colors/hover in window-chrome.scss */
23
+ .owd-window-nav__button {
24
+ position: relative;
25
+ display: inline-flex;
26
+ align-items: center;
27
+ justify-content: center;
28
+ flex-shrink: 0;
29
+ box-sizing: border-box;
30
+ width: var(--paper-nav-button-size);
31
+ min-width: var(--paper-nav-button-size);
32
+ height: var(--paper-nav-button-size);
33
+ min-height: var(--paper-nav-button-size);
34
+ margin: 0;
35
+ padding: 0;
36
+ border: none;
37
+ border-radius: var(--paper-radius);
38
+ background: transparent;
39
+ color: inherit;
40
+ cursor: pointer;
41
+
42
+ &:disabled {
43
+ opacity: 0.45;
44
+ cursor: default;
45
+ pointer-events: none;
46
+ }
47
+
48
+ :deep(.iconify),
49
+ :deep(svg) {
50
+ width: 12px;
51
+ height: 12px;
52
+ pointer-events: none;
53
+ }
54
+ }
55
+ </style>