create-portfoliable 1.0.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.
Files changed (62) hide show
  1. package/bin/create-portfoliable.mjs +425 -0
  2. package/cli/portfoliable.mjs +836 -0
  3. package/index.html +18 -0
  4. package/package.json +102 -0
  5. package/public/favicon.ico +0 -0
  6. package/public/favicon.png +0 -0
  7. package/scripts/check-updates.mjs +31 -0
  8. package/scripts/ensure-valence-index-css.mjs +245 -0
  9. package/scripts/generate-password-hash.mjs +25 -0
  10. package/scripts/release-orchestrator.mjs +363 -0
  11. package/scripts/scaffold-case.mjs +460 -0
  12. package/scripts/scaffold-consumer.mjs +87 -0
  13. package/scripts/smoke-homeview.mjs +133 -0
  14. package/scripts/smoke-initializer.mjs +129 -0
  15. package/scripts/smoke-packed.mjs +184 -0
  16. package/scripts/switch-valence-source.mjs +162 -0
  17. package/scripts/sync-template-shared.mjs +136 -0
  18. package/scripts/terminal-ui.mjs +274 -0
  19. package/scripts/verify-integration.mjs +72 -0
  20. package/src/App.js +10015 -0
  21. package/src/header-visibility.contract.js +31 -0
  22. package/src/header-visibility.contract.test.js +41 -0
  23. package/src/main.js +12 -0
  24. package/src/parser/markdown.js +855 -0
  25. package/src/style.css +88 -0
  26. package/templates/README.md +242 -0
  27. package/templates/configs/i18n/i18n.config.js +230 -0
  28. package/templates/configs/i18n/i18n.labels.js +188 -0
  29. package/templates/configs/portfoliable.a11y.config.js +262 -0
  30. package/templates/configs/portfoliable.design.config.js +651 -0
  31. package/templates/gitignore +9 -0
  32. package/templates/index.html +20 -0
  33. package/templates/public/api/.htaccess +4 -0
  34. package/templates/public/api/README.md +27 -0
  35. package/templates/public/api/password.config.example.json +16 -0
  36. package/templates/public/api/password.config.json +16 -0
  37. package/templates/public/api/unlock-case.php +56 -0
  38. package/templates/public/favicon.ico +0 -0
  39. package/templates/public/favicon.png +0 -0
  40. package/templates/public/portfoliable-logo.svg +3 -0
  41. package/templates/scripts/add-language.mjs +253 -0
  42. package/templates/scripts/convert-video-to-mp4.mjs +207 -0
  43. package/templates/scripts/convert-wav-to-mp3.mjs +184 -0
  44. package/templates/scripts/delete-case.mjs +320 -0
  45. package/templates/scripts/delete-language.mjs +195 -0
  46. package/templates/scripts/generate-password-hash.mjs +98 -0
  47. package/templates/scripts/i18n-config-utils.mjs +123 -0
  48. package/templates/scripts/scaffold-case.mjs +444 -0
  49. package/templates/scripts/sync-locales.mjs +1048 -0
  50. package/templates/scripts/validate-content.mjs +257 -0
  51. package/templates/scripts/validate-protection.mjs +187 -0
  52. package/templates/src/cases/index.js +188 -0
  53. package/templates/src/content/about/ABOUTME.md +202 -0
  54. package/templates/src/content/cases/template-case/case.md +479 -0
  55. package/templates/src/content/cases/template-case/cover.png +0 -0
  56. package/templates/src/content/cases/template-case/he-cover.png +0 -0
  57. package/templates/src/content/cases/template-case/template-audio.mp3 +0 -0
  58. package/templates/src/content/cases/template-case/template-video.mp4 +0 -0
  59. package/templates/src/content/thumbnail-options.generated.json +1044 -0
  60. package/templates/src/main.js +23 -0
  61. package/templates/src/parser/markdown.js +805 -0
  62. package/vite.config.js +111 -0
