From 6e6434b0165cbe736452a6f347c2403f44495007 Mon Sep 17 00:00:00 2001 From: John Wallace Date: Sat, 17 Oct 2026 07:38:16 -0400 Subject: [PATCH] Publish interactive Volt Graphics workflow and controls review --- CLAUDE.md | 10 + review-feedback.js | 2 +- .../reviews/volt-graphics/catalog.json | 1617 +++++++++++++++++ site-assets/reviews/volt-graphics/index.html | 19 + .../volt-graphics/renders/broadcast.png | Bin 0 -> 1722 bytes .../volt-graphics/renders/centered-title.png | Bin 0 -> 2124 bytes .../volt-graphics/renders/clock-panel.png | Bin 0 -> 3205 bytes .../volt-graphics/renders/compact-solid.png | Bin 0 -> 1945 bytes .../volt-graphics/renders/corner-logo.png | Bin 0 -> 9712 bytes .../renders/corporate-lower-third.png | Bin 0 -> 1895 bytes .../volt-graphics/renders/logo-accent.png | Bin 0 -> 3695 bytes .../volt-graphics/renders/minimal-accent.png | Bin 0 -> 1426 bytes .../renders/transparent-name.png | Bin 0 -> 1542 bytes site-assets/reviews/volt-graphics/review.css | 1 + site-assets/reviews/volt-graphics/review.js | 24 + tests/review-feedback.test.mjs | 2 + 16 files changed, 1674 insertions(+), 1 deletion(-) create mode 100644 site-assets/reviews/volt-graphics/catalog.json create mode 100644 site-assets/reviews/volt-graphics/index.html create mode 100644 site-assets/reviews/volt-graphics/renders/broadcast.png create mode 100644 site-assets/reviews/volt-graphics/renders/centered-title.png create mode 100644 site-assets/reviews/volt-graphics/renders/clock-panel.png create mode 100644 site-assets/reviews/volt-graphics/renders/compact-solid.png create mode 100644 site-assets/reviews/volt-graphics/renders/corner-logo.png create mode 100644 site-assets/reviews/volt-graphics/renders/corporate-lower-third.png create mode 100644 site-assets/reviews/volt-graphics/renders/logo-accent.png create mode 100644 site-assets/reviews/volt-graphics/renders/minimal-accent.png create mode 100644 site-assets/reviews/volt-graphics/renders/transparent-name.png create mode 100644 site-assets/reviews/volt-graphics/review.css create mode 100644 site-assets/reviews/volt-graphics/review.js diff --git a/CLAUDE.md b/CLAUDE.md index 53b3ccb..3e0b715 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1737,3 +1737,13 @@ a preservation requirement rather than a claim of complete web simulation. Keep it distinct from the simulated mockup. Synthetic API captures exclude GPU video/scopes; installed, physical/high-DPI and live meeting acceptance remain open. Its feedback link reuses the existing sources-table-v1 private form. + +## Volt graphics review page + +`site-assets/reviews/volt-graphics/` is the standalone Pro graphics design review +(no main-header link). Its images are native DirectWrite/D2D/WIC reference +thumbnails; its browser controls simulate workflows and do not control the app. +`review-feedback.js` isolates `volt-graphics-v1` notes in the existing private KV +service. Rebuild with `npm run build`; publish through Deploy Site when the local +Cloudflare login is unavailable. Do not describe this page as an installed beta +or claim full-output qualification from its reference images. diff --git a/review-feedback.js b/review-feedback.js index 62cfe26..9ecfcd2 100644 --- a/review-feedback.js +++ b/review-feedback.js @@ -1,5 +1,5 @@ const AREAS = new Set(['Overall workflow','Source list and identity','Layout and compact view','Picture controls and live edits','Audio controls','Lower-third text','Live versus draft behavior','Health and status clarity']); -const REVIEWS = new Map([['sources-table-v1',AREAS],['sources-workspace-v1',AREAS],['workflow-review-v1',new Set(['Overall workflow','Source list and identity','Lower-third designer','Grade curves and scope ROI','Preservation requirements'])],['operator-uiux-v1',new Set(['Overall workflow','Starter scenes','Lower-third designer','Shared sliders and resets','Grade curves and scope ROI','Settings and Health','Source list and identity'])]]); +const REVIEWS = new Map([['volt-graphics-v1',new Set(['Overall workflow','Template library','Live operation','Designer controls','Styles and brand','Animation and clocks','Automation rules','Preservation and gaps'])],['sources-table-v1',AREAS],['sources-workspace-v1',AREAS],['workflow-review-v1',new Set(['Overall workflow','Source list and identity','Lower-third designer','Grade curves and scope ROI','Preservation requirements'])],['operator-uiux-v1',new Set(['Overall workflow','Starter scenes','Lower-third designer','Shared sliders and resets','Grade curves and scope ROI','Settings and Health','Source list and identity'])]]); const VERDICTS = new Set(['changes','approve','question']); const SCENARIOS = new Set(['populated','offline','returns','unassigned']); const response = (value,status=200)=>new Response(JSON.stringify(value),{status,headers:{'content-type':'application/json; charset=utf-8','cache-control':'no-store','x-content-type-options':'nosniff','x-robots-tag':'noindex, nofollow'}}); diff --git a/site-assets/reviews/volt-graphics/catalog.json b/site-assets/reviews/volt-graphics/catalog.json new file mode 100644 index 0000000..e7df7fd --- /dev/null +++ b/site-assets/reviews/volt-graphics/catalog.json @@ -0,0 +1,1617 @@ +{ + "nativeBaseCommit": "ef59d88", + "source": "Native DirectWrite / D2D / WIC reference render, development worktree 2026-10-17", + "limitations": "Native thumbnails of reference appearance, not full-resolution output captures or installed app screenshots. Browser controls simulate intended workflows.", + "templates": [ + { + "family": "lower-third", + "name": "compact-solid", + "runtime": "compatibility", + "templateId": "compact-solid", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 36, + "reason": "", + "state": "ready", + "width": 320, + "url": "renders/compact-solid.png" + } + }, + { + "family": "lower-third", + "name": "minimal-accent", + "runtime": "compatibility", + "templateId": "minimal-accent", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 35, + "reason": "", + "state": "ready", + "width": 320, + "url": "renders/minimal-accent.png" + } + }, + { + "family": "lower-third", + "name": "broadcast", + "runtime": "compatibility", + "templateId": "broadcast", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 35, + "reason": "", + "state": "ready", + "width": 320, + "url": "renders/broadcast.png" + } + }, + { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "bounds": { + "height": 288, + "width": 1440 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "center", + "scale": 1, + "x": 0, + "y": 0 + }, + "definition": { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "bounds": { + "height": 288, + "width": 1440 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "center", + "scale": 1, + "x": 0, + "y": 0 + }, + "family": "title", + "fields": [ + { + "default": "Welcome", + "id": "heading", + "maxLength": 256, + "required": true, + "type": "string" + }, + { + "default": "Live conversation", + "id": "subtitle", + "maxLength": 512, + "type": "string" + }, + { + "default": 64, + "id": "text-size", + "maximum": 120, + "minimum": 24, + "type": "number" + } + ], + "layers": [ + { + "cornerRadius": 18, + "fill": { + "token": "brand.primary" + }, + "height": 288, + "id": "plate", + "type": "rect", + "width": 1440, + "x": 0, + "y": 0 + }, + { + "align": "center", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": { + "field": "text-size" + }, + "fontWeight": 600, + "height": 100, + "id": "heading-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "heading" + }, + "type": "text", + "width": 1344, + "x": 48, + "y": 52 + }, + { + "align": "center", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 32, + "fontWeight": 600, + "height": 58, + "id": "subtitle-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "subtitle" + }, + "type": "text", + "width": 1344, + "x": 48, + "y": 174 + } + ], + "name": "Centered title", + "schemaVersion": 1, + "templateId": "centered-title", + "templateVersion": 1 + }, + "family": "title", + "fields": [ + { + "default": "Welcome", + "id": "heading", + "maxLength": 256, + "required": true, + "type": "string" + }, + { + "default": "Live conversation", + "id": "subtitle", + "maxLength": 512, + "type": "string" + }, + { + "default": 64, + "id": "text-size", + "maximum": 120, + "minimum": 24, + "type": "number" + } + ], + "layers": [ + { + "cornerRadius": 18, + "fill": { + "token": "brand.primary" + }, + "height": 288, + "id": "plate", + "type": "rect", + "width": 1440, + "x": 0, + "y": 0 + }, + { + "align": "center", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": { + "field": "text-size" + }, + "fontWeight": 600, + "height": 100, + "id": "heading-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "heading" + }, + "type": "text", + "width": 1344, + "x": 48, + "y": 52 + }, + { + "align": "center", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 32, + "fontWeight": 600, + "height": 58, + "id": "subtitle-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "subtitle" + }, + "type": "text", + "width": 1344, + "x": 48, + "y": 174 + } + ], + "manifestHash": "64961187a2f04090509a8332b1917f0b13737d7ab1f1a5609f5579f07caf84b0", + "name": "Centered title", + "runtime": "declarative", + "schemaVersion": 1, + "templateId": "centered-title", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 64, + "reason": "", + "state": "ready", + "width": 320, + "url": "renders/centered-title.png" + } + }, + { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "bounds": { + "height": 150, + "width": 420 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "upper-right", + "scale": 1, + "x": -64, + "y": 48 + }, + "definition": { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "bounds": { + "height": 150, + "width": 420 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "upper-right", + "scale": 1, + "x": -64, + "y": 48 + }, + "family": "clock", + "fields": [ + { + "default": "LIVE", + "id": "label", + "maxLength": 128, + "type": "string" + }, + { + "default": "00:00:00", + "id": "time", + "maxLength": 32, + "required": true, + "type": "string" + }, + { + "default": 56, + "id": "text-size", + "maximum": 90, + "minimum": 24, + "type": "number" + } + ], + "layers": [ + { + "cornerRadius": 12, + "fill": { + "token": "brand.primary" + }, + "height": 150, + "id": "plate", + "type": "rect", + "width": 420, + "x": 0, + "y": 0 + }, + { + "align": "center", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 24, + "fontWeight": 600, + "height": 38, + "id": "label-text", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "label" + }, + "type": "text", + "width": 380, + "x": 20, + "y": 12 + }, + { + "align": "center", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": { + "field": "text-size" + }, + "fontWeight": 600, + "height": 76, + "id": "clock-text", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "time" + }, + "type": "text", + "width": 380, + "x": 20, + "y": 55 + } + ], + "name": "Clock and countdown", + "schemaVersion": 1, + "templateId": "clock-panel", + "templateVersion": 1 + }, + "family": "clock", + "fields": [ + { + "default": "LIVE", + "id": "label", + "maxLength": 128, + "type": "string" + }, + { + "default": "00:00:00", + "id": "time", + "maxLength": 32, + "required": true, + "type": "string" + }, + { + "default": 56, + "id": "text-size", + "maximum": 90, + "minimum": 24, + "type": "number" + } + ], + "layers": [ + { + "cornerRadius": 12, + "fill": { + "token": "brand.primary" + }, + "height": 150, + "id": "plate", + "type": "rect", + "width": 420, + "x": 0, + "y": 0 + }, + { + "align": "center", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 24, + "fontWeight": 600, + "height": 38, + "id": "label-text", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "label" + }, + "type": "text", + "width": 380, + "x": 20, + "y": 12 + }, + { + "align": "center", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": { + "field": "text-size" + }, + "fontWeight": 600, + "height": 76, + "id": "clock-text", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "time" + }, + "type": "text", + "width": 380, + "x": 20, + "y": 55 + } + ], + "manifestHash": "15895c8d46681f06592f93063bf3342a176d981451e48e82340a81320a970f89", + "name": "Clock and countdown", + "runtime": "declarative", + "schemaVersion": 1, + "templateId": "clock-panel", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 114, + "reason": "", + "state": "ready", + "width": 320, + "url": "renders/clock-panel.png" + } + }, + { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "assets": [ + { + "file": "assets/5c998247459cadf4c7229c685d5ca8257e92e1154a19767a4be874c69def0d09.png", + "id": "logo", + "sha256": "5c998247459cadf4c7229c685d5ca8257e92e1154a19767a4be874c69def0d09" + } + ], + "bounds": { + "height": 192, + "width": 192 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "upper-right", + "scale": 1, + "x": -64, + "y": 48 + }, + "definition": { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "assets": [ + { + "file": "assets/5c998247459cadf4c7229c685d5ca8257e92e1154a19767a4be874c69def0d09.png", + "id": "logo", + "sha256": "5c998247459cadf4c7229c685d5ca8257e92e1154a19767a4be874c69def0d09" + } + ], + "bounds": { + "height": 192, + "width": 192 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "upper-right", + "scale": 1, + "x": -64, + "y": 48 + }, + "family": "bug", + "fields": [ + { + "default": "logo", + "id": "logo", + "type": "image" + }, + { + "default": true, + "id": "show-logo", + "type": "boolean" + } + ], + "layers": [ + { + "align": "center", + "asset": { + "field": "logo" + }, + "fit": "contain", + "height": 168, + "id": "logo-image", + "type": "image", + "verticalAlign": "center", + "visible": { + "field": "show-logo" + }, + "width": 168, + "x": 12, + "y": 12 + } + ], + "name": "Corner logo bug", + "schemaVersion": 1, + "templateId": "corner-logo", + "templateVersion": 1 + }, + "family": "bug", + "fields": [ + { + "default": "logo", + "id": "logo", + "type": "image" + }, + { + "default": true, + "id": "show-logo", + "type": "boolean" + } + ], + "layers": [ + { + "align": "center", + "asset": { + "field": "logo" + }, + "fit": "contain", + "height": 168, + "id": "logo-image", + "type": "image", + "verticalAlign": "center", + "visible": { + "field": "show-logo" + }, + "width": 168, + "x": 12, + "y": 12 + } + ], + "manifestHash": "5e2a31231137a532fe771b84a56efa4e0fe9eb9f23c36975ce5ef177c9cd63b2", + "name": "Corner logo bug", + "runtime": "declarative", + "schemaVersion": 1, + "templateId": "corner-logo", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 180, + "reason": "", + "state": "ready", + "width": 180, + "url": "renders/corner-logo.png" + } + }, + { + "animations": { + "in": { + "direction": "left", + "durationMs": 400, + "easing": "ease-out", + "type": "slide" + }, + "out": { + "durationMs": 300, + "easing": "linear", + "type": "fade" + } + }, + "bounds": { + "height": 176, + "width": 1050 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "definition": { + "animations": { + "in": { + "direction": "left", + "durationMs": 400, + "easing": "ease-out", + "type": "slide" + }, + "out": { + "durationMs": 300, + "easing": "linear", + "type": "fade" + } + }, + "bounds": { + "height": 176, + "width": 1050 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "family": "lower-third", + "fields": [ + { + "bindable": true, + "default": "", + "id": "name", + "maxLength": 256, + "required": true, + "type": "string" + }, + { + "bindable": true, + "default": "", + "id": "title", + "maxLength": 512, + "required": false, + "type": "string" + } + ], + "layers": [ + { + "cornerRadius": 8, + "fill": { + "token": "brand.primary" + }, + "height": 176, + "id": "plate", + "opacity": 0.92, + "type": "rect", + "width": 1050, + "x": 0, + "y": 0 + }, + { + "children": [ + { + "align": "left", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 42, + "fontWeight": 600, + "height": 62, + "id": "name-text", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "name" + }, + "type": "text", + "width": 1002 + }, + { + "align": "left", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimaryMuted" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 28, + "fontWeight": 400, + "height": 42, + "id": "title-text", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "title" + }, + "type": "text", + "width": 1002 + } + ], + "flow": "vertical", + "gap": 8, + "height": 136, + "id": "text-stack", + "type": "group", + "width": 1002, + "x": 24, + "y": 20 + } + ], + "name": "Corporate lower third", + "schemaVersion": 1, + "templateId": "corporate-lower-third", + "templateVersion": 1 + }, + "family": "lower-third", + "fields": [ + { + "bindable": true, + "default": "", + "id": "name", + "maxLength": 256, + "required": true, + "type": "string" + }, + { + "bindable": true, + "default": "", + "id": "title", + "maxLength": 512, + "required": false, + "type": "string" + } + ], + "layers": [ + { + "cornerRadius": 8, + "fill": { + "token": "brand.primary" + }, + "height": 176, + "id": "plate", + "opacity": 0.92, + "type": "rect", + "width": 1050, + "x": 0, + "y": 0 + }, + { + "children": [ + { + "align": "left", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 42, + "fontWeight": 600, + "height": 62, + "id": "name-text", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "name" + }, + "type": "text", + "width": 1002 + }, + { + "align": "left", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimaryMuted" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 28, + "fontWeight": 400, + "height": 42, + "id": "title-text", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "title" + }, + "type": "text", + "width": 1002 + } + ], + "flow": "vertical", + "gap": 8, + "height": 136, + "id": "text-stack", + "type": "group", + "width": 1002, + "x": 24, + "y": 20 + } + ], + "manifestHash": "b4192a72419d4d18e94d49c9a7df7770953850a566ba866c3a89cf55a43059fc", + "name": "Corporate lower third", + "runtime": "declarative", + "schemaVersion": 1, + "templateId": "corporate-lower-third", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 54, + "reason": "", + "state": "ready", + "width": 320, + "url": "renders/corporate-lower-third.png" + } + }, + { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "assets": [ + { + "file": "assets/5c998247459cadf4c7229c685d5ca8257e92e1154a19767a4be874c69def0d09.png", + "id": "logo", + "sha256": "5c998247459cadf4c7229c685d5ca8257e92e1154a19767a4be874c69def0d09" + } + ], + "bounds": { + "height": 168, + "width": 1060 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "lower-left", + "scale": 1, + "x": 96, + "y": -54 + }, + "definition": { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "assets": [ + { + "file": "assets/5c998247459cadf4c7229c685d5ca8257e92e1154a19767a4be874c69def0d09.png", + "id": "logo", + "sha256": "5c998247459cadf4c7229c685d5ca8257e92e1154a19767a4be874c69def0d09" + } + ], + "bounds": { + "height": 168, + "width": 1060 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "lower-left", + "scale": 1, + "x": 96, + "y": -54 + }, + "family": "lower-third", + "fields": [ + { + "bindable": true, + "default": "Example guest", + "id": "name", + "maxLength": 256, + "required": true, + "type": "string" + }, + { + "bindable": true, + "default": "Producer", + "id": "title", + "maxLength": 512, + "type": "string" + }, + { + "default": 42, + "id": "text-size", + "maximum": 100, + "minimum": 16, + "type": "number" + }, + { + "default": "logo", + "id": "logo", + "type": "image" + }, + { + "default": true, + "id": "show-logo", + "type": "boolean" + } + ], + "layers": [ + { + "cornerRadius": 12, + "fill": { + "token": "brand.primary" + }, + "height": 168, + "id": "plate", + "type": "rect", + "width": 1060, + "x": 0, + "y": 0 + }, + { + "fill": { + "token": "brand.accent" + }, + "height": 168, + "id": "accent", + "type": "rect", + "width": 8, + "x": 0, + "y": 0 + }, + { + "align": "center", + "asset": { + "field": "logo" + }, + "fit": "contain", + "height": 120, + "id": "logo-image", + "type": "image", + "verticalAlign": "center", + "visible": { + "field": "show-logo" + }, + "width": 120, + "x": 24, + "y": 24 + }, + { + "align": "left", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": { + "field": "text-size" + }, + "fontWeight": 600, + "height": 62, + "id": "name-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "name" + }, + "type": "text", + "width": 860, + "x": 168, + "y": 27 + }, + { + "align": "left", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 28, + "fontWeight": 600, + "height": 42, + "id": "secondary-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "title" + }, + "type": "text", + "width": 860, + "x": 168, + "y": 94 + } + ], + "name": "Logo accent lower third", + "schemaVersion": 1, + "templateId": "logo-accent", + "templateVersion": 1 + }, + "family": "lower-third", + "fields": [ + { + "bindable": true, + "default": "Example guest", + "id": "name", + "maxLength": 256, + "required": true, + "type": "string" + }, + { + "bindable": true, + "default": "Producer", + "id": "title", + "maxLength": 512, + "type": "string" + }, + { + "default": 42, + "id": "text-size", + "maximum": 100, + "minimum": 16, + "type": "number" + }, + { + "default": "logo", + "id": "logo", + "type": "image" + }, + { + "default": true, + "id": "show-logo", + "type": "boolean" + } + ], + "layers": [ + { + "cornerRadius": 12, + "fill": { + "token": "brand.primary" + }, + "height": 168, + "id": "plate", + "type": "rect", + "width": 1060, + "x": 0, + "y": 0 + }, + { + "fill": { + "token": "brand.accent" + }, + "height": 168, + "id": "accent", + "type": "rect", + "width": 8, + "x": 0, + "y": 0 + }, + { + "align": "center", + "asset": { + "field": "logo" + }, + "fit": "contain", + "height": 120, + "id": "logo-image", + "type": "image", + "verticalAlign": "center", + "visible": { + "field": "show-logo" + }, + "width": 120, + "x": 24, + "y": 24 + }, + { + "align": "left", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": { + "field": "text-size" + }, + "fontWeight": 600, + "height": 62, + "id": "name-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "name" + }, + "type": "text", + "width": 860, + "x": 168, + "y": 27 + }, + { + "align": "left", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 28, + "fontWeight": 600, + "height": 42, + "id": "secondary-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "title" + }, + "type": "text", + "width": 860, + "x": 168, + "y": 94 + } + ], + "manifestHash": "298a499c42f5adceacaaa38f58a21137fffcc0155e7be79e8fbd2dce9f6279f9", + "name": "Logo accent lower third", + "runtime": "declarative", + "schemaVersion": 1, + "templateId": "logo-accent", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 51, + "reason": "", + "state": "ready", + "width": 320, + "url": "renders/logo-accent.png" + } + }, + { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "bounds": { + "height": 148, + "width": 1120 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "lower-left", + "scale": 1, + "x": 96, + "y": -54 + }, + "definition": { + "animations": { + "in": { + "durationMs": 250, + "easing": "ease-out", + "type": "fade" + }, + "out": { + "durationMs": 200, + "easing": "ease-in", + "type": "fade" + } + }, + "bounds": { + "height": 148, + "width": 1120 + }, + "brandTokens": [ + "brand.primary", + "brand.onPrimary", + "brand.onPrimaryMuted", + "brand.fontBody", + "brand.accent" + ], + "canvas": { + "height": 1080, + "width": 1920 + }, + "defaultPlacement": { + "anchor": "lower-left", + "scale": 1, + "x": 96, + "y": -54 + }, + "family": "lower-third", + "fields": [ + { + "bindable": true, + "default": "Example guest", + "id": "name", + "maxLength": 256, + "required": true, + "type": "string" + }, + { + "bindable": true, + "default": "Producer", + "id": "title", + "maxLength": 512, + "type": "string" + }, + { + "default": 42, + "id": "text-size", + "maximum": 100, + "minimum": 16, + "type": "number" + } + ], + "layers": [ + { + "fill": { + "token": "brand.accent" + }, + "height": 132, + "id": "accent", + "type": "rect", + "width": 6, + "x": 0, + "y": 0 + }, + { + "align": "left", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": { + "field": "text-size" + }, + "fontWeight": 600, + "height": 64, + "id": "name-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "name" + }, + "type": "text", + "width": 1090, + "x": 24, + "y": 8 + }, + { + "align": "left", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 28, + "fontWeight": 600, + "height": 42, + "id": "secondary-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "title" + }, + "type": "text", + "width": 1090, + "x": 24, + "y": 82 + } + ], + "name": "Transparent name", + "schemaVersion": 1, + "templateId": "transparent-name", + "templateVersion": 1 + }, + "family": "lower-third", + "fields": [ + { + "bindable": true, + "default": "Example guest", + "id": "name", + "maxLength": 256, + "required": true, + "type": "string" + }, + { + "bindable": true, + "default": "Producer", + "id": "title", + "maxLength": 512, + "type": "string" + }, + { + "default": 42, + "id": "text-size", + "maximum": 100, + "minimum": 16, + "type": "number" + } + ], + "layers": [ + { + "fill": { + "token": "brand.accent" + }, + "height": 132, + "id": "accent", + "type": "rect", + "width": 6, + "x": 0, + "y": 0 + }, + { + "align": "left", + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": { + "field": "text-size" + }, + "fontWeight": 600, + "height": 64, + "id": "name-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "name" + }, + "type": "text", + "width": 1090, + "x": 24, + "y": 8 + }, + { + "align": "left", + "collapseWhenEmpty": true, + "color": { + "token": "brand.onPrimary" + }, + "font": { + "token": "brand.fontBody" + }, + "fontSize": 28, + "fontWeight": 600, + "height": 42, + "id": "secondary-label", + "lineHeight": 1.2, + "maxLines": 1, + "overflow": "ellipsis", + "text": { + "field": "title" + }, + "type": "text", + "width": 1090, + "x": 24, + "y": 82 + } + ], + "manifestHash": "d68b3e08ded3c4497c2f921ab5afb8ad441dfdc6001c23f9fff86ad2a8dee593", + "name": "Transparent name", + "runtime": "declarative", + "schemaVersion": 1, + "templateId": "transparent-name", + "templateVersion": 1, + "thumbnail": { + "appearance": "reference", + "backend": "d3d11-native", + "height": 42, + "reason": "", + "state": "ready", + "width": 320, + "url": "renders/transparent-name.png" + } + } + ] +} diff --git a/site-assets/reviews/volt-graphics/index.html b/site-assets/reviews/volt-graphics/index.html new file mode 100644 index 0000000..bea1ac3 --- /dev/null +++ b/site-assets/reviews/volt-graphics/index.html @@ -0,0 +1,19 @@ +Volt Graphics · CoreVideo review +
COREVIDEO PRO
PRODUCT REVIEW / 01 17 OCT 2026
+

