重构Presentation组件为内置css样式,美化默认效果

This commit is contained in:
jingrow 2025-09-03 16:06:27 +08:00
parent 6ef8b9fe41
commit 8810bd753c
4 changed files with 84 additions and 115 deletions

View File

@ -1,45 +0,0 @@
/* Jingrow 图标定义 */
.jingrow-icon {
display: inline-block;
width: 1.5em;
height: 1.5em;
vertical-align: middle;
margin-right: 0.5em;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0.00 0.00 128.00 128.00'%3E%3Cg stroke-width='2.00' fill='none' stroke-linecap='butt'%3E%3Cpath stroke='%238fe3b1' vector-effect='non-scaling-stroke' d='M 64.04 34.07 Q 64.93 34.07 65.55 34.69 Q 74.55 43.60 82.91 51.96 C 87.46 56.52 91.92 55.95 98.45 55.81 A 2.52 2.52 0.0 0 0 100.92 53.29 L 100.92 49.89 A 2.56 2.55 -1.5 0 0 98.23 47.34 C 95.84 47.46 91.15 47.62 89.22 45.67 Q 81.61 37.99 68.36 24.99 Q 66.43 23.09 64.04 23.09 Q 61.66 23.09 59.72 24.99 Q 46.47 37.98 38.85 45.66 C 36.92 47.61 32.23 47.45 29.84 47.32 A 2.56 2.55 1.5 0 0 27.15 49.87 L 27.15 53.27 A 2.52 2.52 0.0 0 0 29.62 55.79 C 36.15 55.94 40.61 56.51 45.16 51.95 Q 53.53 43.60 62.53 34.69 Q 63.15 34.07 64.04 34.07'%3E%3C/path%3E%3Cpath stroke='%238fe3b1' vector-effect='non-scaling-stroke' d='M 64.04 101.46 C 66.42 101.46 68.47 101.10 68.47 98.24 Q 68.49 75.28 68.49 72.56 A 0.61 0.61 0.0 0 1 69.10 71.95 L 89.64 71.95 A 2.50 2.50 0.0 0 0 92.14 69.45 L 92.14 65.73 A 2.28 2.28 0.0 0 0 89.86 63.45 L 69.10 63.45 A 0.61 0.61 0.0 0 1 68.49 62.84 L 68.49 50.37 A 3.05 3.03 2.1 0 0 65.67 47.34 Q 65.14 47.31 64.03 47.31 Q 62.93 47.31 62.40 47.34 A 3.05 3.03 -2.1 0 0 59.58 50.37 L 59.58 62.84 A 0.61 0.61 0.0 0 1 58.97 63.45 L 38.21 63.45 A 2.28 2.28 0.0 0 0 35.93 65.73 L 35.93 69.45 A 2.50 2.50 0.0 0 0 38.43 71.95 L 58.97 71.95 A 0.61 0.61 0.0 0 1 59.58 72.56 Q 59.58 75.28 59.60 98.24 C 59.60 101.10 61.65 101.46 64.04 101.46'%3E%3C/path%3E%3C/g%3E%3Cpath fill='%231fc76f' d='M 115.34 95.08 A 19.82 19.82 0.0 0 1 95.52 114.90 L 32.48 114.90 A 19.82 19.82 0.0 0 1 12.66 95.08 L 12.66 32.88 A 19.82 19.82 0.0 0 1 32.48 13.06 L 95.52 13.06 A 19.82 19.82 0.0 0 1 115.34 32.88 L 115.34 95.08 Z M 64.04 34.07 Q 64.93 34.07 65.55 34.69 Q 74.55 43.60 82.91 51.96 C 87.46 56.52 91.92 55.95 98.45 55.81 A 2.52 2.52 0.0 0 0 100.92 53.29 L 100.92 49.89 A 2.56 2.55 -1.5 0 0 98.23 47.34 C 95.84 47.46 91.15 47.62 89.22 45.67 Q 81.61 37.99 68.36 24.99 Q 66.43 23.09 64.04 23.09 Q 61.66 23.09 59.72 24.99 Q 46.47 37.98 38.85 45.66 C 36.92 47.61 32.23 47.45 29.84 47.32 A 2.56 2.55 1.5 0 0 27.15 49.87 L 27.15 53.27 A 2.52 2.52 0.0 0 0 29.62 55.79 C 36.15 55.94 40.61 56.51 45.16 51.95 Q 53.53 43.60 62.53 34.69 Q 63.15 34.07 64.04 34.07 Z M 64.04 101.46 C 66.42 101.46 68.47 101.10 68.47 98.24 Q 68.49 75.28 68.49 72.56 A 0.61 0.61 0.0 0 1 69.10 71.95 L 89.64 71.95 A 2.50 2.50 0.0 0 0 92.14 69.45 L 92.14 65.73 A 2.28 2.28 0.0 0 0 89.86 63.45 L 69.10 63.45 A 0.61 0.61 0.0 0 1 68.49 62.84 L 68.49 50.37 A 3.05 3.03 2.1 0 0 65.67 47.34 Q 65.14 47.31 64.03 47.31 Q 62.93 47.31 62.40 47.34 A 3.05 3.03 -2.1 0 0 59.58 50.37 L 59.58 62.84 A 0.61 0.61 0.0 0 1 58.97 63.45 L 38.21 63.45 A 2.28 2.28 0.0 0 0 35.93 65.73 L 35.93 69.45 A 2.50 2.50 0.0 0 0 38.43 71.95 L 58.97 71.95 A 0.61 0.61 0.0 0 1 59.58 72.56 Q 59.58 75.28 59.60 98.24 C 59.60 101.10 61.65 101.46 64.04 101.46 Z'%3E%3C/path%3E%3Cpath fill='%23fffef2' d='M 64.04 23.09 Q 66.43 23.09 68.36 24.99 Q 81.61 37.99 89.22 45.67 C 91.15 47.62 95.84 47.46 98.23 47.34 A 2.56 2.55 -1.5 0 1 100.92 49.89 L 100.92 53.29 A 2.52 2.52 0.0 0 1 98.45 55.81 C 91.92 55.95 87.46 56.52 82.91 51.96 Q 74.55 43.60 65.55 34.69 Q 64.93 34.07 64.04 34.07 Q 63.15 34.07 62.53 34.69 Q 53.53 43.60 45.16 51.95 C 40.61 56.51 36.15 55.94 29.62 55.79 A 2.52 2.52 0.0 0 1 27.15 53.27 L 27.15 49.87 A 2.56 2.55 1.5 0 1 29.84 47.32 C 32.23 47.45 36.92 47.61 38.85 45.66 Q 46.47 37.98 59.72 24.99 Q 61.66 23.09 64.04 23.09 Z'%3E%3C/path%3E%3Cpath fill='%23fffef2' d='M 64.03 47.31 Q 65.14 47.31 65.67 47.34 A 3.05 3.03 2.1 0 1 68.49 50.37 L 68.49 62.84 A 0.61 0.61 0.0 0 0 69.10 63.45 L 89.86 63.45 A 2.28 2.28 0.0 0 1 92.14 65.73 L 92.14 69.45 A 2.50 2.50 0.0 0 1 89.64 71.95 L 69.10 71.95 A 0.61 0.61 0.0 0 0 68.49 72.56 Q 68.49 75.28 68.47 98.24 C 68.47 101.10 66.42 101.46 64.04 101.46 C 61.65 101.46 59.60 101.10 59.60 98.24 Q 59.58 75.28 59.58 72.56 A 0.61 0.61 0.0 0 0 58.97 71.95 L 38.43 71.95 A 2.50 2.50 0.0 0 1 35.93 69.45 L 35.93 65.73 A 2.28 2.28 0.0 0 1 38.21 63.45 L 58.97 63.45 A 0.61 0.61 0.0 0 0 59.58 62.84 L 59.58 50.37 A 3.05 3.03 -2.1 0 1 62.40 47.34 Q 62.93 47.31 64.03 47.31 Z'%3E%3C/path%3E%3C/svg%3E");
background-repeat: no-repeat;
background-size: contain;
}
.jingrow-icon-large {
width: 2em;
height: 2em;
}
/* 容器布局样式 */
.reveal-container {
height: 100vh;
width: 100%;
position: fixed;
top: 0;
left: 0;
z-index: 1000;
}
.reveal-container .reveal {
height: 100% !important;
width: 100% !important;
}
.reveal-container .reveal .slides {
height: 100% !important;
}
.reveal-container .reveal .slides section {
height: 100% !important;
display: flex !important;
flex-direction: column !important;
justify-content: center !important;
align-items: center !important;
text-align: center !important;
padding: 2rem !important;
}

