├── .DS_Store
├── .gitignore
├── README.md
├── _config.yml
├── _partial
├── aboutme.pug
├── footer.pug
├── google-analytics.pug
├── header.pug
├── layout.pug
└── post_footer.pug
├── layout
├── archive.pug
├── index.pug
├── post.pug
└── tag.pug
├── package-lock.json
├── package.json
├── screenshot.jpg
├── screenshot2.jpg
└── source
├── .DS_Store
├── fancybox
├── blank.gif
├── fancybox_loading.gif
├── fancybox_loading@2x.gif
├── fancybox_overlay.png
├── fancybox_sprite.png
├── fancybox_sprite@2x.png
├── helpers
│ ├── fancybox_buttons.png
│ ├── jquery.fancybox-buttons.css
│ ├── jquery.fancybox-buttons.js
│ ├── jquery.fancybox-media.js
│ ├── jquery.fancybox-thumbs.css
│ └── jquery.fancybox-thumbs.js
├── jquery.fancybox.css
├── jquery.fancybox.js
└── jquery.fancybox.pack.js
├── images
├── avatar.png
├── check.svg
└── socials
│ ├── email.svg
│ ├── facebook.svg
│ ├── flickr.svg
│ ├── github.svg
│ ├── google.svg
│ ├── instagram.svg
│ ├── wechat.svg
│ └── weibo.svg
├── script
├── index.js
├── jquery.min.js
└── post.js
└── styles
├── _extend.styl
├── _partial
├── aboutme.styl
├── archive.styl
├── article.styl
├── footer.styl
├── header.styl
├── highlight.styl
└── theme.styl
├── _variables.styl
└── site.styl
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/.DS_Store
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .idea
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # hexo-theme-bear
2 |
3 | 此主题参考[Bear](http://www.bear-writer.com/)的阅读体验而制作。
4 |
5 | This theme is inspired by [Bear](http://www.bear-writer.com/) which is awesome!
6 |
7 | ## Install
8 |
9 | 1. Download from GitHub
10 | ```shell
11 | $ cd your-hexo-site
12 | $ git clone https://github.com/gary-Shen/hexo-theme-bear themes/bear
13 | ```
14 | 2. Set the `theme` field in **your site** `_config.yml` to `bear`
15 | ```yml
16 | theme: bear
17 | ```
18 | 3. ❤️ Install dependencies.
19 | The template is written in pug. So you need to install `hexo-render-pug`.
20 | ```
21 | $ npm i hexo-render-pug
22 | # Install your all dependencies if you didn't do this before.
23 | $ npm i
24 | ```
25 |
26 | ## Update
27 |
28 | ```shell
29 | cd themes/bear
30 | git pull
31 | ```
32 |
33 | ## [Live Demo](http://www.garyshen.com)
34 |
35 | ## Screenshot
36 |
37 | 
38 |
39 | ## Bear in hexo-theme-bear
40 | 
41 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | # Header
2 | menu:
3 | 归档: /archives
4 | rss: /atom.xml
5 | title: GARY.SHEN
6 |
7 | author: GARY.SHEN
8 | aboutme: Halo~
9 |
10 | # Content
11 | excerpt_link: 全文...
12 | fancybox: true
13 | date_format: 'YYYY年MM月DD日'
14 |
15 | socials:
16 | github: "https://github.com/gary-Shen"
17 | flickr: "https://www.flickr.com/photos/69944455@N05/"
18 | email: "guanlinshen@126.com"
19 | wechat: "Grinson"
20 |
21 |
22 |
23 | # Sidebar
24 | # sidebar: right
25 | # widgets:
26 | # - category
27 | # - tag
28 | # - archive
29 | # - recent_posts
30 |
31 | # display widgets at the bottom of index pages (pagination == 2)
32 | index_widgets:
33 | # - category
34 | # - tagcloud
35 | # - archive
36 |
37 | #主题方案
38 | highlight_theme: atom light
39 |
40 | # widget behavior
41 | archive_type: 'monthly'
42 | show_count: false
43 |
44 | disqus_shortname:
45 |
46 | # Miscellaneous
47 | google_analytics: 'UA-61220413-1'
48 | gauges_analytics:
49 | favicon: /images/avatar.png
50 | avatar: "/images/avatar.png"
51 | twitter:
52 | google_plus:
53 | fb_admins:
54 | fb_app_id:
55 |
--------------------------------------------------------------------------------
/_partial/aboutme.pug:
--------------------------------------------------------------------------------
1 | .about-me-mask
2 | .about-me-wrap
3 | .about-me__header
4 | .avatar
5 | img(src=theme.avatar)
6 | ul.socials
7 | each item, name in theme.socials
8 | li.social-item
9 | span.label
10 | img(src='/images/socials/' + name + '.svg', alt=item)
11 | -var isLink = ['https', 'http', 'www'].some(function (prefix) {
12 | - return item.indexOf(prefix) > -1;
13 | -});
14 | -if (isLink)
15 | a(href=url_for(item), target="_blank", title=item)= item
16 | -else
17 | span= item
18 |
--------------------------------------------------------------------------------
/_partial/footer.pug:
--------------------------------------------------------------------------------
1 | footer.container
2 | .rights
3 | span Powered by
4 | a(href="http://hexo.io", target="_blank") Hexo
5 | span , Theme
6 | a(href="https://github.com/gary-Shen/hexo-theme-bear", target="_blank") Bear
7 | span .
8 |
--------------------------------------------------------------------------------
/_partial/google-analytics.pug:
--------------------------------------------------------------------------------
1 | if theme.google_analytics
2 | script
3 | | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
4 | | ga('create', '!{theme.google_analytics}', 'auto');
5 | | ga('send', 'pageview');
6 |
--------------------------------------------------------------------------------
/_partial/header.pug:
--------------------------------------------------------------------------------
1 | header.container#header
2 | .header
3 | .header-left
4 | .avatar
5 | img(src=theme.avatar)
6 | .author
7 | div.author-name
8 | a(href="/")=theme.author
9 | div.about-me=theme.aboutme
10 |
11 | .header-right
12 | ul.navigation
13 | each link, text in theme.menu
14 | li
15 | a(href=link)=text
16 |
17 | include ./aboutme.pug
18 |
--------------------------------------------------------------------------------
/_partial/layout.pug:
--------------------------------------------------------------------------------
1 | doctype html
2 | html
3 | head
4 | meta(charset="utf-8")
5 | meta(name="description", content=config.description)
6 | meta(name="keyword", content=config.keyword)
7 | meta(name="viewport", content="width=device-width, initial-scale=1.0")
8 | meta(http-equiv="X-UA-Compatible" content="IE=edge")
9 |
10 | -var title = page.title
11 | title= title ? title : theme.title
12 | if theme.favicon
13 | link(rel="shortcut icon", href=theme.favicon, type="image/x-icon")
14 | link(href="/styles/site.css", rel="stylesheet")
15 |
16 | block css
17 |
18 | block head
19 |
20 | //- HTML BODY
21 | body
22 |
23 | //- HEADER
24 | include ./header.pug
25 |
26 | //- CONTENT
27 | block content
28 |
29 | #backToTop
30 | .back-arrow.back-arrow-left
31 | .back-arrow.back-arrow-right
32 |
33 | //- FOOTER
34 | include ./footer.pug
35 |
36 | include ./post_footer.pug
37 | include ./google-analytics.pug
38 | block js
39 |
--------------------------------------------------------------------------------
/_partial/post_footer.pug:
--------------------------------------------------------------------------------
1 | != js('script/jquery.min')
2 |
3 | if theme.fancybox
4 | != css('fancybox/jquery.fancybox')
5 | != js('fancybox/jquery.fancybox.pack')
6 |
7 | != js('script/index')
--------------------------------------------------------------------------------
/layout/archive.pug:
--------------------------------------------------------------------------------
1 | extends ../_partial/layout
2 |
3 | block content
4 | .container
5 | - const postsByYear = {};
6 | - // 按年份将文章分组
7 | - for (let i = 0; i < site.posts.data.length; i++) {
8 | - const post = site.posts.data[i];
9 | - if (!page.year || post.date.year() === page.year) {
10 | - const year = post.date.year();
11 | - if (!postsByYear[year]) {
12 | - postsByYear[year] = [];
13 | - }
14 | - postsByYear[year].push(post);
15 | - }
16 | - }
17 | - // 按年份倒序排序并返回结果
18 | - const sortedYears = Object.keys(postsByYear).sort((a, b) => b - a);
19 | - const sortedPosts = sortedYears.map(year => [year, postsByYear[year]]);
20 | each group in sortedPosts
21 | .year-wrap
22 | .year
23 | a.title(href=url_for(config.archive_dir + '/' + group[0]))= group[0]
24 | .archives
25 | each post in group[1]
26 | .post-archive
27 | .post-archive__content
28 | .post-archive__month= time(post.date, 'MM月')
29 | .post-archive__body
30 | a.post-archive__title(href=url_for(post.path))= post.title || '未命名'
31 | .post-archive__excerpt
32 | .post-archive__excerpt-content!= post.excerpt
33 |
--------------------------------------------------------------------------------
/layout/index.pug:
--------------------------------------------------------------------------------
1 | extends ../_partial/layout
2 |
3 | block content
4 |
5 | .container.home
6 | each post in site.posts.sort('date', -1).data
7 | section.article
8 | a(href=url_for(post.path)).title= post.title || '未命名'
9 | div.content.excerpt!= post.excerpt || post.content
10 | if post.tags
11 | .tags!= list_tags(post.tags, { show_count: false, class: 'tag', style: false, separator: '' })
12 | div.article-footer
13 | a.excerpt-link(href=url_for(post.path))= theme.excerpt_link
14 | .article-footer__right
15 | span.date 写于#{moment(post.date).format(theme.date_format)}
16 |
17 |
--------------------------------------------------------------------------------
/layout/post.pug:
--------------------------------------------------------------------------------
1 | extends ../_partial/layout
2 |
3 | block content
4 | .container.post
5 | section.article
6 | .title= page.title
7 | .date 写于#{moment(page.date).format(theme.date_format)}
8 | .content!= page.content
9 | if page.tags
10 | .tags!= list_tags(page.tags, { show_count: false, class: 'tag', style: false, separator: '' })
11 |
12 | .container
13 | ul.nav
14 | if page.prev
15 | li 上一篇:
16 | a(href=url_for(page.prev.path))= page.prev.title || '未命名'
17 | if page.next
18 | li 下一篇:
19 | a(href=url_for(page.next.path))= page.next.title || '未命名'
20 |
21 | if !index && config.disqus_shortname
22 | .comments
23 | #disqus_thread
24 | noscript Please enable JavaScript to view the
25 | a(href="http://disqus.com/?ref_noscript") comments powered by Disqus
26 |
27 | block js
28 | != js('script/post')
29 | if config.disqus_shortname
30 | script
31 | | var disqus_shortname = '!{config.disqus_shortname}';
32 | if page.permalink
33 | | var disqus_url = '!{page.permalink}';
34 | | (function(){
35 | | var dsq = document.createElement('script');
36 | | dsq.type = 'text/javascript';
37 | | dsq.async = true;
38 | | dsq.src = '//' + disqus_shortname + '.disqus.com/!{page.comments ? 'embed.js' : 'count.hs'}';
39 | | (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
40 | | })();
41 |
42 |
--------------------------------------------------------------------------------
/layout/tag.pug:
--------------------------------------------------------------------------------
1 | extends ../_partial/layout
2 |
3 | block content
4 | .container
5 | - const _posts = [];
6 | - // 按标签将文章分组
7 | - for (let i = 0; i < site.posts.data.length; i++) {
8 | - const post = site.posts.data[i];
9 | - if (post.tags.data.length === 0) {
10 | - continue;
11 | - }
12 | - const tags = post.tags.data.map(tag => tag.name);
13 | - if (tags.includes(page.tag)) {
14 | - _posts.push(post);
15 | - }
16 | - }
17 | .archives
18 | each post in _posts
19 | .post-archive
20 | .post-archive__content
21 | .post-archive__month= time(post.date, 'MM月')
22 | .post-archive__body
23 | a.post-archive__title(href=url_for(post.path))= post.title || '未命名'
24 | .post-archive__excerpt
25 | .post-archive__excerpt-content!= post.excerpt
26 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hexo-theme-bear",
3 | "version": "1.0.0",
4 | "private": true,
5 | "description": "hexo theme bear",
6 | "dependencies": {
7 | "hexo": "^5.4.0",
8 | "hexo-deployer-git": "^3.0.0",
9 | "hexo-front-matter-excerpt": "^0.2.0",
10 | "hexo-generator-archive": "^1.0.0",
11 | "hexo-generator-category": "^1.0.0",
12 | "hexo-generator-index": "^2.0.0",
13 | "hexo-generator-tag": "^1.0.0",
14 | "hexo-render-pug": "^2.1.4",
15 | "hexo-renderer-marked": "^4.0.0",
16 | "hexo-renderer-stylus": "^2.0.1",
17 | "hexo-server": "^2.0.0"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/screenshot.jpg
--------------------------------------------------------------------------------
/screenshot2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/screenshot2.jpg
--------------------------------------------------------------------------------
/source/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/.DS_Store
--------------------------------------------------------------------------------
/source/fancybox/blank.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/fancybox/blank.gif
--------------------------------------------------------------------------------
/source/fancybox/fancybox_loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/fancybox/fancybox_loading.gif
--------------------------------------------------------------------------------
/source/fancybox/fancybox_loading@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/fancybox/fancybox_loading@2x.gif
--------------------------------------------------------------------------------
/source/fancybox/fancybox_overlay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/fancybox/fancybox_overlay.png
--------------------------------------------------------------------------------
/source/fancybox/fancybox_sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/fancybox/fancybox_sprite.png
--------------------------------------------------------------------------------
/source/fancybox/fancybox_sprite@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/fancybox/fancybox_sprite@2x.png
--------------------------------------------------------------------------------
/source/fancybox/helpers/fancybox_buttons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/fancybox/helpers/fancybox_buttons.png
--------------------------------------------------------------------------------
/source/fancybox/helpers/jquery.fancybox-buttons.css:
--------------------------------------------------------------------------------
1 | #fancybox-buttons {
2 | position: fixed;
3 | left: 0;
4 | width: 100%;
5 | z-index: 8050;
6 | }
7 |
8 | #fancybox-buttons.top {
9 | top: 10px;
10 | }
11 |
12 | #fancybox-buttons.bottom {
13 | bottom: 10px;
14 | }
15 |
16 | #fancybox-buttons ul {
17 | display: block;
18 | width: 166px;
19 | height: 30px;
20 | margin: 0 auto;
21 | padding: 0;
22 | list-style: none;
23 | border: 1px solid #111;
24 | border-radius: 3px;
25 | -webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
26 | -moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
27 | box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
28 | background: rgb(50,50,50);
29 | background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%);
30 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51)));
31 | background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
32 | background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
33 | background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
34 | background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
35 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 );
36 | }
37 |
38 | #fancybox-buttons ul li {
39 | float: left;
40 | margin: 0;
41 | padding: 0;
42 | }
43 |
44 | #fancybox-buttons a {
45 | display: block;
46 | width: 30px;
47 | height: 30px;
48 | text-indent: -9999px;
49 | background-color: transparent;
50 | background-image: url('fancybox_buttons.png');
51 | background-repeat: no-repeat;
52 | outline: none;
53 | opacity: 0.8;
54 | }
55 |
56 | #fancybox-buttons a:hover {
57 | opacity: 1;
58 | }
59 |
60 | #fancybox-buttons a.btnPrev {
61 | background-position: 5px 0;
62 | }
63 |
64 | #fancybox-buttons a.btnNext {
65 | background-position: -33px 0;
66 | border-right: 1px solid #3e3e3e;
67 | }
68 |
69 | #fancybox-buttons a.btnPlay {
70 | background-position: 0 -30px;
71 | }
72 |
73 | #fancybox-buttons a.btnPlayOn {
74 | background-position: -30px -30px;
75 | }
76 |
77 | #fancybox-buttons a.btnToggle {
78 | background-position: 3px -60px;
79 | border-left: 1px solid #111;
80 | border-right: 1px solid #3e3e3e;
81 | width: 35px
82 | }
83 |
84 | #fancybox-buttons a.btnToggleOn {
85 | background-position: -27px -60px;
86 | }
87 |
88 | #fancybox-buttons a.btnClose {
89 | border-left: 1px solid #111;
90 | width: 35px;
91 | background-position: -56px 0px;
92 | }
93 |
94 | #fancybox-buttons a.btnDisabled {
95 | opacity : 0.4;
96 | cursor: default;
97 | }
--------------------------------------------------------------------------------
/source/fancybox/helpers/jquery.fancybox-buttons.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Buttons helper for fancyBox
3 | * version: 1.0.5 (Mon, 15 Oct 2012)
4 | * @requires fancyBox v2.0 or later
5 | *
6 | * Usage:
7 | * $(".fancybox").fancybox({
8 | * helpers : {
9 | * buttons: {
10 | * position : 'top'
11 | * }
12 | * }
13 | * });
14 | *
15 | */
16 | ;(function ($) {
17 | //Shortcut for fancyBox object
18 | var F = $.fancybox;
19 |
20 | //Add helper object
21 | F.helpers.buttons = {
22 | defaults : {
23 | skipSingle : false, // disables if gallery contains single image
24 | position : 'top', // 'top' or 'bottom'
25 | tpl : '
'
26 | },
27 |
28 | list : null,
29 | buttons: null,
30 |
31 | beforeLoad: function (opts, obj) {
32 | //Remove self if gallery do not have at least two items
33 |
34 | if (opts.skipSingle && obj.group.length < 2) {
35 | obj.helpers.buttons = false;
36 | obj.closeBtn = true;
37 |
38 | return;
39 | }
40 |
41 | //Increase top margin to give space for buttons
42 | obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30;
43 | },
44 |
45 | onPlayStart: function () {
46 | if (this.buttons) {
47 | this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn');
48 | }
49 | },
50 |
51 | onPlayEnd: function () {
52 | if (this.buttons) {
53 | this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn');
54 | }
55 | },
56 |
57 | afterShow: function (opts, obj) {
58 | var buttons = this.buttons;
59 |
60 | if (!buttons) {
61 | this.list = $(opts.tpl).addClass(opts.position).appendTo('body');
62 |
63 | buttons = {
64 | prev : this.list.find('.btnPrev').click( F.prev ),
65 | next : this.list.find('.btnNext').click( F.next ),
66 | play : this.list.find('.btnPlay').click( F.play ),
67 | toggle : this.list.find('.btnToggle').click( F.toggle ),
68 | close : this.list.find('.btnClose').click( F.close )
69 | }
70 | }
71 |
72 | //Prev
73 | if (obj.index > 0 || obj.loop) {
74 | buttons.prev.removeClass('btnDisabled');
75 | } else {
76 | buttons.prev.addClass('btnDisabled');
77 | }
78 |
79 | //Next / Play
80 | if (obj.loop || obj.index < obj.group.length - 1) {
81 | buttons.next.removeClass('btnDisabled');
82 | buttons.play.removeClass('btnDisabled');
83 |
84 | } else {
85 | buttons.next.addClass('btnDisabled');
86 | buttons.play.addClass('btnDisabled');
87 | }
88 |
89 | this.buttons = buttons;
90 |
91 | this.onUpdate(opts, obj);
92 | },
93 |
94 | onUpdate: function (opts, obj) {
95 | var toggle;
96 |
97 | if (!this.buttons) {
98 | return;
99 | }
100 |
101 | toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn');
102 |
103 | //Size toggle button
104 | if (obj.canShrink) {
105 | toggle.addClass('btnToggleOn');
106 |
107 | } else if (!obj.canExpand) {
108 | toggle.addClass('btnDisabled');
109 | }
110 | },
111 |
112 | beforeClose: function () {
113 | if (this.list) {
114 | this.list.remove();
115 | }
116 |
117 | this.list = null;
118 | this.buttons = null;
119 | }
120 | };
121 |
122 | }(jQuery));
123 |
--------------------------------------------------------------------------------
/source/fancybox/helpers/jquery.fancybox-media.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Media helper for fancyBox
3 | * version: 1.0.6 (Fri, 14 Jun 2013)
4 | * @requires fancyBox v2.0 or later
5 | *
6 | * Usage:
7 | * $(".fancybox").fancybox({
8 | * helpers : {
9 | * media: true
10 | * }
11 | * });
12 | *
13 | * Set custom URL parameters:
14 | * $(".fancybox").fancybox({
15 | * helpers : {
16 | * media: {
17 | * youtube : {
18 | * params : {
19 | * autoplay : 0
20 | * }
21 | * }
22 | * }
23 | * }
24 | * });
25 | *
26 | * Or:
27 | * $(".fancybox").fancybox({,
28 | * helpers : {
29 | * media: true
30 | * },
31 | * youtube : {
32 | * autoplay: 0
33 | * }
34 | * });
35 | *
36 | * Supports:
37 | *
38 | * Youtube
39 | * http://www.youtube.com/watch?v=opj24KnzrWo
40 | * http://www.youtube.com/embed/opj24KnzrWo
41 | * http://youtu.be/opj24KnzrWo
42 | * http://www.youtube-nocookie.com/embed/opj24KnzrWo
43 | * Vimeo
44 | * http://vimeo.com/40648169
45 | * http://vimeo.com/channels/staffpicks/38843628
46 | * http://vimeo.com/groups/surrealism/videos/36516384
47 | * http://player.vimeo.com/video/45074303
48 | * Metacafe
49 | * http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/
50 | * http://www.metacafe.com/watch/7635964/
51 | * Dailymotion
52 | * http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people
53 | * Twitvid
54 | * http://twitvid.com/QY7MD
55 | * Twitpic
56 | * http://twitpic.com/7p93st
57 | * Instagram
58 | * http://instagr.am/p/IejkuUGxQn/
59 | * http://instagram.com/p/IejkuUGxQn/
60 | * Google maps
61 | * http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17
62 | * http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
63 | * http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56
64 | */
65 | ;(function ($) {
66 | "use strict";
67 |
68 | //Shortcut for fancyBox object
69 | var F = $.fancybox,
70 | format = function( url, rez, params ) {
71 | params = params || '';
72 |
73 | if ( $.type( params ) === "object" ) {
74 | params = $.param(params, true);
75 | }
76 |
77 | $.each(rez, function(key, value) {
78 | url = url.replace( '$' + key, value || '' );
79 | });
80 |
81 | if (params.length) {
82 | url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params;
83 | }
84 |
85 | return url;
86 | };
87 |
88 | //Add helper object
89 | F.helpers.media = {
90 | defaults : {
91 | youtube : {
92 | matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i,
93 | params : {
94 | autoplay : 1,
95 | autohide : 1,
96 | fs : 1,
97 | rel : 0,
98 | hd : 1,
99 | wmode : 'opaque',
100 | enablejsapi : 1
101 | },
102 | type : 'iframe',
103 | url : '//www.youtube.com/embed/$3'
104 | },
105 | vimeo : {
106 | matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/,
107 | params : {
108 | autoplay : 1,
109 | hd : 1,
110 | show_title : 1,
111 | show_byline : 1,
112 | show_portrait : 0,
113 | fullscreen : 1
114 | },
115 | type : 'iframe',
116 | url : '//player.vimeo.com/video/$1'
117 | },
118 | metacafe : {
119 | matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/,
120 | params : {
121 | autoPlay : 'yes'
122 | },
123 | type : 'swf',
124 | url : function( rez, params, obj ) {
125 | obj.swf.flashVars = 'playerVars=' + $.param( params, true );
126 |
127 | return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf';
128 | }
129 | },
130 | dailymotion : {
131 | matcher : /dailymotion.com\/video\/(.*)\/?(.*)/,
132 | params : {
133 | additionalInfos : 0,
134 | autoStart : 1
135 | },
136 | type : 'swf',
137 | url : '//www.dailymotion.com/swf/video/$1'
138 | },
139 | twitvid : {
140 | matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i,
141 | params : {
142 | autoplay : 0
143 | },
144 | type : 'iframe',
145 | url : '//www.twitvid.com/embed.php?guid=$1'
146 | },
147 | twitpic : {
148 | matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i,
149 | type : 'image',
150 | url : '//twitpic.com/show/full/$1/'
151 | },
152 | instagram : {
153 | matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
154 | type : 'image',
155 | url : '//$1/p/$2/media/?size=l'
156 | },
157 | google_maps : {
158 | matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i,
159 | type : 'iframe',
160 | url : function( rez ) {
161 | return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed');
162 | }
163 | }
164 | },
165 |
166 | beforeLoad : function(opts, obj) {
167 | var url = obj.href || '',
168 | type = false,
169 | what,
170 | item,
171 | rez,
172 | params;
173 |
174 | for (what in opts) {
175 | if (opts.hasOwnProperty(what)) {
176 | item = opts[ what ];
177 | rez = url.match( item.matcher );
178 |
179 | if (rez) {
180 | type = item.type;
181 | params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null));
182 |
183 | url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params );
184 |
185 | break;
186 | }
187 | }
188 | }
189 |
190 | if (type) {
191 | obj.href = url;
192 | obj.type = type;
193 |
194 | obj.autoHeight = false;
195 | }
196 | }
197 | };
198 |
199 | }(jQuery));
--------------------------------------------------------------------------------
/source/fancybox/helpers/jquery.fancybox-thumbs.css:
--------------------------------------------------------------------------------
1 | #fancybox-thumbs {
2 | position: fixed;
3 | left: 0;
4 | width: 100%;
5 | overflow: hidden;
6 | z-index: 8050;
7 | }
8 |
9 | #fancybox-thumbs.bottom {
10 | bottom: 2px;
11 | }
12 |
13 | #fancybox-thumbs.top {
14 | top: 2px;
15 | }
16 |
17 | #fancybox-thumbs ul {
18 | position: relative;
19 | list-style: none;
20 | margin: 0;
21 | padding: 0;
22 | }
23 |
24 | #fancybox-thumbs ul li {
25 | float: left;
26 | padding: 1px;
27 | opacity: 0.5;
28 | }
29 |
30 | #fancybox-thumbs ul li.active {
31 | opacity: 0.75;
32 | padding: 0;
33 | border: 1px solid #fff;
34 | }
35 |
36 | #fancybox-thumbs ul li:hover {
37 | opacity: 1;
38 | }
39 |
40 | #fancybox-thumbs ul li a {
41 | display: block;
42 | position: relative;
43 | overflow: hidden;
44 | border: 1px solid #222;
45 | background: #111;
46 | outline: none;
47 | }
48 |
49 | #fancybox-thumbs ul li img {
50 | display: block;
51 | position: relative;
52 | border: 0;
53 | padding: 0;
54 | max-width: none;
55 | }
--------------------------------------------------------------------------------
/source/fancybox/helpers/jquery.fancybox-thumbs.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Thumbnail helper for fancyBox
3 | * version: 1.0.7 (Mon, 01 Oct 2012)
4 | * @requires fancyBox v2.0 or later
5 | *
6 | * Usage:
7 | * $(".fancybox").fancybox({
8 | * helpers : {
9 | * thumbs: {
10 | * width : 50,
11 | * height : 50
12 | * }
13 | * }
14 | * });
15 | *
16 | */
17 | ;(function ($) {
18 | //Shortcut for fancyBox object
19 | var F = $.fancybox;
20 |
21 | //Add helper object
22 | F.helpers.thumbs = {
23 | defaults : {
24 | width : 50, // thumbnail width
25 | height : 50, // thumbnail height
26 | position : 'bottom', // 'top' or 'bottom'
27 | source : function ( item ) { // function to obtain the URL of the thumbnail image
28 | var href;
29 |
30 | if (item.element) {
31 | href = $(item.element).find('img').attr('src');
32 | }
33 |
34 | if (!href && item.type === 'image' && item.href) {
35 | href = item.href;
36 | }
37 |
38 | return href;
39 | }
40 | },
41 |
42 | wrap : null,
43 | list : null,
44 | width : 0,
45 |
46 | init: function (opts, obj) {
47 | var that = this,
48 | list,
49 | thumbWidth = opts.width,
50 | thumbHeight = opts.height,
51 | thumbSource = opts.source;
52 |
53 | //Build list structure
54 | list = '';
55 |
56 | for (var n = 0; n < obj.group.length; n++) {
57 | list += '';
58 | }
59 |
60 | this.wrap = $('').addClass(opts.position).appendTo('body');
61 | this.list = $('').appendTo(this.wrap);
62 |
63 | //Load each thumbnail
64 | $.each(obj.group, function (i) {
65 | var el = obj.group[ i ],
66 | href = thumbSource( el );
67 |
68 | if (!href) {
69 | return;
70 | }
71 |
72 | $("
").load(function () {
73 | var width = this.width,
74 | height = this.height,
75 | widthRatio, heightRatio, parent;
76 |
77 | if (!that.list || !width || !height) {
78 | return;
79 | }
80 |
81 | //Calculate thumbnail width/height and center it
82 | widthRatio = width / thumbWidth;
83 | heightRatio = height / thumbHeight;
84 |
85 | parent = that.list.children().eq(i).find('a');
86 |
87 | if (widthRatio >= 1 && heightRatio >= 1) {
88 | if (widthRatio > heightRatio) {
89 | width = Math.floor(width / heightRatio);
90 | height = thumbHeight;
91 |
92 | } else {
93 | width = thumbWidth;
94 | height = Math.floor(height / widthRatio);
95 | }
96 | }
97 |
98 | $(this).css({
99 | width : width,
100 | height : height,
101 | top : Math.floor(thumbHeight / 2 - height / 2),
102 | left : Math.floor(thumbWidth / 2 - width / 2)
103 | });
104 |
105 | parent.width(thumbWidth).height(thumbHeight);
106 |
107 | $(this).hide().appendTo(parent).fadeIn(300);
108 |
109 | })
110 | .attr('src', href)
111 | .attr('title', el.title);
112 | });
113 |
114 | //Set initial width
115 | this.width = this.list.children().eq(0).outerWidth(true);
116 |
117 | this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)));
118 | },
119 |
120 | beforeLoad: function (opts, obj) {
121 | //Remove self if gallery do not have at least two items
122 | if (obj.group.length < 2) {
123 | obj.helpers.thumbs = false;
124 |
125 | return;
126 | }
127 |
128 | //Increase bottom margin to give space for thumbs
129 | obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15);
130 | },
131 |
132 | afterShow: function (opts, obj) {
133 | //Check if exists and create or update list
134 | if (this.list) {
135 | this.onUpdate(opts, obj);
136 |
137 | } else {
138 | this.init(opts, obj);
139 | }
140 |
141 | //Set active element
142 | this.list.children().removeClass('active').eq(obj.index).addClass('active');
143 | },
144 |
145 | //Center list
146 | onUpdate: function (opts, obj) {
147 | if (this.list) {
148 | this.list.stop(true).animate({
149 | 'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))
150 | }, 150);
151 | }
152 | },
153 |
154 | beforeClose: function () {
155 | if (this.wrap) {
156 | this.wrap.remove();
157 | }
158 |
159 | this.wrap = null;
160 | this.list = null;
161 | this.width = 0;
162 | }
163 | }
164 |
165 | }(jQuery));
--------------------------------------------------------------------------------
/source/fancybox/jquery.fancybox.css:
--------------------------------------------------------------------------------
1 | /*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
2 | .fancybox-wrap,
3 | .fancybox-skin,
4 | .fancybox-outer,
5 | .fancybox-inner,
6 | .fancybox-image,
7 | .fancybox-wrap iframe,
8 | .fancybox-wrap object,
9 | .fancybox-nav,
10 | .fancybox-nav span,
11 | .fancybox-tmp
12 | {
13 | padding: 0;
14 | margin: 0;
15 | border: 0;
16 | outline: none;
17 | vertical-align: top;
18 | }
19 |
20 | .fancybox-wrap {
21 | position: absolute;
22 | top: 0;
23 | left: 0;
24 | z-index: 8020;
25 | }
26 |
27 | .fancybox-skin {
28 | position: relative;
29 | background: #f9f9f9;
30 | color: #444;
31 | text-shadow: none;
32 | -webkit-border-radius: 4px;
33 | -moz-border-radius: 4px;
34 | border-radius: 4px;
35 | }
36 |
37 | .fancybox-opened {
38 | z-index: 8030;
39 | }
40 |
41 | .fancybox-opened .fancybox-skin {
42 | -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
43 | -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
44 | box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
45 | }
46 |
47 | .fancybox-outer, .fancybox-inner {
48 | position: relative;
49 | }
50 |
51 | .fancybox-inner {
52 | overflow: hidden;
53 | }
54 |
55 | .fancybox-type-iframe .fancybox-inner {
56 | -webkit-overflow-scrolling: touch;
57 | }
58 |
59 | .fancybox-error {
60 | color: #444;
61 | font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
62 | margin: 0;
63 | padding: 15px;
64 | white-space: nowrap;
65 | }
66 |
67 | .fancybox-image, .fancybox-iframe {
68 | display: block;
69 | width: 100%;
70 | height: 100%;
71 | }
72 |
73 | .fancybox-image {
74 | max-width: 100%;
75 | max-height: 100%;
76 | }
77 |
78 | #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
79 | background-image: url(fancybox_sprite.png);
80 | }
81 |
82 | #fancybox-loading {
83 | position: fixed;
84 | top: 50%;
85 | left: 50%;
86 | margin-top: -22px;
87 | margin-left: -22px;
88 | background-position: 0 -108px;
89 | opacity: 0.8;
90 | cursor: pointer;
91 | z-index: 8060;
92 | }
93 |
94 | #fancybox-loading div {
95 | width: 44px;
96 | height: 44px;
97 | background: url(fancybox_loading.gif) center center no-repeat;
98 | }
99 |
100 | .fancybox-close {
101 | position: absolute;
102 | top: -18px;
103 | right: -18px;
104 | width: 36px;
105 | height: 36px;
106 | cursor: pointer;
107 | z-index: 8040;
108 | }
109 |
110 | .fancybox-nav {
111 | position: absolute;
112 | top: 0;
113 | width: 40%;
114 | height: 100%;
115 | cursor: pointer;
116 | text-decoration: none;
117 | background: transparent url(blank.gif); /* helps IE */
118 | -webkit-tap-highlight-color: rgba(0,0,0,0);
119 | z-index: 8040;
120 | }
121 |
122 | .fancybox-prev {
123 | left: 0;
124 | }
125 |
126 | .fancybox-next {
127 | right: 0;
128 | }
129 |
130 | .fancybox-nav span {
131 | position: absolute;
132 | top: 50%;
133 | width: 36px;
134 | height: 34px;
135 | margin-top: -18px;
136 | cursor: pointer;
137 | z-index: 8040;
138 | visibility: hidden;
139 | }
140 |
141 | .fancybox-prev span {
142 | left: 10px;
143 | background-position: 0 -36px;
144 | }
145 |
146 | .fancybox-next span {
147 | right: 10px;
148 | background-position: 0 -72px;
149 | }
150 |
151 | .fancybox-nav:hover span {
152 | visibility: visible;
153 | }
154 |
155 | .fancybox-tmp {
156 | position: absolute;
157 | top: -99999px;
158 | left: -99999px;
159 | max-width: 99999px;
160 | max-height: 99999px;
161 | overflow: visible !important;
162 | }
163 |
164 | /* Overlay helper */
165 |
166 | .fancybox-lock {
167 | overflow: visible !important;
168 | width: auto;
169 | }
170 |
171 | .fancybox-lock body {
172 | overflow: hidden !important;
173 | }
174 |
175 | .fancybox-lock-test {
176 | overflow-y: hidden !important;
177 | }
178 |
179 | .fancybox-overlay {
180 | position: absolute;
181 | top: 0;
182 | left: 0;
183 | overflow: hidden;
184 | display: none;
185 | z-index: 8010;
186 | background: url(fancybox_overlay.png);
187 | }
188 |
189 | .fancybox-overlay-fixed {
190 | position: fixed;
191 | bottom: 0;
192 | right: 0;
193 | }
194 |
195 | .fancybox-lock .fancybox-overlay {
196 | overflow: auto;
197 | overflow-y: scroll;
198 | }
199 |
200 | /* Title helper */
201 |
202 | .fancybox-title {
203 | visibility: hidden;
204 | font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
205 | position: relative;
206 | text-shadow: none;
207 | z-index: 8050;
208 | }
209 |
210 | .fancybox-opened .fancybox-title {
211 | visibility: visible;
212 | }
213 |
214 | .fancybox-title-float-wrap {
215 | position: absolute;
216 | bottom: 0;
217 | right: 50%;
218 | margin-bottom: -35px;
219 | z-index: 8050;
220 | text-align: center;
221 | }
222 |
223 | .fancybox-title-float-wrap .child {
224 | display: inline-block;
225 | margin-right: -100%;
226 | padding: 2px 20px;
227 | background: transparent; /* Fallback for web browsers that doesn't support RGBa */
228 | background: rgba(0, 0, 0, 0.8);
229 | -webkit-border-radius: 15px;
230 | -moz-border-radius: 15px;
231 | border-radius: 15px;
232 | text-shadow: 0 1px 2px #222;
233 | color: #FFF;
234 | font-weight: bold;
235 | line-height: 24px;
236 | white-space: nowrap;
237 | }
238 |
239 | .fancybox-title-outside-wrap {
240 | position: relative;
241 | margin-top: 10px;
242 | color: #fff;
243 | }
244 |
245 | .fancybox-title-inside-wrap {
246 | padding-top: 10px;
247 | }
248 |
249 | .fancybox-title-over-wrap {
250 | position: absolute;
251 | bottom: 0;
252 | left: 0;
253 | color: #fff;
254 | padding: 10px;
255 | background: #000;
256 | background: rgba(0, 0, 0, .8);
257 | }
258 |
259 | /*Retina graphics!*/
260 | @media only screen and (-webkit-min-device-pixel-ratio: 1.5),
261 | only screen and (min--moz-device-pixel-ratio: 1.5),
262 | only screen and (min-device-pixel-ratio: 1.5){
263 |
264 | #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
265 | background-image: url(fancybox_sprite@2x.png);
266 | background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/
267 | }
268 |
269 | #fancybox-loading div {
270 | background-image: url(fancybox_loading@2x.gif);
271 | background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/
272 | }
273 | }
--------------------------------------------------------------------------------
/source/fancybox/jquery.fancybox.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * fancyBox - jQuery Plugin
3 | * version: 2.1.5 (Fri, 14 Jun 2013)
4 | * requires jQuery v1.6 or later
5 | *
6 | * Examples at http://fancyapps.com/fancybox/
7 | * License: www.fancyapps.com/fancybox/#license
8 | *
9 | * Copyright 2012 Janis Skarnelis - janis@fancyapps.com
10 | *
11 | */
12 |
13 | ;(function (window, document, $, undefined) {
14 | "use strict";
15 |
16 | var H = $("html"),
17 | W = $(window),
18 | D = $(document),
19 | F = $.fancybox = function () {
20 | F.open.apply( this, arguments );
21 | },
22 | IE = navigator.userAgent.match(/msie/i),
23 | didUpdate = null,
24 | isTouch = document.createTouch !== undefined,
25 |
26 | isQuery = function(obj) {
27 | return obj && obj.hasOwnProperty && obj instanceof $;
28 | },
29 | isString = function(str) {
30 | return str && $.type(str) === "string";
31 | },
32 | isPercentage = function(str) {
33 | return isString(str) && str.indexOf('%') > 0;
34 | },
35 | isScrollable = function(el) {
36 | return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight)));
37 | },
38 | getScalar = function(orig, dim) {
39 | var value = parseInt(orig, 10) || 0;
40 |
41 | if (dim && isPercentage(orig)) {
42 | value = F.getViewport()[ dim ] / 100 * value;
43 | }
44 |
45 | return Math.ceil(value);
46 | },
47 | getValue = function(value, dim) {
48 | return getScalar(value, dim) + 'px';
49 | };
50 |
51 | $.extend(F, {
52 | // The current version of fancyBox
53 | version: '2.1.5',
54 |
55 | defaults: {
56 | padding : 15,
57 | margin : 20,
58 |
59 | width : 800,
60 | height : 600,
61 | minWidth : 100,
62 | minHeight : 100,
63 | maxWidth : 9999,
64 | maxHeight : 9999,
65 | pixelRatio: 1, // Set to 2 for retina display support
66 |
67 | autoSize : true,
68 | autoHeight : false,
69 | autoWidth : false,
70 |
71 | autoResize : true,
72 | autoCenter : !isTouch,
73 | fitToView : true,
74 | aspectRatio : false,
75 | topRatio : 0.5,
76 | leftRatio : 0.5,
77 |
78 | scrolling : 'auto', // 'auto', 'yes' or 'no'
79 | wrapCSS : '',
80 |
81 | arrows : true,
82 | closeBtn : true,
83 | closeClick : false,
84 | nextClick : false,
85 | mouseWheel : true,
86 | autoPlay : false,
87 | playSpeed : 3000,
88 | preload : 3,
89 | modal : false,
90 | loop : true,
91 |
92 | ajax : {
93 | dataType : 'html',
94 | headers : { 'X-fancyBox': true }
95 | },
96 | iframe : {
97 | scrolling : 'auto',
98 | preload : true
99 | },
100 | swf : {
101 | wmode: 'transparent',
102 | allowfullscreen : 'true',
103 | allowscriptaccess : 'always'
104 | },
105 |
106 | keys : {
107 | next : {
108 | 13 : 'left', // enter
109 | 34 : 'up', // page down
110 | 39 : 'left', // right arrow
111 | 40 : 'up' // down arrow
112 | },
113 | prev : {
114 | 8 : 'right', // backspace
115 | 33 : 'down', // page up
116 | 37 : 'right', // left arrow
117 | 38 : 'down' // up arrow
118 | },
119 | close : [27], // escape key
120 | play : [32], // space - start/stop slideshow
121 | toggle : [70] // letter "f" - toggle fullscreen
122 | },
123 |
124 | direction : {
125 | next : 'left',
126 | prev : 'right'
127 | },
128 |
129 | scrollOutside : true,
130 |
131 | // Override some properties
132 | index : 0,
133 | type : null,
134 | href : null,
135 | content : null,
136 | title : null,
137 |
138 | // HTML templates
139 | tpl: {
140 | wrap : '',
141 | image : '
',
142 | iframe : '',
143 | error : 'The requested content cannot be loaded.
Please try again later.
',
144 | closeBtn : '',
145 | next : '',
146 | prev : ''
147 | },
148 |
149 | // Properties for each animation type
150 | // Opening fancyBox
151 | openEffect : 'fade', // 'elastic', 'fade' or 'none'
152 | openSpeed : 250,
153 | openEasing : 'swing',
154 | openOpacity : true,
155 | openMethod : 'zoomIn',
156 |
157 | // Closing fancyBox
158 | closeEffect : 'fade', // 'elastic', 'fade' or 'none'
159 | closeSpeed : 250,
160 | closeEasing : 'swing',
161 | closeOpacity : true,
162 | closeMethod : 'zoomOut',
163 |
164 | // Changing next gallery item
165 | nextEffect : 'elastic', // 'elastic', 'fade' or 'none'
166 | nextSpeed : 250,
167 | nextEasing : 'swing',
168 | nextMethod : 'changeIn',
169 |
170 | // Changing previous gallery item
171 | prevEffect : 'elastic', // 'elastic', 'fade' or 'none'
172 | prevSpeed : 250,
173 | prevEasing : 'swing',
174 | prevMethod : 'changeOut',
175 |
176 | // Enable default helpers
177 | helpers : {
178 | overlay : true,
179 | title : true
180 | },
181 |
182 | // Callbacks
183 | onCancel : $.noop, // If canceling
184 | beforeLoad : $.noop, // Before loading
185 | afterLoad : $.noop, // After loading
186 | beforeShow : $.noop, // Before changing in current item
187 | afterShow : $.noop, // After opening
188 | beforeChange : $.noop, // Before changing gallery item
189 | beforeClose : $.noop, // Before closing
190 | afterClose : $.noop // After closing
191 | },
192 |
193 | //Current state
194 | group : {}, // Selected group
195 | opts : {}, // Group options
196 | previous : null, // Previous element
197 | coming : null, // Element being loaded
198 | current : null, // Currently loaded element
199 | isActive : false, // Is activated
200 | isOpen : false, // Is currently open
201 | isOpened : false, // Have been fully opened at least once
202 |
203 | wrap : null,
204 | skin : null,
205 | outer : null,
206 | inner : null,
207 |
208 | player : {
209 | timer : null,
210 | isActive : false
211 | },
212 |
213 | // Loaders
214 | ajaxLoad : null,
215 | imgPreload : null,
216 |
217 | // Some collections
218 | transitions : {},
219 | helpers : {},
220 |
221 | /*
222 | * Static methods
223 | */
224 |
225 | open: function (group, opts) {
226 | if (!group) {
227 | return;
228 | }
229 |
230 | if (!$.isPlainObject(opts)) {
231 | opts = {};
232 | }
233 |
234 | // Close if already active
235 | if (false === F.close(true)) {
236 | return;
237 | }
238 |
239 | // Normalize group
240 | if (!$.isArray(group)) {
241 | group = isQuery(group) ? $(group).get() : [group];
242 | }
243 |
244 | // Recheck if the type of each element is `object` and set content type (image, ajax, etc)
245 | $.each(group, function(i, element) {
246 | var obj = {},
247 | href,
248 | title,
249 | content,
250 | type,
251 | rez,
252 | hrefParts,
253 | selector;
254 |
255 | if ($.type(element) === "object") {
256 | // Check if is DOM element
257 | if (element.nodeType) {
258 | element = $(element);
259 | }
260 |
261 | if (isQuery(element)) {
262 | obj = {
263 | href : element.data('fancybox-href') || element.attr('href'),
264 | title : $('').text( element.data('fancybox-title') || element.attr('title') ).html(),
265 | isDom : true,
266 | element : element
267 | };
268 |
269 | if ($.metadata) {
270 | $.extend(true, obj, element.metadata());
271 | }
272 |
273 | } else {
274 | obj = element;
275 | }
276 | }
277 |
278 | href = opts.href || obj.href || (isString(element) ? element : null);
279 | title = opts.title !== undefined ? opts.title : obj.title || '';
280 |
281 | content = opts.content || obj.content;
282 | type = content ? 'html' : (opts.type || obj.type);
283 |
284 | if (!type && obj.isDom) {
285 | type = element.data('fancybox-type');
286 |
287 | if (!type) {
288 | rez = element.prop('class').match(/fancybox\.(\w+)/);
289 | type = rez ? rez[1] : null;
290 | }
291 | }
292 |
293 | if (isString(href)) {
294 | // Try to guess the content type
295 | if (!type) {
296 | if (F.isImage(href)) {
297 | type = 'image';
298 |
299 | } else if (F.isSWF(href)) {
300 | type = 'swf';
301 |
302 | } else if (href.charAt(0) === '#') {
303 | type = 'inline';
304 |
305 | } else if (isString(element)) {
306 | type = 'html';
307 | content = element;
308 | }
309 | }
310 |
311 | // Split url into two pieces with source url and content selector, e.g,
312 | // "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id"
313 | if (type === 'ajax') {
314 | hrefParts = href.split(/\s+/, 2);
315 | href = hrefParts.shift();
316 | selector = hrefParts.shift();
317 | }
318 | }
319 |
320 | if (!content) {
321 | if (type === 'inline') {
322 | if (href) {
323 | content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7
324 |
325 | } else if (obj.isDom) {
326 | content = element;
327 | }
328 |
329 | } else if (type === 'html') {
330 | content = href;
331 |
332 | } else if (!type && !href && obj.isDom) {
333 | type = 'inline';
334 | content = element;
335 | }
336 | }
337 |
338 | $.extend(obj, {
339 | href : href,
340 | type : type,
341 | content : content,
342 | title : title,
343 | selector : selector
344 | });
345 |
346 | group[ i ] = obj;
347 | });
348 |
349 | // Extend the defaults
350 | F.opts = $.extend(true, {}, F.defaults, opts);
351 |
352 | // All options are merged recursive except keys
353 | if (opts.keys !== undefined) {
354 | F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false;
355 | }
356 |
357 | F.group = group;
358 |
359 | return F._start(F.opts.index);
360 | },
361 |
362 | // Cancel image loading or abort ajax request
363 | cancel: function () {
364 | var coming = F.coming;
365 |
366 | if (coming && false === F.trigger('onCancel')) {
367 | return;
368 | }
369 |
370 | F.hideLoading();
371 |
372 | if (!coming) {
373 | return;
374 | }
375 |
376 | if (F.ajaxLoad) {
377 | F.ajaxLoad.abort();
378 | }
379 |
380 | F.ajaxLoad = null;
381 |
382 | if (F.imgPreload) {
383 | F.imgPreload.onload = F.imgPreload.onerror = null;
384 | }
385 |
386 | if (coming.wrap) {
387 | coming.wrap.stop(true, true).trigger('onReset').remove();
388 | }
389 |
390 | F.coming = null;
391 |
392 | // If the first item has been canceled, then clear everything
393 | if (!F.current) {
394 | F._afterZoomOut( coming );
395 | }
396 | },
397 |
398 | // Start closing animation if is open; remove immediately if opening/closing
399 | close: function (event) {
400 | F.cancel();
401 |
402 | if (false === F.trigger('beforeClose')) {
403 | return;
404 | }
405 |
406 | F.unbindEvents();
407 |
408 | if (!F.isActive) {
409 | return;
410 | }
411 |
412 | if (!F.isOpen || event === true) {
413 | $('.fancybox-wrap').stop(true).trigger('onReset').remove();
414 |
415 | F._afterZoomOut();
416 |
417 | } else {
418 | F.isOpen = F.isOpened = false;
419 | F.isClosing = true;
420 |
421 | $('.fancybox-item, .fancybox-nav').remove();
422 |
423 | F.wrap.stop(true, true).removeClass('fancybox-opened');
424 |
425 | F.transitions[ F.current.closeMethod ]();
426 | }
427 | },
428 |
429 | // Manage slideshow:
430 | // $.fancybox.play(); - toggle slideshow
431 | // $.fancybox.play( true ); - start
432 | // $.fancybox.play( false ); - stop
433 | play: function ( action ) {
434 | var clear = function () {
435 | clearTimeout(F.player.timer);
436 | },
437 | set = function () {
438 | clear();
439 |
440 | if (F.current && F.player.isActive) {
441 | F.player.timer = setTimeout(F.next, F.current.playSpeed);
442 | }
443 | },
444 | stop = function () {
445 | clear();
446 |
447 | D.unbind('.player');
448 |
449 | F.player.isActive = false;
450 |
451 | F.trigger('onPlayEnd');
452 | },
453 | start = function () {
454 | if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) {
455 | F.player.isActive = true;
456 |
457 | D.bind({
458 | 'onCancel.player beforeClose.player' : stop,
459 | 'onUpdate.player' : set,
460 | 'beforeLoad.player' : clear
461 | });
462 |
463 | set();
464 |
465 | F.trigger('onPlayStart');
466 | }
467 | };
468 |
469 | if (action === true || (!F.player.isActive && action !== false)) {
470 | start();
471 | } else {
472 | stop();
473 | }
474 | },
475 |
476 | // Navigate to next gallery item
477 | next: function ( direction ) {
478 | var current = F.current;
479 |
480 | if (current) {
481 | if (!isString(direction)) {
482 | direction = current.direction.next;
483 | }
484 |
485 | F.jumpto(current.index + 1, direction, 'next');
486 | }
487 | },
488 |
489 | // Navigate to previous gallery item
490 | prev: function ( direction ) {
491 | var current = F.current;
492 |
493 | if (current) {
494 | if (!isString(direction)) {
495 | direction = current.direction.prev;
496 | }
497 |
498 | F.jumpto(current.index - 1, direction, 'prev');
499 | }
500 | },
501 |
502 | // Navigate to gallery item by index
503 | jumpto: function ( index, direction, router ) {
504 | var current = F.current;
505 |
506 | if (!current) {
507 | return;
508 | }
509 |
510 | index = getScalar(index);
511 |
512 | F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ];
513 | F.router = router || 'jumpto';
514 |
515 | if (current.loop) {
516 | if (index < 0) {
517 | index = current.group.length + (index % current.group.length);
518 | }
519 |
520 | index = index % current.group.length;
521 | }
522 |
523 | if (current.group[ index ] !== undefined) {
524 | F.cancel();
525 |
526 | F._start(index);
527 | }
528 | },
529 |
530 | // Center inside viewport and toggle position type to fixed or absolute if needed
531 | reposition: function (e, onlyAbsolute) {
532 | var current = F.current,
533 | wrap = current ? current.wrap : null,
534 | pos;
535 |
536 | if (wrap) {
537 | pos = F._getPosition(onlyAbsolute);
538 |
539 | if (e && e.type === 'scroll') {
540 | delete pos.position;
541 |
542 | wrap.stop(true, true).animate(pos, 200);
543 |
544 | } else {
545 | wrap.css(pos);
546 |
547 | current.pos = $.extend({}, current.dim, pos);
548 | }
549 | }
550 | },
551 |
552 | update: function (e) {
553 | var type = (e && e.originalEvent && e.originalEvent.type),
554 | anyway = !type || type === 'orientationchange';
555 |
556 | if (anyway) {
557 | clearTimeout(didUpdate);
558 |
559 | didUpdate = null;
560 | }
561 |
562 | if (!F.isOpen || didUpdate) {
563 | return;
564 | }
565 |
566 | didUpdate = setTimeout(function() {
567 | var current = F.current;
568 |
569 | if (!current || F.isClosing) {
570 | return;
571 | }
572 |
573 | F.wrap.removeClass('fancybox-tmp');
574 |
575 | if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) {
576 | F._setDimension();
577 | }
578 |
579 | if (!(type === 'scroll' && current.canShrink)) {
580 | F.reposition(e);
581 | }
582 |
583 | F.trigger('onUpdate');
584 |
585 | didUpdate = null;
586 |
587 | }, (anyway && !isTouch ? 0 : 300));
588 | },
589 |
590 | // Shrink content to fit inside viewport or restore if resized
591 | toggle: function ( action ) {
592 | if (F.isOpen) {
593 | F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView;
594 |
595 | // Help browser to restore document dimensions
596 | if (isTouch) {
597 | F.wrap.removeAttr('style').addClass('fancybox-tmp');
598 |
599 | F.trigger('onUpdate');
600 | }
601 |
602 | F.update();
603 | }
604 | },
605 |
606 | hideLoading: function () {
607 | D.unbind('.loading');
608 |
609 | $('#fancybox-loading').remove();
610 | },
611 |
612 | showLoading: function () {
613 | var el, viewport;
614 |
615 | F.hideLoading();
616 |
617 | el = $('').click(F.cancel).appendTo('body');
618 |
619 | // If user will press the escape-button, the request will be canceled
620 | D.bind('keydown.loading', function(e) {
621 | if ((e.which || e.keyCode) === 27) {
622 | e.preventDefault();
623 |
624 | F.cancel();
625 | }
626 | });
627 |
628 | if (!F.defaults.fixed) {
629 | viewport = F.getViewport();
630 |
631 | el.css({
632 | position : 'absolute',
633 | top : (viewport.h * 0.5) + viewport.y,
634 | left : (viewport.w * 0.5) + viewport.x
635 | });
636 | }
637 |
638 | F.trigger('onLoading');
639 | },
640 |
641 | getViewport: function () {
642 | var locked = (F.current && F.current.locked) || false,
643 | rez = {
644 | x: W.scrollLeft(),
645 | y: W.scrollTop()
646 | };
647 |
648 | if (locked && locked.length) {
649 | rez.w = locked[0].clientWidth;
650 | rez.h = locked[0].clientHeight;
651 |
652 | } else {
653 | // See http://bugs.jquery.com/ticket/6724
654 | rez.w = isTouch && window.innerWidth ? window.innerWidth : W.width();
655 | rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height();
656 | }
657 |
658 | return rez;
659 | },
660 |
661 | // Unbind the keyboard / clicking actions
662 | unbindEvents: function () {
663 | if (F.wrap && isQuery(F.wrap)) {
664 | F.wrap.unbind('.fb');
665 | }
666 |
667 | D.unbind('.fb');
668 | W.unbind('.fb');
669 | },
670 |
671 | bindEvents: function () {
672 | var current = F.current,
673 | keys;
674 |
675 | if (!current) {
676 | return;
677 | }
678 |
679 | // Changing document height on iOS devices triggers a 'resize' event,
680 | // that can change document height... repeating infinitely
681 | W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update);
682 |
683 | keys = current.keys;
684 |
685 | if (keys) {
686 | D.bind('keydown.fb', function (e) {
687 | var code = e.which || e.keyCode,
688 | target = e.target || e.srcElement;
689 |
690 | // Skip esc key if loading, because showLoading will cancel preloading
691 | if (code === 27 && F.coming) {
692 | return false;
693 | }
694 |
695 | // Ignore key combinations and key events within form elements
696 | if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) {
697 | $.each(keys, function(i, val) {
698 | if (current.group.length > 1 && val[ code ] !== undefined) {
699 | F[ i ]( val[ code ] );
700 |
701 | e.preventDefault();
702 | return false;
703 | }
704 |
705 | if ($.inArray(code, val) > -1) {
706 | F[ i ] ();
707 |
708 | e.preventDefault();
709 | return false;
710 | }
711 | });
712 | }
713 | });
714 | }
715 |
716 | if ($.fn.mousewheel && current.mouseWheel) {
717 | F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) {
718 | var target = e.target || null,
719 | parent = $(target),
720 | canScroll = false;
721 |
722 | while (parent.length) {
723 | if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) {
724 | break;
725 | }
726 |
727 | canScroll = isScrollable( parent[0] );
728 | parent = $(parent).parent();
729 | }
730 |
731 | if (delta !== 0 && !canScroll) {
732 | if (F.group.length > 1 && !current.canShrink) {
733 | if (deltaY > 0 || deltaX > 0) {
734 | F.prev( deltaY > 0 ? 'down' : 'left' );
735 |
736 | } else if (deltaY < 0 || deltaX < 0) {
737 | F.next( deltaY < 0 ? 'up' : 'right' );
738 | }
739 |
740 | e.preventDefault();
741 | }
742 | }
743 | });
744 | }
745 | },
746 |
747 | trigger: function (event, o) {
748 | var ret, obj = o || F.coming || F.current;
749 |
750 | if (obj) {
751 | if ($.isFunction( obj[event] )) {
752 | ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1));
753 | }
754 |
755 | if (ret === false) {
756 | return false;
757 | }
758 |
759 | if (obj.helpers) {
760 | $.each(obj.helpers, function (helper, opts) {
761 | if (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) {
762 | F.helpers[helper][event]($.extend(true, {}, F.helpers[helper].defaults, opts), obj);
763 | }
764 | });
765 | }
766 | }
767 |
768 | D.trigger(event);
769 | },
770 |
771 | isImage: function (str) {
772 | return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i);
773 | },
774 |
775 | isSWF: function (str) {
776 | return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i);
777 | },
778 |
779 | _start: function (index) {
780 | var coming = {},
781 | obj,
782 | href,
783 | type,
784 | margin,
785 | padding;
786 |
787 | index = getScalar( index );
788 | obj = F.group[ index ] || null;
789 |
790 | if (!obj) {
791 | return false;
792 | }
793 |
794 | coming = $.extend(true, {}, F.opts, obj);
795 |
796 | // Convert margin and padding properties to array - top, right, bottom, left
797 | margin = coming.margin;
798 | padding = coming.padding;
799 |
800 | if ($.type(margin) === 'number') {
801 | coming.margin = [margin, margin, margin, margin];
802 | }
803 |
804 | if ($.type(padding) === 'number') {
805 | coming.padding = [padding, padding, padding, padding];
806 | }
807 |
808 | // 'modal' propery is just a shortcut
809 | if (coming.modal) {
810 | $.extend(true, coming, {
811 | closeBtn : false,
812 | closeClick : false,
813 | nextClick : false,
814 | arrows : false,
815 | mouseWheel : false,
816 | keys : null,
817 | helpers: {
818 | overlay : {
819 | closeClick : false
820 | }
821 | }
822 | });
823 | }
824 |
825 | // 'autoSize' property is a shortcut, too
826 | if (coming.autoSize) {
827 | coming.autoWidth = coming.autoHeight = true;
828 | }
829 |
830 | if (coming.width === 'auto') {
831 | coming.autoWidth = true;
832 | }
833 |
834 | if (coming.height === 'auto') {
835 | coming.autoHeight = true;
836 | }
837 |
838 | /*
839 | * Add reference to the group, so it`s possible to access from callbacks, example:
840 | * afterLoad : function() {
841 | * this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');
842 | * }
843 | */
844 |
845 | coming.group = F.group;
846 | coming.index = index;
847 |
848 | // Give a chance for callback or helpers to update coming item (type, title, etc)
849 | F.coming = coming;
850 |
851 | if (false === F.trigger('beforeLoad')) {
852 | F.coming = null;
853 |
854 | return;
855 | }
856 |
857 | type = coming.type;
858 | href = coming.href;
859 |
860 | if (!type) {
861 | F.coming = null;
862 |
863 | //If we can not determine content type then drop silently or display next/prev item if looping through gallery
864 | if (F.current && F.router && F.router !== 'jumpto') {
865 | F.current.index = index;
866 |
867 | return F[ F.router ]( F.direction );
868 | }
869 |
870 | return false;
871 | }
872 |
873 | F.isActive = true;
874 |
875 | if (type === 'image' || type === 'swf') {
876 | coming.autoHeight = coming.autoWidth = false;
877 | coming.scrolling = 'visible';
878 | }
879 |
880 | if (type === 'image') {
881 | coming.aspectRatio = true;
882 | }
883 |
884 | if (type === 'iframe' && isTouch) {
885 | coming.scrolling = 'scroll';
886 | }
887 |
888 | // Build the neccessary markup
889 | coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' );
890 |
891 | $.extend(coming, {
892 | skin : $('.fancybox-skin', coming.wrap),
893 | outer : $('.fancybox-outer', coming.wrap),
894 | inner : $('.fancybox-inner', coming.wrap)
895 | });
896 |
897 | $.each(["Top", "Right", "Bottom", "Left"], function(i, v) {
898 | coming.skin.css('padding' + v, getValue(coming.padding[ i ]));
899 | });
900 |
901 | F.trigger('onReady');
902 |
903 | // Check before try to load; 'inline' and 'html' types need content, others - href
904 | if (type === 'inline' || type === 'html') {
905 | if (!coming.content || !coming.content.length) {
906 | return F._error( 'content' );
907 | }
908 |
909 | } else if (!href) {
910 | return F._error( 'href' );
911 | }
912 |
913 | if (type === 'image') {
914 | F._loadImage();
915 |
916 | } else if (type === 'ajax') {
917 | F._loadAjax();
918 |
919 | } else if (type === 'iframe') {
920 | F._loadIframe();
921 |
922 | } else {
923 | F._afterLoad();
924 | }
925 | },
926 |
927 | _error: function ( type ) {
928 | $.extend(F.coming, {
929 | type : 'html',
930 | autoWidth : true,
931 | autoHeight : true,
932 | minWidth : 0,
933 | minHeight : 0,
934 | scrolling : 'no',
935 | hasError : type,
936 | content : F.coming.tpl.error
937 | });
938 |
939 | F._afterLoad();
940 | },
941 |
942 | _loadImage: function () {
943 | // Reset preload image so it is later possible to check "complete" property
944 | var img = F.imgPreload = new Image();
945 |
946 | img.onload = function () {
947 | this.onload = this.onerror = null;
948 |
949 | F.coming.width = this.width / F.opts.pixelRatio;
950 | F.coming.height = this.height / F.opts.pixelRatio;
951 |
952 | F._afterLoad();
953 | };
954 |
955 | img.onerror = function () {
956 | this.onload = this.onerror = null;
957 |
958 | F._error( 'image' );
959 | };
960 |
961 | img.src = F.coming.href;
962 |
963 | if (img.complete !== true) {
964 | F.showLoading();
965 | }
966 | },
967 |
968 | _loadAjax: function () {
969 | var coming = F.coming;
970 |
971 | F.showLoading();
972 |
973 | F.ajaxLoad = $.ajax($.extend({}, coming.ajax, {
974 | url: coming.href,
975 | error: function (jqXHR, textStatus) {
976 | if (F.coming && textStatus !== 'abort') {
977 | F._error( 'ajax', jqXHR );
978 |
979 | } else {
980 | F.hideLoading();
981 | }
982 | },
983 | success: function (data, textStatus) {
984 | if (textStatus === 'success') {
985 | coming.content = data;
986 |
987 | F._afterLoad();
988 | }
989 | }
990 | }));
991 | },
992 |
993 | _loadIframe: function() {
994 | var coming = F.coming,
995 | iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime()))
996 | .attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling)
997 | .attr('src', coming.href);
998 |
999 | // This helps IE
1000 | $(coming.wrap).bind('onReset', function () {
1001 | try {
1002 | $(this).find('iframe').hide().attr('src', '//about:blank').end().empty();
1003 | } catch (e) {}
1004 | });
1005 |
1006 | if (coming.iframe.preload) {
1007 | F.showLoading();
1008 |
1009 | iframe.one('load', function() {
1010 | $(this).data('ready', 1);
1011 |
1012 | // iOS will lose scrolling if we resize
1013 | if (!isTouch) {
1014 | $(this).bind('load.fb', F.update);
1015 | }
1016 |
1017 | // Without this trick:
1018 | // - iframe won't scroll on iOS devices
1019 | // - IE7 sometimes displays empty iframe
1020 | $(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show();
1021 |
1022 | F._afterLoad();
1023 | });
1024 | }
1025 |
1026 | coming.content = iframe.appendTo( coming.inner );
1027 |
1028 | if (!coming.iframe.preload) {
1029 | F._afterLoad();
1030 | }
1031 | },
1032 |
1033 | _preloadImages: function() {
1034 | var group = F.group,
1035 | current = F.current,
1036 | len = group.length,
1037 | cnt = current.preload ? Math.min(current.preload, len - 1) : 0,
1038 | item,
1039 | i;
1040 |
1041 | for (i = 1; i <= cnt; i += 1) {
1042 | item = group[ (current.index + i ) % len ];
1043 |
1044 | if (item.type === 'image' && item.href) {
1045 | new Image().src = item.href;
1046 | }
1047 | }
1048 | },
1049 |
1050 | _afterLoad: function () {
1051 | var coming = F.coming,
1052 | previous = F.current,
1053 | placeholder = 'fancybox-placeholder',
1054 | current,
1055 | content,
1056 | type,
1057 | scrolling,
1058 | href,
1059 | embed;
1060 |
1061 | F.hideLoading();
1062 |
1063 | if (!coming || F.isActive === false) {
1064 | return;
1065 | }
1066 |
1067 | if (false === F.trigger('afterLoad', coming, previous)) {
1068 | coming.wrap.stop(true).trigger('onReset').remove();
1069 |
1070 | F.coming = null;
1071 |
1072 | return;
1073 | }
1074 |
1075 | if (previous) {
1076 | F.trigger('beforeChange', previous);
1077 |
1078 | previous.wrap.stop(true).removeClass('fancybox-opened')
1079 | .find('.fancybox-item, .fancybox-nav')
1080 | .remove();
1081 | }
1082 |
1083 | F.unbindEvents();
1084 |
1085 | current = coming;
1086 | content = coming.content;
1087 | type = coming.type;
1088 | scrolling = coming.scrolling;
1089 |
1090 | $.extend(F, {
1091 | wrap : current.wrap,
1092 | skin : current.skin,
1093 | outer : current.outer,
1094 | inner : current.inner,
1095 | current : current,
1096 | previous : previous
1097 | });
1098 |
1099 | href = current.href;
1100 |
1101 | switch (type) {
1102 | case 'inline':
1103 | case 'ajax':
1104 | case 'html':
1105 | if (current.selector) {
1106 | content = $('').html(content).find(current.selector);
1107 |
1108 | } else if (isQuery(content)) {
1109 | if (!content.data(placeholder)) {
1110 | content.data(placeholder, $('
').insertAfter( content ).hide() );
1111 | }
1112 |
1113 | content = content.show().detach();
1114 |
1115 | current.wrap.bind('onReset', function () {
1116 | if ($(this).find(content).length) {
1117 | content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false);
1118 | }
1119 | });
1120 | }
1121 | break;
1122 |
1123 | case 'image':
1124 | content = current.tpl.image.replace(/\{href\}/g, href);
1125 | break;
1126 |
1127 | case 'swf':
1128 | content = '
';
1137 | break;
1138 | }
1139 |
1140 | if (!(isQuery(content) && content.parent().is(current.inner))) {
1141 | current.inner.append( content );
1142 | }
1143 |
1144 | // Give a chance for helpers or callbacks to update elements
1145 | F.trigger('beforeShow');
1146 |
1147 | // Set scrolling before calculating dimensions
1148 | current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling));
1149 |
1150 | // Set initial dimensions and start position
1151 | F._setDimension();
1152 |
1153 | F.reposition();
1154 |
1155 | F.isOpen = false;
1156 | F.coming = null;
1157 |
1158 | F.bindEvents();
1159 |
1160 | if (!F.isOpened) {
1161 | $('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove();
1162 |
1163 | } else if (previous.prevMethod) {
1164 | F.transitions[ previous.prevMethod ]();
1165 | }
1166 |
1167 | F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ]();
1168 |
1169 | F._preloadImages();
1170 | },
1171 |
1172 | _setDimension: function () {
1173 | var viewport = F.getViewport(),
1174 | steps = 0,
1175 | canShrink = false,
1176 | canExpand = false,
1177 | wrap = F.wrap,
1178 | skin = F.skin,
1179 | inner = F.inner,
1180 | current = F.current,
1181 | width = current.width,
1182 | height = current.height,
1183 | minWidth = current.minWidth,
1184 | minHeight = current.minHeight,
1185 | maxWidth = current.maxWidth,
1186 | maxHeight = current.maxHeight,
1187 | scrolling = current.scrolling,
1188 | scrollOut = current.scrollOutside ? current.scrollbarWidth : 0,
1189 | margin = current.margin,
1190 | wMargin = getScalar(margin[1] + margin[3]),
1191 | hMargin = getScalar(margin[0] + margin[2]),
1192 | wPadding,
1193 | hPadding,
1194 | wSpace,
1195 | hSpace,
1196 | origWidth,
1197 | origHeight,
1198 | origMaxWidth,
1199 | origMaxHeight,
1200 | ratio,
1201 | width_,
1202 | height_,
1203 | maxWidth_,
1204 | maxHeight_,
1205 | iframe,
1206 | body;
1207 |
1208 | // Reset dimensions so we could re-check actual size
1209 | wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp');
1210 |
1211 | wPadding = getScalar(skin.outerWidth(true) - skin.width());
1212 | hPadding = getScalar(skin.outerHeight(true) - skin.height());
1213 |
1214 | // Any space between content and viewport (margin, padding, border, title)
1215 | wSpace = wMargin + wPadding;
1216 | hSpace = hMargin + hPadding;
1217 |
1218 | origWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width;
1219 | origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height;
1220 |
1221 | if (current.type === 'iframe') {
1222 | iframe = current.content;
1223 |
1224 | if (current.autoHeight && iframe.data('ready') === 1) {
1225 | try {
1226 | if (iframe[0].contentWindow.document.location) {
1227 | inner.width( origWidth ).height(9999);
1228 |
1229 | body = iframe.contents().find('body');
1230 |
1231 | if (scrollOut) {
1232 | body.css('overflow-x', 'hidden');
1233 | }
1234 |
1235 | origHeight = body.outerHeight(true);
1236 | }
1237 |
1238 | } catch (e) {}
1239 | }
1240 |
1241 | } else if (current.autoWidth || current.autoHeight) {
1242 | inner.addClass( 'fancybox-tmp' );
1243 |
1244 | // Set width or height in case we need to calculate only one dimension
1245 | if (!current.autoWidth) {
1246 | inner.width( origWidth );
1247 | }
1248 |
1249 | if (!current.autoHeight) {
1250 | inner.height( origHeight );
1251 | }
1252 |
1253 | if (current.autoWidth) {
1254 | origWidth = inner.width();
1255 | }
1256 |
1257 | if (current.autoHeight) {
1258 | origHeight = inner.height();
1259 | }
1260 |
1261 | inner.removeClass( 'fancybox-tmp' );
1262 | }
1263 |
1264 | width = getScalar( origWidth );
1265 | height = getScalar( origHeight );
1266 |
1267 | ratio = origWidth / origHeight;
1268 |
1269 | // Calculations for the content
1270 | minWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth);
1271 | maxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth);
1272 |
1273 | minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight);
1274 | maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight);
1275 |
1276 | // These will be used to determine if wrap can fit in the viewport
1277 | origMaxWidth = maxWidth;
1278 | origMaxHeight = maxHeight;
1279 |
1280 | if (current.fitToView) {
1281 | maxWidth = Math.min(viewport.w - wSpace, maxWidth);
1282 | maxHeight = Math.min(viewport.h - hSpace, maxHeight);
1283 | }
1284 |
1285 | maxWidth_ = viewport.w - wMargin;
1286 | maxHeight_ = viewport.h - hMargin;
1287 |
1288 | if (current.aspectRatio) {
1289 | if (width > maxWidth) {
1290 | width = maxWidth;
1291 | height = getScalar(width / ratio);
1292 | }
1293 |
1294 | if (height > maxHeight) {
1295 | height = maxHeight;
1296 | width = getScalar(height * ratio);
1297 | }
1298 |
1299 | if (width < minWidth) {
1300 | width = minWidth;
1301 | height = getScalar(width / ratio);
1302 | }
1303 |
1304 | if (height < minHeight) {
1305 | height = minHeight;
1306 | width = getScalar(height * ratio);
1307 | }
1308 |
1309 | } else {
1310 | width = Math.max(minWidth, Math.min(width, maxWidth));
1311 |
1312 | if (current.autoHeight && current.type !== 'iframe') {
1313 | inner.width( width );
1314 |
1315 | height = inner.height();
1316 | }
1317 |
1318 | height = Math.max(minHeight, Math.min(height, maxHeight));
1319 | }
1320 |
1321 | // Try to fit inside viewport (including the title)
1322 | if (current.fitToView) {
1323 | inner.width( width ).height( height );
1324 |
1325 | wrap.width( width + wPadding );
1326 |
1327 | // Real wrap dimensions
1328 | width_ = wrap.width();
1329 | height_ = wrap.height();
1330 |
1331 | if (current.aspectRatio) {
1332 | while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) {
1333 | if (steps++ > 19) {
1334 | break;
1335 | }
1336 |
1337 | height = Math.max(minHeight, Math.min(maxHeight, height - 10));
1338 | width = getScalar(height * ratio);
1339 |
1340 | if (width < minWidth) {
1341 | width = minWidth;
1342 | height = getScalar(width / ratio);
1343 | }
1344 |
1345 | if (width > maxWidth) {
1346 | width = maxWidth;
1347 | height = getScalar(width / ratio);
1348 | }
1349 |
1350 | inner.width( width ).height( height );
1351 |
1352 | wrap.width( width + wPadding );
1353 |
1354 | width_ = wrap.width();
1355 | height_ = wrap.height();
1356 | }
1357 |
1358 | } else {
1359 | width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_)));
1360 | height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_)));
1361 | }
1362 | }
1363 |
1364 | if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) {
1365 | width += scrollOut;
1366 | }
1367 |
1368 | inner.width( width ).height( height );
1369 |
1370 | wrap.width( width + wPadding );
1371 |
1372 | width_ = wrap.width();
1373 | height_ = wrap.height();
1374 |
1375 | canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight;
1376 | canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight));
1377 |
1378 | $.extend(current, {
1379 | dim : {
1380 | width : getValue( width_ ),
1381 | height : getValue( height_ )
1382 | },
1383 | origWidth : origWidth,
1384 | origHeight : origHeight,
1385 | canShrink : canShrink,
1386 | canExpand : canExpand,
1387 | wPadding : wPadding,
1388 | hPadding : hPadding,
1389 | wrapSpace : height_ - skin.outerHeight(true),
1390 | skinSpace : skin.height() - height
1391 | });
1392 |
1393 | if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) {
1394 | inner.height('auto');
1395 | }
1396 | },
1397 |
1398 | _getPosition: function (onlyAbsolute) {
1399 | var current = F.current,
1400 | viewport = F.getViewport(),
1401 | margin = current.margin,
1402 | width = F.wrap.width() + margin[1] + margin[3],
1403 | height = F.wrap.height() + margin[0] + margin[2],
1404 | rez = {
1405 | position: 'absolute',
1406 | top : margin[0],
1407 | left : margin[3]
1408 | };
1409 |
1410 | if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) {
1411 | rez.position = 'fixed';
1412 |
1413 | } else if (!current.locked) {
1414 | rez.top += viewport.y;
1415 | rez.left += viewport.x;
1416 | }
1417 |
1418 | rez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio)));
1419 | rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * current.leftRatio)));
1420 |
1421 | return rez;
1422 | },
1423 |
1424 | _afterZoomIn: function () {
1425 | var current = F.current;
1426 |
1427 | if (!current) {
1428 | return;
1429 | }
1430 |
1431 | F.isOpen = F.isOpened = true;
1432 |
1433 | F.wrap.css('overflow', 'visible').addClass('fancybox-opened').hide().show(0);
1434 |
1435 | F.update();
1436 |
1437 | // Assign a click event
1438 | if ( current.closeClick || (current.nextClick && F.group.length > 1) ) {
1439 | F.inner.css('cursor', 'pointer').bind('click.fb', function(e) {
1440 | if (!$(e.target).is('a') && !$(e.target).parent().is('a')) {
1441 | e.preventDefault();
1442 |
1443 | F[ current.closeClick ? 'close' : 'next' ]();
1444 | }
1445 | });
1446 | }
1447 |
1448 | // Create a close button
1449 | if (current.closeBtn) {
1450 | $(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) {
1451 | e.preventDefault();
1452 |
1453 | F.close();
1454 | });
1455 | }
1456 |
1457 | // Create navigation arrows
1458 | if (current.arrows && F.group.length > 1) {
1459 | if (current.loop || current.index > 0) {
1460 | $(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev);
1461 | }
1462 |
1463 | if (current.loop || current.index < F.group.length - 1) {
1464 | $(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next);
1465 | }
1466 | }
1467 |
1468 | F.trigger('afterShow');
1469 |
1470 | // Stop the slideshow if this is the last item
1471 | if (!current.loop && current.index === current.group.length - 1) {
1472 |
1473 | F.play( false );
1474 |
1475 | } else if (F.opts.autoPlay && !F.player.isActive) {
1476 | F.opts.autoPlay = false;
1477 |
1478 | F.play(true);
1479 | }
1480 | },
1481 |
1482 | _afterZoomOut: function ( obj ) {
1483 | obj = obj || F.current;
1484 |
1485 | $('.fancybox-wrap').trigger('onReset').remove();
1486 |
1487 | $.extend(F, {
1488 | group : {},
1489 | opts : {},
1490 | router : false,
1491 | current : null,
1492 | isActive : false,
1493 | isOpened : false,
1494 | isOpen : false,
1495 | isClosing : false,
1496 | wrap : null,
1497 | skin : null,
1498 | outer : null,
1499 | inner : null
1500 | });
1501 |
1502 | F.trigger('afterClose', obj);
1503 | }
1504 | });
1505 |
1506 | /*
1507 | * Default transitions
1508 | */
1509 |
1510 | F.transitions = {
1511 | getOrigPosition: function () {
1512 | var current = F.current,
1513 | element = current.element,
1514 | orig = current.orig,
1515 | pos = {},
1516 | width = 50,
1517 | height = 50,
1518 | hPadding = current.hPadding,
1519 | wPadding = current.wPadding,
1520 | viewport = F.getViewport();
1521 |
1522 | if (!orig && current.isDom && element.is(':visible')) {
1523 | orig = element.find('img:first');
1524 |
1525 | if (!orig.length) {
1526 | orig = element;
1527 | }
1528 | }
1529 |
1530 | if (isQuery(orig)) {
1531 | pos = orig.offset();
1532 |
1533 | if (orig.is('img')) {
1534 | width = orig.outerWidth();
1535 | height = orig.outerHeight();
1536 | }
1537 |
1538 | } else {
1539 | pos.top = viewport.y + (viewport.h - height) * current.topRatio;
1540 | pos.left = viewport.x + (viewport.w - width) * current.leftRatio;
1541 | }
1542 |
1543 | if (F.wrap.css('position') === 'fixed' || current.locked) {
1544 | pos.top -= viewport.y;
1545 | pos.left -= viewport.x;
1546 | }
1547 |
1548 | pos = {
1549 | top : getValue(pos.top - hPadding * current.topRatio),
1550 | left : getValue(pos.left - wPadding * current.leftRatio),
1551 | width : getValue(width + wPadding),
1552 | height : getValue(height + hPadding)
1553 | };
1554 |
1555 | return pos;
1556 | },
1557 |
1558 | step: function (now, fx) {
1559 | var ratio,
1560 | padding,
1561 | value,
1562 | prop = fx.prop,
1563 | current = F.current,
1564 | wrapSpace = current.wrapSpace,
1565 | skinSpace = current.skinSpace;
1566 |
1567 | if (prop === 'width' || prop === 'height') {
1568 | ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start);
1569 |
1570 | if (F.isClosing) {
1571 | ratio = 1 - ratio;
1572 | }
1573 |
1574 | padding = prop === 'width' ? current.wPadding : current.hPadding;
1575 | value = now - padding;
1576 |
1577 | F.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) );
1578 | F.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) );
1579 | }
1580 | },
1581 |
1582 | zoomIn: function () {
1583 | var current = F.current,
1584 | startPos = current.pos,
1585 | effect = current.openEffect,
1586 | elastic = effect === 'elastic',
1587 | endPos = $.extend({opacity : 1}, startPos);
1588 |
1589 | // Remove "position" property that breaks older IE
1590 | delete endPos.position;
1591 |
1592 | if (elastic) {
1593 | startPos = this.getOrigPosition();
1594 |
1595 | if (current.openOpacity) {
1596 | startPos.opacity = 0.1;
1597 | }
1598 |
1599 | } else if (effect === 'fade') {
1600 | startPos.opacity = 0.1;
1601 | }
1602 |
1603 | F.wrap.css(startPos).animate(endPos, {
1604 | duration : effect === 'none' ? 0 : current.openSpeed,
1605 | easing : current.openEasing,
1606 | step : elastic ? this.step : null,
1607 | complete : F._afterZoomIn
1608 | });
1609 | },
1610 |
1611 | zoomOut: function () {
1612 | var current = F.current,
1613 | effect = current.closeEffect,
1614 | elastic = effect === 'elastic',
1615 | endPos = {opacity : 0.1};
1616 |
1617 | if (elastic) {
1618 | endPos = this.getOrigPosition();
1619 |
1620 | if (current.closeOpacity) {
1621 | endPos.opacity = 0.1;
1622 | }
1623 | }
1624 |
1625 | F.wrap.animate(endPos, {
1626 | duration : effect === 'none' ? 0 : current.closeSpeed,
1627 | easing : current.closeEasing,
1628 | step : elastic ? this.step : null,
1629 | complete : F._afterZoomOut
1630 | });
1631 | },
1632 |
1633 | changeIn: function () {
1634 | var current = F.current,
1635 | effect = current.nextEffect,
1636 | startPos = current.pos,
1637 | endPos = { opacity : 1 },
1638 | direction = F.direction,
1639 | distance = 200,
1640 | field;
1641 |
1642 | startPos.opacity = 0.1;
1643 |
1644 | if (effect === 'elastic') {
1645 | field = direction === 'down' || direction === 'up' ? 'top' : 'left';
1646 |
1647 | if (direction === 'down' || direction === 'right') {
1648 | startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance);
1649 | endPos[ field ] = '+=' + distance + 'px';
1650 |
1651 | } else {
1652 | startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance);
1653 | endPos[ field ] = '-=' + distance + 'px';
1654 | }
1655 | }
1656 |
1657 | // Workaround for http://bugs.jquery.com/ticket/12273
1658 | if (effect === 'none') {
1659 | F._afterZoomIn();
1660 |
1661 | } else {
1662 | F.wrap.css(startPos).animate(endPos, {
1663 | duration : current.nextSpeed,
1664 | easing : current.nextEasing,
1665 | complete : F._afterZoomIn
1666 | });
1667 | }
1668 | },
1669 |
1670 | changeOut: function () {
1671 | var previous = F.previous,
1672 | effect = previous.prevEffect,
1673 | endPos = { opacity : 0.1 },
1674 | direction = F.direction,
1675 | distance = 200;
1676 |
1677 | if (effect === 'elastic') {
1678 | endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px';
1679 | }
1680 |
1681 | previous.wrap.animate(endPos, {
1682 | duration : effect === 'none' ? 0 : previous.prevSpeed,
1683 | easing : previous.prevEasing,
1684 | complete : function () {
1685 | $(this).trigger('onReset').remove();
1686 | }
1687 | });
1688 | }
1689 | };
1690 |
1691 | /*
1692 | * Overlay helper
1693 | */
1694 |
1695 | F.helpers.overlay = {
1696 | defaults : {
1697 | closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay
1698 | speedOut : 200, // duration of fadeOut animation
1699 | showEarly : true, // indicates if should be opened immediately or wait until the content is ready
1700 | css : {}, // custom CSS properties
1701 | locked : !isTouch, // if true, the content will be locked into overlay
1702 | fixed : true // if false, the overlay CSS position property will not be set to "fixed"
1703 | },
1704 |
1705 | overlay : null, // current handle
1706 | fixed : false, // indicates if the overlay has position "fixed"
1707 | el : $('html'), // element that contains "the lock"
1708 |
1709 | // Public methods
1710 | create : function(opts) {
1711 | var parent;
1712 |
1713 | opts = $.extend({}, this.defaults, opts);
1714 |
1715 | if (this.overlay) {
1716 | this.close();
1717 | }
1718 |
1719 | parent = F.coming ? F.coming.parent : opts.parent;
1720 |
1721 | this.overlay = $('
').appendTo( parent && parent.lenth ? parent : 'body' );
1722 | this.fixed = false;
1723 |
1724 | if (opts.fixed && F.defaults.fixed) {
1725 | this.overlay.addClass('fancybox-overlay-fixed');
1726 |
1727 | this.fixed = true;
1728 | }
1729 | },
1730 |
1731 | open : function(opts) {
1732 | var that = this;
1733 |
1734 | opts = $.extend({}, this.defaults, opts);
1735 |
1736 | if (this.overlay) {
1737 | this.overlay.unbind('.overlay').width('auto').height('auto');
1738 |
1739 | } else {
1740 | this.create(opts);
1741 | }
1742 |
1743 | if (!this.fixed) {
1744 | W.bind('resize.overlay', $.proxy( this.update, this) );
1745 |
1746 | this.update();
1747 | }
1748 |
1749 | if (opts.closeClick) {
1750 | this.overlay.bind('click.overlay', function(e) {
1751 | if ($(e.target).hasClass('fancybox-overlay')) {
1752 | if (F.isActive) {
1753 | F.close();
1754 | } else {
1755 | that.close();
1756 | }
1757 |
1758 | return false;
1759 | }
1760 | });
1761 | }
1762 |
1763 | this.overlay.css( opts.css ).show();
1764 | },
1765 |
1766 | close : function() {
1767 | W.unbind('resize.overlay');
1768 |
1769 | if (this.el.hasClass('fancybox-lock')) {
1770 | $('.fancybox-margin').removeClass('fancybox-margin');
1771 |
1772 | this.el.removeClass('fancybox-lock');
1773 |
1774 | W.scrollTop( this.scrollV ).scrollLeft( this.scrollH );
1775 | }
1776 |
1777 | $('.fancybox-overlay').remove().hide();
1778 |
1779 | $.extend(this, {
1780 | overlay : null,
1781 | fixed : false
1782 | });
1783 | },
1784 |
1785 | // Private, callbacks
1786 |
1787 | update : function () {
1788 | var width = '100%', offsetWidth;
1789 |
1790 | // Reset width/height so it will not mess
1791 | this.overlay.width(width).height('100%');
1792 |
1793 | // jQuery does not return reliable result for IE
1794 | if (IE) {
1795 | offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth);
1796 |
1797 | if (D.width() > offsetWidth) {
1798 | width = D.width();
1799 | }
1800 |
1801 | } else if (D.width() > W.width()) {
1802 | width = D.width();
1803 | }
1804 |
1805 | this.overlay.width(width).height(D.height());
1806 | },
1807 |
1808 | // This is where we can manipulate DOM, because later it would cause iframes to reload
1809 | onReady : function (opts, obj) {
1810 | var overlay = this.overlay;
1811 |
1812 | $('.fancybox-overlay').stop(true, true);
1813 |
1814 | if (!overlay) {
1815 | this.create(opts);
1816 | }
1817 |
1818 | if (opts.locked && this.fixed && obj.fixed) {
1819 | obj.locked = this.overlay.append( obj.wrap );
1820 | obj.fixed = false;
1821 | }
1822 |
1823 | if (opts.showEarly === true) {
1824 | this.beforeShow.apply(this, arguments);
1825 | }
1826 | },
1827 |
1828 | beforeShow : function(opts, obj) {
1829 | if (obj.locked && !this.el.hasClass('fancybox-lock')) {
1830 | if (this.fixPosition !== false) {
1831 | $('*').filter(function(){
1832 | return ($(this).css('position') === 'fixed' && !$(this).hasClass("fancybox-overlay") && !$(this).hasClass("fancybox-wrap") );
1833 | }).addClass('fancybox-margin');
1834 | }
1835 |
1836 | this.el.addClass('fancybox-margin');
1837 |
1838 | this.scrollV = W.scrollTop();
1839 | this.scrollH = W.scrollLeft();
1840 |
1841 | this.el.addClass('fancybox-lock');
1842 |
1843 | W.scrollTop( this.scrollV ).scrollLeft( this.scrollH );
1844 | }
1845 |
1846 | this.open(opts);
1847 | },
1848 |
1849 | onUpdate : function() {
1850 | if (!this.fixed) {
1851 | this.update();
1852 | }
1853 | },
1854 |
1855 | afterClose: function (opts) {
1856 | // Remove overlay if exists and fancyBox is not opening
1857 | // (e.g., it is not being open using afterClose callback)
1858 | if (this.overlay && !F.coming) {
1859 | this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this ));
1860 | }
1861 | }
1862 | };
1863 |
1864 | /*
1865 | * Title helper
1866 | */
1867 |
1868 | F.helpers.title = {
1869 | defaults : {
1870 | type : 'float', // 'float', 'inside', 'outside' or 'over',
1871 | position : 'bottom' // 'top' or 'bottom'
1872 | },
1873 |
1874 | beforeShow: function (opts) {
1875 | var current = F.current,
1876 | text = current.title,
1877 | type = opts.type,
1878 | title,
1879 | target;
1880 |
1881 | if ($.isFunction(text)) {
1882 | text = text.call(current.element, current);
1883 | }
1884 |
1885 | if (!isString(text) || $.trim(text) === '') {
1886 | return;
1887 | }
1888 |
1889 | title = $('
' + text + '
');
1890 |
1891 | switch (type) {
1892 | case 'inside':
1893 | target = F.skin;
1894 | break;
1895 |
1896 | case 'outside':
1897 | target = F.wrap;
1898 | break;
1899 |
1900 | case 'over':
1901 | target = F.inner;
1902 | break;
1903 |
1904 | default: // 'float'
1905 | target = F.skin;
1906 |
1907 | title.appendTo('body');
1908 |
1909 | if (IE) {
1910 | title.width( title.width() );
1911 | }
1912 |
1913 | title.wrapInner('
');
1914 |
1915 | //Increase bottom margin so this title will also fit into viewport
1916 | F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) );
1917 | break;
1918 | }
1919 |
1920 | title[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target);
1921 | }
1922 | };
1923 |
1924 | // jQuery plugin initialization
1925 | $.fn.fancybox = function (options) {
1926 | var index,
1927 | that = $(this),
1928 | selector = this.selector || '',
1929 | run = function(e) {
1930 | var what = $(this).blur(), idx = index, relType, relVal;
1931 |
1932 | if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) {
1933 | relType = options.groupAttr || 'data-fancybox-group';
1934 | relVal = what.attr(relType);
1935 |
1936 | if (!relVal) {
1937 | relType = 'rel';
1938 | relVal = what.get(0)[ relType ];
1939 | }
1940 |
1941 | if (relVal && relVal !== '' && relVal !== 'nofollow') {
1942 | what = selector.length ? $(selector) : that;
1943 | what = what.filter('[' + relType + '="' + relVal + '"]');
1944 | idx = what.index(this);
1945 | }
1946 |
1947 | options.index = idx;
1948 |
1949 | // Stop an event from bubbling if everything is fine
1950 | if (F.open(what, options) !== false) {
1951 | e.preventDefault();
1952 | }
1953 | }
1954 | };
1955 |
1956 | options = options || {};
1957 | index = options.index || 0;
1958 |
1959 | if (!selector || options.live === false) {
1960 | that.unbind('click.fb-start').bind('click.fb-start', run);
1961 |
1962 | } else {
1963 | D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run);
1964 | }
1965 |
1966 | this.filter('[data-fancybox-start=1]').trigger('click');
1967 |
1968 | return this;
1969 | };
1970 |
1971 | // Tests that need a body at doc ready
1972 | D.ready(function() {
1973 | var w1, w2;
1974 |
1975 | if ( $.scrollbarWidth === undefined ) {
1976 | // http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth
1977 | $.scrollbarWidth = function() {
1978 | var parent = $('
').appendTo('body'),
1979 | child = parent.children(),
1980 | width = child.innerWidth() - child.height( 99 ).innerWidth();
1981 |
1982 | parent.remove();
1983 |
1984 | return width;
1985 | };
1986 | }
1987 |
1988 | if ( $.support.fixedPosition === undefined ) {
1989 | $.support.fixedPosition = (function() {
1990 | var elem = $('
').appendTo('body'),
1991 | fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 );
1992 |
1993 | elem.remove();
1994 |
1995 | return fixed;
1996 | }());
1997 | }
1998 |
1999 | $.extend(F.defaults, {
2000 | scrollbarWidth : $.scrollbarWidth(),
2001 | fixed : $.support.fixedPosition,
2002 | parent : $('body')
2003 | });
2004 |
2005 | //Get real width of page scroll-bar
2006 | w1 = $(window).width();
2007 |
2008 | H.addClass('fancybox-lock-test');
2009 |
2010 | w2 = $(window).width();
2011 |
2012 | H.removeClass('fancybox-lock-test');
2013 |
2014 | $("").appendTo("head");
2015 | });
2016 |
2017 | }(window, document, jQuery));
--------------------------------------------------------------------------------
/source/fancybox/jquery.fancybox.pack.js:
--------------------------------------------------------------------------------
1 | /*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
2 | (function(s,H,f,w){var K=f("html"),q=f(s),p=f(H),b=f.fancybox=function(){b.open.apply(this,arguments)},J=navigator.userAgent.match(/msie/i),C=null,t=H.createTouch!==w,u=function(a){return a&&a.hasOwnProperty&&a instanceof f},r=function(a){return a&&"string"===f.type(a)},F=function(a){return r(a)&&0
',image:'
',iframe:'",error:'The requested content cannot be loaded.
Please try again later.
',closeBtn:'',next:'',prev:''},openEffect:"fade",openSpeed:250,openEasing:"swing",openOpacity:!0,
6 | openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null,isActive:!1,
7 | isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=u(a)?f(a).get():[a]),f.each(a,function(e,c){var l={},g,h,k,n,m;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),u(c)?(l={href:c.data("fancybox-href")||c.attr("href"),title:f("").text(c.data("fancybox-title")||c.attr("title")).html(),isDom:!0,element:c},
8 | f.metadata&&f.extend(!0,l,c.metadata())):l=c);g=d.href||l.href||(r(c)?c:null);h=d.title!==w?d.title:l.title||"";n=(k=d.content||l.content)?"html":d.type||l.type;!n&&l.isDom&&(n=c.data("fancybox-type"),n||(n=(n=c.prop("class").match(/fancybox\.(\w+)/))?n[1]:null));r(g)&&(n||(b.isImage(g)?n="image":b.isSWF(g)?n="swf":"#"===g.charAt(0)?n="inline":r(c)&&(n="html",k=c)),"ajax"===n&&(m=g.split(/\s+/,2),g=m.shift(),m=m.shift()));k||("inline"===n?g?k=f(r(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):l.isDom&&(k=c):
9 | "html"===n?k=g:n||g||!l.isDom||(n="inline",k=c));f.extend(l,{href:g,type:n,content:k,title:h,selector:m});a[e]=l}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==w&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1===b.trigger("onCancel")||(b.hideLoading(),a&&(b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),
10 | b.coming=null,b.current||b._afterZoomOut(a)))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(b.isOpen&&!0!==a?(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]()):(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&
11 | (b.player.timer=setTimeout(b.next,b.current.playSpeed))},c=function(){d();p.unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};!0===a||!b.player.isActive&&!1!==a?b.current&&(b.current.loop||b.current.index=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==w&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,l;c&&(l=b._getPosition(d),a&&"scroll"===a.type?(delete l.position,c.stop(!0,!0).animate(l,200)):(c.css(l),e.pos=f.extend({},e.dim,l)))},
13 | update:function(a){var d=a&&a.originalEvent&&a.originalEvent.type,e=!d||"orientationchange"===d;e&&(clearTimeout(C),C=null);b.isOpen&&!C&&(C=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),C=null)},e&&!t?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,t&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"),
14 | b.trigger("onUpdate")),b.update())},hideLoading:function(){p.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('').click(b.cancel).appendTo("body");p.bind("keydown.loading",function(a){27===(a.which||a.keyCode)&&(a.preventDefault(),b.cancel())});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}));b.trigger("onLoading")},getViewport:function(){var a=b.current&&
15 | b.current.locked||!1,d={x:q.scrollLeft(),y:q.scrollTop()};a&&a.length?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=t&&s.innerWidth?s.innerWidth:q.width(),d.h=t&&s.innerHeight?s.innerHeight:q.height());return d},unbindEvents:function(){b.wrap&&u(b.wrap)&&b.wrap.unbind(".fb");p.unbind(".fb");q.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(q.bind("orientationchange.fb"+(t?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&p.bind("keydown.fb",function(e){var c=
16 | e.which||e.keyCode,l=e.target||e.srcElement;if(27===c&&b.coming)return!1;e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||l&&(l.type||f(l).is("[contenteditable]"))||f.each(d,function(d,l){if(1h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();0!==c&&!k&&1g||0>l)&&b.next(0>g?"up":"right"),d.preventDefault())}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d,e){if(e&&
18 | b.helpers[d]&&f.isFunction(b.helpers[d][a]))b.helpers[d][a](f.extend(!0,{},b.helpers[d].defaults,e),c)})}p.trigger(a)},isImage:function(a){return r(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)},isSWF:function(a){return r(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c;a=m(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&&(d.padding=[c,c,
19 | c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive=!0;if("image"===
20 | c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=!0);"iframe"===c&&t&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(t?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,x(d.padding[a]))});b.trigger("onReady");
21 | if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width=
22 | this.width/b.opts.pixelRatio;b.coming.height=this.height/b.opts.pixelRatio;b._afterLoad()};a.onerror=function(){this.onload=this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,
23 | d=f(a.tpl.iframe.replace(/\{rnd\}/g,(new Date).getTime())).attr("scrolling",t?"auto":a.iframe.scrolling).attr("src",a.href);f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);t||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||
24 | b._afterLoad()},_preloadImages:function(){var a=b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,l,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());
25 | b.unbindEvents();e=a.content;c=a.type;l=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("").html(e).find(a.selector):u(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('
').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder",
26 | !1)}));break;case "image":e=a.tpl.image.replace(/\{href\}/g,g);break;case "swf":e='
"}u(e)&&e.parent().is(a.inner)||a.inner.append(e);b.trigger("beforeShow");
27 | a.inner.css("overflow","yes"===l?"scroll":"no"===l?"hidden":l);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(!b.isOpened)f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();else if(d.prevMethod)b.transitions[d.prevMethod]();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,l=b.skin,g=b.inner,h=b.current,c=h.width,k=h.height,n=h.minWidth,v=h.minHeight,p=h.maxWidth,
28 | q=h.maxHeight,t=h.scrolling,r=h.scrollOutside?h.scrollbarWidth:0,y=h.margin,z=m(y[1]+y[3]),s=m(y[0]+y[2]),w,A,u,D,B,G,C,E,I;e.add(l).add(g).width("auto").height("auto").removeClass("fancybox-tmp");y=m(l.outerWidth(!0)-l.width());w=m(l.outerHeight(!0)-l.height());A=z+y;u=s+w;D=F(c)?(a.w-A)*m(c)/100:c;B=F(k)?(a.h-u)*m(k)/100:k;if("iframe"===h.type){if(I=h.content,h.autoHeight&&1===I.data("ready"))try{I[0].contentWindow.document.location&&(g.width(D).height(9999),G=I.contents().find("body"),r&&G.css("overflow-x",
29 | "hidden"),B=G.outerHeight(!0))}catch(H){}}else if(h.autoWidth||h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(D),h.autoHeight||g.height(B),h.autoWidth&&(D=g.width()),h.autoHeight&&(B=g.height()),g.removeClass("fancybox-tmp");c=m(D);k=m(B);E=D/B;n=m(F(n)?m(n,"w")-A:n);p=m(F(p)?m(p,"w")-A:p);v=m(F(v)?m(v,"h")-u:v);q=m(F(q)?m(q,"h")-u:q);G=p;C=q;h.fitToView&&(p=Math.min(a.w-A,p),q=Math.min(a.h-u,q));A=a.w-z;s=a.h-s;h.aspectRatio?(c>p&&(c=p,k=m(c/E)),k>q&&(k=q,c=m(k*E)),c
A||z>s)&&c>n&&k>v&&!(19p&&(c=p,k=m(c/E)),g.width(c).height(k),e.width(c+y),a=e.width(),z=e.height();else c=Math.max(n,Math.min(c,c-(a-A))),k=Math.max(v,Math.min(k,k-(z-s)));r&&"auto"===t&&kA||z>s)&&c>n&&k>v;c=h.aspectRatio?cv&&k ').appendTo(d&&d.lenth?d:"body");this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this;a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(q.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",
40 | function(a){if(f(a.target).hasClass("fancybox-overlay"))return b.isActive?b.close():d.close(),!1});this.overlay.css(a.css).show()},close:function(){q.unbind("resize.overlay");this.el.hasClass("fancybox-lock")&&(f(".fancybox-margin").removeClass("fancybox-margin"),this.el.removeClass("fancybox-lock"),q.scrollTop(this.scrollV).scrollLeft(this.scrollH));f(".fancybox-overlay").remove().hide();f.extend(this,{overlay:null,fixed:!1})},update:function(){var a="100%",b;this.overlay.width(a).height("100%");
41 | J?(b=Math.max(H.documentElement.offsetWidth,H.body.offsetWidth),p.width()>b&&(a=p.width())):p.width()>q.width()&&(a=p.width());this.overlay.width(a).height(p.height())},onReady:function(a,b){var e=this.overlay;f(".fancybox-overlay").stop(!0,!0);e||this.create(a);a.locked&&this.fixed&&b.fixed&&(b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){b.locked&&!this.el.hasClass("fancybox-lock")&&(!1!==this.fixPosition&&f("*").filter(function(){return"fixed"===
42 | f(this).css("position")&&!f(this).hasClass("fancybox-overlay")&&!f(this).hasClass("fancybox-wrap")}).addClass("fancybox-margin"),this.el.addClass("fancybox-margin"),this.scrollV=q.scrollTop(),this.scrollH=q.scrollLeft(),this.el.addClass("fancybox-lock"),q.scrollTop(this.scrollV).scrollLeft(this.scrollH));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.coming&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",
43 | position:"bottom"},beforeShow:function(a){var d=b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(r(e)&&""!==f.trim(e)){d=f(''+e+"
");switch(c){case "inside":c=b.skin;break;case "outside":c=b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),J&&d.width(d.width()),d.wrapInner(''),b.current.margin[2]+=Math.abs(m(d.css("margin-bottom")))}d["top"===a.position?"prependTo":
44 | "appendTo"](c)}}};f.fn.fancybox=function(a){var d,e=f(this),c=this.selector||"",l=function(g){var h=f(this).blur(),k=d,l,m;g.ctrlKey||g.altKey||g.shiftKey||g.metaKey||h.is(".fancybox-wrap")||(l=a.groupAttr||"data-fancybox-group",m=h.attr(l),m||(l="rel",m=h.get(0)[l]),m&&""!==m&&"nofollow"!==m&&(h=c.length?f(c):e,h=h.filter("["+l+'="'+m+'"]'),k=h.index(this)),a.index=k,!1!==b.open(h,a)&&g.preventDefault())};a=a||{};d=a.index||0;c&&!1!==a.live?p.undelegate(c,"click.fb-start").delegate(c+":not('.fancybox-item, .fancybox-nav')",
45 | "click.fb-start",l):e.unbind("click.fb-start").bind("click.fb-start",l);this.filter("[data-fancybox-start=1]").trigger("click");return this};p.ready(function(){var a,d;f.scrollbarWidth===w&&(f.scrollbarWidth=function(){var a=f('').appendTo("body"),b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});f.support.fixedPosition===w&&(f.support.fixedPosition=function(){var a=f('').appendTo("body"),
46 | b=20===a[0].offsetTop||15===a[0].offsetTop;a.remove();return b}());f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")});a=f(s).width();K.addClass("fancybox-lock-test");d=f(s).width();K.removeClass("fancybox-lock-test");f("").appendTo("head")})})(window,document,jQuery);
--------------------------------------------------------------------------------
/source/images/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gary-Shen/hexo-theme-bear/e8c6ded927488e749199edf204431a2bb49bb26c/source/images/avatar.png
--------------------------------------------------------------------------------
/source/images/check.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
15 |
--------------------------------------------------------------------------------
/source/images/socials/email.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/source/images/socials/facebook.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/source/images/socials/flickr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/source/images/socials/github.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/source/images/socials/google.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/source/images/socials/instagram.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/source/images/socials/wechat.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/source/images/socials/weibo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/source/script/index.js:
--------------------------------------------------------------------------------
1 | (function($){
2 | $('.article').each(function(i){
3 | $(this).find('img').each(function(){
4 | if ($(this).parent().hasClass('fancybox')) return;
5 |
6 | var alt = this.alt;
7 |
8 | if (alt) $(this).after('' + alt + '');
9 |
10 | $(this).wrap('');
11 | });
12 |
13 | $(this).find('.fancybox').each(function(){
14 | $(this).attr('rel', 'article' + i);
15 | });
16 | });
17 |
18 | if ($.fancybox){
19 | $('.fancybox').fancybox();
20 | }
21 |
22 | // Change ol\ul list style
23 | $('.article ul, .article ol').each(function (i, elem) {
24 | $(elem).find('li').each(function(index, li) {
25 | var $li = $(li);
26 |
27 | if (!$li.children().hasClass('li-inner')) {
28 | $li.wrapInner('');
29 | }
30 | });
31 | });
32 |
33 | $('.article input[type="checkbox"]').each(function (i, elem) {
34 | var $elem = $(elem);
35 | var checked = elem.checked;
36 | var dom = '';
37 |
38 | if (!$elem.parent().hasClass('checkbox-wrap')) {
39 | var $parent = $elem.parent().parent();
40 | var text = $parent.text();
41 |
42 | $parent.html(dom + '' + text + '');
43 | }
44 | });
45 |
46 | // Avatar
47 | var $mask = $('.about-me-mask');
48 | $('.avatar').on('click', function () {
49 | if (!$mask.hasClass('open')) {
50 | $mask.addClass('open');
51 | }
52 | });
53 |
54 | $mask.on('click', function (e) {
55 | if (e.target.classList.contains('about-me-mask')) {
56 | $mask.removeClass('open');
57 | }
58 | });
59 |
60 | // Back to top
61 | var $backToTop = $('#backToTop');
62 | $(document).on('scroll', function () {
63 | var sX = $(document).scrollTop();
64 | if (sX > 100) {
65 | $backToTop.addClass('show');
66 | }
67 |
68 | if (sX <= 100) {
69 | $backToTop.removeClass('show');
70 | }
71 | });
72 |
73 | $backToTop.on('click', function () {
74 | $('html, body').animate({
75 | scrollTop: 0
76 | }, 300);
77 | });
78 |
79 | })(jQuery);
80 |
--------------------------------------------------------------------------------
/source/script/post.js:
--------------------------------------------------------------------------------
1 | (function($){
2 | var $header = $('#header');
3 | if (window.innerWidth < 480 && !$header.hasClass('slide-hide')) {
4 | $header.addClass('slide-hide');
5 | }
6 | })(jQuery);
7 |
--------------------------------------------------------------------------------
/source/styles/_extend.styl:
--------------------------------------------------------------------------------
1 |
2 | hr
3 | border: 1px dashed color-border
4 | strong
5 | font-weight: bold
6 |
7 | sup, sub
8 | font-size: 0.75em
9 | line-height: 0
10 | position: relative
11 | vertical-align: baseline
12 | sup
13 | top: -0.5em
14 | sub
15 | bottom: -0.2em
16 | small
17 | font-size: 0.85em
18 | acronym, abbr
19 | border-bottom: 1px dotted
20 | ul, ol, dl
21 | margin: 0 20px
22 | ul, ol
23 | ul, ol
24 | margin-top: 0
25 | margin-bottom: 0
26 | ul
27 | list-style: disc
28 | ol
29 | list-style: decimal
30 | dt
31 | font-weight: bold
--------------------------------------------------------------------------------
/source/styles/_partial/aboutme.styl:
--------------------------------------------------------------------------------
1 | .about-me-mask
2 | position fixed
3 | background-color rgba(255, 255, 255, 0.48)
4 | top 0
5 | right 0
6 | bottom 0
7 | left 0
8 | height 100%
9 | z-index 1000
10 |
11 | display none
12 |
13 | &.open
14 | display block
15 |
16 | .about-me-wrap
17 | display flex
18 | flex-direction column
19 | justify-content center
20 | align-items center
21 | width 30rem
22 | margin 10rem auto
23 | padding gutter-size * 2 0
24 | box-sizing border-box
25 | background-color color-article-background
26 | border 1px solid lighten(color-grey, 50%)
27 | border-radius 6px
28 | box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.07)
29 |
30 | @media mq-mobile
31 | width auto
32 | margin 10rem 1rem
33 |
34 | .about-me__header
35 | .avatar
36 | border-radius 50%
37 | outline 0
38 | overflow hidden
39 | box-shadow 0 6px 10px rgba(0, 0, 0, 0.07)
40 |
41 | .socials
42 | margin-top 2rem
43 |
44 | .social-item
45 | margin-bottom 1rem
46 |
47 | @media mq-mobile
48 | white-space: nowrap;
49 | overflow: hidden;
50 | text-overflow: ellipsis;
51 | width: 18rem;
52 |
53 | .label
54 | width 2rem
55 | height 2rem
56 | display inline-block
57 | margin 0 .5rem
58 | vertical-align middle
59 | img
60 | width 100%
61 | height 100%
62 |
--------------------------------------------------------------------------------
/source/styles/_partial/archive.styl:
--------------------------------------------------------------------------------
1 | .archives
2 | display flex
3 | flex-wrap wrap
4 |
5 | .post-archive
6 | box-sizing border-box
7 | margin gutter-size 0
8 | flex-basis 50%
9 |
10 | @media mq-mobile
11 | flex-basis 100%
12 |
13 | @media mq-normal
14 | &:nth-child(2n + 1)
15 | padding-right 1rem
16 |
17 | &:nth-child(2n)
18 | padding-left 1rem
19 |
20 | .post-archive__content
21 | background-color color-article-background
22 | padding gutter-size
23 | display flex
24 | line-height line-height
25 | transition all .6s ease
26 |
27 | &:hover
28 | box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.07)
29 |
30 | .post-archive__month
31 | color color-tag
32 | flex-basis 3rem
33 | flex-shrink 0
34 |
35 | .post-archive__body
36 | flex-grow 1
37 | height 5rem
38 | overflow hidden
39 |
40 | .post-archive__title
41 | font-size 1rem
42 | font-weight bold
43 | margin-bottom .2rem
44 | display block
45 |
46 | .post-archive__excerpt
47 | color color-grey
48 | height 3rem
49 | overflow hidden
50 | position relative
51 |
52 | .post-archive__excerpt-content
53 | position absolute
54 | width 100%
55 |
--------------------------------------------------------------------------------
/source/styles/_partial/article.styl:
--------------------------------------------------------------------------------
1 | .post
2 | padding: 0
3 |
4 | .slide-hide
5 | height 0
6 | transition all 1s ease-in-out
7 |
8 | .article {
9 | background-color: color-article-background
10 | padding 1.6 * gutter-size
11 | position: relative
12 | margin-bottom gutter-size * 4
13 |
14 | @media mq-mobile {
15 | padding 2 * gutter-size
16 | line-height 2rem
17 | }
18 |
19 | .home & {
20 | transition: all .6s ease
21 | margin-bottom gutter-size * 2
22 |
23 | &:hover {
24 | box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.07)
25 | }
26 | }
27 |
28 | img {
29 | max-width: 100%
30 | display: block
31 | }
32 |
33 | s, strike, del {
34 | color color-grey
35 | }
36 |
37 | u {
38 | text-decoration none
39 | position relative
40 |
41 | &:after {
42 | position absolute
43 | content ' '
44 | bottom 0
45 | left 0
46 | width 100%
47 | height 1px
48 | background-color color-link
49 | }
50 | }
51 |
52 | strong {
53 | font-weight bold
54 | }
55 |
56 | em, cite {
57 | font-style: italic
58 | }
59 |
60 | .checkbox-wrap {
61 | background-size: 80%;
62 | background-position: center;
63 | background-color: #fff;
64 | width: 1rem;
65 | height: 1rem;
66 | display: inline-block;
67 | padding: 1px;
68 | margin-right: .3rem;
69 | vertical-align: text-top;
70 | border-radius: 3px;
71 | border: 1px color-tag solid;
72 |
73 | &.checked {
74 | background-image: url('/images/check.svg');
75 | background-repeat: no-repeat;
76 | }
77 |
78 | input {
79 | display: none;
80 | }
81 | }
82 |
83 | .check-content.checked {
84 | text-decoration line-through
85 | color color-grey
86 | }
87 |
88 | #more {
89 | display none
90 | }
91 |
92 | dt {
93 | font-weight bold
94 | }
95 |
96 | ul {
97 | list-style disc
98 | }
99 |
100 | ol {
101 | list-style decimal
102 | }
103 |
104 | li {
105 | line-height: 2rem
106 | margin-bottom gutter-size
107 | margin-left gutter-size
108 | padding-left .2rem
109 | color color-link
110 |
111 | @media mq-mobile {
112 | font-size gutter-size
113 | }
114 |
115 | .li-inner {
116 | color color-text
117 |
118 | .home & {
119 | color color-grey
120 | }
121 |
122 | p {
123 | margin: 0
124 | }
125 | }
126 | }
127 | }
128 |
129 | .title
130 | font-size title-size
131 | font-weight bold
132 | margin-bottom gutter-size
133 | line-height line-height
134 |
135 | .home &
136 | display block
137 |
138 | .post &
139 | @media mq-mobile
140 | line-height 2.8rem
141 | font-size 1.6rem
142 |
143 | &:after
144 | display none
145 |
146 | .content
147 | p
148 | line-height 2rem
149 | margin 2rem 0
150 | @media mq-mobile
151 | font-size: gutter-size
152 |
153 | .caption
154 | text-align center
155 | display block
156 | color color-grey
157 |
158 | h1, h2, h3, h4, h5, h6
159 | font-weight bold
160 | line-height line-height-title
161 | margin line-height-title 0
162 |
163 | h1
164 | font-size 22px
165 |
166 | h2
167 | font-size 20px
168 |
169 | h3
170 | font-size 18px
171 |
172 | h4
173 | font-size 16px
174 |
175 | h5
176 | font-size 14px
177 |
178 | a
179 | color color-link
180 | &:before
181 | content '['
182 | margin 0 2px
183 | color color-grey
184 |
185 | &:after
186 | content ']'
187 | margin 0 2px
188 | color color-grey
189 |
190 | &.headerlink, &.fancybox
191 | &:after, &:before
192 | display none
193 |
194 |
195 | .nav
196 | margin-bottom gutter-size * 4
197 |
198 | li
199 | position relative
200 | color color-grey
201 | margin-bottom gutter-size
202 | line-height 1.8rem
203 |
204 | a
205 | color color-link
206 | &:before
207 | content: '['
208 | margin: 0 2px
209 | color: color-grey
210 |
211 | &:after
212 | content: ']'
213 | margin: 0 2px
214 | color: color-grey
215 |
216 | &:before
217 | content ' '
218 | display inline-block
219 | vertical-align middle
220 | left: -gutter-size
221 | background-color color-link
222 | width 4px
223 | height 4px
224 | border-radius 2px
225 | margin-right gutter-size
226 |
227 |
228 | .excerpt
229 | color color-grey
230 | margin gutter-size 0
231 |
232 | .article-footer
233 | display flex
234 | justify-content space-between
235 |
236 | .date
237 | color color-grey
238 | margin-bottom gutter-size
239 |
240 | .home &
241 | margin-bottom 0
242 |
243 | .excerpt-link
244 | font-size 1rem
245 |
246 | .tags
247 | .home &
248 | margin-bottom gutter-size
249 |
250 | .tag-link
251 | background-color color-tag
252 | color: #fff
253 | line-height 22px
254 | padding 0 .6rem
255 | display inline-block
256 | border-radius 12px
257 | margin-right .5rem
258 | font-size 12px
259 |
260 | &:last-child
261 | margin-right 0
262 |
263 | &:hover
264 | color #fff
265 |
266 | &:before
267 | content '#'
268 | color #E0E8ED
269 | margin-right .2rem
270 |
--------------------------------------------------------------------------------
/source/styles/_partial/footer.styl:
--------------------------------------------------------------------------------
1 | footer
2 | color color-grey
3 | font-size 12px
4 |
5 | a
6 | color color-text
7 | font-weight bold
8 |
9 | .rights
10 | padding gutter-size 0
11 |
--------------------------------------------------------------------------------
/source/styles/_partial/header.styl:
--------------------------------------------------------------------------------
1 | avatar-size = 4rem
2 |
3 | .header {
4 | padding: 2 * gutter-size 0
5 | display: flex
6 | justify-content: space-between
7 | align-items: flex-end
8 | }
9 |
10 | .header-left {
11 | display: flex
12 | }
13 |
14 | .avatar {
15 | width: avatar-size
16 | height: avatar-size
17 | background-color: #fff;
18 | display: flex;
19 | align-items: center;
20 | justify-content: center;
21 | outline: 3px solid #fff;
22 | outline-offset: -3px;
23 |
24 | img {
25 | width: 100%
26 | height: 100%
27 | }
28 | }
29 |
30 | .author {
31 | margin-left: gutter-size
32 | display: flex
33 | flex-direction: column
34 | justify-content: space-between
35 | padding: .3rem 0
36 | }
37 |
38 | .author-name {
39 | font-size: gutter-size
40 | }
41 |
42 | .about-me {
43 | color: color-grey
44 | }
45 |
46 | .navigation {
47 | clearfix()
48 |
49 | li {
50 | float left
51 | margin-left 2rem
52 |
53 | a {
54 | color color-grey
55 |
56 | &:after {
57 | display none
58 | }
59 |
60 | &:hover {
61 | color color-link
62 | }
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/source/styles/_partial/highlight.styl:
--------------------------------------------------------------------------------
1 | @require "theme"
2 |
3 | $articlePadding = $content-desktop-padding
4 | $base-line-height = 1.8
5 | $mb-line-height = 1.6
6 |
7 | $code-block
8 | background: highlight-background
9 | margin: 0 0 20px 0
10 | padding: 12px 16px
11 | border-radius: 6px
12 | overflow: auto
13 | font-size 12px
14 | color: highlight-foreground
15 | line-height: $base-line-height
16 | border 1px solid highlight-border-color
17 |
18 | @media mq-mobile
19 | line-height $mb-line-height
20 |
21 | $line-numbers
22 | color: #666
23 |
24 | $line-code-theme
25 | color: color-text
26 | background-color: #fff
27 | border: 1px darken(color-background, 10%) solid
28 | font-size: 12px
29 |
30 |
31 | .article
32 | blockquote
33 | border-left: 3px solid color-link;
34 | padding: 16px 20px;
35 | margin: 10px 0;
36 | background: color-background;
37 | line-height: $base-line-height
38 |
39 | p
40 | margin: 0;
41 |
42 | table
43 | width: 100%;
44 | border: 1px solid highlight-table-border-color;
45 | border-collapse: collapse;
46 |
47 | th
48 | background-color: rgba(229, 229, 229, 0.28);
49 |
50 | th, td
51 | border: 1px solid highlight-table-border-color;
52 | padding: .75rem;
53 |
54 | p
55 | margin 0
56 | pre, code
57 | font-family: font-mono
58 | code
59 | padding: 0.3em .5em;
60 | margin: 0 0.2em;
61 | @extend $line-code-theme
62 | border-radius: 2px
63 | pre
64 | @extend $code-block
65 | code
66 | background: none
67 | text-shadow: none
68 | padding: 0
69 | .highlight
70 | @extend $code-block
71 | pre
72 | border: none
73 | margin: 0
74 | padding: 0
75 | table
76 | margin: 0
77 | padding: 0
78 | border: 0
79 | width: auto
80 | td
81 | border: none
82 | padding: 0
83 | figcaption
84 | clearfix()
85 | font-size: 0.85em
86 | color: highlight-comment
87 | line-height: 1em
88 | margin-bottom: 1em
89 | a
90 | float: right
91 | .gutter {
92 | display none
93 | }
94 | .gutter pre
95 | @extend $line-numbers
96 | text-align: right
97 | padding-right: 20px
98 | .line
99 | line-height: $base-line-height
100 | font-size 12px
101 |
102 | @media mq-mobile
103 | line-height $mb-line-height
104 | font-size 12px
105 | .gist
106 | margin: 20px 0 //0 $articlePadding * -1
107 | border-style: solid
108 | border-color: $baseBorderColor
109 | border-width: 1px 0
110 | background: highlight-background
111 | padding: 15px article-padding 15px 15px
112 | .gist-file
113 | border: none
114 | font-family: $font-en
115 | margin: 0
116 | .gist-data
117 | background: none
118 | border: none
119 | .line-numbers
120 | @extend $line-numbers
121 | background: none
122 | border: none
123 | padding: 0 20px 0 0
124 | .line-data
125 | padding: 0 !important
126 | .highlight
127 | margin: 0
128 | padding: 0
129 | border: none
130 | .gist-meta
131 | background: highlight-background
132 | color: highlight-comment
133 | font: 13px $font-zh
134 | text-shadow: 0 0
135 | padding: 0
136 | margin-top: 1em
137 | margin-left: article-padding
138 | a
139 | color: color-link
140 | font-weight: normal
141 | &:hover
142 | text-decoration: underline
143 |
144 | pre
145 | .comment
146 | color: highlight-comment
147 | .variable
148 | .attribute
149 | .tag
150 | .regexp
151 | .ruby .constant
152 | .xml .tag .title
153 | .xml .pi
154 | .xml .doctype
155 | .html .doctype
156 | .css .id
157 | .css .class
158 | .css .pseudo
159 | color: highlight-red
160 | .number
161 | .preprocessor
162 | .built_in
163 | .literal
164 | .params
165 | .constant
166 | color: highlight-orange
167 | .ruby .class .title
168 | .css .rules .attribute
169 | color: highlight-green
170 | .string
171 | color: highlight-blue
172 | .value
173 | .inheritance
174 | .header
175 | .ruby .symbol
176 | .xml .cdata
177 | color: highlight-green
178 | .title
179 | font-size 12px!important
180 | margin 0!important
181 | .title
182 | .css .hexcolor
183 | color: highlight-aqua
184 | .function
185 | .python .decorator
186 | .python .title
187 | .ruby .function .title
188 | .ruby .title .keyword
189 | .perl .sub
190 | .javascript .title
191 | .coffeescript .title
192 | color: highlight-blue
193 | .keyword
194 | .javascript .function
195 | color: highlight-green
196 |
--------------------------------------------------------------------------------
/source/styles/_partial/theme.styl:
--------------------------------------------------------------------------------
1 | $theme_config = hexo-config("highlight_theme")
2 |
3 | if $theme_config == "atom dark"
4 |
5 | highlight-background = #1D252C
6 | highlight-border-color = #1D252C
7 | highlight-table-border-color = #dddddd
8 | highlight-current-line = #2a2a2a
9 | highlight-selection = darken(#333F4A, 3%)
10 | highlight-foreground = #B7C5D3
11 | highlight-comment = #41505E
12 | highlight-red = #D95468
13 | highlight-orange = #D98E48
14 | highlight-yellow = #EBBF83
15 | highlight-green = #008B94
16 | highlight-aqua = #70c0b1
17 | highlight-blue = #539AFC
18 | highlight-purple = #B62D65
19 |
20 | if $theme_config == "atom light"
21 |
22 | highlight-background = #ffffff
23 | highlight-border-color = #e5e5e5
24 | highlight-table-border-color = #dddddd
25 | highlight-current-line = #2a2a2a
26 | highlight-selection = #c8c8fa
27 | highlight-foreground = #24292e
28 | highlight-comment = #959da5
29 | highlight-red = #d73a49
30 | highlight-orange = #e36209
31 | highlight-yellow = #f9c513
32 | highlight-green = #009688
33 | highlight-aqua = #70c0b1
34 | highlight-blue = #539AFC
35 | highlight-purple = #B62D65
36 |
--------------------------------------------------------------------------------
/source/styles/_variables.styl:
--------------------------------------------------------------------------------
1 | // Config
2 | support-for-ie = false
3 | vendor-prefixes = webkit moz ms official
4 |
5 | // Colors
6 | color-text = #333333
7 | color-grey = #a0a0a0
8 | color-border = #ddd
9 | color-tag = #A7B0B3
10 | color-link = #DB4D52
11 | color-background = #f0f0f0
12 | color-article-background = #fbfbfb;
13 |
14 | // Fonts
15 | font-sans = -apple-system, "Avenir-light", "AvenirLTStd-Light",
16 | "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell",
17 | "Fira Sans", "Droid Sans", "Helvetica Neue",
18 | sans-serif
19 | font-serif = Georgia, "Times New Roman", serif
20 | font-mono = "fira mono", Consolas, Menlo, Consolas, monospace
21 | font-icon = FontAwesome
22 | font-icon-path = "fonts/fontawesome-webfont"
23 | font-icon-version = "4.0.3"
24 | font-size = 14px
25 | line-height = 1.6rem
26 | line-height-title = 1.1rem
27 |
28 | container-width = 38rem
29 |
30 | // Header
31 | logo-size = 40px
32 |
33 | // article
34 | title-size = 18px
35 |
36 | gutter-size = (16px / font-size)rem
37 |
38 | // Media queries
39 | mq-mobile = "screen and (max-width: 479px)"
40 | mq-tablet = "screen and (min-width: 480px) and (max-width: 767px)"
41 | mq-normal = "screen and (min-width: 768px)"
42 |
--------------------------------------------------------------------------------
/source/styles/site.styl:
--------------------------------------------------------------------------------
1 | @import "nib"
2 | @import "./_variables"
3 | @import "./_extend"
4 |
5 | global-reset()
6 |
7 | html
8 | font-size font-size
9 |
10 | body
11 | background-color color-background
12 | color color-text
13 | font-family font-sans
14 | -webkit-font-smoothing antialiased
15 | line-height line-height
16 |
17 | a
18 | position relative
19 | color color-text
20 | text-decoration none
21 | transition color .2s ease
22 |
23 | &:hover
24 | color color-link
25 |
26 | #backToTop
27 | position fixed
28 | z-index 999
29 | bottom gutter-size * 2
30 | left 50%
31 | margin-left container-width * .5 + gutter-size * 2
32 | background-color color-article-background
33 | width gutter-size * 2
34 | height gutter-size * 2
35 | transition all .2s ease-in-out
36 | display flex
37 | align-items center
38 | justify-content center
39 | opacity 0
40 | cursor pointer
41 |
42 | &.show
43 | opacity 1
44 |
45 | &:hover
46 | box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.07)
47 |
48 | .back-arrow-right
49 | transform: rotate(45deg) translate(-3px, 0px);
50 |
51 | .back-arrow-left
52 | transform: rotate(-45deg) translate(3px, -0px);
53 |
54 | .back-arrow
55 | background-color color-link
56 | width .7 * gutter-size
57 | height 2px
58 | transition all .2s ease-in-out
59 |
60 | .back-arrow-right
61 | transform: rotate(30deg) translate(-2px, 0px);
62 |
63 | .back-arrow-left
64 | transform: rotate(-30deg) translate(2px, -0px);
65 |
66 |
67 | .container
68 | width container-width
69 | margin 0 auto
70 | box-sizing border-box
71 |
72 | @media mq-mobile
73 | width 100%
74 | padding 0 1rem
75 |
76 | @import "_partial/header"
77 | @import "_partial/footer"
78 | @import "_partial/aboutme"
79 | @import "_partial/article"
80 | @import "_partial/archive"
81 | @import "_partial/highlight"
82 |
--------------------------------------------------------------------------------