From 9ea6ec84d01f8cf2dcd397857156f18d76e1d68f Mon Sep 17 00:00:00 2001 From: Jared Johnson Date: Mon, 29 Jun 2026 09:06:58 -0400 Subject: [PATCH 1/5] render halo in a background layer, honor , and invert control for decorations rendering --- AGENTS.md | 7 +- README.md | 2 +- site/src/App.tsx | 33 +++-- src/constants.ts | 7 ++ src/decorations.test.ts | 81 ++++++++---- src/decorations.ts | 116 ++++++++---------- src/draw.ts | 40 +++++- src/hit.test.ts | 4 +- src/hit.ts | 14 ++- src/layout.ts | 10 +- src/score.test.ts | 4 +- src/score.ts | 1 + src/stage.ts | 25 +++- src/targets.test.ts | 24 ++-- src/targets.ts | 105 +++++++++++++--- .../__data__/chord_diagram.musicxml | 65 ++++++++++ tests/integration/__data__/harmony.musicxml | 40 ++++++ .../__data__/print_new_system.musicxml | 51 ++++++++ .../__screenshots__/chord_diagram.png | Bin 30495 -> 32983 bytes .../__screenshots__/decoration_halo.png | Bin 13183 -> 12819 bytes .../__screenshots__/grace_spacing.png | Bin 31845 -> 31956 bytes tests/integration/__screenshots__/harmony.png | Bin 21660 -> 22389 bytes .../__screenshots__/harmony_grace.png | Bin 5501 -> 5548 bytes .../__screenshots__/print_new_system.png | Bin 0 -> 8387 bytes tests/integration/decorations.test.ts | 2 +- tests/integration/render.test.ts | 19 ++- 26 files changed, 492 insertions(+), 158 deletions(-) create mode 100644 tests/integration/__data__/print_new_system.musicxml create mode 100644 tests/integration/__screenshots__/print_new_system.png diff --git a/AGENTS.md b/AGENTS.md index c34bcdadf..45be9fab9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,10 +2,9 @@ After making code changes: - `vex fix` typecheck, format, and lint the project. - `vex test` test the project. +- `vex test --update` update the test snapshots. MusicXML tools: -- `vex validate -i ` validate a MusicXML file -- `vex render -i ` render a MusicXML file to a PNG - -Please delete screenshots when you are done, unless you're showing the user something. +- `vex validate -i ` validate a MusicXML file. +- `vex render -i ` render a MusicXML file to a PNG. Delete screenshots when you are done, unless you're showing the user something. diff --git a/README.md b/README.md index 7faf5dc98..5b4c8db91 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ score.addEventListener('pointermove', (e) => { : null; if (current !== previous) { previous?.halo.off(); - current?.halo.on(); + current?.halo.on('rgba(41, 98, 255, 0.35)'); previous = current; } }); diff --git a/site/src/App.tsx b/site/src/App.tsx index 90fb80e35..d11e21059 100644 --- a/site/src/App.tsx +++ b/site/src/App.tsx @@ -21,7 +21,7 @@ function describe(target: PointerTarget): string { if (target.isChordMember()) { parts.push('chord'); } - return parts.join(' · '); + return `${parts.join(' · ')}\nmeasure ${target.getMeasure().getNumber()}`; } if (target.type === 'tab-position') { return `string ${target.getString()} · fret ${target.getFret()} · ${target.getNote().getPitch() ?? 'rest'}`; @@ -102,8 +102,13 @@ export default function App() { const [fixture, setFixture] = useState(''); const [error, setError] = useState(null); const [renderMs, setRenderMs] = useState(null); + // Mirror of renderMs the debounce effect reads without depending on it — otherwise a + // render-time report would re-fire the effect and flash a phantom debounce. + const renderMsRef = useRef(null); const [dragging, setDragging] = useState(false); const [debouncing, setDebouncing] = useState(false); + // Loading overlay until the first render settles; the app always renders on mount. + const [initialized, setInitialized] = useState(false); const [mobileOpen, setMobileOpen] = useState(false); const [dark, setDark] = useState(false); const [stored, setStored] = useState( @@ -155,7 +160,9 @@ export default function App() { // `config` stays live so the sliders/reset respond instantly; `renderConfig` lags // behind it by the debounce so dragging a slider re-renders once it settles, not on // every step. The loading overlay shows while waiting (shared `debouncing` flag). - const [renderConfig, setRenderConfig] = useState>({}); + // Seed from `config` (same reference) so the first render uses the real config, not {}. + // Otherwise the first setRenderMs flips renderConfig {} -> config and double-renders on mount. + const [renderConfig, setRenderConfig] = useState>(config); const skipConfigDebounce = useRef(true); useEffect(() => { if (skipConfigDebounce.current) { @@ -164,7 +171,7 @@ export default function App() { } // If the last render was fast, apply config changes immediately; only debounce // once renders get slow enough to lag the sliders. - if (renderMs != null && renderMs <= 50) { + if (renderMsRef.current != null && renderMsRef.current <= 50) { setRenderConfig(config); setDebouncing(false); return; @@ -175,7 +182,7 @@ export default function App() { setDebouncing(false); }, 500); return () => clearTimeout(t); - }, [config, renderMs]); + }, [config]); useEffect(() => { const container = containerRef.current; @@ -217,7 +224,9 @@ export default function App() { return; } scoreRef.current = score; - setRenderMs(performance.now() - start); + renderMsRef.current = performance.now() - start; + setRenderMs(renderMsRef.current); + setInitialized(true); const onPointer = (e: PointerTargetEvent) => { const note = @@ -229,7 +238,7 @@ export default function App() { if (note !== haloRef.current) { haloRef.current?.halo.off(); haloRef.current?.color.off(); - note?.halo.on(); + note?.halo.on('rgba(41, 98, 255, 0.35)'); note?.color.on('#2962ff'); haloRef.current = note; container.style.cursor = note ? 'pointer' : ''; @@ -254,8 +263,10 @@ export default function App() { }; }) .catch((e: unknown) => { + renderMsRef.current = null; setRenderMs(null); setError(e instanceof Error ? e.message : String(e)); + setInitialized(true); }); return () => { cancelled = true; @@ -819,10 +830,12 @@ export default function App() { // re-engraving in a light color.
)} - {debouncing && ( + {(!initialized || debouncing) && (
{/* sticky so the badge stays centered in the viewport even when the backdrop is taller than the screen */}
@@ -841,8 +854,8 @@ export default function App() { {tooltip && (
{tooltip.text}
diff --git a/src/constants.ts b/src/constants.ts index 944bcdae6..23fd90600 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -121,6 +121,13 @@ export const HARMONY_Y_OFFSET = 14; * sits over, so the symbol lifts clear instead of colliding with the notehead. */ export const HARMONY_NOTE_CLEARANCE = 8; +/** Padding added below a chord symbol's collision box, reaching down to the top staff line + * (past its text baseline, which sits HARMONY_Y_OFFSET above that line). Lets the lift-clear + * probe reach a notehead sitting in the top stave space — just under the baseline — so the + * symbol nudges up off it instead of touching, leaving a little breathing room above the note. + * Set a hair past HARMONY_Y_OFFSET so a note on the top line/space is reliably caught. */ +export const HARMONY_PADDING = 15; + /** How far a single note's tie ribbon peaks above the notehead center when it bows * upward (stem-down note). Vexflow draws the tie as a bezier whose outer edge clears * the notehead by its yShift (7) plus the deeper control-point excursion (cp2 12) — diff --git a/src/decorations.test.ts b/src/decorations.test.ts index 7b3c7d344..e1a947d57 100644 --- a/src/decorations.test.ts +++ b/src/decorations.test.ts @@ -46,29 +46,58 @@ class FakeLayer implements Layer { } } +// Colors and halos draw on separate layers ('content' over the score, 'background' behind it), so +// the host keeps a recorder per kind and the tests assert against the relevant one. class FakeLayerHost implements LayerHost { - readonly recorder = new RecordingContext(); + readonly recorders = new Map(); + readonly layers = new Map(); createLayerCalls = 0; - layer: FakeLayer | null = null; - createLayer(_kind: LayerKind): Layer { + createLayer(kind: LayerKind): Layer { this.createLayerCalls++; - this.layer = new FakeLayer( - this.recorder as unknown as CanvasRenderingContext2D, + const recorder = new RecordingContext(); + this.recorders.set(kind, recorder); + const layer = new FakeLayer( + recorder as unknown as CanvasRenderingContext2D, ); - return this.layer; + this.layers.set(kind, layer); + return layer; + } + ops(kind: LayerKind): string[] { + return this.recorders.get(kind)?.ops ?? []; } } const HALO = 'fill:arc:rgba(41, 98, 255, 0.35)'; const GLYPH: NoteGlyph = { text: 'q', font: '30px Bravura', x: 12, y: 20 }; +// A fake target standing in for a real Note/Measure: drawColor stamps the glyph (a notehead) in +// the color, or falls back to a filled ellipse over the box when there's none — mirroring the +// production targets, which now own their own color stamping (see Decoratable.drawColor). const decoratable = ( rect: Rect, glyph: NoteGlyph | null = null, ): Decoratable => ({ rect, - glyph, getBoundingClientRect: () => ({}) as DOMRect, + drawColor(ctx: CanvasRenderingContext2D, color: string): void { + ctx.fillStyle = color; + if (glyph) { + ctx.font = glyph.font; + ctx.fillText(glyph.text, glyph.x, glyph.y); + } else { + ctx.beginPath(); + ctx.ellipse( + rect.x + rect.w / 2, + rect.y + rect.h / 2, + rect.w / 2, + rect.h / 2, + 0, + 0, + 2 * Math.PI, + ); + ctx.fill(); + } + }, }); // The marks (fills/texts) recorded since the last clear — i.e., the result of the latest repaint. @@ -91,7 +120,7 @@ test('setColor stamps the notehead glyph in the color and reports isColored', () decorations.setColor(target, '#2962ff'); expect(decorations.isColored(target)).toBe(true); // The exact glyph (text + font) vexflow drew, replayed in the chosen color. - expect(marksSinceLastClear(host.recorder.ops)).toEqual([ + expect(marksSinceLastClear(host.ops('content'))).toEqual([ 'text:q:#2962ff:30px Bravura', ]); }); @@ -100,7 +129,7 @@ test('a glyph-less target (a rest) falls back to a filled ellipse', () => { const host = new FakeLayerHost(); const decorations = new Decorations(host); decorations.setColor(decoratable(new Rect(0, 0, 12, 10), null), '#2962ff'); - expect(marksSinceLastClear(host.recorder.ops)).toEqual([ + expect(marksSinceLastClear(host.ops('content'))).toEqual([ 'fill:ellipse:#2962ff', ]); }); @@ -112,31 +141,33 @@ test('setColor(null) clears the decoration, drawing nothing', () => { decorations.setColor(target, '#ff0000'); decorations.setColor(target, null); expect(decorations.isColored(target)).toBe(false); - expect(host.recorder.ops.at(-1)).toBe('clear'); - expect(marksSinceLastClear(host.recorder.ops)).toEqual([]); + expect(host.ops('content').at(-1)).toBe('clear'); + expect(marksSinceLastClear(host.ops('content'))).toEqual([]); }); -test('halo draws under color', () => { +test('the halo draws on a background layer in its color, behind the color layer', () => { const host = new FakeLayerHost(); const decorations = new Decorations(host); const target = decoratable(new Rect(0, 0, 12, 10), GLYPH); decorations.setColor(target, '#2962ff'); - decorations.setHalo(target, true); - expect(marksSinceLastClear(host.recorder.ops)).toEqual([ - HALO, + decorations.setHalo(target, 'rgba(41, 98, 255, 0.35)'); + // The color stamps the notehead on the content (over) layer; the halo fills its circle on the + // background (behind) layer in the chosen color. + expect(marksSinceLastClear(host.ops('content'))).toEqual([ 'text:q:#2962ff:30px Bravura', ]); + expect(marksSinceLastClear(host.ops('background'))).toEqual([HALO]); }); -test('setHalo(false) removes the halo', () => { +test('setHalo(null) removes the halo', () => { const host = new FakeLayerHost(); const decorations = new Decorations(host); const target = decoratable(new Rect(0, 0, 12, 10), GLYPH); - decorations.setHalo(target, true); + decorations.setHalo(target, 'rgba(41, 98, 255, 0.35)'); expect(decorations.isHaloed(target)).toBe(true); - decorations.setHalo(target, false); + decorations.setHalo(target, null); expect(decorations.isHaloed(target)).toBe(false); - expect(marksSinceLastClear(host.recorder.ops)).toEqual([]); + expect(marksSinceLastClear(host.ops('background'))).toEqual([]); }); test('every repaint clears first, then redraws the whole active set', () => { @@ -144,19 +175,23 @@ test('every repaint clears first, then redraws the whole active set', () => { const decorations = new Decorations(host); decorations.setColor(decoratable(new Rect(0, 0, 12, 10), GLYPH), '#111111'); decorations.setColor(decoratable(new Rect(20, 0, 12, 10), GLYPH), '#222222'); - expect(marksSinceLastClear(host.recorder.ops)).toEqual([ + expect(marksSinceLastClear(host.ops('content'))).toEqual([ 'text:q:#111111:30px Bravura', 'text:q:#222222:30px Bravura', ]); }); -test('dispose disposes the layer and clears state', () => { +test('dispose disposes every layer and clears state', () => { const host = new FakeLayerHost(); const decorations = new Decorations(host); const target = decoratable(new Rect(0, 0, 12, 10), GLYPH); decorations.setColor(target, '#2962ff'); - const layer = host.layer; + decorations.setHalo(target, 'rgba(41, 98, 255, 0.35)'); + const content = host.layers.get('content'); + const background = host.layers.get('background'); decorations.dispose(); - expect(layer?.disposed).toBe(true); + expect(content?.disposed).toBe(true); + expect(background?.disposed).toBe(true); expect(decorations.isColored(target)).toBe(false); + expect(decorations.isHaloed(target)).toBe(false); }); diff --git a/src/decorations.ts b/src/decorations.ts index aa1420f1c..6d0d49423 100644 --- a/src/decorations.ts +++ b/src/decorations.ts @@ -2,27 +2,28 @@ import type { Rect } from './geometry'; import type { Layer, LayerHost } from './stage'; import type { Decoratable, Decorator } from './targets'; -// A soft round highlight drawn behind a note to denote activity. Fixed (the halo toggle takes no -// argument); the color toggle is what carries a caller-chosen color. HALO_MARGIN is how far the -// circle extends past the notehead's half-extent, so the note sits evenly inside it. -const HALO_COLOR = 'rgba(41, 98, 255, 0.35)'; +// A soft round highlight drawn behind a note to denote activity, in the caller-chosen halo color. +// HALO_MARGIN is how far the circle extends past the notehead's half-extent, so the note sits +// evenly inside it. const HALO_MARGIN = 8; /* * The decoration store and painter — the production `Decorator`. A target's color/halo toggles - * delegate here. Decorations are retained as an active set (which targets are colored/haloed) and - * drawn on a single `content` overlay layer that sits in score space over the engraving. + * delegate here. Decorations are retained as active sets (which targets are colored/haloed) and + * drawn on two score-space overlay layers: colors on a `content` layer over the engraving (they + * recolor the notehead, so they sit on top), halos on a `background` layer behind the base canvas + * (so they glow through the score's transparent pixels, under the notes). * - * Every change repaints the whole layer from the active set rather than erasing one rect. That's - * the answer to "how does off() work without disturbing neighbors": clearing one decoration's box - * could wipe part of an overlapping one, so instead the lot is cleared and redrawn — halos first - * (under), colors on top. The layer is created lazily on the first decoration, so an undecorated - * score never allocates an overlay. + * Every change repaints a whole layer from its active set rather than erasing one rect. That's the + * answer to "how does off() work without disturbing neighbors": clearing one decoration's box could + * wipe part of an overlapping one, so instead the lot is cleared and redrawn. Each layer is created + * lazily on its first decoration, so an undecorated score never allocates an overlay. */ export class Decorations implements Decorator { private readonly colors = new Map(); - private readonly halos = new Set(); - private layer: Layer | null = null; + private readonly halos = new Map(); + private colorLayer: Layer | null = null; + private haloLayer: Layer | null = null; constructor(private readonly host: LayerHost) {} @@ -32,16 +33,16 @@ export class Decorations implements Decorator { } else { this.colors.set(target, color); } - this.repaint(); + this.repaintColors(); } - setHalo(target: Decoratable, on: boolean): void { - if (on) { - this.halos.add(target); - } else { + setHalo(target: Decoratable, color: string | null): void { + if (color === null) { this.halos.delete(target); + } else { + this.halos.set(target, color); } - this.repaint(); + this.repaintHalos(); } isColored(target: Decoratable): boolean { @@ -53,36 +54,44 @@ export class Decorations implements Decorator { } dispose(): void { - this.layer?.dispose(); - this.layer = null; + this.colorLayer?.dispose(); + this.haloLayer?.dispose(); + this.colorLayer = null; + this.haloLayer = null; this.colors.clear(); this.halos.clear(); } - // Repaint from the retained active set: clear, then halos (under) then colors (over). - private repaint(): void { - if (this.colors.size === 0 && this.halos.size === 0) { - // Nothing active: clear an existing layer, but don't allocate one just to clear it. - if (this.layer) { - this.clear(this.layer.ctx); + private repaintColors(): void { + if (this.colors.size === 0) { + if (this.colorLayer) { + this.clear(this.colorLayer.ctx); } return; } - const ctx = this.ensureLayer().ctx; + this.colorLayer ??= this.host.createLayer('content'); + const ctx = this.colorLayer.ctx; this.clear(ctx); - for (const target of this.halos) { - this.drawHalo(ctx, target.rect); - } for (const [target, color] of this.colors) { - this.drawColor(ctx, target, color); + // The target knows what to stamp (a notehead glyph, a fret number, a box); we just + // hand it the overlay and the color. See Decoratable.drawColor. + target.drawColor(ctx, color); } } - private ensureLayer(): Layer { - if (!this.layer) { - this.layer = this.host.createLayer('content'); + private repaintHalos(): void { + if (this.halos.size === 0) { + if (this.haloLayer) { + this.clear(this.haloLayer.ctx); + } + return; + } + this.haloLayer ??= this.host.createLayer('background'); + const ctx = this.haloLayer.ctx; + this.clear(ctx); + for (const [target, color] of this.halos) { + this.drawHalo(ctx, target.rect, color); } - return this.layer; } // Clear the whole bitmap regardless of the dpr transform the layer applied. @@ -93,45 +102,16 @@ export class Decorations implements Decorator { ctx.restore(); } - // Recolor the note: replay vexflow's own notehead render (same glyph text, font, and baseline) - // in the chosen color, so the actual notehead is recolored and hollow heads stay hollow. A - // glyph-less target (a rest, or a non-note) falls back to a filled ellipse over its box. - private drawColor( + private drawHalo( ctx: CanvasRenderingContext2D, - target: Decoratable, + rect: Rect, color: string, ): void { - ctx.save(); - ctx.fillStyle = color; - const glyph = target.glyph; - if (glyph) { - ctx.font = glyph.font; - ctx.textAlign = 'left'; - ctx.textBaseline = 'alphabetic'; - ctx.fillText(glyph.text, glyph.x, glyph.y); - } else { - const r = target.rect; - ctx.beginPath(); - ctx.ellipse( - r.x + r.w / 2, - r.y + r.h / 2, - r.w / 2, - r.h / 2, - 0, - 0, - 2 * Math.PI, - ); - ctx.fill(); - } - ctx.restore(); - } - - private drawHalo(ctx: CanvasRenderingContext2D, rect: Rect): void { // A circle centered on the notehead box, a fixed margin larger than its half-extent, so it // encircles the note evenly regardless of the notehead's width. const radius = Math.max(rect.w, rect.h) / 2 + HALO_MARGIN; ctx.save(); - ctx.fillStyle = HALO_COLOR; + ctx.fillStyle = color; ctx.beginPath(); ctx.arc(rect.x + rect.w / 2, rect.y + rect.h / 2, radius, 0, 2 * Math.PI); ctx.fill(); diff --git a/src/draw.ts b/src/draw.ts index dcde1c913..804a4c594 100644 --- a/src/draw.ts +++ b/src/draw.ts @@ -33,6 +33,7 @@ import { CHORD_DIAGRAM_WIDTH, HARMONY_FONT_SIZE, HARMONY_NOTE_CLEARANCE, + HARMONY_PADDING, HARMONY_Y_OFFSET, LABEL_FONT_SIZE, LABEL_GAP, @@ -526,18 +527,22 @@ function drawHarmony( const baseY = stave.getYForLine(0) - HARMONY_Y_OFFSET; context.save(); context.setFillStyle('#000000'); + // Pad the box below the text baseline so liftClear's downward probe reaches a notehead + // sitting just under the baseline (a note in the top stave space) and nudges the symbol + // clear of it, leaving a little breathing room. The drawn baseline stays HARMONY_PADDING + // above the box bottom, so with nothing in the way the symbol keeps its default position. const natural = new Rect( staveNote.getAbsoluteX(), baseY - HARMONY_FONT_SIZE, harmonyWidth(context, text, font), - HARMONY_FONT_SIZE, + HARMONY_FONT_SIZE + HARMONY_PADDING, ); const placed = detector.liftClear( natural, HARMONY_NOTE_CLEARANCE, TEXT_CLEAR_KINDS, ); - const y = placed.bottom; + const y = placed.bottom - HARMONY_PADDING; // The ♯/♭/♮ glyphs carry wide side-bearings in the text font, so a single fillText // of "B♭" reads as "B ♭". Draw char by char and pull the accidental in on both sides // so it sits tight against its root letter. @@ -1289,6 +1294,15 @@ export function drawScore( const tabStave = p.stave as TabStave; for (const { note, chord } of p.tabChords) { const x = note.getAbsoluteX(); + // The drawn fret glyphs, parallel to getPositions() (one per struck string), so a + // decoration can replay the exact fret text vexflow drew — "<12>", "(2)", "✕" — + // in color. The tab analog of the notation path's note.noteHeads. + const positions = note.getPositions(); + const fretEls = ( + note as unknown as { + fretElement: { getText(): string; getFont(): string }[]; + } + ).fretElement; for (const mnote of chord.notes) { const string = mnote.string; const fret = mnote.fret; @@ -1296,6 +1310,9 @@ export function drawScore( continue; } const y = tabStave.getYForLine(string - 1); + // Match this string's drawn fret glyph (positions carry one entry per string). + const el = + fretEls[positions.findIndex((pos) => pos.str === string)]; rawNotes.push({ mnote, rect: new Rect( @@ -1306,7 +1323,12 @@ export function drawScore( ), chord: chord.notes, measureIndex: m, - tab: { string, fret }, + tab: { + string, + fret, + text: el ? el.getText() : String(fret), + font: el ? el.getFont() : '', + }, glyph: null, }); } @@ -1367,6 +1389,7 @@ export function drawScore( Math.max(0, systemContentBottom - systemY), ), index: m, + number: parts[0]?.measures[m]?.number ?? String(m + 1), }); } @@ -1393,7 +1416,9 @@ export function drawScore( // Diagrams sit at their lead note's x; two on notes either side of a barline can be // close enough to overlap (especially at a narrow width). The detector pushes each // box clear of any already-placed diagram in its band (replacing the old running - // cursor) so crowded diagrams separate instead of stacking. + // cursor) so crowded diagrams separate instead of stacking. It also lifts each box + // above any words drawn in its column (the diagrams pass runs after the words pass), + // so a word like "(as taught)" stays at its normal spot and the box rises over it. for (const h of harmonyTasks) { // A with a draws as a fret box (chord name as its title) // above the stave; one without draws as the plain chord-symbol text. @@ -1413,13 +1438,16 @@ export function drawScore( CHORD_DIAGRAM_WIDTH, CHORD_DIAGRAM_HEIGHT, ); - const placed = detector.pushRightOf( + const spaced = detector.pushRightOf( natural, 'diagram', CHORD_DIAGRAM_GAP, ); + const placed = detector.liftClear(spaced, CHORD_DIAGRAM_GAP, [ + 'annotation', + ]); detector.add({ rect: placed, kind: 'diagram' }); - const diagram = new ChordDiagram(placed.x, top, { + const diagram = new ChordDiagram(placed.x, placed.y, { width: CHORD_DIAGRAM_WIDTH, height: CHORD_DIAGRAM_HEIGHT, numStrings: h.frame.chord.length, diff --git a/src/hit.test.ts b/src/hit.test.ts index e8569083e..3b040a443 100644 --- a/src/hit.test.ts +++ b/src/hit.test.ts @@ -83,14 +83,14 @@ function build() { rect: new Rect(90, 40, 6, 6), chord: [mBb], measureIndex: 0, - tab: { string: 2, fret: 3 }, + tab: { string: 2, fret: 3, text: '3', font: '10px monospace' }, glyph: null, }, ]; const geometry: RawGeometry = { bounds: new Rect(0, 0, 200, 100), notes, - measures: [{ rect: new Rect(0, 0, 200, 100), index: 0 }], + measures: [{ rect: new Rect(0, 0, 200, 100), index: 0, number: '1' }], }; return buildTargets(geometry, new FakeViewport(), new FakeDecorator()); } diff --git a/src/hit.ts b/src/hit.ts index 594a8aca6..7ee7e7647 100644 --- a/src/hit.ts +++ b/src/hit.ts @@ -19,14 +19,15 @@ import { */ /* A notehead or fret the draw pass laid out, in score space. `tab` is set when this is a tab - * fret rendering (the note's string/fret); null for a notation notehead. `chord` lists every - * mdom note sharing this note's onset so chordmates resolve. mnote stays internal. */ + * fret rendering (the note's string/fret, plus the fret as drawn and its font so a decoration can + * recolor the digit); null for a notation notehead. `chord` lists every mdom note sharing this + * note's onset so chordmates resolve. mnote stays internal. */ export interface RawNote { mnote: MNote; rect: Rect; chord: MNote[]; measureIndex: number; - tab: { string: number; fret: number } | null; + tab: { string: number; fret: number; text: string; font: string } | null; /* The engraved notehead glyph (for recoloring); null for a tab fret or a rest. */ glyph: NoteGlyph | null; } @@ -34,6 +35,8 @@ export interface RawNote { export interface RawMeasure { rect: Rect; index: number; + /* The MusicXML measure number (a string — handles pickups, "X1" etc.). */ + number: string; } /* Everything the draw pass emits for the index, in score space (crop already applied). */ @@ -94,7 +97,7 @@ export function buildTargets( ): HitTester { const measures = new Map(); for (const m of geometry.measures) { - measures.set(m.index, new Measure(m.rect, viewport)); + measures.set(m.index, new Measure(m.rect, viewport, m.number)); } const noteByMnote = new Map(); @@ -132,6 +135,9 @@ export function buildTargets( string: rn.tab.string, fret: rn.tab.fret, note, + decorator, + text: rn.tab.text, + font: rn.tab.font, }), ); } diff --git a/src/layout.ts b/src/layout.ts index 633d8032b..4dd5b84cf 100644 --- a/src/layout.ts +++ b/src/layout.ts @@ -304,10 +304,16 @@ export function computeLayout(parts: Part[], config: Config): ScoreLayout { let rowWidth = 0; for (let m = 0; m < measureCount; m++) { const area = noteAreas[m] ?? BASE_VOICE_WIDTH; + // A forces a break before this measure regardless of + // width; otherwise wrap once the next measure's note area would overrun the line. + const forcedBreak = parts.some( + (part) => part.measures[m]?.print?.newSystem, + ); if ( row.length > 0 && - rowWidth + LEAD_BARLINE + area > - usableOf(systems.length) * config.maxSystemFill + (forcedBreak || + rowWidth + LEAD_BARLINE + area > + usableOf(systems.length) * config.maxSystemFill) ) { systems.push(row); row = []; diff --git a/src/score.test.ts b/src/score.test.ts index 321355688..13ef5c310 100644 --- a/src/score.test.ts +++ b/src/score.test.ts @@ -104,7 +104,7 @@ function fixture(target: PointerTarget | null) { } test('a pointer event hit-tests the point and emits target, score-space point, and native', () => { - const target = new Measure(new Rect(0, 0, 10, 10), viewport); + const target = new Measure(new Rect(0, 0, 10, 10), viewport, '1'); const { host, index, score } = fixture(target); const seen: Array<{ type: string; x: number; y: number; native: Event }> = []; score.addEventListener('pointermove', (e) => @@ -195,7 +195,7 @@ test('addLayer delegates to the host; removeLayer disposes the layer', () => { }); test('dispose detaches every listener and tears down decorations and host', () => { - const target = new Measure(new Rect(0, 0, 10, 10), viewport); + const target = new Measure(new Rect(0, 0, 10, 10), viewport, '1'); const { host, index, decorations, score } = fixture(target); score.addEventListener('pointermove', () => {}); score.addEventListener('resize', () => {}); diff --git a/src/score.ts b/src/score.ts index 9d953a42a..1e431bdea 100644 --- a/src/score.ts +++ b/src/score.ts @@ -49,6 +49,7 @@ export class Score implements EventListenable { return this.host.createLayer(kind); } + /* Remove a layer added with addLayer (a shorthand for layer.dispose()). */ removeLayer(layer: Layer): void { layer.dispose(); } diff --git a/src/stage.ts b/src/stage.ts index 58a5e0252..1f2669b46 100644 --- a/src/stage.ts +++ b/src/stage.ts @@ -2,9 +2,11 @@ import type { Rect } from './geometry'; import type { Viewport } from './targets'; /* Where a custom drawing layer sits. A `content` layer covers the whole engraved score (score - * space, scrolls with the content) — what decorations draw on. A `viewport` layer covers only the - * visible box (client space) and is resized as the container resizes. */ -export type LayerKind = 'content' | 'viewport'; + * space, scrolls with the content) — what decorations draw on. A `background` layer is a content + * layer placed *behind* the base canvas (z-index -1), so it shows through the score's transparent + * pixels — e.g. a halo glowing behind the noteheads. A `viewport` layer covers only the visible box + * (client space) and is resized as the container resizes. */ +export type LayerKind = 'content' | 'background' | 'viewport'; /* A caller-owned drawing surface stacked over the score. Only the 2D context is exposed — never * the canvas, its size, or a clear — so the layer's lifecycle stays vexml's. The caller draws via @@ -106,6 +108,7 @@ class ManagedLayer implements Layer { export class Stage implements Viewport, Host { readonly base: HTMLCanvasElement; private readonly prevPosition: string; + private readonly prevIsolation: string; private readonly layers = new Set(); constructor(private readonly container: HTMLDivElement) { @@ -115,6 +118,13 @@ export class Stage implements Viewport, Host { if (!container.style.position) { container.style.position = 'relative'; } + // Isolate the container into its own stacking context so the background layer's z-index:-1 + // stays trapped here — above the container's (possibly opaque) background but below the base + // canvas — rather than escaping behind an ancestor's background, where it'd be invisible. + this.prevIsolation = container.style.isolation; + if (!container.style.isolation) { + container.style.isolation = 'isolate'; + } this.base = document.createElement('canvas'); // `vexml-canvas` is the stable hook callers style to size/scale the rendered score. They style // this class (or the container), never the bare element — that keeps the overlay canvases @@ -172,6 +182,10 @@ export class Stage implements Viewport, Host { canvas.className = 'vexml-layer'; canvas.style.position = 'absolute'; canvas.style.pointerEvents = 'none'; + // A background layer paints behind the (in-flow) base canvas; everything else stacks over it. + if (kind === 'background') { + canvas.style.zIndex = '-1'; + } const layer = new ManagedLayer(kind, canvas, this); this.container.appendChild(canvas); this.layers.add(layer); @@ -203,13 +217,14 @@ export class Stage implements Viewport, Host { } this.base.remove(); this.container.style.position = this.prevPosition; + this.container.style.isolation = this.prevIsolation; } // Size a layer's drawing bitmap. A content layer's bitmap is fixed to the engraved score (the // base canvas's intrinsic CSS box), so the caller always draws in score px — its element is then // stretched over the base's rendered box by placeLayer. A viewport bitmap matches the visible box. private sizeBitmap(layer: ManagedLayer): void { - if (layer.kind === 'content') { + if (layer.kind !== 'viewport') { layer.resize( parseFloat(this.base.style.width) || 0, parseFloat(this.base.style.height) || 0, @@ -226,7 +241,7 @@ export class Stage implements Viewport, Host { private placeLayer(layer: ManagedLayer): void { const left = this.base.offsetLeft; const top = this.base.offsetTop; - if (layer.kind === 'content') { + if (layer.kind !== 'viewport') { layer.place(left, top, this.base.offsetWidth, this.base.offsetHeight); } else { layer.place( diff --git a/src/targets.test.ts b/src/targets.test.ts index b3438ce0e..f0194116c 100644 --- a/src/targets.test.ts +++ b/src/targets.test.ts @@ -34,7 +34,7 @@ class FakeViewport implements Viewport { class FakeDecorator implements Decorator { readonly colors = new Map(); - readonly halos = new Set(); + readonly halos = new Map(); setColor(target: Decoratable, color: string | null): void { if (color === null) { this.colors.delete(target); @@ -42,11 +42,11 @@ class FakeDecorator implements Decorator { this.colors.set(target, color); } } - setHalo(target: Decoratable, on: boolean): void { - if (on) { - this.halos.add(target); - } else { + setHalo(target: Decoratable, color: string | null): void { + if (color === null) { this.halos.delete(target); + } else { + this.halos.set(target, color); } } isColored(target: Decoratable): boolean { @@ -89,7 +89,7 @@ function fixture() { const viewport = new FakeViewport(); const decorator = new FakeDecorator(); - const measure = new Measure(new Rect(0, 0, 100, 50), viewport); + const measure = new Measure(new Rect(0, 0, 100, 50), viewport, '1'); // The shared registries the wrappers resolve their cross-links through (a Map fulfills the // NoteLookup / TabLookup interfaces). Populated as each note is built. @@ -159,12 +159,13 @@ test('color toggle delegates to the decorator and reflects active state', () => expect(noteC.color.active).toBe(false); }); -test('halo toggle delegates to the decorator', () => { +test('halo toggle delegates to the decorator and carries its color', () => { const { noteC, decorator } = fixture(); - noteC.halo.on(); - expect(decorator.halos.has(noteC)).toBe(true); + noteC.halo.on('#2962ff'); + expect(decorator.halos.get(noteC)).toBe('#2962ff'); expect(noteC.halo.active).toBe(true); noteC.halo.off(); + expect(decorator.halos.has(noteC)).toBe(false); expect(noteC.halo.active).toBe(false); }); @@ -175,11 +176,14 @@ test('getBoundingClientRect maps the score-space rect through the viewport', () }); test('TabPosition exposes string/fret and links back to its note', () => { - const { noteC, viewport } = fixture(); + const { noteC, viewport, decorator } = fixture(); const tab = new TabPosition(new Rect(0, 0, 6, 6), viewport, { string: 3, fret: 5, note: noteC, + decorator, + text: '5', + font: '10px monospace', }); expect(tab.getString()).toBe(3); expect(tab.getFret()).toBe(5); diff --git a/src/targets.ts b/src/targets.ts index 0cbbf710c..e278073a9 100644 --- a/src/targets.ts +++ b/src/targets.ts @@ -25,11 +25,12 @@ export interface NoteGlyph { readonly y: number; } -/* What a decoration paints: a target's box (for the halo) and its glyph (to recolor the notehead), - * the glyph being null when there is none (a measure, a rest). The decoration seam operates on - * this rather than bare Bounded so it can stamp the actual notehead glyph. */ +/* What a decoration paints. The Decorator draws the halo from the target's box, but the color is + * the target's own job: only it knows what it is — a notehead glyph (Note), a fret number + * (TabPosition), or a plain box (the filled-ellipse fallback). So the Decorator hands over the + * overlay ctx and the chosen color and the target stamps itself recolored. */ export interface Decoratable extends Bounded { - readonly glyph: NoteGlyph | null; + drawColor(ctx: CanvasRenderingContext2D, color: string): void; } /* A reversible on/off effect carrying an optional value (color string, etc.). `off()` is the @@ -59,7 +60,7 @@ export type DecorationKind = 'color' | 'halo'; */ export interface Decorator { setColor(target: Decoratable, color: string | null): void; - setHalo(target: Decoratable, on: boolean): void; + setHalo(target: Decoratable, color: string | null): void; isColored(target: Decoratable): boolean; isHaloed(target: Decoratable): boolean; } @@ -94,17 +95,17 @@ class ColorToggle implements Toggle { } } -/* The halo decoration as an on/off toggle, delegating to the Decorator. */ -class HaloToggle implements Toggle { +/* The halo decoration as an on/off toggle carrying its color, delegating to the Decorator. */ +class HaloToggle implements Toggle { constructor( private readonly target: Decoratable, private readonly decorator: Decorator, ) {} - on(): void { - this.decorator.setHalo(this.target, true); + on(color: string): void { + this.decorator.setHalo(this.target, color); } off(): void { - this.decorator.setHalo(this.target, false); + this.decorator.setHalo(this.target, null); } get active(): boolean { return this.decorator.isHaloed(this.target); @@ -112,14 +113,29 @@ class HaloToggle implements Toggle { } /* Shared base for every target: holds the score-space rect and maps it to the page on demand. - * Decoratable with no glyph by default; Note overrides glyph with its notehead stamp. */ + * The default color is a filled ellipse over the box — the fallback for a target with no glyph or + * text of its own (a rest, a measure). Note and TabPosition override it with their own stamp. */ abstract class BoundedTarget implements Decoratable { constructor( readonly rect: Rect, protected readonly viewport: Viewport, ) {} - get glyph(): NoteGlyph | null { - return null; + drawColor(ctx: CanvasRenderingContext2D, color: string): void { + const r = this.rect; + ctx.save(); + ctx.fillStyle = color; + ctx.beginPath(); + ctx.ellipse( + r.x + r.w / 2, + r.y + r.h / 2, + r.w / 2, + r.h / 2, + 0, + 0, + 2 * Math.PI, + ); + ctx.fill(); + ctx.restore(); } getBoundingClientRect(): DOMRect { return this.viewport.clientRectOf(this.rect); @@ -158,7 +174,7 @@ export interface NoteDeps { export class Note extends BoundedTarget { readonly type = 'note'; readonly color: Toggle; - readonly halo: Toggle; + readonly halo: Toggle; constructor(private readonly deps: NoteDeps) { super(deps.rect, deps.viewport); @@ -166,9 +182,22 @@ export class Note extends BoundedTarget { this.halo = new HaloToggle(this, deps.decorator); } - /* The engraved notehead glyph (for recoloring), or null for a rest. */ - override get glyph(): NoteGlyph | null { - return this.deps.glyph; + /* The glyph case: replay vexflow's own notehead (same glyph text, font, baseline) in the + * chosen color, so the actual head recolors and a hollow head stays hollow. A rest has no + * glyph, so it falls back to the base ellipse. */ + override drawColor(ctx: CanvasRenderingContext2D, color: string): void { + const glyph = this.deps.glyph; + if (!glyph) { + super.drawColor(ctx, color); + return; + } + ctx.save(); + ctx.fillStyle = color; + ctx.font = glyph.font; + ctx.textAlign = 'left'; + ctx.textBaseline = 'alphabetic'; + ctx.fillText(glyph.text, glyph.x, glyph.y); + ctx.restore(); } /* The sounding pitch as a vexflow key ("E/4"), or null for a rest. */ @@ -214,19 +243,59 @@ export class Note extends BoundedTarget { /* A measure's box — the background target, hit when a pointer lands on staff space (not a note). */ export class Measure extends BoundedTarget { readonly type = 'measure'; + + constructor( + rect: Rect, + viewport: Viewport, + private readonly number: string, + ) { + super(rect, viewport); + } + + /* The MusicXML measure number, e.g. "1" (or "0" for a pickup). */ + getNumber(): string { + return this.number; + } } /* A fret number on a tab string. The same note can render as both a Note (notehead) and a * TabPosition (fret); they cross-reference via Note.getTabPosition() / TabPosition.getNote(). */ export class TabPosition extends BoundedTarget { readonly type = 'tab-position'; + readonly color: Toggle; + readonly halo: Toggle; constructor( rect: Rect, viewport: Viewport, - private readonly opts: { string: number; fret: number; note: Note }, + private readonly opts: { + string: number; + fret: number; + note: Note; + decorator: Decorator; + /* The fret as vexflow drew it ("5", "<7>", "(2)", "✕") and the exact font, so a + * decoration redraws the digit in color instead of hiding it under an ellipse. */ + text: string; + font: string; + }, ) { super(rect, viewport); + this.color = new ColorToggle(this, opts.decorator); + this.halo = new HaloToggle(this, opts.decorator); + } + + /* The text case: redraw the fret number centered in its box in the chosen color, so the digit + * lights up rather than vanishing under a filled ellipse. The box is centered on the fret, so + * centered text with vexflow's own fret font overlays the engraved digit exactly. */ + override drawColor(ctx: CanvasRenderingContext2D, color: string): void { + const r = this.rect; + ctx.save(); + ctx.fillStyle = color; + ctx.font = this.opts.font; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText(this.opts.text, r.x + r.w / 2, r.y + r.h / 2); + ctx.restore(); } getString(): number { diff --git a/tests/integration/__data__/chord_diagram.musicxml b/tests/integration/__data__/chord_diagram.musicxml index 2ad68c8a1..cea3c445a 100644 --- a/tests/integration/__data__/chord_diagram.musicxml +++ b/tests/integration/__data__/chord_diagram.musicxml @@ -635,5 +635,70 @@ quarter + + + + B + + minor-seventh + + 6 + 1 + + 4 + 7 + + + 3 + 7 + + + 2 + 7 + + + + + + D + 5 + + 1 + quarter + + + + + F + 1 + 5 + + 1 + quarter + + + + 1 + quarter + + + + 1 + quarter + + + + (as taught) + + + + + B + 4 + + 1 + quarter + + diff --git a/tests/integration/__data__/harmony.musicxml b/tests/integration/__data__/harmony.musicxml index 6e6cbddc7..ca74e7c07 100644 --- a/tests/integration/__data__/harmony.musicxml +++ b/tests/integration/__data__/harmony.musicxml @@ -512,5 +512,45 @@ half + + + + E + + minor-seventh + + + + E + 5 + + 1 + quarter + + + + E + 5 + + 1 + quarter + + + + E + 5 + + 1 + quarter + + + + E + 5 + + 1 + quarter + + diff --git a/tests/integration/__data__/print_new_system.musicxml b/tests/integration/__data__/print_new_system.musicxml new file mode 100644 index 000000000..b5dab5e08 --- /dev/null +++ b/tests/integration/__data__/print_new_system.musicxml @@ -0,0 +1,51 @@ + + + + + Music + + + + + + 1 + + 1 + + G + 2 + + + + C5 + 4 + whole + + + + + C5 + 4 + whole + + + + + + C5 + 4 + whole + + + + + C5 + 4 + whole + + + + diff --git a/tests/integration/__screenshots__/chord_diagram.png b/tests/integration/__screenshots__/chord_diagram.png index 722e42efe001cfdb3235170f59390d885a06a528..49032f83f3cbc5d385c996d5c8351487e36fb95f 100644 GIT binary patch literal 32983 zcmeFZc{rBs`Zjz^h)8otR7l8NW=)EasmvLYc}nJaD3t~(b7iVX%9u=)p1eN4f9&y07azk6}OdV?WNDs>*V7G)y!k5{XX! z)QK}B5_tmtu&!H!-ze7yNs&k!N%AL-sk=pwbh>(N?O$14=GkcFxAE4@_M`b*hpzr0 zOK?qi?sQD5RE=wmLh!!b+qZ5~eRyz4!-M~fOu9mF7j+D&YI)vt>{YjPR8CZ9OiYZo z^lGKC%WT_&stD_D$J!CEB{nv;ZTPi{Y63NeUlM5MM z(*3_L{hwHk^jyov#I|hffvQkW=O3T@tHXC5_HxtKzQ5+l30Ya?hXXzh2E$UDF}?Gl{2lioNE^$SI@6 z9m`iZKBwq3CdyR@vjtpX+~iW!9>#UH%VRjTwDjowJ^ph!Ha(@66(jjlRUg0kIo!PM zk$Qp4DEoy7uCw2h(~EUqUO0J|MS6Cm^=#gyuZ_=C&b2X1d(3=E*6Q|MEh@Yg#jFW*%cat;i1N7%lK_q(c-(CTX=;{wX(I+4TR2XmiTy6bmy4X zM2I_nKVVRpCm*^m;z6oz_K(JAA77b&Jm6UT>)UOeS7tg#1orOTYya)t`W<}HhrJiD zpp8!zIp>{6+p=$O=gs$=8ykr8U0GQiZ%?s)cVkm#q{cJl7_l6=;s}~;+zF)8r=Jq! z**x2PSC@00blRBbxoN4XgIBDkzt?_@I}&N2D0|H$ZuQ&y+q}A2zZQnmO_`fLsD+fh z2J0WYPk-mSzlp8Dz^1o6D1>EUZrn~<_~fmvA&RH+H`YY*M_#gwak`e!GTB?PgWsUT zBe5`;Pd|UAhQFjTFTLY**nYJTcKN=bgRWzGjB|7}G%v7|FE6~G9qU}I747!=^)(>Z zt~ZBf;uV24r zdUog7o*PXpDOn9<6gGJ@R~gJ!8zmZfQy)9r^0N2ik=1As+qNHHl2ch1zr9~C&c`i% zf5wx>>_p4Y3+8pvRS~@B>Y~NBZ4AXK7teo>vd?8a?3K5+LpR%Mm)NC8E~9Ox)nP9? zIM_IzpLrV6$@zfG?p40?aP-{sU=G$7Etz1EU4^uk;hMNA)zy5FEiXd@wkbGB|dFg zeOio(;WxeJr}}H7=I$O@`Sr8e5D&v=oF6gEC}dK-p&#wd0E9jNGv7IXDozG!N<2y>K2a%C&2gl4Rsx znbp3~dG&pEwB3|n|9gT;oPl-dLCZ5gOLje^?bqe+dlu*Oqb)o6iaQ+e{z$9=?)J^K z_1MmwSl_v^PN$(yT)(8;15$Les~uixBx?$_ac_amep1$|H&ammqHNrfVI*oBAmU|%%h94Az6WID}I$O%}>{ClBFO~YhW+3EE}yFg|6_Bxqf|fZL~c% z*O%JCYv}Xyvu$^+jWnand)}Mu(7gW5MmdaF8p-iOW8p2uLq&64l8)a$*p)0Nc7Avu zY@WS8#Ddq>M%nnrTvotfQ=0y{bb}&>@qG8`!~;u)s|%60n1)9`KX1ey^UlRext}Qy z-$u&2Lfe{n`oYxKw*ecZ6+8rn;@6OqZ~JgNWB7gFS!rB;8;|Beo0dyeAsh%j!IrJr z;pEjL3CH0A-vU^D?!9%C_M8oq@thm)jx2e5oo=VJhZ7tyTcpjBc5!ypx+CvpttIWO z+s_~2?^^esymg{PvDg9OQ}kj-9&WluiE&WcXX%$889DoS*K0@f%6of+?lJdnt0tB1 z*|cfXvRjDDIWzyXqsCZs#`n?fsxM z!|C$7hGJxgFV;UgMozWibnxD54x8qSTl1Z*b1!ygvECt(dXD`g={^%gJ}%8#SAZV^ zyl?pMx2?9?**sx=X>t#lHB?zvcD#>WVX#Z zlHV}r!%)jh;}{9&nZoUlH|3D|*}rS&the7|w64HIF@(Jew)IRUuGq41-)lw|mM(be z%JQP(8cja~CJ~#KV(-PK)N^ttPE^)jTfgHX3>9|j*Uv9n2w-7%Y2vmFj^LKy<;nU5IZho<6~c8hO>VAu z>JgW@ceN9#AzknFr~DR!TU)uR!+D{GMIOdbXET@qu8Y$gq}XtQx+B$-#BZK8JH_gcz@{ zeR$|B%Z019r1Q*^v(!#{m$n);3&SHmrRf*2`YzeSQf}|y*Gv;}o9KZ%`Y!)$=Fv>S zEg!|3`uu8=wbEzw)&$xu%nT8){hI9U_8c#on7GtWjfW?dZ?cO!T0tRa&*X3JG}`vF zE=Cfu0YbEHIg!R_5&2S^@mhA>^Cw8kB}-GcW7NK2m3w00x^#i=t`ZNE+GaLI?;7&*^Q z$p2pVQw+++0-Vamr1M^SL1ca#7+Mc;whq~Rc@eG|K04K3)9tf38q6kVawk?1o-!dO z>ryLk&@^7M>Vr7okkvof5Kkn?32wP_*bhM63c*ZkW!N&pbsOwl<;XH3^;5gz`SOP7 zA4{9huf@X7fAn4H9i=1v+A6`9w_VFv;5D)^*ML~bS~pc~?UwoJfubTZQrz(hislO@ z&7oah(@IC|F7=d>QIJ+|v(Wl!?H*av#VaLMh)d&H)kx=UY9e@FwQhSneq{qPTWIVN z-!#$yEsNBzhIlzfVY9&0GC11x4ZE1yi=M^16_UkK*u6`plsjbgxpKjL5@u@+AQQ+t zl-G0os=mst8#jLS_|prS*D;^-2maB?r~D{#U(i_g+q;|FXor9T^j?`M#U1wE&a1ms z?v)r{{^ohZSldTE*9Oaa0$~UQw!AnOqxS~cX=`B+ zv%iQB{XV*_fdj3t%z^vPr6h8y)khnx}Nq>$>9T;vHrZf6Si}W;Tl8j_{Cv z_E}xFb@SFj1$bjymgU((w@HTaa2Xqo7wVQxDXrx}JNvDB7spGq(h}ctpFb))DE+OI zGGEMpr=*Kb5Yr)raPFsiyj{dMOh^QdEF{6Os~V)mX}B8s4U5BMz5-(x*!NOaEEc{G z;ZWSbdRPh=hheN9}+IuKx0EG&0(bWcRKz?QY08 zH}8;c2LJ(#{OrVLBuZ*JI;9Zyo6HIqyNipwB5SUCJ-43QuuDRHIE5D>UC^QLRKJ8o z%9?T$`TVZ_vCaY~d&-xtbt7Z=wq}ZU@IlK@gVO^afPLKpL6?`mRDDe4QH-&W7{p z>%Kl#xEwM~*AoPbl;cnctE_u4AuCjEJ#d;WeNA~^(Jl)8=wo`gE$@YyYP!FkjI(>k zA&dIm3t!0k-!64|j&r#^o*^ebFmL*X*s#YqjF+8afn{6>d19I-P*6T3wp{XumbT&}TWnU?*&YbBt1ChtXwTTg~RbxPa#1P5iDq zZXEGlk>dF7eJ?PUsf5aN>DS9EJMu4my;88qF|f1V-hKU>w1D^e9__p7dPeth3DVC! zqViv?w=dIJR}dR^Ku5^6`I@V|tp|l&qRdVAfykpb-R=6k=o3|TJnOj@J)Y-eakQeJ zSIoSb=j55$U1I}Ym)#UTuo(@0Bjs&G&GY>1Gi7135A{EmtxUUbZ{u<4EvNIbrq!}9 zK8l+PKJR2t(z_9?pMDVNW7N9z8y-H)J7B%I;qKVY)29UT#YlYE;lnS#Bt9FF)T^9d zGZ}VY?oIuBvP-&@h!%-9@WKfv!nSps@!yEr`2aBHSZnq zc#5mH(>efw$7YUS+B2~J-PsE))UrFMO0TUeFtCJKg|Mg86tjvuTw4T1y^L@KN9BeeK%4UPZvud?jaUgZ10aZj%~qT$lOV1?pNtMgIK)|Lwoui5J8YcRYZH?)Iym>bkRe`qGvG zPk~+eVjcqgCo3q3wPFbGe@w3M;jI$V#9?5bZEw;z-=EXz;&A@@{J?nc-&O#R`2UAK zqBx{-D>t)nnz%0g-@b4UtXfTnMdA@w^ePMOm`nwQ)}9fM&Hr{^d+J*M&eH(k$)hrt ze<1WUSJW?+$o)F@OyvJhSlzMBgO zW$-IWml5sUi~9Z1C?8#hn^I3d5Q^l}2ZcxS^T*3tX?i+Is(bp^GVUbGex%$&-_@0U zN)J`Lnem=G4q7eFQ~B3Xvja(@1`BkVF1<|NS>UQgT!D>tfjk>oaF>)@y+<9O+RDF07U61-)G|G775!XkEEDM~XxzSM*`odj{jqw&J& zH`>7sSMZ}mXS^8~7q>*WVFQ?$65FvKpdzkNtYBpHUOtWc)4od|Tkt`aRa z2~c+9#=76nTc&N)EcCD)_Zd|Xi)?HDk;V2nahEOvP2#}iUEw7Fah@Vz2;1bAA^b9Vcz{Y)_7RPgZ?v+A%ap#fA*z-x^m zX-OK%5e~sOZrs3T>U@+B+utzK`bs_@_m^mtk}SBEf}*M$)RBcKua{2|Lbav9>2jslu3U-;haX4G0Sc`(w|mZS_*c9r&%Y* z=7Fh%V#EPZ9v-tJIv~7Y9!pdGio_O;o2LYK5?n+#fU0`BL8rvfE#$~&3gHT`D^Us% z^q*~8cegLl5cod3_MB1Fk_6-Y;f*$10fKXIiHO!IRkadDxKWftjD2tUwSWNYMl4Gz zY!r2U!~vZrc>npmluWHfNR70EvT>{o3}Wt6CjAmZX25G(ZS%qAU_T<%x=`6<*BK9q8xN`Rx2p^Ltzz({BE5Ca068CdDfX2#?O7+G% zzvjoiSI#|neWmT;A#40+=2&$uh&Im$g<7?2j^{yQq6(6>JW*=&T5tkP{6tVr$mXQ3!=k`8%QJL$s zJ4I|V*nczb;hesY_Pr*kpqHKP@pAP2XR!OsQf?WiJBqyvE`5FDqnQ%mtnpdCsBNj) z&{rQuUTW=bW1{uMJYF`)=1d}kgwr6bVxTt474iF_hMvWh zyEWrWZFjjOYb1aFAYQN@kP<5kB;Rj%>Vc3cSZujKhF~mkznV>Wu3b1?ylnzm+(8j8 zBe$*=_PNKs7eb}p2$vXJG$z&p*`y92Vf!>ZIf>`hP`l=}Q}m)9YA&TH5ib3frK3s) z@4;s8uZRJw8-Mq3TZWN;?Gi1c5VP2&(zCtqY{HkF+PTer28^2|QqY*?s9*q>`NM=f?D-UU6*}Njh+s z`)uOrnYpXCBou$4=+}rX)olHE|D5Sti=CFGoIy$o46&k~8S>OJ72Ehls#2vk5`os- zTUbEg5&}0+amI%RpY8j|4lcNFNOOi~2pX4z?5Z~_Hkrf@*mM=@v?}G~z;jWlql`;E zmm4vS18W=l{aT{xQ}Gi24 z;p$iSS5#490#1697eYIN{>8%Ghs6tmSFJ&^HO=K9&Lx)dmn?0b8(*Z{z|1ftff_7Z z$LG?e3AoDMUC+K91mSk7^L>%Z_vfi#!=97nTFneLNZ5TrP(R`}abAvP({p`}HdU3F zl9H0gIdbgE(JdBHp!xR3h{~TF_8fJ;@i;bjxH)~NZ78Z5lPskW|4<3L&ATF_>g`YF z&tIU0bNc?oHhxNq2qAAiO z3I@ZLx&wFuEbpyA!MUMEIq@VsFoLxYf-$21EtK(i5%pk!S9FUS9!9U&>vcoUkGJ$k zmOy_8osxJ>FCu4giO2l?MzkyAX5*Y1al;uNtBXSj{^mh1}VBJz=-+Nu80hRf1s2Mm4 zZac~0h^gr6i5Ilr(9SqF%N_v;1g3SE5_OVAdrqp$$*!w^Pbwi=SqSWlmVj+g17+d8Ff>%Dq?>821lTB0z$1PY_pAs^ycKZ24!;~F;m~ed$Qybjx zkET@XPPLtvX;~{PBZNZ0c>*?ltZso{ovi5BT!<+@ub+2pHaTVdA%SXiJ#qnL##>&- zBh7PL?bfH%0UF>cx^(GM#?SafmAJIc3SDPPmS>|xcwc({$zG8&fN?%V+Iv;cKSD`K zsheo(S|-HH_B>(;o)0pgo1Oi{a_*gn{U+q%?_7RO7!C7GRU54fS4C_9UEG{lac38g z3=`O1J#d`_<8*Uyf&5SnR|}eg*&n=S27^UVcTx`vo1&?evXbkN&g^<$%>GILcf@v$ zD|(=ztHZe3oY2wnm>c7bFGTPsP@upL{kInpPqV3q6{``A6{GeW78g4Af-$c&j1n>f zsS&)#z*eH{SqLqIz){5(A!T%IOdkCD&)M(f!}u$@=r@V@ez-5#G!1_I=@XxaW{t&& z&_cd&ye475X79z(T((^^U`N1xyhyTskD|R!sC&Wd!Zzo!&QnxX@yw|_y%%*UvawGm znQm$x8wJ7$mVKh3di%55mGzrWGRY&05KNUNJLpP2JbFTKrC{<}C(Sxl>KBj9l2}eB zKN3L|cj|3Dcal8)c1s3a?a1nq@ELw5y^F^ywpk|9SWW3_0&wrc|170T0JO1|`b8eu zwa%h6+Yjvby~}#!qIBb#$vx%6$17|{T3&9>6E>;LFnW6(ORyh{cmH9Uk(PxFjMMg2 zab@I)vHX$}*m3Mt>Q3t&CK=QP5nsQeImRsq!b7e7eWCZF3kv(?6m7%pN+)AJC)cVR zjU`G5`$1jx&`lW&2;RmKZptjk`;JVL_US0zLh8{}j!Z>|fied~1)YAor zFT&;f_Ec{Ycj#llA9P*gyPs;fyzEE;NOYNhg|;p?Zqtpo=%C1lU)l{9?A@0iDm_^7E6< zBjkMc{b<4O-?Y~ ze{$uachaLoao-iM1poafOz3GgaRfGa2yiF0%B<2@{kGz#Y8QJSuqKJ4P}qBmHHg4= z_68eWvL&qK?y_j$e*M^_mdFozT4=FKx=$q#RSfgj`3y<)zH!&!W))>Gc_MZIe??KY zMWgpX*h}dqmJJ1{HqOBpM2f7wpkZld+mWXxDc`&ou$BAA!#tt{xOA2CV=KU|A+Nj^ z+sz#8gh=h0HEYg1Q}$k6@h0{|>`kbVD?(s{Il4Vx0q;eGmzS2_ynRa`$ewj7*E`W; zEf-sb#Wjhto~U{t{Or#yR%Ptmx^=6!84wM67Dmzo$Z6a!oHG7;HCg{?b2$*I?RSfT zpM(z+rQ4kelNN8#$|-hcAMV?u_CZ~o8|#kpfO^Zm%1d_m%YS_@(FnBb(u-mNAB8$d z()ou;XAe+<^KerU0zqF@C+<~rh{Ynm`(#o2zah<=kcQ9&X~L(B@K4s{d{QbZjy3mSEQ&AE)s3^^KYb zAr|5WHw@)HCqi+y9UwQ#uGoF7Lwu;hXLWfFi(EWezSFinXL&IGZc5bh`~bn3tDrfG zhy>^3WgfIgeU_g zR9FFeI;>1g`Cju56lX2aJ5-9BP4`_^EZ|v~Gt0L6lG1&ZY6Ej+2*+*a^%}F@qt!>x zAQwHQ?||We6CCd>;ACAp%Gaf3cCy7;8|^~V8KPA-rD5dQj672E>)ZPI@AV;9X&ovn zG$`2*(DfP2-*1)r0d@s%zFoYxwKcp&5b1$JJJ>tbs-bcsszU=?j)wW{k1vXuipY0; zN4vn@nT#t^3S<=>vUCLat>XLi!R)2ONIK9C z10S_BYJEtlvM%l$-_p8@)_*V2TeCPCcss<~q183yT4h!sT}`nEdQ{m3X!h?@(~vmo zE~*e1QFLINv&HeQrx5`)`*i_aOur#lh6tPN78ekhKxd^%cF4pMF0qJ>s0rucWLt-N zC3S807Ea|#eXcVJ_pVh4{-PQuvT@X5Uewxc`hq@ox}m-5;6AEir3*60tzDs{n37$9 zBvQd14a4yI^d3SFwC{>j&ix994czP^MT2uW*waBfVyK6oN<$d{(`3 z_rzC7fvPv94&DygCjg6zv`ve^Xkvo)&_mNx zZ$F&}#+#A{PZPoH_#EpLXq1%1&oa;R)}h;LI_QJ}H8UX$NM{_~BedYKFk?xf-I{9` zS6gL;h?djABMsF>3E!5@k}OhgyJcL3cmvj%Br?~Xop5iX&O;;ItfLmi5uc2yUD3~o z!ZLRG%0aCe5h0cXt`t;M)}p{l)ei%ZBb0r|U4r_oML`i(kEQFk zQiba8Yn5-@;3B_HQ*Hd{=$^v#(>F7$`GT zBuC%rtsfG3>KT@?*Hy>NY8+Lm9go|Q;jipLBA=Oh=Mss&G<%Qkoy@lRY#zH`C)N5A zNA#-VO#*5&O}exa`_j*|jt1_v)!hdS%TW+GW%{TVoY2icuLF8{0(Ur0=|zlFj=J4q zmJOq58%dyPl@3>lG2OA{hO(r&78&)E7;_H8)rc)=;6dp}xdT9b*MCnrmpcZzT7=A7 zTnTj}V@!CbLybd1MY8JSD%v>!&-GRH!wP-jlag=f2jntQY^o*VaD22)s zuEkq44CefKOlbxR2t+#wtJ*rX4*FA7wZEO>5e%A@9M3BeB_yQXZ$zkD%w7r}*1NM4 zVv3X2(=$Vj;E4w+gJsGJ8CsPdp;r-b?V8R-1v|bt(fPv}AA);bg(@75U%BNXby70W z4Mva1rF*@@M0*Yq;;yQuGTn+gc8^e(J@GKM*Ss$&w69RxrZ=?Sq`m6^zj%JeO_GK!oOs(__^Ie}S zcWS!?9XN7B-Nkpb`g{iS{cKw9s+IeNyu8n9Cw}|*+dluS3-4(dpVad?JrQ@Cc;wU= zv87Anv&uD-o_7m@?F@IHRW?^4()0_=048{YADfqL;NyHQed3B8s3|D&>Rh|MIb$@y z0&slp%Cna#KMMwnr%Hn|m!0kuNgv7CC3x*^*DiOtspS4|0z$luPf&L>*(Th6r5CJ~ zf0%J5JpKdsj}Q|SAK}KD4t)x3r$*{!X-pDq(T3MuMBYTOQ!beJM#xj6Y616YUpo(d zIyrUA+1%P5Ub5KTo7OJRA*S8dbd9X-(REnlBmoW&L+@R&A zqNKE<|LSe3a8=(^r*3~WTIG56y$iFWl9r#?Yl=XF)6&pny5DfB&#bX{%~f&s$@qcl z(os~r9N(+W&lHQB^z=bw&|H^&H!v{F|7ND*3ldKQ*z^la%c_Cw?@oD+j&j?}CH8N8 zbxVRfl~*C+2;%XBjMcWH3BF7@UaI)&2;M~yh?QA0Qeb94ur!MQhhauhzc64FDH38IaB)9jL~U}{DhpWT(xoC^5RoVIV@%^bAHI20qo zzJNv0xMOWOuu*X(;$;zRnriLZQ#%>2hDxuZVNvyxpK&;>mMMySAADh!|NvwVa-6#~nUSQ&ITBf+0*L4zRQZjf%(=U0d!n^D*E}&9QjZ)a; zl+1#+?VZ4$>d0IDpQP+VCwmFG%kF^M07eq+{=IvjK-Cta1Xz{Uahfv0wBwk=&7ZA1 z1ULeUMPruQ`n^pxujvgv$qN0*yf^)JpjYL}Q!j;WBsYH`2wI3yt{dxXoZuC4 zm@tAZIE*Ngt@4x^763E43#yJAplbs)rrVn8mtOPzkq%<%Q03B)3Qqu#K#FE^)}^Jt zPb@p(2QUlQ?uToAN0HbBW&ey91pcdz@jqhw)dAF3K%Ycf{viHe>c$Zpl9(kBX?oFY z8xRVwqXhc1&y;u7Xq^3KOA@>4L%%S6%O|j|>2%&q%PJw(fE*Q_5-lLYiHQk7D-r9a z5l|nmO2~TH<+ovl&`7m@a^mK8KD}Q6!mMb;=6^FSq$35?k00|jXt>+Z`jFD7xe0}! zq|@M~zRKYA;su4SCeQ*C)6G;V4SM{JR~r#s_fgBQaY1_UBhP}M#5v(Te{4?dce@!%+VazPT037mRzM!$S@p6P&hFt!?zRIT2)wgl zVfRS64dw{Y>7SaVoG?J|e+9jSr`;AmHlN zmV>tg0}HX)Xw_dhR|jAr)zyPGDUHE?bSi*~aytl$7iRfH6nydB-Y+F6D)BT@U4AvM z?^9!6#xjGhZFq3bqSL z)uXNh@p3{Xe=pREh;@PSM|gEI`v9M%x{j8$ca-=Z0a(+|cbd#e0X(2xD0fNslCNxk zyN+(_hbwTs_;~*fUUSi%Akq4&!;=BrtG^%x97HBSsU5^9{GDhu(m82Ubo9Y4xL@=@ zwV;EpcK0(CRz?xkv>dDfG-Ai@=!1=xc^$AJ+3$f^w{^pK8D-JNk-m5%hUG7>$hv5wbZZ=l0Ub>P~iNj3)&NI$AJ^gx}#i(yMv;oFE=8fjY?8Ff(W zfh4PX+=Yq*Lk##jqJL8Dj2k;$K5uZ_hrVg>TF*vSx&lH2%PetoF`?=z5PB8rd0x>t zG%U`ST_IYSgq-YB95_I4*kjwCYgl#HkrsPMovWRZPqKg#q4gb2^x~+LOaP(3--tkMspf0PB89jBwkUOI4zN1Mk`9~A1@w0(Qx zZ*Ah~=<)2qx%2)8>o!cj&j7PAi8&Z(ffZi2A+Z@39;kz!G>nk_<$XaMNLGJ7g#=nN z1Eci89YciA-TWGzxS0p&uYrHi7}A) z1<`E7KnX%t^+{qQUz~ZW0NwR_umSwb4ggxZSr(IU7VhRM#KoBhD75GuQ14G1cKz!$uR4_Rp}z@1!%<8N1Tl!%XqR1~2p`7dyYVx&41$gS z84Uu2fPJs;z_zOX*cMaKM&{!!&Vq~r#h?;FjF|4f0PX|rMvhZihkl7U4Cx2yXLA;N-v^Dp-k;Y zD!%UX(FBdZgNW+T9oM|$jPv^REuvQT5?EeloM;EnhSWw{>xm(U&&Y zk3S&t$aH^AE+oF&oauy&&XVuFh;G5H!@|3FpT~&DfBcXNSj3Xml|?*EB~Lp{6KTK{ zX=o)tQT5K@vum8t4h;8>HeB=JYDRLh8&BccH7tJVkGqARVy3~Mz=c;xXbQG*XDs*B z;X6K)od77@1>z-Z?^7FT+5K}HsH}xntQ^~9?l6mE!XkO(I~3~suId-PKle3e^90F@ zZkfeqX{J#{h`Zz8EwtX9T7Zr_>HUY^L*GWZ_OkY>NStRNVbh9_;)Tin&DJCk$Tq;HO=>mTW6zz-Xl$)Vf&=3V6<2yDs7(GrsG%x=HGlu@8tDF_G9Jkf&WN>geda#7^+%OuEgNp`Sa%?BFV)VoZcvU zD&Wkd(1Aw73RFTOsZ;>7KIa{PKrTY&4!zu)-#V~HG}>>LR6FNf?Br&vKtYT4R~ZB~ zU>rIz{6|45KZ>qYDC%8PBt_7`2Z+dc=f(|;?G!k~5Y>#9fj0!MYln$UMG_!kmgs&5 zzVd*~>)_zvm6f!m>~i1=klPo8r;#0wEYF0lA(3Nf!LJH}daF`DvbGr%Xnl5&-i6&B zff%K{<}xwULFPw>%_{9Px%U%c5OE%|ziyP(&`hu}FeK?EAWdYp3{HcGQlcPHmOiZ@ zmG(J&|9~i`(9eR}xi(sS8u>cKe4l(s0w6dIiPkSzpX7Izm^_qLKR{jt;+01`dqep8f zXzItye4L!>FSGI+1tJ1|d}1OsBL}dINXHsDQXa@OIU%M{E@O^OW!<&QsZ{(wj9q=B zvJ!-J^E90AOv0(JU+8*@K$%@asg16(oAcjMBidc1Sz<(6@4rT>U-wHC;H}_O-t4q1 zeB24mhWLOM-f`6TB6R_R5sDnp+GpzAAtHc)YXgW~OpPH;5e@6oO?VT;OsB%R!ySlZ zZq=OTjjq6hi$Eht-=7kdlJPcD!R!9$PE_&GQRTzpgqS5gW(L>lP3*z+3D#Tp(>9?z zgeTWOO+H>DQ5fJZ38!D^SRg?cf>46}aT9XL!JabzCP%REhB;n*f)c5;(eeEII6P2PH&JdL?s|tXNZjl>G*r@ zoHh4qC+dMNSSiX03Yx7J=rlr-WxHyu5+h;ioqrtGmWXN=-id;^#B2W3JP#)1Nu{oN z{Z_P>FJFd+MveNyaw$kD@2M)zHYYUIA^OTft%K(vG=ZfXuxfQJh3>CJ8j`j66+dl5 zd6lmI{L^J}s(;+X>d{&?q_!zhF|l756Uup=45$II8~CNiMALGlC&JNX%YlOj)uRUC zbu*s-V}e!iEAJoABJ)c^&Wo-HW^&|*=g|i5&a;odRjqvQYvNyAKp6&uRQ&>^z;@j^ z()Z!PSu&5-m&S6ZPTg2Db6k#Ud47IgDOO77b%3Xw3t0OB)kUBq`4(QaCs%)x_p{9b zvspJH0q4iptkoMty?83(0HfXUK}%${re>qH9YLstLcglbUDG$#_aG`FEVVA=&qW8yGA9VPLfIz*sRy^_Rn~bI=b4bi6;E1kqt(ULwDmbw3(AyBsy}`k* zCHvKtHgtWOQ_syo&^zd=k)zm%Re8zc z#2sacJ6E1K-2#!wWp@3j%uN@7zzOV*z_h0kBAByjIVfzP;!;o6rpd^hIp6QS>S2h(MX{@}?;TPK;(Q~%d z&2)<&r&2@1(Cxea<*5TB`iC#V^}qM#(;dfIOP zcbOAFegZL{==T#!qHWA{4t1Qv2Uw_*tR%T7515xP!$+s|d zK$r3REBx(ZuNmcr(kYVC-I^z>_mNZ{hPtiU^}gbms7F92xG+dgx*UW7W3m6-`uSN( z!nSolf?=S22mnYODvc? z1<%t~i;@)im2dz4{Xq8kUX2Y4%X8fzw>GvH32j)#z!rym$O-pK%pAaMwze0=b{2wO z;?>S5&4`-Akpb?KLxt|TMvqb5wXWVn*s$#`?)0-eepl+U3#NCgAOO2i(Coj{1`sz*g&3zUSry#sdF|*ml zj@VV6@?xfwDscal47X>yLpjz`xOVGy-C{3yW`}>OG#u?ahRf(A!B-N$ zmu`>nqp`X^s!h9CO{lzAwVISs=PNSLVZbct4j-A+mj*#BvU@h9=OckI$%ldG%=ZqpY z_nkjs<T|iUR;Zf0k1bdeNpu%ACP#`T%V~jBHB=-f$w$vQMjtr^{Kk<<#h0 zg@~JJZv=!?gTh0D(I@00NnKNEx0Rb6$^b3C?1L{8Q^4Ba5lk?2U99FJi2>5UjX)3` zb+g3DA+Sf3^B^s>V4UdwIgfYg&nATletw~04cKtKvk=C9u`R1ABdQtn45BNe%k%-0 z@r$5UDLa&n4`04Uvn|B`E`eyj^Rxq#VC|Te^vyr`q{E~?T_)hb{g1Hq-$K@m zXI>Nlutz_sdgsa3$GBm>6qTQ^KD=>zeOromedb=ofONiy|;mhDS z@=*&5B>+qRQJ&Jak3;$QTd{giH^+vHT&vn`>U%9u{PF6E!9nJea?j|Om5tY}U;pZK zOG%t&<=$vVQiL z^BES~Jb(f!kan-tk;z6`TY!?sog4vukZ0I8V`77Vv;?OMN zQwZcdMHbhtF?&d2HcIuqx>9|w6yYwwW3lGshb`MI2}b|cq?PJesNb_U_m{g6doVyl z`>Wc@PzA?<^x{jx%ZQ@_z}tBowsdk@cog3ll!gh7p0UZ$ooU%V) zaMa`R@oQtD)6KJ)!(9SEK;^@I3E+pM}E2W=1*}1Q8!4J##`+XM3X2T}H*azlc3A<6a%>K~J|n>a4S&`;<&r zwXaKum0>^n1j1swRj896nZY5!)gr|l>Umm$3uW4(WIRK876PB4TdU|WKiwfA;a%UL zBdkJkXiu5)3b@(Y1-~nWoBAu&051u<@6;~X{T6gvs=030b|~+NdgJKG%!UGFjId2Q z4+gtSN`5ZEE9KYtKnDYL4Dpz@iL?G9HD4;;VeMcmq7N+UA6=F@L4cc=jglj`(4K*g z=?pf(235^ZFY&8cU|xaoyUr*j0N!x_U`~e?-oo)ZJu6=Ty9sT}!aGWQc(*Lex&mxF zK{g`&5EYPdE*>zuI2ToE(|bye?a8aLRgYo{dE{NeZ$S-1AjqT97#7h`7qnn(wS}Z8 zp#{r`bD4y5tgl!+aTftelDgu83?PchwYWjSG>!^}NhT=E9T~h$BP? zqTzt(ABQ7b&Ws~TfI)lyBrPHNWII?(m^~-d;eP-z9O2tfkF8M;kdujNy_naZd7x*# zPGi-erhSTa>-NlJ6o*{nuRJ{TdmD#jn`x}5*^G-YMYmr&1IYW41EGHn#QXbk-Vf}5 zD!OHLBh7ja(zR6o;(;n6PHzX~upLAIcQh3-K}m8xZRtT(%{^PH)nq zi1X^Ij?{lX8hwJ|keu4FT6x6sqjJx7e$)#p+oQWH8w@lzo)=2jmCFyMvy$(k_&!7I z`JD-`mKZVnZTR00oVo;dS9Oo=9&;RtNic&|`{lx|RzZ??uKYdI8r*6ZGI1}$*1h~ue-I=Dh4G(VM zB_ll&#^!ZT{kw4WW`@h*98goinuwV9Aj|;TD(19B-P^4ObzA0s!MfLmFsqcD$R_n;O9c+Lcpi!EPg!CV{B+YKB{I^oUq} zK9vYYVG6k)z*n(L8uTnGP}52m(57%aUc+K9^tx?XP|bAU-{@Z*BO}oUW~?vG4P-si z<&bZSU{DdXGxD&vM@oTlYCxQ9@4fs97W z25T_E&`Qx0k23!iYQo>gFSa-T=iaZ9B!ZpTR8KWO_++|F3&pqNWZ;nsnY4^afBn^H$Bp$AaE}Qq zuf;VR9+43Jx~~26NR- zD&%Z7?4(j}EMH+enx_g82gH$Eu~kjQoI|{G}MV zyh&s;sRu$0lG#55A^PBi4<0;-WKV7J2-hGd{bKTYL|IA;hT$bzk~pTMV*B1++rM6e z@u$xLy#tpl1Aim>oh!!%fmgP%x;Z!|KH+=~8P%VC5wPC#KZTb;iew3d`d&PF^7 zFaiiHoW!L5APuq%ki2a>5%> zK*oC3-@D*NXSAdE_tO5_`i9SI!|zSlwRDv3@H5 zV)ItORxPhIqaXvl>(WDIHNgv2!8l|VcxYACdmUluD!USDc(}id2yS>G6NS9fNXsNf zijbIcUn{y02Ps7Zy|u6uKzI(pid)WQn|ZAL)1Wn^!8e9`_Tl_U0_=m2-_K?R3DQF^ z;i@@nXa~a@F(+TcU;OKh88N;G9+|;-5um~PX2law7f^htUFyK{nS?n((Gu}Y-QW%y zoPi92Z_fDb9-~C@Z3qQ;GN_o-_XYNNeA?7okWQQQ%0}8E`m2|jaPeud?R?y{QC z8f7YRUL4Q{Iy^0UyFSbVzpLySX$#^13=s@*sHRATJaiQ(m<)%-fyN3@hGOP9lQ>pF z83V#5E%MjTo7TaMAhd=^&<|u;b+duCw)PDF&>orVU@wjr??^R2jMI1Em{2Ge%=eU$ zi;MBp1e3>u0I=%J|4DQ-dOZ7HX`<#4uYatU3cU+xy%2hRH@9CXPOt<-D;%x)9U=%b zG)B!4UW!%SnEw^NBO+ADZm)UWhMrkW6+8rtL3=DDfyX~jNDYu|9;0;0VQK_{GSVVA ze68|Pdf*ULq(46Z2BUeRdBqvW8?dw1Ff-Ceq<JbKix|B4(KyHIgr)Z^<@NbU|@ z>=45MNmEJi$9sGHMS^jXP*hZiPU?LzqK!_vKO7Sc>`2w5yZmQt-8?~n~2sIK5$@S1=0`UQO5e_cUNRwxa7rSA77 zB=e|vNX8YS*m|==F7Q4R)E3PNrKKSFJJd9}5BTLQ&z=kx;I(~nWCC)XNSp+wr{>51 z8j9`_8r@kI{rzHMV&(H-JDoMiNq$tDTx_weY2a?~)RA_Yw#w)%nW!IPXMgvp{QJS{ zc^}}9h%{K>YwW~k0027^t=LAI6{Wm zVfV?`552PD4NF_Py9oh!niZ1F?zC4s{fRLhv_6p_RwmxkBi_3KYQT1JJcTrR!MbTU z?(^OzL&lhF@t`tgq&5h*FTtAQyMKa5MsNhMRxa-BHv^?rj``u^d!6~m8%wI)3TZELT$v>h-Uh7@!wRn1-`?>GyI?v-g&f`3;=q5msonBLVxk53=$6UcC)Sd_Cy|Jg^%9-0r zJZ_>%3^S*Q2Jwfc_wIpTU6sWv`7_IjBf(6voNOopif*d0{i^nm( zDbaIZ&jMK!)#UB z-@S-5uMikQ6Y(<9;oeQUV>INQoZAcwl@uy4#>rR8jR_Yo+jA_eRO}k@?JSFK65#N9 z!$Y=TKXEu4?a^gm>|mKmQMvZKOl{Y|VXQkCR^=dBGR~-iy-uY-yTJDb0Rl|aEnv5W z+H9P{Ls+yIe0*{q;SGtW5)-`MR+Yvgds|01f-!>+%Q9JK!8~rGrK*UfShojMq9rX< zKv>?232XC!XHnZi$a84?2ZD&m5_4^Ebae*r0x>7p)h0B=55&xvb2`qzoqSqa_cgFt z=pn&*(-|vp40FV$`!&4p)Pyg1R5)uUx2|8=vo#584=64H9(=ghFrEZq6w>FHHm}8> zK%`N|XSRC~6OBRB;!7d0r4MibrWgwTy8GQ5#`f6!l$?$t3&G2|VU3ob#IwzmLeV`T ziuQR0~1B}7F@hjQlo<5hNrmhAHh5m2ny zErWCl$z)nhAUsfk9gpI1;w67GRNW{7ko*gPP_(Nbqx44wSvhdO*#Jh=W}fsCfRS6j zZ&-<+Ni(hfy$KsxdP^n!Pcj|5a8-<2x%HWCm7l#|E++mELO?T^^Bq*BrY;`=Q&fGj zYh#hy*Z>($17P<6g@m=tC8$d4zKo0FXE&<1N2Y!NWg^UiAXdhkM9Vm?<>zn5He|*1 z&R^ZbTZus+7#IVVh;&CFciq@vr z<-HSj4geT9L-=l6!~PbTt1;c;5HotF_y+j}E=7H4C}EG~A%_G6aF}hVyA>j;OS>{;wr;+F$qh<&vU4 z5SigvF%W&0E^sC~kTkAz;b@>bH8nFo1k_J^HxwJ#A8oFdLRvk*Fo;dLHpC>-lPTFoqvb>j!$xd6Bh8DuHU@B zp2!@_F|cpY*_=Cf4n{pk--@*eNIxZyrJ?-svpysWJf#t|M@Hpk+`lLB*=Iym_5UsP zj<5Rlu%auky3Bo<%DC$Uz$1})|OH&D; z^@Jvhb7w&~vT`#M3ws$R>K<>Qs4OmdfvH1qvhW+Mr`75F<^u5C67@33t8sY~V@?g* z;XF3{;@5M}`Ssj;VC@-YK-Ni5X<6Si_s-KE2sKc*ro0O=)P=+mTuzQXxmNMrq`LB8 zFdFgtXKSEdyl_mTK;ZWVX}rHY9`Okma`|IL|4UKwN4MYm$fRVWEk1P-RMyx>_-XB~ zhATX!S;|*`Ej4kETG&A;y~dx4Upy90AbXa`!~UJK2|AYW@Z952M#T9I>v_@3PDV52 zh7Dx+XHd15su?4m6qKs%7Bl~EfZG}=dG6IMqtMflWno+j^&~0yFybrCqMUb=!H^M< zGB|ICOz}4`r|U=~l{k^ZZAl4YI)X<%@|+}cna9#|E&eVGYWtZ383)>8f579nS#4yrP^3f zda_8JXh;JtB3=?fPNc9Q10-q3A+RJ%-u0XD!H*<)0bPI$3BvrqfnXF~7YMbfV+c-S zTR-ZKunk{6eOebM*=JUv#N(XV%#NYleFrq@w#$)Bz`6q|2Su##9ID0@nG&@@qdr7J zA!31Njz;L9F@>;w*j*i>5>(Rsi-6pEF<#@#+Z^g;kC^}KQWc1Z68wEWXoRrVIf?On*j zBa|)aZ>E?L`mG+b1xJ@p5pZhID>{bIN~{UE1Vsp5Yl-kXWi2YQ_M zzzFcF7(ugT0Wa_Un?9!m_F}d#_aOsxFrhL*mvDzCNL!1dEwz_op%jL2mv&&b4i@a` zRYG{05CF0*79?GSvsvT@&w34*j{)8mQi&Wgs9mO%9f3I`|R0FZmW+lcOh)9-_oxVnS-`s7WDfGv7!&8u|tRx8+;W& z;)*5)lqx==pAJNl$V4^n1%$6#Q`cE$(CbybFkQgrC~wvMhUMt9rYHj>500wv zHhYQHjd=<2q8KcU9CW%&P1^yF&GMbEpJ9&%t?>w(1>c-xD3mQ24&i_$Zx69}ZIrfc zt_)GXjuM6ROij%EHz$dl%@1-BFgj|NHcLSB>lJB%5GN?U^4AmceIe`5~S40 zwzH{T+#4-!-O4B^Cyr_@3dtHPUEvjifqHNpHLhUg!*Y=z>8M0e2e&?Pdt?59NVZ71 zzNy7baXchYx4T-icQw1NDm`WXx6yAVz2cVGT!s+=8%>5=84SA<87l=d1&mhg@MzdN zJ29bh_x|t6xc!V&7Q;@}%Mt7~@PZVo6h+T zYmcDCc#PYKc}xZTrZ4+$y%&r13|W#TxCCHO0UfBW)jyaI9d1ID(olCkC%2+ErZ>5T_}(bD{6T_)QduP#)^?KtCy=sT)8`!N7wX*e2oP|y zmeFovvCKBBMsLmRVbbmdtU5MD+zbX_xYr61(lMw!iN_#@Pb%$uu+90~ z6k9?I4J`-3;kxuTN{vs^{JIpA__o+a-EM$AXK7v)fYN>ww=PMu3jW+^{0bKKq0Z*# zZ)@=QPhy-6Djk7{OcYgU^n~ay$R^{sfy?;2t)-8rrka_OS!Xn?f}O-y*w4)+F8MvW z2lYTFkM!SCF!O8AwE{wGWR}W%eCAMK`>HiI(3FL}W4g2k9B=5xZ9E5q1;=1&Y^k+J zLydV3IKXuHBJtD(@2^G62n}a=Sn8}-Eg9sO0m@d*6=HHnxp&bd0vI@?TJ}<772><^%V9XT~< zhCs@VjApIoFhBxJ3m3u;kahwMLPvt9^;v2=EY(UJ(aL(8T_fHYJLSH-A6aGf`-Z^h zKb{UA7S>Anfuc0i_MI*R)qK{`*$9Q(h8Q@e+2ffup3m{S10^1DZU(RN9UPC_m3DnK zcpf46OJ|UVY}tebhC$%nXfL8-LgP`T6?mY3P3ql4JH|*xtuVx#{0{6Jp8Mfi`{vKt zZ@vujKX7cl2HsC>+LuYg8}4ne8b!Ha>?{c^IX!&)Kn+X&nn#SYuy8}aNmix~*syXy zZg>}6O7wqO31ok;k!$6}lM&yzR+7OLWd?6>wTaVQD+A(;FR*eHKPp_CZdE62wjXb( z4(;HeXa6l=Bs2YAY8JY(*n(T9JS}ZUYId-ME0*M|U zb;xHAu+K3}Z(h0qSD$M#j(6mg4kUo$A{HRvZddGMVC?mMbW-$4-!h0^{GKT$z*{zq z1?xZj{Lv*Vr9oQ*XtlU~ibfo%&`zCXp2Kf+aBICnst~?3?N;+)bz{tb2C;NvEZU$d z=np*95FFmpkwwNF;INlJg^onkdIyf#q}ro#Xa7`vLaBj)mooG=fxt1)700*k!c{Om zlVHEdflLe2<#?Ejy$M=fsetYYIFtH{edUjH+4t$gH%vxw+cv%Y##d1?x88*mzQcMJ zS;-Z~IIF^y7%Jp?Agw7P27qiQr!~PCQ%09Y&fEdB5~!4l>sZt5z*_{>8(hlMaT6

w;nyAj6qK++#eF-5&V$X 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 literal 30495 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 L>Zvo;tWW(5)EGBU diff --git a/tests/integration/__screenshots__/decoration_halo.png b/tests/integration/__screenshots__/decoration_halo.png index 248ebc0a4b13ee72ad7338393f4482a102c7b62c..53a728ef5fc5adca4da2400dd3f376054b2f09dc 100644 GIT binary patch literal 12819 zcmeHucTiJp+$E@hqKJhe{q+^32`VT>2&nYlJE4e3?+_qVQ9wY75Q_BP3B85@(h0pK z^w3+VfzZod_nV!ao!Oah%U?UQe~_DSOYVKjdCu>glMq#9847ZGav~xk3OQLxbt0mh z*}(gw+c$t$WtUkT5zzx8Imr*29?4s?cRVz-=DPMJtiIN~zian3E)KbMTgdi?_5)%m z5)vl0VW;=TrjArR<+Iq4u&DkmwnzK2X)9l9V*Ze&$r=;88G$`*;_2W91TS zbnmIs$O}Ow=&3Jrs@R5-v%0;qv)}Pde-o`@c~Ay%(aGf46|UX{ox606x6p zY2^hrieY7Ufz9au-}V1)YdH4gDkY&{oRubjZfHRtK!7ec(fu*wOX*Yfrcij4k^<=(72 zmNT+16*TSa1vIJ(hye3FKbm%M7|HHQd}{+d_TP3PqCH{Vf|^ZMn4g8Sr+TzTyGnU` zd*>;qpi2z${_e-zGEAF|<<>zBLJ6D5v&|v__l}N^?a4|RVj}sBESbnSPL0*(>&wy` z{*S11c@PW&wnGjRU<;4w8oT=XdJ+nYO3_Svg(1M{-&u( z;H+6!M9-jd$~&zh?fz9>pYV{fva%MH23qp5eMYyV>R8c3LyYWfkA_J&@eQE{Px1WCM>zgjl)a~9R#U0`ULsO@B~x(4MXW ziA{#TEqGH@f`X~}ANPSNdkq1&J5{6;3v@Kr)P(s?-AvGRblf{VSfifT8I!nmAIqkW zt=VcgcW>Tny}Q&Io+RwD>Q8+01;gH)$#Cu}zno<3%O4vRU}m z{-oJW&RDf;ClXp^jSF{+jspDIBpAon{YG7?9zw)I#5JTP?mL z`;5K%I>qqIyQI<-x!#cMi`~PW*Lap<_2FQ4v~$i!-ZIoqbt6vvq*>=0}{B7k(7hYUqB= z@m6D7EI;QxgZe(}bLL((ulv>;C8mvNiOz|a6sM17ymWII$DnD(`#Rtuqf6IRngDmE zA@u_9(GG2`9li^sNK7eY3zKRtag=&7+C_T}uZo%y`XI94+S=^JtaI~p%j36e$I&HM zgY)ZHI>**1XhJf)P=?eVbg#I~ASV<(;JGuCW7Zq;nBBg9g+_tZZm!X@)_xZDVL5r@ zaD#iwtSgcQn;{X5^g5QGmdKHh4dwZ;8Qh4Ni;`H~OevJ(DIMr7{W4--3+m6AJ3Pye zs8ZC*3qof!X;$G;bh}@l=`+O;=@gGzRJ-JXf~)Sa%MEx{bd6M0<;SnJ7AfEjniZt9 z$Nnv4bO)QBc(MECNe*7>p<^ULkZxy3e4!^>}o zI>wH*wInjVPy7CX4}Kx)IPWiMfMXkF_Bm8DPqv$`(YuBo^b1BldHvDo4JYRY0CF#m zHo9D@%5Wg0uk7Q8Gi*=I+U#|@!Z)*1)bUZ@6V#o0c7|S8o2Myw_I}joHBV!7GF5ah zABnWIgM02YHoO^rz1tHL695#g zuB^;Dbun#hY;+uDinwT($Z1QvWyd+Ax7AaU3RL6IAAW?txUT3&a(wxfn9)y;Y4}S1 zIl5NBYs^>yVOS{aXOloL$Qeg| zva>U!=CGxBH*yEo&n7js%icJ6;jqDaVKdn}@*)#XStXn70s+_Q7m4c+yhJ$|2NIS#Iu?n`e_Td$5pV9Sntp?VZ zRwGM$IFE4+Z&I+>$h;aqR;D$$xiF<=ECQ8pLASM#Bc48;(q|OlXU%VQvie3wsonXT z&s^U3DraeXxhEzjIy%+w>hxvPNo(vHD&uuqN^dD|v<;f#KuEgbGlp11B5{Vg47qWa z{ANr%hGO}%BJYs9ZQ%@Ce+aF?7Cs;SB4KGh+k1S?3)Q(|v3c^erJiq7r|DO= z)O+<0Cg`>q#$Y-Q6Pzg#VG`th;)sER!|Wq}{P4h))WV!bMn>j*&+RUc06Y((V0d2A z`1rY^Wolq?-4p)XFi+e3Hs;n;$^M=Yzs0601f}1lA>68 z^yo$X+JXp4;Qpt{=hgiE0;W_sku?{m?%1OiG2FZcgzLEd``T_z(koZ?2n*pCqhWWS za}ZD6dP!$pZ$nVk2i>S=e#g!K56(3G`)rDcJ7jarsx62@VEWs)Z)<(OH4qRxb4IK7 z{{C_L_^B$ZtgiKiwqV4GVL@?lBqz%+QnS@}FXHOGMiqu;%w~imy>pBlEsW`?rQJkE zYz^cn{C2a21u!@|7uS*W3Tp&kD8h?bEH<$qg{t0-h8@Equ)V+VR!_#SFZ$FWCvV3Q z-;Um98ff;6gHL_!&&%=!EjfW)|9ypf%ANmozAS(qPFidj`2Iaea{ko;xwS&viw#U^ zT0gAzot2}{N~{jdY5CbK94ulb9uXF1Q15IG5H-T~uV25;ye%5`m%7A{XIvl(6BRl( ziWSBu^%wR0o!+(U$k9Ayv5R(Y!Na>7|FmA!mo+@6NvSoOX2X_}gp=8fn ztu8E}aU0hf=pnb3QL#2#V-kinoyW#A&y=swUSb+Tc#>-6-zB=4jN=Ep8jtL7kl8RX zHdbA?W&!`Wo4QF`#WEhl3pW~2zlI}%O2#5bSN+_EUrs0Y2dw=m68wpIUNJ80w=2pa z%8{P{`BaNi6wVH(vZ5+&8oq@_o7`LfYk>fSL=Xn>U<8?5~5LxhI>!*f*Z!7 zU1yy~{viCg*v~uI9e$tB>4s>#gHCJ*#UeFtQ@k_~sB;R#k&3?ia&c(>ORL&^L7>z? zU^67O5_^h~BE!C5pEZV@6fS>c$%i)U^CK`dxu6B7Q-@Us<(EeFc`PIbyAyI!e|(XXob6sGY}I(Kf$ zT+$Dyfqwq@>2wHF*QdOsgRr?D0qklRDG_{MD@a~R$!EWVcBS*zGnqsIJN?d3w@NtI z)>x5)!$etz($fg2kstn##~p*S?GycQ+Z{Wo5<70cvJ&gL5nO69#S{FHbU=9Xp6kxc zq~P=GZOxsKvOQFrG*Zy?3{M(<{kgtYU2-hM>~{pJ?{2ow4u_|gsBH&fN5eTF#o{oX z4(DTY@*~-WmN5uSi5g?j4WrS$0ZgIA(cw6w!Yvc#goI59FPUa|gx6V)-t}?zo@9mY1-3gUwf6a-Zn7ehT@bV{&cnF*BiKcG8LYdwx?GD?JwSq z_PHXgIm|ij#_YuD;d!Zq6djl;4V*3y<(zA>>}67$&xFrwDL5|zmKOSeBOLcfJSq-o z8+lLxk9Ds3ysOL=zyG>S$>g^2$q)6NTT$5R+nAY&>B1izd|F}{gJTV+znf8)th zXm#7VTr~gie>JAeajIR9Ke(j4<`xoKjydi^7*LwstY$uA-%1trRF8%eZdf%?ieKz~ zC1Xx_Wg75(w#1;8O9CLKpv%Ki$SxGXm*O`2cwR6gVbZO=!M(TkE*43EXQ->$GLJTZ z-4!O>#^^N#%FqtHZ^e>?)gUJ@cWtd=%?{}KX6#*KPdO0@Q# zW$0_*zmA-WwEC~cxV18^z3aM>9qVkDtnD1P{sC6adhc^EDw`SLu4=KdK=snuHBk_Z z???O1bDZYQJnSY6iJQ9b&HqUfu&bDRL{0tHVXl$EzV3s)pk1L-caz<;zzVx^=Xfk7 zT6rwgdaU?z;b#0T-(&`p@-(r+u`iUP%j(+yt zZ3N`Lvt_}eoJ^=eJLQf3LEO3@Oy|t$J>(@|jT)p&?^&DDK}5zJr^lva+Y$`J0fme+fe^Wkv8r=z4HayNdXw>p-$F+JJQf zfILl=hD^Db=XjUPGeV&xqX?ugS1>R}+FXXL%!}-@()w_PL{S`yOEW;fto2ls$4g&I zYby4OUw8QSI?dlIZCSRwo-j1{MLOF|X<5KNyBGS-LJZP%$Iajmsx z**TWX*%LP%$j?YoS2b4~aTOiqe4p$|t+m%EK!mpE$_K6<_gb%!GXE$wv#_h3Z_S+H z8M0SvDB7!hVV7nTJzf#MdF-P<5T%`e;i8Xy5<<_eVsqEdb~X?6;_?TLq<8;bd1_E3 za~!#$pth$<;^+;?ic51;?VKD))K$?=Sxo_B^R4qn4YRyi|AyiD>r>d$+d)y6*f9z5 z@3R(ZKIk*dj~_qS6ymC^$59nhEHuxFt1QLI%*;Q3R!n?T;J!O2FwGW*^;in;jpN}y zqmr>W+OKAaOl@c%@!IX%NLGtHjT2v<*sXCfoC0~0JP8po7(v`Z5vW&rx7_cq& z!m(i+lrGgpize4yWBERZ-5=@~FQ!g{SvD{xhoi`qpL#ViIw~h!bt=|q>-GHia;(JE z^8d~h5W(-!Iu^C8-xg#pZiaqZ5*VTSRpAvg+ofCDxwVe0Y+5wc@W7r|`^u0VvrqeE zUSL{htfZp&2$ccgX$%cgu=tg8a06s@sgWb4yu_b)$2Co@O<9N&L+F6;D? z4mhwDvnyR%@AeGJccz#yH=&Q+Zc5g}#aGX_}edSVrOL?o0~wOn;1q zf1l6nrR|cONP{Vl6<|O0jXCg9=3SliZyjEW@KfgSo^25T;-Vc^0xp5_$boNOiwPHa z`PEOs8N-~|?F<81-%o5SrKuvEj)vRrieHxcLNdtNC%4DlyOnA|te9`fRJzDea*lE> zCiolfJh>#y)%@tfjS4|V6diwpR%gFn04>f;>$0- z2(LLgHL2^})wuXlfvw>1E^C@$P%*mvdE9WE^sj5Lq#)~+-PE-b{c+7% zdU8}4l!N60O>qOx9Opjd!~F_p>aCb=Y-B?6_7`knxPO+M$0)IvZRRBqPA^{vVQ>kEhlXahhisReYjJx7ZY z^8rj9UfK`_@x8;&onO#8sTFTmh7@??vpp{zr4ZJ-bBN5MCZ1Hm%kUlv3!a`T zk(X!lUi31W1p@p1)B@9OsG_rS>)s}Afz?&UT`aON3$&Zhu`-n^_=nsYPtptxe&;+g z-nEu21a%l(|D&RW*xu>o&L1zxNF3MhjHW?2peO0PP>A6{i z-Hq(#ite*$n5AyGu=4wClHroY#p;T!jbs=omqCw<(^u_5RlT&m@$U+QQDJN-ZzD>L zG1K_R5o2x7tE<3kbffU}qoqi3eS3vsZ$Jet+4Z^D?*f#)W!8;Qr=`wn+ev2t8BjL( z$r`#JG*nb?Y|t;(mViH>CK}8bY`{S3ZBWGu2%k zX5rQJW-4vNuJwU4)8t+O{#$@3ot<8vu8MKQXNo)8e)5{zNmSyJ>Q^>yg+*|laJhz6 z6Il@KqkIK3v{CZ+AkI``yu6@Ly&yqGe>0;?uJ(JZcx ztE@&1IVJUtcAL)aSE^w!swDH!|E|)kE-wptW>yi=J*u&l{oNN%?8LLY2eik=iQQL$=ia^zjQFPe>2hZGvvl;~wM9vod{z|azr@f-)fta|0k z-1_((3QR&FbDU*kMO8PtSnnX!i&q7omYjT%c74%B080Ov)7HB$Jtousd|}2WIW+0r zIR1K*EIK+mJN)#wMXD3t(CQXS$bNb1*m*gQZ{gn(L7z-?($&wr#{j-R8bWTYAf#I} z#Z+R*Sm8bKzq-_#^s^zSt-1W)9+QyJDzAL*9p|`Ihc$}WF%+tjwcVJ7?%vPcj!qNM zh^O+|O+>5b4OrS((b)7{)Gk}Z*u2woxL1_E%?ny;Xj{C%ocC`GO8TLijk#KFfB-`sEe` zv(ZEN`S=bQe9n(3?l)bGyhI*GD|J-^`m)?X;hV+#3<58BdF=sBzDT>I!ndW)X=$hV z+Sf+as&m^WzV{Mir;5(g;NPE=APoFtUK(0Gn}IDJaZ%!nZ5ZkVLv+>LY%DLWeO25FQkL4w6|JI% zV&GSs1Jm|kzug)KJ+`iIxjZk)FCV+LQLp7^Gm#2GjB-gY(B8i#)bc) zt{$u)RGaA>HO^)lo;D{1Y5uJ0`^2o_3eImj7O|C-760Vg{X<)1bW7!8Osrtg<*}H? zPSkoI>pF3FC3M{~MKs6TaYRciR;7|ZFu+0qrbY?Ub~eR87lHsmS|9t?>&Uiu8?awM zK(P%d3V;+_^?f!WA;E&2$Dn3wA(%y3u3pr6?eZ9#CghZf@BZ_RO#E#9*=0@pPQA;T zw3HM9hjG}Rs^*RR$3oP3Xcm^)h{;UVrk|nKHUeWb?Pj*69iYNlQ3AaqBVDos^Af#Q zqtXqjYutfW?8>GqvB%2{;-Z?<$bl3T=$DUZrPIOv!o7D6ILUY;prHivgp!36sqZ^n zo(2!<*KFjz{JHj5Ks0zebTvOq#&nfZ8o`tg;uC7GfYn~Gw#P=lvAlJJwUKdHOxzxung!>w{c3lkEj_vHpwgP)PT7f&RJ)W0m z9KHA`kIRtaLlYSxB2PL5UffWl-YjINuRNFAZ=ntnFtV;Nz+jeZWllK8cu1p@-4`%tGa|UZabo;(Yjup@|YPdRx*`7=wBRs_Rf=1eBS|~@}`j)#d((c z4dAZa!!~Po?!=QON=h3IxYyUm>#OKjTbs{n)L4z?ZlYqn0FO?{=ghUYbh_3-hgnWR z!RvgxmN0#j^xhKz+k`5-a>A=W-!ilDZq}=&E)m%=1O0Lhq)~?dmcJ+tK;vm2TTLe! zJxZuL-9T@dvLQK9wzYF2lfwIf zSz{}$VHa}Fwj4S&^C<;wekYr4>j`yvGFDk8y=i*b8q@u*%1ke@H`(*En5xXoPm4j3 zW1-|I@NO2!K?!dIjni+E!zm`OeVpEoLr#sT21jsWom`iBAz%(l)L{Zy7Ef4osKrU2 zWe&`MpvwFJs1}Fcd2*@ZGGf%49i>7F?I~0Kn-*|1378Z0O*b4TE8^E46@t%47$!0# z$Z%wWHfTj(c^f#P6F>y{C3sVmgR^r5{>Pie%{vICBmoCxPB#+X{_kfF|B z<)TL`&WhjG6W11bPa3cFDwOq=Rrl-tPaoAsFHX$a3(D(}avUsrS2-7rmq*hu+R!F< zz*3#7Sg@!sUksL73Aiqpp*7IzXt!J&asG%f`4fDkrU^m&lVA)#~Zb5JyO?_V+9D(l9AU2?6P^Uz;l3U*vDozh7BIee4`aqTPp^#!l zz*J{AgF&r*34AMw8xVH|+&0GmMC37QoH*M*#`;}vO;%d;C%R#Mj`ak5Pgml7&JNWA zV*-5u+Js`l|FXxxXMxie7Z6h9}JMak*Lg2XLFM3 zn7r{q?5w52`MO`0*yY{|iMX+SQuNETqi~9yZ~0p#Re1*iCDgADTZ-&WONh*xYhEZ+}!!~29#l33($!?jqbp^_r>+D zN`e{O5yKj-#)PuZ2@sNM?GpVBvJ$B<8a;>WF7d0UP6tJ$P47JRLNms~8EnE9Ct08L zhEf8(qiLTg>RG`$yS~1jqY$qj4PRg#mX@)+sl7Qi1YPe{spm0}ZFu$A$|p_0F41t5 z<(+FjUqE})#%Lbav5g|yHO(8}1JIsLpXB>Y@3I^B4o6jR`vkTS&De(L)Id_}al1uWq?LS}Sl{>kLAPf8!V%B``ZPV`vp`H zX;yuxw`ZECoz8E#W|rJC0(z~vgHK_Nk|nLfafDCXku|nYO3lM~F|e7&%bbr^#ld&n zw)+0C{6i?SUC4Yo3m;F60ti-aHf{d)M0u8BXzbGWs#W=eLUS)5mB30Ye$dAsPX9K# zCg#I8(t=iEyG>Ni!1DY2!N|V|-Kzl;dGzQ}XC#Z?>dzFF65IG_p60*295A(TeGCU9lz;Pe;Biq; zC2D~B5b$U82T3*XQuW;}QmTPeY-9rumYR0CgREn|Ql*^q0MEMI>ZB@HjTEA{3(1tX z0@=qqxzgwF>dP zbBB{8eM)Z$!?>m#bMT+wre9^5;oX_XuSt|Ml?w8*Z`jDa zNp}BxVBiKa`scs#HgPZXK3Q>J0xWTPad0R@qBs8db0^d3GeU=ra#(l%`&3$Wpc_R8pBeZN(y*Me&1J@6!P^h4?B^1+zZ0I~A;K2A{yQ z@)!rTI-_;}3AYZ)*Ox;;!-xR><&7`3tGvHkdrr0a^rBVVEO)sfyJ`zH{P8}u`<$l* zkjY^x87-=1kbChLmA~J4oZTZ6ZLh8#%{KrD3btok`lX+VTRz^%PtM(BqFi3)7eEK@ zi@|>#%mEm0;JgiZ^~@ggUx$WkDUYL`nrVzH3@Y-yQg^Arz zr~H#tR;Y7Ij8SxfSB-o^nbEEBMccWJfUqN(M=6JmYn49EOf?^p`EG@!lfD?-%xIGQ zjUa*MD$;E}4P6Vizt^z0w+G}yMEBbtkLYrrY9%@X^CR(%)kwZtR(pFpDFr<%J9`?S zb*Ft@sm2(EMMlPx#>y~zO7hxpef#|Rv-jQ~GGpJ z%szdx{o=!k2Ba3UdrwSc)!-sHlfc5ocn%jw)6HVaTvRDt$$jSWcd{N?$`pVg8Q%ra zjYsBV5+{M!RyZ6mVD8fLDypbl?{~5Ioo(c8PuD7JUY;yP64WNDZ7}GplB%-{KtOYz z)TEP#|NgJRs$KmWTfN;mx~AE;#vfP@gRLfqSGA&N02d5b*- zmWYzID*MTb6~K94Au711eh54H>pZ+R3+j4liVT?I9~9-c8e#1PtE-5eEN>fZ-HN9q6=bX>b$6GbZT2~{PgT2eWq25!PzM7l`^)Mi_;L-Cf4R*LZ4>4B|G3B}t245G9Mf)y5%-T*Jub7tQ0mzlxsiq(Yc8kZuA`b+Ac9GK2K%2U{`? zHH8(;r*V|tW~F3n15eB<%dK5!TAEdMMh?VQbYtaFn19=xnegwjKglS+zGKzZa{ayUM5Bh;T6NjJ{AXw&S8nVmSAZ&^NkwL;>N}_frgO&`Q&N2%BggJ;#)vE2Hgy@WQysuttoA?`RvZ5IT*(gb5!3QO8(X1PXGy5lq~4yZ5{S4rIDFT0>x4;kJe5) zbF1+MBg6qoKm*t<-;DIwU;LZB16C<0J2~)#4zr zH6X#3v4T@rr%c;|CPiO}iZ-g}$ODX&{C!AR$gs2|0a&x0&5f1nnd#{_M}tP@kY0no z`MaXNnB5HH(l&&l^H)Ju%0&xBG@c1*n#`L|PvWy66^$`nOEn#3?m;}fvd6e zSQ|-yw|QJm^R|UyOacbE+N$KX69%HFm6K2C=zd2OBLV}tz-D>;Ggn0 zx27IZ`iJEQb09D1Aiy;KfHMXFdHDz5=k5o%a6LUefE&id@nFGHBqq;+YBwqk2_@j0 zSjxnn?+%FU9)jaP(e?m@oJJqhL*7wh$wp~uRQCgBka5c~Fo&5Y4En==anSxA$m^&P z2S)(d%U=(&8p&?H+;$iV_;l$Hs6F=>goX4n$4F`X}>CbK7dE z6rI!!Nlo)@mU&~-6)laRk#yLe%S5dIIpDqYr-}Ok^CU|;{GInnSra(oH6U80@>?ih zUtLlY)hRY<0d+*q-|o463mEMOOS&pVSBuvx0Ub<%nhTkaMurUFhV^kg23$adwnc>a zA%v%p76{W5`9EBLe;?TX?*-LgMHXn}{f(Cr`~CBOlYI{WGRXeDyhe@r{v+Sw{*RK? z|5+ZJsoD|vjR0}>-`@!QZ^yR(vy1=#3;yTP_y5&4BwPc-@cMewuet_!L;APBZW0k^ WSy=V*^}>Pw5Xng?OTs^z1pF5~u4rHY literal 13183 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%0Dy&uYhRI(^~@DP+Fp&l=Mr7 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 UzlPT?{DdTXPU&p2q_Ow^0Mmu}x&QzG literal 21660 zcmeIac{G;&+b*s_Jt@s;AS%gBl(En#GZ`}zx6Fh@#zqw~lM*Up=G#1L#Eq1BNXVS2 zjG6awdA`s7zVH6Md+opWT6_K0`>fSNabNd!eLm;sJdg7@j`Mz`q;QFr<^T;96&0KcV$gI71ees=?iC7ogzj$oLy;euB@yG`3gwwZv2#bIFxOa zCFfy^c}fcR)sz&O#OT<~Z*-0v*sW`qo%mvV7>CSmU#)W%`ZBv-&BQ(wP(C$R?0!vL ztTSJMZr~{E07Fpul3#v}b8SRWz=>nE&NVLmqoENI$#`QbW=bOQa z6%j2L&d)FAGLyWPywh+mUi#o8tvP;u(-S6%vHpH_vavKSN<@ckmTVZ$MM=pVv-)HD zC9X6TGWT?;sJfJLZ92#5dGglO;N{nnzIUiM zt0$?;_v4Bddfg+fnIg*dG19xJV+;qsyi6Pu#PVxU{W{vSLBQpJ*ewSsDXF^~Xhm=Q zJbCrQ!}@r|v@01uYJ@sSqdi4MI3Ic-&+oPdo26V8sH4xQz^c zeeJdNASFt|nFSY!jF&MEZ1D8 z8#Qo`%4d#Mtf=ejcjB>aItsGQ8{f=dTw0h7JE+)Z(fB50!k5Wyir8lsy28Rj&O-ur z^Cyiy`LyTS4AeXqS`yf}W#2D68Cx0Mr6&ygPdnK!yU>~DoP6+fr-_MNCbU0--} ze7HG{)7XaW^=ED_R<3|DmAoPUXsl=Qg_dl;OMZ-2ZCQ!Vll}KM?^VdpQi)fv`=W8C zU#caZxW^UZZDD_D<&(?5h ze!94*$ohNHTorF=MPdnEK!8<8-u3eoF|tHV_MM0X&O@9#97oT8mhbbh3+E^8_9uOg z5Mfq%?s!6EqxYjn0aw%4@^_DQ6vit?=@s9~))Di!pvKYt(q`YkxU%xlVf=fsW~PbV z-yFGeki%frc>NX-Z^Y7naZ$P zJcgV^<@H?1CUW`HTyQZ7!O!Ah*1PuA+GKxTeR1!2KGRc;Px*}ctHV{YOuzp6_3LM2 zk_Td8{-$(7qseJ8v1#7>I=24rBF{PASp4%_VrB8f(v7L}3RIf6=7WG5;A1tP+ zp9y7GdlM|@ckq-6qd_JXwSOaTMXa&+G_OwHug;a_n{8QUH0cVIcs{AJ5HnNLgpnJ2 zdG#71hpsQp-{5XG&ziT^;timkJ{}ORD6!=5E${kJvIvP1Jp0{6k;o$!Om<5=hYlHZ z6x^67k9PX~gHD!JG4flCbdbl=us%)2y$!Sn*y_2@_NOl-KN94P*QOg@nW|SrO0(!J zDPEh*T%O?&`N?)_@T*Pf(hSnyjo~I=Z*P?|{p+cz101@kB0Sn_7RF0GCi`p7-rXQw z^d;A0WoefA(i5Fb6W_J`@s6Wy+}b%2IKxj4p5mgDj^*x?XC!OQP4r>!cl(QY@8u2c zY5Dx(6gF!C?~E_nYr+qe$3A@cSLA!D@@TS!kaFP*0Sooc61UhzL8O{%kQ@v_VQA8_g9`Ioo6Jw~3CixB>ed$7AOF+Cm9Vb)c4d*q_+(`1@LEY?U{ zwnYesn#t#gM6$2A+dR%h&5Kh)TwIp5kz&eg1C%2^eCz5m5EA;#X|OReGLl}<@~MPJ zi5wEit)C6-i5-;ikPqK>FiT#U3RxUZE7f!ArlvO58mf!MnpLHkR6ON7Mq?Y8eBf-# zqemCMSKsSE*ikxdqt2wQ+(1p;n5c3IC2wzz!P`4?lLMUf(L4Fw`a(34 zoi*^x+3}NWXZjxdF}9OQRlSu#DmflAt=9-Fm9F(9d04Q-vXva=KF_{RD4{V$`{u&T zD0_Ryw{M@LBx>{SP*I)Uk$09h^^hz_p~v!EyiVrRL_->5Z}&f+Z2$FxVE zUH7QU(9m!XhpN-BuG{NPQM#zEu*%Ml+;VYQS)8opI8Vo|WgOYOExZGjlM=!?j%_OQ zT(f!`cd9y~bFTMDT79}&F%rlkJHN0n-kM1~5>?aneENnQ>kf{3B;$An{`RV>;g$@e z)t5c7xZi=wWp)CYNjCqapr9Z-`_R|dm;Sz{#eH4-?i`!W5;|{doDHM$tyYr671eE1 z#0xdj^gBb7m{d#Fx}2-_Z(CFvfiX``g3v;%Yuc6D`8Z>B>&>-gq0KV>E% zQHpX^xmXdvJSuEzJKC0gbL?B9O~9*(@zNCq#ZAW9$OR3jsYhhrY}s<M9r=QahVnl>eelYFH^=xxTQF7Yq{ai%luo^P!J+u{I^D419RB zOUUNCDjv^iB453wk@4N3{TgutpI-!-CNc4kj^=i%&+MY7Px5Geb*6aw{q- zj$C}~Fx+H?R7dQRWH(-@lW$kq@MF^^ii3We=bClFOF&?Kz<_Ow2y^&?cc(eWr_?ClY%uk}QEd(5~R#pzIZb;Tt@&5YWYnujMaGXI>X*ntPoDvXbhpD8*~gN=}wA7ln} zkW@O~WVl|ycn9$f-^5?$fezX^mf=5NHS4+5lt^oYk6jFk(MA~?95l7B!%6eJEHb%4 zpz_7-+qccQ51usjCnurI`yM={Zo-4dkCh2w5S=Hd^56K`*oK0eK!ShGWWKy2;i`LvV#8P?Q$KmdQ!q6lu<E{4^h&TWeZ-}^-=gc3U8*_JxtO_)0&E_xN=$Zd*8r7m|c`ooZdS?U5(FW z>YB9zxs*FeRxz8G>sn%bx@S#j1uOUcVN5ZM(XHBKID2=S_?ObDU%##tI$B{ls=3>& z40oPUnXyk#Ls@Yw@ zPREK__gC1bW27ymLKf-LpUP%UY446|J=t1l-(M|q{l~pI(#v!AU%h%|-jr;X@vMpL zzH}=jE!=(ai8c7!fV#;SmX4=w(DHz zE#-xgV=HM-pYB_#1ESMTK5o&JJT*Q}FJP`pUTS!wR`p}DDvUQOI5^nyR7fhjO5D*? zI`ad@pWEK-;Z)D-Qb&|kzSW-Ye{KVu(G+^~sDJafspw;@yUku69ouaAwo;GMB&$H32!~(CNL^)pcZ6*<-?MK_P44+({jk`m z=N~R$3l>hWRyKKYemHGf)@#fDI`mglwFmCry^CFR|J8Li#LSOTjGVVazN8KL^XAQ) zB#pCY&yE+*M%wWqQgrN-xP(c}ljw4qj$B)+n?P2o?T3lWjKX}SfHQW(D)6TUX(mtjT zaV1{i#V%Hbn0n^+V|sdefswkSPcHszlOys161VaVe$&@NkE$#vdNb(p9?np5fG(#| z%TbHdJ6ytcUGE})3UcX^2|2$p`q? zzP^p6mS11pUq5C)@L9n0%Ng@(W=S6sX1!nXpYhU=~^ZAu9u^it&Pp0+>y14iHeF^yyl9EKfGASp^+N#^r_Qm zn?Q4G463*c%Mf~3o)U}vt{ur%?Kx;tZYIkAY|9?rCb8J1{Jf#mV+ClX@Xz-?<<$ig zvDK`6X*i2Mt*zQ3tvGJ{Khv&HW^&QKRxH=x?bv@sqtBbwg68G$jzUcPq>#pcv_HOUw9_lbyVJ6yd^ zZ6p_LVV~{Gr4(JJ@39oCBaQl68zqsZQ#n~H!5cqC$tG@EElGWTT{frx#BJ4_U{18A zwYi<{Nd}v@>NGhW*{Y*%rz5mssf^Z6FIFGf_{d}tL&w#tSAkaM5ptX=hjkw(qs0n( zZHp2GJ9J*g}$ zQ0w*Jf#k)DjcNM&ODCQ@%g?;6bM=&Mm*?`MBD?+PNDb%}iDs%sG4iyg%mH-kS|zUe z0EnKqg{L+M*zdJeR8+J#Lah>1c`Zrnrr64%_9kKFV7^A`seAYDhwFd(_%U&d2r|aa zPPh1)o8#Zz(9|pU(QevwnJ8&=UJrB;4OWsXQu!!+rYBItzNYD9o2!LuZ87Q}7+_`5 zvl4%=D=ohK$B5fd_J#22(>f*(wlSsR)ds@y75vt@lPk&baiNWeuE8JM+ldC>E8va8j*)pNKVg34wYV?WIqfG99 zUZRsnC(0FBcsWs-C7ftw<|QW|Zc7y3E9w@+su)_PyIPS4Q7hPq?R<9red-q(Q&jG+ z61}pYGmb9Paa~CVi!&dRy^$Y0jJ{D{jW^;Wg60i_ul>Zq(Na0R6Dgp-Tk%|I94iM}>frwU?Ah9*PgpYhYn~5ZI`1|V z8`dBpwx5Wg%Dg}apmN<5ErAdcx#0Clyq@9xCPR(zPoAL^YXgJmn3k;vMT;gVoMyiD zNwnODGxES60dOdHhO9OqBniAedoVMJsgh`u6nR)3jK1U*7V_#93A3?DJtbaoC-a`s zS-H8n-5hBNknnIPX@J>S>bkp4SvTu?&nJ}oosPItr0IWgSoZhegfZO!WH#O#x9@C? zs84hpO8W(}FaC01%Y|URRLAv3>jf-?-PdPtVaU_jzLCd5xUVdh>|<}OlqrqwY>$vH zfqWem&$Kjtx_rv%*T34wUiyaQmtt;QJUj~cIaQ9WdkgL6&F$G18UPupwi{^=sODH| zdhf{!MSK#mTt=s`wGg482aZ6HY0sW)^qI8uf~GGVY5?!!#5L_^r}F5FOvpP!#(V2S9tt``} zTkF=Y-HodmY`*rOBT~%er#>C0x+Q3zbsM)f2pv0m)D>Nj^4MrytTz!Pmfh9qL?|lwChTBvYLU{cknl|Du}kw^-BlDwJD0 z^nCo4jH?LoEt@vwJ5R=~H8?1QXwzu{0tC=yKS7Xk>4xuFqg;35IDp0%5?X$^&aZrB z7k*0%F#u5^re^kM<8bS>s2BVs8CO?VB%Yl+ch1j_m%7f`Q6HiuIRD6_)HJ(6dMiqB z6FjbUM}gWJDS9yWo~-W?D>Gvq^mKGHV};`~ZW?RS*Ai5ISktSEo0nukD$I6z=y%!y z!Gnj8m~K!(k$9t#7P&V1ef>U&3}!oxg_e8DnLMgdo)A+#Jw4g6xd11qkVm&i315GO zNTyMroSm%=U@iwrO*AkS2@DEC?AeM{g>t*}_zE?p>f(6V+xLvN=YqrNNY>1J`0ybb z`1$#Hy%N{fni}~ZX?}jS`St@v;0GD6;qdT=OKopMvvlYBh*g4 zln_~$4XvONCi-h+_4PR2z&Z04{ko%C(9knuq_&EGhh3dWk5i%ae;&5j*A>^^@fylEpMP>QMeOwH-98T| zC5Q_=+`)Wc<@L4NNagwtB#5N65_7%7N00V`wjwxd#<$+(^VkP-s+A zbBo|0+N!X)lyMdJq!g`enr+)8?E8Jz>)&UkBevd{8E+DK>ZUbi2H6-a8K+81-~PRl z=b{iw{<=EFw{AeG0=U9%HRsL_H`{=K*J@Ea-Sh4Wv7CnrpMvWF-n`_q@A9h)o7`N$ z^MH+yoDdXb&|pBK9WeK)C`_2f>Trjkv5;>Lai305|gMC^Mu^Ps?sZ%OhW3 zFj*Fqi;!i|n$Lg|GP3U8zxTo0)nv7@tv2uYzJF<<)?28k@(LQ0G)n*c@J3|{O8QCT z$(?{}b^S!!knC%rlw;Y7PKb?4z2~bDHlB}B+%&cj`Z7s~ zqn=w^Tfcq#7WY8DOu7mBFyF2ZjnY^2Jx$4)#7S&vxni+gO?8W)^B~DpBYAU!>^O4d z+(bDD%%bArJ^nnSY{p-&l(^27mjDfVBrCl<2dZWHPtP`I5$B0sU>-^}j;4@h%dbk- zs0$Y_Rw^XW{#k$ir|B!I79RS8`%$ZUv#yvtJ85=AEffl-wA|Ns*68%1dJ%BYvm9cB zDu8{~9FWgR>u-7JqCjY9wUG4BiB?~F8C=(C@4h@Y0JS4rA3|MC(XN^QHRZIdTT^yU zkb7N4pTy0Zvmnt-c|ms--WXP=Zc%VN8jfz{ic4k5Js;_7wfTR8k`3D!Bbr>YS-(px zP1QdZ+g`!HjY<3)ndGe_8?c$nYa3JOFb9il=oHAJ>1nH$bi?{Mc@@3f+ujw9hC(7D zB7%bI%XXIE@-A}}(o`g%3uhFzH5h5hSYBR6P?N84c)deQT9Iv%?-T7Q*Mf#wt|nHe zc=KMKk&Z$T^&=fOJ45DE*ZNZ*6_krSJ?F*bE+r?|kh@}rWIK(7S}AhPn~oc;h91rj z_1+-gch=a2>Pa*+t^oJ?ZqsT@G=VwogSY?T0u+pG+`%dIk`0g~cl$qkbgVxt@OW=> zB9KgfD5%n^-`3sl?tlOO9f|=RM5NM9)bt)L&$ zN|!lqoYd@2$^A}4OWW5qu1xNrHE&x4dVxgJoOj(Q|9cp#A|t8oWnZ=2Py6ofZnycV zuZ-9JiZL!ZD}Vadl@jqr|BE2`~xA6O#?u4nxYV9=&CDNVAJ`lN;Bs zU%zo<7`L|i;VR3P^zIiozXy181YR9(NDQ*Of8-cH^ZuJ(qR&!P*M+X!v|HZ4bLYe- zdKO(S*I1HafY{?y<9 z(2Z>5!@i1u^WnFC0|_dxVUMxD`%I>X&7rGojfjX%drpeG{1UDCD=6ORSVDI>rC88i zI&l}IN(FRep!phZWf`3;(*Wa62=5gdX$CfSfpZXME2_~(s_6MkUqaQ5Q;gz?e@!S? zL#WwKl8-qnO5RgjTr(pxS@8DN-p#p0F}%2Z;OhcyQ_z8SRFc{kr{Zmb13h)-lsy}j z#b~6XzcPx3ex~p9%lM$5@Bi%cK-VUg8#?T}eg>t6>zoPGi8ZhRrQZtj1$xWItqi6r zbpk;vcPD0|qoa{-JBwX3-nNp*H+kty1eqb%aJBU*Uxq3Uf~zEcO?t>~4KyRhPj=&+ zxh{<6ddv^StMa<6@r#w9Nzp6TTKSTpN;nOUT*mpSn`1cr2)W=ZlAeR)mVhc5nwewq z4?#DphlipzEYsvYwA}58R;0SP59=%7IC4dr71Z$j4U^hP?u}vT>Bp&Kxa2y*PB_EyHz z2_2Tvatqp!ICYwH2AiwCR#Uxu|Gs|QZmDJ0VJZ&qcd3iF)3kHPHuDxm7cU||o^U)| zRx-7b8pRrSRk`OeNQI~LuvPS)wgf=ds+B#YwplLAxz!MgpeUiobQD@}BhSbwD5#$? zSN1(-7oe3IZaztO=_MXkCP9AgO9o`RrvpeF-_T1Df<~Ht=eLTl)%)tkX;=gnAZD@~ z-|4Yg=#e}hUlFj!k@8K)-eV>S3%tt2)KNg$t z)6V3JJ>dO5`T9~(89hI4ct__@NO-5mite(HI8<9?6tGsDFbC*#b7_)e+_`pU;@?or zlnx6>pvVz`v8L)q4ym?kp4ZM4B`}RYPF3;bM0d6ZF)BTOK&b=zt_|x`6D8q5WovWn>K~0K@I(0GQ z>c`-v(}F{7ORPs?xe`Yxt<`{dfD@ZVnBZ?1f}h1er6pvgg>W#mLa%XLUUZ(>M0LjT z3r=MsUFAn*>QkFGZ?69|E$`i7vk>${ciza{?)A%c#?n!`iSJ><$p@VvE-r4jrz|eU z<m=U!Z{(0qqM)fyKx);%Ds)~bA#{Pxx)}~>fp+*%y_P$Pf)Bg!2X3Co)`M5 zNEiTAaKb@sX`U872t0KHz&K_-(OvhkVP9Lrt7w@~Xd!m~aELdq3`A7~c|cHZ`=`6T zn7|@vgiAg(hh%y0^PfL|xN2SiH(vjxcrUVwc5e~tc6cZp4Sn`%y(dkv*bu`Gy^aZ{ z13F`n`Z0}0bWg;GY>q;LY%@Wd8D?i@X=$mfT=)8t-)dt_-Aq#mgAsl>Gis4B2&4*E z$`_M={p{x_+v%Tb;lP#>lhr5aywQPh)+2QjE*RWm84Y^UG@blcat9q%c%I?3@Y8C% z#1E*3jVq&fu8h~)_bPb~vxEOY9^GT`8cnT!k<;ZhIh^1+)xX>>R!vaqhWbMz8F1s# zNeie5?WPS0mnTvom=4k_z7QpiH6BNLH$GG^>Np|{&e6C`5_pUUc$MFv5J4xx&tDgp z>i|Iwt=eZ0HvJbF85sdL2qw(4Q74J4 z{qh`j_~++BX@FVtF`UQbpQ$3ZuHHfob_`JyI0RP%cN;tsf(B(&fAbsnISSF~_}{Un zID$C%^~-kkpDWZj3JC*I}eO5bWuA^>pIo_OJf<;f@CXgM4=m@ISyehCb0I zH}U7VW|&lF4%wo{F%5VfCZtkC6XhZ_%qTE-Ye(cAxho6#)jYX-84{7ABiIkG6TLaM z*k+Md*$|h@fL6y(Vp&P52ITueD8jUlO=8p2(_te)&xRzZD)IsCF>Y!Ojp;ybl>T8W zLcz8Z+8|v3Pl?=(0EXRC1z3!VE!VzB6Uuy9Sy@&nB|i*I%o8&3FPu^tXr9quDS2KN zP9eKslac()?#2#bS9tIr$Rly_66v602z%qtF!bOukxg|2kuKJseD2q8cN;^}UB7 zjA{FJNDDgP!1}gWR`1H-OSF5z?GV7-z4xkE34imqoz0#0{ATa&Z5m2D%KjwP#3S`+D@YRmwv6TXfj``X=f2<>-D{i* zgPEMHUjT2Ka;54**7=4yT*PHb1vkg_NUU~oV*>;65~1O`C9cl%Q$v*7El*jm8Y%aQ zY7ZXKe#iUamMbYWpCz?)K==x>0yf1Br+|H#y^JklyQ9RPu60YY2s;$qri9DyzbOON zhJQy3O_K21;$IuEQjCUD&f@;Pd+Yny{&#Cd)pGy!`!Qfbg$Q9ocg+N)m*CETOSO{Y zvMbb%hL{26YTaDOI%&})CqhFXL>JcfR5kxIT|q_Yugw{Z`r#JVkA}xZ9H+p~#$`6t z*Jpx-rg>0y^Tkf)gu|zaZ{C9#9m5|3GEabs6-j8$~O;6*MU~SV;kPADw5mjdyddEH}jxAnb&K7`}R$zyBUnD$i|h_x`_rA#r$_B(7eh6 zO8o)i!q_gqi_1Mdlf_Z!MnXBY3(%KBdwno}|G(fk{|GA^+aLgQ#t?U#t;K(ph)jhZ z03JLafHZ2u_o37O@OdO*7wC!(;)jKW^Kb;z zk@j=5Bx@3~Jkac^n`7YF7r+=TEI@bu($S$S5}_lo`LDlPO56%LEq!`r=Z5f04)=X4 z!G0o#_8rLJw3K@T=>;v5xQOoc``nhzsqn-NM-;MvJ}9*9J_n%6xp)pizPvQsSvc~U zxh>bG)NxcR-h%|kT`%W}pef$+-qPjys*qU*s_=m?=@um!J=x8A^%@gswPw5Cu3LI$ z_km#dc3+40i({Y_dFKzZ;xs2Zpqp@Fxf~fcf>7FpqH{U*?7K0%EX2aUGqc3zkv*JJ z&95|alhEHQQr4utcm=eQdfd(};K)Ut-c~ugi6RJ*eed+#rW+w2b6(@r%1ZEdB>{$~ z{tA))F6O?NcP{7mlSg*ZJC4yP^yOJ^nGf#5N&Q<$bOoF``rERjU>f%m76y16RBVi5 zAE=JVN%Lrir*)Mf7A(K73x0YM1}h1h$mY&B3|J^xYgaT= zOS_!?7(`wXl_*POYC|??bh8s^b^AZX#2mGXlk`0>uUzUV0Rqaanj4hlUz<0dDD{DH z5U)7X#&Ez9B1ZQ9C3`ALF#GEoP-T}&?XVFfjz%4~*ARh&owC7eIT5ud#`nLhJ(ZvK zoh7^)S}tfAO2i<@gj>sJUMU6HU&pv($4eV{VPaj+oR>YMBElYLktcL<%4WNjTmn4%j2pC4nE)MG}$k26?gUHW5Smt^&GO_ z)01X_a=DhRN2qt&_hiCnVhDu;bT&QTRc%&^xb67j^xE>73#VBbi}( zx6Ix@poOdYYc4d;9`r4Ql2!d;f0p$Ycyi>yooF4Cdusdp$Hl}o8#itw0L>v?g}(~X zq=0^u$BAQRW{!2V;QMKYcBR~BzmYq8#+9Y|pza<&iBKO-X+n~~cCSW50qR1?&~Gv2 zR@yCFf_JwgWC+ru^S*{6z1F#_*U_Sa!a_fLR5};ffLIhK2BE&A*g4dwtu!=&S5tbM z2L}fcgKA(!%FE-iiC|tpCp~)fsLlR<2}nZt2i(yG+Z0cShJ_ITfhxHxD?KSuCH^zq zc%LK1h?{@<^l4t6uyirZ-uVtgf&8?oaTm4W7>3WH7x-fpn?WKozT^}Az=v>D?ZfsS zWKP&GN9L1Ms@f+ZAu*SL^u==R;nnroCyfVoG$5k~Su#s1W%`R zp}+(cJ&670nRS5R>Yqn4Pr1xk+SfHoy&^0TAI-70z|TdXtNszS==bjrC-aGlin6m; zzTyMofNzf2K8SSt9qVt=O`)Ps@$Ql*FbDp5Reb{$C`@`CAAb#JV~RT?BZG3%A^o2V zCW)PCeg}^l4yb$anl*nLH}9W#Zw|ry!gJ;7@M_ z(qaYMIK55L%Nm#(A|X8hXw2^cjnIPKgfRrZ2ie_(s|@$I7@;ej0ap4uLS9u>6;WSY zTpW`4%mwV086xEO!~~(RfRTSg+&O)p6bORPIXHm-Vxl3-X?era4qg|X1LMAZgyGF| z%XQeR9dQQOr}{s?C`7F#LbHMa?GW+fgM@_+-yD+NL5Oa|palN5Z^m?nn&d!X#TR>>!9ro0qUV)Mv=;KfP!FCG8cyvK@pO?Z~=za zBuvHNk}lwqL%B33AOIEQ=hN;xeg@a`syO>%la#lr;kGcDvv480<-``t<3OHLwD16B1XyqjW)2 z(Gu<)Wit;hDT;eBf_!+puPZ%UK#P^=W_(+t)L&Lu#bjt+M^#=@r zwW`-21<3azg+N zESqY=7nr+YQuaJgJnO?pkN9R=#c*Y~$D`b4TFc7LIEM!ZXSvK;hr?-HBuB`j%GO9M zk9V^lF@!GJc~IQd2@9EBt4TJlgy&`OJ+Aitc*1)BV^&I=+`MyhZvr@O*vgQg<~Tdv zxk9uju02?4*!#Fozzq-X>RYZ&RCU!e&;SScjUN(=8R$DdBGWkfew&14Q*tYqFkK9W z<>zq;wc`2K;_ zqCWah9xyoorrCQySu`WS(LGz_vc>iVDT)U$v9grmKBdf#i;5Ni;rX?n$p+_&rC}1W zJK7lA={o7#%i%4Ve_$B~bJT-#?ys;mXJ}eq(cg_}2lI>RmG+gnT8|ihbL$nL5IB!J zF$IH*#JV=aH3&RPP{+PnvS{1|ZN77jQ(m0P4Za5{hxh*XU>h#AHw~bkx9`~#TdaeL zEVOuzW8a1dge^}~xzn(QH`crzQ48S}6}=irOF7&5E1)_{VpZcW#QxN1yT)Vhz?d3Y z$Sj=Nm})p{&qlC+$Fx-)Sw;v~3D^nHIB&pwVxlJgnZrkX;r*y;Ux$gCpe>>%)%&Ci zCMNJOhzI$(R4inan2UPhVd+UwDtoxKrb<_q(wvRNR~GHV1H9Yjg)nmA0i8_5K5oJn z0LBAjcR&j&i9_JhU?&w{no=Rk&$Xeq9FjlLF9#DZ{BG9FIJdabjvNR?9m^xiW74O^Wds zsJJleoDKi^7C}MGdAT+K7GR|B<;Y9?6~u19&opedr-I*juP&ZGV z*US8Y^GVn9*EckKK+YC0tQu=hQk2U_5df!mB~E~RFoKki@tWp&R-gSRFy|uzp^bLi zwls{_zDFqiF?+&>5 z^5si1nX8d8#TF(fI4(oXw2C!pT4?qk(f4=lpes&TL*=<ZvWqN?ST(UK08&*y~~Kqa)_SFb)%)KCF4kO+0I0nzGA%R78T;!vk6h z0^7j72M3M?b;Yd!NrA$c_0;0)$F)Qs9pS9^Sv2c96Te)^9h9pOw#%Vc0O5{9=_)8{|+iY?s<-P zml=fj{9rr02bVY4#?#XM-uS3yNK^?Fl%>Qr2_!sXdC^DUYnmCjGI<&eAfO zpXIRkwnUAz?>H_t>|L6>m7uZ_o_`2g_TKk8Ru%^&h+$Km{0USGOpC3|wA)y8n4^>G zi%pimP$_u9XH44 z;?cwq)u;ZjsPI+WDzeTJstgAI!owUvXFMmkj?kjMf;klXXFoF={Tm4)1cT3}Augmg z`&+YP+?@e(eX5rfGzd7sc*-xj>BEI1X>^XDafB*eQFQ`-YScUvi0w_>Bb;*7(E7u} z9ndZUvaSthz9-*VFO%3V&3EOM65_SX#}XcNxEV?-A370ZQc*MT;Ti zxV{gP;wnIStQnKE<|shTrA2mqkLP&ZK>VYK#3VC^bRj$H$`+h^Tu2CWpZj431UT{c z-_9P#u@|!_cX2wvf(1HQv8>SuzojAj2uXHAtFFe=AuyF+EbT5)g6&1dHV8bIseoLQ z<1}annO{js31mUAO7T>kEZw$4_D3)eg~1Ez_L?XO{Wx};Lsdbnen_Yr0<--XIrWP2 zX1-C83c3~`$7xQc63lz#X%R4%wRHZ{XxyM6Dztuw5Dw2)+b;9h5c@z#%RI2uH zhB!|2N|R2xxNXIRVBm{|5svzxHPvp8;Nq4ECz=zkV2vn%H`1mi(*Q`7(?+h9=YBP4 zk-ePia%;k)JscjeVN3@@z`Zi>P*k&Tk4+K72*^07KHiSfNeCP1Qu_1iuEd)>65}i+ zvJPij5kJ&fP-&Ibh=0^q6);(k^1(iUA_)_a{`a(DWzGMbHe6$*^7e^wE+GNqVY0S7 z;~!!ab*QMVx&r=MMU0IV&wj7( zN0s}Rc(;n_!^Bf=t;Zze3n3dl(yazvfc`Pex&fVl zJ_*;58W@HBrO0vgnR8zjCS}us7{gZ>;0xo^TsXNw8)As!^C9dRB^I5%w6t{FF6A{A zsMOuDAdp7P+n9I2q=%WN_~c!{h++54SC=f&E+yR}wLgx*RQ|E;-$J230rA5J()3HM z#qY`t;Yhd5gM11gEVicHex$GEk`-pK<-L{(W`oJWZP@0u+#FV?tVAcNb_^yk($Dd6 zn=v`FIA1=(6^*$Y>KK#@ZJxEknDBpbBTG!495-TyaDr2kOnwp;)(ip=l=~YSg6PzD zpX)=u=d6EP2XsD+j{p#~zAsO#-pFUjXed>etcRmhaMeR%hkg`1p5C`?A z{G`V-+aI7H5WcDYnCI{&;sJ)6VOPp%O4L~E0JzN(`Ki2I`)C7zG5Uqd+FBbF8xRjL zeMX46ILgWSEQ=gP)^`~h0E|iY&lXCE_3++C6?R0r7!!zq9qTIFD419Pt;#YE66bcw zZ-jEc9xdjqc8}C7pM$3a zm!epxiJ|P6?30+Va5N$P^obm~1>%N#Nc}l<<9)#v)2$)H75v;d`}r*3mQuM^1|upoxJ;um0+N^aybIu+`_eah!+t@Y?O%8?YhM#OE0hITi{p92Ng* zfV2ul$&4468*5LZj*)la?*J%>eKU{xQbD>MJS@eX1H%*em(WB?#FWJ=V9z>7GhB@e zSIZuw3A`RMbXy5vwtidq49YX-A>FnU+X0A7zVfhKnRFG+z5>qWc8ZEjE;67hIF`C=8fYNHG2SO1WmVDdoA~*87>_ zfazB%5eje!`VXNE$3ENuI$L@L;cyR|(wQ}8?FBcImPvrb;IlK~#0CtmbQQI!hBFm& z<57S9Jw4bTie`X|u$IqH+wq$$rRdJg<5U^!YJM|9*jeL%hO(pzkPqpP8+fiwRsjr! zO%De`dUMzit8RBs&uiLEhG)g!*48RUDb-*g^R(N%1L+0m^1{{Z7qa<&2NoRuK4DTJ zXe%eDytRz+*b!i>&~O}TsqZ0IQ$|jkrHl*@CzYy4-*}mk4hjKvE^Zns(FzHSCX=w$3<)ufYQ<|u0~OV$p2Zyv1P2SwA%1=aqADx%^UE{)&W^$|&{m|wrxZ6v ziQXnDs?uSUB0d9w^sJcJy_k>TZjSKk?A^ByW*e}`>}8U0$f(6_pQ}Dm zi&;~NC57DmU44B5@L9rq`ldRgnK+A6BHSa909|ljv>BM)!m;(ne?C4wettG}F^|?J z3*xgD5CoOg02kAvFt}J?3YV;lU;N)FRjsBFl8Hu?e^LZKjMfr27cJQ+m$7_w9>-7O z17g_!nSvFAQ}<$F@DDIau*!l#fS5x0PB?pkzERC7Ug$m~4jnoKp$`NP$7bP)YwYJ& z>XU`=VJWKZBn!}>X_n2=XYb;WT_m*uFTh%39|EhSoRkOkoZlpcGYtpyS82p9M|}PW zJ}qR8n=C>Y2AZaH!}H;3%CV2-@VO!(OTu=G92@;YNL?OU4-oIsK&}MGgI$2LAv_~y z!Pt3fFaVH&T^M%h#LcT?wMV2iCW8KxcC75_(DFy^$)YCZ%Su-D6>wLuf5-3)(@dM- zWM6=Qz~uVt_HwM3S2@lrXdXlB#48!ENVd!`S%r$9Xb>Z z-GK5?&-M35htONMZmB0Iokfead*4~wvK4UrRGzUdFCY+Z zjd+dy^7|I7*@5n;Q8t)wuHh`XyH zZH2scSD$B?>(O!EcN{}VC}c@K1f``rR_X2M=Yi3bbyQ^rP~4`e-@)0jmqWE;5q(ww zf+ALcX#x}jhKVkdP!u)r@iHCfB{8{pa3-_vM+MVBm&daZS2wrKyV(rfHR10LxeRAR zc9obj=o-i0E(@6IEHw7ITBj)T~^U(HV?ozGv96q!MfIf?LLOiti(_6A6 zAR{L3QyEA;kL(`86G3QTZ!df{M}Woi*Q{bBWkM|#vi^3wc42OAXs>kfm(!g{cwj>i z;Kay1WvZ+J#z4#V9QitPobkU$FV{vKJ$X{Kb6fck0TpnO^kIC|NF;$fYbMcA3e;9H zEhi+fS=nl&m|HNO1kd>i+3AZ!z$}*_ky|23xikpG{FsRBrRZ?0!BU zJG=Dr#LKTA?7m(zie~0=++p*Y|0$w2e4?ynsMMS7&F?REL$UUQJ_uWp;3WJ7;q*1z zGSF8(aqq(eP*mUK&r3p+V*hPE2{8;G3q{WCgB{ESZgUU=5^xi?4i^9hS)R0PIsSL? z*u$K#=8pvC$Ec1odOaarHR35^#B(z4-W?;C8>g9^7E;n{o>p=l9C@1;F{au|Lpixs zoqYZzzqI3D$k@hSUl{$l>U)z1(mfiCT1mBh#4P2l{~6!s(HpD$JjG>+bsnB$K)d^oBf|{XnYQe~G(q4H(iE&1R@Sbt z5U~8$vye2lZ%|ERME^?XZ;UUU>wk_gS#A3;*^W1-2ZPG5Wy{eNfUeGBWs_ zoCaXGzE>AOsBtk8Ps~ue$qJrB_wJ(~wJOul zEeG!G{gKxD09W}x4Mx(~@{wnkfyM!L^Y+Ex*Of<$3dQ{f#{U3c%P}eX@uT!lP}`O0 z$%4&n1-RSL`i`|^FvHnP5Oe7V{&VDp^0iGq2bCNaarp6$2L74==7jvMq^TVZ%14IQ zQuz#Q%JYgtgTgQ7FzAm}rn3CK{+_NCLpD+y2mXo?#S+X#w$+zo0P}Axb-=3w_B3n( z>}gWeglip3ntkQ01@YlytC#5RB}>Uec38iM`0T)RfWl#5W7A34p+T~v@ZW8cZcYXt z$Y1RAn;@u(c|q|)7{moxb$ySvfveF2`INVGRM*^<4s@Y<_RaVHr-q0FgIg2jgJAAkspU)L+X9H&O?}fl5BuZ52 z?@#n?u9%O3Pa3YHB>irbB@my0CqUSF7YzTt!^+y$klikDiUECM`g{+MP77MI@HhD& z*1|$jR^cDQ(JG$*nY4Q60YUFm*MCD%#901SKU6CP}NIj4>*shW_~Po-?`|ri*!Ks98ED`AwDH(RmJ8nXL*;Zd41RF zZQVU#qlBzYMcz%!K~X&jxl8YduLi2B|1H)M>+%1NA`2A${|lLXg$e7rveGC2c@E!f eAQHqns!8FyT0yOQtne>X(iasjq@FXl^FIJIenlhz diff --git a/tests/integration/__screenshots__/harmony_grace.png b/tests/integration/__screenshots__/harmony_grace.png index 03d85a95be990ff79c3373c83aa457f2b06359db..1bfbae3290b8e626d63fc19ad0b0a84a524b5ccf 100644 GIT binary patch literal 5548 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 OjLw;!EjoSe&;J6)y`B>Q literal 5501 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 diff --git a/tests/integration/__screenshots__/print_new_system.png b/tests/integration/__screenshots__/print_new_system.png new file mode 100644 index 0000000000000000000000000000000000000000..f3cdb80f5582f8f6f33bef4d02a56c8aef376c8a GIT binary patch literal 8387 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 { if (mode === 'color') { note.color.on('#2962ff'); } else { - note.halo.on(); + note.halo.on('rgba(41, 98, 255, 0.35)'); } } return notes.size; diff --git a/tests/integration/render.test.ts b/tests/integration/render.test.ts index 3832eebe0..47e2aa0ff 100644 --- a/tests/integration/render.test.ts +++ b/tests/integration/render.test.ts @@ -567,6 +567,11 @@ const TEST_CASES = [ // quarters) + half rest, under a "B13" symbol. The chord's upper tie bows up over // the high top note (G♯5), so the symbol lifts to clear that arc, not just the // noteheads — like M9 but the tie sits on a chord member, not a lone note. + // - M12: a top-stave-space note under its symbol — four E5 quarters under an "Em7" + // symbol. E5 sits in the top space, just under the symbol's baseline (not above the + // staff like M4), so it falls in the symbol's padding band: the padded collision box + // reaches down to the notehead and nudges the symbol up off it, instead of the + // baseline sitting tight against the note. testCase('harmony.musicxml', 'harmony.png'), // Treble stave, 4/4: a chord symbol over a note that carries a grace note. The grace @@ -601,8 +606,11 @@ const TEST_CASES = [ // string-5's dot one row down. // - M9: G♯m7♭5, string 6 at fret 4, string 5 muted, strings 4/3/2 across frets 3-4 → box // from fret 3, "4" beside string-6's dot one row down. - // - M10: Bm7 fret box plus an italic "(as taught)" words direction in the same measure — - // the diagram draws on top, staying fully legible where the text overlaps it. + // - M10: Bm7 fret box plus an italic "(as taught)" words direction — the word draws at its + // normal above-stave spot and the box lifts to sit clear above it (boxes yield to text by + // rising, not by overlapping). + // - M11: same Bm7 box but with a high D5/F♯5 chord on beat 1 that pushes the "(as taught)" + // text up — the box lifts further so it still clears the raised word. testCase('chord_diagram.musicxml', 'chord_diagram.png'), // Treble stave, 4/4, two measures at a narrow 500px width: a chord diagram bound to a @@ -703,6 +711,13 @@ const TEST_CASES = [ // and a "10" above the bottom system's first measure. testCase('system_break.musicxml', 'system_break.png'), + // Four C5 whole-note measures, treble 4/4, that would all fit on one system — but + // M3 carries a , forcing a system break before it. So the + // score wraps to two systems: M1-2 on top, M3-4 below (each re-stating the treble + // clef; the time signature prints only on M1). Proves an explicit break overrides + // width-based wrapping. + testCase('print_new_system.musicxml', 'print_new_system.png'), + // The same sixteen C5 whole-note measures, but with panoramic layout: all sixteen sit // on a single uninterrupted system (no system break). testCase('system_break.musicxml', 'layout_panoramic.png', { From 214c3841d702de61f69fac279d18e08569a68f48 Mon Sep 17 00:00:00 2001 From: Jared Johnson Date: Mon, 29 Jun 2026 09:21:57 -0400 Subject: [PATCH 2/5] fix decoration tab colors --- site/src/App.tsx | 4 +- src/draw.ts | 28 +++-- src/hit.test.ts | 2 +- src/hit.ts | 7 +- src/targets.test.ts | 3 +- src/targets.ts | 55 +++++---- .../__screenshots__/decoration_tab_color.png | Bin 0 -> 7418 bytes .../__screenshots__/decoration_tab_halo.png | Bin 0 -> 9715 bytes tests/integration/decorations.test.ts | 113 +++++++++++------- 9 files changed, 127 insertions(+), 85 deletions(-) create mode 100644 tests/integration/__screenshots__/decoration_tab_color.png create mode 100644 tests/integration/__screenshots__/decoration_tab_halo.png diff --git a/site/src/App.tsx b/site/src/App.tsx index d11e21059..6fde04135 100644 --- a/site/src/App.tsx +++ b/site/src/App.tsx @@ -238,8 +238,8 @@ export default function App() { if (note !== haloRef.current) { haloRef.current?.halo.off(); haloRef.current?.color.off(); - note?.halo.on('rgba(41, 98, 255, 0.35)'); - note?.color.on('#2962ff'); + note?.halo.on('rgba(255, 0, 105, 0.9)'); + note?.color.on('#f4f800'); haloRef.current = note; container.style.cursor = note ? 'pointer' : ''; } diff --git a/src/draw.ts b/src/draw.ts index 804a4c594..478eee3bc 100644 --- a/src/draw.ts +++ b/src/draw.ts @@ -1300,7 +1300,12 @@ export function drawScore( const positions = note.getPositions(); const fretEls = ( note as unknown as { - fretElement: { getText(): string; getFont(): string }[]; + fretElement: { + getText(): string; + getFont(): string; + getWidth(): number; + getYShift(): number; + }[]; } ).fretElement; for (const mnote of chord.notes) { @@ -1323,13 +1328,20 @@ export function drawScore( ), chord: chord.notes, measureIndex: m, - tab: { - string, - fret, - text: el ? el.getText() : String(fret), - font: el ? el.getFont() : '', - }, - glyph: null, + tab: { string, fret }, + // Replay vexflow's own fret glyph for recoloring, the tab analog of the + // notehead path: its left-anchored baseline x (drawPositions uses + // tabX = absoluteX - width/2) and baseline y (the string line plus the + // element's yShift, which is how TabNote vertically centers the digit). + // Drawn left/alphabetic, a colored fret overlays the engraved one exactly. + glyph: el + ? { + text: el.getText(), + font: el.getFont(), + x: x - el.getWidth() / 2, + y: y + el.getYShift(), + } + : null, }); } } diff --git a/src/hit.test.ts b/src/hit.test.ts index 3b040a443..cfdcfb0a3 100644 --- a/src/hit.test.ts +++ b/src/hit.test.ts @@ -83,7 +83,7 @@ function build() { rect: new Rect(90, 40, 6, 6), chord: [mBb], measureIndex: 0, - tab: { string: 2, fret: 3, text: '3', font: '10px monospace' }, + tab: { string: 2, fret: 3 }, glyph: null, }, ]; diff --git a/src/hit.ts b/src/hit.ts index 7ee7e7647..f0e7f7955 100644 --- a/src/hit.ts +++ b/src/hit.ts @@ -27,8 +27,8 @@ export interface RawNote { rect: Rect; chord: MNote[]; measureIndex: number; - tab: { string: number; fret: number; text: string; font: string } | null; - /* The engraved notehead glyph (for recoloring); null for a tab fret or a rest. */ + tab: { string: number; fret: number } | null; + /* The engraved glyph for recoloring — a notehead, or a tab fret; null for a rest. */ glyph: NoteGlyph | null; } @@ -136,8 +136,7 @@ export function buildTargets( fret: rn.tab.fret, note, decorator, - text: rn.tab.text, - font: rn.tab.font, + glyph: rn.glyph, }), ); } diff --git a/src/targets.test.ts b/src/targets.test.ts index f0194116c..4e6f4bf02 100644 --- a/src/targets.test.ts +++ b/src/targets.test.ts @@ -182,8 +182,7 @@ test('TabPosition exposes string/fret and links back to its note', () => { fret: 5, note: noteC, decorator, - text: '5', - font: '10px monospace', + glyph: null, }); expect(tab.getString()).toBe(3); expect(tab.getFret()).toBe(5); diff --git a/src/targets.ts b/src/targets.ts index e278073a9..6da1419ef 100644 --- a/src/targets.ts +++ b/src/targets.ts @@ -25,6 +25,23 @@ export interface NoteGlyph { readonly y: number; } +/* Replay a captured glyph (a notehead or a tab fret) recolored on the overlay: vexflow's own + * text, font, and left/alphabetic baseline, exactly as it engraved it, so the color stamp + * overlays the original precisely instead of being centered by a different rule. */ +function stampGlyph( + ctx: CanvasRenderingContext2D, + glyph: NoteGlyph, + color: string, +): void { + ctx.save(); + ctx.fillStyle = color; + ctx.font = glyph.font; + ctx.textAlign = 'left'; + ctx.textBaseline = 'alphabetic'; + ctx.fillText(glyph.text, glyph.x, glyph.y); + ctx.restore(); +} + /* What a decoration paints. The Decorator draws the halo from the target's box, but the color is * the target's own job: only it knows what it is — a notehead glyph (Note), a fret number * (TabPosition), or a plain box (the filled-ellipse fallback). So the Decorator hands over the @@ -186,18 +203,11 @@ export class Note extends BoundedTarget { * chosen color, so the actual head recolors and a hollow head stays hollow. A rest has no * glyph, so it falls back to the base ellipse. */ override drawColor(ctx: CanvasRenderingContext2D, color: string): void { - const glyph = this.deps.glyph; - if (!glyph) { + if (this.deps.glyph) { + stampGlyph(ctx, this.deps.glyph, color); + } else { super.drawColor(ctx, color); - return; } - ctx.save(); - ctx.fillStyle = color; - ctx.font = glyph.font; - ctx.textAlign = 'left'; - ctx.textBaseline = 'alphabetic'; - ctx.fillText(glyph.text, glyph.x, glyph.y); - ctx.restore(); } /* The sounding pitch as a vexflow key ("E/4"), or null for a rest. */ @@ -273,10 +283,9 @@ export class TabPosition extends BoundedTarget { fret: number; note: Note; decorator: Decorator; - /* The fret as vexflow drew it ("5", "<7>", "(2)", "✕") and the exact font, so a - * decoration redraws the digit in color instead of hiding it under an ellipse. */ - text: string; - font: string; + /* The engraved fret glyph ("5", "<7>", "(2)", "✕") captured with vexflow's exact + * baseline, so a decoration replays the digit recolored; null falls back to an ellipse. */ + glyph: NoteGlyph | null; }, ) { super(rect, viewport); @@ -284,18 +293,14 @@ export class TabPosition extends BoundedTarget { this.halo = new HaloToggle(this, opts.decorator); } - /* The text case: redraw the fret number centered in its box in the chosen color, so the digit - * lights up rather than vanishing under a filled ellipse. The box is centered on the fret, so - * centered text with vexflow's own fret font overlays the engraved digit exactly. */ + /* Replay vexflow's own fret glyph recolored so the digit lights up exactly where it was + * engraved, rather than vanishing under a filled ellipse. Same approach as a notehead. */ override drawColor(ctx: CanvasRenderingContext2D, color: string): void { - const r = this.rect; - ctx.save(); - ctx.fillStyle = color; - ctx.font = this.opts.font; - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillText(this.opts.text, r.x + r.w / 2, r.y + r.h / 2); - ctx.restore(); + if (this.opts.glyph) { + stampGlyph(ctx, this.opts.glyph, color); + } else { + super.drawColor(ctx, color); + } } getString(): number { diff --git a/tests/integration/__screenshots__/decoration_tab_color.png b/tests/integration/__screenshots__/decoration_tab_color.png new file mode 100644 index 0000000000000000000000000000000000000000..459eafcd032f202fecadf972b8c1a7b7a71adab9 GIT binary patch literal 7418 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 { +async function decorate(mode: 'color' | 'halo', file: string): Promise { const browser = await testBrowser(); const page = await browser.newPage({ viewport: { width: 900, height: 400 } }); try { await page.goto(TEST_URL); - const count = await page.evaluate(async (mode) => { - const container = document.getElementById('screenshot'); - if (!(container instanceof HTMLDivElement)) { - throw new Error('container not found'); - } - const xml = await (await fetch('/data/note.musicxml')).text(); - const score = await window.render(xml, container, {}); - const canvas = container.querySelector('canvas'); - if (!canvas) { - throw new Error('canvas not found'); - } - - // Hover the whole canvas to collect every note under the pointer (deduped by identity). - const notes = new Set(); - score.addEventListener('pointermove', (e) => { - if (e.target?.type === 'note') { - notes.add(e.target); + const count = await page.evaluate( + async ({ mode, file }) => { + const container = document.getElementById('screenshot'); + if (!(container instanceof HTMLDivElement)) { + throw new Error('container not found'); + } + const xml = await (await fetch(`/data/${file}`)).text(); + const score = await window.render(xml, container, {}); + const canvas = container.querySelector('canvas'); + if (!canvas) { + throw new Error('canvas not found'); } - }); - const rect = canvas.getBoundingClientRect(); - for (let dy = 2; dy < rect.height; dy += 4) { - for (let dx = 2; dx < rect.width; dx += 4) { - canvas.dispatchEvent( - new PointerEvent('pointermove', { - clientX: rect.left + dx, - clientY: rect.top + dy, - bubbles: true, - }), - ); + + // Hover the whole canvas to collect every decoratable target under the pointer + // (noteheads and tab frets), deduped by identity. + const targets = new Set(); + score.addEventListener('pointermove', (e) => { + if (e.target?.type === 'note' || e.target?.type === 'tab-position') { + targets.add(e.target); + } + }); + const rect = canvas.getBoundingClientRect(); + for (let dy = 2; dy < rect.height; dy += 4) { + for (let dx = 2; dx < rect.width; dx += 4) { + canvas.dispatchEvent( + new PointerEvent('pointermove', { + clientX: rect.left + dx, + clientY: rect.top + dy, + bubbles: true, + }), + ); + } } - } - for (const note of notes) { - if (mode === 'color') { - note.color.on('#2962ff'); - } else { - note.halo.on('rgba(41, 98, 255, 0.35)'); + for (const target of targets) { + if (mode === 'color') { + target.color.on('#2962ff'); + } else { + target.halo.on('rgba(41, 98, 255, 0.35)'); + } } - } - return notes.size; - }, mode); + return targets.size; + }, + { mode, file }, + ); if (count === 0) { - throw new Error('no notes found to decorate'); + throw new Error('no targets found to decorate'); } return await page.locator('#screenshot').screenshot(); } finally { @@ -64,9 +72,28 @@ async function decorate(mode: 'color' | 'halo'): Promise { } test('a colored note', async () => { - expect(await decorate('color')).toMatchScreenshot('decoration_color.png'); + expect(await decorate('color', 'note.musicxml')).toMatchScreenshot( + 'decoration_color.png', + ); }, 30_000); test('a haloed note', async () => { - expect(await decorate('halo')).toMatchScreenshot('decoration_halo.png'); + expect(await decorate('halo', 'note.musicxml')).toMatchScreenshot( + 'decoration_halo.png', + ); +}, 30_000); + +// A notation+tab document: the notation staff's noteheads and the tab staff's fret numbers both +// light up. Color restamps each notehead glyph and each fret digit in blue; halo draws a soft +// blue circle behind every notehead and every fret. +test('colored notes and frets', async () => { + expect( + await decorate('color', 'structure_notation_and_tab_parts.musicxml'), + ).toMatchScreenshot('decoration_tab_color.png'); +}, 30_000); + +test('haloed notes and frets', async () => { + expect( + await decorate('halo', 'structure_notation_and_tab_parts.musicxml'), + ).toMatchScreenshot('decoration_tab_halo.png'); }, 30_000); From 87c9cd400f015deb3d4ddfccd5c3f43054cd7871 Mon Sep 17 00:00:00 2001 From: Jared Johnson Date: Mon, 29 Jun 2026 09:46:45 -0400 Subject: [PATCH 3/5] add hover event and give chord diagrams more clearance to avoid clashing --- site/src/App.tsx | 51 ++++++--- src/constants.ts | 6 ++ src/draw.ts | 31 +++++- src/events.ts | 11 ++ src/index.ts | 1 + src/score.test.ts | 32 ++++++ src/score.ts | 100 +++++++++++++++--- src/stage.ts | 17 +++ .../__data__/chord_diagram.musicxml | 56 ++++++++++ .../__screenshots__/chord_diagram.png | Bin 32983 -> 36296 bytes tests/integration/render.test.ts | 3 + 11 files changed, 270 insertions(+), 38 deletions(-) diff --git a/site/src/App.tsx b/site/src/App.tsx index 6fde04135..73af0fe61 100644 --- a/site/src/App.tsx +++ b/site/src/App.tsx @@ -1,6 +1,7 @@ import { useEffect, useRef, useState } from 'react'; import type { Config, + HoverEvent, Note, PointerTarget, PointerTargetEvent, @@ -203,7 +204,7 @@ export default function App() { ? renderConfig.layout.width : undefined; let cancelled = false; - // Turn off the lit halo and hide the tooltip; called on move-to-empty and on leave. + // Turn off the lit halo and hide the tooltip; used to reset on teardown/re-render. const clearHalo = () => { haloRef.current?.halo.off(); haloRef.current?.color.off(); @@ -228,12 +229,18 @@ export default function App() { setRenderMs(renderMsRef.current); setInitialized(true); - const onPointer = (e: PointerTargetEvent) => { + // A click/tap pins a target (toggle); hover is transient. The pinned one wins, so + // hovering elsewhere — or scrolling it out from under the pointer — never clears the + // pin. Clicking it again, or clicking empty space, unpins. + let pinned: PointerTarget | null = null; + let hovered: PointerTarget | null = null; + const apply = () => { + const target = pinned ?? hovered; const note = - e.target?.type === 'note' - ? e.target - : e.target?.type === 'tab-position' - ? e.target.getNote() + target?.type === 'note' + ? target + : target?.type === 'tab-position' + ? target.getNote() : null; if (note !== haloRef.current) { haloRef.current?.halo.off(); @@ -241,26 +248,38 @@ export default function App() { note?.halo.on('rgba(255, 0, 105, 0.9)'); note?.color.on('#f4f800'); haloRef.current = note; - container.style.cursor = note ? 'pointer' : ''; } - if (note && e.target && showInfoRef.current) { - const r = e.target.getBoundingClientRect(); + container.style.cursor = note ? 'pointer' : ''; + // Only note-bearing targets get a tooltip; describe() is empty for a measure. + if (note && target && showInfoRef.current) { + const r = target.getBoundingClientRect(); setTooltip({ x: r.left + r.width / 2, y: r.top, - text: describe(e.target), + text: describe(target), }); } else { setTooltip(null); } }; - score.addEventListener('pointermove', onPointer); - score.addEventListener('pointerdown', onPointer); - container.addEventListener('pointerleave', clearHalo); - detach = () => { - container.removeEventListener('pointerleave', clearHalo); - clearHalo(); + // hover fires once per target change — on move, and (unlike pointermove) when a scroll + // slides a different target under the pointer, so it tracks what's actually hovered. + const onHover = (e: HoverEvent) => { + hovered = e.target; + apply(); + }; + const onClick = (e: PointerTargetEvent) => { + // Only notes/frets are pinnable; clicking a measure or empty space unpins. + const t = + e.target?.type === 'note' || e.target?.type === 'tab-position' + ? e.target + : null; + pinned = pinned === t ? null : t; + apply(); }; + score.addEventListener('hover', onHover); + score.addEventListener('click', onClick); + detach = clearHalo; }) .catch((e: unknown) => { renderMsRef.current = null; diff --git a/src/constants.ts b/src/constants.ts index 23fd90600..467092573 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -143,6 +143,12 @@ export const CHORD_DIAGRAM_HEIGHT = 84; /** Gap kept between the bottom of a chord diagram and the top staff line. */ export const CHORD_DIAGRAM_GAP = 6; +/** Padding added below a chord diagram's collision box (which sits CHORD_DIAGRAM_GAP above + * the top staff line). Lets the lift-clear probe reach a note sitting in the top stave space + * — just under the box — so the box rises off it instead of overlapping, the same padding + * treatment a chord symbol's box uses (see HARMONY_PADDING). */ +export const CHORD_DIAGRAM_PADDING = 15; + /** Words-direction (e.g. "ritardando") text size — matches the chord-symbol size so * both read as annotations above the notes. */ export const WORDS_FONT_SIZE = 13; diff --git a/src/draw.ts b/src/draw.ts index 478eee3bc..6bf32d6bf 100644 --- a/src/draw.ts +++ b/src/draw.ts @@ -30,6 +30,7 @@ import { BRACKET_X_SHIFT, CHORD_DIAGRAM_GAP, CHORD_DIAGRAM_HEIGHT, + CHORD_DIAGRAM_PADDING, CHORD_DIAGRAM_WIDTH, HARMONY_FONT_SIZE, HARMONY_NOTE_CLEARANCE, @@ -1429,8 +1430,9 @@ export function drawScore( // close enough to overlap (especially at a narrow width). The detector pushes each // box clear of any already-placed diagram in its band (replacing the old running // cursor) so crowded diagrams separate instead of stacking. It also lifts each box - // above any words drawn in its column (the diagrams pass runs after the words pass), - // so a word like "(as taught)" stays at its normal spot and the box rises over it. + // above any notes, ties, or words in its column (the diagrams pass runs after the + // notes and words), so a high note or a word like "(as taught)" stays put and the + // box rises over it. for (const h of harmonyTasks) { // A with a draws as a fret box (chord name as its title) // above the stave; one without draws as the plain chord-symbol text. @@ -1455,9 +1457,28 @@ export function drawScore( 'diagram', CHORD_DIAGRAM_GAP, ); - const placed = detector.liftClear(spaced, CHORD_DIAGRAM_GAP, [ - 'annotation', - ]); + // Pad the box below its bottom so the lift-clear probe reaches a high note + // (or its tie) poking up into the box's column — the same padding treatment + // a chord symbol uses. The box then rises off the note instead of overlapping + // it; with nothing in the way it keeps its default position. + const padded = new Rect( + spaced.x, + spaced.y, + spaced.w, + CHORD_DIAGRAM_HEIGHT + CHORD_DIAGRAM_PADDING, + ); + const lifted = detector.liftClear( + padded, + CHORD_DIAGRAM_GAP, + TEXT_CLEAR_KINDS, + ); + // Recover the real (unpadded) box; the padding only extended the probe. + const placed = new Rect( + lifted.x, + lifted.y, + CHORD_DIAGRAM_WIDTH, + CHORD_DIAGRAM_HEIGHT, + ); detector.add({ rect: placed, kind: 'diagram' }); const diagram = new ChordDiagram(placed.x, placed.y, { width: CHORD_DIAGRAM_WIDTH, diff --git a/src/events.ts b/src/events.ts index 14d2b3ea1..bc2cd615a 100644 --- a/src/events.ts +++ b/src/events.ts @@ -67,6 +67,16 @@ export interface PointerTargetEvent { readonly native: PointerEvent; } +/* The target under the pointer changed: entered, left, or moved between targets. `target` is null + * when nothing is under the pointer (empty space, or the pointer left the score); `point` is the + * pointer in score space, or null once the pointer is off the score. Unlike pointermove, this also + * fires when scrolling slides a different target under a stationary pointer — so it fires at most + * once per change, not once per pixel. */ +export interface HoverEvent { + readonly target: PointerTarget | null; + readonly point: { x: number; y: number } | null; +} + /* The container scrolled: its new scroll offset plus the raw event. */ export interface ScoreScrollEvent { readonly left: number; @@ -86,6 +96,7 @@ export interface ScoreEventMap { pointerdown: PointerTargetEvent; pointerup: PointerTargetEvent; click: PointerTargetEvent; + hover: HoverEvent; scroll: ScoreScrollEvent; resize: ScoreResizeEvent; } diff --git a/src/index.ts b/src/index.ts index df7ca44d9..139bd7a5c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,7 @@ export { export type { Config } from './config'; export type { EventListenable, + HoverEvent, PointerTargetEvent, ScoreEventMap, ScoreResizeEvent, diff --git a/src/score.test.ts b/src/score.test.ts index 13ef5c310..e245b5db1 100644 --- a/src/score.test.ts +++ b/src/score.test.ts @@ -47,6 +47,7 @@ class FakeHost implements Host { toScoreSpace(clientX: number, clientY: number): { x: number; y: number } { return { x: clientX, y: clientY }; } + scrollListener: (() => void) | null = null; observeResize( onResize: (size: { width: number; height: number }) => void, ): () => void { @@ -56,6 +57,12 @@ class FakeHost implements Host { this.resizeListener = null; }; } + observeScroll(onScroll: () => void): () => void { + this.scrollListener = onScroll; + return () => { + this.scrollListener = null; + }; + } createLayer(kind: LayerKind): Layer { const layer = new FakeLayer(kind); this.created.push(layer); @@ -167,6 +174,31 @@ test('scroll events carry the offset and the score.scroll getter reflects the ho expect(score.scroll).toEqual({ left: 12, top: 34 }); }); +test('hover fires only on target change and recomputes on scroll; unsubscribe detaches scroll', () => { + const target = new Measure(new Rect(0, 0, 10, 10), viewport, '1'); + const host = new FakeHost(); + // A mutable hit result lets the test flip what's "under the pointer" to simulate scrolling the + // target out from under a stationary pointer (FakeHost.toScoreSpace is identity). + let hit: PointerTarget | null = target; + const index: HitTester = { hitTest: () => hit }; + const score = new Score(host, index, new Decorations(host)); + + const seen: Array = []; + const listener = (e: { target: PointerTarget | null }) => seen.push(e.target); + score.addEventListener('hover', listener); + + host.events.dispatchEvent(new FakePointerEvent('pointermove', 5, 5)); // enter target + host.events.dispatchEvent(new FakePointerEvent('pointermove', 6, 6)); // same target, quiet + expect(seen).toEqual([target]); + + hit = null; // scroll slid the target away + host.scrollListener?.(); + expect(seen).toEqual([target, null]); + + score.removeEventListener('hover', listener); + expect(host.scrollListener).toBeNull(); // window-scroll subscription released +}); + test('resize is observed from construction and re-fits viewport layers before emitting', () => { const { host, score } = fixture(null); // Observed eagerly (it also drives viewport-layer sizing), not lazily on first subscriber. diff --git a/src/score.ts b/src/score.ts index 1e431bdea..1ae5179ce 100644 --- a/src/score.ts +++ b/src/score.ts @@ -2,6 +2,7 @@ import type { Decorations } from './decorations'; import { EventBus, type EventListenable, type ScoreEventMap } from './events'; import type { HitTester } from './hit'; import type { Host, Layer, LayerKind } from './stage'; +import type { PointerTarget } from './targets'; /* * A rendered score: the handle render() returns. Owns the DOM vexml built (the Stage/Host) and @@ -17,10 +18,19 @@ import type { Host, Layer, LayerKind } from './stage'; */ export class Score implements EventListenable { private readonly bus = new EventBus(); - // The live DOM listeners (pointer/scroll), keyed by event name so unbind can remove the exact - // reference. Resize isn't here — it's a ResizeObserver, set up once below. - private readonly bound = new Map(); + // The live DOM listeners backing each Score event, so unbind can remove the exact references. + // Most events map to one DOM listener; hover maps to several (move/down/leave). Resize isn't + // here — it's a ResizeObserver, set up once below. + private readonly bound = new Map< + keyof ScoreEventMap, + Array<[string, EventListener]> + >(); private readonly unobserveResize: () => void; + // Hover state: the target last reported and the last pointer position (client coords) to + // re-hit-test on scroll. unobserveScroll is hover's window-scroll subscription. + private hovered: PointerTarget | null = null; + private lastClient: { x: number; y: number } | null = null; + private unobserveScroll: (() => void) | null = null; constructor( private readonly host: Host, @@ -76,32 +86,57 @@ export class Score implements EventListenable { } dispose(): void { - for (const [type, handler] of this.bound) { - this.host.events.removeEventListener(type, handler); + for (const handlers of this.bound.values()) { + for (const [domType, handler] of handlers) { + this.host.events.removeEventListener(domType, handler); + } } this.bound.clear(); + this.unobserveScroll?.(); + this.unobserveScroll = null; this.unobserveResize(); this.decorations.dispose(); this.host.dispose(); } // Attach the underlying source for a Score event on its first subscriber. Pointer events - // hit-test the point under them; scroll carries the new offset; resize is already observed - // from construction (for the layers), so there's nothing to bind here. + // hit-test the point under them; scroll carries the new offset; hover tracks the target under + // the pointer (recomputed on move/down/leave and scroll); resize is already observed from + // construction (for the layers), so there's nothing to bind here. private bind(type: keyof ScoreEventMap): void { switch (type) { case 'resize': return; case 'scroll': { - const handler: EventListener = (native) => { + this.listen(type, 'scroll', (native) => { this.bus.emit('scroll', { ...this.host.scroll, native }); + }); + return; + } + case 'hover': { + const track: EventListener = (native) => { + const pointer = native as PointerEvent; + this.lastClient = { x: pointer.clientX, y: pointer.clientY }; + this.recomputeHover(); }; - this.bound.set(type, handler); - this.host.events.addEventListener(type, handler); + this.listen(type, 'pointermove', track); + this.listen(type, 'pointerdown', track); + // Clear on leave and on cancel: a touch pointer ceases to exist on lift (pointerleave + // follows pointerup) or when the UA steals the gesture to scroll (pointercancel) — drop + // the stale position so a momentum-scroll recompute doesn't relight a phantom target. + const clear: EventListener = () => { + this.lastClient = null; + this.recomputeHover(); + }; + this.listen(type, 'pointerleave', clear); + this.listen(type, 'pointercancel', clear); + this.unobserveScroll = this.host.observeScroll(() => + this.recomputeHover(), + ); return; } default: { - const handler: EventListener = (native) => { + this.listen(type, type, (native) => { const pointer = native as PointerEvent; const point = this.host.toScoreSpace( pointer.clientX, @@ -112,9 +147,7 @@ export class Score implements EventListenable { point, native: pointer, }); - }; - this.bound.set(type, handler); - this.host.events.addEventListener(type, handler); + }); } } } @@ -125,10 +158,43 @@ export class Score implements EventListenable { if (type === 'resize') { return; } - const handler = this.bound.get(type); - if (handler) { - this.host.events.removeEventListener(type, handler); + const handlers = this.bound.get(type); + if (handlers) { + for (const [domType, handler] of handlers) { + this.host.events.removeEventListener(domType, handler); + } this.bound.delete(type); } + if (type === 'hover') { + this.unobserveScroll?.(); + this.unobserveScroll = null; + this.hovered = null; + this.lastClient = null; + } + } + + // Bind a DOM listener for a Score event and record it for later removal. + private listen( + type: keyof ScoreEventMap, + domType: string, + handler: EventListener, + ): void { + this.host.events.addEventListener(domType, handler); + const handlers = this.bound.get(type) ?? []; + handlers.push([domType, handler]); + this.bound.set(type, handlers); + } + + // Re-hit-test the last pointer position and emit hover only when the target changes — so a + // scroll or a move within the same target stays quiet, but sliding onto/off a target fires. + private recomputeHover(): void { + const point = this.lastClient + ? this.host.toScoreSpace(this.lastClient.x, this.lastClient.y) + : null; + const target = point ? this.index.hitTest(point) : null; + if (target !== this.hovered) { + this.hovered = target; + this.bus.emit('hover', { target, point }); + } } } diff --git a/src/stage.ts b/src/stage.ts index 1f2669b46..34016f9bb 100644 --- a/src/stage.ts +++ b/src/stage.ts @@ -37,6 +37,11 @@ export interface Host extends LayerHost { observeResize( onResize: (size: { width: number; height: number }) => void, ): () => void; + /* Subscribe to any scroll that slides the score within the viewport — the container's own, or + * any ancestor's (scroll doesn't bubble, so the real host listens on window in the capture + * phase). Returns an unsubscribe. Drives hover: content can move under a stationary pointer with + * no pointer event. */ + observeScroll(onScroll: () => void): () => void; /* Re-sync every layer to the container's current geometry (called on resize). Viewport layers * are refit to the visible box (clearing them); content layers keep their score-resolution bitmap * (no clear) but re-track the base canvas's rendered box, so they stay aligned however the @@ -174,6 +179,18 @@ export class Stage implements Viewport, Host { return () => observer.disconnect(); } + observeScroll(onScroll: () => void): () => void { + // Capture phase on window catches every scroll container (the score's own or any ancestor), + // since scroll events don't bubble. passive: we only read positions, never preventDefault. + const handler = () => onScroll(); + window.addEventListener('scroll', handler, { + capture: true, + passive: true, + }); + return () => + window.removeEventListener('scroll', handler, { capture: true }); + } + createLayer(kind: LayerKind): Layer { const canvas = document.createElement('canvas'); // Overlay absolutely positioned within the (positioned) container. Purely visual: pointer diff --git a/tests/integration/__data__/chord_diagram.musicxml b/tests/integration/__data__/chord_diagram.musicxml index cea3c445a..f0104436f 100644 --- a/tests/integration/__data__/chord_diagram.musicxml +++ b/tests/integration/__data__/chord_diagram.musicxml @@ -700,5 +700,61 @@ quarter + + + + B + + minor-seventh + + 6 + 1 + + 4 + 7 + + + 3 + 7 + + + 2 + 7 + + + + + + C + 6 + + 1 + quarter + + + + C + 6 + + 1 + quarter + + + + C + 6 + + 1 + quarter + + + + C + 6 + + 1 + quarter + + diff --git a/tests/integration/__screenshots__/chord_diagram.png b/tests/integration/__screenshots__/chord_diagram.png index 49032f83f3cbc5d385c996d5c8351487e36fb95f..84750bf5d7467f7769d01892a662ceedda493110 100644 GIT binary patch literal 36296 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

w;nyAj6qK++#eF-5&V$X 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 diff --git a/tests/integration/render.test.ts b/tests/integration/render.test.ts index 47e2aa0ff..c97c47c16 100644 --- a/tests/integration/render.test.ts +++ b/tests/integration/render.test.ts @@ -611,6 +611,9 @@ const TEST_CASES = [ // rising, not by overlapping). // - M11: same Bm7 box but with a high D5/F♯5 chord on beat 1 that pushes the "(as taught)" // text up — the box lifts further so it still clears the raised word. + // - M12: same Bm7 box over four C6 quarters (two ledger lines above the staff) — the box + // lifts until it clears the high noteheads/ledger lines, using the same padded + // lift-clear treatment a chord symbol uses, instead of overlapping them. testCase('chord_diagram.musicxml', 'chord_diagram.png'), // Treble stave, 4/4, two measures at a narrow 500px width: a chord diagram bound to a From 6435ee607797f4e62e88c676fbff99bd8c553a52 Mon Sep 17 00:00:00 2001 From: Jared Johnson Date: Mon, 29 Jun 2026 09:54:20 -0400 Subject: [PATCH 4/5] prevent chord diagrams from leaving the viewport --- src/collision.test.ts | 11 +++ src/collision.ts | 19 +++++ src/draw.ts | 11 ++- .../__data__/chord_diagram_edge.musicxml | 78 ++++++++++++++++++ .../__screenshots__/chord_diagram_edge.png | Bin 0 -> 5576 bytes tests/integration/render.test.ts | 9 ++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 tests/integration/__data__/chord_diagram_edge.musicxml create mode 100644 tests/integration/__screenshots__/chord_diagram_edge.png diff --git a/src/collision.test.ts b/src/collision.test.ts index 8d6ac4dc4..1d0ed63ac 100644 --- a/src/collision.test.ts +++ b/src/collision.test.ts @@ -71,6 +71,17 @@ test('pushRightOf ignores diagrams in a different vertical band', () => { expect(d.pushRightOf(new Rect(50, 500, 88, 84), 'diagram', 6).x).toBe(50); }); +test('nudgeInsideX pulls an over-right box back in, leaves an inside box put, and never overshoots left', () => { + const d = detector(); + const bounds = new Rect(0, 0, 100, 100); + // Overruns the right edge -> pulled left so its right edge lands on the (margin-inset) edge. + expect(d.nudgeInsideX(new Rect(80, 0, 30, 10), bounds, 5).x).toBe(65); + // Already inside -> untouched. + expect(d.nudgeInsideX(new Rect(20, 0, 30, 10), bounds, 5).x).toBe(20); + // Wider than the span -> clamps to the left edge rather than overshooting it. + expect(d.nudgeInsideX(new Rect(80, 0, 200, 10), bounds, 5).x).toBe(5); +}); + test('escaping flags rects that cross the viewport edges', () => { const d = detector(); d.addRect(new Rect(10, 10, 5, 5), 'note'); // inside diff --git a/src/collision.ts b/src/collision.ts index 50feebbb6..872526b04 100644 --- a/src/collision.ts +++ b/src/collision.ts @@ -113,6 +113,25 @@ export class CollisionDetector { return rect.translate(targetX - rect.x, 0); } + /* + * Shift `rect` horizontally so it sits within `bounds` (the canvas), pulling a box that + * overruns the right edge back inside, or pushing one off the left edge back right. Only + * moves along x — vertical clipping is handled by growing the crop, not nudging. The left + * edge wins if the rect is wider than the available span. `margin` insets both edges. + */ + nudgeInsideX(rect: Rect, bounds: Rect, margin = 0): Rect { + const left = bounds.x + margin; + const right = bounds.right - margin; + let dx = 0; + if (rect.right > right) { + dx = right - rect.right; // pull left + } + if (rect.x + dx < left) { + dx = left - rect.x; // but never past the left edge + } + return rect.translate(dx, 0); + } + /* * Registered items that escape `viewport` (the rendered/crop rectangle), with which edges * they cross — the "no-man's land" where content gets clipped. The caller decides whether diff --git a/src/draw.ts b/src/draw.ts index 6bf32d6bf..6e5588c6f 100644 --- a/src/draw.ts +++ b/src/draw.ts @@ -41,6 +41,7 @@ import { LEDGER_HEADROOM, PAGE_MARGIN_BOTTOM, PAGE_MARGIN_TOP, + PAGE_MARGIN_X, PEDAL_BOTTOM_MARGIN, PEDAL_BOTTOM_TEXT_LINE, TEMPO_NOTE_CLEARANCE, @@ -1473,12 +1474,20 @@ export function drawScore( TEXT_CLEAR_KINDS, ); // Recover the real (unpadded) box; the padding only extended the probe. - const placed = new Rect( + const unclamped = new Rect( lifted.x, lifted.y, CHORD_DIAGRAM_WIDTH, CHORD_DIAGRAM_HEIGHT, ); + // A box anchored at a note near the right edge would overrun the canvas and be + // clipped (page overflow has no crop-growth knob like the vertical edges do), so + // nudge it back inside the drawable region. + const placed = detector.nudgeInsideX( + unclamped, + scratchViewport, + PAGE_MARGIN_X, + ); detector.add({ rect: placed, kind: 'diagram' }); const diagram = new ChordDiagram(placed.x, placed.y, { width: CHORD_DIAGRAM_WIDTH, diff --git a/tests/integration/__data__/chord_diagram_edge.musicxml b/tests/integration/__data__/chord_diagram_edge.musicxml new file mode 100644 index 000000000..87bb721f7 --- /dev/null +++ b/tests/integration/__data__/chord_diagram_edge.musicxml @@ -0,0 +1,78 @@ + + + + + Music + + + + + + 1 + + 1 + + G + 2 + + + + + B + 4 + + 1 + quarter + + + + B + 4 + + 1 + quarter + + + + B + 4 + + 1 + quarter + + + + B + + minor-seventh + + 6 + 1 + + 4 + 7 + + + 3 + 7 + + + 2 + 7 + + + + + + B + 4 + + 1 + quarter + + + + diff --git a/tests/integration/__screenshots__/chord_diagram_edge.png b/tests/integration/__screenshots__/chord_diagram_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..cf134eed7f24df2617665e9608238b01a0c5fa81 GIT binary patch literal 5576 zcmds5X&{vC`hRfbwM3;!#8gUTmneI(WtUxcvSr^Q3|f%ao;?iGVjYI;J4M;XlA)}V z#@NGHGK@L5_kGVf|Np0RKEK~)o_U^m?(4dL+kHjr>8KrN;9!6t=(zeFWqk;uJ`F)s zH-DoBS7MQ5I|w=fsVgfQ24=5JJ@V=wqjYa1-`S|X&h&fUPO+UJYcYCx+-^p?=0Ws5 zRXU}Q)5X!2Y!Xb0nlQ2A9mEX%NzEALnD?)uuVa}`x@^iMV=y@r!A3-#wSMws7GW+y zCKpprn4U(8?WXz;$Ps?Me)moQf-X0~An5ipI_OsHIs`pG35OuD4jSl!Y9IuC_>Bb$ zKZ~P+PF#|OAiKZUP3u}zR8&?Nqf%3Jz|ZOY{QS(Yy?mvprj_T@?Ny)+ve<>8f)Vjj z>(&;%{M$;AOhZYDpT{IUr)8%!l$Dhihu_f9(7>*p0C(oLwo<--jA?FeF1Kz)d9uJ| z7nYZUf34#j`(G~JSs2Xk?9aMEcbvnp#JEf~jw44d7<$S<$%crIy$fgBk&I2_e@nw3|l$!}4=GxE4v>{(mlw`$k1 zD?B{M&x+o{Np;YKcat`IMTACRQw{!EH$1J-b{_>X%;zMv6qb-`+e@S7HEw1_`aFn| zeeR^BB&_F)w6wRr4&UCpNc)^d67NE@`9a%DZwOMc%Y}u7x(ej$x=7jcA?uIt>Nf>? z&vAQBH>K%)P8YHE@u}R-a+|CZlaLr)sBC+(4$Yzu4i2`OYQ4)uPMtb+`}S=?T#`EI zCy6JhMY)}!pXx#_pGDpJQ#ux9ks$*vI%dv6@g)X|GKMCcpsA%L>;3(Mi8X?UT(-JL zBy49G^}m#W9Y!PRpah3Z(Q>`~CrBX{W@f9VK=cBaot<4sNC*Rr|Mj}A)#BnJAQOGi ze~0WW90__}=RG$&Yon=dXqZx7{u6EAea)<$>HM&L#hnx36VKz~%FJs$OifLD(}WE4 z^{J_;8v=gH+jczbGZF2K+F}Ce52yrtL`8GV0<>gj}v2|-cs%Wc-r#6b?cU%p59CgVq|#un)OkU;)6tJ7Va_K zWY+j_^?cX?+Ni`>Rb4|vgG|~E-dYfI=t=1_JgW2TA1t>O_z&^xa;=(!R8&;zgK2B$ z3!t{C1ra>2F0u}MRmJ?N6rxGTj&lT(lL_vQYwTxhsBO4$I9%HD$U9vY&YOcXGczsU zz~^*9v&|Ro1>e7ax3Iz;lJ|Rj0nPdrezsEJ@*%&T&@yfkFq964MRu!AX2-(WcA!3v z@BJ2sH}So-ZeKSeF!R0Xo`6k&HG8$`0Firm7`EK{=L!Q!oDcIcn+_VO58m~-bLUgG zly6GGVtmJs&&jM^Rhu8!@B+#!6P*gXj|^GIJ-}uVFu6b580!Cl zqiVC*G9eZjyjvPAdB^F#j4gXaoUazKuJy<%;Qs+&yf{9smFTuZr5#UNOS|>L2zIQqXSaw6U;SAmpXF;*P%uu=vM?Zm_ri zqd&psp-C1{3n!>W2wj`%3NZHPg@4!6RRM!`4GL7_sA(CFP&}XN>J$t?W=Gfm&s&@# zx`AxdP*VeJzlI=qw;4{%YqqVe?N+K>0$h$m+Rqt~hw^KVg%%P$4(_gTpC~pdM^!5B zS{{(e0PQ{iGbqc(pdDc`Xx1tl2LF2C?+ZA$yEau&P!Koq{P}a+&d94!xKxH;N66-n z&p=VCgy|U>W&D>?sG*E-_RhIaNtb*H1JxqAa=|r!Ub3I8^A-^tBl6MH(=$M`4|M1g zti#CF0I?S@UTh5biDd&i)_>qyZq@uiPImOY%ZLMzw0rLhAB+|Qbf1%S(}N%r-=41L zM#Y9-8w1LFUP!oNO;H3;tz+NWxd!|0_|Xy*1>gC;!F(kc)b>WJwq&jSDP3Gl(j~Qf zFO&p;mw@hZb90}D+D5^TC?J8MrG`bro~>j@;+M9^G-Kt~l!c*7w2;?TU+oMvRaFi) zk;$MkxWVBPxj3@niD0%Ki*x%l`8V z9w8pk*42sHR$oHA_e6ugEB*pluL9+u%0C+L7BD>1fGV7FA7yP06S`-pARoNbSBF@i zRRpRbXuSbC8L~SSkowf3HI%$D*Nx>7ckFW>ufWBfyJ4z94T(6R)LN*jo3Ano)Z@k^->h5x`~vsI66etimYsn#0yybMWp!uEI=_0q^pN z69R!yI9ON0-vm})W05Xwc~AHKWnSKZ#bG>f9f%s~dLIYiIBo+% zxe~6%`L`odo=&zP_M^^+ilPu9AsrnZzrzHuwVpFoP8fcuElkV=GnZ;&HIx8EToNCI zoJ40W4rJXB;o#`s!o|GrBWDBS;3(!)+jU73 zwtQf54Yq^PShCg+6gsZOOiR^@^H?2Bahp15|ek7G-JP67mRtvmrStCFQjU zU`?DUhg{HmYUn8r^sd07Xx#fUT`9$$SEhyNj}rl7nw|RK50l1VR$N#(x*)SjP%+XXo%ovaZ#y6!`fn=7jnFEZq!IMTb$+ z_VVt^SKrld66DsrcfK#LyIez%wm<+Xw1|~Nt7VNBXiq+OjVvQ=Eml2Ty|?_r?&I(7 z;}!X4RgV1jbBV&14GSmBXy}*=Iq$x{b8=Ze@o-n#`@1p^8w|F+(S3fI9+u@J*L&*Z z$t0P5vG>t(-#)GASc|uBH-2X91agO~lcqDAdT$wDIwdrP8@u0M7orF*$ zAb+crZPzgJ_Sl$pSeeiHqo?f>B)!#ye@pP5>oS`mkw|Obs!Kp#Nqcc)I#9`BrOZ_U zg*V;U*Z}gf_@yXWyM91YZpsG`DAk2D0tA!D6I{=G`EsE}0bsg_r zEh%qlKSc!Q5k_#=Q~fH^`;S2ZM+_5OVqHR#dHH34Y@oJ!(2Bse79 zGCKFgJf8j4X3kIcwY*|4lpNfGoYk3A(LB-GJ_})TBuv=U=d%(IQV!4EA9<_ItCL-U z%IhvC?X0?%{`Q$8D%W-zh!v;#=)%7n&4r(=NZr2O1h8waQ0>^y(d%zxlZP}>c(`H; ztZ&;r`V@~J@9eLQInqoT@(Mb16zGqkv3H~tbYE>CB5FI6JypP@#$vg3OK1$h)KQWpd9)2BNH78rNabg<9*4qB-bUw)3f zOAxkh4yyLg$D8N_9oJ^_nP#6S8Ra5&%%n>Pk8lL`ljf?fr7g-y0`T~i2*?YLmhzzo zfpUy?f>jm5VZ{C$+jAnVm7M}FA&A!dXcll_XX$L#?&Q`Y(7`?r&7P2IE?FxztJ<0a zR$Ll(+Pv8CDi?1ABOCmtSDwGa9G!_I&UUe-X?HqUgZs)ARm$UnYdXITR&7`ryA2Qr zletwNo!O*^e4b{@M@n9}U;{8b6GDtzb2rT;4;S9Ol*0$W1M=cMFE1}Wy~H5-c8|Sk zR9benTPbE?99<9^{bCmM&FeHeJ6>#^Fbb^3Y=2Qlt(n2>OqSGZJ(>3z1$8Qe0edhb|zFtP*7`ENYee=eX?7Y zr2AW~OuPCrlX7H`yw4l8WMG#+2JJ1XAB^hjBqN{hBdEeN%Xs9AGR> z$lR@Gn=az64 zNh3&pkEv->l-QjzTGxw?QvK4G=yfQZ%?u?o~MlW7@Ys%vq^%q66 zHKgKPuk@+Ja-GWja10`PJzW>YW?DD+sZ&9H?H^g^Gi?v<-RON6070As+c-2pySUT9 z<;#~B;9cvuP65M08-sSf=;-LX5ajFS9r)gJCKSvVy0&*#CrrxjRfkbR?O$|uj2}wM z%Ud1&WvVZHCUn1yM~X@MA{bma7?gn&2GG_LMri?I^r=ASB|*Wy7BAqcX$Jj5O-)Vu z`uZRga$2y%$558RwtD~&rJm;vs*c#aN#hfLKQA2%gskoumu(0KcQ#=}iAassb*kU6K#gTCXdqkahR39+PHuG_n3UMq%#!zam6VkH-}4>4A}}XPCt@ayA}1>wvcIz$ z#PC`pm7l+$)|*W7xAfUsxT~Ph3T6Ng7X}rnAg#`N^Gc`Tx7t}?l6264*sC3#+@M(j%A523=8X^C!BIfKH-Zjo6RK-ZTY;dei+{h#+23<6 qh^Ej$5QTC*pVk4)V~-t)FAY@XQ7rP0QQD)KEu^lZql~(3^W>lU6DWWH literal 0 HcmV?d00001 diff --git a/tests/integration/render.test.ts b/tests/integration/render.test.ts index c97c47c16..a8e60b8b1 100644 --- a/tests/integration/render.test.ts +++ b/tests/integration/render.test.ts @@ -629,6 +629,15 @@ const TEST_CASES = [ layout: { type: 'standard', width: 500 }, }), + // Treble stave, 4/4, one measure at a narrow 500px width: a Bm7 fret box bound to the + // LAST quarter, whose note sits right against the system's right edge. Anchored at that + // note's x, the box's natural right edge overruns the canvas; it must nudge left so the + // whole board — including the far-right muted "X" — stays inside the drawable region + // instead of being clipped. Four B4 quarters so only the diagram's clamp is exercised. + testCase('chord_diagram_edge.musicxml', 'chord_diagram_edge.png', { + layout: { type: 'standard', width: 500 }, + }), + // Treble stave, 4/4: natural harmonics drawn as diamond noteheads (from // ). The tab counterpart (angle-bracketed frets) is tab_harmonic. // - M1: single notes on E5 — an open diamond for the half note, then filled diamonds for From 710b078ff326d098689c037dcd72daf6ee2860e6 Mon Sep 17 00:00:00 2001 From: Jared Johnson Date: Mon, 29 Jun 2026 10:05:06 -0400 Subject: [PATCH 5/5] add z-index support to layers --- README.md | 16 ++++++++++++---- src/score.test.ts | 17 ++++++++++++++--- src/score.ts | 14 +++++++++++--- src/stage.ts | 13 +++++++++---- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 5b4c8db91..11b220a2b 100644 --- a/README.md +++ b/README.md @@ -63,15 +63,23 @@ await render(musicXML, element, { ## Adding a canvas layer +A layer is a `` that you can draw arbitrary content on without affecting the sheet music. vexml controls its size and position. + ```ts const score = await render(musicXML, element); -const layer = score.createLayer('content'); -// ctx is a standard CanvasRenderingContext2D, you can draw anything you want here -layer.ctx.fillStyle = 'rgba(255, 0, 0, 0.3)'; -layer.ctx.fillRect(50, 50, 100, 80); +const background = score.addLayer('content', -1); // draws behind the score +// ctx is a standard CanvasRenderingContext2D +background.ctx.fillStyle = 'rgba(0, 0, 255, 0.3)'; +background.ctx.fillRect(50, 50, 100, 80); + +const foreground = score.addLayer('content', 1); // draws in front of the score +foreground.ctx.fillStyle = 'rgba(255, 0, 0, 0.3)'; +foreground.ctx.fillRect(50, 50, 100, 80); ``` +Pass an optional `zIndex` to order a layer relative to the canvas the score is drawn on, which sits at `zIndex` 0. A positive value draws in front; a negative value draws behind, showing through the score's transparent pixels. Layers with the same `zIndex` stack in the order they were created. + ## Cleaning up When you're done with a layer or the entire rendered score, call `.dispose()` to clean up resources. diff --git a/src/score.test.ts b/src/score.test.ts index e245b5db1..46cb433e6 100644 --- a/src/score.test.ts +++ b/src/score.test.ts @@ -28,7 +28,10 @@ function noopContext(): CanvasRenderingContext2D { class FakeLayer implements Layer { disposed = false; readonly ctx = noopContext(); - constructor(readonly kind: LayerKind) {} + constructor( + readonly kind: LayerKind, + readonly zIndex?: number, + ) {} dispose(): void { this.disposed = true; } @@ -63,8 +66,8 @@ class FakeHost implements Host { this.scrollListener = null; }; } - createLayer(kind: LayerKind): Layer { - const layer = new FakeLayer(kind); + createLayer(kind: LayerKind, zIndex?: number): Layer { + const layer = new FakeLayer(kind, zIndex); this.created.push(layer); return layer; } @@ -226,6 +229,14 @@ test('addLayer delegates to the host; removeLayer disposes the layer', () => { expect(host.created[0]?.disposed).toBe(true); }); +test('addLayer forwards zIndex to the host and rejects non-integers', () => { + const { host, score } = fixture(null); + score.addLayer('content', -2); + expect(host.created[0]?.zIndex).toBe(-2); + expect(() => score.addLayer('content', 1.5)).toThrow(); + expect(() => score.addLayer('content', Number.NaN)).toThrow(); +}); + test('dispose detaches every listener and tears down decorations and host', () => { const target = new Measure(new Rect(0, 0, 10, 10), viewport, '1'); const { host, index, decorations, score } = fixture(target); diff --git a/src/score.ts b/src/score.ts index 1ae5179ce..c938a3f66 100644 --- a/src/score.ts +++ b/src/score.ts @@ -54,9 +54,17 @@ export class Score implements EventListenable { /* Add a caller-owned drawing layer over the score; returns it for drawing (via ctx) and removal * (via dispose, or removeLayer). A content layer spans the engraved score; a viewport layer - * spans the visible box and is re-fit on resize. */ - addLayer(kind: LayerKind): Layer { - return this.host.createLayer(kind); + * spans the visible box and is re-fit on resize. + * + * zIndex (an integer, may be negative) orders the layer relative to the canvas the score is drawn + * on, which sits at zIndex 0: positive draws in front, negative behind (showing through the + * score's transparent pixels). Layers with the same zIndex stack in creation order. Omit it to + * use the kind's default (background behind, everything else in front). */ + addLayer(kind: LayerKind, zIndex?: number): Layer { + if (zIndex !== undefined && !Number.isInteger(zIndex)) { + throw new Error('vexml: layer zIndex must be an integer'); + } + return this.host.createLayer(kind, zIndex); } /* Remove a layer added with addLayer (a shorthand for layer.dispose()). */ diff --git a/src/stage.ts b/src/stage.ts index 34016f9bb..fb65b9d33 100644 --- a/src/stage.ts +++ b/src/stage.ts @@ -20,7 +20,7 @@ export interface Layer { * on its own content layer but needs nothing else). Stage satisfies it; a unit test injects a * fake whose layer carries a recording context. */ export interface LayerHost { - createLayer(kind: LayerKind): Layer; + createLayer(kind: LayerKind, zIndex?: number): Layer; } /* @@ -191,7 +191,7 @@ export class Stage implements Viewport, Host { window.removeEventListener('scroll', handler, { capture: true }); } - createLayer(kind: LayerKind): Layer { + createLayer(kind: LayerKind, zIndex?: number): Layer { const canvas = document.createElement('canvas'); // Overlay absolutely positioned within the (positioned) container. Purely visual: pointer // events pass through to the container, where the Score hit-tests them — layers never capture @@ -199,8 +199,13 @@ export class Stage implements Viewport, Host { canvas.className = 'vexml-layer'; canvas.style.position = 'absolute'; canvas.style.pointerEvents = 'none'; - // A background layer paints behind the (in-flow) base canvas; everything else stacks over it. - if (kind === 'background') { + // The base canvas is in-flow at z-index 0. An explicit zIndex orders the layer against it + // (negative drops behind, where it shows through the score's transparent pixels); otherwise a + // background layer defaults behind and everything else stacks over it. Equal z-indexes fall + // back to DOM order, which is creation order since layers are appended as created. + if (zIndex !== undefined) { + canvas.style.zIndex = String(zIndex); + } else if (kind === 'background') { canvas.style.zIndex = '-1'; } const layer = new ManagedLayer(kind, canvas, this);