@ncukondo/slide-generation 0.1.0 → 0.2.0
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/README.md +105 -0
- package/README_ja.md +104 -0
- package/dist/cli/index.js +5392 -970
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.js +65 -3
- package/dist/index.js.map +1 -1
- package/icons/fetched/.gitkeep +0 -0
- package/icons/registry.yaml +263 -8
- package/package.json +8 -2
- package/templates/layouts/before-after.yaml +139 -0
- package/templates/layouts/image-caption.yaml +78 -0
- package/templates/layouts/image-full.yaml +106 -0
package/icons/registry.yaml
CHANGED
|
@@ -3,20 +3,33 @@
|
|
|
3
3
|
|
|
4
4
|
# Icon source definitions
|
|
5
5
|
sources:
|
|
6
|
-
# Material Icons (Web Font)
|
|
6
|
+
# Material Icons (Web Font) - Classic Google icons
|
|
7
7
|
- name: material-icons
|
|
8
8
|
type: web-font
|
|
9
9
|
prefix: mi
|
|
10
10
|
url: "https://fonts.googleapis.com/icon?family=Material+Icons"
|
|
11
11
|
render: '<span class="material-icons" style="{{ style }}">{{ name }}</span>'
|
|
12
12
|
|
|
13
|
-
#
|
|
13
|
+
# Material Symbols (SVG via Iconify) - New Google icons with more variants
|
|
14
|
+
- name: material-symbols
|
|
15
|
+
type: svg-inline
|
|
16
|
+
prefix: ms
|
|
17
|
+
url: "https://api.iconify.design/material-symbols/{name}.svg"
|
|
18
|
+
|
|
19
|
+
# Health Icons - Medical and health-focused icons
|
|
20
|
+
# Source: https://healthicons.org/
|
|
21
|
+
- name: healthicons
|
|
22
|
+
type: svg-inline
|
|
23
|
+
prefix: health
|
|
24
|
+
url: "https://api.iconify.design/healthicons/{name}.svg"
|
|
25
|
+
|
|
26
|
+
# Heroicons (SVG CDN) - Beautiful hand-crafted icons
|
|
14
27
|
- name: heroicons
|
|
15
28
|
type: svg-inline
|
|
16
29
|
prefix: hero
|
|
17
30
|
url: "https://unpkg.com/heroicons@2.0.0/24/outline/{name}.svg"
|
|
18
31
|
|
|
19
|
-
# Iconify (Universal SVG CDN)
|
|
32
|
+
# Iconify (Universal SVG CDN) - Access to 100+ icon sets
|
|
20
33
|
- name: iconify
|
|
21
34
|
type: svg-inline
|
|
22
35
|
prefix: iconify
|
|
@@ -28,50 +41,292 @@ sources:
|
|
|
28
41
|
prefix: custom
|
|
29
42
|
path: "./icons/custom/"
|
|
30
43
|
|
|
44
|
+
# Fetched icons (auto-saved from external sources)
|
|
45
|
+
# Icons are saved locally for offline use and reproducibility
|
|
46
|
+
- name: fetched
|
|
47
|
+
type: local-svg
|
|
48
|
+
prefix: fetched
|
|
49
|
+
path: "./icons/fetched/"
|
|
50
|
+
|
|
31
51
|
# Semantic aliases - map meaningful names to actual icons
|
|
52
|
+
# AIはこれらのエイリアスを使用してアイコンを選択します
|
|
32
53
|
aliases:
|
|
33
|
-
#
|
|
54
|
+
# === アクション系 ===
|
|
34
55
|
planning: "mi:event_note"
|
|
35
56
|
action: "mi:play_arrow"
|
|
36
57
|
analysis: "mi:analytics"
|
|
37
58
|
improvement: "mi:trending_up"
|
|
59
|
+
start: "mi:play_circle"
|
|
60
|
+
stop: "mi:stop_circle"
|
|
61
|
+
pause: "mi:pause_circle"
|
|
62
|
+
restart: "mi:replay"
|
|
63
|
+
save: "mi:save"
|
|
64
|
+
edit: "mi:edit"
|
|
65
|
+
delete: "mi:delete"
|
|
66
|
+
add: "mi:add_circle"
|
|
67
|
+
remove: "mi:remove_circle"
|
|
68
|
+
search: "mi:search"
|
|
69
|
+
filter: "mi:filter_list"
|
|
70
|
+
sort: "mi:sort"
|
|
71
|
+
refresh: "mi:refresh"
|
|
72
|
+
sync: "mi:sync"
|
|
73
|
+
upload: "mi:upload"
|
|
74
|
+
download: "mi:download"
|
|
75
|
+
share: "mi:share"
|
|
76
|
+
copy: "mi:content_copy"
|
|
77
|
+
paste: "mi:content_paste"
|
|
78
|
+
print: "mi:print"
|
|
79
|
+
export: "mi:file_download"
|
|
80
|
+
import: "mi:file_upload"
|
|
38
81
|
|
|
39
|
-
#
|
|
82
|
+
# === ステータス系 ===
|
|
40
83
|
success: "mi:check_circle"
|
|
41
84
|
warning: "mi:warning"
|
|
42
85
|
error: "mi:error"
|
|
43
86
|
info: "mi:info"
|
|
87
|
+
question: "mi:help"
|
|
88
|
+
pending: "mi:hourglass_empty"
|
|
89
|
+
in-progress: "mi:autorenew"
|
|
90
|
+
completed: "mi:task_alt"
|
|
91
|
+
cancelled: "mi:cancel"
|
|
92
|
+
approved: "mi:verified"
|
|
93
|
+
rejected: "mi:block"
|
|
44
94
|
|
|
45
|
-
#
|
|
95
|
+
# === オブジェクト系 ===
|
|
46
96
|
document: "mi:description"
|
|
47
97
|
folder: "mi:folder"
|
|
98
|
+
file: "mi:insert_drive_file"
|
|
48
99
|
database: "mi:storage"
|
|
49
100
|
settings: "mi:settings"
|
|
101
|
+
config: "mi:tune"
|
|
102
|
+
calendar: "mi:calendar_today"
|
|
103
|
+
clock: "mi:schedule"
|
|
104
|
+
timer: "mi:timer"
|
|
105
|
+
alarm: "mi:alarm"
|
|
106
|
+
bookmark: "mi:bookmark"
|
|
107
|
+
star: "mi:star"
|
|
108
|
+
heart: "mi:favorite"
|
|
109
|
+
flag: "mi:flag"
|
|
110
|
+
tag: "mi:label"
|
|
111
|
+
link: "mi:link"
|
|
112
|
+
attachment: "mi:attach_file"
|
|
113
|
+
image: "mi:image"
|
|
114
|
+
video: "mi:videocam"
|
|
115
|
+
audio: "mi:audiotrack"
|
|
116
|
+
code: "mi:code"
|
|
117
|
+
terminal: "mi:terminal"
|
|
118
|
+
cloud: "mi:cloud"
|
|
119
|
+
server: "mi:dns"
|
|
120
|
+
network: "mi:lan"
|
|
121
|
+
security: "mi:security"
|
|
122
|
+
lock: "mi:lock"
|
|
123
|
+
unlock: "mi:lock_open"
|
|
124
|
+
key: "mi:vpn_key"
|
|
50
125
|
|
|
51
|
-
#
|
|
126
|
+
# === ナビゲーション系 ===
|
|
52
127
|
home: "mi:home"
|
|
53
128
|
back: "mi:arrow_back"
|
|
54
129
|
forward: "mi:arrow_forward"
|
|
55
130
|
up: "mi:arrow_upward"
|
|
56
131
|
down: "mi:arrow_downward"
|
|
132
|
+
left: "mi:chevron_left"
|
|
133
|
+
right: "mi:chevron_right"
|
|
134
|
+
expand: "mi:expand_more"
|
|
135
|
+
collapse: "mi:expand_less"
|
|
136
|
+
menu: "mi:menu"
|
|
137
|
+
close: "mi:close"
|
|
138
|
+
fullscreen: "mi:fullscreen"
|
|
139
|
+
minimize: "mi:minimize"
|
|
140
|
+
maximize: "mi:crop_square"
|
|
57
141
|
|
|
58
|
-
#
|
|
142
|
+
# === コミュニケーション系 ===
|
|
59
143
|
email: "mi:email"
|
|
60
144
|
phone: "mi:phone"
|
|
61
145
|
chat: "mi:chat"
|
|
146
|
+
message: "mi:message"
|
|
62
147
|
notification: "mi:notifications"
|
|
148
|
+
announcement: "mi:campaign"
|
|
149
|
+
feedback: "mi:feedback"
|
|
150
|
+
comment: "mi:comment"
|
|
151
|
+
forum: "mi:forum"
|
|
152
|
+
support: "mi:support_agent"
|
|
153
|
+
|
|
154
|
+
# === 人物・組織系 ===
|
|
155
|
+
person: "mi:person"
|
|
156
|
+
people: "mi:people"
|
|
157
|
+
group: "mi:group"
|
|
158
|
+
team: "mi:groups"
|
|
159
|
+
organization: "mi:business"
|
|
160
|
+
company: "mi:domain"
|
|
161
|
+
department: "mi:account_tree"
|
|
162
|
+
leader: "mi:supervisor_account"
|
|
163
|
+
meeting: "mi:event"
|
|
164
|
+
presentation: "mi:slideshow"
|
|
165
|
+
|
|
166
|
+
# === ビジネス・プロセス系 ===
|
|
167
|
+
workflow: "mi:account_tree"
|
|
168
|
+
process: "mi:linear_scale"
|
|
169
|
+
cycle: "mi:autorenew"
|
|
170
|
+
flowchart: "mi:schema"
|
|
171
|
+
hierarchy: "mi:account_tree"
|
|
172
|
+
milestone: "mi:flag"
|
|
173
|
+
target: "mi:gps_fixed"
|
|
174
|
+
goal: "mi:emoji_events"
|
|
175
|
+
kpi: "mi:speed"
|
|
176
|
+
metric: "mi:bar_chart"
|
|
177
|
+
report: "mi:assessment"
|
|
178
|
+
dashboard: "mi:dashboard"
|
|
179
|
+
chart: "mi:insert_chart"
|
|
180
|
+
graph: "mi:show_chart"
|
|
181
|
+
table: "mi:table_chart"
|
|
182
|
+
list: "mi:list"
|
|
183
|
+
grid: "mi:grid_view"
|
|
184
|
+
kanban: "mi:view_kanban"
|
|
185
|
+
timeline: "mi:timeline"
|
|
186
|
+
roadmap: "mi:map"
|
|
187
|
+
strategy: "mi:lightbulb"
|
|
188
|
+
idea: "mi:lightbulb"
|
|
189
|
+
innovation: "mi:auto_awesome"
|
|
190
|
+
research: "mi:science"
|
|
191
|
+
experiment: "mi:biotech"
|
|
192
|
+
development: "mi:developer_mode"
|
|
193
|
+
launch: "mi:rocket_launch"
|
|
194
|
+
growth: "mi:trending_up"
|
|
195
|
+
profit: "mi:attach_money"
|
|
196
|
+
cost: "mi:money_off"
|
|
197
|
+
budget: "mi:account_balance_wallet"
|
|
198
|
+
investment: "mi:savings"
|
|
199
|
+
risk: "mi:warning"
|
|
200
|
+
opportunity: "mi:lightbulb"
|
|
201
|
+
|
|
202
|
+
# === 教育・学習系 ===
|
|
203
|
+
education: "mi:school"
|
|
204
|
+
learning: "mi:menu_book"
|
|
205
|
+
training: "mi:fitness_center"
|
|
206
|
+
course: "mi:class"
|
|
207
|
+
lesson: "mi:book"
|
|
208
|
+
quiz: "mi:quiz"
|
|
209
|
+
exam: "mi:assignment"
|
|
210
|
+
certificate: "mi:workspace_premium"
|
|
211
|
+
graduation: "mi:school"
|
|
212
|
+
knowledge: "mi:psychology"
|
|
213
|
+
skill: "mi:construction"
|
|
214
|
+
|
|
215
|
+
# === 医療・健康系(Health Icons) ===
|
|
216
|
+
# 一般医療
|
|
217
|
+
medical: "health:health"
|
|
218
|
+
hospital: "health:hospital"
|
|
219
|
+
clinic: "health:clinic"
|
|
220
|
+
ambulance: "health:ambulance"
|
|
221
|
+
emergency: "health:emergency"
|
|
222
|
+
first-aid: "health:first-aid-kit"
|
|
223
|
+
|
|
224
|
+
# 人体・臓器
|
|
225
|
+
body: "health:body"
|
|
226
|
+
heart-organ: "health:heart-organ"
|
|
227
|
+
lungs: "health:lungs"
|
|
228
|
+
brain: "health:brain"
|
|
229
|
+
liver: "health:liver"
|
|
230
|
+
kidney: "health:kidneys"
|
|
231
|
+
stomach: "health:stomach"
|
|
232
|
+
intestine: "health:intestine"
|
|
233
|
+
bones: "health:bone"
|
|
234
|
+
blood: "health:blood-drop"
|
|
235
|
+
dna: "health:dna"
|
|
236
|
+
cells: "health:cells"
|
|
237
|
+
virus: "health:virus"
|
|
238
|
+
bacteria: "health:bacteria"
|
|
239
|
+
|
|
240
|
+
# 医療行為
|
|
241
|
+
diagnosis: "health:stethoscope"
|
|
242
|
+
stethoscope: "health:stethoscope"
|
|
243
|
+
syringe: "health:syringe"
|
|
244
|
+
injection: "health:syringe"
|
|
245
|
+
vaccine: "health:vaccines"
|
|
246
|
+
pill: "health:medicines"
|
|
247
|
+
medicine: "health:medicines"
|
|
248
|
+
prescription: "health:pharmacy"
|
|
249
|
+
pharmacy: "health:pharmacy"
|
|
250
|
+
surgery: "health:surgery"
|
|
251
|
+
operation: "health:surgery"
|
|
252
|
+
bandage: "health:bandage"
|
|
253
|
+
wheelchair: "health:wheelchair"
|
|
254
|
+
crutches: "health:crutches"
|
|
255
|
+
|
|
256
|
+
# 医療機器
|
|
257
|
+
xray: "health:x-ray"
|
|
258
|
+
ct-scan: "health:ct-scan"
|
|
259
|
+
mri: "health:mri"
|
|
260
|
+
ultrasound: "health:ultrasound"
|
|
261
|
+
ecg: "health:electrocardiogram"
|
|
262
|
+
microscope: "health:microscope"
|
|
263
|
+
lab: "health:laboratory"
|
|
264
|
+
test-tube: "health:test-tube"
|
|
265
|
+
|
|
266
|
+
# 医療従事者
|
|
267
|
+
doctor: "health:doctor-male"
|
|
268
|
+
nurse: "health:nurse"
|
|
269
|
+
dentist: "health:tooth"
|
|
270
|
+
patient: "health:patient"
|
|
271
|
+
|
|
272
|
+
# 健康・ウェルネス
|
|
273
|
+
health: "health:health"
|
|
274
|
+
wellness: "health:exercise"
|
|
275
|
+
exercise: "health:exercise"
|
|
276
|
+
nutrition: "health:fruit"
|
|
277
|
+
sleep: "health:sleep"
|
|
278
|
+
mental-health: "health:mental-health"
|
|
279
|
+
meditation: "health:meditation"
|
|
280
|
+
|
|
281
|
+
# 公衆衛生
|
|
282
|
+
mask: "health:face-mask"
|
|
283
|
+
sanitizer: "health:hand-sanitizer"
|
|
284
|
+
social-distance: "health:social-distance"
|
|
285
|
+
quarantine: "health:quarantine"
|
|
286
|
+
testing: "health:covid-test"
|
|
287
|
+
|
|
288
|
+
# === Material Symbols(新しいスタイル) ===
|
|
289
|
+
# Material Symbolsは ms: プレフィックスで直接指定も可能
|
|
290
|
+
# 例: ms:home, ms:settings, ms:person
|
|
63
291
|
|
|
64
292
|
# Color palette for icons
|
|
293
|
+
# テーマから継承可能、またはここで定義
|
|
65
294
|
colors:
|
|
295
|
+
# プライマリカラー
|
|
66
296
|
primary: "#1976D2"
|
|
67
297
|
secondary: "#424242"
|
|
68
298
|
accent: "#FF4081"
|
|
299
|
+
|
|
300
|
+
# セマンティックカラー
|
|
69
301
|
success: "#4CAF50"
|
|
70
302
|
warning: "#FF9800"
|
|
71
303
|
danger: "#F44336"
|
|
72
304
|
info: "#2196F3"
|
|
73
305
|
|
|
306
|
+
# ニュートラル
|
|
307
|
+
light: "#FAFAFA"
|
|
308
|
+
dark: "#212121"
|
|
309
|
+
muted: "#9E9E9E"
|
|
310
|
+
|
|
311
|
+
# 医療系カラー
|
|
312
|
+
medical-primary: "#0277BD"
|
|
313
|
+
medical-secondary: "#00838F"
|
|
314
|
+
medical-accent: "#00BCD4"
|
|
315
|
+
medical-emergency: "#D32F2F"
|
|
316
|
+
medical-success: "#388E3C"
|
|
317
|
+
|
|
74
318
|
# Default icon settings
|
|
75
319
|
defaults:
|
|
76
320
|
size: "24px"
|
|
77
321
|
color: "currentColor"
|
|
322
|
+
|
|
323
|
+
# テーマ連携設定
|
|
324
|
+
theme_integration:
|
|
325
|
+
# テーマカラーを自動的に継承
|
|
326
|
+
inherit_colors: true
|
|
327
|
+
|
|
328
|
+
# カラーマッピング(テーマ変数 → アイコンカラー)
|
|
329
|
+
color_mapping:
|
|
330
|
+
"--theme-primary": "primary"
|
|
331
|
+
"--theme-secondary": "secondary"
|
|
332
|
+
"--theme-accent": "accent"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ncukondo/slide-generation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A CLI tool to generate Marp-compatible Markdown from YAML source files",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -64,21 +64,27 @@
|
|
|
64
64
|
"packageManager": "pnpm@9.15.4",
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"chalk": "^5.4.1",
|
|
67
|
-
"chokidar": "^
|
|
67
|
+
"chokidar": "^3.6.0",
|
|
68
68
|
"commander": "^13.1.0",
|
|
69
69
|
"globby": "^14.0.2",
|
|
70
|
+
"image-size": "^2.0.2",
|
|
70
71
|
"nunjucks": "^3.2.4",
|
|
71
72
|
"ora": "^8.1.1",
|
|
73
|
+
"sharp": "^0.34.5",
|
|
72
74
|
"yaml": "^2.7.0",
|
|
73
75
|
"zod": "^3.24.1"
|
|
74
76
|
},
|
|
75
77
|
"devDependencies": {
|
|
76
78
|
"@types/node": "^22.10.7",
|
|
77
79
|
"@types/nunjucks": "^3.2.6",
|
|
80
|
+
"@types/sharp": "^0.32.0",
|
|
78
81
|
"oxfmt": "^0.23.0",
|
|
79
82
|
"oxlint": "^0.16.6",
|
|
80
83
|
"tsup": "^8.3.5",
|
|
81
84
|
"typescript": "^5.7.3",
|
|
82
85
|
"vitest": "^3.0.4"
|
|
86
|
+
},
|
|
87
|
+
"optionalDependencies": {
|
|
88
|
+
"@marp-team/marp-cli": "^4.1.0"
|
|
83
89
|
}
|
|
84
90
|
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
name: before-after
|
|
2
|
+
description: "ビフォー・アフター比較レイアウト"
|
|
3
|
+
category: layouts
|
|
4
|
+
|
|
5
|
+
schema:
|
|
6
|
+
type: object
|
|
7
|
+
required:
|
|
8
|
+
- title
|
|
9
|
+
- before
|
|
10
|
+
- after
|
|
11
|
+
properties:
|
|
12
|
+
title:
|
|
13
|
+
type: string
|
|
14
|
+
description: "スライドタイトル"
|
|
15
|
+
before:
|
|
16
|
+
type: object
|
|
17
|
+
required:
|
|
18
|
+
- image
|
|
19
|
+
properties:
|
|
20
|
+
image:
|
|
21
|
+
type: string
|
|
22
|
+
description: "ビフォー画像パス"
|
|
23
|
+
label:
|
|
24
|
+
type: string
|
|
25
|
+
default: "Before"
|
|
26
|
+
description: "ラベル"
|
|
27
|
+
caption:
|
|
28
|
+
type: string
|
|
29
|
+
description: "キャプション"
|
|
30
|
+
after:
|
|
31
|
+
type: object
|
|
32
|
+
required:
|
|
33
|
+
- image
|
|
34
|
+
properties:
|
|
35
|
+
image:
|
|
36
|
+
type: string
|
|
37
|
+
description: "アフター画像パス"
|
|
38
|
+
label:
|
|
39
|
+
type: string
|
|
40
|
+
default: "After"
|
|
41
|
+
description: "ラベル"
|
|
42
|
+
caption:
|
|
43
|
+
type: string
|
|
44
|
+
description: "キャプション"
|
|
45
|
+
layout:
|
|
46
|
+
type: string
|
|
47
|
+
enum:
|
|
48
|
+
- horizontal
|
|
49
|
+
- vertical
|
|
50
|
+
- overlay
|
|
51
|
+
default: horizontal
|
|
52
|
+
description: "レイアウト方向"
|
|
53
|
+
|
|
54
|
+
example:
|
|
55
|
+
title: "リノベーション結果"
|
|
56
|
+
before:
|
|
57
|
+
image: "images/photos/before.jpg"
|
|
58
|
+
caption: "改修前 (2023年1月)"
|
|
59
|
+
after:
|
|
60
|
+
image: "images/photos/after.jpg"
|
|
61
|
+
caption: "改修後 (2024年3月)"
|
|
62
|
+
|
|
63
|
+
output: |
|
|
64
|
+
<!-- _class: before-after-slide layout-{{ content.layout | default('horizontal') }} -->
|
|
65
|
+
|
|
66
|
+
# {{ content.title }}
|
|
67
|
+
|
|
68
|
+
<div class="before-after-container">
|
|
69
|
+
<div class="before-section">
|
|
70
|
+
<span class="comparison-label">{{ content.before.label | default('Before') }}</span>
|
|
71
|
+
<img src="{{ content.before.image }}" alt="{{ content.before.label | default('Before') }}">
|
|
72
|
+
{%- if content.before.caption %}
|
|
73
|
+
<p class="comparison-caption">{{ content.before.caption }}</p>
|
|
74
|
+
{%- endif %}
|
|
75
|
+
</div>
|
|
76
|
+
<div class="after-section">
|
|
77
|
+
<span class="comparison-label">{{ content.after.label | default('After') }}</span>
|
|
78
|
+
<img src="{{ content.after.image }}" alt="{{ content.after.label | default('After') }}">
|
|
79
|
+
{%- if content.after.caption %}
|
|
80
|
+
<p class="comparison-caption">{{ content.after.caption }}</p>
|
|
81
|
+
{%- endif %}
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
css: |
|
|
86
|
+
.before-after-slide .before-after-container {
|
|
87
|
+
display: flex;
|
|
88
|
+
gap: 2em;
|
|
89
|
+
justify-content: center;
|
|
90
|
+
align-items: flex-start;
|
|
91
|
+
width: 100%;
|
|
92
|
+
}
|
|
93
|
+
.before-after-slide.layout-horizontal .before-after-container {
|
|
94
|
+
flex-direction: row;
|
|
95
|
+
}
|
|
96
|
+
.before-after-slide.layout-vertical .before-after-container {
|
|
97
|
+
flex-direction: column;
|
|
98
|
+
align-items: center;
|
|
99
|
+
}
|
|
100
|
+
.before-after-slide .before-section,
|
|
101
|
+
.before-after-slide .after-section {
|
|
102
|
+
flex: 1;
|
|
103
|
+
text-align: center;
|
|
104
|
+
position: relative;
|
|
105
|
+
}
|
|
106
|
+
.before-after-slide.layout-vertical .before-section,
|
|
107
|
+
.before-after-slide.layout-vertical .after-section {
|
|
108
|
+
width: 80%;
|
|
109
|
+
flex: none;
|
|
110
|
+
}
|
|
111
|
+
.before-after-slide .comparison-label {
|
|
112
|
+
display: inline-block;
|
|
113
|
+
padding: 0.3em 1em;
|
|
114
|
+
background: #333;
|
|
115
|
+
color: white;
|
|
116
|
+
font-size: 0.9em;
|
|
117
|
+
font-weight: bold;
|
|
118
|
+
border-radius: 4px;
|
|
119
|
+
margin-bottom: 0.5em;
|
|
120
|
+
}
|
|
121
|
+
.before-after-slide .before-section .comparison-label {
|
|
122
|
+
background: #666;
|
|
123
|
+
}
|
|
124
|
+
.before-after-slide .after-section .comparison-label {
|
|
125
|
+
background: #2196F3;
|
|
126
|
+
}
|
|
127
|
+
.before-after-slide .before-section img,
|
|
128
|
+
.before-after-slide .after-section img {
|
|
129
|
+
max-width: 100%;
|
|
130
|
+
max-height: 300px;
|
|
131
|
+
object-fit: contain;
|
|
132
|
+
border-radius: 4px;
|
|
133
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
134
|
+
}
|
|
135
|
+
.before-after-slide .comparison-caption {
|
|
136
|
+
font-size: 0.85em;
|
|
137
|
+
color: #666;
|
|
138
|
+
margin-top: 0.5em;
|
|
139
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
name: image-caption
|
|
2
|
+
description: "画像と詳細キャプションレイアウト"
|
|
3
|
+
category: layouts
|
|
4
|
+
|
|
5
|
+
schema:
|
|
6
|
+
type: object
|
|
7
|
+
required:
|
|
8
|
+
- image
|
|
9
|
+
- caption
|
|
10
|
+
properties:
|
|
11
|
+
title:
|
|
12
|
+
type: string
|
|
13
|
+
description: "スライドタイトル(オプション)"
|
|
14
|
+
image:
|
|
15
|
+
type: string
|
|
16
|
+
description: "画像ファイルパス"
|
|
17
|
+
caption:
|
|
18
|
+
type: string
|
|
19
|
+
description: "画像の説明(キャプション)"
|
|
20
|
+
source:
|
|
21
|
+
type: string
|
|
22
|
+
description: "出典・クレジット"
|
|
23
|
+
|
|
24
|
+
example:
|
|
25
|
+
title: "実験結果"
|
|
26
|
+
image: "images/figures/experiment-result.png"
|
|
27
|
+
caption: "図1: 温度変化による材料特性の変化。青線が提案手法、赤線が従来手法。"
|
|
28
|
+
source: "社内実験データ (2024)"
|
|
29
|
+
|
|
30
|
+
output: |
|
|
31
|
+
<!-- _class: image-caption-slide -->
|
|
32
|
+
|
|
33
|
+
{%- if content.title %}
|
|
34
|
+
# {{ content.title }}
|
|
35
|
+
|
|
36
|
+
{%- endif %}
|
|
37
|
+
<figure class="image-caption-container">
|
|
38
|
+
<img src="{{ content.image }}" alt="{{ content.caption }}">
|
|
39
|
+
<figcaption>
|
|
40
|
+
<p class="caption-text">{{ content.caption }}</p>
|
|
41
|
+
{%- if content.source %}
|
|
42
|
+
<p class="caption-source">{{ content.source }}</p>
|
|
43
|
+
{%- endif %}
|
|
44
|
+
</figcaption>
|
|
45
|
+
</figure>
|
|
46
|
+
|
|
47
|
+
css: |
|
|
48
|
+
.image-caption-slide .image-caption-container {
|
|
49
|
+
display: flex;
|
|
50
|
+
flex-direction: column;
|
|
51
|
+
align-items: center;
|
|
52
|
+
margin: 0 auto;
|
|
53
|
+
max-width: 90%;
|
|
54
|
+
}
|
|
55
|
+
.image-caption-slide .image-caption-container img {
|
|
56
|
+
max-width: 100%;
|
|
57
|
+
max-height: 400px;
|
|
58
|
+
object-fit: contain;
|
|
59
|
+
border-radius: 4px;
|
|
60
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
61
|
+
}
|
|
62
|
+
.image-caption-slide figcaption {
|
|
63
|
+
width: 100%;
|
|
64
|
+
margin-top: 1em;
|
|
65
|
+
text-align: left;
|
|
66
|
+
}
|
|
67
|
+
.image-caption-slide .caption-text {
|
|
68
|
+
font-size: 0.95em;
|
|
69
|
+
color: #333;
|
|
70
|
+
line-height: 1.5;
|
|
71
|
+
margin: 0;
|
|
72
|
+
}
|
|
73
|
+
.image-caption-slide .caption-source {
|
|
74
|
+
font-size: 0.85em;
|
|
75
|
+
color: #666;
|
|
76
|
+
font-style: italic;
|
|
77
|
+
margin: 0.5em 0 0 0;
|
|
78
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
name: image-full
|
|
2
|
+
description: "フルスクリーン画像(タイトルオーバーレイ付き)"
|
|
3
|
+
category: layouts
|
|
4
|
+
|
|
5
|
+
schema:
|
|
6
|
+
type: object
|
|
7
|
+
required:
|
|
8
|
+
- image
|
|
9
|
+
properties:
|
|
10
|
+
image:
|
|
11
|
+
type: string
|
|
12
|
+
description: "画像ファイルパス"
|
|
13
|
+
title:
|
|
14
|
+
type: string
|
|
15
|
+
description: "オーバーレイタイトル(オプション)"
|
|
16
|
+
caption:
|
|
17
|
+
type: string
|
|
18
|
+
description: "キャプション(オプション)"
|
|
19
|
+
position:
|
|
20
|
+
type: string
|
|
21
|
+
enum:
|
|
22
|
+
- center
|
|
23
|
+
- top
|
|
24
|
+
- bottom
|
|
25
|
+
- left
|
|
26
|
+
- right
|
|
27
|
+
default: center
|
|
28
|
+
description: "画像の位置"
|
|
29
|
+
overlay:
|
|
30
|
+
type: string
|
|
31
|
+
enum:
|
|
32
|
+
- none
|
|
33
|
+
- dark
|
|
34
|
+
- light
|
|
35
|
+
- gradient
|
|
36
|
+
default: none
|
|
37
|
+
description: "オーバーレイ効果"
|
|
38
|
+
|
|
39
|
+
example:
|
|
40
|
+
image: "images/photos/site-overview.jpg"
|
|
41
|
+
title: "Project Site"
|
|
42
|
+
overlay: dark
|
|
43
|
+
|
|
44
|
+
output: |
|
|
45
|
+
<!-- _class: image-full-slide -->
|
|
46
|
+
|
|
47
|
+
<div class="image-full" style="background-image: url('{{ content.image }}'); background-position: {{ content.position | default('center') }};">
|
|
48
|
+
{%- if content.overlay and content.overlay != 'none' %}
|
|
49
|
+
<div class="overlay overlay-{{ content.overlay }}"></div>
|
|
50
|
+
{%- endif %}
|
|
51
|
+
{%- if content.title %}
|
|
52
|
+
<h1 class="image-title">{{ content.title }}</h1>
|
|
53
|
+
{%- endif %}
|
|
54
|
+
{%- if content.caption %}
|
|
55
|
+
<p class="image-caption">{{ content.caption }}</p>
|
|
56
|
+
{%- endif %}
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
css: |
|
|
60
|
+
.image-full-slide {
|
|
61
|
+
padding: 0;
|
|
62
|
+
}
|
|
63
|
+
.image-full-slide .image-full {
|
|
64
|
+
width: 100%;
|
|
65
|
+
height: 100%;
|
|
66
|
+
background-size: cover;
|
|
67
|
+
background-repeat: no-repeat;
|
|
68
|
+
display: flex;
|
|
69
|
+
flex-direction: column;
|
|
70
|
+
justify-content: center;
|
|
71
|
+
align-items: center;
|
|
72
|
+
position: relative;
|
|
73
|
+
}
|
|
74
|
+
.image-full-slide .overlay {
|
|
75
|
+
position: absolute;
|
|
76
|
+
top: 0;
|
|
77
|
+
left: 0;
|
|
78
|
+
width: 100%;
|
|
79
|
+
height: 100%;
|
|
80
|
+
z-index: 1;
|
|
81
|
+
}
|
|
82
|
+
.image-full-slide .overlay-dark {
|
|
83
|
+
background: rgba(0, 0, 0, 0.5);
|
|
84
|
+
}
|
|
85
|
+
.image-full-slide .overlay-light {
|
|
86
|
+
background: rgba(255, 255, 255, 0.5);
|
|
87
|
+
}
|
|
88
|
+
.image-full-slide .overlay-gradient {
|
|
89
|
+
background: linear-gradient(to bottom, transparent 50%, rgba(0, 0, 0, 0.7));
|
|
90
|
+
}
|
|
91
|
+
.image-full-slide .image-title {
|
|
92
|
+
position: relative;
|
|
93
|
+
z-index: 2;
|
|
94
|
+
color: white;
|
|
95
|
+
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
|
|
96
|
+
font-size: 2.5em;
|
|
97
|
+
margin: 0;
|
|
98
|
+
}
|
|
99
|
+
.image-full-slide .image-caption {
|
|
100
|
+
position: relative;
|
|
101
|
+
z-index: 2;
|
|
102
|
+
color: white;
|
|
103
|
+
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
|
|
104
|
+
font-size: 1.2em;
|
|
105
|
+
margin-top: 0.5em;
|
|
106
|
+
}
|