OVERLAYS · LOWER THIRDS · BRAND · AUTOMATION

Volt Graphics.

Build a look privately. Cue it with confidence.
Put it on air when you decide.

+ +

01 / THE WORKSPACE

One library. A private canvas. Explicit live controls.

BROWSER SIMULATION
+
+
+
PRIVATE DRAFTChoose a look
ACCEPTED CUENothing cued
PROGRAMHidden
+
Private native reference
EXAMPLE SOURCE · NOT CONNECTED TO A MEETING
Native rendered graphic reference1920 × 1080 reference canvas
+
Native thumbnail · reference appearance. Not a full-resolution output capture.PRIVATE

Choose a look to explore. Nothing is on air.

+
+ +
+
+

02 / REVIEW ONE REAL TASK

Introduce a guest, then change their title.

1

Choose & bind

Select Logo accent. Create a hidden cue. Choose the exact current subject; source name/title overrides and explicit blanks remain available.

2

Build privately

Edit text, style and placement. Open Design layers for text boxes, groups, images, fills and gradients. Compare and Undo remain local.

3

Cue, then Show

Cue accepts a complete revision on Preview. Show puts that Cue on Program after native preparation. Editing a later draft cannot change the accepted Cue.

4

Update & recover

Change the title, then Update on air. Hide or Clear. Save and restore hidden; explicitly rebind sources and re-arm automation.

