hexo-theme-lnote 1.2.5 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/links.yml +21 -21
- package/languages/en.yml +4 -0
- package/languages/zh-CN.yml +4 -0
- package/languages/zh-HK.yml +4 -0
- package/languages/zh-TW.yml +4 -0
- package/package.json +3 -2
- package/scripts/index.js +1 -0
- package/source/css/_pages/_base/base.styl +3 -4
- package/source/css/_pages/_base/color-schema.styl +4 -0
- package/source/css/_pages/_post/highlight.styl +5 -4
- package/source/css/_pages/_post/markdown.styl +4 -4
- package/source/css/_pages/_post/post-tag.styl +50 -18
- package/source/css/_variables/base.styl +1 -1
- package/source/img/chat/responder.jpg +0 -0
- package/source/img/chat/sender.jpg +0 -0
- package/source/img/default8.jpg +0 -0
- package/source/js/post/img-swipe.js +6 -3
- package/templates/Chat.vue +52 -0
- package/templates/GroupImage.vue +36 -0
- package/templates/MenuNav.vue +39 -0
- package/templates/Note.vue +33 -0
- package/templates/Noun.vue +25 -0
- package/templates/NounContent.vue +29 -0
- package/templates/Tab.vue +40 -0
- package/templates/utils/uri.ts +30 -2
- package/templates/noun.vue +0 -15
@@ -28,11 +28,10 @@ body
|
|
28
28
|
transition color .2s ease-in-out, background-color .2s ease-in-out
|
29
29
|
|
30
30
|
code
|
31
|
-
|
31
|
+
user-select all
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
color var(--post-text-color)
|
33
|
+
pre code
|
34
|
+
user-select auto
|
36
35
|
|
37
36
|
img[lazyload]
|
38
37
|
object-fit cover
|
@@ -21,6 +21,8 @@
|
|
21
21
|
--inlinecode-bg-color $inlinecode-bg-color
|
22
22
|
--code-mac-top-bg #f2f2f2
|
23
23
|
--code-mac-body-bg #fff
|
24
|
+
// --chat-sender #f0f0f0
|
25
|
+
// --chat-responder #d7ecff
|
24
26
|
|
25
27
|
dark-colors()
|
26
28
|
--body-bg-color $body-bg-color-dark
|
@@ -44,6 +46,8 @@ dark-colors()
|
|
44
46
|
--inlinecode-bg-color $inlinecode-bg-color-dark
|
45
47
|
--code-mac-top-bg #181818
|
46
48
|
--code-mac-body-bg #000
|
49
|
+
// --chat-sender #16171a
|
50
|
+
// --chat-responder #002440
|
47
51
|
|
48
52
|
.navbar .dropdown-collapse, .top-nav-collapse, .navbar-col-show
|
49
53
|
if $navbar-glass-enable
|
@@ -7,8 +7,9 @@
|
|
7
7
|
|
8
8
|
.highlight
|
9
9
|
position relative
|
10
|
-
border-radius
|
11
|
-
padding-top:
|
10
|
+
border-radius 0.5rem
|
11
|
+
padding-top: 1.75rem
|
12
|
+
margin-top: 1rem
|
12
13
|
background-color: var(--code-mac-top-bg)
|
13
14
|
&::before
|
14
15
|
background: #fc625d
|
@@ -35,8 +36,8 @@
|
|
35
36
|
table-layout: fixed
|
36
37
|
width: 100%
|
37
38
|
|
38
|
-
figure
|
39
|
-
margin 1rem 0
|
39
|
+
/* figure
|
40
|
+
margin 1rem 0 */
|
40
41
|
|
41
42
|
figure.highlight
|
42
43
|
position relative
|
@@ -24,8 +24,8 @@
|
|
24
24
|
&:focus
|
25
25
|
outline none
|
26
26
|
|
27
|
-
a
|
28
|
-
color var(--bs-link-color);
|
27
|
+
/* a
|
28
|
+
color var(--bs-link-color); */
|
29
29
|
|
30
30
|
strong
|
31
31
|
font-weight bold
|
@@ -83,7 +83,7 @@ hr, .markdown-body hr
|
|
83
83
|
margin 2rem 0
|
84
84
|
|
85
85
|
// Rewrite figcaption
|
86
|
-
.markdown-body
|
86
|
+
/* .markdown-body
|
87
87
|
figcaption.image-caption
|
88
88
|
font-size .8rem
|
89
89
|
color var(--post-text-color)
|
@@ -93,4 +93,4 @@ hr, .markdown-body hr
|
|
93
93
|
text-align center
|
94
94
|
|
95
95
|
figcaption:not(.image-caption)
|
96
|
-
display none
|
96
|
+
display none */
|
@@ -1,5 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
// popover
|
4
2
|
.lnote-popover-btn
|
5
3
|
--bs-btn-padding-y 0
|
@@ -7,10 +5,23 @@
|
|
7
5
|
--bs-btn-line-height 1
|
8
6
|
.lnote-popover
|
9
7
|
--bs-popover-border-color var(--bs-primary)
|
10
|
-
--bs-popover-
|
11
|
-
--bs-popover-
|
12
|
-
--bs-popover-
|
13
|
-
|
8
|
+
--bs-popover-body-padding-x 0
|
9
|
+
--bs-popover-body-padding-y 0
|
10
|
+
--bs-popover-bg transparent
|
11
|
+
&.secondary
|
12
|
+
--bs-popover-border-color var(--bs-secondary)
|
13
|
+
&.info
|
14
|
+
--bs-popover-border-color var(--bs-info)
|
15
|
+
&.success
|
16
|
+
--bs-popover-border-color var(--bs-success)
|
17
|
+
&.warning
|
18
|
+
--bs-popover-border-color var(--bs-warning)
|
19
|
+
&.danger
|
20
|
+
--bs-popover-border-color var(--bs-danger)
|
21
|
+
&.light
|
22
|
+
--bs-popover-border-color var(--bs-light)
|
23
|
+
&.dark
|
24
|
+
--bs-popover-border-color var(--bs-dark)
|
14
25
|
|
15
26
|
// note
|
16
27
|
.note
|
@@ -26,18 +37,39 @@
|
|
26
37
|
|
27
38
|
// group-image
|
28
39
|
.group-image-container
|
29
|
-
margin
|
40
|
+
margin 1rem auto
|
30
41
|
img
|
31
|
-
width
|
32
|
-
height
|
33
|
-
// object-fit: cover
|
42
|
+
width 100%
|
43
|
+
height 100%
|
34
44
|
.image-adapter
|
35
|
-
padding-bottom
|
36
|
-
position
|
45
|
+
padding-bottom 100%
|
46
|
+
position relative
|
37
47
|
> div
|
38
|
-
width
|
39
|
-
height
|
40
|
-
position
|
41
|
-
left
|
42
|
-
top
|
43
|
-
z-index
|
48
|
+
width 100%
|
49
|
+
height 100%
|
50
|
+
position absolute
|
51
|
+
left 0
|
52
|
+
top 0
|
53
|
+
z-index 2
|
54
|
+
|
55
|
+
// chat
|
56
|
+
.chats
|
57
|
+
.chat-avatar
|
58
|
+
width: 2.8rem
|
59
|
+
height: 2.8rem
|
60
|
+
.chat-name
|
61
|
+
font-size: 0.8rem
|
62
|
+
line-height: 1
|
63
|
+
max-width: 84%
|
64
|
+
white-space: nowrap
|
65
|
+
text-overflow: ellipsis
|
66
|
+
.chat-content
|
67
|
+
max-width: 84%
|
68
|
+
:last-child
|
69
|
+
margin-bottom: 0
|
70
|
+
/* .chat-sender
|
71
|
+
.chat-content
|
72
|
+
background-color: var(--chat-sender)
|
73
|
+
.chat-responder
|
74
|
+
.chat-content
|
75
|
+
background-color: var(--chat-responder) */
|
Binary file
|
Binary file
|
package/source/img/default8.jpg
CHANGED
Binary file
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import PhotoSwipeLightbox from '//
|
1
|
+
import PhotoSwipeLightbox from '//cdn.staticfile.net/photoswipe/5.4.2/photoswipe-lightbox.esm.min.js'
|
2
2
|
|
3
3
|
const lightbox = new PhotoSwipeLightbox({
|
4
|
-
pswpModule: () => import('//
|
4
|
+
pswpModule: () => import('//cdn.staticfile.net/photoswipe/5.4.2/photoswipe.esm.min.js'),
|
5
5
|
wheelToZoom: true,
|
6
6
|
})
|
7
7
|
const groups = []
|
@@ -69,9 +69,12 @@ Promise.allSettled(promiseds).then(() => {
|
|
69
69
|
order: 9,
|
70
70
|
isButton: false,
|
71
71
|
appendTo: 'root',
|
72
|
-
html:
|
72
|
+
html: null,
|
73
73
|
onInit(el, pswp) {
|
74
74
|
pswp.on('change', () => {
|
75
|
+
if (pswp.currSlide.data.alt == null) {
|
76
|
+
return
|
77
|
+
}
|
75
78
|
el.innerHTML = `<div>${pswp.currSlide.data.alt}</div>`
|
76
79
|
})
|
77
80
|
},
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<template>
|
2
|
+
<article class="chats">
|
3
|
+
<template v-for="item in chats">
|
4
|
+
<section
|
5
|
+
v-if="item.role === 'sender'"
|
6
|
+
class="chat-sender py-3 d-flex align-items-start justify-content-start"
|
7
|
+
>
|
8
|
+
<img
|
9
|
+
class="chat-avatar rounded"
|
10
|
+
:src="uriFor(['/img/chat/sender.jpg'])"
|
11
|
+
/>
|
12
|
+
<div
|
13
|
+
class="chat-part overflow-hidden ms-3 flex-fill d-flex flex-column align-items-start"
|
14
|
+
>
|
15
|
+
<div class="chat-name mb-2 overflow-hidden">
|
16
|
+
{{ item.name }}
|
17
|
+
</div>
|
18
|
+
<div
|
19
|
+
class="chat-content rounded bg-secondary-subtle px-3 py-2"
|
20
|
+
v-html="item.content"
|
21
|
+
></div>
|
22
|
+
</div>
|
23
|
+
</section>
|
24
|
+
<section
|
25
|
+
v-else
|
26
|
+
class="chat-responder py-3 flex-row-reverse d-flex align-items-start justify-content-start"
|
27
|
+
>
|
28
|
+
<img
|
29
|
+
class="chat-avatar rounded"
|
30
|
+
:src="uriFor(['/img/chat/responder.jpg'])"
|
31
|
+
/>
|
32
|
+
<div
|
33
|
+
class="chat-part overflow-hidden me-3 flex-fill d-flex flex-column align-items-end"
|
34
|
+
>
|
35
|
+
<div class="chat-name mb-2 overflow-hidden">
|
36
|
+
{{ item.name }}
|
37
|
+
</div>
|
38
|
+
<div
|
39
|
+
class="chat-content rounded bg-primary-subtle px-3 py-2"
|
40
|
+
v-html="item.content"
|
41
|
+
></div>
|
42
|
+
</div>
|
43
|
+
</section>
|
44
|
+
</template>
|
45
|
+
</article>
|
46
|
+
</template>
|
47
|
+
|
48
|
+
<script lang="ts" setup>
|
49
|
+
import { uriFor } from './utils/uri'
|
50
|
+
import type { Chat } from '../types/tag'
|
51
|
+
const chats: Chat[] = []
|
52
|
+
</script>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<template>
|
2
|
+
<div v-if="rowCol === 1" class="group-image-container">
|
3
|
+
<img
|
4
|
+
class="img-fluid object-fit-cover w-100 img-swipe-single"
|
5
|
+
:alt="list[0].title"
|
6
|
+
:src="uriFor([list[0].url])"
|
7
|
+
/>
|
8
|
+
</div>
|
9
|
+
<div v-else class="group-image-container img-swipe-group">
|
10
|
+
<div :class="['row', `row-cols-${rowCol}`, 'gx-2', 'gy-2']">
|
11
|
+
<div class="col" v-for="item in list">
|
12
|
+
<img
|
13
|
+
v-if="isSameSize"
|
14
|
+
class="img-fluid object-fit-cover"
|
15
|
+
:alt="item.title"
|
16
|
+
:src="uriFor([item.url])"
|
17
|
+
/>
|
18
|
+
<div class="image-adapter" v-else>
|
19
|
+
<div>
|
20
|
+
<img
|
21
|
+
class="img-fluid object-fit-cover"
|
22
|
+
:alt="item.title"
|
23
|
+
:src="uriFor([item.url])"
|
24
|
+
/>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</template>
|
31
|
+
<script lang="ts" setup>
|
32
|
+
import { uriFor } from './utils/uri'
|
33
|
+
const rowCol: number = 1
|
34
|
+
const isSameSize: boolean = false
|
35
|
+
const list: { title: string; url: string }[] = []
|
36
|
+
</script>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<template>
|
2
|
+
<div :class="['btn-group', typeBgClass(type)]" role="group">
|
3
|
+
<div class="btn-group" role="group" v-for="menu in menus">
|
4
|
+
<button
|
5
|
+
type="button"
|
6
|
+
:class="['btn', `btn-outline-${type}`, 'dropdown-toggle']"
|
7
|
+
data-bs-toggle="dropdown"
|
8
|
+
aria-expanded="false"
|
9
|
+
>
|
10
|
+
{{ menu.text }}
|
11
|
+
</button>
|
12
|
+
<ul :class="['dropdown-menu']">
|
13
|
+
<li v-for="item in menu.secondaryMenus">
|
14
|
+
<a
|
15
|
+
:class="['dropdown-item']"
|
16
|
+
:href="uriFor([item.link])"
|
17
|
+
>
|
18
|
+
{{ item.text }}
|
19
|
+
</a>
|
20
|
+
</li>
|
21
|
+
</ul>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</template>
|
25
|
+
|
26
|
+
<script setup lang="ts">
|
27
|
+
import { uriFor, typeBgClass } from './utils/uri'
|
28
|
+
import type { Type } from '../types/tag'
|
29
|
+
type SecondaryMenu = {
|
30
|
+
text: string
|
31
|
+
link: string
|
32
|
+
}
|
33
|
+
type FirstMenu = {
|
34
|
+
text: string
|
35
|
+
secondaryMenus: SecondaryMenu[]
|
36
|
+
}
|
37
|
+
const type: Type = 'warning'
|
38
|
+
const menus: FirstMenu[] = []
|
39
|
+
</script>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<template>
|
2
|
+
<div
|
3
|
+
v-if="iconType"
|
4
|
+
:class="[
|
5
|
+
'note',
|
6
|
+
'alert',
|
7
|
+
`alert-${alertType}`,
|
8
|
+
'd-flex',
|
9
|
+
'align-items-top',
|
10
|
+
]"
|
11
|
+
role="alert"
|
12
|
+
>
|
13
|
+
<svg
|
14
|
+
class="flex-shrink-0 me-2"
|
15
|
+
role="img"
|
16
|
+
width="1.2em"
|
17
|
+
height="1.2em"
|
18
|
+
:style="{marginTop: '0.2rem'}"
|
19
|
+
>
|
20
|
+
<use :xlink:href="`#${iconType}`"></use>
|
21
|
+
</svg>
|
22
|
+
<div v-html="html"></div>
|
23
|
+
</div>
|
24
|
+
<div v-else :class="['note', 'alert', `alert-${alertType}`]">
|
25
|
+
<div v-html="html"></div>
|
26
|
+
</div>
|
27
|
+
</template>
|
28
|
+
<script lang="ts" setup>
|
29
|
+
import type { Type } from '../types/tag'
|
30
|
+
const alertType: Type = 'info'
|
31
|
+
const iconType: Type = 'info'
|
32
|
+
const html: string = ''
|
33
|
+
</script>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<template>
|
2
|
+
<button
|
3
|
+
type="button"
|
4
|
+
:class="['btn', 'btn-link', `text-${type}-emphasis`, 'lnote-popover-btn']"
|
5
|
+
data-bs-toggle="popover"
|
6
|
+
data-bs-trigger="hover focus"
|
7
|
+
data-bs-placement="right"
|
8
|
+
:data-bs-custom-class="`lnote-popover ${type}`"
|
9
|
+
data-bs-html="true"
|
10
|
+
:data-bs-content="content"
|
11
|
+
>
|
12
|
+
{{ text }}
|
13
|
+
<svg width="18" height="18">
|
14
|
+
<use xlink:href="#question-circle-fill"></use>
|
15
|
+
</svg>
|
16
|
+
</button>
|
17
|
+
</template>
|
18
|
+
|
19
|
+
<script lang="ts" setup>
|
20
|
+
import { typeBgClass } from './utils/uri'
|
21
|
+
import type { Type } from '../types/tag'
|
22
|
+
const type: Type = 'primary'
|
23
|
+
const content = ''
|
24
|
+
const text = ''
|
25
|
+
</script>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<template>
|
2
|
+
<div :class="['card', `border-${type}`]">
|
3
|
+
<div :class="['card-header', 'fw-bold', `text-bg-${type}`]">{{ title }}</div>
|
4
|
+
<div :class="['card-body', `bg-${type}-subtle`, 'rounded-bottom']">
|
5
|
+
<!-- <h5 class="card-title" v-if="title">{{ title }}</h5> -->
|
6
|
+
<p class="card-text">
|
7
|
+
{{ text }}
|
8
|
+
</p>
|
9
|
+
<a
|
10
|
+
v-if="link"
|
11
|
+
:href="uriFor([link])"
|
12
|
+
:class="['card-link', `text-${type}-emphasis`]"
|
13
|
+
>
|
14
|
+
{{ moreText }}
|
15
|
+
</a>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</template>
|
19
|
+
|
20
|
+
<script lang="ts" setup>
|
21
|
+
import { uriFor, typeBgClass } from './utils/uri'
|
22
|
+
import type { Type } from '../types/tag'
|
23
|
+
const type: Type = 'primary'
|
24
|
+
// const promptText = ''
|
25
|
+
const moreText = ''
|
26
|
+
const title = ''
|
27
|
+
const text = ''
|
28
|
+
const link = ''
|
29
|
+
</script>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<template>
|
2
|
+
<nav>
|
3
|
+
<ul
|
4
|
+
class="nav nav-underline mb-3 d-flex flex-nowrap overflow-x-auto text-nowrap border-bottom"
|
5
|
+
role="tablist"
|
6
|
+
>
|
7
|
+
<li class="nav-item" role="presentation" v-for="(item, index) in tabs">
|
8
|
+
<button
|
9
|
+
data-bs-toggle="tab"
|
10
|
+
role="tab"
|
11
|
+
type="button"
|
12
|
+
:aria-selected="index === 0 ? 'true' : 'false'"
|
13
|
+
:class="['nav-link', { active: index === 0 }]"
|
14
|
+
:id="`tab-${key}-${index}`"
|
15
|
+
:data-bs-target="`#nav-${key}-${index}`"
|
16
|
+
:aria-controls="`nav-${key}-${index}`"
|
17
|
+
>
|
18
|
+
{{ item.name }}
|
19
|
+
</button>
|
20
|
+
</li>
|
21
|
+
</ul>
|
22
|
+
<div class="tab-content">
|
23
|
+
<div
|
24
|
+
v-for="(item, index) in tabs"
|
25
|
+
:class="['tab-pane', 'fade', index === 0 && 'show active']"
|
26
|
+
:id="`nav-${key}-${index}`"
|
27
|
+
role="tabpanel"
|
28
|
+
:aria-labelledby="`tab-${key}-${index}`"
|
29
|
+
:tabindex="index"
|
30
|
+
>
|
31
|
+
<div v-html="item.content"></div>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
</nav>
|
35
|
+
</template>
|
36
|
+
<script lang="ts" setup>
|
37
|
+
import type { Tab } from '../types/tag'
|
38
|
+
const key: string = ''
|
39
|
+
const tabs: Tab[] = []
|
40
|
+
</script>
|
package/templates/utils/uri.ts
CHANGED
@@ -1,12 +1,40 @@
|
|
1
1
|
import fs from 'fs'
|
2
2
|
import path from 'path'
|
3
|
+
import type { Type } from '../../types/tag'
|
3
4
|
|
4
5
|
function runtimeProjectInfo() {
|
5
6
|
const projectPath = path.resolve(process.cwd(), 'package.json')
|
6
7
|
return JSON.parse(fs.readFileSync(projectPath, 'utf-8'))
|
7
8
|
}
|
8
9
|
|
9
|
-
|
10
|
+
function linkIsCDN(url: string) {
|
11
|
+
if (/^https*:\/\//.test(url) || /^\/\//.test(url)) {
|
12
|
+
return true
|
13
|
+
}
|
14
|
+
return false
|
15
|
+
}
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @description 图片链接生成
|
19
|
+
* 1. http或https开头的cdn链接,将原样转换回去,且只会返回第一个
|
20
|
+
* 2. 多个链接组合成一个,并在前面添加上当前项目的name
|
21
|
+
* @param {string[]} uris uri组,每一个uri必须带 / 开头,保持和 hexo 图片标签一样
|
22
|
+
* @returns
|
23
|
+
*/
|
24
|
+
export function uriFor(uris: string[]) {
|
25
|
+
if (uris.length === 1 && linkIsCDN(uris[0])) {
|
26
|
+
return uris[0]
|
27
|
+
}
|
10
28
|
const { name } = runtimeProjectInfo()
|
11
|
-
return ['', name,
|
29
|
+
return ['/', name, ...uris].join('')
|
30
|
+
}
|
31
|
+
|
32
|
+
export function typeBgClass(type: Type) {
|
33
|
+
if (['warning', 'info', 'light'].includes(type)) {
|
34
|
+
return 'bg-dark'
|
35
|
+
}
|
36
|
+
if (['dark'].includes(type)) {
|
37
|
+
return 'bg-light'
|
38
|
+
}
|
39
|
+
return ''
|
12
40
|
}
|
package/templates/noun.vue
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
<template>
|
2
|
-
<button type="button" class="btn btn-link lnote-popover-btn" data-bs-toggle="popover" data-bs-trigger="hover focus"
|
3
|
-
data-bs-placement="right" data-bs-custom-class="lnote-popover" :data-bs-title="title" :data-bs-content="desc">
|
4
|
-
{{ text }}
|
5
|
-
<svg width="18" height="18">
|
6
|
-
<use xlink:href="#question-circle-fill"></use>
|
7
|
-
</svg>
|
8
|
-
</button>
|
9
|
-
</template>
|
10
|
-
|
11
|
-
<script lang="ts" setup>
|
12
|
-
const title: string | undefined = undefined
|
13
|
-
const desc = ''
|
14
|
-
const text = ''
|
15
|
-
</script>
|