diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2025-01-26 20:10:22 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-26 11:10:22 +0000 |
| commit | 297186e492b20c3e54f8cbfe51ec2d7694ca7068 (patch) | |
| tree | 89607c3f0d68b75834b008b449873e06982792e0 /packages/frontend/src/components | |
| parent | fix(frontend): 画面を閉じる直前にAudioContextを閉じるように (... (diff) | |
| download | misskey-297186e492b20c3e54f8cbfe51ec2d7694ca7068.tar.gz misskey-297186e492b20c3e54f8cbfe51ec2d7694ca7068.tar.bz2 misskey-297186e492b20c3e54f8cbfe51ec2d7694ca7068.zip | |
enhance(frontend): 絵文字管理画面β(ローカル)のUI・UX改善 (#15349)
* enhance(frontend): 絵文字管理画面β(ローカル)のUI・UX改善
* fix
* :art:
* 表示件数をメニューから変更するように
* 確認ダイアログ
* fix i18n
* needWideArea: trueならwidgetの開閉ボタンを表示しないように
* fix: 検索ウィンドウは一つしか開けないように
Diffstat (limited to 'packages/frontend/src/components')
8 files changed, 101 insertions, 27 deletions
diff --git a/packages/frontend/src/components/MkSortOrderEditor.vue b/packages/frontend/src/components/MkSortOrderEditor.vue index da08f12297..9decacc5f5 100644 --- a/packages/frontend/src/components/MkSortOrderEditor.vue +++ b/packages/frontend/src/components/MkSortOrderEditor.vue @@ -12,12 +12,13 @@ SPDX-License-Identifier: AGPL-3.0-only :iconClass="order.direction === '+' ? 'ti ti-arrow-up' : 'ti ti-arrow-down'" :exButtonIconClass="'ti ti-x'" :content="order.key" + :class="$style.sortOrderTag" @click="onToggleSortOrderButtonClicked(order)" @exButtonClick="onRemoveSortOrderButtonClicked(order)" /> </div> <MkButton :class="$style.sortOrderAddButton" @click="onAddSortOrderButtonClicked"> - <span class="ti ti-plus"/> + <span class="ti ti-plus"></span> </MkButton> </div> </template> @@ -109,4 +110,9 @@ function emitOrder(sortOrders: SortOrder<T>[]) { border-radius: 9999px; background-color: var(--MI_THEME-buttonBg); } + +.sortOrderTag { + user-select: none; + cursor: pointer; +} </style> diff --git a/packages/frontend/src/components/MkSuperMenu.vue b/packages/frontend/src/components/MkSuperMenu.vue index 0caaed6f39..fa0e40d8f9 100644 --- a/packages/frontend/src/components/MkSuperMenu.vue +++ b/packages/frontend/src/components/MkSuperMenu.vue @@ -47,7 +47,7 @@ export type SuperMenuDef = { active?: boolean; action: (ev: MouseEvent) => void; } | { - type: 'link'; + type?: 'link'; to: string; icon?: string; text: string; diff --git a/packages/frontend/src/components/MkTagItem.vue b/packages/frontend/src/components/MkTagItem.vue index 98f2411392..8b7460f3a3 100644 --- a/packages/frontend/src/components/MkTagItem.vue +++ b/packages/frontend/src/components/MkTagItem.vue @@ -5,10 +5,10 @@ SPDX-License-Identifier: AGPL-3.0-only <template> <div :class="$style.root" @click="(ev) => emit('click', ev)"> - <span v-if="iconClass" :class="[$style.icon, iconClass]"/> + <span v-if="iconClass" :class="[$style.icon, iconClass]"></span> <span :class="$style.content">{{ content }}</span> <MkButton v-if="exButtonIconClass" :class="$style.exButton" @click="(ev) => emit('exButtonClick', ev)"> - <span :class="[$style.exButtonIcon, exButtonIconClass]"/> + <span :class="[$style.exButtonIcon, exButtonIconClass]"></span> </MkButton> </div> </template> diff --git a/packages/frontend/src/components/global/MkPageHeader.vue b/packages/frontend/src/components/global/MkPageHeader.vue index aa4be69b2c..a2e70a5cad 100644 --- a/packages/frontend/src/components/global/MkPageHeader.vue +++ b/packages/frontend/src/components/global/MkPageHeader.vue @@ -48,13 +48,16 @@ import { scrollToTop } from '@@/js/scroll.js'; import { globalEvents } from '@/events.js'; import { injectReactiveMetadata } from '@/scripts/page-metadata.js'; import { $i, openAccountMenu as openAccountMenu_ } from '@/account.js'; -import { PageHeaderItem } from '@/types/page-header.js'; +import type { PageHeaderItem } from '@/types/page-header.js'; +import type { PageMetadata } from '@/scripts/page-metadata.js'; const props = withDefaults(defineProps<{ + overridePageMetadata?: PageMetadata; tabs?: Tab[]; tab?: string; actions?: PageHeaderItem[] | null; thin?: boolean; + hideTitle?: boolean; displayMyAvatar?: boolean; }>(), { tabs: () => ([] as Tab[]), @@ -64,9 +67,10 @@ const emit = defineEmits<{ (ev: 'update:tab', key: string); }>(); -const pageMetadata = injectReactiveMetadata(); +const injectedPageMetadata = injectReactiveMetadata(); +const pageMetadata = computed(() => props.overridePageMetadata ?? injectedPageMetadata.value); -const hideTitle = inject('shouldOmitHeaderTitle', false); +const hideTitle = computed(() => inject('shouldOmitHeaderTitle', false) || props.hideTitle); const thin_ = props.thin || inject('shouldHeaderThin', false); const el = shallowRef<HTMLElement | undefined>(undefined); @@ -75,7 +79,7 @@ const narrow = ref(false); const hasTabs = computed(() => props.tabs.length > 0); const hasActions = computed(() => props.actions && props.actions.length > 0); const show = computed(() => { - return !hideTitle || hasTabs.value || hasActions.value; + return !hideTitle.value || hasTabs.value || hasActions.value; }); const preventDrag = (ev: TouchEvent) => { diff --git a/packages/frontend/src/components/grid/MkDataCell.vue b/packages/frontend/src/components/grid/MkDataCell.vue index 0ffd42abda..e473b7c1af 100644 --- a/packages/frontend/src/components/grid/MkDataCell.vue +++ b/packages/frontend/src/components/grid/MkDataCell.vue @@ -39,13 +39,15 @@ SPDX-License-Identifier: AGPL-3.0-only {{ cell.value }} </div> <div v-else-if="cellType === 'boolean'"> - <span v-if="cell.value === true" class="ti ti-check"/> - <span v-else class="ti"/> + <div :class="[$style.bool, { + [$style.boolTrue]: cell.value === true, + 'ti ti-check': cell.value === true, + }]"></div> </div> <div v-else-if="cellType === 'image'"> <img - :src="cell.value as string" - :alt="cell.value as string" + :src="cell.value" + :alt="cell.value" :class="$style.viewImage" @load="emitContentSizeChanged" /> @@ -375,6 +377,31 @@ $cellHeight: 28px; object-fit: cover; } +.bool { + position: relative; + width: 18px; + height: 18px; + background: var(--MI_THEME-panel); + border: solid 2px var(--MI_THEME-divider); + border-radius: 4px; + box-sizing: border-box; + + &.boolTrue { + border-color: var(--MI_THEME-accent); + background: var(--MI_THEME-accent); + + &::before { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: var(--MI_THEME-fgOnAccent); + font-size: 12px; + line-height: 18px; + } + } +} + .editingInput { padding: 0 8px; width: 100%; diff --git a/packages/frontend/src/components/grid/MkGrid.vue b/packages/frontend/src/components/grid/MkGrid.vue index 60738365fb..4dbd4ebcae 100644 --- a/packages/frontend/src/components/grid/MkGrid.vue +++ b/packages/frontend/src/components/grid/MkGrid.vue @@ -7,7 +7,11 @@ SPDX-License-Identifier: AGPL-3.0-only <div ref="rootEl" class="mk_grid_border" - :class="[$style.grid]" + :class="[$style.grid, { + [$style.noOverflowHandling]: rootSetting.noOverflowStyle, + 'mk_grid_root_rounded': rootSetting.rounded, + 'mk_grid_root_border': rootSetting.outerBorder, + }]" @mousedown.prevent="onMouseDown" @keydown="onKeyDown" @contextmenu.prevent.stop="onContextMenu" @@ -77,10 +81,17 @@ const emit = defineEmits<{ }>(); const props = defineProps<{ - settings: GridSetting, - data: DataSource[] + settings: GridSetting; + data: DataSource[]; }>(); +const rootSetting: Required<GridSetting['root']> = { + noOverflowStyle: false, + rounded: true, + outerBorder: true, + ...props.settings.root, +}; + // non-reactive // eslint-disable-next-line vue/no-setup-props-reactivity-loss const rowSetting: Required<GridRowSetting> = { @@ -1277,32 +1288,48 @@ onMounted(() => { overflow-x: scroll; // firefoxだとスクロールバーがセルに重なって見づらくなってしまうのでスペースを空けておく padding-bottom: 8px; + + &.noOverflowHandling { + overflow-x: revert; + padding-bottom: 0; + } } </style> <style lang="scss"> $borderSetting: solid 0.5px var(--MI_THEME-divider); -$borderRadius: var(--MI-radius); // 配下コンポーネントを含めて一括してコントロールするため、scopedもmoduleも使用できない .mk_grid_border { + --rootBorderSetting: none; + --borderRadius: 0; + border-spacing: 0; + &.mk_grid_root_border { + --rootBorderSetting: #{$borderSetting}; + } + + &.mk_grid_root_rounded { + --borderRadius: var(--MI-radius); + } + .mk_grid_thead { .mk_grid_tr { .mk_grid_th { border-left: $borderSetting; - border-top: $borderSetting; + border-top: var(--rootBorderSetting); &:first-child { // 左上セル - border-top-left-radius: $borderRadius; + border-left: var(--rootBorderSetting); + border-top-left-radius: var(--borderRadius); } &:last-child { // 右上セル - border-top-right-radius: $borderRadius; - border-right: $borderSetting; + border-top-right-radius: var(--borderRadius); + border-right: var(--rootBorderSetting); } } } @@ -1314,9 +1341,14 @@ $borderRadius: var(--MI-radius); border-left: $borderSetting; border-top: $borderSetting; + &:first-child { + // 左端の列 + border-left: var(--rootBorderSetting); + } + &:last-child { // 一番右端の列 - border-right: $borderSetting; + border-right: var(--rootBorderSetting); } } } @@ -1324,16 +1356,16 @@ $borderRadius: var(--MI-radius); .last_row { .mk_grid_td, .mk_grid_th { // 一番下の行 - border-bottom: $borderSetting; + border-bottom: var(--rootBorderSetting); &:first-child { // 左下セル - border-bottom-left-radius: $borderRadius; + border-bottom-left-radius: var(--borderRadius); } &:last-child { // 右下セル - border-bottom-right-radius: $borderRadius; + border-bottom-right-radius: var(--borderRadius); } } } diff --git a/packages/frontend/src/components/grid/MkHeaderCell.vue b/packages/frontend/src/components/grid/MkHeaderCell.vue index 605d27c6d6..aecfe7eaa3 100644 --- a/packages/frontend/src/components/grid/MkHeaderCell.vue +++ b/packages/frontend/src/components/grid/MkHeaderCell.vue @@ -14,10 +14,10 @@ SPDX-License-Identifier: AGPL-3.0-only :data-grid-cell-col="column.index" > <div :class="$style.root"> - <div :class="$style.left"/> + <div :class="$style.left"></div> <div :class="$style.wrapper"> <div ref="contentEl" :class="$style.contentArea"> - <span v-if="column.setting.icon" class="ti" :class="column.setting.icon" style="line-height: normal"/> + <span v-if="column.setting.icon" class="ti" :class="column.setting.icon" style="line-height: normal"></span> <span v-else>{{ text }}</span> </div> </div> @@ -25,7 +25,7 @@ SPDX-License-Identifier: AGPL-3.0-only :class="$style.right" @mousedown="onHandleMouseDown" @dblclick="onHandleDoubleClick" - /> + ></div> </div> </div> </template> diff --git a/packages/frontend/src/components/grid/grid.ts b/packages/frontend/src/components/grid/grid.ts index 0cb3b6f28b..b82e12b304 100644 --- a/packages/frontend/src/components/grid/grid.ts +++ b/packages/frontend/src/components/grid/grid.ts @@ -9,6 +9,11 @@ import { GridColumnSetting } from '@/components/grid/column.js'; import { GridRowSetting } from '@/components/grid/row.js'; export type GridSetting = { + root?: { + noOverflowStyle?: boolean; + rounded?: boolean; + outerBorder?: boolean; + }; row?: GridRowSetting; cols: GridColumnSetting[]; cells?: GridCellSetting; |