From fbe1f8c8762cba169ba809654585278b3b363205 Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 31 Jul 2026 19:52:49 +0200 Subject: [PATCH] feat: nieuwe proefplaat "Egeltje in het bos" (groep 1-2, v0.4.84-beta) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nieuwe kleurplaat op verzoek: rondere, zachtere dierenstijl geïnspireerd op publiek-domein referentiebeelden (openclipart.org, bekeken maar niet overgenomen), niet de exacte scenes uit de aangeleverde voorbeelden - Egel getekend met een scherpe, doorlopende zigzag-stekelrand als onderdeel van de romp zelf, in plaats van losse ronde "bladvorm"-plukjes erbovenop - dat laatste las als bloemblaadjes, niet als stekels - Vier poten met een ronde poot-vorm en teentjes in plaats van rechte blokjes; buik is één rustige boog zodat de poten er voorspelbaar onderuit steken zonder door elkaar of de buiklijn heen te kruisen - Boom herbouwd: stam die breed begint bij de grond en versmalt naar boven (net als de getapte dierenpoten van eerder deze sessie, maar omgekeerd), met een zichtbare splitsing in takken en een kroon van drie overlappende ronde plukken in plaats van één gladde ovaal op een paal - Testinvariant "20 platen, 5 per groepenband" versoepeld naar "minstens 20/5" zodat een proefplaat als bonus kan bestaan zonder de gecureerde kernset aan te tasten Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_011YErxhic5w9K57zmt8Q1uS --- VERSION | 2 +- public/js/core.js | 2 +- public/js/widgets/coloring-scenes-junior.js | 54 +++++++++++++++++++++ public/js/widgets/coloring.js | 3 +- test/coloring.test.js | 6 ++- 5 files changed, 62 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 4c4d66c..ca50d77 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.83-beta +0.4.84-beta diff --git a/public/js/core.js b/public/js/core.js index 7f86d7d..6b04009 100644 --- a/public/js/core.js +++ b/public/js/core.js @@ -2,7 +2,7 @@ "use strict"; /* version — shown until /api/version resolves (or if the fetch fails, e.g. offline). Kept in sync by hand with the VERSION file at the repo root on every release. */ -const VERSION = "0.4.83-beta"; +const VERSION = "0.4.84-beta"; /* Safari en oudere mobiele browsers behandelen 100vh/100% soms als de hoogte achter hun adres- en navigatiebalk. visualViewport geeft de werkelijk zichtbare hoogte; de CSS gebruikt deze pixelwaarde als betrouwbare bron en diff --git a/public/js/widgets/coloring-scenes-junior.js b/public/js/widgets/coloring-scenes-junior.js index dca518a..d85e809 100644 --- a/public/js/widgets/coloring-scenes-junior.js +++ b/public/js/widgets/coloring-scenes-junior.js @@ -199,3 +199,57 @@ function plateExcavator(){ coloringLine("M 44 540 L 80 540 M 468 548 L 504 548",2),2) ); } + +function plateHedgehog(){ + /* proefplaat in een rondere, zachtere stijl: grote kop-en-lijf-in-één vorm + met een spitse neus (dezelfde aanpak als bij giraffe/zebra dit seizoen), + en de stekels als een paar losse, dikke plukken in plaats van tientallen + piepkleine lijntjes. De stekels horen bij de herkenning van het dier, + dus die staan op tier 1 - niet weggestopt achter niveau 2. */ + return coloringScene("hedgehog-forest", + coloringBackdrop("sky","#3fae6a")+ + coloringFlat("cloud",coloringCloudPath(560,34,150,46),"#ffffff")+ + coloringFlat("far-hill","M 4 420 C 120 392 240 400 356 416 C 480 432 610 424 796 396 L 796 500 L 4 500 Z","#2fb7a8")+ + coloringFlat("meadow","M 4 500 L 796 500 L 796 596 L 4 596 Z","#f7c948")+ + coloringGroup("back-tree", + /* een echte boomvorm: de stam is breed bij de grond en smalt naar + boven toe (net als de getapte poten van giraffe/zebra dit seizoen, + maar dan omgekeerd), splitst in twee takken, en de kroon bestaat uit + drie overlappende ronde plukken in plaats van één gladde ovaal - + zo lezen echte cartoonbomen ook */ + coloringContour("back-tree-trunk",coloringLegPath(690,280,500,30,42,74,0),"#8b5a3c")+ + coloringLine("M 690 300 C 660 290 630 278 605 258 M 690 300 C 720 290 750 278 775 258")+ + coloringCircle("back-tree-crown-left",630,220,75,"#3fae6a")+ + coloringCircle("back-tree-crown-top",695,168,92,"#3fae6a")+ + coloringCircle("back-tree-crown-right",762,225,72,"#3fae6a")+ + coloringGroup("back-tree-bark",coloringLine("M 668 340 C 664 380 664 440 668 496 M 712 340 C 708 380 708 440 712 496",2),2))+ + coloringGroup("mushrooms", + coloringFlat("mushroom-a-cap","M 96 468 C 96 444 118 428 144 428 C 170 428 192 444 192 468 Z","#e0554d")+ + coloringFlat("mushroom-a-stem","M 128 468 L 160 468 L 156 508 L 132 508 Z","#f2b38f")+ + coloringGroup("mushroom-a-spots", + coloringCircle("spot-a1",132,444,8,"#ffffff"),2))+ + coloringGroup("hedgehog", + /* vier poten (veraf-paar eerst, dichtbij-paar na de romp) in plaats + van twee losse stompjes - een egel in zijaanzicht staat op vier + poten, ook al zijn ze klein en simpel. De stekels liggen nu dicht + tegen elkaar aan zodat er geen huidkleur meer tussen de plukken + doorschijnt. */ + coloringFlat("hedgehog-leg-front-far","M 246 480 L 246 506 C 246 516 252 520 258 512 C 264 520 270 516 270 506 L 270 480 Z","#f2b38f")+ + coloringFlat("hedgehog-leg-back-far","M 430 474 L 430 498 C 430 508 436 512 442 504 C 448 512 454 508 454 498 L 454 474 Z","#f2b38f")+ + /* de romp is nu één vorm met een echte, scherpe zigzag-rand voor de + stekels, in plaats van een gladde romp met losse afgeronde + "bladvormige" plukjes erbovenop geplakt - dat laatste las als bloem- + blaadjes, niet als stekels. Gebaseerd op een publiek-domein + egel-lijntekening (openclipart.org), niet overgenomen. De buik is nu + één rustige boog (was een dubbele bult) zodat de poten er voorspel- + baar onderuit steken in plaats van er doorheen te kruisen. */ + coloringContour("hedgehog-body","M 155 395 C 148 378 158 360 195.9 356.6 L 161.9 317.7 L 216.6 327 L 193.6 282.2 L 244.4 302.4 L 233.7 254.2 L 277.9 284.2 L 280.1 235 L 315.2 273.2 L 330.2 225.8 L 354.5 270.1 L 381.3 227 L 393.4 275 L 430.8 238.5 L 430.1 287.7 L 476 259.8 L 462.4 307.5 L 514.4 289.6 L 488.7 333.3 L 543.9 326.5 L 507.6 363.8 C 526 388 524 416 508 440 C 496 462 476 478 452 486 C 420 496 380 496 344 488 C 308 496 268 496 236 486 C 212 478 192 462 178 440 C 164 420 156 408 155 395 Z","#f2b38f")+ + coloringFlat("hedgehog-leg-front-near","M 278 486 L 278 514 C 278 524 285 528 291 520 C 297 528 304 524 304 514 L 304 486 Z","#f2b38f")+ + coloringFlat("hedgehog-leg-back-near","M 402 482 L 402 510 C 402 520 409 524 415 516 C 421 524 428 520 428 510 L 428 482 Z","#f2b38f")+ + coloringDot(200,338,7)+ + coloringLine("M 178 372 C 186 378 198 378 206 370",2))+ + coloringGroup("leaves", + coloringFlat("leaf-a","M 540 540 C 548 516 570 502 594 506 C 610 510 618 522 616 538 C 596 560 558 560 540 540 Z","#e0554d")+ + coloringLine("M 578 522 L 578 500",3)) + ); +} diff --git a/public/js/widgets/coloring.js b/public/js/widgets/coloring.js index f0393b0..ad0e96a 100644 --- a/public/js/widgets/coloring.js +++ b/public/js/widgets/coloring.js @@ -140,7 +140,8 @@ const COLORING_PAGES=Object.freeze([ {id:"eco-city",theme:"science",years:[7,8],title:{nl:"Duurzame stad",en:"Sustainable city"},svg:plateEcoCity()}, {id:"mandala",theme:"culture",years:[7,8],title:{nl:"Geometrische mandala",en:"Geometric mandala"},svg:plateMandala()}, {id:"ecosystem",theme:"nature",years:[7,8],title:{nl:"Leven rond de vijver",en:"Life around the pond"},svg:plateEcosystem()}, - {id:"savanna-web",theme:"animals",years:[7,8],title:{nl:"Leven op de savanne",en:"Life on the savanna"},svg:plateSavanna()} + {id:"savanna-web",theme:"animals",years:[7,8],title:{nl:"Leven op de savanne",en:"Life on the savanna"},svg:plateSavanna()}, + {id:"hedgehog-forest",theme:"nature",years:[1,2],title:{nl:"Egeltje in het bos",en:"Little hedgehog in the forest"},svg:plateHedgehog()} ]); function coloringPagesFor(yearGroup,theme="all"){ diff --git a/test/coloring.test.js b/test/coloring.test.js index 49f537e..d0b83e9 100644 --- a/test/coloring.test.js +++ b/test/coloring.test.js @@ -80,11 +80,13 @@ test('kleurplatenwidget laadt vóór het bord en is als creatieve leerlingwidget test('elk leerjaar heeft vijf platen met alle thema\'s, gesloten vakken en een kleurwijzer',async()=>{ const {api}=await coloringContext(); const pages=JSON.parse(JSON.stringify(api.pages)); - assert.equal(pages.length,20); + /* minstens de vijf gecureerde platen per band; extra proefplaten (zoals + een nog-niet-goedgekeurde bonusplaat) mogen de kern niet verdringen */ + assert.ok(pages.length>=20,'minstens twintig platen in de atlas'); assert.equal(new Set(pages.map(page=>page.id)).size,pages.length); for(let year=1;year<=8;year++){ const suitable=JSON.parse(JSON.stringify(api.pagesFor(year))); - assert.equal(suitable.length,5,`groep ${year} heeft vijf kleurplaten`); + assert.ok(suitable.length>=5,`groep ${year} heeft minstens vijf kleurplaten`); assert.ok(suitable.every(page=>year>=page.years[0]&&year<=page.years[1])); assert.equal(new Set(suitable.map(page=>page.theme)).size,5,`groep ${year} heeft alle vijf thema's`); }