diff --git a/VERSION b/VERSION index 555d7ba..cd94665 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.64-beta +0.4.65-beta diff --git a/db/024_creative_pupil_levels.sql b/db/024_creative_pupil_levels.sql new file mode 100644 index 0000000..dd6170f --- /dev/null +++ b/db/024_creative_pupil_levels.sql @@ -0,0 +1,7 @@ +-- Kleurplaten gebruiken dezelfde klas-standaard-met-leerling-override als de +-- andere vakgebieden. Bestaande niveaukeuzes blijven ongewijzigd; alleen de +-- toegestane waarde 'creatief' wordt aan de constraint toegevoegd. +ALTER TABLE pupil_levels DROP CONSTRAINT IF EXISTS pupil_levels_subject_check; +ALTER TABLE pupil_levels + ADD CONSTRAINT pupil_levels_subject_check + CHECK (subject IN ('taal','rekenen','world','creatief')); diff --git a/public/css/coloring.css b/public/css/coloring.css new file mode 100644 index 0000000..2e2e7df --- /dev/null +++ b/public/css/coloring.css @@ -0,0 +1,46 @@ +/* Thematische kleurplaten */ +.coloring-app{height:100%;min-height:0;display:flex;flex-direction:column;background:var(--surface);color:var(--ink)} +.coloring-choices,.coloring-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 10px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--orange) 7%,var(--surface))} +.coloring-choices label{display:grid;grid-template-columns:auto minmax(120px,1fr);align-items:center;gap:6px;color:var(--muted);font-size:11px;font-weight:850} +.coloring-choices select{height:34px;max-width:230px;border:1px solid var(--line);border-radius:9px;padding:0 28px 0 9px;background:var(--surface);color:var(--ink);font:inherit;font-weight:750} +.coloring-fit{margin-left:auto;padding:5px 9px;border-radius:999px;background:var(--surface);color:var(--muted);font-size:11px;font-weight:800;white-space:nowrap} +.coloring-tools{gap:6px;background:var(--surface)} +.coloring-tool-buttons,.coloring-palette,.coloring-sizes{display:flex;align-items:center;gap:4px;padding:3px;border-radius:11px;background:var(--surface-2)} +.coloring-tools button{width:36px;height:36px;display:grid;place-items:center;border:0;border-radius:9px;background:transparent;color:var(--ink);font:inherit;font-size:18px;cursor:pointer} +.coloring-tools button:is(:hover,:focus-visible),.coloring-tools button.on{background:var(--surface);box-shadow:0 1px 5px rgba(30,50,90,.18)} +.coloring-tool-buttons button.on{outline:2px solid var(--orange);outline-offset:-2px} +.coloring-color i{width:22px;height:22px;display:block;border:1px solid rgba(38,52,74,.22);border-radius:50%;box-shadow:inset 0 0 0 1px rgba(255,255,255,.18)} +.coloring-color.on{outline:2.5px solid var(--ink);outline-offset:-3px} +.coloring-size i{display:block;border-radius:50%;background:var(--ink)} +.coloring-size.on{outline:2px solid var(--orange);outline-offset:-2px} +.coloring-custom{display:flex;align-items:center;gap:5px;color:var(--muted);font-size:10px;font-weight:800} +.coloring-custom input{width:36px;height:36px;padding:3px;border:1px solid var(--line);border-radius:9px;background:var(--surface);cursor:pointer} +.coloring-tools .coloring-reset{margin-left:auto;background:var(--red-soft);color:var(--red)} +.coloring-tools .coloring-done{width:auto;min-width:112px;padding:0 12px;color:#fff;font-size:13px} +.coloring-stage{flex:1;min-height:0;overflow:auto;display:grid;place-items:center;padding:12px;background:linear-gradient(135deg,var(--surface-2),color-mix(in srgb,var(--purple) 5%,var(--surface)))} +.coloring-paper{position:relative;width:min(100%,900px);aspect-ratio:4/3;flex:none;overflow:hidden;border:1px solid var(--line);border-radius:16px;background:#fff;box-shadow:0 10px 28px rgba(30,50,90,.14);isolation:isolate} +.coloring-art,.coloring-paper canvas{position:absolute;inset:0;width:100%;height:100%} +.coloring-art svg{width:100%;height:100%;display:block;background:#fff} +.coloring-art [hidden]{display:none} +.coloring-paper canvas{z-index:2;touch-action:none;cursor:crosshair;mix-blend-mode:multiply} +.coloring-app[data-tool="bucket"] .coloring-art{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Ctext y='24' font-size='23'%3E%F0%9F%AA%A3%3C/text%3E%3C/svg%3E") 6 24,pointer} +.coloring-app[data-tool="bucket"] .coloring-art [data-fillable]{pointer-events:all} +.coloring-hint{min-height:30px;padding:7px 11px;color:var(--muted);font-size:11px;font-weight:700;text-align:center;background:var(--surface)} +.widget[data-widget="coloring"]{--widget-accent:var(--orange)} + +@media(max-width:620px){ + .coloring-choices,.coloring-tools{padding:6px;gap:4px} + .coloring-choices label{grid-template-columns:1fr;gap:2px;flex:1;min-width:125px} + .coloring-choices select{width:100%;max-width:none;height:32px} + .coloring-fit{width:100%;margin:0;text-align:center} + .coloring-tools button{width:32px;height:32px;font-size:16px} + .coloring-color i{width:18px;height:18px} + .coloring-custom span{display:none}.coloring-custom input{width:32px;height:32px} + .coloring-tools .coloring-reset{margin-left:0} + .coloring-tools .coloring-done{min-width:90px;font-size:11px} + .coloring-stage{place-items:start center;padding:6px} + .coloring-paper{min-width:360px;border-radius:10px} + .coloring-hint{font-size:10px} +} +@media(pointer:coarse){.coloring-tools button,.coloring-custom input{min-width:40px;min-height:40px}.coloring-choices select{min-height:40px}} +@media(prefers-reduced-motion:reduce){.coloring-app *{scroll-behavior:auto!important}} diff --git a/public/index.html b/public/index.html index a3c7284..fddacc4 100644 --- a/public/index.html +++ b/public/index.html @@ -7,6 +7,7 @@ +