Review question: can you tell, at every step, what is private, what is cued, and what is actually on Program?

Leave workflow feedback ↗
+

03 / FULL GRAPHICS OPTIONS

The controls, grouped by the job.

+

04 / PRESERVATION & ACCEPTANCE

Keep the wins. Make the gaps visible.

PRESERVE

Existing production behavior

  • All three legacy looks, saved appearances, source naming and intentionally blank secondary lines.
  • Scene/Tiles layers, transforms, grades and scopes-only ROI.
  • Captions and the webcam-only OH framer/LUFS overlay retain their separate controls.
  • Source ISOs stay clean. Graphics do not alter recording, stream destinations, camera registration or audio settings.
  • Old/new lower-third authorities never render the same family together.
STILL TO QUALIFY

This is not a finished beta claim

  • Remaining package/logo repair, saved workflow and migration integration.
  • Qualified automation, manual priority and the director-to-native execution trace.
  • Complete cue-rack polish and end-to-end native UI workflow review.
  • Enabled-output pixels and scheduled deadlines, packaged launch, and sustained real-meeting acceptance.
  • Windows evidence does not establish Metal/macOS or physical-display continuity.

The installed app has not been replaced. Your design feedback will shape the complete review candidate; no issue closes from approving this webpage.

+

05 / YOUR REVIEW

What should feel different?

No login needed. Submitted notes are saved privately for CoreVideo for 180 days. Unsent drafts stay in this browser. Mention the look, workflow step or control you mean.

