mikser-io 9.26.1 → 9.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/favicon.ico ADDED
Binary file
package/favicon.svg ADDED
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="123.751 38.751 148.498 148.498" role="img" aria-label="mikser">
2
+ <title>mikser</title>
3
+ <!-- The mark with its blend flattened, so it survives a transparent
4
+ backdrop. mikser-mark.svg draws three circles under
5
+ mix-blend-mode: multiply, which needs something to multiply against:
6
+ rasterised onto transparency the orange circle knocks a hole through
7
+ itself instead of compositing. The colours below are sampled from the
8
+ canonical render, so this is the same image with nothing to blend. -->
9
+ <circle cx="198" cy="92" r="46" fill="#0A0907"/>
10
+ <circle cx="222.249" cy="134" r="46" fill="#2F2E2C"/>
11
+ <circle cx="173.751" cy="134" r="46" fill="#FF3F00"/>
12
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="123.751 38.751 148.498 148.498" role="img" aria-label="mikser">
2
+ <title>mikser</title>
3
+ <g style="isolation:isolate">
4
+ <g style="mix-blend-mode:multiply">
5
+ <circle cx="198" cy="92" r="46" fill="#0A0907"></circle>
6
+ <circle cx="222.249" cy="134" r="46" fill="#0A0907" opacity="0.85"></circle>
7
+ <circle cx="173.751" cy="134" r="46" fill="#FF3F00"></circle>
8
+ </g>
9
+ </g>
10
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mikser-io",
3
- "version": "9.26.1",
3
+ "version": "9.27.0",
4
4
  "description": "<p align=\"center\"> <img src=\"mikser-lockup-stacked.svg\" alt=\"mikser\" width=\"198\" /> </p>",
5
5
  "main": "index.js",
6
6
  "exports": {
package/src/server.js CHANGED
@@ -20,6 +20,9 @@
20
20
  // block — same Express app, all the substrate-level concerns in one
21
21
  // place.
22
22
 
23
+ import path from 'node:path'
24
+ import { fileURLToPath } from 'node:url'
25
+
23
26
  import runtime from './runtime.js'
24
27
  import { useLogger } from './engine.js'
25
28
  import { onInitialized, onLoad, onLoaded } from './lifecycle.js'
@@ -174,6 +177,30 @@ export function setupServer() {
174
177
 
175
178
  runtime.options.app.use(express.static(runtime.options.outputFolder))
176
179
 
180
+ // A favicon, so the server has a mark instead of a browser's
181
+ // blank default. AFTER the static mount, which is the whole
182
+ // design: a project that puts favicon.ico in its output folder
183
+ // is served its own and never reaches this line. This is the
184
+ // fallback for everything else.
185
+ //
186
+ // Worth having because --server is not only a preview of the
187
+ // site. It is the surface WebDAV, the API and MCP mount on, and
188
+ // those pages sit above whatever the output folder contains —
189
+ // on a multi-language build the output root holds no page at
190
+ // all, so /favicon.ico there is a 404 by construction and every
191
+ // project would have to solve it the same way.
192
+ //
193
+ // Flattened artwork: the mark's mix-blend-mode has nothing to
194
+ // multiply against on a transparent backdrop and rasterises with
195
+ // a hole through it, so favicon.ico is the pre-composited copy.
196
+ const faviconFile = path.join(
197
+ path.dirname(fileURLToPath(import.meta.url)), '..', 'favicon.ico')
198
+ runtime.options.app.get('/favicon.ico', (req, res) => {
199
+ res.type('image/x-icon')
200
+ .set('Cache-Control', 'public, max-age=3600')
201
+ .sendFile(faviconFile)
202
+ })
203
+
177
204
  await new Promise(resolve => {
178
205
  const httpServer = runtime.options.app.listen(runtime.options.port, () => {
179
206
  // Public URL wins for operator-clickable log lines —