@kawaijs/renderer-dom 0.1.11 → 0.1.13

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 +43 -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 +48 -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 +258 -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 +257 -0
  29. package/dist/components/stage-layer.js.map +1 -0
  30. package/dist/components/vfx-layer.d.ts +32 -0
  31. package/dist/components/vfx-layer.d.ts.map +1 -0
  32. package/dist/components/vfx-layer.js +357 -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 +146 -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 +65 -56
  83. package/dist/renderer.d.ts.map +1 -1
  84. package/dist/renderer.js +655 -734
  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 +66 -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 +85 -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 +2081 -685
@@ -0,0 +1,103 @@
1
+ import { SVG_ICONS } from '../icons.js';
2
+ import { trapFocus } from '../utils/focus-trap.js';
3
+ import { escapeHtml } from '../utils/rich-text.js';
4
+ export function showAchievementsModal(rootEl, vm, catalog = []) {
5
+ const existing = rootEl.querySelector('.kawa-modal-overlay:not(.kawa-confirm-overlay)');
6
+ if (existing)
7
+ existing.remove();
8
+ const unlocked = vm.getState().achievements;
9
+ const byId = new Map();
10
+ for (const a of catalog)
11
+ byId.set(a.id, a);
12
+ for (const a of Object.values(unlocked)) {
13
+ if (!byId.has(a.id)) {
14
+ byId.set(a.id, { id: a.id, title: a.title, description: a.description });
15
+ }
16
+ }
17
+ const overlay = document.createElement('div');
18
+ overlay.className = 'kawa-modal-overlay';
19
+ const card = document.createElement('div');
20
+ card.className = 'kawa-modal-card';
21
+ card.setAttribute('role', 'dialog');
22
+ card.setAttribute('aria-modal', 'true');
23
+ card.setAttribute('aria-label', 'Achievements');
24
+ const header = document.createElement('div');
25
+ header.className = 'kawa-modal-header';
26
+ const title = document.createElement('div');
27
+ title.className = 'kawa-modal-title';
28
+ title.innerHTML = `${SVG_ICONS.bookmark} <span>Achievements</span>`;
29
+ const releaseFocus = trapFocus(card);
30
+ const close = () => {
31
+ releaseFocus();
32
+ overlay.remove();
33
+ };
34
+ const closeBtn = document.createElement('button');
35
+ closeBtn.type = 'button';
36
+ closeBtn.className = 'kawa-btn';
37
+ closeBtn.innerHTML = `${SVG_ICONS.close} <span>Close</span>`;
38
+ closeBtn.addEventListener('click', (e) => {
39
+ e.preventDefault();
40
+ close();
41
+ });
42
+ header.appendChild(title);
43
+ header.appendChild(closeBtn);
44
+ const body = document.createElement('div');
45
+ body.className = 'kawa-modal-body';
46
+ const list = document.createElement('div');
47
+ list.className = 'kawa-achievements-list';
48
+ const entries = Array.from(byId.values());
49
+ if (entries.length === 0) {
50
+ const empty = document.createElement('p');
51
+ empty.className = 'kawa-slot-empty-text';
52
+ empty.textContent = 'No achievements yet. Use unlock "id" in your script.';
53
+ list.appendChild(empty);
54
+ }
55
+ else {
56
+ for (const def of entries) {
57
+ const got = unlocked[def.id];
58
+ const row = document.createElement('div');
59
+ row.className = `kawa-achievement-row ${got ? 'unlocked' : 'locked'}`;
60
+ row.innerHTML = `
61
+ <div class="kawa-achievement-title">${escapeHtml(def.title || def.id)}</div>
62
+ <div class="kawa-achievement-desc">${escapeHtml(got?.description || def.description || (got ? 'Unlocked' : 'Locked'))}</div>
63
+ ${got
64
+ ? `<div class="kawa-achievement-time">${new Date(got.unlockedAt).toLocaleString()}</div>`
65
+ : ''}
66
+ `;
67
+ list.appendChild(row);
68
+ }
69
+ }
70
+ const exportBtn = document.createElement('button');
71
+ exportBtn.type = 'button';
72
+ exportBtn.className = 'kawa-slot-btn kawa-slot-btn-link';
73
+ exportBtn.style.width = '100%';
74
+ exportBtn.style.marginTop = '12px';
75
+ exportBtn.innerHTML = `${SVG_ICONS.save} <span>Export JSON</span>`;
76
+ exportBtn.addEventListener('click', async (e) => {
77
+ e.preventDefault();
78
+ const payload = JSON.stringify(vm.exportAchievementsJson(), null, 2);
79
+ try {
80
+ if (navigator.clipboard?.writeText) {
81
+ await navigator.clipboard.writeText(payload);
82
+ exportBtn.querySelector('span').textContent = 'Copied!';
83
+ }
84
+ else {
85
+ window.prompt('Achievements JSON:', payload);
86
+ }
87
+ }
88
+ catch {
89
+ window.prompt('Achievements JSON:', payload);
90
+ }
91
+ });
92
+ body.appendChild(list);
93
+ body.appendChild(exportBtn);
94
+ card.appendChild(header);
95
+ card.appendChild(body);
96
+ overlay.appendChild(card);
97
+ rootEl.appendChild(overlay);
98
+ overlay.addEventListener('click', (e) => {
99
+ if (e.target === overlay)
100
+ close();
101
+ });
102
+ }
103
+ //# sourceMappingURL=achievements-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"achievements-modal.js","sourceRoot":"","sources":["../../src/modals/achievements-modal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function showConfirmModal(rootEl: HTMLElement, options: {
2
+ title?: string;
3
+ message: string;
4
+ confirmText?: string;
5
+ cancelText?: string;
6
+ onConfirm: () => void;
7
+ onCancel?: () => void;
8
+ }): void;
9
+ //# sourceMappingURL=confirm-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-modal.d.ts","sourceRoot":"","sources":["../../src/modals/confirm-modal.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,GACA,IAAI,CAyFN"}
@@ -0,0 +1,80 @@
1
+ import { SVG_ICONS } from '../icons.js';
2
+ import { escapeHtml } from '../utils/rich-text.js';
3
+ import { trapFocus } from '../utils/focus-trap.js';
4
+ export function showConfirmModal(rootEl, options) {
5
+ // Stack on top of existing modals — do not destroy the parent overlay.
6
+ const overlay = document.createElement('div');
7
+ overlay.className = 'kawa-modal-overlay kawa-confirm-overlay';
8
+ overlay.style.zIndex = '10050';
9
+ const card = document.createElement('div');
10
+ card.className = 'kawa-modal-card kawa-confirm-card';
11
+ card.setAttribute('role', 'dialog');
12
+ card.setAttribute('aria-modal', 'true');
13
+ card.setAttribute('aria-label', options.title || 'Confirmation');
14
+ const header = document.createElement('div');
15
+ header.className = 'kawa-modal-header';
16
+ const title = document.createElement('div');
17
+ title.className = 'kawa-modal-title';
18
+ title.innerHTML = `<span>${escapeHtml(options.title || 'Confirmation')}</span>`;
19
+ const closeBtn = document.createElement('button');
20
+ closeBtn.type = 'button';
21
+ closeBtn.className = 'kawa-btn';
22
+ closeBtn.innerHTML = `${SVG_ICONS.close} <span>Close</span>`;
23
+ closeBtn.setAttribute('aria-label', 'Close');
24
+ const releaseFocus = trapFocus(card);
25
+ const close = (cancelled) => {
26
+ releaseFocus();
27
+ overlay.remove();
28
+ if (cancelled)
29
+ options.onCancel?.();
30
+ };
31
+ closeBtn.addEventListener('click', (e) => {
32
+ e.preventDefault();
33
+ close(true);
34
+ });
35
+ header.appendChild(title);
36
+ header.appendChild(closeBtn);
37
+ const body = document.createElement('div');
38
+ body.className = 'kawa-modal-body';
39
+ body.style.padding = '20px 8px';
40
+ const msg = document.createElement('p');
41
+ msg.className = 'kawa-confirm-msg';
42
+ msg.textContent = options.message;
43
+ msg.style.fontSize = '1.05rem';
44
+ msg.style.color = '#e2e8f0';
45
+ msg.style.textAlign = 'center';
46
+ msg.style.margin = '0 0 24px 0';
47
+ body.appendChild(msg);
48
+ const actions = document.createElement('div');
49
+ actions.style.display = 'flex';
50
+ actions.style.gap = '12px';
51
+ actions.style.justifyContent = 'center';
52
+ const confirmBtn = document.createElement('button');
53
+ confirmBtn.type = 'button';
54
+ confirmBtn.className = 'kawa-btn active';
55
+ confirmBtn.style.padding = '8px 20px';
56
+ confirmBtn.textContent = options.confirmText || 'Confirm';
57
+ confirmBtn.addEventListener('click', (e) => {
58
+ e.preventDefault();
59
+ releaseFocus();
60
+ overlay.remove();
61
+ options.onConfirm();
62
+ });
63
+ const cancelBtn = document.createElement('button');
64
+ cancelBtn.type = 'button';
65
+ cancelBtn.className = 'kawa-btn';
66
+ cancelBtn.style.padding = '8px 20px';
67
+ cancelBtn.textContent = options.cancelText || 'Cancel';
68
+ cancelBtn.addEventListener('click', (e) => {
69
+ e.preventDefault();
70
+ close(true);
71
+ });
72
+ actions.appendChild(cancelBtn);
73
+ actions.appendChild(confirmBtn);
74
+ body.appendChild(actions);
75
+ card.appendChild(header);
76
+ card.appendChild(body);
77
+ overlay.appendChild(card);
78
+ rootEl.appendChild(overlay);
79
+ }
80
+ //# sourceMappingURL=confirm-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-modal.js","sourceRoot":"","sources":["../../src/modals/confirm-modal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { StoryVM } from '@kawaijs/runtime';
2
+ import type { AssetType, GalleryItem } from '../types.js';
3
+ export declare function showGalleryModal(rootEl: HTMLElement, vm: StoryVM, galleryItems: readonly GalleryItem[] | undefined, assetResolver: (path: string, type: AssetType) => string): void;
4
+ //# sourceMappingURL=gallery-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gallery-modal.d.ts","sourceRoot":"","sources":["../../src/modals/gallery-modal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW1D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,EAAE,EAAE,OAAO,EACX,YAAY,EAAE,SAAS,WAAW,EAAE,YAAK,EACzC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,MAAM,GACvD,IAAI,CA8FN"}
@@ -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"}