From 7d65651fceef1e5367db4aa4d5c493c0bceeff25 Mon Sep 17 00:00:00 2001 From: echofei Date: Thu, 19 Nov 2020 01:05:15 +0800 Subject: [PATCH 01/12] =?UTF-8?q?feat:=E5=AE=9E=E7=8E=B0=E4=B8=8D=E6=84=9F?= =?UTF-8?q?=E7=9F=A5=E8=BE=93=E5=85=A5=E6=B3=95=E7=9A=84react=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 + _config.melody.yml | 340 +++ _config.yml | 106 + package.json | 27 + scaffolds/draft.md | 4 + scaffolds/page.md | 4 + scaffolds/post.md | 5 + .../Input-With-Composition-For-React.md | 62 + .../Input-With-Composition-For-React/demo.png | Bin 0 -> 35909 bytes themes/landscape/.gitignore | 3 + themes/landscape/Gruntfile.js | 46 + themes/landscape/LICENSE | 7 + themes/landscape/README.md | 112 + themes/landscape/_config.yml | 37 + themes/landscape/languages/de.yml | 19 + themes/landscape/languages/default.yml | 19 + themes/landscape/languages/es.yml | 19 + themes/landscape/languages/fr.yml | 19 + themes/landscape/languages/ja.yml | 19 + themes/landscape/languages/ko.yml | 19 + themes/landscape/languages/nl.yml | 20 + themes/landscape/languages/no.yml | 19 + themes/landscape/languages/pt.yml | 19 + themes/landscape/languages/ru.yml | 19 + themes/landscape/languages/zh-CN.yml | 19 + themes/landscape/languages/zh-TW.yml | 19 + .../layout/_partial/after-footer.ejs | 25 + .../layout/_partial/archive-post.ejs | 8 + themes/landscape/layout/_partial/archive.ejs | 34 + themes/landscape/layout/_partial/article.ejs | 44 + themes/landscape/layout/_partial/footer.ejs | 11 + .../layout/_partial/gauges-analytics.ejs | 18 + .../layout/_partial/google-analytics.ejs | 14 + themes/landscape/layout/_partial/head.ejs | 36 + themes/landscape/layout/_partial/header.ejs | 32 + .../landscape/layout/_partial/mobile-nav.ejs | 5 + .../layout/_partial/post/category.ejs | 10 + .../landscape/layout/_partial/post/date.ejs | 3 + .../layout/_partial/post/gallery.ejs | 11 + themes/landscape/layout/_partial/post/nav.ejs | 22 + themes/landscape/layout/_partial/post/tag.ejs | 6 + .../landscape/layout/_partial/post/title.ejs | 15 + themes/landscape/layout/_partial/sidebar.ejs | 5 + themes/landscape/layout/_widget/archive.ejs | 8 + themes/landscape/layout/_widget/category.ejs | 8 + .../landscape/layout/_widget/recent_posts.ejs | 14 + themes/landscape/layout/_widget/tag.ejs | 8 + themes/landscape/layout/_widget/tagcloud.ejs | 8 + themes/landscape/layout/archive.ejs | 1 + themes/landscape/layout/category.ejs | 1 + themes/landscape/layout/index.ejs | 1 + themes/landscape/layout/layout.ejs | 18 + themes/landscape/layout/page.ejs | 1 + themes/landscape/layout/post.ejs | 1 + themes/landscape/layout/tag.ejs | 1 + themes/landscape/package.json | 12 + themes/landscape/scripts/fancybox.js | 24 + themes/landscape/source/css/_extend.styl | 63 + .../source/css/_partial/archive.styl | 80 + .../source/css/_partial/article.styl | 357 +++ .../source/css/_partial/comment.styl | 9 + .../landscape/source/css/_partial/footer.styl | 14 + .../landscape/source/css/_partial/header.styl | 165 ++ .../source/css/_partial/highlight.styl | 158 ++ .../landscape/source/css/_partial/mobile.styl | 19 + .../source/css/_partial/sidebar-aside.styl | 27 + .../source/css/_partial/sidebar-bottom.styl | 27 + .../source/css/_partial/sidebar.styl | 35 + themes/landscape/source/css/_util/grid.styl | 38 + themes/landscape/source/css/_util/mixin.styl | 31 + themes/landscape/source/css/_variables.styl | 63 + .../source/css/fonts/FontAwesome.otf | Bin 0 -> 62856 bytes .../source/css/fonts/fontawesome-webfont.eot | Bin 0 -> 38205 bytes .../source/css/fonts/fontawesome-webfont.svg | 414 ++++ .../source/css/fonts/fontawesome-webfont.ttf | Bin 0 -> 80652 bytes .../source/css/fonts/fontawesome-webfont.woff | Bin 0 -> 44432 bytes themes/landscape/source/css/images/banner.jpg | Bin 0 -> 224710 bytes themes/landscape/source/css/style.styl | 89 + themes/landscape/source/fancybox/blank.gif | Bin 0 -> 43 bytes .../source/fancybox/fancybox_loading.gif | Bin 0 -> 6567 bytes .../source/fancybox/fancybox_loading@2x.gif | Bin 0 -> 13984 bytes .../source/fancybox/fancybox_overlay.png | Bin 0 -> 1003 bytes .../source/fancybox/fancybox_sprite.png | Bin 0 -> 1362 bytes .../source/fancybox/fancybox_sprite@2x.png | Bin 0 -> 6553 bytes .../fancybox/helpers/fancybox_buttons.png | Bin 0 -> 1080 bytes .../helpers/jquery.fancybox-buttons.css | 97 + .../helpers/jquery.fancybox-buttons.js | 122 + .../fancybox/helpers/jquery.fancybox-media.js | 199 ++ .../helpers/jquery.fancybox-thumbs.css | 55 + .../helpers/jquery.fancybox-thumbs.js | 165 ++ .../source/fancybox/jquery.fancybox.css | 273 +++ .../source/fancybox/jquery.fancybox.js | 2017 +++++++++++++++++ .../source/fancybox/jquery.fancybox.pack.js | 46 + themes/landscape/source/js/script.js | 137 ++ yarn.lock | 1648 ++++++++++++++ 95 files changed, 7742 insertions(+) create mode 100644 .gitignore create mode 100644 _config.melody.yml create mode 100644 _config.yml create mode 100644 package.json create mode 100644 scaffolds/draft.md create mode 100644 scaffolds/page.md create mode 100644 scaffolds/post.md create mode 100644 source/_posts/Input-With-Composition-For-React.md create mode 100644 source/_posts/Input-With-Composition-For-React/demo.png create mode 100644 themes/landscape/.gitignore create mode 100644 themes/landscape/Gruntfile.js create mode 100644 themes/landscape/LICENSE create mode 100644 themes/landscape/README.md create mode 100644 themes/landscape/_config.yml create mode 100644 themes/landscape/languages/de.yml create mode 100644 themes/landscape/languages/default.yml create mode 100644 themes/landscape/languages/es.yml create mode 100644 themes/landscape/languages/fr.yml create mode 100644 themes/landscape/languages/ja.yml create mode 100644 themes/landscape/languages/ko.yml create mode 100644 themes/landscape/languages/nl.yml create mode 100644 themes/landscape/languages/no.yml create mode 100644 themes/landscape/languages/pt.yml create mode 100644 themes/landscape/languages/ru.yml create mode 100644 themes/landscape/languages/zh-CN.yml create mode 100644 themes/landscape/languages/zh-TW.yml create mode 100644 themes/landscape/layout/_partial/after-footer.ejs create mode 100644 themes/landscape/layout/_partial/archive-post.ejs create mode 100644 themes/landscape/layout/_partial/archive.ejs create mode 100644 themes/landscape/layout/_partial/article.ejs create mode 100644 themes/landscape/layout/_partial/footer.ejs create mode 100644 themes/landscape/layout/_partial/gauges-analytics.ejs create mode 100644 themes/landscape/layout/_partial/google-analytics.ejs create mode 100644 themes/landscape/layout/_partial/head.ejs create mode 100644 themes/landscape/layout/_partial/header.ejs create mode 100644 themes/landscape/layout/_partial/mobile-nav.ejs create mode 100644 themes/landscape/layout/_partial/post/category.ejs create mode 100644 themes/landscape/layout/_partial/post/date.ejs create mode 100644 themes/landscape/layout/_partial/post/gallery.ejs create mode 100644 themes/landscape/layout/_partial/post/nav.ejs create mode 100644 themes/landscape/layout/_partial/post/tag.ejs create mode 100644 themes/landscape/layout/_partial/post/title.ejs create mode 100644 themes/landscape/layout/_partial/sidebar.ejs create mode 100644 themes/landscape/layout/_widget/archive.ejs create mode 100644 themes/landscape/layout/_widget/category.ejs create mode 100644 themes/landscape/layout/_widget/recent_posts.ejs create mode 100644 themes/landscape/layout/_widget/tag.ejs create mode 100644 themes/landscape/layout/_widget/tagcloud.ejs create mode 100644 themes/landscape/layout/archive.ejs create mode 100644 themes/landscape/layout/category.ejs create mode 100644 themes/landscape/layout/index.ejs create mode 100644 themes/landscape/layout/layout.ejs create mode 100644 themes/landscape/layout/page.ejs create mode 100644 themes/landscape/layout/post.ejs create mode 100644 themes/landscape/layout/tag.ejs create mode 100644 themes/landscape/package.json create mode 100644 themes/landscape/scripts/fancybox.js create mode 100644 themes/landscape/source/css/_extend.styl create mode 100644 themes/landscape/source/css/_partial/archive.styl create mode 100644 themes/landscape/source/css/_partial/article.styl create mode 100644 themes/landscape/source/css/_partial/comment.styl create mode 100644 themes/landscape/source/css/_partial/footer.styl create mode 100644 themes/landscape/source/css/_partial/header.styl create mode 100644 themes/landscape/source/css/_partial/highlight.styl create mode 100644 themes/landscape/source/css/_partial/mobile.styl create mode 100644 themes/landscape/source/css/_partial/sidebar-aside.styl create mode 100644 themes/landscape/source/css/_partial/sidebar-bottom.styl create mode 100644 themes/landscape/source/css/_partial/sidebar.styl create mode 100644 themes/landscape/source/css/_util/grid.styl create mode 100644 themes/landscape/source/css/_util/mixin.styl create mode 100644 themes/landscape/source/css/_variables.styl create mode 100644 themes/landscape/source/css/fonts/FontAwesome.otf create mode 100644 themes/landscape/source/css/fonts/fontawesome-webfont.eot create mode 100644 themes/landscape/source/css/fonts/fontawesome-webfont.svg create mode 100644 themes/landscape/source/css/fonts/fontawesome-webfont.ttf create mode 100644 themes/landscape/source/css/fonts/fontawesome-webfont.woff create mode 100644 themes/landscape/source/css/images/banner.jpg create mode 100644 themes/landscape/source/css/style.styl create mode 100644 themes/landscape/source/fancybox/blank.gif create mode 100644 themes/landscape/source/fancybox/fancybox_loading.gif create mode 100644 themes/landscape/source/fancybox/fancybox_loading@2x.gif create mode 100644 themes/landscape/source/fancybox/fancybox_overlay.png create mode 100644 themes/landscape/source/fancybox/fancybox_sprite.png create mode 100644 themes/landscape/source/fancybox/fancybox_sprite@2x.png create mode 100644 themes/landscape/source/fancybox/helpers/fancybox_buttons.png create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js create mode 100644 themes/landscape/source/fancybox/jquery.fancybox.css create mode 100644 themes/landscape/source/fancybox/jquery.fancybox.js create mode 100644 themes/landscape/source/fancybox/jquery.fancybox.pack.js create mode 100644 themes/landscape/source/js/script.js create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..063b0e4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ \ No newline at end of file diff --git a/_config.melody.yml b/_config.melody.yml new file mode 100644 index 0000000..2a8c079 --- /dev/null +++ b/_config.melody.yml @@ -0,0 +1,340 @@ +# --------------- +# Theme color for customize +# Notice: color value must in double quotes like "#000" or may cause error! +# --------------- +# theme_color: +# enable: true +# main: "#49B1F5" +# paginator: "#00C4B6" +# button_hover: "#FF7242" +# text_selection: "#00C4B6" +# link_color: "#858585" +# hr_color: "#A4D8FA" +# tag_start_color: "#A4D8FA" +# tag_end_color: "#1B9EF3" +# header_text_color: "#EEEEEE" +# footer_text_color: "#EEEEEE" + +# Main menu navigation +menu: + # Home: / + # Archives: /archives + # Tags: /tags + # Categories: /categories + #XXX: /xxx + +# Favicon +# --------------- +favicon: /melody-favicon.ico + +# PWA +# See https://github.com/JLHwung/hexo-offline +# --------------- +pwa: + enable: false + manifest: /manifest.json + # If you don't want to trouble, just ignore the following things + # See https://realfavicongenerator.net/ + # theme_color: "#49B1F5" + # apple_touch_icon: /apple-touch-icon.png + # favicon_32_32: /favicon-32x32.png + # favicon_16_16: /favicon-16x16.png + # mask_icon: /safari-pinned-tab.svg + +# Highlight theme +# --------------- +highlight_theme: default + +# code_word_wrap: true or false + +# Nav settings +# see the icon_name in fontawesome website. +# And you need to add the `fa` or `fab` prefix by your self. +# --------------- +#social: +#icon_name fa: url +#icon_name fab: url + +# Algolia search +# --------------- +algolia_search: + enable: false + hits: + per_page: 10 + +# Local search +# Please see doc for more details: https://molunerfinn.com/hexo-theme-melody-doc/third-party-support.html#local-search +# --------------- +local_search: + enable: false + +# MathJax +# Please see doc for more details: https://molunerfinn.com/hexo-theme-melody-doc/third-party-support.html#mathjax +# --------------- +mathjax: + enable: false + cdn: https://cdn.jsdelivr.net/npm/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML + +# KaTeX +# Please see doc for more details: https://molunerfinn.com/hexo-theme-melody-doc/third-party-support.html#katex +# --------------- +katex: + enable: false + cdn: + css: https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css + hide_scrollbar: true + +# Toggle fireworks (IE >= 10) +# --------------- +fireworks: false + +# Analysis +# --------------- +baidu_analytics: + +google_analytics: + +# Tencent_analytics ID +tencent_analytics: + +# stylesheets loaded in the +# --------------- +stylesheets: + - /css/index.css +# scripts loaded in the end of the body +# --------------- +scripts: + - /js/utils.js + - /js/fancybox.js + - /js/sidebar.js + - /js/copy.js + - /js/fireworks.js + - /js/transition.js + - /js/scroll.js + - /js/head.js + +# cdn for third-party library +# --------------- +cdn: + css: + fontawesome: https://cdn.jsdelivr.net/npm/font-awesome@latest/css/font-awesome.min.css + # fontawesomeV5: https://use.fontawesome.com/releases/v5.3.1/css/all.css + js: + anime: https://cdn.jsdelivr.net/npm/animejs@latest/anime.min.js + jquery: https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js + fancybox: https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js + velocity: https://cdn.jsdelivr.net/npm/velocity-animate@latest/velocity.min.js + velocity-ui: https://cdn.jsdelivr.net/npm/velocity-ui-pack@latest/velocity.ui.min.js + +# Post info settings +# --------------- +avatar: + +top_img: true # false or url of img + +top_img_height: 60 # best range: 60 - 100 + +post_meta: + date_type: created # created or updated + categories: true + tags: true + +# Please see doc for more details: https://molunerfinn.com/hexo-theme-melody-doc/additional-package-support.html#word-counting +wordcount: + enable: false + +toc: + enable: true + # number: true + +post_copyright: + enable: true + license: CC BY-NC-SA 4.0 + license_url: https://creativecommons.org/licenses/by-nc-sa/4.0/ + +# Please see doc for more details: https://molunerfinn.com/hexo-theme-melody-doc/theme-config.html#auto-excerpt +# auto_excerpt: +# enable: false +# length: 150 + +# slide +# For reveal.js config, see https://github.com/hakimel/reveal.js#configuration +slide: + separator: --- + separator_vertical: -- + charset: utf-8 + theme: black + codeTheme: monokai + # optional + mouseWheel: false + transition: slide + transitionSpeed: default + parallaxBackgroundImage: "" + parallaxBackgroundSize: "" + parallaxBackgroundHorizontal: null + parallaxBackgroundVertical: null + loop: false + autoSlide: false + controlsBackArrows: 'faded' + controlsLayout: 'bottom-right' # Determines where controls appear, "edges" or "bottom-right" + progress: true + showNotes: false + autoPlayMedia: false + backgroundTransition: 'fade' + +# QR_code: +# - itemlist: +# img: +# text: + +# adv: +# enable: false +# info: + +# Share System +# --------------- +addThis: + enable: false + #pubid: + +# sharejs: +# enable: false +# disabled_sites: + +# Comments System +# --------------- +disqus: + enable: false + #shortname: + #count: + +# laibili: +# enable: false +# uid: + +# gitment +# enable: false +# owner: +# repo: +# client_id: +# client_secret: + +# gitalk: +# enable: false +# client_id: +# client_secret: +# repo: +# owner: +# admin: + +# valine comment system. https://valine.js.org +# valine: +# enable: false # if you want use valine,please set this value is true +# appId: # leancloud application app id +# appKey: # leancloud application app key +# notify: false # valine mail notify (true/false) https://github.com/xCss/Valine/wiki +# verify: false # valine verify code (true/false) +# recordip: false # whether record commentor's ip (true/false) +# pageSize: 10 # comment list page size +# avatar: mm # gravatar style https://valine.js.org/#/avatar +# lang: zh-cn # i18n: zh-cn/en +# placeholder: Just go go # valine comment input placeholder(like: Please leave your footprints ) +# guest_info: nick,mail,link #valine comment header inf + +# vssue: + # enable: false # Set to true to enable + # platform: github-v4 + # owner: + # repo: + # clientId: + # clientSecret: # only required for some of the platforms + # autoCreateIssue: false # Auto create issue on platform (github/...) + # baseURL: "" # For self-hosted gitlab/bitbucket only, see here: https://vssue.js.org/options/#baseurl + # perPage: 10 # How much comment/page + # labels: 'Vssue' + +# Footer Settings +# --------------- +since: 2013 + +# footer_custom_text: put custom text directly or put hitokoto to fetch random texts + +ICP: + enable: false + #text: + +# busuanzi count for PV / UV in site +busuanzi: + # count values only if the other configs are false + enable: true + # custom uv span for the whole site + site_uv: true + site_uv_header: + site_uv_footer: + # custom pv span for the whole site + site_pv: true + site_pv_header: + site_pv_footer: + # custom pv span for one page only + page_pv: true + page_pv_header: + page_pv_footer: + +# canvas_ribbon +# See: https://github.com/hustcc/ribbon.js +canvas_ribbon: + enable: false + size: 150 + alpha: 0.6 + zIndex: -1 + click_to_change: false + +# Sidebar Settings +# --------------- +# links_title: Links +# links: +# Name: url + +# Follow Me Button +# follow: +# enable: true +# url: '' +# text: '' + +# controls the sidebar showing or hidden in different pages +sidebar_display: post # all/index/post/index-none/post-none/hidden + +# Ads +# --------------- +# Google Adsense +google_adsense: + enable: false + js: //pagead2.googlesyndication.com/pagead/js/adsbygoogle.js + client: ca-pub-........... + enable_page_level_ads: true + +# Google Webmaster tools verification setting +# See: https://www.google.com/webmasters/ +google_site_verification: + +# Bing Webmaster tools verification setting +# See: https://www.bing.com/webmaster/ +bing_site_verification: + +# Yandex Webmaster tools verification setting +# See: https://webmaster.yandex.ru/ +#yandex_site_verification: + +# Baidu Webmaster tools verification setting +# See: https://ziyuan.baidu.com/site/ +baidu_site_verification: + +# 360 Webmaster tools verification setting +# see http://zhanzhang.so.com/ +qihu_site_verification: + +# avoid baidu transformation +disable_baidu_transformation: true + +# 404 Page SubTitle +404Text: diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..47a3db7 --- /dev/null +++ b/_config.yml @@ -0,0 +1,106 @@ +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: 小宇之家 +subtitle: '哦猪爸爸回来啦' +description: '猪爸爸喜欢看技术、看动漫;猪妈妈喜欢化妆品、在做 UP 主;小宇喜欢汽车、还有佩奇。我们都有光明的未来。' +keywords: ['HTML', 'CSS', 'Javascript', 'Node', 'Vue', 'React'] +author: feibinyang +language: zh +timezone: 'Asia/Shanghai' + +# URL +## If your site is put in a subdirectory, set url as 'http://example.com/child' and root as '/child/' +url: https://feibinyanggithubcom.feibinyang.now.sh/ +root: / +permalink: :year/:month/:day/:title/ +permalink_defaults: +pretty_urls: + trailing_index: true # Set to false to remove trailing 'index.html' from permalinks + trailing_html: true # Set to false to remove trailing '.html' from permalinks + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: + enable: true # Open external links in new tab + field: site # Apply to the whole site + exclude: '' +filename_case: 0 +render_drafts: false +post_asset_folder: true +relative_link: false +future: true +highlight: + enable: true + line_number: true + auto_detect: false + tab_replace: '' + wrap: true + hljs: false +prismjs: + enable: false + preprocess: true + line_number: true + tab_replace: '' + +# Home page setting +# path: Root path for your blogs index page. (default = '') +# per_page: Posts displayed per page. (0 = disable pagination) +# order_by: Posts order. (Order by date descending by default) +index_generator: + path: '' + per_page: 10 + order_by: -date + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: ['Javascript', 'CSS', 'Node', 'React', 'Vue', '日常'] + +# Metadata elements +## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta +meta_generator: true + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss +## updated_option supports 'mtime', 'date', 'empty' +updated_option: 'mtime' + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 10 +pagination_dir: page + +# Include / Exclude file(s) +## include:/exclude: options only apply to the 'source/' folder +include: +exclude: +ignore: + +# Extensions +## Plugins: https://hexo.io/plugins/ +## Themes: https://hexo.io/themes/ +theme: melody + +# Deployment +## Docs: https://hexo.io/docs/one-command-deployment +deploy: + type: '' diff --git a/package.json b/package.json new file mode 100644 index 0000000..760e4d5 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "hexo generate", + "clean": "hexo clean", + "deploy": "hexo deploy", + "server": "hexo server" + }, + "hexo": { + "version": "5.2.0" + }, + "dependencies": { + "hexo": "^5.0.0", + "hexo-generator-archive": "^1.0.0", + "hexo-generator-category": "^1.0.0", + "hexo-generator-index": "^2.0.0", + "hexo-generator-tag": "^1.0.0", + "hexo-renderer-ejs": "^1.0.0", + "hexo-renderer-marked": "^3.0.0", + "hexo-renderer-pug": "^1.0.0", + "hexo-renderer-stylus": "^2.0.0", + "hexo-server": "^2.0.0", + "hexo-theme-melody": "^1.9.0" + } +} diff --git a/scaffolds/draft.md b/scaffolds/draft.md new file mode 100644 index 0000000..498e95b --- /dev/null +++ b/scaffolds/draft.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +tags: +--- diff --git a/scaffolds/page.md b/scaffolds/page.md new file mode 100644 index 0000000..f01ba3c --- /dev/null +++ b/scaffolds/page.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +date: {{ date }} +--- diff --git a/scaffolds/post.md b/scaffolds/post.md new file mode 100644 index 0000000..1f9b9a4 --- /dev/null +++ b/scaffolds/post.md @@ -0,0 +1,5 @@ +--- +title: {{ title }} +date: {{ date }} +tags: +--- diff --git a/source/_posts/Input-With-Composition-For-React.md b/source/_posts/Input-With-Composition-For-React.md new file mode 100644 index 0000000..f0735c5 --- /dev/null +++ b/source/_posts/Input-With-Composition-For-React.md @@ -0,0 +1,62 @@ +--- +title: Input-With-Composition-For-React +date: 2020-11-19 00:47:50 +tags: +--- +##### 背景 +​ 目前业界主流的 React UI 组件库中,`Input` 组件都没有实现是否感知输入法功能,但是这个功能在某些情况下是很有必要的,比如搜索框根据输入关键词实时搜索时,React 提供的合成事件 `onChange` 默认是感知输入法的,在输入过程中会产生很多【无效的输入值】(下文统一用【值】指代【输入值】)被提交到后台查询(参考下图),这些查询是没有意义的。合理情况应该是等输入完成时(即没有输入法时),再把值提交到后台查询。 + +{% asset_img demo.png %} + +##### 方案 +​ 首先浏览器为 [IME](https://developer.mozilla.org/en-US/docs/Glossary/input_method_editor) 元素提供了 [CompositionEvent](https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent) 来感知输入法输入过程,其提供了 `compositionstart/compositionupdate/compositionend` 三个事件,我们可以借助它们来控制何时把有效值传出去。 + +​ 其次在 React 提供的[合成事件](https://reactjs.org/docs/events.html#form-events)中,`onChange` 一般用在受控组件中,它是感知输入法的,为了兼容处理,我们采用另外一个合成事件 `onInput`(从语义上来说也更贴切),并增加一个 `props(composition)` 用来设置当前是否要感知输入法,这是对 `onInput` 功能的增强,没有破坏它的语义。 + +​ 于是我们可以采用 `composition/onInput 2` 个 props,并借助 `compositionstart/compositionend` 来作开关,根据设置是否感知输入法(默认为 `false`,不感知)来实时把对应的值传出去。 + +##### 实现 + +​ 首先我们需要调研 `CompositionEvent` 和 `InputEvent` 事件的调用时序,具体可以参考 [demo](https://jsbin.com/nitamigabo/1/edit?html,js,console,output)。这里直接贴上第三方结论. + +``` +// chrome: input(emit) -> ... -> compositionstart -> compositionupdate -> input(not emit) -> compositionend(emit) +// firefox: input(emit) -> ... -> compositionstart -> compositionupdate -> compositionend(not emit) -> input(emit) +// 可以归纳出: +// 紧跟 compositionupdate 后面的 input 不要往上 sync +// 紧跟 input 后面的 compositionend 往上 sync,即传值 +``` + +所以我们可以在 `compositionstart` 时打开开关,`compositionend` 时关掉开关并调用 `onInput` 回调传值。原生 `input` 事件回调中,通过开关来判断是否非输入法状态(即输入完成),从而决定是否调用 `onInput` 回调传值。 + +​ 其次是【开关】怎么设置问题。在 `Class Component` 中可以通过实例属性来设置,但在 `Function Component` 中行不通。通过 `state` 来控制也是不行的,因为 `setState` 是异步的,这会导致 `input` 事件回调执行时开关还没打开,从而把值传出去了。后来参考 [vue](https://github.com/vuejs/vue/blob/52719ccab8fccffbdf497b96d3731dc86f04c1ce/src/platforms/web/runtime/directives/model.js#L131) 里实现可以把开关放置在 `DOM` 元素上(`event.target`)。 + +​ 最后设计 `Input` 组件结构,大致如下: + + +| 属性 | 类型 | 默认值 | 备注 | +| ---- | ---- | ---- | ---- | +| defaultValue | string | | 非受控默认值 | +| value | String | | 受控值 | +| composition | boolean | false | 是否感知输入法 | +| onChange | Function | | | +| onInput | Function | | 输入值,不感知输入法时只在非输入法状态调用 | + +​ 最终实现点击[这里](https://codesandbox.io/s/input-with-composition-9mk8r)。一个简单的可感知输入法 `Input` 组件实现完成。 + +*注意:因为 `vue` 内部对 `v-model` 的封装,导致 `vue` 组件中可能存在 `value` 值对不上问题。详情可参考[链接](https://github.com/ecomfe/veui/blob/d20/packages/veui/src/components/Input.vue)。* + +##### 延伸阅读 + +​ 之前没注意,这次看 MDN 时才发现原生 `input` 和 `change` 事件触发时机不一样(具体参考 [input event](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event) 和 [change event](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event))。总结就是 `input` 是在每次输入值变化时就触发,`change` 是在 `lose focus` 或是 `commit value` 后才触发。 + + + +[参考资料]: + +* https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent +* https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event +* https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event + +* https://github.com/ecomfe/veui/blob/d20/packages/veui/src/components/Input.vue +* https://reactjs.org/docs/events.html#form-events \ No newline at end of file diff --git a/source/_posts/Input-With-Composition-For-React/demo.png b/source/_posts/Input-With-Composition-For-React/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc6477703a9d92f07ca815b86a5d86d2155679b GIT binary patch literal 35909 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/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 literal 0 HcmV?d00001 diff --git a/themes/landscape/.gitignore b/themes/landscape/.gitignore new file mode 100644 index 0000000..6e3a08a --- /dev/null +++ b/themes/landscape/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +node_modules +tmp \ No newline at end of file diff --git a/themes/landscape/Gruntfile.js b/themes/landscape/Gruntfile.js new file mode 100644 index 0000000..59fd5df --- /dev/null +++ b/themes/landscape/Gruntfile.js @@ -0,0 +1,46 @@ +module.exports = function(grunt){ + grunt.initConfig({ + gitclone: { + fontawesome: { + options: { + repository: 'https://github.com/FortAwesome/Font-Awesome.git', + directory: 'tmp/fontawesome' + }, + }, + fancybox: { + options: { + repository: 'https://github.com/fancyapps/fancyBox.git', + directory: 'tmp/fancybox' + } + } + }, + copy: { + fontawesome: { + expand: true, + cwd: 'tmp/fontawesome/fonts/', + src: ['**'], + dest: 'source/css/fonts/' + }, + fancybox: { + expand: true, + cwd: 'tmp/fancybox/source/', + src: ['**'], + dest: 'source/fancybox/' + } + }, + _clean: { + tmp: ['tmp'], + fontawesome: ['source/css/fonts'], + fancybox: ['source/fancybox'] + } + }); + + require('load-grunt-tasks')(grunt); + + grunt.renameTask('clean', '_clean'); + + grunt.registerTask('fontawesome', ['gitclone:fontawesome', 'copy:fontawesome', '_clean:tmp']); + grunt.registerTask('fancybox', ['gitclone:fancybox', 'copy:fancybox', '_clean:tmp']); + grunt.registerTask('default', ['gitclone', 'copy', '_clean:tmp']); + grunt.registerTask('clean', ['_clean']); +}; \ No newline at end of file diff --git a/themes/landscape/LICENSE b/themes/landscape/LICENSE new file mode 100644 index 0000000..9ce4d32 --- /dev/null +++ b/themes/landscape/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2013 Tommy Chen + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/themes/landscape/README.md b/themes/landscape/README.md new file mode 100644 index 0000000..90ecccd --- /dev/null +++ b/themes/landscape/README.md @@ -0,0 +1,112 @@ +# Landscape + +A brand new default theme for [Hexo]. + +- [Preview](http://hexo.io/hexo-theme-landscape/) + +## Installation + +### Install + +``` bash +$ git clone https://github.com/hexojs/hexo-theme-landscape.git themes/landscape +``` + +**Landscape requires Hexo 2.4 and above.** If you would like to enable the RSS, the [hexo-generate-feed] plugin is also required. + +### Enable + +Modify `theme` setting in `_config.yml` to `landscape`. + +### Update + +``` bash +cd themes/landscape +git pull +``` + +## Configuration + +``` yml +# Header +menu: + Home: / + Archives: /archives +rss: /atom.xml + +# Content +excerpt_link: Read More +fancybox: true + +# Sidebar +sidebar: right +widgets: +- category +- tag +- tagcloud +- archives +- recent_posts + +# Miscellaneous +google_analytics: +favicon: /favicon.png +twitter: +google_plus: +``` + +- **menu** - Navigation menu +- **rss** - RSS link +- **excerpt_link** - "Read More" link at the bottom of excerpted articles. `false` to hide the link. +- **fancybox** - Enable [Fancybox] +- **sidebar** - Sidebar style. You can choose `left`, `right`, `bottom` or `false`. +- **widgets** - Widgets displaying in sidebar +- **google_analytics** - Google Analytics ID +- **favicon** - Favicon path +- **twitter** - Twiiter ID +- **google_plus** - Google+ ID + +## Features + +### Fancybox + +Landscape uses [Fancybox] to showcase your photos. You can use Markdown syntax or fancybox tag plugin to add your photos. + +``` +![img caption](img url) + +{% fancybox img_url [img_thumbnail] [img_caption] %} +``` + +### Sidebar + +You can put your sidebar in left side, right side or bottom of your site by editing `sidebar` setting. + +Landscape provides 5 built-in widgets: + +- category +- tag +- tagcloud +- archives +- recent_posts + +All of them are enabled by default. You can edit them in `widget` setting. + +## Development + +### Requirements + +- [Grunt] 0.4+ +- Hexo 2.4+ + +### Grunt tasks + +- **default** - Download [Fancybox] and [Font Awesome]. +- **fontawesome** - Only download [Font Awesome]. +- **fancybox** - Only download [Fancybox]. +- **clean** - Clean temporarily files and downloaded files. + +[Hexo]: https://hexo.io/ +[Fancybox]: http://fancyapps.com/fancybox/ +[Font Awesome]: http://fontawesome.io/ +[Grunt]: http://gruntjs.com/ +[hexo-generate-feed]: https://github.com/hexojs/hexo-generator-feed diff --git a/themes/landscape/_config.yml b/themes/landscape/_config.yml new file mode 100644 index 0000000..ca22374 --- /dev/null +++ b/themes/landscape/_config.yml @@ -0,0 +1,37 @@ +# Header +menu: + Home: / + Archives: /archives +rss: /atom.xml + +# Content +excerpt_link: Read More +fancybox: true + +# Sidebar +sidebar: right +widgets: +- category +- tag +- tagcloud +- archive +- recent_posts + +# display widgets at the bottom of index pages (pagination == 2) +index_widgets: +# - category +# - tagcloud +# - archive + +# widget behavior +archive_type: 'monthly' +show_count: false + +# Miscellaneous +google_analytics: +gauges_analytics: +favicon: /favicon.png +twitter: +google_plus: +fb_admins: +fb_app_id: diff --git a/themes/landscape/languages/de.yml b/themes/landscape/languages/de.yml new file mode 100644 index 0000000..630055f --- /dev/null +++ b/themes/landscape/languages/de.yml @@ -0,0 +1,19 @@ +categories: Kategorien +search: Suche +tags: Tags +tagcloud: Tag Cloud +tweets: Tweets +prev: zurück +next: weiter +comment: Kommentare +archive_a: Archiv +archive_b: "Archive: %s" +page: Seite %d +recent_posts: letzter Beitrag +newer: Neuer +older: Älter +share: Teilen +powered_by: Powered by +rss_feed: RSS Feed +category: Kategorie +tag: Tag diff --git a/themes/landscape/languages/default.yml b/themes/landscape/languages/default.yml new file mode 100644 index 0000000..3ef7e92 --- /dev/null +++ b/themes/landscape/languages/default.yml @@ -0,0 +1,19 @@ +categories: Categories +search: Search +tags: Tags +tagcloud: Tag Cloud +tweets: Tweets +prev: Prev +next: Next +comment: Comments +archive_a: Archives +archive_b: "Archives: %s" +page: Page %d +recent_posts: Recent Posts +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/es.yml b/themes/landscape/languages/es.yml new file mode 100644 index 0000000..d862e87 --- /dev/null +++ b/themes/landscape/languages/es.yml @@ -0,0 +1,19 @@ +categories: Categorías +search: Buscar +tags: Tags +tagcloud: Nube de Tags +tweets: Tweets +prev: Previo +next: Siguiente +comment: Comentarios +archive_a: Archivos +archive_b: "Archivos: %s" +page: Página %d +recent_posts: Posts recientes +newer: Nuevo +older: Viejo +share: Compartir +powered_by: Construido por +rss_feed: RSS +category: Categoría +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/fr.yml b/themes/landscape/languages/fr.yml new file mode 100644 index 0000000..c84f51b --- /dev/null +++ b/themes/landscape/languages/fr.yml @@ -0,0 +1,19 @@ +categories: Catégories +search: Rechercher +tags: Mot-clés +tagcloud: Nuage de mot-clés +tweets: Tweets +prev: Précédent +next: Suivant +comment: Commentaires +archive_a: Archives +archive_b: "Archives: %s" +page: Page %d +recent_posts: Articles récents +newer: Récent +older: Ancien +share: Partager +powered_by: Propulsé par +rss_feed: Flux RSS +category: Catégorie +tag: Mot-clé diff --git a/themes/landscape/languages/ja.yml b/themes/landscape/languages/ja.yml new file mode 100644 index 0000000..af0f7fe --- /dev/null +++ b/themes/landscape/languages/ja.yml @@ -0,0 +1,19 @@ +categories: カテゴリ +search: 検索 +tags: タグ +tagcloud: タグクラウド +tweets: ツイート +prev: 戻る +next: 次へ +comment: コメント +archive_a: アーカイブ +archive_b: "アーカイブ: %s" +page: ページ %d +recent_posts: 最近の投稿 +newer: 次の記事 +older: 前の記事 +share: 共有 +powered_by: Powered by +rss_feed: RSSフィード +category: カテゴリ +tag: タグ diff --git a/themes/landscape/languages/ko.yml b/themes/landscape/languages/ko.yml new file mode 100644 index 0000000..1d27b43 --- /dev/null +++ b/themes/landscape/languages/ko.yml @@ -0,0 +1,19 @@ +categories: 카테고리 +search: 검색 +tags: 태그 +tagcloud: 태그 클라우드 +tweets: 트윗 +prev: 이전 +next: 다음 +comment: 댓글 +archive_a: 아카이브 +archive_b: "아카이브: %s" +page: 페이지 %d +recent_posts: 최근 포스트 +newer: 최신 +older: 이전 +share: 공유 +powered_by: Powered by +rss_feed: RSS Feed +category: 카테고리 +tag: 태그 diff --git a/themes/landscape/languages/nl.yml b/themes/landscape/languages/nl.yml new file mode 100644 index 0000000..568d33e --- /dev/null +++ b/themes/landscape/languages/nl.yml @@ -0,0 +1,20 @@ + +categories: Categorieën +search: Zoeken +tags: Labels +tagcloud: Tag Cloud +tweets: Tweets +prev: Vorige +next: Volgende +comment: Commentaren +archive_a: Archieven +archive_b: "Archieven: %s" +page: Pagina %d +recent_posts: Recente berichten +newer: Nieuwer +older: Ouder +share: Delen +powered_by: Powered by +rss_feed: RSS Feed +category: Categorie +tag: Label diff --git a/themes/landscape/languages/no.yml b/themes/landscape/languages/no.yml new file mode 100644 index 0000000..b997691 --- /dev/null +++ b/themes/landscape/languages/no.yml @@ -0,0 +1,19 @@ +categories: Kategorier +search: Søk +tags: Tags +tagcloud: Tag Cloud +tweets: Tweets +prev: Forrige +next: Neste +comment: Kommentarer +archive_a: Arkiv +archive_b: "Arkiv: %s" +page: Side %d +recent_posts: Siste innlegg +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/pt.yml b/themes/landscape/languages/pt.yml new file mode 100644 index 0000000..3d74af3 --- /dev/null +++ b/themes/landscape/languages/pt.yml @@ -0,0 +1,19 @@ +categories: Categorias +search: Buscar +tags: Tags +tagcloud: Nuvem de Tags +tweets: Tweets +prev: Anterior +next: Próximo +comment: Comentários +archive_a: Arquivos +archive_b: "Arquivos: %s" +page: Página %d +recent_posts: Postagens Recentes +newer: Mais Recente +older: Mais Antigo +share: Compartilhar +powered_by: Desenvolvido por +rss_feed: Feed RSS +category: Categoria +tag: Tag diff --git a/themes/landscape/languages/ru.yml b/themes/landscape/languages/ru.yml new file mode 100644 index 0000000..625a83c --- /dev/null +++ b/themes/landscape/languages/ru.yml @@ -0,0 +1,19 @@ +categories: Категории +search: Поиск +tags: Метки +tagcloud: Облако меток +tweets: Твиты +prev: Назад +next: Вперед +comment: Комментарии +archive_a: Архив +archive_b: "Архив: %s" +page: Страница %d +recent_posts: Недавние записи +newer: Следующий +older: Предыдущий +share: Поделиться +powered_by: Создано с помощью +rss_feed: RSS-каналы +category: Категория +tag: Метка \ No newline at end of file diff --git a/themes/landscape/languages/zh-CN.yml b/themes/landscape/languages/zh-CN.yml new file mode 100644 index 0000000..51e1321 --- /dev/null +++ b/themes/landscape/languages/zh-CN.yml @@ -0,0 +1,19 @@ +categories: 分类 +search: 搜索 +tags: 标签 +tagcloud: 标签云 +tweets: 推文 +prev: 上一页 +next: 下一页 +comment: 留言 +archive_a: 归档 +archive_b: 归档:%s +page: 第 %d 页 +recent_posts: 最新文章 +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/zh-TW.yml b/themes/landscape/languages/zh-TW.yml new file mode 100644 index 0000000..76d2916 --- /dev/null +++ b/themes/landscape/languages/zh-TW.yml @@ -0,0 +1,19 @@ +categories: 分類 +search: 搜尋 +tags: 標籤 +tagcloud: 標籤雲 +tweets: 推文 +prev: 上一頁 +next: 下一頁 +comment: 留言 +archive_a: 彙整 +archive_b: 彙整:%s +page: 第 %d 頁 +recent_posts: 最新文章 +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/layout/_partial/after-footer.ejs b/themes/landscape/layout/_partial/after-footer.ejs new file mode 100644 index 0000000..ff2d509 --- /dev/null +++ b/themes/landscape/layout/_partial/after-footer.ejs @@ -0,0 +1,25 @@ +<% if (config.disqus_shortname){ %> + +<% } %> + + + +<% if (theme.fancybox){ %> + <%- css('fancybox/jquery.fancybox') %> + <%- js('fancybox/jquery.fancybox.pack') %> +<% } %> + +<%- js('js/script') %> +<%- partial('gauges-analytics') %> diff --git a/themes/landscape/layout/_partial/archive-post.ejs b/themes/landscape/layout/_partial/archive-post.ejs new file mode 100644 index 0000000..36f2cc3 --- /dev/null +++ b/themes/landscape/layout/_partial/archive-post.ejs @@ -0,0 +1,8 @@ +
+
+
+ <%- partial('post/date', {class_name: 'archive-article-date', date_format: 'MMM D'}) %> + <%- partial('post/title', {class_name: 'archive-article-title'}) %> +
+
+
\ No newline at end of file diff --git a/themes/landscape/layout/_partial/archive.ejs b/themes/landscape/layout/_partial/archive.ejs new file mode 100644 index 0000000..9da934a --- /dev/null +++ b/themes/landscape/layout/_partial/archive.ejs @@ -0,0 +1,34 @@ +<% if (pagination == 2){ %> + <% page.posts.each(function(post){ %> + <%- partial('article', {post: post, index: true}) %> + <% }) %> +<% } else { %> + <% var last; %> + <% page.posts.each(function(post, i){ %> + <% var year = post.date.year(); %> + <% if (last != year){ %> + <% if (last != null){ %> + + <% } %> + <% last = year; %> +
+ +
+ <% } %> + <%- partial('archive-post', {post: post, even: i % 2 == 0}) %> + <% }) %> + <% if (page.posts.length){ %> +
+ <% } %> +<% } %> +<% if (page.total > 1){ %> + +<% } %> diff --git a/themes/landscape/layout/_partial/article.ejs b/themes/landscape/layout/_partial/article.ejs new file mode 100644 index 0000000..0f951a9 --- /dev/null +++ b/themes/landscape/layout/_partial/article.ejs @@ -0,0 +1,44 @@ +
+ +
+ <%- partial('post/gallery') %> + <% if (post.link || post.title){ %> +
+ <%- partial('post/title', {class_name: 'article-title'}) %> +
+ <% } %> +
+ <% if (post.excerpt && index){ %> + <%- post.excerpt %> + <% if (theme.excerpt_link){ %> +

+ <%= theme.excerpt_link %> +

+ <% } %> + <% } else { %> + <%- post.content %> + <% } %> +
+ +
+ <% if (!index){ %> + <%- partial('post/nav') %> + <% } %> +
+ +<% if (!index && post.comments && config.disqus_shortname){ %> +
+
+ +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/footer.ejs b/themes/landscape/layout/_partial/footer.ejs new file mode 100644 index 0000000..3aca618 --- /dev/null +++ b/themes/landscape/layout/_partial/footer.ejs @@ -0,0 +1,11 @@ +
+ <% if (theme.sidebar === 'bottom'){ %> + <%- partial('_partial/sidebar') %> + <% } %> +
+ +
+
\ No newline at end of file diff --git a/themes/landscape/layout/_partial/gauges-analytics.ejs b/themes/landscape/layout/_partial/gauges-analytics.ejs new file mode 100644 index 0000000..d64be38 --- /dev/null +++ b/themes/landscape/layout/_partial/gauges-analytics.ejs @@ -0,0 +1,18 @@ +<% if (theme.gauges_analytics){ %> + + + +<% } %> diff --git a/themes/landscape/layout/_partial/google-analytics.ejs b/themes/landscape/layout/_partial/google-analytics.ejs new file mode 100644 index 0000000..84e75f0 --- /dev/null +++ b/themes/landscape/layout/_partial/google-analytics.ejs @@ -0,0 +1,14 @@ +<% if (theme.google_analytics){ %> + + + +<% } %> diff --git a/themes/landscape/layout/_partial/head.ejs b/themes/landscape/layout/_partial/head.ejs new file mode 100644 index 0000000..43d5f93 --- /dev/null +++ b/themes/landscape/layout/_partial/head.ejs @@ -0,0 +1,36 @@ + + + + + <%- partial('google-analytics') %> + <% + var title = page.title; + + if (is_archive()){ + title = __('archive_a'); + + if (is_month()){ + title += ': ' + page.year + '/' + page.month; + } else if (is_year()){ + title += ': ' + page.year; + } + } else if (is_category()){ + title = __('category') + ': ' + page.category; + } else if (is_tag()){ + title = __('tag') + ': ' + page.tag; + } + %> + <% if (title){ %><%= title %> | <% } %><%= config.title %> + + <%- open_graph({twitter_id: theme.twitter, google_plus: theme.google_plus, fb_admins: theme.fb_admins, fb_app_id: theme.fb_app_id}) %> + <% if (theme.rss){ %> + + <% } %> + <% if (theme.favicon){ %> + + <% } %> + <% if (config.highlight.enable){ %> + + <% } %> + <%- css('css/style') %> + diff --git a/themes/landscape/layout/_partial/header.ejs b/themes/landscape/layout/_partial/header.ejs new file mode 100644 index 0000000..e8a305e --- /dev/null +++ b/themes/landscape/layout/_partial/header.ejs @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/mobile-nav.ejs b/themes/landscape/layout/_partial/mobile-nav.ejs new file mode 100644 index 0000000..7c1d2af --- /dev/null +++ b/themes/landscape/layout/_partial/mobile-nav.ejs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/category.ejs b/themes/landscape/layout/_partial/post/category.ejs new file mode 100644 index 0000000..db2ed48 --- /dev/null +++ b/themes/landscape/layout/_partial/post/category.ejs @@ -0,0 +1,10 @@ +<% if (post.categories && post.categories.length){ %> + +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/date.ejs b/themes/landscape/layout/_partial/post/date.ejs new file mode 100644 index 0000000..3f49613 --- /dev/null +++ b/themes/landscape/layout/_partial/post/date.ejs @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/gallery.ejs b/themes/landscape/layout/_partial/post/gallery.ejs new file mode 100644 index 0000000..886c8ec --- /dev/null +++ b/themes/landscape/layout/_partial/post/gallery.ejs @@ -0,0 +1,11 @@ +<% if (post.photos && post.photos.length){ %> +
+
+ <% post.photos.forEach(function(photo, i){ %> + + + + <% }) %> +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/nav.ejs b/themes/landscape/layout/_partial/post/nav.ejs new file mode 100644 index 0000000..720798a --- /dev/null +++ b/themes/landscape/layout/_partial/post/nav.ejs @@ -0,0 +1,22 @@ +<% if (post.prev || post.next){ %> + +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/tag.ejs b/themes/landscape/layout/_partial/post/tag.ejs new file mode 100644 index 0000000..e0f327f --- /dev/null +++ b/themes/landscape/layout/_partial/post/tag.ejs @@ -0,0 +1,6 @@ +<% if (post.tags && post.tags.length){ %> + <%- list_tags(post.tags, { + show_count: false, + class: 'article-tag' + }) %> +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/title.ejs b/themes/landscape/layout/_partial/post/title.ejs new file mode 100644 index 0000000..69d646f --- /dev/null +++ b/themes/landscape/layout/_partial/post/title.ejs @@ -0,0 +1,15 @@ +<% if (post.link){ %> +

+ +

+<% } else if (post.title){ %> + <% if (index){ %> +

+ <%= post.title %> +

+ <% } else { %> +

+ <%= post.title %> +

+ <% } %> +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/sidebar.ejs b/themes/landscape/layout/_partial/sidebar.ejs new file mode 100644 index 0000000..c1e48e5 --- /dev/null +++ b/themes/landscape/layout/_partial/sidebar.ejs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_widget/archive.ejs b/themes/landscape/layout/_widget/archive.ejs new file mode 100644 index 0000000..a20c58c --- /dev/null +++ b/themes/landscape/layout/_widget/archive.ejs @@ -0,0 +1,8 @@ +<% if (site.posts.length){ %> +
+

<%= __('archive_a') %>

+
+ <%- list_archives({show_count: theme.show_count, type: theme.archive_type}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/category.ejs b/themes/landscape/layout/_widget/category.ejs new file mode 100644 index 0000000..8d9e5e9 --- /dev/null +++ b/themes/landscape/layout/_widget/category.ejs @@ -0,0 +1,8 @@ +<% if (site.categories.length){ %> +
+

<%= __('categories') %>

+
+ <%- list_categories({show_count: theme.show_count}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/recent_posts.ejs b/themes/landscape/layout/_widget/recent_posts.ejs new file mode 100644 index 0000000..7a38547 --- /dev/null +++ b/themes/landscape/layout/_widget/recent_posts.ejs @@ -0,0 +1,14 @@ +<% if (site.posts.length){ %> +
+

<%= __('recent_posts') %>

+
+ +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_widget/tag.ejs b/themes/landscape/layout/_widget/tag.ejs new file mode 100644 index 0000000..ea5fb2c --- /dev/null +++ b/themes/landscape/layout/_widget/tag.ejs @@ -0,0 +1,8 @@ +<% if (site.tags.length){ %> +
+

<%= __('tags') %>

+
+ <%- list_tags({show_count: theme.show_count}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/tagcloud.ejs b/themes/landscape/layout/_widget/tagcloud.ejs new file mode 100644 index 0000000..5feb435 --- /dev/null +++ b/themes/landscape/layout/_widget/tagcloud.ejs @@ -0,0 +1,8 @@ +<% if (site.tags.length){ %> +
+

<%= __('tagcloud') %>

+
+ <%- tagcloud() %> +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/archive.ejs b/themes/landscape/layout/archive.ejs new file mode 100644 index 0000000..52f9b21 --- /dev/null +++ b/themes/landscape/layout/archive.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.archive, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/category.ejs b/themes/landscape/layout/category.ejs new file mode 100644 index 0000000..3ffe252 --- /dev/null +++ b/themes/landscape/layout/category.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.category, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/index.ejs b/themes/landscape/layout/index.ejs new file mode 100644 index 0000000..60a2c68 --- /dev/null +++ b/themes/landscape/layout/index.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: 2, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/layout.ejs b/themes/landscape/layout/layout.ejs new file mode 100644 index 0000000..cf88daf --- /dev/null +++ b/themes/landscape/layout/layout.ejs @@ -0,0 +1,18 @@ +<%- partial('_partial/head') %> + +
+
+ <%- partial('_partial/header', null, {cache: !config.relative_link}) %> +
+
<%- body %>
+ <% if (theme.sidebar && theme.sidebar !== 'bottom'){ %> + <%- partial('_partial/sidebar', null, {cache: !config.relative_link}) %> + <% } %> +
+ <%- partial('_partial/footer', null, {cache: !config.relative_link}) %> +
+ <%- partial('_partial/mobile-nav', null, {cache: !config.relative_link}) %> + <%- partial('_partial/after-footer') %> +
+ + \ No newline at end of file diff --git a/themes/landscape/layout/page.ejs b/themes/landscape/layout/page.ejs new file mode 100644 index 0000000..bea6318 --- /dev/null +++ b/themes/landscape/layout/page.ejs @@ -0,0 +1 @@ +<%- partial('_partial/article', {post: page, index: false}) %> \ No newline at end of file diff --git a/themes/landscape/layout/post.ejs b/themes/landscape/layout/post.ejs new file mode 100644 index 0000000..bea6318 --- /dev/null +++ b/themes/landscape/layout/post.ejs @@ -0,0 +1 @@ +<%- partial('_partial/article', {post: page, index: false}) %> \ No newline at end of file diff --git a/themes/landscape/layout/tag.ejs b/themes/landscape/layout/tag.ejs new file mode 100644 index 0000000..048cdb0 --- /dev/null +++ b/themes/landscape/layout/tag.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.tag, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/package.json b/themes/landscape/package.json new file mode 100644 index 0000000..ac0df3d --- /dev/null +++ b/themes/landscape/package.json @@ -0,0 +1,12 @@ +{ + "name": "hexo-theme-landscape", + "version": "0.0.2", + "private": true, + "devDependencies": { + "grunt": "~0.4.2", + "load-grunt-tasks": "~0.2.0", + "grunt-git": "~0.2.2", + "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-copy": "~0.4.1" + } +} diff --git a/themes/landscape/scripts/fancybox.js b/themes/landscape/scripts/fancybox.js new file mode 100644 index 0000000..83f1fdc --- /dev/null +++ b/themes/landscape/scripts/fancybox.js @@ -0,0 +1,24 @@ +var rUrl = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/; + +/** +* Fancybox tag +* +* Syntax: +* {% fancybox /path/to/image [/path/to/thumbnail] [title] %} +*/ + +hexo.extend.tag.register('fancybox', function(args){ + var original = args.shift(), + thumbnail = ''; + + if (args.length && rUrl.test(args[0])){ + thumbnail = args.shift(); + } + + var title = args.join(' '); + + return '' + + '' + title + '' + '' + + (title ? '' + title + '' : ''); +}); \ No newline at end of file diff --git a/themes/landscape/source/css/_extend.styl b/themes/landscape/source/css/_extend.styl new file mode 100644 index 0000000..96a1817 --- /dev/null +++ b/themes/landscape/source/css/_extend.styl @@ -0,0 +1,63 @@ +$block-caption + text-decoration: none + text-transform: uppercase + letter-spacing: 2px + color: color-grey + margin-bottom: 1em + margin-left: 5px + line-height: 1em + text-shadow: 0 1px #fff + font-weight: bold + +$block + background: #fff + box-shadow: 1px 2px 3px #ddd + border: 1px solid color-border + border-radius: 3px + +$base-style + h1 + font-size: 2em + h2 + font-size: 1.5em + h3 + font-size: 1.3em + h4 + font-size: 1.2em + h5 + font-size: 1em + h6 + font-size: 1em + color: color-grey + hr + border: 1px dashed color-border + strong + font-weight: bold + em, cite + font-style: italic + sup, sub + font-size: 0.75em + line-height: 0 + position: relative + vertical-align: baseline + sup + top: -0.5em + sub + bottom: -0.2em + small + font-size: 0.85em + acronym, abbr + border-bottom: 1px dotted + ul, ol, dl + margin: 0 20px + line-height: line-height + ul, ol + ul, ol + margin-top: 0 + margin-bottom: 0 + ul + list-style: disc + ol + list-style: decimal + dt + font-weight: bold \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/archive.styl b/themes/landscape/source/css/_partial/archive.styl new file mode 100644 index 0000000..90ef053 --- /dev/null +++ b/themes/landscape/source/css/_partial/archive.styl @@ -0,0 +1,80 @@ +.archives-wrap + margin: block-margin 0 + +.archives + clearfix() + +.archive-year-wrap + margin-bottom: 1em + +.archive-year + @extend $block-caption + +.archives + column-gap: 10px + @media mq-tablet + column-count: 2 + @media mq-normal + column-count: 3 + +.archive-article + avoid-column-break() + +.archive-article-inner + @extend $block + padding: 10px + margin-bottom: 15px + +.archive-article-title + text-decoration: none + font-weight: bold + color: color-default + transition: color 0.2s + line-height: line-height + &:hover + color: color-link + +.archive-article-footer + margin-top: 1em + +.archive-article-date + color: color-grey + text-decoration: none + font-size: 0.85em + line-height: 1em + margin-bottom: 0.5em + display: block + +#page-nav + clearfix() + margin: block-margin auto + background: #fff + box-shadow: 1px 2px 3px #ddd + border: 1px solid color-border + border-radius: 3px + text-align: center + color: color-grey + overflow: hidden + a, span + padding: 10px 20px + line-height: 1 + height: 2ex + a + color: color-grey + text-decoration: none + &:hover + background: color-grey + color: #fff + .prev + float: left + .next + float: right + .page-number + display: inline-block + @media mq-mobile + display: none + .current + color: color-default + font-weight: bold + .space + color: color-border \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/article.styl b/themes/landscape/source/css/_partial/article.styl new file mode 100644 index 0000000..46094f9 --- /dev/null +++ b/themes/landscape/source/css/_partial/article.styl @@ -0,0 +1,357 @@ +.article + margin: block-margin 0 + +.article-inner + @extend $block + overflow: hidden + +.article-meta + clearfix() + +.article-date + @extend $block-caption + float: left + +.article-category + float: left + line-height: 1em + color: #ccc + text-shadow: 0 1px #fff + margin-left: 8px + &:before + content: "\2022" + +.article-category-link + @extend $block-caption + margin: 0 12px 1em + +.article-header + padding: article-padding article-padding 0 + +.article-title + text-decoration: none + font-size: 2em + font-weight: bold + color: color-default + line-height: line-height-title + transition: color 0.2s + a&:hover + color: color-link + +.article-entry + @extend $base-style + clearfix() + color: color-default + padding: 0 article-padding + p, table + line-height: line-height + margin: line-height 0 + h1, h2, h3, h4, h5, h6 + font-weight: bold + h1, h2, h3, h4, h5, h6 + line-height: line-height-title + margin: line-height-title 0 + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + ul, ol, dl + margin-top: line-height + margin-bottom: line-height + img, video + max-width: 100% + height: auto + display: block + margin: auto + iframe + border: none + table + width: 100% + border-collapse: collapse + border-spacing: 0 + th + font-weight: bold + border-bottom: 3px solid color-border + padding-bottom: 0.5em + td + border-bottom: 1px solid color-border + padding: 10px 0 + blockquote + font-family: font-serif + font-size: 1.4em + margin: line-height 20px + text-align: center + footer + font-size: font-size + margin: line-height 0 + font-family: font-sans + cite + &:before + content: "—" + padding: 0 0.5em + .pullquote + text-align: left + width: 45% + margin: 0 + &.left + margin-left: 0.5em + margin-right: 1em + &.right + margin-right: 0.5em + margin-left: 1em + .caption + color: color-grey + display: block + font-size: 0.9em + margin-top: 0.5em + position: relative + text-align: center + // http://webdesignerwall.com/tutorials/css-elastic-videos + .video-container + position: relative + padding-top: (9 / 16 * 100)% // 16:9 ratio + height: 0 + overflow: hidden + iframe, object, embed + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + margin-top: 0 + +.article-more-link a + display: inline-block + line-height: 1em + padding: 6px 15px + border-radius: 15px + background: color-background + color: color-grey + text-shadow: 0 1px #fff + text-decoration: none + &:hover + background: color-link + color: #fff + text-decoration: none + text-shadow: 0 1px darken(color-link, 20%) + +.article-footer + clearfix() + font-size: 0.85em + line-height: line-height + border-top: 1px solid color-border + padding-top: line-height + margin: 0 article-padding article-padding + a + color: color-grey + text-decoration: none + &:hover + color: color-default + +.article-tag-list-item + float: left + margin-right: 10px + +.article-tag-list-link + &:before + content: "#" + +.article-comment-link + float: right + &:before + content: "\f075" + font-family: font-icon + padding-right: 8px + +.article-share-link + cursor: pointer + float: right + margin-left: 20px + &:before + content: "\f064" + font-family: font-icon + padding-right: 6px + +#article-nav + clearfix() + position: relative + @media mq-normal + margin: block-margin 0 + &:before + absolute-center(8px) + content: "" + border-radius: 50% + background: color-border + box-shadow: 0 1px 2px #fff + +.article-nav-link-wrap + text-decoration: none + text-shadow: 0 1px #fff + color: color-grey + box-sizing: border-box + margin-top: block-margin + text-align: center + display: block + &:hover + color: color-default + @media mq-normal + width: 50% + margin-top: 0 + +#article-nav-newer + @media mq-normal + float: left + text-align: right + padding-right: 20px + +#article-nav-older + @media mq-normal + float: right + text-align: left + padding-left: 20px + +.article-nav-caption + text-transform: uppercase + letter-spacing: 2px + color: color-border + line-height: 1em + font-weight: bold + #article-nav-newer & + margin-right: -2px + +.article-nav-title + font-size: 0.85em + line-height: line-height + margin-top: 0.5em + +.article-share-box + position: absolute + display: none + background: #fff + box-shadow: 1px 2px 10px rgba(0, 0, 0, 0.2) + border-radius: 3px + margin-left: -145px + overflow: hidden + z-index: 1 + &.on + display: block + +.article-share-input + width: 100% + background: none + box-sizing: border-box + font: 14px font-sans + padding: 0 15px + color: color-default + outline: none + border: 1px solid color-border + border-radius: 3px 3px 0 0 + height: 36px + line-height: 36px + +.article-share-links + clearfix() + background: color-background + +$article-share-link + width: 50px + height: 36px + display: block + float: left + position: relative + color: #999 + text-shadow: 0 1px #fff + &:before + font-size: 20px + font-family: font-icon + absolute-center(@font-size) + text-align: center + &:hover + color: #fff + +.article-share-twitter + @extend $article-share-link + &:before + content: "\f099" + &:hover + background: color-twitter + text-shadow: 0 1px darken(color-twitter, 20%) + +.article-share-facebook + @extend $article-share-link + &:before + content: "\f09a" + &:hover + background: color-facebook + text-shadow: 0 1px darken(color-facebook, 20%) + +.article-share-pinterest + @extend $article-share-link + &:before + content: "\f0d2" + &:hover + background: color-pinterest + text-shadow: 0 1px darken(color-pinterest, 20%) + +.article-share-google + @extend $article-share-link + &:before + content: "\f0d5" + &:hover + background: color-google + text-shadow: 0 1px darken(color-google, 20%) + +.article-gallery + background: #000 + position: relative + +.article-gallery-photos + position: relative + overflow: hidden + +.article-gallery-img + display: none + max-width: 100% + &:first-child + display: block + &.loaded + position: absolute + display: block + img + display: block + max-width: 100% + margin: 0 auto +/* +$article-gallery-ctrl + position: absolute + top: 0 + height: 100% + width: 60px + color: #fff + text-shadow: 0 0 3px rgba(0, 0, 0, 0.3) + opacity: 0.3 + transition: opacity 0.2s + cursor: pointer + &:hover + opacity: 0.8 + &:before + font-size: 30px + font-family: font-icon + position: absolute + top: 50% + margin-top: @font-size * -0.5 + +.article-gallery-prev + @extend $article-gallery-ctrl + left: 0 + &:before + content: "\f053" + left: 15px + +.article-gallery-next + @extend $article-gallery-ctrl + right: 0 + &:before + content: "\f054" + right: 15px*/ \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/comment.styl b/themes/landscape/source/css/_partial/comment.styl new file mode 100644 index 0000000..296b7dd --- /dev/null +++ b/themes/landscape/source/css/_partial/comment.styl @@ -0,0 +1,9 @@ +#comments + background: #fff + box-shadow: 1px 2px 3px #ddd + padding: article-padding + border: 1px solid color-border + border-radius: 3px + margin: block-margin 0 + a + color: color-link \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/footer.styl b/themes/landscape/source/css/_partial/footer.styl new file mode 100644 index 0000000..fe2fd24 --- /dev/null +++ b/themes/landscape/source/css/_partial/footer.styl @@ -0,0 +1,14 @@ +#footer + background: color-footer-background + padding: 50px 0 + border-top: 1px solid color-border + color: color-grey + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + +#footer-info + line-height: line-height + font-size: 0.85em \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/header.styl b/themes/landscape/source/css/_partial/header.styl new file mode 100644 index 0000000..d18ebc8 --- /dev/null +++ b/themes/landscape/source/css/_partial/header.styl @@ -0,0 +1,165 @@ +#header + height: banner-height + position: relative + border-bottom: 1px solid color-border + &:before, &:after + content: "" + position: absolute + left: 0 + right: 0 + height: 40px + &:before + top: 0 + background: linear-gradient(rgba(0, 0, 0, 0.2), transparent) + &:after + bottom: 0 + background: linear-gradient(transparent, rgba(0, 0, 0, 0.2)) + +#header-outer + height: 100% + position: relative + +#header-inner + position: relative + overflow: hidden + +#banner + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + background: url(banner-url) center #000 + background-size: cover + z-index: -1 + +#header-title + text-align: center + height: logo-size + position: absolute + top: 50% + left: 0 + margin-top: logo-size * -0.5 + +$logo-text + text-decoration: none + color: #fff + font-weight: 300 + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) + +#logo + @extend $logo-text + font-size: logo-size + line-height: logo-size + letter-spacing: 2px + +#subtitle + @extend $logo-text + font-size: subtitle-size + line-height: subtitle-size + letter-spacing: 1px + +#subtitle-wrap + margin-top: subtitle-size + +#main-nav + float: left + margin-left: -15px + +$nav-link + float: left + color: #fff + opacity: 0.6 + text-decoration: none + text-shadow: 0 1px rgba(0, 0, 0, 0.2) + transition: opacity 0.2s + display: block + padding: 20px 15px + &:hover + opacity: 1 + +.nav-icon + @extend $nav-link + font-family: font-icon + text-align: center + font-size: font-size + width: font-size + height: font-size + padding: 20px 15px + position: relative + cursor: pointer + +.main-nav-link + @extend $nav-link + font-weight: 300 + letter-spacing: 1px + @media mq-mobile + display: none + +#main-nav-toggle + display: none + &:before + content: "\f0c9" + @media mq-mobile + display: block + +#sub-nav + float: right + margin-right: -15px + +#nav-rss-link + &:before + content: "\f09e" + +#nav-search-btn + &:before + content: "\f002" + +#search-form-wrap + position: absolute + top: 15px + width: 150px + height: 30px + right: -150px + opacity: 0 + transition: 0.2s ease-out + &.on + opacity: 1 + right: 0 + @media mq-mobile + width: 100% + right: -100% + +.search-form + position: absolute + top: 0 + left: 0 + right: 0 + background: #fff + padding: 5px 15px + border-radius: 15px + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3) + +.search-form-input + border: none + background: none + color: color-default + width: 100% + font: 13px font-sans + outline: none + &::-webkit-search-results-decoration + &::-webkit-search-cancel-button + -webkit-appearance: none + +.search-form-submit + position: absolute + top: 50% + right: 10px + margin-top: -7px + font: 13px font-icon + border: none + background: none + color: #bbb + cursor: pointer + &:hover, &:focus + color: #777 \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/highlight.styl b/themes/landscape/source/css/_partial/highlight.styl new file mode 100644 index 0000000..c932ec3 --- /dev/null +++ b/themes/landscape/source/css/_partial/highlight.styl @@ -0,0 +1,158 @@ +// https://github.com/chriskempson/tomorrow-theme +highlight-background = #2d2d2d +highlight-current-line = #393939 +highlight-selection = #515151 +highlight-foreground = #cccccc +highlight-comment = #999999 +highlight-red = #f2777a +highlight-orange = #f99157 +highlight-yellow = #ffcc66 +highlight-green = #99cc99 +highlight-aqua = #66cccc +highlight-blue = #6699cc +highlight-purple = #cc99cc + +$code-block + background: highlight-background + margin: 0 article-padding * -1 + padding: 15px article-padding + border-style: solid + border-color: color-border + border-width: 1px 0 + overflow: auto + color: highlight-foreground + line-height: font-size * line-height + +$line-numbers + color: #666 + font-size: 0.85em + +.article-entry + pre, code + font-family: font-mono + code + background: color-background + text-shadow: 0 1px #fff + padding: 0 0.3em + pre + @extend $code-block + code + background: none + text-shadow: none + padding: 0 + .highlight + @extend $code-block + pre + border: none + margin: 0 + padding: 0 + table + margin: 0 + width: auto + td + border: none + padding: 0 + figcaption + clearfix() + font-size: 0.85em + color: highlight-comment + line-height: 1em + margin-bottom: 1em + a + float: right + .gutter pre + @extend $line-numbers + text-align: right + padding-right: 20px + .line + height: font-size * line-height + .line.marked + background: highlight-selection + .gist + margin: 0 article-padding * -1 + border-style: solid + border-color: color-border + border-width: 1px 0 + background: highlight-background + padding: 15px article-padding 15px 0 + .gist-file + border: none + font-family: font-mono + margin: 0 + .gist-data + background: none + border: none + .line-numbers + @extend $line-numbers + background: none + border: none + padding: 0 20px 0 0 + .line-data + padding: 0 !important + .highlight + margin: 0 + padding: 0 + border: none + .gist-meta + background: highlight-background + color: highlight-comment + font: 0.85em font-sans + text-shadow: 0 0 + padding: 0 + margin-top: 1em + margin-left: article-padding + a + color: color-link + font-weight: normal + &:hover + text-decoration: underline + +pre + .comment + .title + color: highlight-comment + .variable + .attribute + .tag + .regexp + .ruby .constant + .xml .tag .title + .xml .pi + .xml .doctype + .html .doctype + .css .id + .css .class + .css .pseudo + color: highlight-red + .number + .preprocessor + .built_in + .literal + .params + .constant + color: highlight-orange + .class + .ruby .class .title + .css .rules .attribute + color: highlight-green + .string + .value + .inheritance + .header + .ruby .symbol + .xml .cdata + color: highlight-green + .css .hexcolor + color: highlight-aqua + .function + .python .decorator + .python .title + .ruby .function .title + .ruby .title .keyword + .perl .sub + .javascript .title + .coffeescript .title + color: highlight-blue + .keyword + .javascript .function + color: highlight-purple diff --git a/themes/landscape/source/css/_partial/mobile.styl b/themes/landscape/source/css/_partial/mobile.styl new file mode 100644 index 0000000..eb68b3a --- /dev/null +++ b/themes/landscape/source/css/_partial/mobile.styl @@ -0,0 +1,19 @@ +@media mq-mobile + #mobile-nav + position: absolute + top: 0 + left: 0 + width: mobile-nav-width + height: 100% + background: color-mobile-nav-background + border-right: 1px solid #fff + +@media mq-mobile + .mobile-nav-link + display: block + color: color-grey + text-decoration: none + padding: 15px 20px + font-weight: bold + &:hover + color: #fff diff --git a/themes/landscape/source/css/_partial/sidebar-aside.styl b/themes/landscape/source/css/_partial/sidebar-aside.styl new file mode 100644 index 0000000..838b167 --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar-aside.styl @@ -0,0 +1,27 @@ +#sidebar + @media mq-normal + column(sidebar-column) + +.widget-wrap + margin: block-margin 0 + +.widget-title + @extend $block-caption + +.widget + color: color-sidebar-text + text-shadow: 0 1px #fff + background: color-widget-background + box-shadow: 0 -1px 4px color-widget-border inset + border: 1px solid color-widget-border + padding: 15px + border-radius: 3px + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + ul, ol, dl + ul, ol, dl + margin-left: 15px + list-style: disc \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/sidebar-bottom.styl b/themes/landscape/source/css/_partial/sidebar-bottom.styl new file mode 100644 index 0000000..e2403fd --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar-bottom.styl @@ -0,0 +1,27 @@ +.widget-wrap + margin-bottom: block-margin !important + @media mq-normal + column(main-column) + +.widget-title + color: #ccc + text-transform: uppercase + letter-spacing: 2px + margin-bottom: .5em + line-height: 1em + font-weight: bold + +.widget + color: color-grey + ul, ol + li + display: inline-block + zoom:1 + *display:inline + padding-right: .75em +/* Having problems getting balanced white space between items + li:before + content: " | " + li:first-child:before + content: none + */ diff --git a/themes/landscape/source/css/_partial/sidebar.styl b/themes/landscape/source/css/_partial/sidebar.styl new file mode 100644 index 0000000..e43d66a --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar.styl @@ -0,0 +1,35 @@ +if sidebar is bottom + @import "sidebar-bottom" +else + @import "sidebar-aside" + +.widget + @extend $base-style + line-height: line-height + word-wrap: break-word + font-size: 0.9em + ul, ol + list-style: none + margin: 0 + ul, ol + margin: 0 20px + ul + list-style: disc + ol + list-style: decimal + +.category-list-count +.tag-list-count +.archive-list-count + padding-left: 5px + color: color-grey + font-size: 0.85em + &:before + content: "(" + &:after + content: ")" + +.tagcloud + a + margin-right: 5px + display: inline-block diff --git a/themes/landscape/source/css/_util/grid.styl b/themes/landscape/source/css/_util/grid.styl new file mode 100644 index 0000000..2a14dd2 --- /dev/null +++ b/themes/landscape/source/css/_util/grid.styl @@ -0,0 +1,38 @@ +///////////////// +// Semantic.gs // for Stylus: http://learnboost.github.com/stylus/ +///////////////// + +// Utility function — you should never need to modify this +// _gridsystem-width = (column-width + gutter-width) * columns +gridsystem-width(_columns = columns) + (column-width + gutter-width) * _columns + +// Set @total-width to 100% for a fluid layout +// total-width = gridsystem-width(columns) +total-width = 100% + +////////// +// GRID // +////////// + +body + clearfix() + width: 100% + +row(_columns = columns) + clearfix() + display: block + width: total-width * ((gutter-width + gridsystem-width(_columns)) / gridsystem-width(_columns)) + margin: 0 total-width * (((gutter-width * .5) / gridsystem-width(_columns)) * -1) + +column(x, _columns = columns) + display: inline + float: left + width: total-width * ((((gutter-width + column-width) * x) - gutter-width) / gridsystem-width(_columns)) + margin: 0 total-width * ((gutter-width * .5) / gridsystem-width(_columns)) + +push(offset = 1) + margin-left: total-width * (((gutter-width + column-width) * offset) / gridsystem-width(columns)) + +pull(offset = 1) + margin-right: total-width * (((gutter-width + column-width) * offset) / gridsystem-width(columns)) \ No newline at end of file diff --git a/themes/landscape/source/css/_util/mixin.styl b/themes/landscape/source/css/_util/mixin.styl new file mode 100644 index 0000000..b56f037 --- /dev/null +++ b/themes/landscape/source/css/_util/mixin.styl @@ -0,0 +1,31 @@ +// http://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/ +hide-text() + text-indent: 100% + white-space: nowrap + overflow: hidden + +// http://codepen.io/shshaw/full/gEiDt +absolute-center(width, height = width) + // margin: auto + // position: absolute + // top: 50% + // top: 0 + // left: 0 + // bottom: 0 + // right: 0 + // width: width + // height: height + // overflow: auto + width: width + height: height + position: absolute + top: 50% + left: 50% + margin-top: width * -0.5 + margin-left: height * -0.5 + +avoid-column-break() + vendor("column-break-inside", avoid, only: webkit) + page-break-inside: avoid // for firefox + overflow: hidden // fix for firefox + break-inside: avoid-column diff --git a/themes/landscape/source/css/_variables.styl b/themes/landscape/source/css/_variables.styl new file mode 100644 index 0000000..4562911 --- /dev/null +++ b/themes/landscape/source/css/_variables.styl @@ -0,0 +1,63 @@ +// Config +support-for-ie = false +vendor-prefixes = webkit moz ms official + +// Colors +color-default = #555 +color-grey = #999 +color-border = #ddd +color-link = #258fb8 +color-background = #eee +color-sidebar-text = #777 +color-widget-background = #ddd +color-widget-border = #ccc +color-footer-background = #262a30 +color-mobile-nav-background = #191919 +color-twitter = #00aced +color-facebook = #3b5998 +color-pinterest = #cb2027 +color-google = #dd4b39 + +// Fonts +font-sans = -apple-system, BlinkMacSystemFont, + "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", + "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif +font-serif = Georgia, "Times New Roman", serif +font-mono = "Source Code Pro", Consolas, Monaco, Menlo, Consolas, monospace +font-icon = FontAwesome +font-icon-path = "fonts/fontawesome-webfont" +font-icon-version = "4.0.3" +font-size = 14px +line-height = 1.6em +line-height-title = 1.1em + +// Header +logo-size = 40px +subtitle-size = 16px +banner-height = 300px +banner-url = "images/banner.jpg" + +sidebar = hexo-config("sidebar") + +// Layout +block-margin = 50px +article-padding = 20px +mobile-nav-width = 280px +main-column = 9 +sidebar-column = 3 + +if sidebar and sidebar isnt bottom + _sidebar-column = sidebar-column +else + _sidebar-column = 0 + +// Grids +column-width = 80px +gutter-width = 20px +columns = main-column + _sidebar-column + +// Media queries +mq-mobile = "screen and (max-width: 479px)" +mq-tablet = "screen and (min-width: 480px) and (max-width: 767px)" +mq-normal = "screen and (min-width: 768px)" \ No newline at end of file diff --git a/themes/landscape/source/css/fonts/FontAwesome.otf b/themes/landscape/source/css/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..8b0f54e47e1d356dcf1496942a50e228e0f1ee14 GIT binary patch literal 62856 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