@kawaijs/renderer-dom 0.1.10 → 0.1.12

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 (107) hide show
  1. package/README.md +34 -12
  2. package/dist/asset-fallbacks.d.ts +13 -0
  3. package/dist/asset-fallbacks.d.ts.map +1 -0
  4. package/dist/asset-fallbacks.js +41 -0
  5. package/dist/asset-fallbacks.js.map +1 -0
  6. package/dist/components/choice-menu.d.ts +12 -0
  7. package/dist/components/choice-menu.d.ts.map +1 -0
  8. package/dist/components/choice-menu.js +44 -0
  9. package/dist/components/choice-menu.js.map +1 -0
  10. package/dist/components/dialogue-box.d.ts +29 -0
  11. package/dist/components/dialogue-box.d.ts.map +1 -0
  12. package/dist/components/dialogue-box.js +155 -0
  13. package/dist/components/dialogue-box.js.map +1 -0
  14. package/dist/components/hotspot-layer.d.ts +13 -0
  15. package/dist/components/hotspot-layer.d.ts.map +1 -0
  16. package/dist/components/hotspot-layer.js +47 -0
  17. package/dist/components/hotspot-layer.js.map +1 -0
  18. package/dist/components/main-menu.d.ts +36 -0
  19. package/dist/components/main-menu.d.ts.map +1 -0
  20. package/dist/components/main-menu.js +257 -0
  21. package/dist/components/main-menu.js.map +1 -0
  22. package/dist/components/quick-menu.d.ts +22 -0
  23. package/dist/components/quick-menu.d.ts.map +1 -0
  24. package/dist/components/quick-menu.js +59 -0
  25. package/dist/components/quick-menu.js.map +1 -0
  26. package/dist/components/stage-layer.d.ts +39 -0
  27. package/dist/components/stage-layer.d.ts.map +1 -0
  28. package/dist/components/stage-layer.js +253 -0
  29. package/dist/components/stage-layer.js.map +1 -0
  30. package/dist/components/vfx-layer.d.ts +28 -0
  31. package/dist/components/vfx-layer.d.ts.map +1 -0
  32. package/dist/components/vfx-layer.js +310 -0
  33. package/dist/components/vfx-layer.js.map +1 -0
  34. package/dist/embed.d.ts +5 -0
  35. package/dist/embed.d.ts.map +1 -0
  36. package/dist/embed.js +17 -0
  37. package/dist/embed.js.map +1 -0
  38. package/dist/icons.d.ts +31 -0
  39. package/dist/icons.d.ts.map +1 -0
  40. package/dist/icons.js +31 -0
  41. package/dist/icons.js.map +1 -0
  42. package/dist/index.d.ts +31 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +69 -3
  45. package/dist/index.js.map +1 -1
  46. package/dist/layout/viewport-adapter.d.ts +52 -0
  47. package/dist/layout/viewport-adapter.d.ts.map +1 -0
  48. package/dist/layout/viewport-adapter.js +123 -0
  49. package/dist/layout/viewport-adapter.js.map +1 -0
  50. package/dist/modals/about-modal.d.ts +3 -0
  51. package/dist/modals/about-modal.d.ts.map +1 -0
  52. package/dist/modals/about-modal.js +59 -0
  53. package/dist/modals/about-modal.js.map +1 -0
  54. package/dist/modals/achievements-modal.d.ts +4 -0
  55. package/dist/modals/achievements-modal.d.ts.map +1 -0
  56. package/dist/modals/achievements-modal.js +103 -0
  57. package/dist/modals/achievements-modal.js.map +1 -0
  58. package/dist/modals/confirm-modal.d.ts +9 -0
  59. package/dist/modals/confirm-modal.d.ts.map +1 -0
  60. package/dist/modals/confirm-modal.js +80 -0
  61. package/dist/modals/confirm-modal.js.map +1 -0
  62. package/dist/modals/gallery-modal.d.ts +4 -0
  63. package/dist/modals/gallery-modal.d.ts.map +1 -0
  64. package/dist/modals/gallery-modal.js +128 -0
  65. package/dist/modals/gallery-modal.js.map +1 -0
  66. package/dist/modals/history-modal.d.ts +3 -0
  67. package/dist/modals/history-modal.d.ts.map +1 -0
  68. package/dist/modals/history-modal.js +66 -0
  69. package/dist/modals/history-modal.js.map +1 -0
  70. package/dist/modals/input-modal.d.ts +10 -0
  71. package/dist/modals/input-modal.d.ts.map +1 -0
  72. package/dist/modals/input-modal.js +62 -0
  73. package/dist/modals/input-modal.js.map +1 -0
  74. package/dist/modals/save-load-modal.d.ts +3 -0
  75. package/dist/modals/save-load-modal.d.ts.map +1 -0
  76. package/dist/modals/save-load-modal.js +262 -0
  77. package/dist/modals/save-load-modal.js.map +1 -0
  78. package/dist/modals/settings-modal.d.ts +14 -0
  79. package/dist/modals/settings-modal.d.ts.map +1 -0
  80. package/dist/modals/settings-modal.js +128 -0
  81. package/dist/modals/settings-modal.js.map +1 -0
  82. package/dist/renderer.d.ts +75 -34
  83. package/dist/renderer.d.ts.map +1 -1
  84. package/dist/renderer.js +763 -529
  85. package/dist/renderer.js.map +1 -1
  86. package/dist/share-meta.d.ts +27 -0
  87. package/dist/share-meta.d.ts.map +1 -0
  88. package/dist/share-meta.js +113 -0
  89. package/dist/share-meta.js.map +1 -0
  90. package/dist/touch.d.ts +16 -0
  91. package/dist/touch.d.ts.map +1 -0
  92. package/dist/touch.js +60 -0
  93. package/dist/touch.js.map +1 -0
  94. package/dist/types.d.ts +134 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +60 -0
  97. package/dist/types.js.map +1 -0
  98. package/dist/utils/focus-trap.d.ts +6 -0
  99. package/dist/utils/focus-trap.d.ts.map +1 -0
  100. package/dist/utils/focus-trap.js +52 -0
  101. package/dist/utils/focus-trap.js.map +1 -0
  102. package/dist/utils/rich-text.d.ts +7 -0
  103. package/dist/utils/rich-text.d.ts.map +1 -0
  104. package/dist/utils/rich-text.js +31 -0
  105. package/dist/utils/rich-text.js.map +1 -0
  106. package/package.json +17 -3
  107. package/src/theme.css +1995 -523
