@hanology/cham-browser 0.3.2 → 0.3.3
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/dist/cli.js +23 -1
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/template/src/components/SideNav.vue +24 -3
- package/template/src/composables/useSiteConfig.ts +11 -0
- package/template/src/router.ts +2 -0
- package/template/src/views/AboutView.vue +17 -2
- package/template/src/views/LibraryHome.vue +39 -2
package/dist/cli.js
CHANGED
|
@@ -11,6 +11,7 @@ function loadConfig(configPath) {
|
|
|
11
11
|
nameEn: raw.nameEn,
|
|
12
12
|
subtitle: raw.subtitle,
|
|
13
13
|
subtitleEn: raw.subtitleEn,
|
|
14
|
+
logo: raw.logo,
|
|
14
15
|
libraryDir: raw.libraryDir || 'library/content',
|
|
15
16
|
authorsFile: raw.authorsFile,
|
|
16
17
|
outputDir: raw.outputDir || 'dist',
|
|
@@ -125,14 +126,32 @@ function generateData(config, configDir) {
|
|
|
125
126
|
async function buildSite(config, configDir) {
|
|
126
127
|
const templateDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'template');
|
|
127
128
|
const outputDir = resolve(configDir, config.outputDir || 'dist');
|
|
129
|
+
// Copy logo to dist if configured
|
|
130
|
+
let logoUrl;
|
|
131
|
+
if (config.logo) {
|
|
132
|
+
const logoSrc = resolve(configDir, config.logo);
|
|
133
|
+
if (existsSync(logoSrc)) {
|
|
134
|
+
const assetsDir = join(outputDir, 'assets');
|
|
135
|
+
mkdirSync(assetsDir, { recursive: true });
|
|
136
|
+
const ext = logoSrc.endsWith('.svg') ? 'svg' : logoSrc.endsWith('.png') ? 'png' : 'bin';
|
|
137
|
+
const logoName = `logo.${ext}`;
|
|
138
|
+
writeFileSync(join(assetsDir, logoName), readFileSync(logoSrc));
|
|
139
|
+
logoUrl = `/assets/${logoName}`;
|
|
140
|
+
console.log(`Logo: ${config.logo} → ${logoUrl}`);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.warn(`Logo not found: ${logoSrc}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
128
146
|
const { build: ssgBuild } = await import('vite-ssg/node');
|
|
129
147
|
const vue = (await import('@vitejs/plugin-vue')).default;
|
|
130
148
|
process.env.CHAM_DATA_DIR = join(outputDir, 'data');
|
|
149
|
+
process.env.CHAM_LOGO_URL = logoUrl || '';
|
|
131
150
|
await ssgBuild({
|
|
132
151
|
script: 'async',
|
|
133
152
|
formatting: 'minify',
|
|
134
153
|
includedRoutes(paths, routes) {
|
|
135
|
-
const result = ['/'];
|
|
154
|
+
const result = ['/', '/about'];
|
|
136
155
|
const library = JSON.parse(readFileSync(join(outputDir, 'data', 'library.json'), 'utf-8'));
|
|
137
156
|
const authors = JSON.parse(readFileSync(join(outputDir, 'data', 'authors.json'), 'utf-8'));
|
|
138
157
|
for (const book of library.books) {
|
|
@@ -155,6 +174,9 @@ async function buildSite(config, configDir) {
|
|
|
155
174
|
'@': resolve(templateDir, 'src'),
|
|
156
175
|
},
|
|
157
176
|
},
|
|
177
|
+
define: {
|
|
178
|
+
'import.meta.env.CHAM_LOGO_URL': JSON.stringify(logoUrl || ''),
|
|
179
|
+
},
|
|
158
180
|
build: {
|
|
159
181
|
outDir: outputDir,
|
|
160
182
|
emptyOutDir: false,
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAC9F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAA;AACzC,OAAO,EACL,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EACpD,gBAAgB,EAAE,kBAAkB,GACrC,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { ref } from 'vue'
|
|
3
|
+
import { useRouter } from 'vue-router'
|
|
3
4
|
import { useReadingMode, THEMES, THEME_LABELS, FONT_SIZES } from '../composables/useReadingMode'
|
|
4
5
|
import type { LayoutMode, FontSize } from '../composables/useReadingMode'
|
|
5
6
|
import { useI18n, LOCALE_LABELS, type Locale } from '../composables/useI18n'
|
|
6
|
-
import
|
|
7
|
+
import { useSiteConfig } from '../composables/useSiteConfig'
|
|
7
8
|
|
|
8
9
|
defineProps<{
|
|
9
10
|
context?: string
|
|
@@ -19,6 +20,8 @@ const emit = defineEmits<{
|
|
|
19
20
|
|
|
20
21
|
const { theme, layout, mainFontSize, bodyFontSize, setTheme, setLayout, setMainFontSize, setBodyFontSize } = useReadingMode()
|
|
21
22
|
const { t, setLocale, locale, availableLocales, localeLabels } = useI18n()
|
|
23
|
+
const { logoUrl } = useSiteConfig()
|
|
24
|
+
const router = useRouter()
|
|
22
25
|
const settingsOpen = ref(false)
|
|
23
26
|
|
|
24
27
|
function toggleSettings() { settingsOpen.value = !settingsOpen.value }
|
|
@@ -27,7 +30,8 @@ function toggleSettings() { settingsOpen.value = !settingsOpen.value }
|
|
|
27
30
|
<template>
|
|
28
31
|
<nav class="sidenav">
|
|
29
32
|
<button class="sn-brand" @click="emit('home')" title="首頁">
|
|
30
|
-
<img :src="
|
|
33
|
+
<img v-if="logoUrl" :src="logoUrl" alt="" class="sn-logo" />
|
|
34
|
+
<span v-else class="sn-seal">漢流</span>
|
|
31
35
|
</button>
|
|
32
36
|
|
|
33
37
|
<button class="sn-btn" @click="emit('back')" title="返回">
|
|
@@ -45,6 +49,10 @@ function toggleSettings() { settingsOpen.value = !settingsOpen.value }
|
|
|
45
49
|
|
|
46
50
|
<div class="sn-spacer" />
|
|
47
51
|
|
|
52
|
+
<button class="sn-btn" @click="router.push('/about')" title="關於">
|
|
53
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>
|
|
54
|
+
</button>
|
|
55
|
+
|
|
48
56
|
<button
|
|
49
57
|
class="sn-btn"
|
|
50
58
|
:class="{ active: settingsOpen }"
|
|
@@ -128,7 +136,7 @@ function toggleSettings() { settingsOpen.value = !settingsOpen.value }
|
|
|
128
136
|
|
|
129
137
|
.sn-brand {
|
|
130
138
|
width: 40px; height: 48px;
|
|
131
|
-
border:
|
|
139
|
+
border: 2px solid var(--vermillion);
|
|
132
140
|
border-radius: 3px;
|
|
133
141
|
background: none;
|
|
134
142
|
display: flex; align-items: center; justify-content: center;
|
|
@@ -143,6 +151,18 @@ function toggleSettings() { settingsOpen.value = !settingsOpen.value }
|
|
|
143
151
|
width: auto;
|
|
144
152
|
object-fit: contain;
|
|
145
153
|
}
|
|
154
|
+
.sn-brand:has(.sn-logo) { border: none; }
|
|
155
|
+
.sn-seal {
|
|
156
|
+
writing-mode: vertical-rl;
|
|
157
|
+
text-orientation: upright;
|
|
158
|
+
font-family: var(--serif);
|
|
159
|
+
font-size: 14px; font-weight: 900;
|
|
160
|
+
color: var(--vermillion);
|
|
161
|
+
display: flex;
|
|
162
|
+
align-items: center;
|
|
163
|
+
letter-spacing: 2px;
|
|
164
|
+
line-height: 1;
|
|
165
|
+
}
|
|
146
166
|
|
|
147
167
|
.sn-btn {
|
|
148
168
|
width: 36px; height: 36px;
|
|
@@ -292,6 +312,7 @@ function toggleSettings() { settingsOpen.value = !settingsOpen.value }
|
|
|
292
312
|
@media (max-width: 768px) {
|
|
293
313
|
.sidenav { width: 44px; padding: 8px 0; gap: 6px; }
|
|
294
314
|
.sn-brand { width: 32px; height: 38px; }
|
|
315
|
+
.sn-seal { font-size: 15px; }
|
|
295
316
|
.sn-btn { width: 30px; height: 30px; }
|
|
296
317
|
.sn-context { font-size: 10px; max-height: 80px; }
|
|
297
318
|
}
|
package/template/src/router.ts
CHANGED
|
@@ -8,9 +8,11 @@ import LibraryHome from './views/LibraryHome.vue'
|
|
|
8
8
|
import BookHome from './views/BookHome.vue'
|
|
9
9
|
import PieceView from './views/PieceView.vue'
|
|
10
10
|
import AuthorView from './views/AuthorView.vue'
|
|
11
|
+
import AboutView from './views/AboutView.vue'
|
|
11
12
|
|
|
12
13
|
export const routes: RouteRecordRaw[] = [
|
|
13
14
|
{ path: '/', component: LibraryHome },
|
|
15
|
+
{ path: '/about', component: AboutView },
|
|
14
16
|
{ path: '/author/:name', component: AuthorView, props: true },
|
|
15
17
|
{ path: '/:bookId', component: BookHome, props: true },
|
|
16
18
|
{ path: '/:bookId/:num', component: PieceView, props: true },
|
|
@@ -5,12 +5,13 @@ import { useReadingMode } from '../composables/useReadingMode'
|
|
|
5
5
|
import { useHorizontalScroll } from '../composables/useHorizontalScroll'
|
|
6
6
|
import SideNav from '../components/SideNav.vue'
|
|
7
7
|
import ReadingToolbar from '../components/ReadingToolbar.vue'
|
|
8
|
-
import
|
|
8
|
+
import { useSiteConfig } from '../composables/useSiteConfig'
|
|
9
9
|
import { ref, computed } from 'vue'
|
|
10
10
|
import { useRouter } from 'vue-router'
|
|
11
11
|
|
|
12
12
|
const { t, locale } = useI18n()
|
|
13
13
|
const { layout } = useReadingMode()
|
|
14
|
+
const { logoUrl } = useSiteConfig()
|
|
14
15
|
const isVertical = computed(() => layout.value === 'vertical')
|
|
15
16
|
const vPageRef = ref<HTMLElement | null>(null)
|
|
16
17
|
const vScroll = useHorizontalScroll(vPageRef)
|
|
@@ -45,7 +46,8 @@ function goHome() { router.push('/') }
|
|
|
45
46
|
<h1 class="h-page-title">關於漢流 / About Hanology</h1>
|
|
46
47
|
</header>
|
|
47
48
|
<div class="h-content">
|
|
48
|
-
<img :src="
|
|
49
|
+
<img v-if="logoUrl" :src="logoUrl" alt="" class="h-logo" />
|
|
50
|
+
<div v-else class="h-seal">漢流</div>
|
|
49
51
|
<div class="h-about-block">
|
|
50
52
|
<h2>漢流 · Hanology</h2>
|
|
51
53
|
<p><strong>漢流</strong>,粵音 Han-Lou,普音 Han-Liu,意為「漢學之流」。</p>
|
|
@@ -141,6 +143,19 @@ function goHome() { router.push('/') }
|
|
|
141
143
|
margin: 0 auto 40px;
|
|
142
144
|
display: block;
|
|
143
145
|
}
|
|
146
|
+
.h-seal {
|
|
147
|
+
writing-mode: vertical-rl;
|
|
148
|
+
text-orientation: upright;
|
|
149
|
+
display: inline-flex;
|
|
150
|
+
align-items: center; justify-content: center;
|
|
151
|
+
width: 56px; height: 72px;
|
|
152
|
+
border: 2px solid var(--vermillion);
|
|
153
|
+
color: var(--vermillion);
|
|
154
|
+
font-size: 24px; font-family: var(--serif);
|
|
155
|
+
font-weight: 900; letter-spacing: 2px;
|
|
156
|
+
margin: 0 auto 40px; border-radius: 4px;
|
|
157
|
+
line-height: 1;
|
|
158
|
+
}
|
|
144
159
|
.h-about-block {
|
|
145
160
|
margin-bottom: 40px; padding: 32px;
|
|
146
161
|
background: var(--surface);
|
|
@@ -9,7 +9,7 @@ import { useHorizontalScroll } from '../composables/useHorizontalScroll'
|
|
|
9
9
|
import BookCard from '../components/BookCard.vue'
|
|
10
10
|
import SideNav from '../components/SideNav.vue'
|
|
11
11
|
import ReadingToolbar from '../components/ReadingToolbar.vue'
|
|
12
|
-
import
|
|
12
|
+
import { useSiteConfig } from '../composables/useSiteConfig'
|
|
13
13
|
import type { BookMeta } from '../types'
|
|
14
14
|
|
|
15
15
|
const { scale, books, singleBook, loadLibrary } = useLibrary()
|
|
@@ -36,6 +36,7 @@ if (scale.value === 'single-piece' && singleBook.value) {
|
|
|
36
36
|
|
|
37
37
|
const router = useRouter()
|
|
38
38
|
const { layout } = useReadingMode()
|
|
39
|
+
const { logoUrl } = useSiteConfig()
|
|
39
40
|
const isVertical = computed(() => layout.value === 'vertical')
|
|
40
41
|
const vPageRef = ref<HTMLElement | null>(null)
|
|
41
42
|
const vScroll = useHorizontalScroll(vPageRef)
|
|
@@ -106,7 +107,8 @@ function openBook(bookId: string) {
|
|
|
106
107
|
<!-- ═══════ 橫排模式 ═══════ -->
|
|
107
108
|
<div v-else class="lib-root">
|
|
108
109
|
<header class="lib-hero">
|
|
109
|
-
<img :src="
|
|
110
|
+
<img v-if="logoUrl" :src="logoUrl" alt="" class="lib-logo" />
|
|
111
|
+
<div v-else class="lib-seal">漢流</div>
|
|
110
112
|
<h1>古典詩文圖書館</h1>
|
|
111
113
|
<p class="lib-subtitle">Classical Chinese Text Library</p>
|
|
112
114
|
<div class="lib-stats-bar">
|
|
@@ -114,6 +116,7 @@ function openBook(bookId: string) {
|
|
|
114
116
|
<span class="lib-stat-sep">·</span>
|
|
115
117
|
<span class="lib-stat">{{ totalPieces }} 篇</span>
|
|
116
118
|
</div>
|
|
119
|
+
<router-link to="/about" class="lib-about-link">關於</router-link>
|
|
117
120
|
</header>
|
|
118
121
|
<div v-for="group in groupedBooks" :key="group.category" class="lib-group">
|
|
119
122
|
<h2 class="lib-group-title">{{ group.category }}</h2>
|
|
@@ -274,6 +277,22 @@ function openBook(bookId: string) {
|
|
|
274
277
|
object-fit: contain;
|
|
275
278
|
margin-bottom: 24px;
|
|
276
279
|
}
|
|
280
|
+
.lib-seal {
|
|
281
|
+
writing-mode: vertical-rl;
|
|
282
|
+
text-orientation: upright;
|
|
283
|
+
display: inline-flex;
|
|
284
|
+
align-items: center;
|
|
285
|
+
justify-content: center;
|
|
286
|
+
width: 40px; height: 56px;
|
|
287
|
+
border: 2px solid var(--vermillion);
|
|
288
|
+
color: var(--vermillion);
|
|
289
|
+
font-size: 20px;
|
|
290
|
+
font-family: var(--serif);
|
|
291
|
+
letter-spacing: 2px;
|
|
292
|
+
margin-bottom: 24px;
|
|
293
|
+
border-radius: 4px;
|
|
294
|
+
line-height: 1;
|
|
295
|
+
}
|
|
277
296
|
.lib-hero h1 {
|
|
278
297
|
font-size: 36px;
|
|
279
298
|
font-weight: 700;
|
|
@@ -300,6 +319,24 @@ function openBook(bookId: string) {
|
|
|
300
319
|
}
|
|
301
320
|
.lib-stat-sep { color: var(--border); }
|
|
302
321
|
|
|
322
|
+
.lib-about-link {
|
|
323
|
+
display: inline-block;
|
|
324
|
+
margin-top: 16px;
|
|
325
|
+
font-family: var(--sans);
|
|
326
|
+
font-size: 13px;
|
|
327
|
+
color: var(--ink-faint);
|
|
328
|
+
letter-spacing: 2px;
|
|
329
|
+
text-decoration: none;
|
|
330
|
+
padding: 4px 12px;
|
|
331
|
+
border: 1px solid var(--border-light);
|
|
332
|
+
border-radius: 4px;
|
|
333
|
+
transition: all 0.2s;
|
|
334
|
+
}
|
|
335
|
+
.lib-about-link:hover {
|
|
336
|
+
color: var(--ink);
|
|
337
|
+
border-color: var(--ink);
|
|
338
|
+
}
|
|
339
|
+
|
|
303
340
|
.lib-group { margin-bottom: 40px; }
|
|
304
341
|
.lib-group-title {
|
|
305
342
|
font-size: 15px;
|