diff --git a/dev.js b/dev.js index 113a9bc..e6a25ba 100644 --- a/dev.js +++ b/dev.js @@ -28,7 +28,7 @@ app.use('/background', express.static('./background')) app.use('/', express.static('./src')) app.use('/dist', express.static('./dist')) -app.use('/lang', proxy('hongkong.webxoss.com:8080', { +app.use('/lang', proxy('webxoss.com', { proxyReqPathResolver: req => '/lang' + url.parse(req.url).path, https: true, })) diff --git a/src/app.vue b/src/app.vue index e581fea..bb7a82c 100644 --- a/src/app.vue +++ b/src/app.vue @@ -5,7 +5,7 @@ export default { let deckFileNames = localStorage.getItem('deck_filenames') let fileNames = JSON.parse(deckFileNames) - this.$store.commit('changeWindowWidth', window.innerWidth) + this.$store.commit('setWindowData') this.$store.commit('changeLanguage', localStorage.getItem('language') || 'en') // if no deck in localStorage, initialize WHITE_HOPE diff --git a/src/components/ActionButtonBar.vue b/src/components/ActionButtonBar.vue new file mode 100644 index 0000000..eb9ccd5 --- /dev/null +++ b/src/components/ActionButtonBar.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/components/AppHeader/HeaderMenu.vue b/src/components/AppHeader/HeaderMenu.vue index a935f40..34fdc8a 100644 --- a/src/components/AppHeader/HeaderMenu.vue +++ b/src/components/AppHeader/HeaderMenu.vue @@ -9,6 +9,9 @@ export default { type: Array, required: true, }, + decktopView: { + required: false, + }, }, computed: { opened() { @@ -42,7 +45,7 @@ export default { diff --git a/src/components/DeckModals.vue b/src/components/DeckModals.vue index b0b9a68..53cabe4 100644 --- a/src/components/DeckModals.vue +++ b/src/components/DeckModals.vue @@ -73,7 +73,13 @@ export default { }, methods: { open(type) { - this.$router.replace({ + let assignRoute + if (Object.getOwnPropertyNames(this.$route.query).length) { + assignRoute = this.$router.replace.bind(this.$router) + } else { + assignRoute = this.$router.push.bind(this.$router) + } + assignRoute({ path: this.$route.path, query: Object.assign({}, this.$route.query, { modal: type, diff --git a/src/components/DeckSubheader.vue b/src/components/DeckSubheader.vue new file mode 100644 index 0000000..a4d4d5f --- /dev/null +++ b/src/components/DeckSubheader.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/components/Modal.vue b/src/components/Modal.vue index a876102..aba61e7 100644 --- a/src/components/Modal.vue +++ b/src/components/Modal.vue @@ -25,6 +25,9 @@ export default { cancelText() { return this.config.cancelText || L('cancel') }, + opened() { + return this.$route.query.modal + }, }, methods: { setInputValue(value) { @@ -44,6 +47,11 @@ export default { this.$emit('ok', this.input) }, }, + watch: { + opened(opened) { + document.body.style.overflow = opened ? 'hidden' : 'auto' + }, + }, } @@ -52,6 +60,7 @@ export default { ref="wrapper" :class="$style.wrapper" tabindex="0" + @click.self="cancel" @keyup.esc="cancel">

{{ config.title }}

@@ -103,6 +112,9 @@ export default { background-color: #fff; border-radius: 2px; @apply --shadow-24dp; + @media (min-width: 1281px) { + width: 30%; + } } .title, .content, diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue new file mode 100644 index 0000000..fc95484 --- /dev/null +++ b/src/components/Sidebar.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/components/Tips.vue b/src/components/Tips.vue new file mode 100644 index 0000000..3419d2f --- /dev/null +++ b/src/components/Tips.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/src/css/common.css b/src/css/common.css index 4ba26e3..726e9b2 100644 --- a/src/css/common.css +++ b/src/css/common.css @@ -3,33 +3,34 @@ font-family: PingFangSC-Regular, 'Helvetica Neue', Tahoma, Arial, 'Hiragino Sans GB', 'Microsoft Yahei', sans-serif; color: #333; - /* small mobile (iPhone5) */ - @media (width <= 320px) { + /* smartphones, iPhone, portrait 480x320 phones */ + @media (min-width: 320px) { font-size: 12px; } - /* middle mobile (iPhone6) */ - @media (width > 375px) { - font-size: 16px; + /* portrait e-readers (Nook/Kindle), smaller tablets @ 600 or @ 640 wide. */ + @media (min-width: 481px) { + font-size: 14px; } - /* large mobile (iPhone6 Plus) */ - @media (width > 425px) { + /* portrait tablets, portrait iPad, landscape e-readers, landscape 800x480 or 854x480 phones */ + @media (min-width: 641px) { font-size: 18px; } - /* larger mobile */ - @media (width >= 667px) { + /* tablet, landscape iPad, lo-res laptops ands desktops */ + @media (min-width: 961px) { font-size: 20px; } - /* tablet */ - @media (width >= 768px) and (width < 1024px) { - font-size: 24px; + /* big landscape tablets, laptops, and desktops */ + @media (min-width: 1025px){ + font-size: 22px; } - @media (width >= 1280px){ - font-size: 24px; + /* hi-res laptops and desktops */ + @media (min-width: 1281px) { + font-size: 22px; } } diff --git a/src/css/vars.css b/src/css/vars.css index 7fda267..bb79561 100644 --- a/src/css/vars.css +++ b/src/css/vars.css @@ -1,13 +1,17 @@ :root { --main-color: #2196f3; --header-height: 4rem; - --padding: .8rem; + --padding: .8em; --cell-border-color: #d6d6d6; /* z-indexes */ - --z-header: 1; - --z-header-menu: 2; - --z-modal: 3; + --z-box-counter: 1; + --z-sidebar: 8; + --z-header: 16; + --z-header-menu: 32; + --z-nav: 64; + --z-action-button-bar: 96; + --z-modal: 128; /* shadows */ --shadow-2dp: { diff --git a/src/js/Icon.js b/src/js/Icon.js index a0d1782..235b882 100644 --- a/src/js/Icon.js +++ b/src/js/Icon.js @@ -14,3 +14,6 @@ export const burst = require('media/burst.svg') export const hexagon = require('media/hexagon.svg') export const list = require('media/list.svg') export const blocks = require('media/blocks.svg') +export const information = require('media/information.svg') +export const check = require('media/check.svg') +export const bulb = require('media/bulb.svg') diff --git a/src/lang/en.hjson b/src/lang/en.hjson index 98b02d8..ca89c83 100644 --- a/src/lang/en.hjson +++ b/src/lang/en.hjson @@ -29,6 +29,11 @@ confirm_delete: Are you sure to delete %s ? // cell component no_cost: no cost +// action button bar +card_selected: %s selected +add_to_deck: add to deck +finished: finished + // prop cardType: Type classes: Class diff --git a/src/lang/it.hjson b/src/lang/it.hjson index 36e0caf..2db9c6f 100644 --- a/src/lang/it.hjson +++ b/src/lang/it.hjson @@ -29,6 +29,11 @@ confirm_delete: Are you sure to delete %s ? // cell component no_cost: no cost +// action button bar +card_selected: %s selected +add_to_deck: add to deck +finished: finished + // prop cardType: Tipo classes: Classe diff --git a/src/lang/jp.hjson b/src/lang/jp.hjson index a8f8172..e49a1f0 100644 --- a/src/lang/jp.hjson +++ b/src/lang/jp.hjson @@ -29,6 +29,11 @@ confirm_delete: Are you sure to delete %s ? // cell component no_cost: no cost +// action button bar +card_selected: %s selected +add_to_deck: add to deck +finished: finished + // prop cardType: 種類 classes: タイプ diff --git a/src/lang/ko.hjson b/src/lang/ko.hjson index 06a21ed..641e60f 100644 --- a/src/lang/ko.hjson +++ b/src/lang/ko.hjson @@ -29,6 +29,11 @@ confirm_delete: 정말로 %s 를 삭제합니까? // cell component no_cost: 코스트 없음 +// action button bar +card_selected: %s selected +add_to_deck: add to deck +finished: finished + // prop cardType: 종류 classes: 타입 diff --git a/src/lang/ru.hjson b/src/lang/ru.hjson index 1c78fa0..b213062 100644 --- a/src/lang/ru.hjson +++ b/src/lang/ru.hjson @@ -29,6 +29,11 @@ confirm_delete: Вы точно хотите удалить %s ? // cell component no_cost: нет цены +// action button bar +card_selected: %s selected +add_to_deck: add to deck +finished: finished + // prop cardType: Тип classes: Класс diff --git a/src/lang/zh_Hans.hjson b/src/lang/zh_Hans.hjson index 759fb3d..e4ab8f1 100644 --- a/src/lang/zh_Hans.hjson +++ b/src/lang/zh_Hans.hjson @@ -3,7 +3,7 @@ suffix: _zh_CN // common ok: 确定 cancel: 取消 -add: 新建 +add: 添加 create: 创建 reserve: 保留 @@ -29,6 +29,11 @@ confirm_delete: 确定删除卡组 %s ? // cell component no_cost: 无费用 +// action button bar +card_selected: 已选择 %s 张卡片 +add_to_deck: 添加到卡组 +finished: 完成 + // prop cardType: 种类 classes: 类别 diff --git a/src/media/bulb.svg b/src/media/bulb.svg new file mode 100644 index 0000000..25a9978 --- /dev/null +++ b/src/media/bulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/media/check.svg b/src/media/check.svg new file mode 100644 index 0000000..68e30c1 --- /dev/null +++ b/src/media/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/media/information.svg b/src/media/information.svg new file mode 100644 index 0000000..f411fc0 --- /dev/null +++ b/src/media/information.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/pages/Deck.vue b/src/pages/Deck.vue index 75f2d02..7f8082d 100644 --- a/src/pages/Deck.vue +++ b/src/pages/Deck.vue @@ -4,8 +4,9 @@ import { AppHeader, HeaderIcon, HeaderMenu } from 'components/AppHeader' import DeckModals from 'components/DeckModals' import DeckFloatButton from 'components/DeckFloatButton' import CellContainer from 'components/CellContainer' +import Cell from 'components/Cell' import Block from 'components/Block' -import DeckHead from 'components/DeckHead' +import DeckSubheader from 'components/DeckSubheader' import Icon from 'components/Icon' import { defaultSort, isLrigCard } from 'js/util' import _ from 'lodash' @@ -19,8 +20,9 @@ export default { DeckModals, DeckFloatButton, CellContainer, + Cell, Block, - DeckHead, + DeckSubheader, Icon, }, data: () => ({ @@ -122,7 +124,7 @@ export default { closeModal() { this.$refs.modals.close() }, - updateDeckHeader() { + updateDeckSubheaderer() { let lrigDeck = this.$refs.lrigDeck if (!lrigDeck) { return @@ -131,7 +133,7 @@ export default { let top = $lrigDeck ? $lrigDeck.getBoundingClientRect().top : 0 this.scrolledToLrig = top <= window.innerHeight / 2 this.scrolledToTop = window.scrollY <= 0 - this.request = requestIdleCallback(this.updateDeckHeader) + this.request = requestIdleCallback(this.updateDeckSubheaderer) }, toggleView() { this.previewing ? this.goListView() : this.goBlockView() @@ -139,9 +141,6 @@ export default { goListView() { this.$router.push({ path: '/deck', - // query: { - // mode: 'list', - // }, }) }, goBlockView() { @@ -152,9 +151,17 @@ export default { }, }) }, + goDetail(pid) { + this.$router.push({ + path: '/detail', + query: { + pid, + }, + }) + }, }, mounted() { - this.updateDeckHeader() + this.updateDeckSubheaderer() }, destroyed() { cancelIdleCallback(this.request) @@ -175,25 +182,33 @@ export default { @click.native="toggleView"/> - - +
- +
- +
@@ -218,5 +233,6 @@ export default { } .block { width: 20%; + padding: .2em; } diff --git a/src/pages/DeckEditor.vue b/src/pages/DeckEditor.vue new file mode 100644 index 0000000..a61625a --- /dev/null +++ b/src/pages/DeckEditor.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/src/pages/Detail.vue b/src/pages/Detail.vue index 2641c5c..9386bf4 100644 --- a/src/pages/Detail.vue +++ b/src/pages/Detail.vue @@ -1,12 +1,14 @@