@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.
@@ -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
- # Heroicons (SVG CDN)
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
- # Actions
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
- # Status
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
- # Objects
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
- # Navigation
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
- # Communication
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.1.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": "^4.0.3",
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
+ }