@@ -0,0 +1,651 @@
1
+ // File: create-portfoliable/configs/portfoliable.design.config.js
2
+ // Purpose: Define starter runtime configuration values consumed by the app shell.
3
+ // Author: Lio Schimanko
4
+
5
+ // [MARK: Home view runtime defaults]
6
+ // === HOME VIEW CONFIGURATION ===
7
+ export default {
8
+ // Configures runtime presentation options rendered in the portfolio Home view.
9
+ homeView: {
10
+ // Sets how many case cards are shown in the initial gallery view.
11
+ itemCount: 8,
12
+ // Chooses the rendering engine mode used by the home view component.
13
+ engine: 'minimal',
14
+ // Controls whether the breadcrumb trail is shown in the UI.
15
+ showBreadcrumb: false,
16
+ // Controls whether language-switch controls are visible to end users.
17
+ showLanguageMenu: true,
18
+ // Home gallery runtime overrides scoped to the Home view template.
19
+ gallery: {
20
+ // Optional desktop spacing between H1 title and gallery container.
21
+ '--ds-home-title-gallery-gap-desktop': '70px',
22
+ // Optional mobile spacing between H1 title and gallery container.
23
+ '--ds-home-title-gallery-gap-mobile': null,
24
+ // Sets the ds-gallery host height in Home view only.
25
+ // Use a CSS size string, e.g. '420px', '52vh', 'min(52vh, 520px)'.
26
+ '--ds-gallery-height': null,
27
+ // Optional mobile-only item height override (applies on compact/mobile breakpoint).
28
+ // When null, HomeView falls back to Valence mobile default token.
29
+ '--ds-gallery-mobile-height': null,
30
+ // Optional base heights by device category before compact/desktop scaling.
31
+ categoryHeights: {
32
+ wearable: null,
33
+ mobile: null,
34
+ tablet: null,
35
+ desktop: null,
36
+ television: null,
37
+ tv: null
38
+ },
39
+ // Optional i18n override labels for GalleryItem pills in Home view.
40
+ // When null, runtime falls back to i18n labels (gallery_pill_pitch/repo/demo).
41
+ pillLabels: {
42
+ pitch: null,
43
+ repo: null,
44
+ demo: null
45
+ }
46
+ },
47
+ // Controls whether the resume-reading toast feature is active.
48
+ resumeToastEnabled: true,
49
+ // Enables console diagnostics for resume toast behavior.
50
+ resumeToastDebug: true
51
+ },
52
+
53
+ // [MARK: Visibility and protection defaults]
54
+ // === VISIBILITY CONFIGURATION ===
55
+ visibility: {
56
+ // Controls whether pages are eligible to be listed in app-level web navigation.
57
+ web: true,
58
+ // Controls search-engine indexing defaults (robots metadata).
59
+ crawlers: true,
60
+ // Controls AI indexing/training hints emitted as metadata.
61
+ ai: true,
62
+ // Optional per-locale overrides.
63
+ locales: {}
64
+ },
65
+
66
+ // === PROTECTION CONFIGURATION ===
67
+ protection: {
68
+ // Default endpoint for self-hosted PHP deployments.
69
+ // Local `npm run portfoliable` proxies this path to a local PHP server automatically.
70
+ unlockEndpoint: '/api/unlock-case.php'
71
+ },
72
+
73
+ // === TRANSITIONS CONFIGURATION ===
74
+ transitions: {
75
+ // Enables native View Transitions shared-element behavior when browser support is available.
76
+ preferNativeSharedElement: false
77
+ },
78
+
79
+ // [MARK: Header contract overrides]
80
+ // === HEADER CONFIGURATION ===
81
+ // Controls shared header behavior across home, case, and player views.
82
+ header: {
83
+ visibility: {
84
+ showBreadcrumb: null,
85
+ showLanguageMenu: null,
86
+ showNavigationRegion: null,
87
+ showAbout: null
88
+ },
89
+ navigationRegion: {
90
+ disabled: null,
91
+ language: {
92
+ tooltip: null,
93
+ kbdLabel: null,
94
+ kbdKey: null,
95
+ kbdShowPlus: null,
96
+ ariaLabel: null
97
+ },
98
+ accessibility: {
99
+ tooltip: null,
100
+ kbdLabel: null,
101
+ kbdKey: null,
102
+ kbdShowPlus: null,
103
+ ariaLabel: null
104
+ },
105
+ about: {
106
+ tooltip: null,
107
+ kbdLabel: null,
108
+ kbdKey: null,
109
+ kbdShowPlus: null,
110
+ ariaLabel: null
111
+ }
112
+ },
113
+ // The only intentional non-null default in this config file.
114
+ aboutButton: {
115
+ imageSrc: '/favicon.png',
116
+ imageAlt: null
117
+ },
118
+ breadcrumbMenus: {
119
+ caseReader: {
120
+ caseStudies: {
121
+ itemIcon: null,
122
+ itemIconVariant: 'fill',
123
+ showItemIcon: false
124
+ },
125
+ videos: {
126
+ itemIcon: null,
127
+ itemIconVariant: 'fill',
128
+ showItemIcon: false
129
+ }
130
+ },
131
+ playerView: {
132
+ caseStudies: {
133
+ itemIcon: null,
134
+ itemIconVariant: 'fill',
135
+ showItemIcon: false
136
+ },
137
+ videos: {
138
+ itemIcon: null,
139
+ itemIconVariant: 'fill',
140
+ showItemIcon: false
141
+ }
142
+ }
143
+ }
144
+ },
145
+
146
+ // [MARK: Full Valence component override surface]
147
+ // === COMPONENT TOKENS ===
148
+ // Set any value to override the design-system defaults.
149
+ // Keep as null to inherit defaults from Valence.
150
+ components: {
151
+ subAtomic: {
152
+ iconography: {
153
+ '--ds-iconography-color': null,
154
+ '--ds-iconography-size': null,
155
+ '--ds-iconography-stroke-width': null
156
+ },
157
+ mermaidDiagram: {
158
+ '--ds-mermaid-bg': null,
159
+ '--ds-mermaid-border-color': null,
160
+ '--ds-mermaid-radius': null
161
+ }
162
+ },
163
+ atoms: {
164
+ button: {
165
+ '--ds-button-opacity': null,
166
+ '--ds-button-hover-scale': null,
167
+ '--ds-button-active-scale': null,
168
+ '--ds-button-bg': null,
169
+ '--ds-button-hover-bg': null,
170
+ '--ds-button-active-bg': null,
171
+ '--ds-button-border-width': null,
172
+ '--ds-button-border-color': null,
173
+ '--ds-button-radius': null,
174
+ '--ds-button-size': null,
175
+ '--ds-button-image-size': null,
176
+ '--ds-button-icon-size': null,
177
+ '--ds-button-shadow': null
178
+ },
179
+ check: {
180
+ '--ds-check-size': null,
181
+ '--ds-check-border-width': null,
182
+ '--ds-check-border-color': null,
183
+ '--ds-check-bg': null,
184
+ '--ds-check-active-bg': null,
185
+ '--ds-check-radius': null
186
+ },
187
+ divider: {
188
+ '--ds-divider-margin': null,
189
+ '--ds-divider-color': null,
190
+ '--ds-divider-thickness': null
191
+ },
192
+ icon: {
193
+ '--ds-icon-color': null,
194
+ '--ds-icon-size': null,
195
+ '--ds-icon-stroke-width': null
196
+ },
197
+ kbd: {
198
+ '--ds-kbd-bg': null,
199
+ '--ds-kbd-border-width': null,
200
+ '--ds-kbd-border-color': null,
201
+ '--ds-kbd-radius': null,
202
+ '--ds-kbd-color': null,
203
+ '--ds-kbd-padding': null,
204
+ '--ds-kbd-font-size': null,
205
+ '--ds-kbd-font-weight': null
206
+ },
207
+ loader: {
208
+ '--ds-loader-size': null,
209
+ '--ds-loader-color': null,
210
+ '--ds-loader-track-color': null,
211
+ '--ds-loader-stroke-width': null
212
+ },
213
+ metricCard: {
214
+ '--ds-metric-card-bg': null,
215
+ '--ds-metric-card-border-color': null,
216
+ '--ds-metric-card-radius': null,
217
+ '--ds-metric-card-padding': null,
218
+ '--ds-metric-card-title-color': null,
219
+ '--ds-metric-card-value-color': null
220
+ },
221
+ pill: {
222
+ '--ds-pill-bg': null,
223
+ '--ds-pill-color': null,
224
+ '--ds-pill-border-color': null,
225
+ '--ds-pill-radius': null,
226
+ '--ds-pill-padding': null
227
+ },
228
+ radio: {
229
+ '--ds-radio-size': null,
230
+ '--ds-radio-border-width': null,
231
+ '--ds-radio-border-color': null,
232
+ '--ds-radio-active-color': null
233
+ },
234
+ seekBar: {
235
+ '--ds-seekbar-height': null,
236
+ '--ds-seekbar-track-bg': null,
237
+ '--ds-seekbar-fill-bg': null,
238
+ '--ds-seekbar-thumb-size': null,
239
+ '--ds-seekbar-thumb-color': null
240
+ },
241
+ sliderDot: {
242
+ '--ds-slider-dot-size': null,
243
+ '--ds-slider-dot-color': null,
244
+ '--ds-slider-dot-active-color': null
245
+ },
246
+ subtitle: {
247
+ '--ds-subtitle-bg': null,
248
+ '--ds-subtitle-color': null,
249
+ '--ds-subtitle-radius': null,
250
+ '--ds-subtitle-padding': null
251
+ },
252
+ toc: {
253
+ '--ds-toc-position': null,
254
+ '--ds-toc-top': null,
255
+ '--ds-toc-right': null,
256
+ '--ds-toc-bottom': null,
257
+ '--ds-toc-left': null,
258
+ '--ds-toc-transform': null,
259
+ '--ds-toc-max-height': null,
260
+ '--ds-toc-line-height': null,
261
+ '--ds-toc-line-gap': null,
262
+ '--ds-toc-line-color': null,
263
+ '--ds-toc-line-active-color': null,
264
+ '--ds-toc-top-line-width': null,
265
+ '--ds-toc-top-line-gap': null
266
+ },
267
+ tab: {
268
+ '--ds-tab-bg': null,
269
+ '--ds-tab-color': null,
270
+ '--ds-tab-active-bg': null,
271
+ '--ds-tab-active-color': null,
272
+ '--ds-tab-radius': null
273
+ },
274
+ thumbnail: {
275
+ '--ds-thumbnail-bg': null,
276
+ '--ds-thumbnail-radius': null,
277
+ '--ds-thumbnail-border-color': null,
278
+ '--ds-thumbnail-shadow': null
279
+ },
280
+ toggle: {
281
+ '--ds-toggle-width': null,
282
+ '--ds-toggle-height': null,
283
+ '--ds-toggle-bg': null,
284
+ '--ds-toggle-active-bg': null,
285
+ '--ds-toggle-knob-size': null,
286
+ '--ds-toggle-knob-bg': null
287
+ }
288
+ },
289
+ molecules: {
290
+ audioPlayer: {
291
+ '--ds-audio-player-bg': null,
292
+ '--ds-audio-player-border-color': null,
293
+ '--ds-audio-player-radius': null,
294
+ '--ds-audio-player-padding': null
295
+ },
296
+ breadcrumb: {
297
+ '--ds-breadcrumb-gap': null,
298
+ '--ds-breadcrumb-separator-color': null,
299
+ '--ds-breadcrumb-link-color': null,
300
+ '--ds-breadcrumb-link-active-color': null
301
+ },
302
+ caseNavigator: {
303
+ '--ds-case-navigator-gap': null,
304
+ '--ds-case-navigator-bg': null,
305
+ '--ds-case-navigator-padding': null,
306
+ '--ds-case-navigator-height': null,
307
+ '--ds-case-navigator-radius': null,
308
+ '--ds-case-navigator-border-width': null,
309
+ '--ds-case-navigator-border-style': null,
310
+ '--ds-case-navigator-border-color': null,
311
+ '--ds-case-navigator-menu-width': null,
312
+ '--ds-case-navigator-menu-bg': null,
313
+ '--ds-case-navigator-menu-border-color': null,
314
+ '--ds-case-navigator-menu-radius': null,
315
+ '--ds-case-navigator-menu-shadow': null
316
+ },
317
+ comboTabs: {
318
+ '--ds-combo-tabs-gap': null,
319
+ '--ds-combo-tabs-bg': null,
320
+ '--ds-combo-tabs-radius': null
321
+ },
322
+ galleryItem: {
323
+ '--ds-gallery-item-bg': null,
324
+ '--ds-gallery-item-border-color': null,
325
+ '--ds-gallery-item-radius': null,
326
+ '--ds-gallery-item-padding': null,
327
+ '--ds-gallery-item-title-color': null,
328
+ '--ds-gallery-item-text-color': null,
329
+ '--ds-gallery-item-protected-blur': null
330
+ },
331
+ itemRow: {
332
+ '--ds-item-row-height': null,
333
+ '--ds-item-row-padding': null,
334
+ '--ds-item-row-gap': null,
335
+ '--ds-item-row-bg': null,
336
+ '--ds-item-row-hover-bg': null,
337
+ '--ds-item-row-active-bg': null,
338
+ '--ds-item-row-border-color': null,
339
+ '--ds-item-row-color': null
340
+ },
341
+ navigationMenu: {
342
+ '--ds-navigation-menu-gap': null,
343
+ '--ds-navigation-visual-size': null,
344
+ '--ds-navigation-icon-color': null,
345
+ '--ds-navigation-icon-hover-bg': null,
346
+ '--ds-navigation-icon-active-bg': null,
347
+ '--ds-navigation-avatar-bg': null,
348
+ '--ds-navigation-contextual-width': null
349
+ },
350
+ summary: {
351
+ '--ds-summary-bg': null,
352
+ '--ds-summary-border-color': null,
353
+ '--ds-summary-radius': null,
354
+ '--ds-summary-padding': null,
355
+ '--ds-summary-title-color': null,
356
+ '--ds-summary-text-color': null
357
+ },
358
+ toast: {
359
+ '--ds-toast-bg': null,
360
+ '--ds-toast-color': null,
361
+ '--ds-toast-border-color': null,
362
+ '--ds-toast-radius': null,
363
+ '--ds-toast-padding': null,
364
+ '--ds-toast-shadow': null
365
+ },
366
+ tooltip: {
367
+ '--ds-tooltip-bg': null,
368
+ '--ds-tooltip-radius': null,
369
+ '--ds-tooltip-border-width': null,
370
+ '--ds-tooltip-border-color': null,
371
+ '--tooltip-gap': null,
372
+ '--tooltip-slide': null,
373
+ '--ds-tooltip-color': null,
374
+ '--ds-tooltip-padding': null
375
+ },
376
+ videoControls: {
377
+ '--ds-video-controls-bg': null,
378
+ '--ds-video-controls-border-color': null,
379
+ '--ds-video-controls-radius': null,
380
+ '--ds-video-controls-padding': null,
381
+ '--ds-video-controls-gap': null
382
+ }
383
+ },
384
+ organisms: {
385
+ article: {
386
+ '--ds-article-max-width': null
387
+ },
388
+ comboCard: {
389
+ '--ds-combo-card-bg': null,
390
+ '--ds-combo-card-border-color': null,
391
+ '--ds-combo-card-radius': null,
392
+ '--ds-combo-card-padding': null
393
+ },
394
+ contextualMenu: {
395
+ '--ds-contextual-menu-width': null,
396
+ '--ds-contextual-menu-min-width': null,
397
+ '--ds-contextual-menu-max-height': null,
398
+ '--ds-contextual-menu-bg': null,
399
+ '--ds-contextual-menu-radius': null,
400
+ '--ds-contextual-menu-border-color': null,
401
+ '--ds-contextual-menu-shadow': null
402
+ },
403
+ gallery: {
404
+ '--ds-gallery-gap': null,
405
+ '--ds-gallery-padding': null,
406
+ '--ds-gallery-card-width': null,
407
+ '--ds-gallery-card-height': null
408
+ },
409
+ header: {
410
+ '--ds-header-gap': null,
411
+ '--ds-header-min-height': null,
412
+ '--ds-header-padding': null,
413
+ '--ds-header-bg': null,
414
+ '--ds-header-border-color': null
415
+ },
416
+ videoPlayer: {
417
+ '--ds-video-player-bg': null,
418
+ '--ds-video-player-radius': null,
419
+ '--ds-video-player-border-color': null,
420
+ '--ds-video-player-shadow': null
421
+ }
422
+ },
423
+ templates: {
424
+ caseView: {
425
+ '--ds-case-view-bg': null,
426
+ '--ds-case-view-gap': null,
427
+ '--ds-case-view-padding': null
428
+ },
429
+ homeView: {
430
+ '--ds-home-view-bg': null,
431
+ '--ds-home-view-gap': null,
432
+ '--ds-home-view-padding': null,
433
+ '--ds-home-view-title-color': null,
434
+ '--ds-home-view-footer-color': null
435
+ },
436
+ playerView: {
437
+ '--player-view-bg': null,
438
+ '--player-view-fg': null,
439
+ '--player-view-bg-dark': null,
440
+ '--player-view-fg-dark': null,
441
+ '--player-view-bg-high-contrast': null,
442
+ '--player-view-fg-high-contrast': null,
443
+ '--player-view-stage-gap': null,
444
+ '--player-view-thumbnail-width': null,
445
+ '--player-view-thumbnail-height': null,
446
+ '--player-view-controls-width': null,
447
+ '--player-view-viewport-padding': null,
448
+ '--player-view-viewport-inline-padding': null,
449
+ '--player-view-viewport-bottom-padding': null
450
+ }
451
+ }
452
+ },
453
+
454
+
455
+ // [MARK: Article design token overrides]
456
+ // === ARTICLE CONFIGURATION ===
457
+ // Central place for end users to tweak article layout, typography, media, and content surfaces.
458
+ // Leave values as `null` to keep the design-system defaults from article.css.
459
+ article: {
460
+ layout: {
461
+ '--ds-article-max-width': null,
462
+ '--ds-article-padding': null,
463
+ '--ds-article-copy-width': null,
464
+ '--ds-article-header-gap': null,
465
+ '--ds-article-title-gap': null,
466
+ '--ds-article-stack-gap': null,
467
+ '--ds-article-body-gap': null,
468
+ '--ds-article-subtitle-max-width': null,
469
+ '--ds-article-media-width': null
470
+ },
471
+ typography: {
472
+ '--ds-article-kicker-size': null,
473
+ '--ds-article-kicker-color': null,
474
+ '--ds-article-title-size': null,
475
+ '--ds-article-title-color': null,
476
+ '--ds-article-subtitle-size': null,
477
+ '--ds-article-subtitle-color': null,
478
+ '--ds-article-h1-size': null,
479
+ '--ds-article-h1-letter-spacing': null,
480
+ '--ds-article-h1-line-height': null,
481
+ '--ds-article-h2-size': null,
482
+ '--ds-article-h2-letter-spacing': null,
483
+ '--ds-article-h2-line-height': null,
484
+ '--ds-article-h3-size': null,
485
+ '--ds-article-h3-letter-spacing': null,
486
+ '--ds-article-h3-line-height': null,
487
+ '--ds-article-h3-margin-top': null,
488
+ '--ds-article-h4-size': null,
489
+ '--ds-article-h4-letter-spacing': null,
490
+ '--ds-article-h4-line-height': null,
491
+ '--ds-article-h5-size': null,
492
+ '--ds-article-h5-letter-spacing': null,
493
+ '--ds-article-h5-line-height': null,
494
+ '--ds-article-h6-size': null,
495
+ '--ds-article-h6-weight': null,
496
+ '--ds-article-h6-letter-spacing': null,
497
+ '--ds-article-h6-line-height': null,
498
+ '--ds-article-heading-color': null,
499
+ '--ds-article-heading-muted-color': null,
500
+ '--ds-article-heading-weight': null,
501
+ '--ds-article-paragraph-weight': null,
502
+ '--ds-article-paragraph-size': null,
503
+ '--ds-article-paragraph-letter-spacing': null,
504
+ '--ds-article-paragraph-line-height': null,
505
+ '--ds-article-paragraph-color': null,
506
+ '--ds-article-subtext-weight': null,
507
+ '--ds-article-subtext-size': null,
508
+ '--ds-article-subtext-letter-spacing': null,
509
+ '--ds-article-subtext-line-height': null,
510
+ '--ds-article-paragraph-muted-color': null,
511
+ '--ds-article-secondary-paragraph-color': null,
512
+ '--ds-article-tertiary-weight': null,
513
+ '--ds-article-tertiary-size': null,
514
+ '--ds-article-tertiary-letter-spacing': null,
515
+ '--ds-article-tertiary-line-height': null,
516
+ '--ds-article-list-weight': null,
517
+ '--ds-article-list-size': null,
518
+ '--ds-article-list-letter-spacing': null,
519
+ '--ds-article-list-line-height': null,
520
+ '--ds-article-list-color': null,
521
+ '--ds-article-list-marker-color': null,
522
+ '--ds-article-blockquote-margin': null,
523
+ '--ds-article-blockquote-padding': null,
524
+ '--ds-article-blockquote-bg': null,
525
+ '--ds-article-blockquote-border-width': null,
526
+ '--ds-article-blockquote-border-color': null,
527
+ '--ds-article-blockquote-radius': null,
528
+ '--ds-article-blockquote-weight': null,
529
+ '--ds-article-blockquote-size': null,
530
+ '--ds-article-blockquote-letter-spacing': null,
531
+ '--ds-article-blockquote-line-height': null,
532
+ '--ds-article-blockquote-color': null,
533
+ '--ds-article-footnote-size': null,
534
+ '--ds-article-footnote-color': null,
535
+ '--ds-article-footnote-link-color': null,
536
+ '--ds-article-footnote-link-decoration': null,
537
+ '--ds-article-footnote-link-offset': null,
538
+ '--ds-article-footnote-link-weight': null,
539
+ '--ds-article-footnote-link-padding': null
540
+ },
541
+ media: {
542
+ '--ds-article-summary-width': null,
543
+ '--ds-article-summary-max-width': null,
544
+ '--ds-article-media-width': null,
545
+ '--ds-article-image-radius': null,
546
+ '--ds-article-image-margin': null,
547
+ '--ds-article-figure-margin': null,
548
+ '--ds-article-caption-size': null,
549
+ '--ds-article-caption-color': null,
550
+ '--ds-article-caption-margin-top': null,
551
+ '--ds-article-caption-weight': null,
552
+ '--ds-article-mermaid-margin': null,
553
+ '--ds-article-mermaid-align': null
554
+ },
555
+ cover: {
556
+ '--ds-article-cover-padding': null,
557
+ '--ds-article-cover-radius': null,
558
+ '--ds-article-cover-bg': null,
559
+ '--ds-article-cover-border-color': null,
560
+ '--ds-article-cover-max-height': null
561
+ },
562
+ social: {
563
+ '--ds-article-social-opacity': null,
564
+ '--ds-article-social-color': null,
565
+ '--ds-article-social-gap': null,
566
+ '--ds-article-social-button-size': null
567
+ },
568
+ code: {
569
+ '--ds-article-code-margin': null,
570
+ '--ds-article-code-padding': null,
571
+ '--ds-article-code-bg': null,
572
+ '--ds-article-code-border-width': null,
573
+ '--ds-article-code-border-color': null,
574
+ '--ds-article-code-radius': null,
575
+ '--ds-article-code-font-family': null,
576
+ '--ds-article-code-font-size': null,
577
+ '--ds-article-code-line-height': null,
578
+ '--ds-article-code-color': null,
579
+ '--ds-article-code-shadow': null,
580
+ '--ds-article-inline-code-font-family': null,
581
+ '--ds-article-inline-code-size': null,
582
+ '--ds-article-inline-code-padding': null,
583
+ '--ds-article-inline-code-radius': null,
584
+ '--ds-article-inline-code-color': null,
585
+ '--ds-article-inline-code-bg': null
586
+ },
587
+ tables: {
588
+ '--ds-article-table-width': null,
589
+ '--ds-article-table-margin': null,
590
+ '--ds-article-table-weight': null,
591
+ '--ds-article-table-font-size': null,
592
+ '--ds-article-table-letter-spacing': null,
593
+ '--ds-article-table-line-height': null,
594
+ '--ds-article-table-bg': null,
595
+ '--ds-article-table-border-width': null,
596
+ '--ds-article-table-border-color': null,
597
+ '--ds-article-table-radius': null,
598
+ '--ds-article-table-cell-padding': null,
599
+ '--ds-article-table-cell-border-width': null,
600
+ '--ds-article-table-text-color': null,
601
+ '--ds-article-table-header-weight': null,
602
+ '--ds-article-table-header-size': null,
603
+ '--ds-article-table-header-transform': null,
604
+ '--ds-article-table-header-letter-spacing': null,
605
+ '--ds-article-table-header-bg': null,
606
+ '--ds-article-table-header-color': null,
607
+ '--ds-article-table-hover-bg': null
608
+ },
609
+ content: {
610
+ '--ds-article-mark-bg': null,
611
+ '--ds-article-link-color': null,
612
+ '--ds-article-link-hover-color': null,
613
+ '--ds-article-definition-margin': null,
614
+ '--ds-article-definition-term-weight': null,
615
+ '--ds-article-definition-term-color': null,
616
+ '--ds-article-definition-term-margin-top': null,
617
+ '--ds-article-definition-indent': null,
618
+ '--ds-article-definition-color': null,
619
+ '--ds-article-definition-margin-bottom': null,
620
+ '--ds-article-details-margin': null,
621
+ '--ds-article-details-padding': null,
622
+ '--ds-article-details-bg': null,
623
+ '--ds-article-details-border-width': null,
624
+ '--ds-article-details-border-color': null,
625
+ '--ds-article-details-radius': null,
626
+ '--ds-article-details-summary-weight': null,
627
+ '--ds-article-details-summary-color': null,
628
+ '--ds-article-details-summary-margin-bottom': null,
629
+ '--ds-article-details-summary-border-width': null,
630
+ '--ds-article-details-summary-padding-bottom': null,
631
+ '--ds-article-kbd-font-family': null,
632
+ '--ds-article-kbd-size': null,
633
+ '--ds-article-kbd-weight': null,
634
+ '--ds-article-kbd-padding': null,
635
+ '--ds-article-kbd-margin': null,
636
+ '--ds-article-kbd-color': null,
637
+ '--ds-article-kbd-bg': null,
638
+ '--ds-article-kbd-border-width': null,
639
+ '--ds-article-kbd-border-color': null,
640
+ '--ds-article-kbd-radius': null,
641
+ '--ds-article-kbd-shadow': null
642
+ }
643
+ },
644
+ // [MARK: Global theme token seed]
645
+ // === THEME TOKENS ===
646
+ // Provides initial design tokens that map to CSS custom properties.
647
+ themeTokens: {
648
+ '--color-bg': null,
649
+ '--color-black': null
650
+ }
651
+ };
@@ -0,0 +1,9 @@
1
+ node_modules/
2
+ dist/
3
+ .vite/
4
+ .DS_Store
5
+
6
+ # Protection secrets (server-only)
7
+ public/api/password.config.json
8
+ .env
9
+ .env.*
@@ -0,0 +1,20 @@
1
+ <!-- File: create-portfoliable/templates/index.html -->
2
+ <!-- Purpose: Provide the starter HTML host document copied into newly scaffolded consumer apps. -->
3
+ <!-- Author: Lio Schimanko -->
4
+
5
+ <!doctype html>
6
+ <html lang="en">
7
+ <head>
8
+ <meta charset="UTF-8" />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
10
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon.png?v=1" />
11
+ <link rel="shortcut icon" href="/favicon.ico?v=1" />
12
+ <link rel="apple-touch-icon" href="/favicon.png?v=1" />
13
+ <title>Portfoliable Starter</title>
14
+ </head>
15
+ <body>
16
+ <noscript>This app requires JavaScript enabled to render your portfolio.</noscript>
17
+ <div id="app"></div>
18
+ <script type="module" src="/src/main.js"></script>
19
+ </body>
20
+ </html>
@@ -0,0 +1,4 @@
1
+ # Prevent direct download of password hash records.
2
+ <Files "password.config.json">
3
+ Require all denied
4
+ </Files>