+
CoreVideo Pro · Volt Graphics review · Native reference renders + interactive design simulation.
No meeting credentials, live video or production controls are connected to this page.
\ No newline at end of file diff --git a/site-assets/reviews/volt-graphics/renders/broadcast.png b/site-assets/reviews/volt-graphics/renders/broadcast.png new file mode 100644 index 0000000000000000000000000000000000000000..7e95e75ae69a133bbba68d9fb6c4f41997c0c080 GIT binary patch literal 1722 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 literal 0 HcmV?d00001 diff --git a/site-assets/reviews/volt-graphics/renders/compact-solid.png b/site-assets/reviews/volt-graphics/renders/compact-solid.png new file mode 100644 index 0000000000000000000000000000000000000000..38eea2806e0175c9fe4fb3032ef7423da01fe811 GIT binary patch literal 1945 zcmV;K2WI$*P)Px#1ZP1_K>z@;j|==^1pojCLrFwIRCr$P-G59Q=NSj^=Zt?~`wnbyjSVRafne4t zS~?|dwSSmY@ITvXVgwzj9t=TgN==`&F!BYaXmi*QG-bpWn`o>?X zK7ZGy^}Tyt3pAY%2qBc^XrRx|%cu*SC4xSe3`SZp{18I9f&k(qH4{0?0fIijE+T|b zwxem{H4Xs5Wfu@aDC^O5K8Jk_A%t=T1|UKxXJG&$gmM-JAVMf-VE`h8a@M*581Q?Q z=?}YoOwJzjxCH!O<wOae7 z0l!ySudWjS0Jxlvl55wl%9z;@vs}J*?Wzm_U}$ilINr?>U6CX0Dw-{O5ySxp{*sO0DSh@XZTF04Gj(y zYc$&6^z`)7>66DPCLCH`YYhPan9Y9-E0pE_6DLm1?*8E}Ui#9IDxip_=9VA;KvVOp zFUP`*-Y61&r;c zh}ql`1^_UdJHq=9y!e3K3n8?5WfTbM*8n@adm`{K=v1m|UcLJH{JuWR{Ad6DEa~=m zQb&$7i0t+;`MGmv3fX-$8f|dcHWGI_UCBr|OgA+j4Gr5y;xjYBC5c2rFyov~SJK#S ziVWLE;vUbv#F_U^udigS z-jlwmRCRR~cW7{+m>sqVp{*yQ08GCIIBXkN-Kax=v72qvE<;cN6J#W4kF5jm78}4(t6=PbRBY$gtLp@YHa%HWqgvkhVLlRBqDV2p)RmMx0 z6(xCYw@VQSOsCj=G8LQ&E_HU8CHv#(EtD!FIu7i0R5J}q8ASA6HfZ3md|&! z-fp)`5%7DJZ~o?V!N2b~62^8@WZ=q`g-PF3N_+T__}hd&Lg?`$>P9WJr~69i%lF4( z?Bf4J!0%Pwx^;W;ySSk+`r(L7Op=^Ed!CzS*APOvC!-nQR%NyJOW!h{EdT)M?dg_0 zS^gx~H#xcCnJGdjyJU3$`o8!gwQv8=g#o`;S+9OR|L)z1Dq)M-mlpd@Vv+HZA(rdo4IRQclZ6<35 zps-xd1pt^ZSwqsjPvr~0SAzdS6Cso}*1QW`dazb3swm@4n5?0i-~O`b%d0o%OAr2p zjDIzodNBHNjCn5HCgVDO-SO2*v%aXumzcUdI=}0DtBe_wC*TnP0MoYH(UPD3SWG99 z^y2LNQrv$(N!4uUFWe8NK7ackbL?ISA@nG%IRgX$DA-lOSDk8*#-{Ekga7(8o(xBq zCQQ~)aqZJW_n-ehJ7Kbh=03T%SbDHloG0KB6DDiOcj@}7n-XwIA;)#b5_Fxh1dD5* z7Sf3%or))DfvhkO03hZKBryCCLXX3`0XXOIEV|BEf=no-;)$>A;p}?SEDS(|P|o52O%JjUB7{)ZBk1!Sg66!*lZY+=K`gNA2qBb} f2>N^^pVRq29hzyVI!Q*;00000NkvXXu0mjfR!Xi= literal 0 HcmV?d00001 diff --git a/site-assets/reviews/volt-graphics/renders/corner-logo.png b/site-assets/reviews/volt-graphics/renders/corner-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ba364e6961172048096e01f9a1a195fa3ebf30ae GIT binary patch literal 9712 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 literal 0 HcmV?d00001 diff --git a/site-assets/reviews/volt-graphics/renders/logo-accent.png b/site-assets/reviews/volt-graphics/renders/logo-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..69465042679db550b2c964cb2b116c14551f5907 GIT binary patch literal 3695 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 literal 0 HcmV?d00001 diff --git a/site-assets/reviews/volt-graphics/renders/transparent-name.png b/site-assets/reviews/volt-graphics/renders/transparent-name.png new file mode 100644 index 0000000000000000000000000000000000000000..f68742993ef83642b79a26a12003e6691f2c6e5d GIT binary patch literal 1542 zcmaJ>c{CJw9RE=>MvP+>efxdyd%y4Zec$K%zTZrDS10%`ja>i$xbtzm zCje4*65A98mB==F8d9R9VmzJf0jpbUM&j%Y#ht(b@bH?Pm;eC)^1vC7^GXO53EaZ8 zPHM?4Es_emLtc(Rv0fi=etTb}=jyy(?alJIFT+nyP;uL1dOJ<8z<$(WKxdbIB?_nH z45zC(V~2G-$q{RweGXv?{z|o~o_8&~=YJa6ATx?YA;m}eemujkn_T;l@e&j}gOZp$ zj7kvAdQ&9qt%p2FES;5A&LdQU-FcP2UjQ@@n>`&S-jv(KN3)jMQG>1lEJoQnynQj~ABm%|l^2QZBa zOk(AeD^=!Ze3ofaK;kCRIy-;8CKl+?^CLD^47PWAkeOPJH`h()>f*+zw5g^sNvEe# zZ-v4(W8ah!GvnrJ+6Sb+L$XvDWB>Lf&$uj{yr7(xoQqZKn2`s>j`)>7p3S39&-py+ z$;Lz!QO5`R*&&~7JI$aadh^lmqmQ=E1*a6iehpSw&u5^9@m5}KpSSihs5?g!TP8J9 z_W?zC4-Z}T!|+aeei3gIn(Z}r-!OYX9ntYu>0_Hh(GFk~(_9z)iKE_uDHN?}vaF7* z(-#MgaDh^wWwKa;R*fjLb7IB}Bnbh=^%MLfVcEnoJD(!gxWd%e|MA$GTAFc`b&=q% zf^3e@swQUtMj-VdDg9g0@vBbo-95!QUsC(>^6pd#b-H?@8~94V0;7P1g{GhITFelS zC|-Z^E@`1?O8vm8x%;&C)@Mhy+?g>0@<||D`cVp2{y>JurAl%cJyM$r30l+&a_dbc z5<>zLweT}qsj`;kQRKDi<72aj8%&$nQ@ND$FD~keX%WvW!Z(s}Q>RG$6Fq{G^@Vvj zVjCHKxo(m}mv3&C&gH(^DD|~D`KcdPdU(R7)6C+^rFwymWiQI1>D)67#~H7_2(tO} zm^84|JIf}-9ee(Ht8%cdldH-Nc*j;jf4S9r#mSablzf1f&~vASL2$EPRbXB=rT1Hd zB?$;tnrl0tU*V0RWERd^Xo5_yuLp;C1Vj~q0cB4U3d~awA~bgBVnTL1-J!(9p~g{Y zm_xcSw&S!WJP=WBU?DYeHg;`<^tuH^E7O)KlgJV)pU3fjvuG@ISQ}B58mY=X0KjyG z_AA%?ClKDDJgW03>0Rs#tS~mss13a@N0)JNp;g-5MI*j=IdWVlL~6XQkK9$Y>YFzvWTVy$ko+#F6bzB@W_?z-q%z=~ zh;!Co{6f#QMecUvjh1QsWL>9aUxnL^kZ3j2Bdub}GAjqo(QfY&O=)Y^>A8?DzsgD~ z;ES^8V%@{?c8Cti1)m7IH$?mc!T{ ze+wdC$G`bdn)dL*M1bXjIj=!dvq|%R7K+Ee?c$?BW<}Nm8~1X*2+P#9K=f-2#V~iZ zP+dggs@h@BG{+F@lIV1-iKfhihD~7^bSYBl&i9D%)MfVBjQ8T?_pCHILp4 z?#5mf_}Vq8NXFK4@t15=<*rIX3D*NsL60oP@s<7XL^d`~(H&2${rSHkrT?2Ejkcw) X@`zuU literal 0 HcmV?d00001 diff --git a/site-assets/reviews/volt-graphics/review.css b/site-assets/reviews/volt-graphics/review.css new file mode 100644 index 0000000..2ba66d1 --- /dev/null +++ b/site-assets/reviews/volt-graphics/review.css @@ -0,0 +1 @@ +:root{color-scheme:dark;--bg:#101216;--panel:#191d24;--panel2:#202630;--line:#303845;--text:#e8edf4;--muted:#a1adbd;--mint:#5ce2be;--amber:#f0c27a}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:25px}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.55 'Segoe UI',system-ui,sans-serif}button,input,select,textarea{font:inherit}button{cursor:pointer;border:1px solid #424d5b;background:#262d38;color:var(--text);border-radius:6px;padding:8px 11px;transition:background .13s}button:hover{background:#354153}button:disabled{cursor:default;opacity:.42}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--mint);outline-offset:3px}input,select,textarea{width:100%;min-width:0;border:1px solid #414b59;border-radius:5px;color:var(--text);background:#11161d;padding:8px 10px}input[type=checkbox]{width:auto;accent-color:var(--mint)}input[type=range]{padding:0;border:none;accent-color:var(--mint)}input[type=color]{height:35px;padding:3px}label{display:block;font-size:12px;color:#b8c3d0;margin:10px 0}label input,label select{margin-top:5px}.inline{display:flex;align-items:center;gap:6px;margin:0}.inline input{margin:0}p{margin:0 0 12px}a{color:var(--mint);text-decoration:none}header{max-width:1700px;margin:auto;display:flex;align-items:center;justify-content:space-between;padding:25px 40px;border-bottom:1px solid var(--line)}.wordmark{font-size:17px;font-weight:750;letter-spacing:1px;color:white}.wordmark span{color:var(--mint);font-size:10px;vertical-align:top}.review-label{font-size:11px;letter-spacing:1.5px;color:#c9d2df}.review-label span{color:#7f8b9c;margin-left:18px}.feedback-link{font-size:13px}main{max-width:1700px;padding:0 40px;margin:auto}.intro{display:flex;justify-content:space-between;align-items:center;gap:50px;padding:58px 0 40px}.eyebrow{font-size:10px;font-weight:700;letter-spacing:2px;color:var(--mint);margin:0 0 12px}h1{font-size:clamp(38px,5vw,70px);line-height:1.05;letter-spacing:-2.5px;margin:0 0 18px}h2{font-size:27px;letter-spacing:-.6px;line-height:1.25;margin:0 0 18px}h3{font-size:14px;line-height:1.4;margin:0 0 10px}.lede{font-size:21px;color:#b6c3d3;line-height:1.5}.intro-note{max-width:390px;color:#aeb9c8;font-size:13px;border-left:1px solid #455062;padding-left:22px}.badge{display:inline-block;border:1px solid #42515f;color:#bac8d5;letter-spacing:.65px;font-size:9px;font-weight:700;padding:4px 7px;border-radius:4px;white-space:normal}.badge.amber{border-color:#6a5233;color:var(--amber)}.intro-note .badge{margin-bottom:12px}.review-nav{display:flex;gap:30px;flex-wrap:wrap;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:16px 0;margin-bottom:42px;font-size:12px}.review-nav a{color:#b4c0ce}.section-heading{display:flex;justify-content:space-between;gap:20px;align-items:center;margin-bottom:18px}.section-heading h2{margin:0}.workspace{display:grid;grid-template-columns:240px minmax(360px,1fr) 285px;border:1px solid #3a4351;border-radius:10px;background:var(--panel);overflow:hidden;box-shadow:0 30px 80px #0003}.library,.inspector{padding:16px;min-width:0}.library{border-right:1px solid var(--line)}.inspector{border-left:1px solid var(--line)}.panel-title{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}.panel-title h3{margin:0}.text-button{border:none;background:transparent;color:var(--mint);font-size:11px;padding:3px}.template-list{display:grid;gap:7px;max-height:460px;overflow:auto;margin-top:12px;padding-right:3px}.template{border:1px solid #35404e;background:#151a21;border-radius:6px;text-align:left;display:block;padding:9px;width:100%}.template.selected{border-color:var(--mint);box-shadow:inset 3px 0 var(--mint);background:#1c2c2c}.template strong{display:block;font-size:12px}.template small{font-size:10px;color:var(--muted)}.template figure{margin:7px 0 0;padding:6px;background:repeating-conic-gradient(#242b34 0% 25%,#1b222a 0% 50%) 0/14px 14px;height:75px;display:flex;align-items:center;justify-content:center;border-radius:4px}.template figure img{max-height:64px;max-width:100%;object-fit:contain}.template-list.compact figure{display:none}.subsection{margin-top:20px;padding-top:17px;border-top:1px solid var(--line)}.subsection h3{display:flex;justify-content:space-between}.subsection h3 span{font-weight:400;font-size:10px;color:var(--muted)}.rack{display:grid;gap:6px;font-size:12px}.rack button{text-align:left;font-size:11px}.micro{font-size:11px;color:var(--muted);line-height:1.6;margin-top:9px}.muted{color:var(--muted)}.full{width:100%}.primary{background:#59d6b4;color:#09271f;border-color:#59d6b4;font-weight:650}.primary:hover{background:#7deacb}.stage-column{padding:16px;min-width:0;background:#171b22}.modebar{display:flex;gap:5px;border-bottom:1px solid var(--line);padding-bottom:13px;margin-bottom:16px}.modebar button{font-size:12px;background:transparent;border-color:transparent;color:var(--muted)}.modebar [aria-selected=true]{background:#2b3542;border-color:#455363;color:white}.state-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:17px}.state-strip>div{padding:10px;background:#11161d;border:1px solid #303945;border-radius:5px;min-width:0}.state-strip small{font-size:8px;letter-spacing:.8px;color:var(--muted)}.state-strip strong{display:block;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:3px}.state-dot{display:inline-block;width:5px;height:5px;border-radius:50%;background:#95a1b4;margin-right:5px}.state-dot.cue{background:#73a9f4}.state-dot.program{background:#f17b8b}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:10px;padding:0 0 8px;color:var(--muted)}.canvas-toolbar .inline{font-size:10px}.canvas{width:100%;aspect-ratio:16/9;position:relative;overflow:hidden;border:1px solid #404d5b;border-radius:5px;background:radial-gradient(ellipse at 26% 20%,#395263,transparent 45%),radial-gradient(ellipse at 80% 35%,#313f53,transparent 48%),#18232c;isolation:isolate}.source-label{position:absolute;left:12px;top:12px;font-size:8px;letter-spacing:.9px;color:#c0d3dd;background:#13212eb3;border-radius:3px;padding:4px 6px}.subject{position:absolute;inset:11% 18% 0;opacity:.8;overflow:hidden}.subject .head{position:absolute;left:32%;top:10%;width:36%;height:46%;border-radius:46% 46% 43% 43%;background:linear-gradient(120deg,#566e7d,#344e60 60%,#22394c)}.subject .shoulders{position:absolute;left:5%;top:53%;width:90%;height:90%;border-radius:45% 45% 0 0;background:linear-gradient(120deg,#435f70,#273d50 60%,#20364b)}.safe-guide{position:absolute;inset:5%;border:1px dashed #b9d2dc45;pointer-events:none}.canvas-corner{position:absolute;bottom:8px;right:10px;font-size:8px;color:#90aabd}.graphic{position:absolute;z-index:3;object-fit:contain;pointer-events:none}.selection-box{position:absolute;border:1px solid var(--mint);pointer-events:none;z-index:4}.canvas-foot{display:flex;justify-content:space-between;gap:15px;font-size:9px;color:#9eabbc;margin-top:7px;min-height:28px}.canvas-foot span:last-child{color:var(--mint);white-space:nowrap}.transports{display:flex;gap:7px;flex-wrap:wrap;margin-top:8px}.transports button{font-size:11px;padding:9px 11px}.cue-action{background:#243c59;border-color:#5f8ab8}.live-action{background:#4c2632;border-color:#bf6274}.danger-quiet{color:#f39aa7}.action-status{font-size:11px;margin:12px 0;color:#b9c8d8;min-height:32px}.secondary-actions{display:flex;gap:7px;flex-wrap:wrap;border-bottom:1px solid var(--line);padding-bottom:14px}.secondary-actions button{font-size:10px;background:transparent}.inspector-tabs{display:flex;gap:2px;border-bottom:1px solid var(--line);padding-bottom:9px;margin-bottom:12px;flex-wrap:wrap}.inspector-tabs button{border:none;background:none;font-size:11px;padding:5px 7px;color:var(--muted)}.inspector-tabs [aria-selected=true]{background:#2c3845;color:var(--mint)}.range-pair{display:flex;gap:8px;align-items:center}.range-pair input[type=number]{width:64px}.range-pair span{font-size:10px}.callout{border:1px solid #405144;background:#1b2c28;border-radius:6px;padding:12px;font-size:11px;margin:18px 0}.callout p{margin:5px 0 0;color:#b4c7c0}.callout strong{font-size:12px}.two{display:grid;grid-template-columns:1fr 1fr;gap:12px}details{margin-top:16px;border-top:1px solid var(--line);padding-top:12px;color:var(--muted);font-size:11px}summary{cursor:pointer;color:#c5d1df;margin-bottom:9px}dl{font-size:11px}dt{color:#8795a7;margin-top:9px}dd{margin:2px 0 0}.inline-link{display:inline-block;font-size:12px;margin-top:14px}.button-row{display:flex;gap:6px;flex-wrap:wrap}.button-row button{font-size:11px}#design-panel{margin-top:22px}#design-panel>.panel-title{margin-bottom:5px}.design-grid{display:grid;grid-template-columns:42% 1fr;gap:14px;padding:14px 0}.layers{display:grid;gap:4px;max-height:220px;overflow:auto;margin-bottom:10px}.layers button{text-align:left;font-size:11px;padding:7px 8px}.layers button[aria-pressed=true]{border-color:var(--mint);color:var(--mint)}#layer-properties{font-size:11px}#layer-properties label{margin-top:0}.automation-modes{display:flex;gap:7px;flex-wrap:wrap;margin:20px 0 12px}.automation-modes [aria-pressed=true]{border-color:var(--mint);color:var(--mint)}#automation-panel>h3{font-size:23px;margin-top:18px}#automation-panel>p{font-size:13px;color:var(--muted)}.trace{background:#11171e;border:1px solid var(--line);border-radius:5px;padding:12px 12px 12px 30px;max-height:230px;overflow:auto;font-size:11px}.trace li{padding:5px;color:#bdd0da}.walkthrough,#inventory,#preservation,#feedback{margin-top:65px;padding-top:25px;border-top:1px solid var(--line)}.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:25px;margin-top:25px}.steps article b{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid #5c827a;border-radius:50%;color:var(--mint);font-size:12px;margin-bottom:14px}.steps h3{font-size:16px}.steps p{font-size:13px;color:var(--muted)}.review-question{margin-top:24px;color:#cdd9e5;max-width:1000px}.inventory{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:25px}.inventory article{border:1px solid var(--line);border-radius:8px;padding:21px;background:#171c23}.inventory h3{font-size:16px}.inventory ul,.preservation ul{padding-left:18px;font-size:12px;color:#adbbca}.inventory li,.preservation li{margin:7px 0}.inventory .implemented{color:var(--mint)}.inventory .pending{color:var(--amber)}.preservation{display:grid;grid-template-columns:1fr 1fr;gap:30px}.preservation article{padding:23px;border:1px solid var(--line);border-radius:8px}.preservation h3{font-size:18px;margin-top:15px}.review-feedback{max-width:900px;border:1px solid #415348;border-radius:10px;padding:28px!important;background:#18211f}.review-feedback p{color:var(--muted);font-size:13px}.review-feedback form{display:grid;gap:6px}.review-feedback h2{margin-bottom:10px}footer{font-size:11px;color:#8393a7;padding:36px 0 45px;line-height:1.8}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}[hidden]{display:none!important}@media(min-width:1500px){.workspace{grid-template-columns:255px minmax(360px,1fr) 305px}.template figure{height:85px}.template figure img{max-height:74px}}@media(max-width:1150px){.workspace{grid-template-columns:210px minmax(350px,1fr)}.inspector{grid-column:1/-1;border-left:none;border-top:1px solid var(--line)}#properties{display:grid;grid-template-columns:repeat(3,1fr);gap:0 20px}.inspector .private-copy{margin-bottom:0}.canvas-toolbar{flex-wrap:wrap}.steps{grid-template-columns:1fr 1fr}}@media(max-width:760px){header{padding:18px}.review-label{display:none}main{padding:0 16px}.intro{display:block;padding:35px 0 25px}.intro-note{max-width:none;margin-top:25px}.lede{font-size:18px}.review-nav{gap:14px;margin-bottom:30px}.section-heading{display:block}.section-heading>.badge{margin-top:12px}.workspace{display:flex;flex-direction:column}.library{border-right:0;border-bottom:1px solid var(--line)}.template-list{grid-template-columns:repeat(2,minmax(0,1fr));max-height:260px}.library .subsection{margin-top:12px}.stage-column{padding:12px}.inspector{padding:15px}#properties{grid-template-columns:1fr 1fr}.state-strip{gap:5px}.state-strip>div{padding:7px}.state-strip strong{font-size:9px}.canvas-toolbar>span{width:100%}.source-label{font-size:6px;left:7px;top:7px}.canvas-corner{font-size:6px}.inventory,.preservation{grid-template-columns:1fr}.steps{gap:15px}.steps p{font-size:12px}.review-nav a{font-size:11px}h2{font-size:23px}.design-grid{grid-template-columns:1fr}.review-feedback{padding:20px!important}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important}} \ No newline at end of file diff --git a/site-assets/reviews/volt-graphics/review.js b/site-assets/reviews/volt-graphics/review.js new file mode 100644 index 0000000..4eaa462 --- /dev/null +++ b/site-assets/reviews/volt-graphics/review.js @@ -0,0 +1,24 @@ +const $=id=>document.getElementById(id);const clone=value=>structuredClone(value);const esc=value=>String(value??'').replace(/[&<>"']/g,ch=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[ch])); +let templates=[],selected=null,draft=null,original=null,cue=null,program=null,rack=[],saved=null,history=[],tab='content',mode='operate',auto='manual',layerId='',fieldsChanged=false; +const names={'compact-solid':'Compact solid','minimal-accent':'Minimal accent','broadcast':'Broadcast','corporate-lower-third':'Corporate · reference template'}; +const stateName=value=>value?`${value.name} · ${names[value.templateId]||templates.find(t=>t.templateId===value.templateId)?.name||value.templateId}`:'Hidden'; +const status=text=>$('action-status').textContent=text;const snapshot=()=>draft?clone(draft):null; +function edit(change){if(!draft)return;history.push(snapshot());if(history.length>32)history.shift();change(draft);fieldsChanged=true;$('draft-status').textContent='EDITED · NOT APPLIED';$('render-note').textContent='Edited copy / style is simulated. Pixels remain the native reference appearance.';updateCanvas();} +function newDraft(template){return {id:crypto.randomUUID(),templateId:template.templateId,name:'Guest introduction',scope:$('scope').value,fields:Object.fromEntries((template.fields||[]).map(f=>[f.id,f.default??(f.type==='boolean'?false:f.type==='number'?0:'')])),style:{font:'Segoe UI',nameSize:42,titleSize:28,nameColor:'#f4f7fa',titleColor:'#44c1a1',backgroundColor:'#0c1118',accentColor:'#44c1a1',opacity:90,padding:20,width:60,radius:8,showLogo:true},placement:{anchor:template.defaultPlacement?.anchor||'lower-left',x:template.defaultPlacement?.x??96,y:template.defaultPlacement?.y??-54,scale:1},motion:{in:'fade',out:'fade',inMs:250,outMs:200,direction:'down',easing:'ease-out'},layers:clone(template.layers||[])};} +function listTemplates(){const found=templates.filter(t=>($('family').value==='all'||t.family===$('family').value)&&(`${t.name} ${t.templateId}`.toLowerCase().includes($('search').value.toLowerCase())));$('templates').replaceChildren();for(const template of found){const button=document.createElement('button');button.className='template'+(selected?.templateId===template.templateId?' selected':'');button.setAttribute('role','listitem');button.innerHTML=`${esc(names[template.templateId]||template.name)}${esc(template.family)} · v${template.templateVersion}
Native ${esc(template.name)} reference
`;button.onclick=()=>choose(template);$('templates').append(button);}if(!found.length)$('templates').textContent='No matching looks.';} +function choose(template){selected=template;draft=newDraft(template);if(!Object.hasOwn(draft.fields,'name')&&template.runtime==='compatibility'){draft.fields={name:'Example guest',title:'Producer'};}if(draft.fields.name==='')draft.fields.name='Example guest';original=snapshot();history=[];fieldsChanged=false;layerId='';$('draft-status').textContent='PRIVATE REFERENCE';$('render-note').textContent='Native thumbnail · reference appearance. Not a full-resolution output capture.';$('cue-name').value=draft.name;listTemplates();renderInspector();renderLayers();renderState();status('Private library preview. Create a hidden cue before Cue or Show. Program is unchanged.');} +function renderState(){$('draft-label').textContent=draft?stateName(draft):'Choose a look';$('cue-label').textContent=cue?stateName(cue):'Nothing cued';$('program-label').textContent=stateName(program);$('template-fact').textContent=selected?`${selected.templateId} · immutable v${selected.templateVersion}`:'Select a look';$('rack-count').textContent=`${rack.length} / 8`;$('create').disabled=!draft||rack.length>=8;$('cue').disabled=!draft||!rack.some(c=>c.id===draft.id);$('show').disabled=!cue;$('update').disabled=!program||!draft||!rack.some(c=>c.id===draft.id);$('hide').disabled=!program;$('undo').disabled=!history.length;$('rack').replaceChildren();for(const item of rack){const button=document.createElement('button');button.textContent=`${item.name} · ${program?.id===item.id?'ON AIR':cue?.id===item.id?'CUED':'HIDDEN'}`;button.onclick=()=>{draft=clone(item);selected=templates.find(t=>t.templateId===draft.templateId);original=snapshot();history=[];$('cue-name').value=draft.name;listTemplates();renderInspector();renderLayers();renderState();status('Selected a cue. No live action occurred.');};$('rack').append(button);}updateCanvas();} +function updateCanvas(){if(!selected||!draft)return;const view=$('compare').checked&&original?original:draft;const template=templates.find(t=>t.templateId===view.templateId)||selected;const image=$('reference');image.src=template.thumbnail.url;image.alt=`Native ${template.name} reference graphic`;const box=template.bounds||{width:1152,height:130},p=view.placement;const scale=p.scale||1;image.style.width=`${box.width/1920*100*scale}%`;image.style.height='auto';image.style.left='';image.style.right='';image.style.top='';image.style.bottom='';const right=p.anchor.includes('right'),centerX=p.anchor.includes('center')&&!p.anchor.startsWith('center-'),centerY=p.anchor==='center'||p.anchor.startsWith('center-');image.style.left=right?'':centerX?'50%':`${p.x/1920*100}%`;image.style.right=right?`${Math.abs(p.x)/1920*100}%`:'';image.style.top=p.anchor.startsWith('upper')?`${Math.abs(p.y)/1080*100}%`:centerY?'50%':'';image.style.bottom=!p.anchor.startsWith('upper')&&!centerY?`${Math.abs(p.y)/1080*100}%`:'';image.style.transform=`${centerX?'translateX(-50%)':''} ${centerY?'translateY(-50%)':''}`.trim();$('canvas-title').textContent=$('compare').checked?'Original private reference':`${names[template.templateId]||template.name} · private draft`;$('canvas').querySelector('.safe-guide').hidden=!$('safe-guides').checked;} +function input(label,value,callback,options={}){const holder=document.createElement('label');holder.textContent=label;let control;if(options.choices){control=document.createElement('select');for(const choice of options.choices){const option=document.createElement('option');option.value=typeof choice==='object'?choice.value:choice;option.textContent=typeof choice==='object'?choice.label:choice;control.append(option);}control.value=String(value);}else{control=document.createElement('input');control.type=options.type||(typeof value==='boolean'?'checkbox':'text');if(control.type==='checkbox')control.checked=value;else control.value=String(value??'');if(options.min!=null)control.min=options.min;if(options.max!=null)control.max=options.max;if(options.step!=null)control.step=options.step;}control.addEventListener('change',()=>callback(control.type==='checkbox'?control.checked:control.type==='number'?Number(control.value):control.value));holder.append(control);return holder;} +function range(label,value,min,max,step,callback,suffix=''){const holder=document.createElement('label');holder.textContent=label;const pair=document.createElement('div');pair.className='range-pair';const slider=document.createElement('input'),number=document.createElement('input');slider.type='range';number.type='number';for(const control of[slider,number]){control.min=min;control.max=max;control.step=step;control.value=value;control.oninput=()=>{const current=Math.max(min,Math.min(max,Number(control.value)));slider.value=number.value=current;};control.onchange=()=>callback(Number(control.value));}pair.append(slider,number);const unit=document.createElement('span');unit.textContent=suffix;pair.append(unit);holder.append(pair);return holder;} +function renderInspector(){const pane=$('properties');pane.replaceChildren();if(!draft||!selected)return;const add=node=>pane.append(node);if(tab==='content'){add(input('Subject binding','unbound',v=>{edit(d=>d.subject=v);status('Subject choice is simulated. App binding uses an exact native source generation.');},{choices:[{value:'unbound',label:'Unbound · selected scope'},{value:'example',label:'Example guest · current generation'}]}));const descriptors=selected.fields?.length?selected.fields:[{id:'name',type:'string',maxLength:256},{id:'title',type:'string',maxLength:512}];for(const field of descriptors){if(field.id==='time'){const note=document.createElement('p');note.className='micro';note.textContent='Clock time is generated by the native controller; see Clock.';add(note);continue;}const value=draft.fields[field.id]??field.default;const apply=v=>edit(d=>d.fields[field.id]=v);if(field.type==='number')add(range(field.id.replaceAll('-',' '),value,field.minimum??0,field.maximum??100,1,apply));else if(field.type==='color')add(input(field.id,value,apply,{type:'color'}));else if(field.type==='boolean')add(input(field.id.replaceAll('-',' '),value,apply));else if(field.choices?.length)add(input(field.id,value,apply,{choices:field.choices}));else if(field.type==='image')add(input(field.id,value,apply,{choices:[{value:'logo',label:'Verified package logo'}]}));else add(input(field.id==='name'?'Name':field.id==='title'?'Secondary line (blank hides it)':field.id,value,apply));}const note=document.createElement('p');note.className='micro';note.textContent='Use source defaults · retain operator overrides · explicitly hide a secondary line. Example text edits in this webpage do not regenerate native pixels.';add(note);}else if(tab==='look'){add(input('Saved style','Current brand',()=>status('Style selection is a design simulation; applying a style must preserve name/title and intentional blanks.'),{choices:['Current brand','Interview · clean','Broadcast · bold']}));add(input('Font family',draft.style.font,v=>edit(d=>d.style.font=v),{choices:['Segoe UI','Arial','Custom installed font…']}));for(const [key,label]of[['nameColor','Primary text'],['titleColor','Secondary text'],['backgroundColor','Plate'],['accentColor','Accent']])add(input(label,draft.style[key],v=>edit(d=>d.style[key]=v),{type:'color'}));if(selected.runtime==='compatibility'){for(const[key,label,min,max]of[['nameSize','Name size',16,120],['titleSize','Secondary size',12,80],['padding','Padding',0,64],['width','Plate width',15,95],['radius','Corner radius',0,60]])add(range(label,draft.style[key],min,max,1,v=>edit(d=>d.style[key]=v)));add(input('Show logo',draft.style.showLogo,v=>edit(d=>d.style.showLogo=v)));}add(range('Background opacity',draft.style.opacity,0,100,1,v=>edit(d=>d.style.opacity=v),'%'));const note=document.createElement('p');note.className='micro';note.textContent='Declarative typography, padding and fill belong to the template layer inspector. Enabled controls must have a real native consumer; unsupported compatibility controls do not silently pass through.';add(note);}else if(tab==='placement'){add(input('Anchor',draft.placement.anchor,v=>edit(d=>d.placement.anchor=v),{choices:['upper-left','upper-center','upper-right','center-left','center','center-right','lower-left','lower-center','lower-right']}));add(range('Horizontal offset',draft.placement.x,-3840,3840,1,v=>edit(d=>d.placement.x=v),'px'));add(range('Vertical offset',draft.placement.y,-2160,2160,1,v=>edit(d=>d.placement.y=v),'px'));add(range('Scale',draft.placement.scale,.1,4,.05,v=>edit(d=>d.placement.scale=v),'×'));const p=document.createElement('p');p.className='micro';p.textContent='Whole-graphic placement is separate from moving or resizing a selected template layer. App canvas also supports drag/resize, one-pixel nudges and Shift for larger steps.';add(p);}else if(tab==='motion'){for(const phase of['in','out']){add(input(phase==='in'?'Build in':'Build out',draft.motion[phase],v=>edit(d=>d.motion[phase]=v),{choices:['none','fade','slide']}));add(range(`${phase==='in'?'In':'Out'} duration`,draft.motion[phase+'Ms'],0,3000,10,v=>edit(d=>d.motion[phase+'Ms']=v),'ms'));}add(input('Slide direction',draft.motion.direction,v=>edit(d=>d.motion.direction=v),{choices:['left','right','up','down']}));add(input('Easing',draft.motion.easing,v=>edit(d=>d.motion.easing=v),{choices:['linear','ease-in','ease-out','ease-in-out']}));add(input('Hold behavior','Hold until hidden',()=>status('Hold/auto-hide controls are part of remaining integration.'),{choices:['Hold until hidden','Auto-hide after duration']}));}else{const supported=['clock','countdown'].includes(selected.family);const note=document.createElement('p');note.className='micro';note.textContent=supported?'Native clock controls are implemented; this web page displays a fixed native reference. It does not run an actual output clock.':'Choose Wall clock or Countdown in the library to review this controller.';add(note);for(const node of[input('Mode',selected.family==='countdown'?'Countdown':'Wall clock',()=>{}, {choices:['Wall clock','Countdown']}),input('Timezone','Computer local time',()=>{},{choices:['Computer local time','UTC','UTC with fixed offset']}),input('Display','Hours : minutes : seconds',()=>{},{choices:['Hours : minutes','Hours : minutes : seconds']}),range('Countdown duration',300,1,86400,1,()=>{},'s'),input('At zero','Hold at zero',()=>{},{choices:['Hold at zero','Hide graphic','Suggest next cue']})]){node.querySelector('input,select').disabled=!supported;add(node);}const buttons=document.createElement('div');buttons.className='button-row';for(const command of['Apply settings','Start','Pause','Resume','Reset']){const button=document.createElement('button');button.textContent=command;button.disabled=!supported;button.onclick=()=>status(`Clock ${command.toLowerCase()} simulated. Clock state and visibility are separate.`);buttons.append(button);}add(buttons);}} +function flatten(layers,depth=0){return layers.flatMap(layer=>[{...layer,depth},...flatten(layer.children||[],depth+1)]);}function realLayer(id,layers=draft?.layers||[]){for(const layer of layers){if(layer.id===id)return layer;const child=realLayer(id,layer.children||[]);if(child)return child;}return null;} +function renderLayers(){const pane=$('layers');pane.replaceChildren();$('layer-properties').replaceChildren();if(!draft||!selected)return;if(selected.runtime==='compatibility'){pane.textContent='Compatibility look: use Look controls. Declarative looks expose their actual layer tree.';for(const id of['add-layer','layer-up','layer-down','duplicate-layer','save-version'])$(id).disabled=true;return;}for(const id of['add-layer','layer-up','layer-down','duplicate-layer','save-version'])$(id).disabled=false;const rows=flatten(draft.layers).reverse();if(!rows.some(n=>n.id===layerId))layerId=rows[0]?.id||'';for(const node of rows){const button=document.createElement('button');button.style.paddingLeft=(8+node.depth*12)+'px';button.textContent=`${node.type==='group'?'▱':node.type==='image'?'▧':node.type==='text'?'T':'▣'} ${node.id}`;button.setAttribute('aria-pressed',String(node.id===layerId));button.onclick=()=>{layerId=node.id;renderLayers();};pane.append(button);}const node=realLayer(layerId);if(!node)return;const properties=$('layer-properties');properties.append(input('Layer name',node.id,()=>status('Layer identity is stable; friendly labels and locks are edited separately in the app.')));properties.append(input('Visible',node.visible!==false,v=>edit(()=>node.visible=v)));properties.append(input('Lock layer',!!node.metadata?.editorLocked,v=>edit(()=>node.metadata={...node.metadata,editorLocked:v})));for(const key of['x','y','width','height']){const value=typeof node[key]==='number'?node[key]:0;properties.append(range(key,value,key==='width'||key==='height'?1:-3840,key==='width'||key==='height'?8192:3840,1,v=>edit(()=>node[key]=v),'px'));}if(node.type==='text'){properties.append(input('Text / field',typeof node.text==='string'?node.text:`Field: ${node.text?.field||'copy'}`,v=>edit(()=>node.text=v)));properties.append(input('Weight',String(node.fontWeight||400),v=>edit(()=>node.fontWeight=Number(v)),{choices:[{value:'400',label:'Regular · 400'},{value:'500',label:'Medium · 500'},{value:'600',label:'Semibold · 600'},{value:'700',label:'Bold · 700'}]}));properties.append(input('Overflow',node.overflow||'ellipsis',v=>edit(()=>node.overflow=v),{choices:['ellipsis','wrap-then-ellipsis']}));properties.append(input('Maximum lines',String(node.maxLines||1),v=>edit(()=>node.maxLines=Number(v)),{choices:['1','2','3']}));}if(node.type==='rect'){properties.append(input('Fill mode','Solid',()=>status('Solid, two-stop gradients and declared brand roles are supported in the app layer editor.'),{choices:['Solid','Two-stop gradient','Brand role']}));properties.append(input('Fill color',typeof node.fill==='string'?node.fill.slice(0,7):'#0c1118',v=>edit(()=>node.fill=v),{type:'color'}));}if(node.type==='image')properties.append(input('Image fit',node.fit||'contain',v=>edit(()=>node.fit=v),{choices:['contain','cover']}));} +const inventory=[['Library & packages','implemented',['Eight curated looks: 3 legacy lower thirds, logo accent, transparent name, centered title, corner logo, clock/countdown families.','A ninth corporate template remains available as a reference.','Search, family filters, cards/compact view and true native reference thumbnails.','Typed fields, package-local PNG/JPEG, hash checks, named font/asset errors.']],['Private designer','implemented',['Native private canvas; select, move, resize, nudge, safe guides and whole-graphic placement.','Text, rectangles, groups and images; front/back order, visibility, lock, duplicate and reparent.','Exact entry plus sliders; 4 font weights, 1–3 lines, wrap/ellipsis, alignment and bounded boxes.','Solid/two-stop gradient/brand fills; contain/cover image fit; immutable version saves.']],['Live operation','implemented',['Independent private Draft, accepted Cue and Program revisions.','Explicit Cue, Show, Hide, Update and Clear; same values do not replay animation.','Global vs scene scope; exact subject-generation binding and source-text copy.','Preparation failures retain the accepted look; actual draw is distinct from command admission.']],['Brand & styles','implemented',['Name/secondary/plate/accent colours, opacity, installed fonts and brand roles.','Legacy sizing, padding, width, radius and logo scale stay supported.','Declarative style fields are saved separately from guest copy and image choices.','Compare Original/Edited, bounded gesture Undo and explicit Cancel.']],['Motion & controllers','implemented',['Cut, fade and slide; four directions, 0–3000 ms, four easing modes.','Native wall clock: local, UTC or fixed offset; hours/minutes/seconds formats.','Countdown configure/start/pause/resume/reset; hold zero, hide, or suggest next.','Restore does not start a countdown, Show, meeting, network request or output.']],['Automation & safe restore','pending',['Manual, Suggest, Rehearsal and separately armed Automatic controls.','Qualified rendered-subject change, dwell/cooldown and bounded decision history.','Manual Hide/Clear wins; clear inhibition and explicit re-arm; no reconnect replay.','Atomic graphics documents, old-look/source override migration, pinned packages and private saved drafts. Remaining integration/acceptance is not claimed complete.']],['Output separation','implemented',['Scene graphics follow their scene; global bug/clock survive scene changes.','Captions remain downstream; webcam-only framer/LUFS remains output-specific.','Editor guides and scope ROI are not burned into Program.','Clean source ISOs retain their own output semantics. Full enabled-output qualification remains open.']],['Preservation & APIs','pending',['One legacy-or-managed authority per migrated family; no duplicate lower-third rendering.','Existing key/API controls target the managed lower third after migration.','Exact source names, explicit blank titles, legacy look/timing/logo references and saved styles.','Package round-trip, repair, cue-rack polish and complete installed review still need final acceptance.']],['Later graphics expansion','pending',['Data connectors: bounded HTTP JSON, CSV/XLSX, RSS and mapping.','Data freshness / stale-state policy with credential references.','Tables/leaderboards, keyed transitions, cached crawls and deterministic playlists.','These are later milestones and are not included in this first-milestone completion claim.']]]; +$('option-inventory').innerHTML=inventory.map(([title,state,items])=>`

