@bitmagic/cli 0.1.64-dev.14 → 0.1.64-dev.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -705,8 +705,10 @@ Click the name for the rest of the answer: the game's id, the environment it tal
|
|
|
705
705
|
built for, its engine version — and the two pictures that decide how the whole project looks, the
|
|
706
706
|
**accepted reference image** and the **cover art**, side by side. Both were previously visible only
|
|
707
707
|
in a terminal (`bitmagic reference show`, `bitmagic cover`); the dialog draws them from the local
|
|
708
|
-
copies under `.bitmagic/`, so they are there whether or not the recorded URL still resolves.
|
|
709
|
-
|
|
708
|
+
copies under `.bitmagic/`, so they are there whether or not the recorded URL still resolves. Click
|
|
709
|
+
either thumbnail to see it full size — a couple of hundred pixels of an image generated at 1024 is
|
|
710
|
+
not enough to judge the look it exists to fix; click anywhere, or press Escape, and the dialog is
|
|
711
|
+
still underneath. A project missing one is told which command makes it. The reference's caption warns you when it was
|
|
710
712
|
never re-hosted, because that URL — the one every later generation inherits — will expire.
|
|
711
713
|
|
|
712
714
|
What you reach for all session sits in the bar: the **Game / Editor** tabs, **Auto-reload**, the
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* name, in the weight the bar already gave it, that happens to be clickable. Only the hover and
|
|
23
23
|
* focus treatments are added, so it reads as a control the moment a pointer is near it.
|
|
24
24
|
*/
|
|
25
|
-
export declare const GAME_INFO_PANEL_CSS = "\n /* The name IS the button. Bold and white like the label it replaces, with the id and env it\n absorbed now one click away rather than two more slots in the bar. */\n #game-info-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n max-width: 26vw;\n padding: 4px 8px;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 6px;\n color: var(--bm-text);\n font-family: var(--bm-font);\n font-size: 14px;\n font-weight: 700;\n line-height: 1.2;\n cursor: pointer;\n transition: background .15s ease, border-color .15s ease;\n }\n #game-info-toggle:hover { background: var(--bm-surface-alt); border-color: var(--bm-border-muted); }\n #game-info-toggle:focus-visible { outline: none; box-shadow: var(--bm-focus-ring); }\n #game-info-toggle .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n /* The affordance. Dim, so the name still reads as the name rather than as a menu. */\n #game-info-toggle .chevron { flex: none; color: var(--bm-text-dim); font-size: 10px; }\n\n /* Level with the other two dialogs: all three are opened from different controls and never\n stack. */\n #info-overlay { z-index: 10; }\n #info-dialog { width: min(560px, 92vw); max-height: 86vh; overflow-y: auto; padding: 20px; }\n #info-dialog h2 { margin-bottom: 16px; }\n /* A definition list, because that is what this is: a fixed set of fields with one value each.\n Two columns so the values line up and the whole block is scannable without reading it. */\n #info-facts { display: grid; grid-template-columns: auto 1fr; gap: 8px 16px; margin: 0 0 20px; }\n #info-facts dt { font-size: 12px; font-weight: 700; text-transform: uppercase;\n letter-spacing: 1.4px; color: var(--bm-text-muted); }\n #info-facts dd { margin: 0; min-width: 0; color: var(--bm-text); overflow-wrap: anywhere; }\n /* Ids, versions and modes are read character by character; names and genres are read as words. */\n #info-facts dd.mono { font-family: var(--bm-font-mono); font-size: 12px; }\n #info-facts dd .note { color: var(--bm-text-dim); }\n /* The two pictures, side by side: they are the same kind of thing and are compared, not read\n in order. They wrap to one column when the dialog is at its narrowest. */\n #info-art { display: flex; flex-wrap: wrap; gap: 16px; }\n .info-art-card { flex: 1 1 200px; min-width: 0; }\n .info-art-card .bm-label { display: block; margin-bottom: 8px; }\n /* A square frame either way, so a present picture and a missing one leave the dialog the same\n height and the two cards stay level. */\n .info-art-frame {\n display: flex;\n align-items: center;\n justify-content: center;\n aspect-ratio: 1 / 1;\n padding: 12px;\n background: var(--bm-surface-alt);\n border: 1px solid var(--bm-border-muted);\n border-radius: 6px;\n text-align: center;\n }\n /* The frame holds the picture AND the \"not yet\" copy, and shows exactly one of them: the class\n is applied by openInfo(), because a page assembled as a string has no inline styles to toggle\n (DESIGN.md, and the same rule the Creator follows). */\n .info-art-frame img { display: none; max-width: 100%; max-height: 100%; border-radius: 4px; }\n .info-art-frame.has-image img { display: block; }\n .info-art-frame.has-image .empty { display: none; }\n /* What to run to make the missing one, rather than the bare fact that it is missing. */\n .info-art-frame .empty { font-size: 12px; color: var(--bm-text-dim); }\n .info-art-frame .empty code { display: block; margin-top: 6px; color: var(--bm-aqua);\n font-family: var(--bm-font-mono); }\n .info-art-card .caption { margin-top: 8px; font-size: 12px; color: var(--bm-text-dim);\n overflow-wrap: anywhere; }\n .info-art-card .caption a { color: var(--bm-aqua); text-decoration: none; }\n .info-art-card .caption a:hover { text-decoration: underline; }\n /* An expiring reference URL is the one thing on this card worth interrupting for. */\n .info-art-card .caption .stale { color: var(--bm-pumpkin); }\n /* The sidecar could not answer. Said in the dialog rather than in the bar's status line, which\n belongs to the save state and would be overwritten by the next poll. */\n #info-error { display: none; margin: 0 0 16px; font-size: 12px; color: var(--bm-pumpkin); }\n #info-error.show { display: block; }\n #info-actions { display: flex; justify-content: flex-end; margin-top: 20px; }\n";
|
|
25
|
+
export declare const GAME_INFO_PANEL_CSS = "\n /* The name IS the button. Bold and white like the label it replaces, with the id and env it\n absorbed now one click away rather than two more slots in the bar. */\n #game-info-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n max-width: 26vw;\n padding: 4px 8px;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 6px;\n color: var(--bm-text);\n font-family: var(--bm-font);\n font-size: 14px;\n font-weight: 700;\n line-height: 1.2;\n cursor: pointer;\n transition: background .15s ease, border-color .15s ease;\n }\n #game-info-toggle:hover { background: var(--bm-surface-alt); border-color: var(--bm-border-muted); }\n #game-info-toggle:focus-visible { outline: none; box-shadow: var(--bm-focus-ring); }\n #game-info-toggle .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n /* The affordance. Dim, so the name still reads as the name rather than as a menu. */\n #game-info-toggle .chevron { flex: none; color: var(--bm-text-dim); font-size: 10px; }\n\n /* Level with the other two dialogs: all three are opened from different controls and never\n stack. */\n #info-overlay { z-index: 10; }\n #info-dialog { width: min(560px, 92vw); max-height: 86vh; overflow-y: auto; padding: 20px; }\n #info-dialog h2 { margin-bottom: 16px; }\n /* A definition list, because that is what this is: a fixed set of fields with one value each.\n Two columns so the values line up and the whole block is scannable without reading it. */\n #info-facts { display: grid; grid-template-columns: auto 1fr; gap: 8px 16px; margin: 0 0 20px; }\n #info-facts dt { font-size: 12px; font-weight: 700; text-transform: uppercase;\n letter-spacing: 1.4px; color: var(--bm-text-muted); }\n #info-facts dd { margin: 0; min-width: 0; color: var(--bm-text); overflow-wrap: anywhere; }\n /* Ids, versions and modes are read character by character; names and genres are read as words. */\n #info-facts dd.mono { font-family: var(--bm-font-mono); font-size: 12px; }\n #info-facts dd .note { color: var(--bm-text-dim); }\n /* The two pictures, side by side: they are the same kind of thing and are compared, not read\n in order. They wrap to one column when the dialog is at its narrowest. */\n #info-art { display: flex; flex-wrap: wrap; gap: 16px; }\n .info-art-card { flex: 1 1 200px; min-width: 0; }\n .info-art-card .bm-label { display: block; margin-bottom: 8px; }\n /* A square frame either way, so a present picture and a missing one leave the dialog the same\n height and the two cards stay level.\n\n A button rather than a div, because with a picture in it that is what it is: the thumbnail is\n a couple of hundred pixels of an image generated at 1024, which is not enough to judge the\n look it is supposed to fix \u2014 clicking it opens the full size. Disabled while the card is\n empty, so the control is dead exactly when there is nothing to open, and reachable by keyboard\n for free either way. */\n .info-art-frame {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n aspect-ratio: 1 / 1;\n padding: 12px;\n background: var(--bm-surface-alt);\n border: 1px solid var(--bm-border-muted);\n border-radius: 6px;\n color: inherit;\n font: inherit;\n text-align: center;\n cursor: zoom-in;\n transition: border-color .15s ease;\n }\n .info-art-frame:hover:not(:disabled) { border-color: var(--bm-text-dim); }\n .info-art-frame:focus-visible { outline: none; box-shadow: var(--bm-focus-ring); }\n /* Not dimmed like an ordinary disabled control: there is nothing to enable here, and greying the\n \"not yet\" copy would hide the command that fixes it. */\n .info-art-frame:disabled { cursor: default; }\n /* The frame holds the picture AND the \"not yet\" copy, and shows exactly one of them: the class\n is applied by openInfo(), because a page assembled as a string has no inline styles to toggle\n (DESIGN.md, and the same rule the Creator follows). */\n .info-art-frame img { display: none; max-width: 100%; max-height: 100%; border-radius: 4px; }\n .info-art-frame.has-image img { display: block; }\n .info-art-frame.has-image .empty { display: none; }\n /* What to run to make the missing one, rather than the bare fact that it is missing. */\n .info-art-frame .empty { font-size: 12px; color: var(--bm-text-dim); }\n .info-art-frame .empty code { display: block; margin-top: 6px; color: var(--bm-aqua);\n font-family: var(--bm-font-mono); }\n .info-art-card .caption { margin-top: 8px; font-size: 12px; color: var(--bm-text-dim);\n overflow-wrap: anywhere; }\n .info-art-card .caption a { color: var(--bm-aqua); text-decoration: none; }\n .info-art-card .caption a:hover { text-decoration: underline; }\n /* An expiring reference URL is the one thing on this card worth interrupting for. */\n .info-art-card .caption .stale { color: var(--bm-pumpkin); }\n /* === The full-size view ===================================================================\n A layer of its own above the dialog rather than a new browser tab: the dev view is the window\n the creator is already in, and a tab showing a bare image on a loopback port is a place they\n then have to come back from. Click anywhere, or Escape, and the dialog is still underneath\n exactly as it was. */\n #info-zoom { z-index: 11; flex-direction: column; gap: 12px; cursor: zoom-out; }\n #info-zoom img { max-width: 92vw; max-height: 84vh; border-radius: 6px;\n box-shadow: var(--bm-shadow-dialog); }\n #info-zoom .hint { font-size: 12px; color: var(--bm-text-muted); }\n\n /* The sidecar could not answer. Said in the dialog rather than in the bar's status line, which\n belongs to the save state and would be overwritten by the next poll. */\n #info-error { display: none; margin: 0 0 16px; font-size: 12px; color: var(--bm-pumpkin); }\n #info-error.show { display: block; }\n #info-actions { display: flex; justify-content: flex-end; margin-top: 20px; }\n";
|
|
26
26
|
/**
|
|
27
27
|
* Markup for the Game-info dialog.
|
|
28
28
|
*
|
|
@@ -30,4 +30,4 @@ export declare const GAME_INFO_PANEL_CSS = "\n /* The name IS the button. Bold
|
|
|
30
30
|
* interpolated at render time: this page is built once when the server starts, and `bitmagic
|
|
31
31
|
* cover` or `bitmagic reference accept` usually runs hours later in another terminal.
|
|
32
32
|
*/
|
|
33
|
-
export declare const GAME_INFO_PANEL_HTML = " <div id=\"info-overlay\" class=\"bm-overlay\">\n <div id=\"info-dialog\" class=\"bm-dialog\">\n <h2 id=\"info-title\"></h2>\n <p id=\"info-error\"></p>\n <dl id=\"info-facts\">\n <dt>Game id</dt><dd id=\"info-game-id\" class=\"mono\"></dd>\n <dt>Environment</dt><dd id=\"info-environment\" class=\"mono\"></dd>\n <dt>Genre</dt><dd id=\"info-genre\"></dd>\n <dt>Physics</dt><dd id=\"info-physics\" class=\"mono\"></dd>\n <dt>Art style</dt><dd id=\"info-art-style\"></dd>\n <dt>Platform</dt><dd id=\"info-platform\"></dd>\n <dt>Engine</dt><dd id=\"info-engine\" class=\"mono\"></dd>\n </dl>\n <div id=\"info-art\">\n <div class=\"info-art-card\">\n <span class=\"bm-label\">Reference image</span>\n <
|
|
33
|
+
export declare const GAME_INFO_PANEL_HTML = " <div id=\"info-overlay\" class=\"bm-overlay\">\n <div id=\"info-dialog\" class=\"bm-dialog\">\n <h2 id=\"info-title\"></h2>\n <p id=\"info-error\"></p>\n <dl id=\"info-facts\">\n <dt>Game id</dt><dd id=\"info-game-id\" class=\"mono\"></dd>\n <dt>Environment</dt><dd id=\"info-environment\" class=\"mono\"></dd>\n <dt>Genre</dt><dd id=\"info-genre\"></dd>\n <dt>Physics</dt><dd id=\"info-physics\" class=\"mono\"></dd>\n <dt>Art style</dt><dd id=\"info-art-style\"></dd>\n <dt>Platform</dt><dd id=\"info-platform\"></dd>\n <dt>Engine</dt><dd id=\"info-engine\" class=\"mono\"></dd>\n </dl>\n <div id=\"info-art\">\n <div class=\"info-art-card\">\n <span class=\"bm-label\">Reference image</span>\n <button id=\"info-reference-frame\" class=\"info-art-frame\" type=\"button\" disabled title=\"See it full size\">\n <img id=\"info-reference-img\" alt=\"This game's accepted reference image\">\n <span id=\"info-reference-empty\" class=\"empty\">No reference image yet.<code>bitmagic reference make</code></span>\n </button>\n <p id=\"info-reference-caption\" class=\"caption\"></p>\n </div>\n <div class=\"info-art-card\">\n <span class=\"bm-label\">Cover art</span>\n <button id=\"info-cover-frame\" class=\"info-art-frame\" type=\"button\" disabled title=\"See it full size\">\n <img id=\"info-cover-img\" alt=\"This game's cover art\">\n <span id=\"info-cover-empty\" class=\"empty\">No cover art yet.<code>bitmagic cover</code></span>\n </button>\n <p id=\"info-cover-caption\" class=\"caption\"></p>\n </div>\n </div>\n <div id=\"info-actions\">\n <button id=\"info-close\" class=\"bm-pill bm-pill--primary\" type=\"button\">Close</button>\n </div>\n </div>\n </div>\n <div id=\"info-zoom\" class=\"bm-overlay\">\n <img id=\"info-zoom-img\" alt=\"\">\n <span class=\"hint\">Click anywhere to go back.</span>\n </div>\n";
|
|
@@ -68,18 +68,34 @@ export const GAME_INFO_PANEL_CSS = `
|
|
|
68
68
|
.info-art-card { flex: 1 1 200px; min-width: 0; }
|
|
69
69
|
.info-art-card .bm-label { display: block; margin-bottom: 8px; }
|
|
70
70
|
/* A square frame either way, so a present picture and a missing one leave the dialog the same
|
|
71
|
-
height and the two cards stay level.
|
|
71
|
+
height and the two cards stay level.
|
|
72
|
+
|
|
73
|
+
A button rather than a div, because with a picture in it that is what it is: the thumbnail is
|
|
74
|
+
a couple of hundred pixels of an image generated at 1024, which is not enough to judge the
|
|
75
|
+
look it is supposed to fix — clicking it opens the full size. Disabled while the card is
|
|
76
|
+
empty, so the control is dead exactly when there is nothing to open, and reachable by keyboard
|
|
77
|
+
for free either way. */
|
|
72
78
|
.info-art-frame {
|
|
73
79
|
display: flex;
|
|
74
80
|
align-items: center;
|
|
75
81
|
justify-content: center;
|
|
82
|
+
width: 100%;
|
|
76
83
|
aspect-ratio: 1 / 1;
|
|
77
84
|
padding: 12px;
|
|
78
85
|
background: var(--bm-surface-alt);
|
|
79
86
|
border: 1px solid var(--bm-border-muted);
|
|
80
87
|
border-radius: 6px;
|
|
88
|
+
color: inherit;
|
|
89
|
+
font: inherit;
|
|
81
90
|
text-align: center;
|
|
91
|
+
cursor: zoom-in;
|
|
92
|
+
transition: border-color .15s ease;
|
|
82
93
|
}
|
|
94
|
+
.info-art-frame:hover:not(:disabled) { border-color: var(--bm-text-dim); }
|
|
95
|
+
.info-art-frame:focus-visible { outline: none; box-shadow: var(--bm-focus-ring); }
|
|
96
|
+
/* Not dimmed like an ordinary disabled control: there is nothing to enable here, and greying the
|
|
97
|
+
"not yet" copy would hide the command that fixes it. */
|
|
98
|
+
.info-art-frame:disabled { cursor: default; }
|
|
83
99
|
/* The frame holds the picture AND the "not yet" copy, and shows exactly one of them: the class
|
|
84
100
|
is applied by openInfo(), because a page assembled as a string has no inline styles to toggle
|
|
85
101
|
(DESIGN.md, and the same rule the Creator follows). */
|
|
@@ -96,6 +112,16 @@ export const GAME_INFO_PANEL_CSS = `
|
|
|
96
112
|
.info-art-card .caption a:hover { text-decoration: underline; }
|
|
97
113
|
/* An expiring reference URL is the one thing on this card worth interrupting for. */
|
|
98
114
|
.info-art-card .caption .stale { color: var(--bm-pumpkin); }
|
|
115
|
+
/* === The full-size view ===================================================================
|
|
116
|
+
A layer of its own above the dialog rather than a new browser tab: the dev view is the window
|
|
117
|
+
the creator is already in, and a tab showing a bare image on a loopback port is a place they
|
|
118
|
+
then have to come back from. Click anywhere, or Escape, and the dialog is still underneath
|
|
119
|
+
exactly as it was. */
|
|
120
|
+
#info-zoom { z-index: 11; flex-direction: column; gap: 12px; cursor: zoom-out; }
|
|
121
|
+
#info-zoom img { max-width: 92vw; max-height: 84vh; border-radius: 6px;
|
|
122
|
+
box-shadow: var(--bm-shadow-dialog); }
|
|
123
|
+
#info-zoom .hint { font-size: 12px; color: var(--bm-text-muted); }
|
|
124
|
+
|
|
99
125
|
/* The sidecar could not answer. Said in the dialog rather than in the bar's status line, which
|
|
100
126
|
belongs to the save state and would be overwritten by the next poll. */
|
|
101
127
|
#info-error { display: none; margin: 0 0 16px; font-size: 12px; color: var(--bm-pumpkin); }
|
|
@@ -125,18 +151,18 @@ export const GAME_INFO_PANEL_HTML = ` <div id="info-overlay" class="bm-overlay"
|
|
|
125
151
|
<div id="info-art">
|
|
126
152
|
<div class="info-art-card">
|
|
127
153
|
<span class="bm-label">Reference image</span>
|
|
128
|
-
<
|
|
154
|
+
<button id="info-reference-frame" class="info-art-frame" type="button" disabled title="See it full size">
|
|
129
155
|
<img id="info-reference-img" alt="This game's accepted reference image">
|
|
130
156
|
<span id="info-reference-empty" class="empty">No reference image yet.<code>bitmagic reference make</code></span>
|
|
131
|
-
</
|
|
157
|
+
</button>
|
|
132
158
|
<p id="info-reference-caption" class="caption"></p>
|
|
133
159
|
</div>
|
|
134
160
|
<div class="info-art-card">
|
|
135
161
|
<span class="bm-label">Cover art</span>
|
|
136
|
-
<
|
|
162
|
+
<button id="info-cover-frame" class="info-art-frame" type="button" disabled title="See it full size">
|
|
137
163
|
<img id="info-cover-img" alt="This game's cover art">
|
|
138
164
|
<span id="info-cover-empty" class="empty">No cover art yet.<code>bitmagic cover</code></span>
|
|
139
|
-
</
|
|
165
|
+
</button>
|
|
140
166
|
<p id="info-cover-caption" class="caption"></p>
|
|
141
167
|
</div>
|
|
142
168
|
</div>
|
|
@@ -145,5 +171,9 @@ export const GAME_INFO_PANEL_HTML = ` <div id="info-overlay" class="bm-overlay"
|
|
|
145
171
|
</div>
|
|
146
172
|
</div>
|
|
147
173
|
</div>
|
|
174
|
+
<div id="info-zoom" class="bm-overlay">
|
|
175
|
+
<img id="info-zoom-img" alt="">
|
|
176
|
+
<span class="hint">Click anywhere to go back.</span>
|
|
177
|
+
</div>
|
|
148
178
|
`;
|
|
149
179
|
//# sourceMappingURL=game-info-panel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-info-panel.js","sourceRoot":"","sources":["../../src/editor/game-info-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"game-info-panel.js","sourceRoot":"","sources":["../../src/editor/game-info-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGlC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCnC,CAAC"}
|
|
@@ -379,6 +379,10 @@ ${ASSET_DETAIL_HTML}
|
|
|
379
379
|
var infoCoverFrame = document.getElementById('info-cover-frame');
|
|
380
380
|
var infoCoverImg = document.getElementById('info-cover-img');
|
|
381
381
|
var infoCoverCaption = document.getElementById('info-cover-caption');
|
|
382
|
+
var infoZoom = document.getElementById('info-zoom');
|
|
383
|
+
var infoZoomImg = document.getElementById('info-zoom-img');
|
|
384
|
+
/** Which thumbnail opened the full-size layer, so closing it gives focus back. */
|
|
385
|
+
var zoomOrigin = null;
|
|
382
386
|
/** The last publish the poll saw, or null until this project has had one. */
|
|
383
387
|
var lastPublish = null;
|
|
384
388
|
var recordToggle = document.getElementById('record');
|
|
@@ -1283,6 +1287,9 @@ ${ASSET_DETAIL_HTML}
|
|
|
1283
1287
|
caption.textContent = '';
|
|
1284
1288
|
img.removeAttribute('src');
|
|
1285
1289
|
frame.classList.remove('has-image');
|
|
1290
|
+
// Dead exactly while there is nothing to open. Re-disabled on every fill, because the picture
|
|
1291
|
+
// that was there last time may have been cleared since.
|
|
1292
|
+
frame.disabled = true;
|
|
1286
1293
|
if (!image) return;
|
|
1287
1294
|
// Prefix tests rather than a regex: a slash inside one would have to be double-escaped to
|
|
1288
1295
|
// survive this literal, and that is the exact trap shell-page.test.ts exists to catch.
|
|
@@ -1305,9 +1312,13 @@ ${ASSET_DETAIL_HTML}
|
|
|
1305
1312
|
return;
|
|
1306
1313
|
}
|
|
1307
1314
|
frame.classList.remove('has-image');
|
|
1315
|
+
// The card is back to its "not yet" copy, so the control that opens a picture must go
|
|
1316
|
+
// dead with it rather than open an empty layer.
|
|
1317
|
+
frame.disabled = true;
|
|
1308
1318
|
};
|
|
1309
1319
|
img.src = src;
|
|
1310
1320
|
frame.classList.add('has-image');
|
|
1321
|
+
frame.disabled = false;
|
|
1311
1322
|
}
|
|
1312
1323
|
var label = image.candidateId || (kind === 'cover' ? 'Cover image' : 'Reference image');
|
|
1313
1324
|
if (remote) {
|
|
@@ -1339,6 +1350,33 @@ ${ASSET_DETAIL_HTML}
|
|
|
1339
1350
|
infoToggle.focus();
|
|
1340
1351
|
}
|
|
1341
1352
|
|
|
1353
|
+
/**
|
|
1354
|
+
* The picture at full size, on a layer above the dialog.
|
|
1355
|
+
*
|
|
1356
|
+
* The thumbnail is a couple of hundred pixels of an image generated at 1024, which is not enough
|
|
1357
|
+
* to judge the look it exists to fix. A layer rather than a new tab: the dev view is the window
|
|
1358
|
+
* the creator is already in, and the dialog is still underneath when they come back.
|
|
1359
|
+
*
|
|
1360
|
+
* Reuses the thumbnail's own resolved src, so whichever source that one settled on (the local
|
|
1361
|
+
* bytes, or the recorded URL after the fallback) is the one that opens \u2014 the browser has it
|
|
1362
|
+
* decoded already, and this cannot fail where the thumbnail succeeded.
|
|
1363
|
+
*/
|
|
1364
|
+
function openZoom(frame, img) {
|
|
1365
|
+
if (!img.getAttribute('src')) return;
|
|
1366
|
+
zoomOrigin = frame;
|
|
1367
|
+
infoZoomImg.src = img.src;
|
|
1368
|
+
infoZoomImg.alt = img.alt;
|
|
1369
|
+
infoZoom.classList.add('show');
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
function closeZoom() {
|
|
1373
|
+
infoZoom.classList.remove('show');
|
|
1374
|
+
infoZoomImg.removeAttribute('src');
|
|
1375
|
+
// Back to the thumbnail that opened it, which is where the eye already is.
|
|
1376
|
+
if (zoomOrigin && infoOverlay.classList.contains('show')) zoomOrigin.focus();
|
|
1377
|
+
zoomOrigin = null;
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1342
1380
|
/**
|
|
1343
1381
|
* The Record panel — the Creator's Dev Tools recording settings, worn by this lane.
|
|
1344
1382
|
*
|
|
@@ -2385,6 +2423,7 @@ ${ASSET_DETAIL_HTML}
|
|
|
2385
2423
|
if (closeRecordingPanel()) return;
|
|
2386
2424
|
if (closeMotionPanel()) return;
|
|
2387
2425
|
if (publishOverlay.classList.contains('show')) { closePublish(); return; }
|
|
2426
|
+
if (infoZoom.classList.contains('show')) { closeZoom(); return; }
|
|
2388
2427
|
if (infoOverlay.classList.contains('show')) { closeInfo(); return; }
|
|
2389
2428
|
hqOverlay.classList.remove('show');
|
|
2390
2429
|
});
|
|
@@ -2719,6 +2758,10 @@ ${ASSET_DETAIL_HTML}
|
|
|
2719
2758
|
});
|
|
2720
2759
|
|
|
2721
2760
|
infoToggle.addEventListener('click', function () { void openInfo(); });
|
|
2761
|
+
infoReferenceFrame.addEventListener('click', function () { openZoom(infoReferenceFrame, infoReferenceImg); });
|
|
2762
|
+
infoCoverFrame.addEventListener('click', function () { openZoom(infoCoverFrame, infoCoverImg); });
|
|
2763
|
+
// Anywhere: the whole layer is the picture and the way back out of it.
|
|
2764
|
+
infoZoom.addEventListener('click', closeZoom);
|
|
2722
2765
|
infoClose.addEventListener('click', closeInfo);
|
|
2723
2766
|
infoOverlay.addEventListener('click', function (event) {
|
|
2724
2767
|
if (event.target === infoOverlay) closeInfo();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-page.js","sourceRoot":"","sources":["../../src/editor/shell-page.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"shell-page.js","sourceRoot":"","sources":["../../src/editor/shell-page.ts"],"names":[],"mappings":"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EAAE;;;;;;;;0BAQF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA4hCvC,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA01C1C,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmChB,CAAC;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitmagic/cli",
|
|
3
|
-
"version": "0.1.64-dev.
|
|
3
|
+
"version": "0.1.64-dev.15",
|
|
4
4
|
"description": "Build Bitmagic games from your own agent tool",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"author": "Bitmagic Oy",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"playwright-core": "^1.59.1",
|
|
26
26
|
"tar": "^7.4.3",
|
|
27
27
|
"ws": "^8.21.3",
|
|
28
|
-
"@bitmagic/
|
|
29
|
-
"@bitmagic/asset-core": "0.2.19-dev.
|
|
30
|
-
"@bitmagic/
|
|
28
|
+
"@bitmagic/world-forger": "0.1.24-dev.15",
|
|
29
|
+
"@bitmagic/asset-core": "0.2.19-dev.15",
|
|
30
|
+
"@bitmagic/animation-forger": "0.1.19-dev.15"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@eslint/js": "^9.38.0",
|