View File

@ -4,7 +4,6 @@ import { useEffect, useRef, useState, useCallback, useMemo } from 'react';
import Reveal from 'reveal.js';
import 'reveal.js/dist/reveal.css';
import { marked } from 'marked';
import './Presentation.css';
//
const loadTheme = async (themeName) => {
@ -97,13 +96,8 @@ export default function Presentation({ data }) {
return parseContentSlides(data);
}
// content 使 items
const items = data.items || [];
if (items.length === 0) {
return parseSingleSlide(data);
}
return parseItemsSlides(items);
// content
return `<section><h1>${data.title || '演示文稿'}</h1><p>暂无内容</p></section>`;
} catch (err) {
console.error('解析幻灯片内容失败:', err);
return `<section><h1>解析错误</h1><p>内容解析失败,请检查数据格式</p></section>`;
@ -140,56 +134,6 @@ export default function Presentation({ data }) {
}).join('');
};
//
const parseSingleSlide = (data) => {
return `<section>
<h1>${data.title || '演示文稿'}</h1>
${data.subtitle ? `<p class="lead">${data.subtitle}</p>` : ''}
${data.description ? `<div class="mt-4">${marked(data.description)}</div>` : ''}
${data.image ? `<img src="${data.image}" alt="${data.title}" style="max-width: 100%; height: auto; margin: 1rem 0;" />` : ''}
</section>`;
};
// items
const parseItemsSlides = (items) => {
return items.map((item, index) => {
const slideContent = [];
if (item.item_title) {
slideContent.push(`<h1>${item.item_title}</h1>`);
}
if (item.item_subtitle) {
slideContent.push(`<p class="lead">${item.item_subtitle}</p>`);
}
if (item.item_description) {
slideContent.push(`<div class="mt-4">${marked(item.item_description)}</div>`);
}
if (item.item_image) {
slideContent.push(`<img src="${item.item_image}" alt="${item.item_title || 'Slide'}" style="max-width: 100%; height: auto; margin: 1rem 0;" />`);
}
if (item.item_video_src) {
slideContent.push(`<video controls style="max-width: 100%; height: auto; margin: 1rem 0;">
<source src="${item.item_video_src}" type="video/mp4">
您的浏览器不支持视频播放
</video>`);
}
if (item.item_button_text && item.item_button_link) {
slideContent.push(`<div class="mt-6">
<a href="${item.item_button_link}" class="btn btn-primary" target="_blank" rel="noopener noreferrer">
${item.item_button_text}
</a>
</div>`);
}
return `<section>${slideContent.join('')}</section>`;
}).join('');
};
// Reveal.js
const initializeReveal = useCallback(async () => {
if (!deckRef.current || !data) return;
@ -217,7 +161,6 @@ export default function Presentation({ data }) {
setError(null);
} catch (err) {
console.error('Reveal.js初始化失败:', err);
setError('PPT初始化失败请刷新页面重试');
}
}, [data, parseMarkdownToSlides]);
@ -263,17 +206,72 @@ export default function Presentation({ data }) {
}
return (
<div className="reveal-container">
<div
ref={deckRef}
className="reveal"
>
<div className="slides">
<section>
<p>正在加载内容...</p>
</section>
<>
<div className="reveal-container">
<div
ref={deckRef}
className="reveal"
>
<div className="slides">
<section>
<p>正在加载内容...</p>
</section>
</div>
</div>
</div>
</div>
<style jsx global>{`
.reveal-container {
height: 100vh;
width: 100%;
position: fixed;
top: 0;
left: 0;
z-index: 1000;
}
.reveal-container .reveal {
height: 100% !important;
width: 100% !important;
}
.reveal-container .reveal .slides {
height: 100% !important;
}
.reveal-container .reveal .slides section {
height: 100% !important;
display: flex !important;
flex-direction: column !important;
justify-content: center !important;
align-items: center !important;
text-align: center !important;
padding: 2rem !important;
box-sizing: border-box !important;
}
.reveal-container .reveal .slides section > * {
margin: 0.5rem 0 !important;
}
.reveal-container .reveal .slides section h1,
.reveal-container .reveal .slides section h2,
.reveal-container .reveal .slides section h3 {
margin-bottom: 1rem !important;
}
.reveal-container .reveal .slides section p {
margin: 0.5rem 0 !important;
line-height: 1.6 !important;
}
.reveal-container .reveal .slides section img,
.reveal-container .reveal .slides section video {
max-width: 100% !important;
height: auto !important;
margin: 1rem 0 !important;
}
`}</style>
</>
);
}

