diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 13b9fcfd4713ea20f7c7c05b72bf2a955ae326e3..496613400d34ad38d2c6b8f8416656f1bd134a49 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1729,6 +1729,8 @@ _deck: stackLeft: "å·¦ã«é‡ãã‚‹" popRight: "å³ã«å‡ºã™" profile: "プãƒãƒ•ã‚¡ã‚¤ãƒ«" + introduction: "カラムを組ã¿åˆã‚ã›ã¦è‡ªåˆ†ã ã‘ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã‚’作りã¾ã—ょã†ï¼" + introduction2: "ç”»é¢ã®å³ã«ã‚ã‚‹ + を押ã—ã¦ã€ã„ã¤ã§ã‚‚ã‚«ãƒ©ãƒ ã‚’è¿½åŠ ã§ãã¾ã™ã€‚" _columns: main: "メイン" diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index 88fc39061412ff992268ba37d19adba8964d4f8b..53e76ea14b8a3330cc4d1105e91a2afe916643de 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -6,31 +6,34 @@ <div class="main"> <XStatusBars class="statusbars"/> - <div class="columnsWrapper"> - <div ref="columnsEl" class="columns" :class="deckStore.reactiveState.columnAlign.value" @contextmenu.self.prevent="onContextmenu"> - <template v-for="ids in layout"> - <!-- sectionを利用ã—ã¦ã„ã‚‹ã®ã¯ã€deck.vueå´ã§columnã«å¯¾ã—ã¦first-of-typeを効ã‹ã›ã‚‹ãŸã‚ --> - <section - v-if="ids.length > 1" - class="folder column" - :style="columns.filter(c => ids.includes(c.id)).some(c => c.flexible) ? { flex: 1, minWidth: '350px' } : { width: Math.max(...columns.filter(c => ids.includes(c.id)).map(c => c.width)) + 'px' }" - > - <DeckColumnCore v-for="id in ids" :ref="id" :key="id" :column="columns.find(c => c.id === id)" :is-stacked="true" @parent-focus="moveFocus(id, $event)"/> - </section> - <DeckColumnCore - v-else - :ref="ids[0]" - :key="ids[0]" - class="column" - :column="columns.find(c => c.id === ids[0])" - :is-stacked="false" - :style="columns.find(c => c.id === ids[0])!.flexible ? { flex: 1, minWidth: '350px' } : { width: columns.find(c => c.id === ids[0])!.width + 'px' }" - @parent-focus="moveFocus(ids[0], $event)" - /> - </template> + <div ref="columnsEl" class="columns" :class="deckStore.reactiveState.columnAlign.value" @contextmenu.self.prevent="onContextmenu"> + <template v-for="ids in layout"> + <!-- sectionを利用ã—ã¦ã„ã‚‹ã®ã¯ã€deck.vueå´ã§columnã«å¯¾ã—ã¦first-of-typeを効ã‹ã›ã‚‹ãŸã‚ --> + <section + v-if="ids.length > 1" + class="folder column" + :style="columns.filter(c => ids.includes(c.id)).some(c => c.flexible) ? { flex: 1, minWidth: '350px' } : { width: Math.max(...columns.filter(c => ids.includes(c.id)).map(c => c.width)) + 'px' }" + > + <DeckColumnCore v-for="id in ids" :ref="id" :key="id" :column="columns.find(c => c.id === id)" :is-stacked="true" @parent-focus="moveFocus(id, $event)"/> + </section> + <DeckColumnCore + v-else + :ref="ids[0]" + :key="ids[0]" + class="column" + :column="columns.find(c => c.id === ids[0])" + :is-stacked="false" + :style="columns.find(c => c.id === ids[0])!.flexible ? { flex: 1, minWidth: '350px' } : { width: columns.find(c => c.id === ids[0])!.width + 'px' }" + @parent-focus="moveFocus(ids[0], $event)" + /> + </template> + <div v-if="layout.length === 0" class="intro _panel"> + <div>{{ i18n.ts._deck.introduction }}</div> + <MkButton primary class="add" @click="addColumn">{{ i18n.ts._deck.addColumn }}</MkButton> + <div>{{ i18n.ts._deck.introduction2 }}</div> </div> <div class="sideMenu"> - <button class="_button button" @click="addColumn"><i class="fas fa-plus"></i></button> + <button v-tooltip="i18n.ts._deck.addColumn" class="_button button" @click="addColumn"><i class="fas fa-plus"></i></button> </div> </div> </div> @@ -67,6 +70,7 @@ import { deckStore, addColumn as addColumnToStore, loadDeck } from './deck/deck- import DeckColumnCore from '@/ui/deck/column-core.vue'; import XSidebar from '@/ui/_common_/sidebar.vue'; import XDrawerMenu from '@/ui/_common_/sidebar-for-mobile.vue'; +import MkButton from '@/components/ui/button.vue'; import { getScrollContainer } from '@/scripts/scroll'; import * as os from '@/os'; import { menuDef } from '@/menu'; @@ -206,47 +210,55 @@ function moveFocus(id: string, direction: 'up' | 'down' | 'left' | 'right') { display: flex; flex-direction: column; - > .columnsWrapper { + > .columns { flex: 1; display: flex; - flex-direction: row; + overflow-x: auto; + overflow-y: clip; - > .columns { - flex: 1; - display: flex; - overflow-x: auto; - overflow-y: clip; + &.center { + > .column:first-of-type { + margin-left: auto; + } - &.center { - > .column:first-of-type { - margin-left: auto; - } + > .column:last-of-type { + margin-right: auto; + } + } - > .column:last-of-type { - margin-right: auto; - } + > .column { + flex-shrink: 0; + border-right: solid var(--deckDividerThickness) var(--deckDivider); + + &:first-of-type { + border-left: solid var(--deckDividerThickness) var(--deckDivider); } - > .column { - flex-shrink: 0; - border-right: solid var(--deckDividerThickness) var(--deckDivider); + &.folder { + display: flex; + flex-direction: column; - &:first-child { - border-left: solid var(--deckDividerThickness) var(--deckDivider); + > *:not(:last-of-type) { + border-bottom: solid var(--deckDividerThickness) var(--deckDivider); } + } + } - &.folder { - display: flex; - flex-direction: column; + > .intro { + padding: 32px; + height: min-content; + text-align: center; + margin: auto; - > *:not(:last-child) { - border-bottom: solid var(--deckDividerThickness) var(--deckDivider); - } - } + > .add { + margin: 1em auto; } } > .sideMenu { + flex-shrink: 0; + margin-right: 0; + margin-left: auto; display: flex; flex-direction: column; justify-content: center;