diff options
Diffstat (limited to 'packages/frontend/src/ui')
| -rw-r--r-- | packages/frontend/src/ui/_common_/common.ts | 4 | ||||
| -rw-r--r-- | packages/frontend/src/ui/_common_/navbar-h.vue | 16 | ||||
| -rw-r--r-- | packages/frontend/src/ui/_common_/navbar.vue | 26 | ||||
| -rw-r--r-- | packages/frontend/src/ui/_common_/statusbar-federation.vue | 2 | ||||
| -rw-r--r-- | packages/frontend/src/ui/_common_/widgets.vue | 30 | ||||
| -rw-r--r-- | packages/frontend/src/ui/deck.vue | 10 | ||||
| -rw-r--r-- | packages/frontend/src/ui/deck/column.vue | 18 | ||||
| -rw-r--r-- | packages/frontend/src/ui/deck/main-column.vue | 4 | ||||
| -rw-r--r-- | packages/frontend/src/ui/deck/tl-column.vue | 2 | ||||
| -rw-r--r-- | packages/frontend/src/ui/deck/widgets-column.vue | 13 | ||||
| -rw-r--r-- | packages/frontend/src/ui/universal.vue | 8 | ||||
| -rw-r--r-- | packages/frontend/src/ui/zen.vue | 5 |
12 files changed, 76 insertions, 62 deletions
diff --git a/packages/frontend/src/ui/_common_/common.ts b/packages/frontend/src/ui/_common_/common.ts index a9ad36c97a..7ad18fc2a8 100644 --- a/packages/frontend/src/ui/_common_/common.ts +++ b/packages/frontend/src/ui/_common_/common.ts @@ -50,7 +50,7 @@ function toolsMenuItems(): MenuItem[] { return items; } -export function openInstanceMenu(ev: MouseEvent) { +export function openInstanceMenu(ev: PointerEvent) { const menuItems: MenuItem[] = []; menuItems.push({ @@ -175,7 +175,7 @@ export function openInstanceMenu(ev: MouseEvent) { }); } -export function openToolsMenu(ev: MouseEvent) { +export function openToolsMenu(ev: PointerEvent) { os.popupMenu(toolsMenuItems(), ev.currentTarget ?? ev.target, { align: 'left', }); diff --git a/packages/frontend/src/ui/_common_/navbar-h.vue b/packages/frontend/src/ui/_common_/navbar-h.vue index 64da4647b6..eb1d99f0aa 100644 --- a/packages/frontend/src/ui/_common_/navbar-h.vue +++ b/packages/frontend/src/ui/_common_/navbar-h.vue @@ -6,22 +6,22 @@ SPDX-License-Identifier: AGPL-3.0-only <template> <div :class="[$style.root, acrylic ? $style.acrylic : null]"> <div :class="$style.body"> - <div :class="$style.left"> + <div> <button v-click-anime :class="[$style.item, $style.instance]" class="_button" @click="openInstanceMenu"> <img :class="$style.instanceIcon" :src="instance.iconUrl ?? '/favicon.ico'" draggable="false"/> </button> - <MkA v-click-anime v-tooltip="i18n.ts.timeline" :class="$style.item" activeClass="active" to="/" exact> + <MkA v-click-anime v-tooltip="i18n.ts.timeline" :class="$style.item" :activeClass="$style.active" to="/" exact> <i :class="$style.itemIcon" class="ti ti-home ti-fw"></i> </MkA> <template v-for="item in menu"> <div v-if="item === '-'" :class="$style.divider"></div> - <component :is="navbarItemDef[item].to ? 'MkA' : 'button'" v-else-if="navbarItemDef[item] && (navbarItemDef[item].show !== false)" v-click-anime v-tooltip="navbarItemDef[item].title" class="_button" :class="$style.item" activeClass="active" :to="navbarItemDef[item].to" v-on="navbarItemDef[item].action ? { click: navbarItemDef[item].action } : {}"> + <component :is="navbarItemDef[item].to ? 'MkA' : 'button'" v-else-if="navbarItemDef[item] && (navbarItemDef[item].show == null || navbarItemDef[item].show.value !== false)" v-click-anime v-tooltip="navbarItemDef[item].title" class="_button" :class="$style.item" :activeClass="$style.active" :to="navbarItemDef[item].to" v-on="navbarItemDef[item].action ? { click: navbarItemDef[item].action } : {}"> <i :class="[$style.itemIcon, navbarItemDef[item].icon]" class="ti-fw"></i> <span v-if="navbarItemDef[item].indicated" :class="$style.indicator" class="_blink"><i class="_indicatorCircle"></i></span> </component> </template> <div :class="$style.divider"></div> - <MkA v-if="$i && ($i.isAdmin || $i.isModerator)" v-click-anime v-tooltip="i18n.ts.controlPanel" class="item" activeClass="active" to="/admin" :behavior="settingsWindowed ? 'window' : null"> + <MkA v-if="$i && ($i.isAdmin || $i.isModerator)" v-click-anime v-tooltip="i18n.ts.controlPanel" class="item" :activeClass="$style.active" to="/admin" :behavior="settingsWindowed ? 'window' : null"> <i :class="$style.itemIcon" class="ti ti-dashboard ti-fw"></i> </MkA> <button v-click-anime :class="$style.item" class="_button" @click="more"> @@ -30,7 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only </button> </div> <div :class="$style.right"> - <MkA v-click-anime v-tooltip="i18n.ts.settings" :class="$style.item" activeClass="active" to="/settings" :behavior="settingsWindowed ? 'window' : null"> + <MkA v-click-anime v-tooltip="i18n.ts.settings" :class="$style.item" :activeClass="$style.active" to="/settings" :behavior="settingsWindowed ? 'window' : null"> <i :class="$style.itemIcon" class="ti ti-settings ti-fw"></i> </MkA> <button v-if="$i" v-click-anime :class="[$style.item, $style.account]" class="_button" @click="openAccountMenu"> @@ -67,7 +67,7 @@ const props = defineProps<{ const settingsWindowed = ref(window.innerWidth > WINDOW_THRESHOLD); const menu = ref(prefer.s.menu); -// const menuDisplay = computed(store.makeGetterSetter('menuDisplay')); +// const menuDisplay = store.model('menuDisplay'); const otherNavItemIndicated = computed<boolean>(() => { for (const def in navbarItemDef) { if (menu.value.includes(def)) continue; @@ -76,7 +76,7 @@ const otherNavItemIndicated = computed<boolean>(() => { return false; }); -async function more(ev: MouseEvent) { +async function more(ev: PointerEvent) { const target = getHTMLElementOrNull(ev.currentTarget ?? ev.target); if (!target) return; @@ -88,7 +88,7 @@ async function more(ev: MouseEvent) { }); } -async function openAccountMenu(ev: MouseEvent) { +async function openAccountMenu(ev: PointerEvent) { const menuItems = await getAccountMenu({ withExtraOperation: true, }); diff --git a/packages/frontend/src/ui/_common_/navbar.vue b/packages/frontend/src/ui/_common_/navbar.vue index c679ee7a92..d0c183763a 100644 --- a/packages/frontend/src/ui/_common_/navbar.vue +++ b/packages/frontend/src/ui/_common_/navbar.vue @@ -8,7 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only <div :class="$style.body"> <div :class="$style.top"> <button v-tooltip.noDelay.right="instance.name ?? i18n.ts.instance" class="_button" :class="$style.instance" @click="openInstanceMenu"> - <img :src="instance.iconUrl || '/favicon.ico'" alt="" :class="$style.instanceIcon" style="viewTransitionName: navbar-serverIcon;"/> + <img :src="instance.iconUrl || '/favicon.ico'" alt="" :class="$style.instanceIcon" style="view-transition-name: navbar-serverIcon;"/> </button> <button v-if="!iconOnly" v-tooltip.noDelay.right="i18n.ts.realtimeMode" class="_button" :class="[$style.realtimeMode, store.r.realtimeMode.value ? $style.on : null]" @click="toggleRealtimeMode"> <i v-if="store.r.realtimeMode.value" class="ti ti-bolt ti-fw"></i> @@ -20,16 +20,16 @@ SPDX-License-Identifier: AGPL-3.0-only </div> <div :class="$style.middle"> <MkA v-tooltip.noDelay.right="i18n.ts.timeline" :class="$style.item" :activeClass="$style.active" to="/" exact> - <i :class="$style.itemIcon" class="ti ti-home ti-fw" style="viewTransitionName: navbar-homeIcon;"></i><span :class="$style.itemText">{{ i18n.ts.timeline }}</span> + <i :class="$style.itemIcon" class="ti ti-home ti-fw" style="view-transition-name: navbar-homeIcon;"></i><span :class="$style.itemText">{{ i18n.ts.timeline }}</span> </MkA> <template v-for="item in prefer.r.menu.value"> <div v-if="item === '-'" :class="$style.divider"></div> <component :is="navbarItemDef[item].to ? 'MkA' : 'button'" - v-else-if="navbarItemDef[item] && (navbarItemDef[item].show !== false)" + v-else-if="navbarItemDef[item] && (navbarItemDef[item].show == null || navbarItemDef[item].show.value !== false)" v-tooltip.noDelay.right="navbarItemDef[item].title" class="_button" - :class="[$style.item, { [$style.active]: navbarItemDef[item].active }]" + :class="[$style.item]" :activeClass="$style.active" :to="navbarItemDef[item].to" v-on="navbarItemDef[item].action ? { click: navbarItemDef[item].action } : {}" @@ -43,14 +43,14 @@ SPDX-License-Identifier: AGPL-3.0-only </template> <div :class="$style.divider"></div> <MkA v-if="$i != null && ($i.isAdmin || $i.isModerator)" v-tooltip.noDelay.right="i18n.ts.controlPanel" :class="$style.item" :activeClass="$style.active" to="/admin"> - <i :class="$style.itemIcon" class="ti ti-dashboard ti-fw" style="viewTransitionName: navbar-controlPanel;"></i><span :class="$style.itemText">{{ i18n.ts.controlPanel }}</span> + <i :class="$style.itemIcon" class="ti ti-dashboard ti-fw" style="view-transition-name: navbar-controlPanel;"></i><span :class="$style.itemText">{{ i18n.ts.controlPanel }}</span> </MkA> <button class="_button" :class="$style.item" @click="more"> - <i :class="$style.itemIcon" class="ti ti-grid-dots ti-fw" style="viewTransitionName: navbar-more;"></i><span :class="$style.itemText">{{ i18n.ts.more }}</span> + <i :class="$style.itemIcon" class="ti ti-grid-dots ti-fw" style="view-transition-name: navbar-more;"></i><span :class="$style.itemText">{{ i18n.ts.more }}</span> <span v-if="otherMenuItemIndicated" :class="$style.itemIndicator" class="_blink"><i class="_indicatorCircle"></i></span> </button> <MkA v-tooltip.noDelay.right="i18n.ts.settings" :class="$style.item" :activeClass="$style.active" to="/settings"> - <i :class="$style.itemIcon" class="ti ti-settings ti-fw" style="viewTransitionName: navbar-settings;"></i><span :class="$style.itemText">{{ i18n.ts.settings }}</span> + <i :class="$style.itemIcon" class="ti ti-settings ti-fw" style="view-transition-name: navbar-settings;"></i><span :class="$style.itemText">{{ i18n.ts.settings }}</span> </MkA> </div> <div :class="$style.bottom"> @@ -65,7 +65,7 @@ SPDX-License-Identifier: AGPL-3.0-only <i class="ti ti-pencil ti-fw" :class="$style.postIcon"></i><span :class="$style.postText">{{ i18n.ts.note }}</span> </button> <button v-if="$i != null" v-tooltip.noDelay.right="`${i18n.ts.account}: @${$i.username}`" class="_button" :class="[$style.account]" @click="openAccountMenu"> - <MkAvatar :user="$i" :class="$style.avatar" style="viewTransitionName: navbar-avatar;"/><MkAcct class="_nowrap" :class="$style.acct" :user="$i"/> + <MkAvatar :user="$i" :class="$style.avatar" style="view-transition-name: navbar-avatar;"/><MkAcct class="_nowrap" :class="$style.acct" :user="$i"/> </button> </div> </div> @@ -79,7 +79,7 @@ SPDX-License-Identifier: AGPL-3.0-only --> <div v-if="!forceIconOnly && prefer.r.showNavbarSubButtons.value" :class="$style.subButtons"> - <div :class="[$style.subButton, $style.menuEditButton]"> + <div :class="$style.subButton"> <svg viewBox="0 0 16 64" :class="$style.subButtonShape"> <g transform="matrix(0.333333,0,0,0.222222,0.000895785,21.3333)"> <path d="M47.488,7.995C47.79,10.11 47.943,12.266 47.943,14.429C47.997,26.989 47.997,84 47.997,84C47.997,84 44.018,118.246 23.997,133.5C-0.374,152.07 -0.003,192 -0.003,192L-0.003,-96C-0.003,-96 0.151,-56.216 23.997,-37.5C40.861,-24.265 46.043,-1.243 47.488,7.995Z" style="fill:var(--MI_THEME-navBg);"/> @@ -90,7 +90,7 @@ SPDX-License-Identifier: AGPL-3.0-only <template v-if="!props.asDrawer"> <div :class="$style.subButtonGapFill"></div> <div :class="$style.subButtonGapFillDivider"></div> - <div :class="[$style.subButton, $style.toggleButton]"> + <div :class="$style.subButton"> <svg viewBox="0 0 16 64" :class="$style.subButtonShape"> <g transform="matrix(0.333333,0,0,0.222222,0.000895785,21.3333)"> <path d="M47.488,7.995C47.79,10.11 47.943,12.266 47.943,14.429C47.997,26.989 47.997,84 47.997,84C47.997,84 44.018,118.246 23.997,133.5C-0.374,152.07 -0.003,192 -0.003,192L-0.003,-96C-0.003,-96 0.151,-56.216 23.997,-37.5C40.861,-24.265 46.043,-1.243 47.488,7.995Z" style="fill:var(--MI_THEME-navBg);"/> @@ -161,7 +161,7 @@ function toggleIconOnly() { } } -function toggleRealtimeMode(ev: MouseEvent) { +function toggleRealtimeMode(ev: PointerEvent) { os.popupMenu([{ type: 'label', text: i18n.ts.realtimeMode, @@ -175,7 +175,7 @@ function toggleRealtimeMode(ev: MouseEvent) { }], ev.currentTarget ?? ev.target); } -async function openAccountMenu(ev: MouseEvent) { +async function openAccountMenu(ev: PointerEvent) { const menuItems = await getAccountMenu({ withExtraOperation: true, }); @@ -183,7 +183,7 @@ async function openAccountMenu(ev: MouseEvent) { os.popupMenu(menuItems, ev.currentTarget ?? ev.target); } -async function more(ev: MouseEvent) { +async function more(ev: PointerEvent) { const target = getHTMLElementOrNull(ev.currentTarget ?? ev.target); if (!target) return; const { dispose } = await os.popupAsyncWithDialog(import('@/components/MkLaunchPad.vue').then(x => x.default), { diff --git a/packages/frontend/src/ui/_common_/statusbar-federation.vue b/packages/frontend/src/ui/_common_/statusbar-federation.vue index 079f1f92bb..23093e60d7 100644 --- a/packages/frontend/src/ui/_common_/statusbar-federation.vue +++ b/packages/frontend/src/ui/_common_/statusbar-federation.vue @@ -67,7 +67,7 @@ useInterval(tick, Math.max(5000, props.refreshIntervalSec * 1000), { afterMounted: true, }); -function getInstanceIcon(instance): string { +function getInstanceIcon(instance: Misskey.entities.FederationInstance): string { return getProxiedImageUrlNullable(instance.iconUrl, 'preview') ?? getProxiedImageUrlNullable(instance.faviconUrl, 'preview') ?? '/client-assets/dummy.png'; } </script> diff --git a/packages/frontend/src/ui/_common_/widgets.vue b/packages/frontend/src/ui/_common_/widgets.vue index 1a6d62e19b..4087c4d517 100644 --- a/packages/frontend/src/ui/_common_/widgets.vue +++ b/packages/frontend/src/ui/_common_/widgets.vue @@ -5,10 +5,18 @@ SPDX-License-Identifier: AGPL-3.0-only <template> <div> - <XWidgets :edit="editMode" :widgets="widgets" @addWidget="addWidget" @removeWidget="removeWidget" @updateWidget="updateWidget" @updateWidgets="updateWidgets" @exit="editMode = false"/> + <XWidgets + :edit="editMode" + :widgets="widgets" + @addWidget="addWidget" + @removeWidget="removeWidget" + @updateWidget="updateWidget" + @updateWidgets="updateWidgets" + @exit="editMode = false" + /> <button v-if="editMode" class="_textButton" style="font-size: 0.9em;" @click="editMode = false"><i class="ti ti-check"></i> {{ i18n.ts.editWidgetsExit }}</button> - <button v-else class="_textButton" data-cy-widget-edit :class="$style.edit" style="font-size: 0.9em;" @click="editMode = true"><i class="ti ti-pencil"></i> {{ i18n.ts.editWidgets }}</button> + <button v-else class="_textButton" data-cy-widget-edit :class="$style.edit" style="font-size: 0.9em; margin-top: 16px;" @click="editMode = true"><i class="ti ti-pencil"></i> {{ i18n.ts.editWidgets }}</button> </div> </template> @@ -16,7 +24,9 @@ SPDX-License-Identifier: AGPL-3.0-only import { computed, ref } from 'vue'; const editMode = ref(false); </script> + <script lang="ts" setup> +import type { DefaultStoredWidget, Widget } from '@/components/MkWidgets.vue'; import XWidgets from '@/components/MkWidgets.vue'; import { i18n } from '@/i18n.js'; import { prefer } from '@/preferences.js'; @@ -36,30 +46,31 @@ const widgets = computed(() => { return prefer.r.widgets.value.filter(w => w.place !== 'left'); }); -function addWidget(widget) { +function addWidget(widget: Widget) { prefer.commit('widgets', [{ ...widget, place: props.place, }, ...prefer.s.widgets]); } -function removeWidget(widget) { +function removeWidget(widget: Widget) { prefer.commit('widgets', prefer.s.widgets.filter(w => w.id !== widget.id)); } -function updateWidget({ id, data }) { - prefer.commit('widgets', prefer.s.widgets.map(w => w.id === id ? { +function updateWidget(widget: { id: Widget['id']; data: Widget['data']; }) { + prefer.commit('widgets', prefer.s.widgets.map(w => w.id === widget.id ? { ...w, - data, + data: widget.data, place: props.place, } : w)); } -function updateWidgets(thisWidgets) { +function updateWidgets(thisWidgets: Widget[]) { if (props.place === null) { - prefer.commit('widgets', thisWidgets); + prefer.commit('widgets', thisWidgets as DefaultStoredWidget[]); return; } + if (props.place === 'left') { prefer.commit('widgets', [ ...thisWidgets.map(w => ({ ...w, place: 'left' })), @@ -67,6 +78,7 @@ function updateWidgets(thisWidgets) { ]); return; } + prefer.commit('widgets', [ ...prefer.s.widgets.filter(w => w.place === 'left' && !thisWidgets.some(t => w.id === t.id)), ...thisWidgets.map(w => ({ ...w, place: 'right' })), diff --git a/packages/frontend/src/ui/deck.vue b/packages/frontend/src/ui/deck.vue index 484b7f277a..0bafa1074c 100644 --- a/packages/frontend/src/ui/deck.vue +++ b/packages/frontend/src/ui/deck.vue @@ -32,7 +32,7 @@ SPDX-License-Identifier: AGPL-3.0-only v-for="id in ids" :ref="id" :key="id" - :class="[$style.column, { '_shadow': withWallpaper }]" + :class="{ '_shadow': withWallpaper }" :column="columns.find(c => c.id === id)!" :isStacked="ids.length > 1" @headerWheel="onWheel" @@ -174,7 +174,7 @@ const addColumnButtonEl = useTemplateRef('addColumnButtonEl'); const settingsButtonEl = useTemplateRef('settingsButtonEl'); const swicthProfileButtonEl = useTemplateRef('swicthProfileButtonEl'); -const addColumn = async (ev) => { +async function addColumn(ev: PointerEvent) { const { canceled, result: column } = await os.select({ title: i18n.ts._deck.addColumn, items: columnTypes.filter(column => column !== 'chat' || $i == null || $i.policies.chatAvailability !== 'unavailable').map(column => ({ @@ -190,14 +190,14 @@ const addColumn = async (ev) => { width: 330, soundSetting: { type: null, volume: 1 }, }); -}; +} -const onContextmenu = (ev) => { +function onContextmenu(ev: PointerEvent) { os.contextMenu([{ text: i18n.ts._deck.addColumn, action: addColumn, }], ev); -}; +} // タッチでスクロールしてるときはスナップスクロールを有効にする function pointerEvent(ev: PointerEvent) { diff --git a/packages/frontend/src/ui/deck/column.vue b/packages/frontend/src/ui/deck/column.vue index 312ca51c83..410faf11f9 100644 --- a/packages/frontend/src/ui/deck/column.vue +++ b/packages/frontend/src/ui/deck/column.vue @@ -247,15 +247,15 @@ function getMenu() { return menuItems; } -function showSettingsMenu(ev: MouseEvent) { +function showSettingsMenu(ev: PointerEvent) { os.popupMenu(getMenu(), ev.currentTarget ?? ev.target); } -function onContextmenu(ev: MouseEvent) { +function onContextmenu(ev: PointerEvent) { os.contextMenu(getMenu(), ev); } -function goTop(ev: MouseEvent) { +function goTop(ev: PointerEvent) { emit('headerClick', ev); if (!props.handleScrollToTop) return; @@ -267,7 +267,9 @@ function goTop(ev: MouseEvent) { } } -function onDragstart(ev) { +function onDragstart(ev: DragEvent) { + if (ev.dataTransfer == null) return; + ev.dataTransfer.effectAllowed = 'move'; setDragData(ev, 'deckColumn', props.column.id); @@ -278,11 +280,13 @@ function onDragstart(ev) { }, 10); } -function onDragend(ev) { +function onDragend(ev: DragEvent) { dragging.value = false; } -function onDragover(ev) { +function onDragover(ev: DragEvent) { + if (ev.dataTransfer == null) return; + // 自分自身がドラッグされている場合 if (dragging.value) { // 自分自身にはドロップさせない @@ -300,7 +304,7 @@ function onDragleave() { draghover.value = false; } -function onDrop(ev) { +function onDrop(ev: DragEvent) { draghover.value = false; os.deckGlobalEvents.emit('column.dragEnd'); diff --git a/packages/frontend/src/ui/deck/main-column.vue b/packages/frontend/src/ui/deck/main-column.vue index 1388cbdc18..8757ec0941 100644 --- a/packages/frontend/src/ui/deck/main-column.vue +++ b/packages/frontend/src/ui/deck/main-column.vue @@ -58,11 +58,11 @@ function back() { history.back(); } */ -function onContextmenu(ev: MouseEvent) { +function onContextmenu(ev: PointerEvent) { if (!ev.target) return; if (isLink(ev.target as HTMLElement)) return; - if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes((ev.target as HTMLElement).tagName) || (ev.target as HTMLElement).attributes['contenteditable']) return; + if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes((ev.target as HTMLElement).tagName) || (ev.target as HTMLElement).attributes.getNamedItem('contenteditable') != null) return; if (window.getSelection()?.toString() !== '') return; const path = mainRouter.currentRoute.value.path; os.contextMenu([{ diff --git a/packages/frontend/src/ui/deck/tl-column.vue b/packages/frontend/src/ui/deck/tl-column.vue index 0e59913c4c..aab0cde1c8 100644 --- a/packages/frontend/src/ui/deck/tl-column.vue +++ b/packages/frontend/src/ui/deck/tl-column.vue @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only <template> <XColumn :menu="menu" :column="column" :isStacked="isStacked" :refresher="async () => { await timeline?.reloadTimeline() }"> <template #header> - <i v-if="column.tl != null" :class="basicTimelineIconClass(column.tl)"/> + <i v-if="column.tl != null" :class="basicTimelineIconClass(column.tl)"></i> <span style="margin-left: 8px;">{{ column.name || (column.tl ? i18n.ts._timelines[column.tl] : null) || i18n.ts._deck._columns.tl }}</span> </template> diff --git a/packages/frontend/src/ui/deck/widgets-column.vue b/packages/frontend/src/ui/deck/widgets-column.vue index 4e84ef0ba0..0985e95653 100644 --- a/packages/frontend/src/ui/deck/widgets-column.vue +++ b/packages/frontend/src/ui/deck/widgets-column.vue @@ -17,8 +17,9 @@ SPDX-License-Identifier: AGPL-3.0-only <script lang="ts" setup> import { ref } from 'vue'; import XColumn from './column.vue'; -import { addColumnWidget, removeColumnWidget, setColumnWidgets, updateColumnWidget } from '@/deck.js'; import type { Column } from '@/deck.js'; +import type { Widget } from '@/components/MkWidgets.vue'; +import { addColumnWidget, removeColumnWidget, setColumnWidgets, updateColumnWidget } from '@/deck.js'; import XWidgets from '@/components/MkWidgets.vue'; import { i18n } from '@/i18n.js'; @@ -29,19 +30,19 @@ const props = defineProps<{ const edit = ref(false); -function addWidget(widget) { +function addWidget(widget: Widget) { addColumnWidget(props.column.id, widget); } -function removeWidget(widget) { +function removeWidget(widget: Widget) { removeColumnWidget(props.column.id, widget); } -function updateWidget({ id, data }) { - updateColumnWidget(props.column.id, id, data); +function updateWidget(widget: { id: Widget['id']; data: Widget['data']; }) { + updateColumnWidget(props.column.id, widget.id, widget.data); } -function updateWidgets(widgets) { +function updateWidgets(widgets: Widget[]) { setColumnWidgets(props.column.id, widgets); } diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue index 497ef72d04..95582edea1 100644 --- a/packages/frontend/src/ui/universal.vue +++ b/packages/frontend/src/ui/universal.vue @@ -103,9 +103,9 @@ if (window.innerWidth > 1024) { } } -const onContextmenu = (ev) => { - if (isLink(ev.target)) return; - if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes(ev.target.tagName) || ev.target.attributes['contenteditable']) return; +function onContextmenu(ev: PointerEvent) { + if (isLink(ev.target as HTMLElement)) return; + if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes((ev.target as HTMLElement).tagName) || (ev.target as HTMLElement).attributes.getNamedItem('contenteditable') != null) return; if (window.getSelection()?.toString() !== '') return; const path = mainRouter.getCurrentFullPath(); os.contextMenu([{ @@ -118,7 +118,7 @@ const onContextmenu = (ev) => { os.pageWindow(path); }, }], ev); -}; +} </script> <style lang="scss" module> diff --git a/packages/frontend/src/ui/zen.vue b/packages/frontend/src/ui/zen.vue index 800aef8696..b56ed4eb6a 100644 --- a/packages/frontend/src/ui/zen.vue +++ b/packages/frontend/src/ui/zen.vue @@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only --> <template> -<div :class="$style.root"> +<div> <div :class="$style.contents"> <!-- デッキUIが設定されている場合はデッキUIに戻れるようにする (ただし?zenが明示された場合は表示しない) @@ -57,9 +57,6 @@ function goToDeck() { </script> <style lang="scss" module> -.root { -} - .contents { display: flex; flex-direction: column; |