${state==='implemented'?'IMPLEMENTED PATH · ACCEPTANCE OPEN':'INTEGRATION / LATER · SEE DETAILS'}

${esc(title)}

    ${items.map(item=>`
  • ${esc(item)}
  • `).join('')}
`).join(''); +$('search').oninput=listTemplates;$('family').onchange=listTemplates;$('density').onclick=()=>{const compact=$('templates').classList.toggle('compact');$('density').textContent=compact?'Show cards':'Compact list';$('density').setAttribute('aria-pressed',String(compact));};$('safe-guides').onchange=updateCanvas;$('compare').onchange=updateCanvas;$('cue-name').onchange=()=>{edit(d=>d.name=$('cue-name').value);renderState();}; +$('create').onclick=()=>{if(!draft||rack.length>=8)return;draft.id=crypto.randomUUID();draft.scope=$('scope').value;rack.push(snapshot());original=snapshot();renderState();status('Hidden cue created in the simulated rack. Cue and Program are unchanged.');};$('cue').onclick=()=>{if(!draft)return;cue=snapshot();const index=rack.findIndex(c=>c.id===draft.id);if(index>=0)rack[index]=snapshot();renderState();status('Simulation: complete revision accepted on Cue. Program is unchanged. Native preparation is verified in the app, not by this page.');};$('show').onclick=()=>{if(!cue)return;program=clone(cue);renderState();status('Simulation: accepted Cue shown. Private edits made after Cue were not adopted. No actual output is connected.');};$('update').onclick=()=>{if(!draft||!program)return;program=snapshot();renderState();status('Simulation: current private revision explicitly updated on Program. No extra reveal.');};$('hide').onclick=()=>{program=null;$('auto-armed').checked=false;renderState();status('Simulation: hidden; pending automation cancelled. Cue retained.');};$('clear').onclick=()=>{program=null;$('auto-armed').checked=false;renderState();status('Simulation: Program graphics cleared. Automation inhibited until explicit re-arm; legacy graphics stay suppressed.');};$('undo').onclick=()=>{if(history.length){draft=history.pop();renderInspector();renderLayers();renderState();status('One private edit undone. Cue and Program are unchanged.');}};$('cancel').onclick=()=>{if(original){draft=clone(original);history=[];renderInspector();renderLayers();renderState();status('Private draft cancelled. Cue and Program are unchanged.');}};$('save').onclick=()=>{if(!draft)return;saved=snapshot();status('Simulation: saved this draft in page memory. No app settings were written. Restore remains hidden.');};$('restore').onclick=()=>{if(!saved){status('Save a simulated cue first.');return;}if(rack.length>=8){status('Eight-instance capacity reached. Previous cues retained.');return;}draft=clone(saved);draft.id=crypto.randomUUID();rack.push(snapshot());selected=templates.find(t=>t.templateId===draft.templateId);original=snapshot();history=[];renderInspector();renderLayers();renderState();status('Simulation: restored a hidden cue. Nothing shown and no automation re-armed.');}; +for(const button of document.querySelectorAll('[data-tab]'))button.onclick=()=>{tab=button.dataset.tab;document.querySelectorAll('[data-tab]').forEach(b=>b.setAttribute('aria-selected',String(b===button)));renderInspector();};for(const button of document.querySelectorAll('[data-mode]'))button.onclick=()=>{mode=button.dataset.mode;document.querySelectorAll('[data-mode]').forEach(b=>b.setAttribute('aria-selected',String(b===button)));$('operate-design').hidden=mode==='automation';$('automation-panel').hidden=mode!=='automation';$('design-panel').hidden=mode!=='design';renderLayers();}; +$('add-layer').onclick=()=>{edit(d=>d.layers.push({id:'text-'+(d.layers.length+1),type:'text',text:'Title',x:20,y:20,width:600,height:100,fontSize:42,fontWeight:600}));renderLayers();status('Added private text layer in the review model. Reference pixels remain unchanged.');};$('duplicate-layer').onclick=()=>{const node=realLayer(layerId);if(!node)return;edit(d=>d.layers.push({...clone(node),id:node.id+'-copy'}));renderLayers();};function moveLayer(delta){const index=draft?.layers.findIndex(n=>n.id===layerId)??-1;if(index<0){status('Group-child order uses its own siblings in the app.');return;}const other=Math.max(0,Math.min(draft.layers.length-1,index+delta));edit(d=>[d.layers[index],d.layers[other]]=[d.layers[other],d.layers[index]]);renderLayers();}$('layer-up').onclick=()=>moveLayer(1);$('layer-down').onclick=()=>moveLayer(-1);$('save-version').onclick=()=>status('Simulation: new immutable template version saved. Actual package validation and explicit Cue/Update adoption happen in the app.'); +const helps={manual:'Manual: every Cue, Show, Update and Hide is an explicit operator action.',suggest:'Suggest: show the proposed subject and reason. No automatic Preview or Program mutation.',rehearsal:'Rehearsal: exercise the decision path in a private preview. Program is never changed.',automatic:'Automatic: only an explicitly armed, qualified rule can act. Scene auto-Take remains separately controlled.'};for(const button of document.querySelectorAll('[data-auto]'))button.onclick=()=>{auto=button.dataset.auto;document.querySelectorAll('[data-auto]').forEach(b=>b.setAttribute('aria-pressed',String(b===button)));$('mode-help').textContent=helps[auto];$('auto-armed').checked=false;};$('simulate-subject').onclick=()=>{const entry=document.createElement('li');entry.textContent=auto==='manual'?'Manual: observed subject change; no action.':auto==='suggest'?'Suggested: cue Example guest after qualified source dwell. No native action executed.':auto==='rehearsal'?'Rehearsal: qualified event → private preview proposal. Program unchanged.':!$('auto-armed').checked?'Automatic is not armed. Action refused.':'Simulation only: qualified event → dwell/cooldown → bound cue → native preparation → Show proposal. No actual app command sent.';$('decision-trace').prepend(entry);while($('decision-trace').children.length>12)$('decision-trace').lastElementChild.remove();};document.querySelectorAll('.automation-modes~.two .range-pair').forEach(pair=>{const inputs=[...pair.querySelectorAll('input')];inputs.forEach(control=>control.oninput=()=>inputs.forEach(other=>other.value=control.value));}); +fetch('catalog.json').then(response=>{if(!response.ok)throw Error('Native catalog unavailable');return response.json();}).then(catalog=>{templates=catalog.templates;choose(templates.find(t=>t.templateId==='logo-accent')||templates[0]);}).catch(error=>{$('templates').textContent=error.message;status('Native examples could not load. Please reload; no app is connected.');}); diff --git a/tests/review-feedback.test.mjs b/tests/review-feedback.test.mjs index f9a0efb..54392e3 100644 --- a/tests/review-feedback.test.mjs +++ b/tests/review-feedback.test.mjs @@ -14,3 +14,5 @@ test('table-first alternative keeps feedback isolated from earlier Sources revie test('guided workflow feedback saves requirements without widening other reviews',async()=>{const kv=storage(),env={REVIEW_FEEDBACK:kv};const result=await handleReviewFeedback(request({review:'workflow-review-v1',area:'Preservation requirements'}),env);assert.equal(result.status,201);const receipt=await result.json();assert.ok(kv.values.has('feedback:workflow-review-v1:'+receipt.id));assert.equal((await handleReviewFeedback(request({area:'Preservation requirements'}),env)).status,400);assert.equal((await handleReviewFeedback(request({review:'workflow-review-v1',area:'Unknown area'}),env)).status,400);}); test('operator review has independent areas and receipt namespace',async()=>{const kv=storage(),env={REVIEW_FEEDBACK:kv},submissionId=randomUUID();for(const area of ['Starter scenes','Lower-third designer','Shared sliders and resets','Grade curves and scope ROI','Settings and Health'])assert.equal((await handleReviewFeedback(request({review:'operator-uiux-v1',area}),env)).status,201);assert.equal((await handleReviewFeedback(request({review:'sources-workspace-v1',area:'Starter scenes'}),env)).status,400);assert.equal((await handleReviewFeedback(request({review:'operator-uiux-v1',area:'Audio controls'}),env)).status,400);assert.equal((await handleReviewFeedback(request({submissionId}),env)).status,201);assert.equal((await handleReviewFeedback(request({submissionId,review:'operator-uiux-v1'}),env)).status,201);assert.ok(kv.values.has('feedback:sources-workspace-v1:'+submissionId));assert.ok(kv.values.has('feedback:operator-uiux-v1:'+submissionId));}); test('malformed JSON is rejected and burst submissions are bounded',async()=>{const kv=storage(),env={REVIEW_FEEDBACK:kv};const bad=new Request('https://corevideo.io/reviews/api/feedback',{method:'POST',headers:{origin:'https://corevideo.io','content-type':'application/json'},body:'{'});assert.equal((await handleReviewFeedback(bad,env)).status,400);for(let n=0;n<8;n++)assert.equal((await handleReviewFeedback(request(),env)).status,201);assert.equal((await handleReviewFeedback(request(),env)).status,429);}); + +test('Volt review saves distinct areas without accepting them in other reviews',async()=>{const kv=storage(),env={REVIEW_FEEDBACK:kv};for(const area of ['Template library','Live operation','Designer controls','Styles and brand','Animation and clocks','Automation rules','Preservation and gaps'])assert.equal((await handleReviewFeedback(request({review:'volt-graphics-v1',area}),env)).status,201);assert.equal((await handleReviewFeedback(request({review:'workflow-review-v1',area:'Automation rules'}),env)).status,400);assert.equal((await handleReviewFeedback(request({review:'volt-graphics-v1',area:'Unknown'}),env)).status,400);assert.ok([...kv.values.keys()].some(key=>key.startsWith('feedback:volt-graphics-v1:')));});