@@ -0,0 +1,128 @@
1
+ import { SVG_ICONS } from '../icons.js';
2
+ import { escapeHtml } from '../utils/rich-text.js';
3
+ import { trapFocus } from '../utils/focus-trap.js';
4
+ function sanitizeUrl(url) {
5
+ const trimmed = (url || '').trim();
6
+ if (/^(https?:|data:|\/|\.\/)/i.test(trimmed))
7
+ return trimmed;
8
+ // Relative asset paths — strip quotes/parentheses that break CSS/HTML attrs
9
+ return trimmed.replace(/["'()<>\\]/g, '');
10
+ }
11
+ export function showGalleryModal(rootEl, vm, galleryItems = [], assetResolver) {
12
+ const existing = rootEl.querySelector('.kawa-modal-overlay:not(.kawa-confirm-overlay)');
13
+ if (existing)
14
+ existing.remove();
15
+ const overlay = document.createElement('div');
16
+ overlay.className = 'kawa-modal-overlay';
17
+ const card = document.createElement('div');
18
+ card.className = 'kawa-modal-card kawa-gallery-card';
19
+ card.setAttribute('role', 'dialog');
20
+ card.setAttribute('aria-modal', 'true');
21
+ card.setAttribute('aria-label', 'CG Gallery');
22
+ const header = document.createElement('div');
23
+ header.className = 'kawa-modal-header';
24
+ const title = document.createElement('div');
25
+ title.className = 'kawa-modal-title';
26
+ title.innerHTML = `<span>CG &amp; Event Gallery</span>`;
27
+ const closeBtn = document.createElement('button');
28
+ closeBtn.type = 'button';
29
+ closeBtn.className = 'kawa-btn';
30
+ closeBtn.innerHTML = `${SVG_ICONS.close} <span>Close</span>`;
31
+ closeBtn.setAttribute('aria-label', 'Close gallery modal');
32
+ const releaseFocus = trapFocus(card);
33
+ closeBtn.addEventListener('click', (e) => {
34
+ e.preventDefault();
35
+ releaseFocus();
36
+ overlay.remove();
37
+ });
38
+ header.appendChild(title);
39
+ header.appendChild(closeBtn);
40
+ const body = document.createElement('div');
41
+ body.className = 'kawa-modal-body kawa-gallery-body';
42
+ const unlocked = vm.getState().unlockedCGs || {};
43
+ if (galleryItems.length === 0) {
44
+ const emptyNotice = document.createElement('div');
45
+ emptyNotice.className = 'kawa-gallery-empty';
46
+ emptyNotice.textContent = 'No event illustrations registered in gallery.';
47
+ body.appendChild(emptyNotice);
48
+ }
49
+ else {
50
+ const grid = document.createElement('div');
51
+ grid.className = 'kawa-gallery-grid';
52
+ for (const item of galleryItems) {
53
+ const isUnlocked = Boolean(unlocked[item.id] || unlocked[item.image]);
54
+ const cardEl = document.createElement('button');
55
+ cardEl.type = 'button';
56
+ cardEl.className = `kawa-gallery-card ${isUnlocked ? 'unlocked' : 'locked'}`;
57
+ cardEl.setAttribute('aria-label', isUnlocked ? item.title : 'Locked CG');
58
+ if (isUnlocked) {
59
+ const imgUrl = sanitizeUrl(assetResolver(item.thumbnail || item.image, 'background'));
60
+ cardEl.innerHTML = `
61
+ <div class="kawa-gallery-thumb-container">
62
+ <img class="kawa-gallery-thumb" src="${escapeHtml(imgUrl)}" alt="${escapeHtml(item.title)}" loading="lazy" />
63
+ </div>
64
+ <div class="kawa-gallery-info">
65
+ <div class="kawa-gallery-title">${escapeHtml(item.title)}</div>
66
+ ${item.description ? `<div class="kawa-gallery-desc">${escapeHtml(item.description)}</div>` : ''}
67
+ </div>
68
+ `;
69
+ cardEl.addEventListener('click', (e) => {
70
+ e.preventDefault();
71
+ showLightbox(rootEl, sanitizeUrl(assetResolver(item.image, 'background')), item.title);
72
+ });
73
+ }
74
+ else {
75
+ cardEl.innerHTML = `
76
+ <div class="kawa-gallery-thumb-container kawa-gallery-locked">
77
+ <div class="kawa-gallery-lock-icon" aria-hidden="true">🔒</div>
78
+ <span>Locked</span>
79
+ </div>
80
+ <div class="kawa-gallery-info">
81
+ <div class="kawa-gallery-title">???</div>
82
+ <div class="kawa-gallery-desc">Keep playing to unlock</div>
83
+ </div>
84
+ `;
85
+ cardEl.disabled = true;
86
+ }
87
+ grid.appendChild(cardEl);
88
+ }
89
+ body.appendChild(grid);
90
+ }
91
+ card.appendChild(header);
92
+ card.appendChild(body);
93
+ overlay.appendChild(card);
94
+ rootEl.appendChild(overlay);
95
+ }
96
+ function showLightbox(rootEl, fullImageUrl, titleText) {
97
+ const lightbox = document.createElement('div');
98
+ lightbox.className = 'kawa-gallery-lightbox';
99
+ lightbox.setAttribute('role', 'dialog');
100
+ lightbox.setAttribute('aria-modal', 'true');
101
+ lightbox.setAttribute('aria-label', titleText);
102
+ lightbox.innerHTML = `
103
+ <div class="kawa-gallery-lightbox-content">
104
+ <img src="${escapeHtml(fullImageUrl)}" alt="${escapeHtml(titleText)}" class="kawa-gallery-lightbox-img" />
105
+ <div class="kawa-gallery-caption">${escapeHtml(titleText)}</div>
106
+ <button class="kawa-gallery-lightbox-close" aria-label="Close image lightbox">${SVG_ICONS.close}</button>
107
+ </div>
108
+ `;
109
+ const releaseFocus = trapFocus(lightbox);
110
+ const close = () => {
111
+ releaseFocus();
112
+ lightbox.remove();
113
+ };
114
+ lightbox.addEventListener('click', (e) => {
115
+ const target = e.target;
116
+ if (target.classList.contains('kawa-gallery-lightbox') || target.closest('.kawa-gallery-lightbox-close')) {
117
+ close();
118
+ }
119
+ });
120
+ lightbox.addEventListener('keydown', (e) => {
121
+ if (e.key === 'Escape') {
122
+ e.stopPropagation();
123
+ close();
124
+ }
125
+ });
126
+ rootEl.appendChild(lightbox);
127
+ }
128
+ //# sourceMappingURL=gallery-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gallery-modal.js","sourceRoot":"","sources":["../../src/modals/gallery-modal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { StoryVM } from '@kawaijs/runtime';
2
+ export declare function showHistoryModal(rootEl: HTMLElement, vm: StoryVM): void;
3
+ //# sourceMappingURL=history-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-modal.d.ts","sourceRoot":"","sources":["../../src/modals/history-modal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAKhD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAqEvE"}
@@ -0,0 +1,66 @@
1
+ import { SVG_ICONS } from '../icons.js';
2
+ import { formatRichText } from '../utils/rich-text.js';
3
+ import { trapFocus } from '../utils/focus-trap.js';
4
+ export function showHistoryModal(rootEl, vm) {
5
+ const existing = rootEl.querySelector('.kawa-modal-overlay:not(.kawa-confirm-overlay)');
6
+ if (existing)
7
+ existing.remove();
8
+ const overlay = document.createElement('div');
9
+ overlay.className = 'kawa-modal-overlay';
10
+ const card = document.createElement('div');
11
+ card.className = 'kawa-modal-card';
12
+ card.setAttribute('role', 'dialog');
13
+ card.setAttribute('aria-modal', 'true');
14
+ card.setAttribute('aria-label', 'Dialogue History');
15
+ const header = document.createElement('div');
16
+ header.className = 'kawa-modal-header';
17
+ const title = document.createElement('div');
18
+ title.className = 'kawa-modal-title';
19
+ title.innerHTML = `${SVG_ICONS.history} <span>Dialogue History</span>`;
20
+ const releaseFocus = trapFocus(card);
21
+ const close = () => {
22
+ releaseFocus();
23
+ overlay.remove();
24
+ };
25
+ const closeBtn = document.createElement('button');
26
+ closeBtn.type = 'button';
27
+ closeBtn.className = 'kawa-btn';
28
+ closeBtn.innerHTML = `${SVG_ICONS.close} <span>Close</span>`;
29
+ closeBtn.setAttribute('aria-label', 'Close history modal');
30
+ closeBtn.addEventListener('click', (e) => {
31
+ e.preventDefault();
32
+ close();
33
+ });
34
+ header.appendChild(title);
35
+ header.appendChild(closeBtn);
36
+ const body = document.createElement('div');
37
+ body.className = 'kawa-modal-body';
38
+ const entries = vm.getHistoryManager().getEntries();
39
+ if (entries.length === 0) {
40
+ const emptyMsg = document.createElement('div');
41
+ emptyMsg.textContent = 'No dialogue history yet.';
42
+ emptyMsg.style.opacity = '0.6';
43
+ body.appendChild(emptyMsg);
44
+ }
45
+ else {
46
+ for (const entry of entries) {
47
+ const item = document.createElement('div');
48
+ item.className = 'kawa-history-item';
49
+ if (entry.speakerDisplayName) {
50
+ const spk = document.createElement('div');
51
+ spk.className = 'kawa-history-speaker';
52
+ spk.textContent = entry.speakerDisplayName;
53
+ item.appendChild(spk);
54
+ }
55
+ const txt = document.createElement('div');
56
+ txt.innerHTML = formatRichText(entry.text);
57
+ item.appendChild(txt);
58
+ body.appendChild(item);
59
+ }
60
+ }
61
+ card.appendChild(header);
62
+ card.appendChild(body);
63
+ overlay.appendChild(card);
64
+ rootEl.appendChild(overlay);
65
+ }
66
+ //# sourceMappingURL=history-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-modal.js","sourceRoot":"","sources":["../../src/modals/history-modal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Modal text prompt for the KawaScript `input` directive.
3
+ */
4
+ export declare function showInputModal(rootEl: HTMLElement, options: {
5
+ prompt: string;
6
+ defaultValue?: string;
7
+ confirmText?: string;
8
+ onSubmit: (value: string) => void;
9
+ }): void;
10
+ //# sourceMappingURL=input-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-modal.d.ts","sourceRoot":"","sources":["../../src/modals/input-modal.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,GACA,IAAI,CAmEN"}
@@ -0,0 +1,62 @@
1
+ import { trapFocus } from '../utils/focus-trap.js';
2
+ /**
3
+ * Modal text prompt for the KawaScript `input` directive.
4
+ */
5
+ export function showInputModal(rootEl, options) {
6
+ const existing = rootEl.querySelector('.kawa-input-overlay');
7
+ if (existing)
8
+ existing.remove();
9
+ const overlay = document.createElement('div');
10
+ overlay.className = 'kawa-modal-overlay kawa-input-overlay';
11
+ overlay.style.zIndex = '10040';
12
+ const card = document.createElement('div');
13
+ card.className = 'kawa-modal-card kawa-input-card';
14
+ card.setAttribute('role', 'dialog');
15
+ card.setAttribute('aria-modal', 'true');
16
+ card.setAttribute('aria-label', options.prompt);
17
+ const title = document.createElement('div');
18
+ title.className = 'kawa-modal-title';
19
+ title.style.marginBottom = '16px';
20
+ title.textContent = options.prompt;
21
+ const input = document.createElement('input');
22
+ input.type = 'text';
23
+ input.className = 'kawa-input-field';
24
+ input.value = options.defaultValue ?? '';
25
+ input.setAttribute('aria-label', options.prompt);
26
+ input.autocomplete = 'off';
27
+ input.maxLength = 64;
28
+ const actions = document.createElement('div');
29
+ actions.style.display = 'flex';
30
+ actions.style.justifyContent = 'flex-end';
31
+ actions.style.gap = '10px';
32
+ actions.style.marginTop = '18px';
33
+ const confirmBtn = document.createElement('button');
34
+ confirmBtn.type = 'button';
35
+ confirmBtn.className = 'kawa-btn active';
36
+ confirmBtn.textContent = options.confirmText || 'OK';
37
+ const releaseFocus = trapFocus(card);
38
+ const submit = () => {
39
+ const value = input.value.trim() || 'Player';
40
+ releaseFocus();
41
+ overlay.remove();
42
+ options.onSubmit(value);
43
+ };
44
+ confirmBtn.addEventListener('click', (e) => {
45
+ e.preventDefault();
46
+ submit();
47
+ });
48
+ input.addEventListener('keydown', (e) => {
49
+ if (e.key === 'Enter') {
50
+ e.preventDefault();
51
+ submit();
52
+ }
53
+ });
54
+ actions.appendChild(confirmBtn);
55
+ card.appendChild(title);
56
+ card.appendChild(input);
57
+ card.appendChild(actions);
58
+ overlay.appendChild(card);
59
+ rootEl.appendChild(overlay);
60
+ window.setTimeout(() => input.focus(), 0);
61
+ }
62
+ //# sourceMappingURL=input-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-modal.js","sourceRoot":"","sources":["../../src/modals/input-modal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { StoryVM } from '@kawaijs/runtime';
2
+ export declare function showSaveLoadModal(rootEl: HTMLElement, vm: StoryVM, mode: 'save' | 'load', onLoaded?: () => void): Promise<void>;
3
+ //# sourceMappingURL=save-load-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-load-modal.d.ts","sourceRoot":"","sources":["../../src/modals/save-load-modal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAa1D,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB,OAAO,CAAC,IAAI,CAAC,CA8Qf"}
@@ -0,0 +1,262 @@
1
+ import { encodeContinueToken, buildContinueHref } from '@kawaijs/runtime';
2
+ import { SVG_ICONS } from '../icons.js';
3
+ import { showConfirmModal } from './confirm-modal.js';
4
+ import { trapFocus } from '../utils/focus-trap.js';
5
+ function cleanPreviewText(text) {
6
+ return text
7
+ .replace(/\{[a-zA-Z0-9#=_., -]+\}/g, '')
8
+ .replace(/\{(?:\/)[a-zA-Z0-9]+\}/g, '')
9
+ .trim();
10
+ }
11
+ export async function showSaveLoadModal(rootEl, vm, mode, onLoaded) {
12
+ const existing = rootEl.querySelector('.kawa-modal-overlay:not(.kawa-confirm-overlay)');
13
+ if (existing)
14
+ existing.remove();
15
+ const overlay = document.createElement('div');
16
+ overlay.className = 'kawa-modal-overlay';
17
+ const card = document.createElement('div');
18
+ card.className = 'kawa-modal-card';
19
+ card.setAttribute('role', 'dialog');
20
+ card.setAttribute('aria-modal', 'true');
21
+ card.setAttribute('aria-label', mode === 'save' ? 'Save Game' : 'Load Game');
22
+ const header = document.createElement('div');
23
+ header.className = 'kawa-modal-header';
24
+ const title = document.createElement('div');
25
+ title.className = 'kawa-modal-title';
26
+ title.innerHTML = `${mode === 'save' ? SVG_ICONS.save : SVG_ICONS.load} <span>${mode === 'save' ? 'Save Game' : 'Load Game'}</span>`;
27
+ const releaseFocus = trapFocus(card);
28
+ const close = () => {
29
+ releaseFocus();
30
+ overlay.remove();
31
+ };
32
+ const closeBtn = document.createElement('button');
33
+ closeBtn.type = 'button';
34
+ closeBtn.className = 'kawa-btn';
35
+ closeBtn.innerHTML = `${SVG_ICONS.close} <span>Close</span>`;
36
+ closeBtn.setAttribute('aria-label', 'Close modal');
37
+ closeBtn.addEventListener('click', (e) => {
38
+ e.preventDefault();
39
+ close();
40
+ });
41
+ header.appendChild(title);
42
+ header.appendChild(closeBtn);
43
+ const body = document.createElement('div');
44
+ body.className = 'kawa-modal-body';
45
+ const shareCurrent = document.createElement('button');
46
+ shareCurrent.type = 'button';
47
+ shareCurrent.className = 'kawa-slot-btn kawa-slot-btn-link kawa-continue-link-btn';
48
+ shareCurrent.innerHTML = `${SVG_ICONS.bookmark} <span>Copy continue link (current progress)</span>`;
49
+ shareCurrent.setAttribute('aria-label', 'Copy continue link for current progress');
50
+ shareCurrent.addEventListener('click', async (e) => {
51
+ e.preventDefault();
52
+ const slot = await vm.save('__continue_share__');
53
+ const token = encodeContinueToken(slot);
54
+ await vm.getSaveManager().deleteSlot('__continue_share__');
55
+ if (!token) {
56
+ shareCurrent.querySelector('span').textContent = 'Progress too large to link';
57
+ return;
58
+ }
59
+ const href = buildContinueHref(token);
60
+ try {
61
+ if (navigator.clipboard?.writeText) {
62
+ await navigator.clipboard.writeText(href);
63
+ }
64
+ else {
65
+ window.prompt('Copy this continue link:', href);
66
+ }
67
+ const label = shareCurrent.querySelector('span');
68
+ if (label) {
69
+ label.textContent = 'Continue link copied!';
70
+ window.setTimeout(() => {
71
+ label.textContent = 'Copy continue link (current progress)';
72
+ }, 1600);
73
+ }
74
+ }
75
+ catch {
76
+ window.prompt('Copy this continue link:', href);
77
+ }
78
+ });
79
+ body.appendChild(shareCurrent);
80
+ const grid = document.createElement('div');
81
+ grid.className = 'kawa-slots-grid';
82
+ const saveManager = vm.getSaveManager();
83
+ const slots = await saveManager.listSlots(6);
84
+ slots.forEach((slot, idx) => {
85
+ const slotNum = String(idx + 1);
86
+ const isOccupied = slot !== null;
87
+ const slotCard = document.createElement('div');
88
+ slotCard.className = `kawa-slot-card ${isOccupied ? 'kawa-slot-occupied' : 'kawa-slot-empty'}`;
89
+ const slotHeader = document.createElement('div');
90
+ slotHeader.className = 'kawa-slot-header';
91
+ const badge = document.createElement('span');
92
+ badge.className = `kawa-slot-badge ${isOccupied ? 'kawa-slot-badge-occupied' : 'kawa-slot-badge-empty'}`;
93
+ badge.innerHTML = `${SVG_ICONS.bookmark} <span>Slot ${slotNum}</span>`;
94
+ const timeSpan = document.createElement('span');
95
+ timeSpan.className = 'kawa-slot-time';
96
+ if (slot) {
97
+ const d = new Date(slot.timestamp);
98
+ const dateFormatted = d.toLocaleDateString(undefined, {
99
+ month: '2-digit',
100
+ day: '2-digit',
101
+ year: 'numeric'
102
+ });
103
+ const timeFormatted = d.toLocaleTimeString(undefined, {
104
+ hour: '2-digit',
105
+ minute: '2-digit',
106
+ second: '2-digit'
107
+ });
108
+ timeSpan.innerHTML = `${SVG_ICONS.clock} <span>${dateFormatted}, ${timeFormatted}</span>`;
109
+ timeSpan.title = d.toLocaleString();
110
+ }
111
+ else {
112
+ timeSpan.textContent = 'Empty';
113
+ }
114
+ slotHeader.appendChild(badge);
115
+ slotHeader.appendChild(timeSpan);
116
+ slotCard.appendChild(slotHeader);
117
+ if (slot) {
118
+ const preview = document.createElement('div');
119
+ preview.className = 'kawa-slot-preview';
120
+ const previewIcon = document.createElement('span');
121
+ previewIcon.className = 'kawa-slot-preview-icon';
122
+ previewIcon.innerHTML = SVG_ICONS.quote;
123
+ const previewText = document.createElement('span');
124
+ previewText.className = 'kawa-slot-preview-text';
125
+ previewText.textContent = cleanPreviewText(slot.previewText || `Label: ${slot.snapshot.state.currentLabel}`);
126
+ preview.appendChild(previewIcon);
127
+ preview.appendChild(previewText);
128
+ slotCard.appendChild(preview);
129
+ }
130
+ else {
131
+ const emptyState = document.createElement('div');
132
+ emptyState.className = 'kawa-slot-empty-content';
133
+ const emptyIcon = document.createElement('span');
134
+ emptyIcon.className = 'kawa-slot-empty-icon';
135
+ emptyIcon.innerHTML = SVG_ICONS.plus;
136
+ const emptyText = document.createElement('span');
137
+ emptyText.className = 'kawa-slot-empty-text';
138
+ emptyText.textContent = 'No save data';
139
+ emptyState.appendChild(emptyIcon);
140
+ emptyState.appendChild(emptyText);
141
+ slotCard.appendChild(emptyState);
142
+ }
143
+ const actions = document.createElement('div');
144
+ actions.className = 'kawa-slot-actions';
145
+ if (mode === 'save') {
146
+ const saveActionBtn = document.createElement('button');
147
+ saveActionBtn.type = 'button';
148
+ saveActionBtn.className = 'kawa-slot-btn kawa-slot-btn-save';
149
+ const label = isOccupied ? 'Overwrite' : 'Save Here';
150
+ saveActionBtn.innerHTML = `${SVG_ICONS.save} <span>${label}</span>`;
151
+ saveActionBtn.setAttribute('aria-label', `${label} slot ${slotNum}`);
152
+ saveActionBtn.addEventListener('click', async (e) => {
153
+ e.preventDefault();
154
+ await vm.save(slotNum);
155
+ close();
156
+ void showSaveLoadModal(rootEl, vm, 'save', onLoaded);
157
+ });
158
+ actions.appendChild(saveActionBtn);
159
+ }
160
+ else {
161
+ if (slot) {
162
+ const loadActionBtn = document.createElement('button');
163
+ loadActionBtn.type = 'button';
164
+ loadActionBtn.className = 'kawa-slot-btn kawa-slot-btn-load';
165
+ loadActionBtn.innerHTML = `${SVG_ICONS.load} <span>Load</span>`;
166
+ loadActionBtn.setAttribute('aria-label', `Load slot ${slotNum}`);
167
+ loadActionBtn.addEventListener('click', async (e) => {
168
+ e.preventDefault();
169
+ const ok = await vm.load(slotNum);
170
+ if (ok) {
171
+ close();
172
+ onLoaded?.();
173
+ }
174
+ });
175
+ actions.appendChild(loadActionBtn);
176
+ }
177
+ else {
178
+ const emptyBtn = document.createElement('button');
179
+ emptyBtn.type = 'button';
180
+ emptyBtn.className = 'kawa-slot-btn kawa-slot-btn-disabled';
181
+ emptyBtn.disabled = true;
182
+ emptyBtn.innerHTML = `${SVG_ICONS.load} <span>Empty</span>`;
183
+ actions.appendChild(emptyBtn);
184
+ }
185
+ }
186
+ if (slot) {
187
+ const linkBtn = document.createElement('button');
188
+ linkBtn.type = 'button';
189
+ linkBtn.className = 'kawa-slot-btn kawa-slot-btn-link';
190
+ linkBtn.innerHTML = `${SVG_ICONS.bookmark} <span>Copy Link</span>`;
191
+ linkBtn.title = 'Copy continue link';
192
+ linkBtn.setAttribute('aria-label', `Copy continue link for slot ${slotNum}`);
193
+ linkBtn.addEventListener('click', async (e) => {
194
+ e.preventDefault();
195
+ e.stopPropagation();
196
+ const token = encodeContinueToken(slot);
197
+ if (!token) {
198
+ linkBtn.querySelector('span').textContent = 'Too large';
199
+ return;
200
+ }
201
+ const href = buildContinueHref(token);
202
+ try {
203
+ if (navigator.clipboard?.writeText) {
204
+ await navigator.clipboard.writeText(href);
205
+ }
206
+ else {
207
+ const ta = document.createElement('textarea');
208
+ ta.value = href;
209
+ ta.style.position = 'fixed';
210
+ ta.style.left = '-9999px';
211
+ document.body.appendChild(ta);
212
+ ta.select();
213
+ document.execCommand('copy');
214
+ ta.remove();
215
+ }
216
+ const label = linkBtn.querySelector('span');
217
+ if (label) {
218
+ const prev = label.textContent;
219
+ label.textContent = 'Copied!';
220
+ window.setTimeout(() => {
221
+ label.textContent = prev;
222
+ }, 1400);
223
+ }
224
+ }
225
+ catch {
226
+ window.prompt('Copy this continue link:', href);
227
+ }
228
+ });
229
+ actions.appendChild(linkBtn);
230
+ const delBtn = document.createElement('button');
231
+ delBtn.type = 'button';
232
+ delBtn.className = 'kawa-slot-btn kawa-slot-btn-del';
233
+ delBtn.innerHTML = SVG_ICONS.trash;
234
+ delBtn.title = 'Delete Save';
235
+ delBtn.setAttribute('aria-label', `Delete slot ${slotNum}`);
236
+ delBtn.addEventListener('click', (e) => {
237
+ e.preventDefault();
238
+ e.stopPropagation();
239
+ showConfirmModal(rootEl, {
240
+ title: 'Delete Save',
241
+ message: `Are you sure you want to delete Slot ${slotNum}? This cannot be undone.`,
242
+ confirmText: 'Delete',
243
+ cancelText: 'Cancel',
244
+ onConfirm: async () => {
245
+ await saveManager.deleteSlot(slotNum);
246
+ close();
247
+ void showSaveLoadModal(rootEl, vm, mode, onLoaded);
248
+ }
249
+ });
250
+ });
251
+ actions.appendChild(delBtn);
252
+ }
253
+ slotCard.appendChild(actions);
254
+ grid.appendChild(slotCard);
255
+ });
256
+ body.appendChild(grid);
257
+ card.appendChild(header);
258
+ card.appendChild(body);
259
+ overlay.appendChild(card);
260
+ rootEl.appendChild(overlay);
261
+ }
262
+ //# sourceMappingURL=save-load-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-load-modal.js","sourceRoot":"","sources":["../../src/modals/save-load-modal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface SettingsModalOptions {
2
+ typewriterSpeed: number;
3
+ autoDelayMs: number;
4
+ musicVolume?: number;
5
+ soundVolume?: number;
6
+ onSettingsChange: (settings: {
7
+ typewriterSpeed: number;
8
+ autoDelayMs: number;
9
+ musicVolume?: number;
10
+ soundVolume?: number;
11
+ }) => void;
12
+ }
13
+ export declare function showSettingsModal(rootEl: HTMLElement, options: SettingsModalOptions): void;
14
+ //# sourceMappingURL=settings-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-modal.d.ts","sourceRoot":"","sources":["../../src/modals/settings-modal.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,CAAC,QAAQ,EAAE;QAC3B,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,CA2I1F"}