View File

@ -1,6 +1,22 @@
/* Jingrow 自定义主题 */
@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap');
.jingrow-icon {
display: inline-block;
width: 1.5em;
height: 1.5em;
vertical-align: middle;
margin-right: 0.5em;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0.00 0.00 128.00 128.00'%3E%3Cg stroke-width='2.00' fill='none' stroke-linecap='butt'%3E%3Cpath stroke='%238fe3b1' vector-effect='non-scaling-stroke' d='M 64.04 34.07 Q 64.93 34.07 65.55 34.69 Q 74.55 43.60 82.91 51.96 C 87.46 56.52 91.92 55.95 98.45 55.81 A 2.52 2.52 0.0 0 0 100.92 53.29 L 100.92 49.89 A 2.56 2.55 -1.5 0 0 98.23 47.34 C 95.84 47.46 91.15 47.62 89.22 45.67 Q 81.61 37.99 68.36 24.99 Q 66.43 23.09 64.04 23.09 Q 61.66 23.09 59.72 24.99 Q 46.47 37.98 38.85 45.66 C 36.92 47.61 32.23 47.45 29.84 47.32 A 2.56 2.55 1.5 0 0 27.15 49.87 L 27.15 53.27 A 2.52 2.52 0.0 0 0 29.62 55.79 C 36.15 55.94 40.61 56.51 45.16 51.95 Q 53.53 43.60 62.53 34.69 Q 63.15 34.07 64.04 34.07'%3E%3C/path%3E%3Cpath stroke='%238fe3b1' vector-effect='non-scaling-stroke' d='M 64.04 101.46 C 66.42 101.46 68.47 101.10 68.47 98.24 Q 68.49 75.28 68.49 72.56 A 0.61 0.61 0.0 0 1 69.10 71.95 L 89.64 71.95 A 2.50 2.50 0.0 0 0 92.14 69.45 L 92.14 65.73 A 2.28 2.28 0.0 0 0 89.86 63.45 L 69.10 63.45 A 0.61 0.61 0.0 0 1 68.49 62.84 L 68.49 50.37 A 3.05 3.03 2.1 0 0 65.67 47.34 Q 65.14 47.31 64.03 47.31 Q 62.93 47.31 62.40 47.34 A 3.05 3.03 -2.1 0 0 59.58 50.37 L 59.58 62.84 A 0.61 0.61 0.0 0 1 58.97 63.45 L 38.21 63.45 A 2.28 2.28 0.0 0 0 35.93 65.73 L 35.93 69.45 A 2.50 2.50 0.0 0 0 38.43 71.95 L 58.97 71.95 A 0.61 0.61 0.0 0 1 59.58 72.56 Q 59.58 75.28 59.60 98.24 C 59.60 101.10 61.65 101.46 64.04 101.46'%3E%3C/path%3E%3C/g%3E%3Cpath fill='%231fc76f' d='M 115.34 95.08 A 19.82 19.82 0.0 0 1 95.52 114.90 L 32.48 114.90 A 19.82 19.82 0.0 0 1 12.66 95.08 L 12.66 32.88 A 19.82 19.82 0.0 0 1 32.48 13.06 L 95.52 13.06 A 19.82 19.82 0.0 0 1 115.34 32.88 L 115.34 95.08 Z M 64.04 34.07 Q 64.93 34.07 65.55 34.69 Q 74.55 43.60 82.91 51.96 C 87.46 56.52 91.92 55.95 98.45 55.81 A 2.52 2.52 0.0 0 0 100.92 53.29 L 100.92 49.89 A 2.56 2.55 -1.5 0 0 98.23 47.34 C 95.84 47.46 91.15 47.62 89.22 45.67 Q 81.61 37.99 68.36 24.99 Q 66.43 23.09 64.04 23.09 Q 61.66 23.09 59.72 24.99 Q 46.47 37.98 38.85 45.66 C 36.92 47.61 32.23 47.45 29.84 47.32 A 2.56 2.55 1.5 0 0 27.15 49.87 L 27.15 53.27 A 2.52 2.52 0.0 0 0 29.62 55.79 C 36.15 55.94 40.61 56.51 45.16 51.95 Q 53.53 43.60 62.53 34.69 Q 63.15 34.07 64.04 34.07 Z M 64.04 101.46 C 66.42 101.46 68.47 101.10 68.47 98.24 Q 68.49 75.28 68.49 72.56 A 0.61 0.61 0.0 0 1 69.10 71.95 L 89.64 71.95 A 2.50 2.50 0.0 0 0 92.14 69.45 L 92.14 65.73 A 2.28 2.28 0.0 0 0 89.86 63.45 L 69.10 63.45 A 0.61 0.61 0.0 0 1 68.49 62.84 L 68.49 50.37 A 3.05 3.03 2.1 0 0 65.67 47.34 Q 65.14 47.31 64.03 47.31 Q 62.93 47.31 62.40 47.34 A 3.05 3.03 -2.1 0 0 59.58 50.37 L 59.58 62.84 A 0.61 0.61 0.0 0 1 58.97 63.45 L 38.21 63.45 A 2.28 2.28 0.0 0 0 35.93 65.73 L 35.93 69.45 A 2.50 2.50 0.0 0 0 38.43 71.95 L 58.97 71.95 A 0.61 0.61 0.0 0 1 59.58 72.56 Q 59.58 75.28 59.60 98.24 C 59.60 101.10 61.65 101.46 64.04 101.46 Z'%3E%3C/path%3E%3Cpath fill='%23fffef2' d='M 64.04 23.09 Q 66.43 23.09 68.36 24.99 Q 81.61 37.99 89.22 45.67 C 91.15 47.62 95.84 47.46 98.23 47.34 A 2.56 2.55 -1.5 0 1 100.92 49.89 L 100.92 53.29 A 2.52 2.52 0.0 0 1 98.45 55.81 C 91.92 55.95 87.46 56.52 82.91 51.96 Q 74.55 43.60 65.55 34.69 Q 64.93 34.07 64.04 34.07 Q 63.15 34.07 62.53 34.69 Q 53.53 43.60 45.16 51.95 C 40.61 56.51 36.15 55.94 29.62 55.79 A 2.52 2.52 0.0 0 1 27.15 53.27 L 27.15 49.87 A 2.56 2.55 1.5 0 1 29.84 47.32 C 32.23 47.45 36.92 47.61 38.85 45.66 Q 46.47 37.98 59.72 24.99 Q 61.66 23.09 64.04 23.09 Z'%3E%3C/path%3E%3Cpath fill='%23fffef2' d='M 64.03 47.31 Q 65.14 47.31 65.67 47.34 A 3.05 3.03 2.1 0 1 68.49 50.37 L 68.49 62.84 A 0.61 0.61 0.0 0 0 69.10 63.45 L 89.86 63.45 A 2.28 2.28 0.0 0 1 92.14 65.73 L 92.14 69.45 A 2.50 2.50 0.0 0 1 89.64 71.95 L 69.10 71.95 A 0.61 0.61 0.0 0 0 68.49 72.56 Q 68.49 75.28 68.47 98.24 C 68.47 101.10 66.42 101.46 64.04 101.46 C 61.65 101.46 59.60 101.10 59.60 98.24 Q 59.58 75.28 59.58 72.56 A 0.61 0.61 0.0 0 0 58.97 71.95 L 38.43 71.95 A 2.50 2.50 0.0 0 1 35.93 69.45 L 35.93 65.73 A 2.28 2.28 0.0 0 1 38.21 63.45 L 58.97 63.45 A 0.61 0.61 0.0 0 0 59.58 62.84 L 59.58 50.37 A 3.05 3.03 -2.1 0 1 62.40 47.34 Q 62.93 47.31 64.03 47.31 Z'%3E%3C/path%3E%3C/svg%3E");
background-repeat: no-repeat;
background-size: contain;
}
.jingrow-icon-large {
width: 2em;
height: 2em;
}
.reveal {
font-family: 'Manrope', sans-serif;
font-size: 24px;

View File

@ -1,5 +1,5 @@
---
theme: white
theme: jingrow
backgroundTransition: slide
transition: slide
---